See: Description
Interface | Description |
---|---|
Parameterizable |
Interface to define the required methods for command line interaction.
|
Parameterizer |
Generic interface for a parameterizable factory.
|
Class | Description |
---|---|
AbstractParameterizer |
Abstract base class that handles the parameterization of a class.
|
OptionID |
An OptionID is used by option handlers as a unique identifier for specific
options.
|
OptionUtil |
Utility functions related to Option handling.
|
Exception | Description |
---|---|
InternalParameterizationErrors |
Pseudo error class that wraps multiple error reports into one.
|
NoParameterValueException |
Thrown by OptionHandler in case of incorrect parameter-array.
|
ParameterException |
Abstract super class for all exceptions thrown during parameterization.
|
UnspecifiedParameterException |
Exception when a required parameter was not given.
|
UnusedParameterException |
Thrown by OptionHandler in case of request of an unused parameter.
|
WrongParameterValueException |
Thrown by a Parameterizable object in case of wrong parameter format.
|
Parameter handling and option descriptions.
OptionID
.(This example is from// Defining option IDs public static final OptionID DISTANCE_FUNCTION_ID = OptionID.getOrCreateOptionID( "algorithm.distancefunction", "Distance function to determine the distance between database objects." );
AbstractDistanceBasedAlgorithm
.)
Parameter
object. ListParameter
based
types do not have the full set of constructors, since a List of Constraints and a List of
Default values produce the same signature. In such a signature conflict situation, you can use
a full constructor either by giving null
as constraints (and a list of default values) or
by giving constraints and setting optional to false
.
Notice the difference between an
ObjectParameter
and a
ClassParameter
. The first is
meant to carry a single object (which as fallback can be initialized with a class, resulting
in a new object of that class), the second is meant for a "object factory" use.
Example code:
(This example is from// Defining Parameters final ObjectParameter<DistanceFunction<O, D>> DISTANCE_FUNCTION_PARAM = new ObjectParameter<DistanceFunction<O, D>>( DISTANCE_FUNCTION_ID, DistanceFunction.class, EuclideanDistanceFunction.class );
DistanceBasedAlgorithm
.)
Class(Parameterization config)
or using a static method parameterize(Parameterization config)
.config
object manages configuration data, whichever source it is coming from
(e.g. command line, XML, lists, ...)
The Parameterization
class offers the method
grab
, which returns true
when the parameter value is defined and satisfies the given constraints.
Initialization should happen in a delayed-fail way. Failure is managed by the Parameterization object,
and not failing immediately allows for reporting all configuration errors (and all options) in a single
run. As such, when reporting a configuration error, you should not throw the error, but
instead call reportError
and leave error handling to the Parameterization class. Note that this method will return
eventually, so you might need to use try-catch-report blocks.
The static parameterize(Parameterization config)
factory method may return null
when Parameterization failed. Otherwise, it must return an instance of the given class or a
subclass. Example: LPNormDistanceFunction returns an instance of EuclideanDistance for p=2.
When writing constructors, try to make error handling as local as possible, to report as many errors
at once as possible.
Example code:
(This example is from// Getting parameters protected DistanceBasedAlgorithm(Parameterization config) { super(config); if (config.grab(DISTANCE_FUNCTION_PARAM)) { distanceFunction = DISTANCE_FUNCTION_PARAM.instantiateClass(config); } }
DistanceBasedAlgorithm
.)
(This example is from// Using flags protected AbstractApplication(Parameterization config) { super(config); if(config.grab(VERBOSE_FLAG)) { verbose = VERBOSE_FLAG.getValue(); } }
AbstractApplication
.)
The if config.grab
statement ensures that the parameter was set. Note that the configuration
manager is passed on to the child instance.
config.grab(...) && config.grab(...)
is not working as intended, since
a negative results in the first config.grab statement will prevent the evaluation of the second.
Instead, the following code should be used:
// Compound parameter dependency config.grab(FIRST_OPTION); config.grab(SECOND_OPTION); if (FIRST_OPTION.isDefined() && SECOND_OPTION.isDefined()) { // Now we have validated values for both available. }
checkConstraint
Example code:
(This example is from// Global constraints config.grab(NORMALIZATION_PARAM); config.grab(NORMALIZATION_UNDO_FLAG); GlobalParameterConstraint gpc = new ParameterFlagGlobalConstraint<Class<?>, Class<? extends Normalization<O>>>( NORMALIZATION_PARAM, null, NORMALIZATION_UNDO_FLAG, true); if (config.checkConstraint(gpc)) { // Code that depends on the constraints being satisfied. }
KDDTask
.)
TODO: Much of the constraint functionality can be solved much easier by direct Java code and
reportError
. Unless the constraints can be used by a GUI for input assistance, we should
consider replacing them with direct code.
// Proper dealing with errors try { // code that might fail with an IO exception } except(IOException e) { config.reportError(new WrongParameterValueException(...)); } // process remaining parameters, to report additional errors.
SerializedParameterization
which provided convenient constructors from String arrays:
(This example is from// Use command line parameters SerializedParameterization params = new SerializedParameterization(args);
AbstractApplication
.)
ListParameterization
offers convenience function for this that do not require String serialization.
(This example is from// Internal parameterization ListParameterization parameters = new ListParameterization(); parameters.addParameter(PCAFilteredRunner.PCA_EIGENPAIR_FILTER, FirstNEigenPairFilter.class); parameters.addParameter(FirstNEigenPairFilter.EIGENPAIR_FILTER_N, correlationDimension);
ERiC
.)
ChainedParameterization
(This example code is from// predefine some parameters ListParameterization opticsParameters = new ListParameterization(); opticsParameters.addParameter(OPTICS.DISTANCE_FUNCTION_ID, DiSHDistanceFunction.class); // ... more parameters ... ChainedParameterization chain = new ChainedParameterization(opticsParameters, config); chain.errorsTo(opticsParameters); optics = new OPTICS<V, PreferenceVectorBasedCorrelationDistance>(chain); opticsParameters.failOnErrors();
DiSH
.)
Note how error handling is performed by explicity specification of an error target and by
calling failOnErrors() at the end of parameterization.
(Note: the current implementation of this approach may be inadequate for XML or Tree based
parameterization, due to tree inconsistencies. This is an open TODO issue)
TrackParameters
wrapper around the configuration. The wrapper does not have own configuration items or error
recording, instead everything is forwarded to the inner configuration. It does however keep track
of consumed values, that can then be used for re-parameterization of an Algorithm.
(This is an example from// config is an existing parameterization TrackParameters trackpar = new TrackParameters(config); Database<V> tmpDB = PARTITION_DB_PARAM.instantiateClass(trackpar); Collection<Pair<OptionID, Object>> dbpars = trackpar.getGivenParameters();
COPAC
.)
// config is an existing parameterization ListParameterization myconfig = new ListParameterization(); // dummy values for input and output myconfig.addParameter(INPUT_ID, "/dev/null"); myconfig.addParameter(OUTPUT_ID, "/dev/null"); TrackParameters track = new TrackParameters(config); ChainedParameterization chain = new ChainedParameterization(myconfig, track); wrapper = WRAPPER_PARAM.instantiateClass(chain);
For documentation, the classes should also be annotated with
Title
Description
and
Reference
(where possible).