Reference documentation for deal.II version 9.0.0
|
#include <deal.II/base/parameter_handler.h>
Public Types | |
enum | OutputStyle { Text = 1, LaTeX = 2, Description = 3, XML = 4, JSON = 5, ShortText = 193 } |
Public Member Functions | |
ParameterHandler () | |
virtual | ~ParameterHandler ()=default |
virtual void | parse_input (std::istream &input, const std::string &filename="input file", const std::string &last_line="") |
virtual void | parse_input (const std::string &filename, const std::string &last_line="") |
virtual void | parse_input_from_string (const char *s, const std::string &last_line="") |
virtual void | parse_input_from_xml (std::istream &input) |
virtual void | parse_input_from_json (std::istream &input) |
void | clear () |
void | declare_entry (const std::string &entry, const std::string &default_value, const Patterns::PatternBase &pattern=Patterns::Anything(), const std::string &documentation=std::string()) |
void | add_action (const std::string &entry, const std::function< void(const std::string &value)> &action) |
template<class ParameterType > | |
void | add_parameter (const std::string &entry, ParameterType ¶meter, const std::string &documentation=std::string(), const Patterns::PatternBase &pattern= *Patterns::Tools::Convert< ParameterType >::to_pattern()) |
void | declare_alias (const std::string &existing_entry_name, const std::string &alias_name, const bool alias_is_deprecated=false) |
void | enter_subsection (const std::string &subsection) |
void | leave_subsection () |
std::string | get (const std::string &entry_string) const |
long int | get_integer (const std::string &entry_string) const |
double | get_double (const std::string &entry_name) const |
bool | get_bool (const std::string &entry_name) const |
void | set (const std::string &entry_name, const std::string &new_value) |
void | set (const std::string &entry_name, const char *new_value) |
void | set (const std::string &entry_name, const long int &new_value) |
void | set (const std::string &entry_name, const double &new_value) |
void | set (const std::string &entry_name, const bool &new_value) |
std::ostream & | print_parameters (std::ostream &out, const OutputStyle style) const |
void | print_parameters_section (std::ostream &out, const OutputStyle style, const unsigned int indent_level, const bool include_top_level_elements=false) |
void | log_parameters (LogStream &out) |
void | log_parameters_section (LogStream &out) |
std::size_t | memory_consumption () const |
template<class Archive > | |
void | save (Archive &ar, const unsigned int version) const |
template<class Archive > | |
void | load (Archive &ar, const unsigned int version) |
bool | operator== (const ParameterHandler &prm2) const |
Public Member Functions inherited from Subscriptor | |
Subscriptor () | |
Subscriptor (const Subscriptor &) | |
Subscriptor (Subscriptor &&) noexcept | |
virtual | ~Subscriptor () |
Subscriptor & | operator= (const Subscriptor &) |
Subscriptor & | operator= (Subscriptor &&) noexcept |
void | subscribe (const char *identifier=nullptr) const |
void | unsubscribe (const char *identifier=nullptr) const |
unsigned int | n_subscriptions () const |
void | list_subscribers () const |
template<class Archive > | |
void | serialize (Archive &ar, const unsigned int version) |
Static Public Member Functions | |
static ::ExceptionBase & | ExcEntryAlreadyExists (std::string arg1) |
static ::ExceptionBase & | ExcValueDoesNotMatchPattern (std::string arg1, std::string arg2) |
static ::ExceptionBase & | ExcAlreadyAtTopLevel () |
static ::ExceptionBase & | ExcEntryUndeclared (std::string arg1) |
static ::ExceptionBase & | ExcUnbalancedSubsections (std::string arg1, std::string arg2) |
static ::ExceptionBase & | ExcNoSubsection (int arg1, std::string arg2, std::string arg3) |
static ::ExceptionBase & | ExcCannotParseLine (int arg1, std::string arg2, std::string arg3) |
static ::ExceptionBase & | ExcInvalidEntryForPattern (int arg1, std::string arg2, std::string arg3, std::string arg4, std::string arg5) |
static ::ExceptionBase & | ExcInvalidXMLParameterFile () |
static ::ExceptionBase & | ExcInvalidEntryForPatternXML (std::string arg1, std::string arg2, std::string arg3) |
static ::ExceptionBase & | ExcCannotOpenIncludeStatementFile (int arg1, std::string arg2, std::string arg3) |
Static Public Member Functions inherited from Subscriptor | |
static ::ExceptionBase & | ExcInUse (int arg1, std::string arg2, std::string arg3) |
static ::ExceptionBase & | ExcNoSubscriber (std::string arg1, std::string arg2) |
Private Member Functions | |
ParameterHandler (const ParameterHandler &)=delete | |
ParameterHandler & | operator= (const ParameterHandler &)=delete |
std::string | get_current_path () const |
std::string | get_current_full_path (const std::string &name) const |
void | scan_line (std::string line, const std::string &input_filename, const unsigned int current_line_n) |
void | recursively_print_parameters (const std::vector< std::string > &target_subsection_path, const OutputStyle style, const unsigned int indent_level, std::ostream &out) const |
Static Private Member Functions | |
static std::string | collate_path_string (const std::vector< std::string > &subsection_path) |
Private Attributes | |
std::vector< std::string > | subsection_path |
std::unique_ptr< boost::property_tree::ptree > | entries |
std::vector< std::unique_ptr< const Patterns::PatternBase > > | patterns |
std::vector< std::function< void(const std::string &)> > | actions |
Static Private Attributes | |
static const char | path_separator = '.' |
Friends | |
class | MultipleParameterLoop |
The ParameterHandler class provides a standard interface to an input file which provides at run-time for program parameters such as time step sizes, geometries, right hand sides etc. The input for the program is given in files, streams or strings in memory using text like
Input may be sorted into subsection trees in order to give the input a logical structure, and input files may include other files.
The ParameterHandler class is discussed in detail in the step-19 example program, and is used in more realistic situations in step-29, step-33 and step-34.
In order to use the facilities of a ParameterHandler object, one first has to make known the different entries the input file may or may not contain. This is done in the following way:
Each entry is declared using the function declare_entry(). The first parameter is the name of the entry (in short: the entry). The second is the default answer to be taken in case the entry is not specified in the input file. The third parameter is a regular expression which the input (and the default answer) has to match. Several such regular expressions are defined in Patterns. This parameter can be omitted, in which case it will default to Patterns::Anything, i.e. a pattern that matches every input string. The fourth parameter can be used to document the intent or expected format of an entry; its value is printed as a comment when writing all entries of a ParameterHandler object using the print_parameters() function to allow for easier understanding of a parameter file. It can be omitted as well, in which case no such documentation will be printed.
Entries may be located in subsections which form a kind of input tree. For example input parameters for linear solver routines should be classified in a subsection named Linear solver
or any other suitable name. This is accomplished in the following way:
Subsections may be nested. For example a nonlinear solver may have a linear solver as member object. Then the function call tree would be something like (if the class NonLinEq
has a member variables eq
of type LinEq
):
For class member functions which declare the different entries we propose to use the common name declare_parameters
. In normal cases this method can be static
since the entries will not depend on any previous knowledge. Classes for which entries should logically be grouped into subsections should declare these subsections themselves. If a class has two or more member variables of the same type both of which should have their own parameters, this parent class' method declare_parameters
is responsible to group them into different subsections:
For the first example above the input file would look like the following:
The words subsection
, set
and end
may be either written in lowercase or uppercase letters. Leading and trailing whitespace is removed, multiple whitespace is condensed into only one. Since the latter applies also to the name of an entry, an entry name will not be recognized if in the declaration multiple whitespace is used.
In entry names and values the following characters are not allowed: #
, {
, }
, |
. Their use is reserved for the MultipleParameterLoop class.
Comments starting with # are skipped.
Continuation lines are allowed by means of the character \
, which must be the last character (aside from whitespace, which is ignored) of the line. When a line is a continuation (i.e., the previous line ended in a \
), then, unlike the default behavior of the C
preprocessor, all whitespace at the beginning of the line is ignored.
We propose to use the following scheme to name entries: start the first word with a capital letter and use lowercase letters further on. The same applies to the possible entry values to the right of the =
sign.
An input file can include other include files using the syntax
The file so referenced is searched for relative to the current directory (not relative to the directory in which the including parameter file is located, since this is not known to all three versions of the parse_input() function).
In order to read input there are three possibilities: reading from an std::istream
object, reading from a file of which the name is given and reading from a string in memory in which the lines are separated by \n
characters. These possibilities are used as follows:
You can use several sources of input successively. Entries which are changed more than once will be overwritten every time they are used.
You should not try to declare entries using declare_entry() and enter_subsection() with as yet unknown subsection names after using parse_input(). The results in this case are unspecified.
If an error occurs upon reading the input, error messages are written to std::cerr
and the reader function returns with a return value of false
. This is opposed to almost all other functions in deal.II, which would normally throw an exception if an error occurs; this difference in behavior is a relic of the fact that this class predates deal.II and had previously been written for a different project.
An alternative to using the hand-written input files shown above is to use the graphical user interface (GUI) that accompanies this class.
See the parameter_gui github repository for further details.
Each class gets its data out of a ParameterHandler object by calling the get() member functions like this:
get() returns the value of the given entry. If the entry was not specified in the input source(s), the default value is returned. You have to enter and leave subsections exactly as you did when declaring subsection. You may chose the order in which to transverse the subsection tree.
It is guaranteed that only entries matching the given regular expression are returned, i.e. an input entry value which does not match the regular expression is not stored.
You can use get() to retrieve the parameter in text form, get_integer() to get an integer or get_double() to get a double. You can also use get_bool(). It will cause an internal error if the string could not be converted to an integer, double or a bool. This should, though, not happen if you correctly specified the regular expression for this entry; you should not try to get out an integer or a double from an entry for which no according regular expression was set. The internal error is raised through the Assert() macro family which only works in debug mode.
If you want to print out all user selectable features, use the print_parameters() function. It is generally a good idea to print all parameters at the beginning of a log file, since this way input and output are together in one file which makes matching at a later time easier. Additionally, the function also print those entries which have not been modified in the input file and are thus set to default values; since default values may change in the process of program development, you cannot know the values of parameters not specified in the input file.
It is often convenient to have something happen as soon as a parameter value is read. This could be a check that it is valid – say, that a file that is listed in the parameter file exists – or to initiate something else in response, such as setting a variable outside the ParameterHandler (as in the example shown below). In almost all cases, this "action" could also be initiated once all parameters are read via parse_input(), but it is sometimes convenient to do it right away.
This is facilitated by the add_action() function that can be called after declaring a parameter via declare_entry(). "Actions" are in essence pointers to functions that will be called for parameters that have associated actions. These functions take the value of a parameter as argument, and can then do whatever they want with it – e.g., save it somewhere outside the ParameterHandler object. (Exactly when the action is called is described in the documentation of the add_action() function.) Of course, in C++ one doesn't usually pass around the address of a function, but an action can be a function-like object (taking a string as argument) that results from calling std::bind
, or more conveniently, it can be a lambda function that has the form
and that is attached to a specific parameter.
A typical example of such an action would be as follows: let's assume that you have a program that declares a parameter for the number of iterations it is going to run, say
then one could obtain this parameter from a parameter file using a code snippet in run()
as follows:
This two-step process – first declaring the parameter, and later reading it – is a bit cumbersome because one has to first declare all parameters and at a later time retrieve them from the ParameterHandler object. In large programs, these two things also often happen in different functions.
To avoid this, it would be nice if we could put both the declaration and the retrieval into the same place. This can be done via actions, and the function would then look like this:
Here, the action consists of a lambda function that takes the value for this parameter as a string, and then converts it to an integer to store in the variable where it belongs. This action is executed inside the call to prm.parse_input()
, and so there is now no longer a need to extract the parameter's value at a later time. Furthermore, the code that sets the member variable is located right next to the place where the parameter is actually declared, so we no longer need to have two separate parts of the code base that deal with input parameters.
Of course, it is possible to execute far more involved actions than just setting a member variable as shown above, even though that is a typical case.
We propose that every class which gets data out of a ParameterHandler object provides a function named get_parameters
. This should be declared virtual
. get_parameters
functions in derived classes should call the BaseClass::get_parameters
function.
Experience has shown that in programs defining larger numbers of parameters (more than, say, fifty) it is advantageous to define an additional class holding these parameters. This class is more like a C-style structure, having a large number of variables, usually public. It then has at least two functions, which declare and parse the parameters. In the main program, the main class has an object of this parameter class and delegates declaration and parsing of parameters to this object.
The advantage of this approach is that you can keep out the technical details (declaration and parsing) out of the main class and additionally don't clutter up your main class with dozens or more variables denoting the parameters.
This is the code:
This is the input file (named "prmtest.prm"):
And here is the output of the program:
Here is some more internal information about the representation of parameters:
Logically, parameters and the nested sections they are arranged in can be thought of as a hierarchical directory structure, or a tree. Take, for example, the following code declaring a set of parameters and sections they live in:
We can think of the parameters so arranged as a file system in which every parameter is a directory. The name of this directory is the name of the parameter, and in this directory lie files that describe the parameter. These files are at the time of writing this documentation (other fields, such as those indicating "actions" may also exist in each directory):
value
: The content of this file is the current value of this parameter; initially, the content of the file equals the default value of the parameter.default_value
: The content of this file is the default value of the parameter.pattern
: A textual representation of the pattern that describes the parameter's possible values.pattern_index
: A number that indexes the Patterns::PatternBase object that is used to describe the parameter.documentation
: The content of this file is the documentation given for a parameter as the last argument of the ParameterHandler::declare_entry call. With the exception of the value
file, the contents of files are never changed after declaration of a parameter.Alternatively, a directory in this file system may not have a file called value
in it. In that case, the directory represents a subsection as declared above, and the directory's name will correspond to the name of the subsection. It will then have no files in it at all, but it may have further directories in it: some of these directories will be parameters (indicates by the presence of files) or further nested subsections.
Given this explanation, the code above will lead to a hierarchical representation of data that looks like this (the content of files is indicated at the right in a different font):
Once parameters have been read in, the contents of the value
"files" may be different while the other files remain untouched.
Using the ParameterHandler::print_parameters() function with ParameterHandler::XML as second argument, we can get a complete representation of this data structure in XML. It will look like this:
This representation closely resembles the directory/file structure discussed above. The only difference is that directory and file names are mangled: since they should only contain letters and numbers, every character in their names that is not a letter or number is replaced by an underscore followed by its two-digit hexadecimal representation. In addition, the special name "value" is mangled when used as the name of a parameter, given that this name is also used to name special files in the hierarchy structure. Finally, the entire tree is wrapped into a tag ParameterHandler
to satisfy the XML requirement that there be only a single top-level construct in each file.
The tree structure (and its XML representation) is what the graphical user interface (see above) uses to represent parameters like a directory/file collection.
Definition at line 799 of file parameter_handler.h.
List of possible output formats used for ParameterHandler::print_parameters().
Enumerator | |
---|---|
Text | Write human readable output suitable to be read by ParameterHandler again. |
LaTeX | Write parameters as a LaTeX table. |
Description | Write out declared parameters with description and possible values. |
XML | Write out everything as an XML file. See the general documentation of this class for an example of output. |
JSON | Write out everything as a JSON file. |
ShortText | Write input for ParameterHandler without comments or changed default values. |
Definition at line 816 of file parameter_handler.h.
|
privatedelete |
Inhibit automatic CopyConstructor.
ParameterHandler::ParameterHandler | ( | ) |
Constructor.
Definition at line 43 of file parameter_handler.cc.
|
virtualdefault |
Destructor. Declare this only to have a virtual destructor, which is safer as we have virtual functions. It actually does nothing spectacular.
|
privatedelete |
Inhibit automatic assignment operator.
|
virtual |
Parse each line from a stream until the stream returns the eof
condition or error to provide values for known parameter fields. The second argument can be used to denote the name of the file (if that's what the input stream represents) we are reading from; this is only used when creating output for exceptions.
If non-empty last_line
is provided, the ParameterHandler object will stop parsing lines after encountering last_line
. This is handy when adding extra data that shall be parsed manually.
The function sets the value of all parameters it encounters in the input file to the provided value. Parameters not explicitly listed in the input file are left at the value they previously held, which will be the default value provided to declare_entry() unless one has previously read a different input file.
Each parameter value is matched against the pattern for this parameter that was provided to declare_entry(), and for each parameter all associated actions that may previously have been set by add_action() are executed. If a parameter does not satisfy its pattern, or if an associated action throws an exception, then the value provided for the parameter is not set and the current object reverts to the subsection it was in before the current function was called. No further processing of the input stream occurs, that is everything that comes after the parameter whose value does not satisfy its pattern is ignored.
Reimplemented in MultipleParameterLoop.
Definition at line 285 of file parameter_handler.cc.
|
virtual |
Parse the given file to provide values for known parameter fields. The PathSearch class "PARAMETERS" is used to find the file.
The function in essence reads the entire file into a stream and then calls the other parse_input() function with that stream. See there for more information.
Previous versions of deal.II included a similar function named read_input
which, if the parameter file could not be found by PathSearch::find, would not modify the calling ParameterHandler (i.e., the parameters would all be set to their default values) and would (optionally) create a parameter file with default values. In order to obtain that behavior one should catch the PathSearch::ExcFileNotFound exception and then optionally call ParameterHandler::print_parameters, e.g.,
Definition at line 425 of file parameter_handler.cc.
|
virtual |
Parse input from a string to populate known parameter fields. The lines in the string must be separated by \n
characters.
The function in essence reads the entire file into a stream and then calls the other parse_input() function with that stream. See there for more information.
Definition at line 438 of file parameter_handler.cc.
|
virtual |
Parse input from an XML stream to populate known parameter fields. This could be from a file originally written by the print_parameters() function using the XML output style and then modified by hand as necessary, or from a file written using this method and then modified by the graphical parameter GUI (see the general documentation of this class).
Definition at line 531 of file parameter_handler.cc.
|
virtual |
Parse input from a JSON stream to populate known parameter fields. This could be from a file originally written by the print_parameters() function using the JSON output style and then modified by hand as necessary, or from a separate program that knows how to write JSON format for ParameterHandler input.
Definition at line 583 of file parameter_handler.cc.
void ParameterHandler::clear | ( | ) |
Clear all contents.
Definition at line 599 of file parameter_handler.cc.
void ParameterHandler::declare_entry | ( | const std::string & | entry, |
const std::string & | default_value, | ||
const Patterns::PatternBase & | pattern = Patterns::Anything() , |
||
const std::string & | documentation = std::string() |
||
) |
Declare a new entry with name entry
, default and for which any input has to match the pattern
(default: any pattern).
The last parameter defaulting to an empty string is used to add a documenting text to each entry which will be printed as a comment when this class is asked to write out all declarations to a stream using the print_parameters() function.
The function generates an exception of type ExcValueDoesNotMatchPattern if the default value doesn't match the given pattern, using the C++ throw mechanism. However, this exception is only generated after the entry has been created; if you have code where no sensible default value for a parameter is possible, you can then catch and ignore this exception.
Definition at line 607 of file parameter_handler.cc.
void ParameterHandler::add_action | ( | const std::string & | entry, |
const std::function< void(const std::string &value)> & | action | ||
) |
Attach an action to the parameter with name entry
in the current section. The action needs to be a function-like object that takes the value of the parameter as a (string) argument. See the general documentation of this class for a longer description of actions, as well as examples.
The action is executed in three different circumstances:
name
, at the end of the current function. This is useful because it allows for the action to execute whatever it needs to do at least once for each parameter, even those that are not actually specified in the input file (and thus remain at their default values).It is valid to add multiple actions to the same parameter. They will in that case be executed in the same order in which they were added.
Definition at line 644 of file parameter_handler.cc.
void ParameterHandler::add_parameter | ( | const std::string & | entry, |
ParameterType & | parameter, | ||
const std::string & | documentation = std::string() , |
||
const Patterns::PatternBase & | pattern = *Patterns::Tools::Convert<ParameterType>::to_pattern() |
||
) |
Declare a new entry name entry
, set its default value to the content of the variable parameter
, and create an action that will fill parameter
with updated values when a file is parsed, or the entry is set to a new value.
By default, the pattern to use is obtained by calling the function Patterns::Tools::Convert<T>::to_pattern(), but a custom one can be used.
Definition at line 1997 of file parameter_handler.h.
void ParameterHandler::declare_alias | ( | const std::string & | existing_entry_name, |
const std::string & | alias_name, | ||
const bool | alias_is_deprecated = false |
||
) |
Create an alias for an existing entry. This provides a way to refer to a parameter in the input file using an alternate name. The alias will be in the current section, and the referenced entry needs to be an existing entry in the current section.
The primary purpose of this function is to allow for a backward compatible way of changing names in input files of applications for which backward compatibility is important. This can be achieved by changing the name of the parameter in the call to declare_entry(), and then creating an alias that maps the old name to the new name. This way, old input files can continue to refer to parameters under the old name, and they will automatically be mapped to the new parameter name.
It is valid to set the same parameter multiple times in an input file. The value that will ultimately be chosen in such cases is simply the last value set. This rule also applies to aliases, where the final value of a parameter is the last value set either through the current name of the parameter or through any of its possible multiple aliases. For example, if you have an input file that looks like
where parm1_alias
is an alias declared via
then the final value for the parameter called parm1
will be 2, not 1.
existing_entry_name | The name of an existing parameter in the current section that the alias should refer to. |
alias_name | An alternate name for the parameter referenced by the first argument. |
alias_is_deprecated | If true, mark the alias as deprecated. This will then be listed in the description of the alias if you call print_parameters(), and you will get a warning on the screen when reading an input file that contains this deprecated alias. The purpose of this argument is to be able to allow the use of an old name for a parameter (see above) but make it clear that this old name will eventually be removed. |
Definition at line 681 of file parameter_handler.cc.
void ParameterHandler::enter_subsection | ( | const std::string & | subsection | ) |
Enter a subsection. If it does not yet exist, create it.
Definition at line 739 of file parameter_handler.cc.
void ParameterHandler::leave_subsection | ( | ) |
Leave present subsection.
Definition at line 752 of file parameter_handler.cc.
std::string ParameterHandler::get | ( | const std::string & | entry_string | ) | const |
Return value of entry entry_string
. If the entry was changed, then the changed value is returned, otherwise the default value. If the value of an undeclared entry is required, an exception will be thrown.
Definition at line 765 of file parameter_handler.cc.
long int ParameterHandler::get_integer | ( | const std::string & | entry_string | ) | const |
Return value of entry entry_string
as long int
. (A long int is chosen so that even very large unsigned values can be returned by this function).
Definition at line 781 of file parameter_handler.cc.
double ParameterHandler::get_double | ( | const std::string & | entry_name | ) | const |
Return value of entry entry_name
as double
.
Definition at line 801 of file parameter_handler.cc.
bool ParameterHandler::get_bool | ( | const std::string & | entry_name | ) | const |
Return value of entry entry_name
as bool
. The entry may be "true" or "yes" for true
, "false" or "no" for false
respectively.
Definition at line 821 of file parameter_handler.cc.
void ParameterHandler::set | ( | const std::string & | entry_name, |
const std::string & | new_value | ||
) |
Change the value presently stored for entry_name
to the one given in the second argument.
The parameter must already exist in the present subsection.
The function throws an exception of type ExcValueDoesNotMatchPattern if the new value does not conform to the pattern for this entry.
Definition at line 841 of file parameter_handler.cc.
void ParameterHandler::set | ( | const std::string & | entry_name, |
const char * | new_value | ||
) |
Same as above, but an overload where the second argument is a character pointer. This is necessary, since otherwise the call to set("abc","def")
will be mapped to the function taking one string and a bool as arguments, which is certainly not what is most often intended.
The function throws an exception of type ExcValueDoesNotMatchPattern if the new value does not conform to the pattern for this entry.
Definition at line 887 of file parameter_handler.cc.
void ParameterHandler::set | ( | const std::string & | entry_name, |
const long int & | new_value | ||
) |
Change the value presently stored for entry_name
to the one given in the second argument.
The parameter must already exist in the present subsection.
The function throws an exception of type ExcValueDoesNotMatchPattern if the new value does not conform to the pattern for this entry.
Definition at line 911 of file parameter_handler.cc.
void ParameterHandler::set | ( | const std::string & | entry_name, |
const double & | new_value | ||
) |
Change the value presently stored for entry_name
to the one given in the second argument.
The parameter must already exist in the present subsection.
For internal purposes, the new value needs to be converted to a string. This is done using 16 digits of accuracy, so the set value and the one you can get back out using get_double() may differ in the 16th digit.
The function throws an exception of type ExcValueDoesNotMatchPattern if the new value does not conform to the pattern for this entry.
Definition at line 896 of file parameter_handler.cc.
void ParameterHandler::set | ( | const std::string & | entry_name, |
const bool & | new_value | ||
) |
Change the value presently stored for entry_name
to the one given in the second argument.
The parameter must already exist in the present subsection.
The function throws an exception of type ExcValueDoesNotMatchPattern if the new value does not conform to the pattern for this entry.
Definition at line 925 of file parameter_handler.cc.
std::ostream & ParameterHandler::print_parameters | ( | std::ostream & | out, |
const OutputStyle | style | ||
) | const |
Print all parameters with the given style to out
.
In Text
format, the output is formatted in such a way that it is possible to use it for later input again. This is most useful to record the parameters for a specific run, since if you output the parameters using this function into a log file, you can always recover the results by simply copying the output to your input file.
Besides the name and value of each entry, the output also contains the default value of entries if it is different from the actual value, as well as the documenting string given to the declare_entry() function if available.
In XML
format, the output starts with one root element ParameterHandler
in order to get a valid XML document and all subsections under it.
In LaTeX
format, the output contains the same information but in a format so that the resulting file can be input into a latex document such as a manual for the code for which this object handles run-time parameters. The various sections of parameters are then represented by latex section and subsection commands as well as by nested enumerations.
You can reference specific parameter sections and individual parameters by the labels that are generated automatically for each entry. The labels have the format parameters:section1/subsection1
and parameters:section1/subsection1/someentry
. Because special characters can appear in the section and entry names, these will be "mangled". Here, all characters except [a-zA-Z0-9]
are replaced by _XX
, where XX
is the two-digit ascii code of the character in hexadecimal encoding (so a space becomes _20
for example).
While this function escapes special LaTeX-specific characters (backslash, underscore, etc.) in most of the output (names, default values, etc.), the documentation string is passed as-is. This means you can use math environments and other formatting in the description, but you need to escape quotes, backslashes, underscores, etc. yourself.
In addition, all parameter names are listed with \index
statements in two indices called prmindex
(where the name of each parameter is listed in the index) and prmindexfull
where parameter names are listed sorted by the section in which they exist. By default, the LaTeX program ignores these \index
commands, but they can be used to generate an index by using the following commands in the preamble of the latex file :
and at the end of the file this:
Definition at line 937 of file parameter_handler.cc.
void ParameterHandler::print_parameters_section | ( | std::ostream & | out, |
const OutputStyle | style, | ||
const unsigned int | indent_level, | ||
const bool | include_top_level_elements = false |
||
) |
Print out the parameters of the present subsection as given by the subsection_path
member variable. This variable is controlled by entering and leaving subsections through the enter_subsection() and leave_subsection() functions.
If include_top_level_elements
is true
, also the higher subsection elements are printed. In XML
format this is required to get a valid XML document and output starts with one root element ParameterHandler
.
In most cases, you will not want to use this function directly, but have it called recursively by the previous function.
const
function. Definition at line 1438 of file parameter_handler.cc.
void ParameterHandler::log_parameters | ( | LogStream & | out | ) |
Print parameters to a logstream. This function allows to print all parameters into a log-file. Sections will be indented in the usual log- file style.
Definition at line 1900 of file parameter_handler.cc.
void ParameterHandler::log_parameters_section | ( | LogStream & | out | ) |
Log parameters in the present subsection. The subsection is determined by the subsection_path
member variable. This variable is controlled by entering and leaving subsections through the enter_subsection() and leave_subsection() functions.
In most cases, you will not want to use this function directly, but have it called recursively by the previous function.
Definition at line 1912 of file parameter_handler.cc.
std::size_t ParameterHandler::memory_consumption | ( | ) | const |
Determine an estimate for the memory consumption (in bytes) of this object.
Definition at line 2133 of file parameter_handler.cc.
|
inline |
Write the data of this object to a stream for the purpose of serialization.
Definition at line 1959 of file parameter_handler.h.
|
inline |
Read the data of this object from a stream for the purpose of serialization.
Definition at line 1979 of file parameter_handler.h.
bool ParameterHandler::operator== | ( | const ParameterHandler & | prm2 | ) | const |
Test for equality.
Definition at line 2142 of file parameter_handler.cc.
|
staticprivate |
Given a list of directories and subdirectories that identify a particular place in the tree, return the string that identifies this place in the way the BOOST property tree libraries likes to identify things.
Definition at line 246 of file parameter_handler.cc.
|
private |
Return the string that identifies the current path into the property tree. This is only a path, i.e. it is not terminated by the path_separator character.
This function simply calls collate_path_string() with subsection_path
as argument
Definition at line 264 of file parameter_handler.cc.
|
private |
Given the name of an entry as argument, the function computes a full path into the parameter tree using the current subsection.
Definition at line 272 of file parameter_handler.cc.
|
private |
Scan one line of input. input_filename
and current_line_n
are the name of the input file and the number of the line presently scanned (these are used in exception messages to show where parse errors occurred). This function will raise an exception if the line contains an undeclared subsection or entry, if the line's entry does not match its given pattern, or if the line could not be understood as a valid parameter file expression.
The function modifies its argument, but also takes it by value, so the caller's variable is not changed.
Definition at line 1947 of file parameter_handler.cc.
|
private |
Print out the parameters of the subsection given by the target_subsection_path
argument, as well as all subsections within it recursively. This function is called from the print_parameters() function, and is implemented for all style
arguments other than XML and JSON (where we can output the entire set of parameters via BOOST functions). The indent_level
argument indicates how many spaces the output should be indented, so that subsections properly nest inside the output of higher sections.
Definition at line 1015 of file parameter_handler.cc.
|
staticprivate |
The separator used when accessing elements of a path into the parameter tree.
Definition at line 1458 of file parameter_handler.h.
|
private |
Path of presently selected subsections; empty list means top level
Definition at line 1463 of file parameter_handler.h.
|
private |
The complete tree of sections and entries. See the general documentation of this class for a description how data is stored in this variable.
The variable is a pointer so that we can use an incomplete type, rather than having to include all of the property_tree stuff from boost. This works around a problem with gcc 4.5.
Definition at line 1473 of file parameter_handler.h.
|
private |
A list of patterns that are used to describe the parameters of this object. Every nodes in the property tree corresponding to a parameter stores an index into this array.
Definition at line 1480 of file parameter_handler.h.
|
private |
A list of actions that are associated with parameters. These are added by the add_action() function. Nodes in the property tree corresponding to individual parameters store indices into this array in order to reference specific actions.
Definition at line 1488 of file parameter_handler.h.