The following steps should be performed before releasing a new storm version.
Note that in most cases a simultaneous release of [carl](https://github.com/smtrat/carl), [storm](https://github.com/moves-rwth/storm), [pycarl](https://github.com/moves-rwth/pycarl/) and [stormpy](https://github.com/moves-rwth/stormpy/) is preferred.
1. Update `CHANGELOG.md`.
To get all the commits from an author since the last tag execute:
1. Update `CHANGELOG.md`:
* To get all the commits from an author since the last tag execute:
```console
git log last_tag..HEAD --author "author_name"
```
* Set release month
2. Update used carl version:
* Update `GIT_TAG` in `resources/3rdparty/carl/CMakeLists.txt`
@ -32,6 +33,15 @@ Note that in most cases a simultaneous release of [carl](https://github.com/smtr
6. [Add new release](https://github.com/moves-rwth/storm/releases/new) in GitHub.
this->addOption(storm::settings::OptionBuilder(moduleName,helpOptionName,false,"Shows available options, arguments and descriptions.").setShortName(helpOptionShortName)
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("filter","'frequent' for frequently used options, 'all' for the complete help, or a regular expression to show help for all matching entities.").setDefaultValueString("frequent").build()).build());
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("filter","'frequent' for frequently used options, 'all' for the complete help, or a regular expression to show help for all matching entities.").setDefaultValueString("frequent").makeOptional().build()).build());
this->addOption(storm::settings::OptionBuilder(moduleName,versionOptionName,false,"Prints the version information.").build());
this->addOption(storm::settings::OptionBuilder(moduleName,verboseOptionName,false,"Enables more verbose output.").setShortName(verboseOptionShortName).build());
this->addOption(storm::settings::OptionBuilder(moduleName,debugOptionName,false,"Enables verbose and debug output.").build());
this->addOption(storm::settings::OptionBuilder(moduleName,propertyOptionName,false,"Specifies the properties to be checked on the model.").setShortName(propertyOptionShortName)
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("property or filename","The formula or the file containing the formulas.").build())
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("filter","The names of the properties to check.").setDefaultValueString("all").build())
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("filter","The names of the properties to check.").setDefaultValueString("all").makeOptional().build())
.build());
this->addOption(storm::settings::OptionBuilder(moduleName,constantsOptionName,false,"Specifies the constant replacements to use in symbolic models. Note that this requires the model to be given as an symbolic model (e.g., via --"+prismInputOptionName+").").setShortName(constantsOptionShortName)
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("values","A comma separated list of constants and their value, e.g. a=1,b=2,c=3.").setDefaultValueString("").build()).build());
@ -44,7 +44,7 @@ namespace storm {
this->addOption(storm::settings::OptionBuilder(moduleName,janiInputOptionName,false,"Parses the model given in the JANI format.")
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("filename","The name of the file from which to read the JANI input.").addValidatorString(ArgumentValidatorFactory::createExistingFileValidator()).build()).build());
this->addOption(storm::settings::OptionBuilder(moduleName,janiPropertyOptionName,false,"Specifies the properties from the jani model (given by --"+janiInputOptionName+") to be checked.").setShortName(janiPropertyOptionShortName)
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("values","A comma separated list of properties to be checked").setDefaultValueString("").build()).build());
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("values","A comma separated list of properties to be checked").setDefaultValueString("").makeOptional().build()).build());
this->addOption(storm::settings::OptionBuilder(moduleName,refineOptionName,false,"Enables region refinement.")
.addArgument(storm::settings::ArgumentBuilder::createDoubleArgument("coverage-threshold","Refinement converges if the fraction of unknown area falls below this threshold.").setDefaultValueDouble(0.05).addValidatorDouble(storm::settings::ArgumentValidatorFactory::createDoubleRangeValidatorIncluding(0.0,1.0)).build())
.addArgument(storm::settings::ArgumentBuilder::createIntegerArgument("depth-limit","If given, limits the number of times a region is refined.").setDefaultValueInteger(-1).build()).build());
.addArgument(storm::settings::ArgumentBuilder::createIntegerArgument("depth-limit","If given, limits the number of times a region is refined.").setDefaultValueInteger(-1).makeOptional().build()).build());
std::vector<std::string>directions={"min","max"};
this->addOption(storm::settings::OptionBuilder(moduleName,extremumOptionName,false,"Computes the extremum within the region.")
this->addOption(storm::settings::OptionBuilder(moduleName,programVariableRestrictionsOptionName,false,"Restrictions of program variables").setShortName(programVariableRestrictionShortOptionName).addArgument(storm::settings::ArgumentBuilder::createStringArgument("description","description of the variable restrictions").build()).build());
this->addOption(storm::settings::OptionBuilder(moduleName,propertyOptionName,false,"Specifies the properties to be checked on the model.").setShortName(propertyOptionShortName)
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("property or filename","The formula or the file containing the formulas.").build())
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("filter","The names of the properties to check.").setDefaultValueString("all").build())
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("filter","The names of the properties to check.").setDefaultValueString("all").makeOptional().build())
// State action rewards are multiplied with the exit rate r(s). Then, multiplying the reward with the expected time we stay at s (i.e. 1/r(s)) yields the original state reward
STORM_LOG_THROW(!requirements.hasEnabledCriticalRequirement(),storm::exceptions::UncheckedRequirementException,"Solver requirements "+requirements.getEnabledRequirementsAsString()+" not checked.");
STORM_LOG_THROW(!requirements.hasEnabledCriticalRequirement(),storm::exceptions::UncheckedRequirementException,"Solver requirements "+requirements.getEnabledRequirementsAsString()+" not checked.");
// Check whether we have the right input format for the solver.
STORM_LOG_THROW(linearEquationSolverFactory.getEquationProblemFormat(env)==storm::solver::LinearEquationSolverProblemFormat::EquationSystem,storm::exceptions::FormatUnsupportedBySolverException,"The selected solver does not support the required format.");
STORM_LOG_THROW(!requirements.hasEnabledCriticalRequirement(),storm::exceptions::UncheckedRequirementException,"Solver requirements "+requirements.getEnabledRequirementsAsString()+" not checked.");
STORM_LOG_INFO("Selecting "<<storm::solver::toString(method)<<" as the solution technique for long-run properties to guarantee exact results. If you want to override this, please explicitly specify a different LRA method.");
STORM_LOG_INFO("Selecting "<<storm::solver::toString(method)<<" as the solution technique for long-run properties to guarantee sound results. If you want to override this, please explicitly specify a different LRA method.");
}
STORM_LOG_TRACE("Computing LRA for BSCC of size "<<bscc.size()<<" using '"<<storm::solver::toString(method)<<"'.");
STORM_LOG_THROW(!requirements.hasEnabledCriticalRequirement(),storm::exceptions::UncheckedRequirementException,"Solver requirements "+requirements.getEnabledRequirementsAsString()+" not checked.");
// Todo: Find bounds on the bias variables. Just inserting the maximal value from the vector probably does not work.
STORM_LOG_THROW(!requirements.hasEnabledCriticalRequirement(),storm::exceptions::UncheckedRequirementException,"Solver requirements "+requirements.getEnabledRequirementsAsString()+" not checked.");
STORM_LOG_INFO("Selecting 'LP' as the solution technique for long-run properties to guarantee exact results. If you want to override this, please explicitly specify a different LRA method.");
STORM_LOG_INFO("Selecting 'VI' as the solution technique for long-run properties to guarantee sound results. If you want to override this, please explicitly specify a different LRA method.");
STORM_LOG_THROW(!requirements.hasEnabledCriticalRequirement(),storm::exceptions::UncheckedRequirementException,"Solver requirements "+requirements.getEnabledRequirementsAsString()+" not checked.");
// Compute the expected total rewards for the probabilistic states
if(hasProbabilisticStates){
solver->solveEquations(env,dir,x,b);
solver->solveEquations(solverEnv,dir,x,b);
}
// now compute the values for the markovian states. We also keep track of the maximal and minimal difference between two values (for convergence checking)
STORM_LOG_INFO("Selecting 'LP' as the solution technique for long-run properties to guarantee exact results. If you want to override this, please explicitly specify a different LRA method.");
STORM_LOG_INFO("Selecting 'VI' as the solution technique for long-run properties to guarantee sound results. If you want to override this, please explicitly specify a different LRA method.");
STORM_LOG_THROW(this->hasDefaultValue,storm::exceptions::IllegalFunctionCallException,"Unable to make argument '"<<this->name<<"' optional without default value.");
STORM_LOG_THROW(argument.getHasDefaultValue()||argument.getIsOptional(),storm::exceptions::OptionParserException,"Non-optional argument <"<<argument.getName()<<"> of option:\n"<<*option);
STORM_LOG_THROW(argument.getIsOptional(),storm::exceptions::OptionParserException,"Non-optional argument <"<<argument.getName()<<"> of option:\n"<<*option);
this->addOption(storm::settings::OptionBuilder(moduleName,entryStatesLastOptionName,true,"Sets whether the entry states are eliminated last.").setIsAdvanced().build());
this->addOption(storm::settings::OptionBuilder(moduleName,maximalSccSizeOptionName,true,"Sets the maximal size of the SCCs for which state elimination is applied.").setIsAdvanced()
.addArgument(storm::settings::ArgumentBuilder::createUnsignedIntegerArgument("maxsize","The maximal size of an SCC on which state elimination is applied.").setDefaultValueUnsignedInteger(20).setIsOptional(true).build()).build());
.addArgument(storm::settings::ArgumentBuilder::createUnsignedIntegerArgument("maxsize","The maximal size of an SCC on which state elimination is applied.").setDefaultValueUnsignedInteger(20).build()).build());
this->addOption(storm::settings::OptionBuilder(moduleName,useDedicatedModelCheckerOptionName,true,"Sets whether to use the dedicated model elimination checker (only DTMCs).").setIsAdvanced().build());
this->addOption(storm::settings::OptionBuilder(moduleName,helpOptionName,false,"Shows available options, arguments and descriptions.").setShortName(helpOptionShortName)
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("filter","'frequent' for frequently used options, 'all' for the complete help, or a regular expression to show help for all matching entities.").setDefaultValueString("frequent").build()).build());
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("filter","'frequent' for frequently used options, 'all' for the complete help, or a regular expression to show help for all matching entities.").setDefaultValueString("frequent").makeOptional().build()).build());
this->addOption(storm::settings::OptionBuilder(moduleName,versionOptionName,false,"Prints the version information.").build());
this->addOption(storm::settings::OptionBuilder(moduleName,verboseOptionName,false,"Enables more verbose output.").setShortName(verboseOptionShortName).build());
this->addOption(storm::settings::OptionBuilder(moduleName,showProgressOptionName,false,"Sets when additional information (if available) about the progress is printed.").addArgument(storm::settings::ArgumentBuilder::createUnsignedIntegerArgument("delay","The delay to wait (in seconds) between emitting information (0 means never print progress).").setDefaultValueUnsignedInteger(5).build()).build());
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("filename","The name of the file to which the model is to be written.").build()).build());
this->addOption(storm::settings::OptionBuilder(moduleName,exportCdfOptionName,false,"Exports the cumulative density function for reward bounded properties into a .csv file.").setIsAdvanced().setShortName(exportCdfOptionShortName).addArgument(storm::settings::ArgumentBuilder::createStringArgument("directory","A path to an existing directory where the cdf files will be stored.").build()).build());
this->addOption(storm::settings::OptionBuilder(moduleName,exportSchedulerOptionName,false,"Exports the choices of an optimal scheduler to the given file (if supported by engine).").setIsAdvanced().addArgument(storm::settings::ArgumentBuilder::createStringArgument("filename","The output file.").build()).build());
this->addOption(storm::settings::OptionBuilder(moduleName,exportMonotonicityName,false,"Exports the result of monotonicity checking to the given file.").setIsAdvanced().addArgument(storm::settings::ArgumentBuilder::createStringArgument("filename","The output file.").build()).build());
this->addOption(storm::settings::OptionBuilder(moduleName,exportExplicitOptionName,"","If given, the loaded model will be written to the specified file in the drn format.")
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("filename","the name of the file to which the model is to be writen.").build()).build());
this->addOption(storm::settings::OptionBuilder(moduleName,exportDdOptionName,"","If given, the loaded model will be written to the specified file in the drdd format.")
@ -79,7 +81,7 @@ namespace storm {
this->addOption(storm::settings::OptionBuilder(moduleName,prismToJaniOptionName,false,"If set, the input PRISM model is transformed to JANI.").setIsAdvanced().build());
this->addOption(storm::settings::OptionBuilder(moduleName,propertyOptionName,false,"Specifies the properties to be checked on the model.").setShortName(propertyOptionShortName)
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("property or filename","The formula or the file containing the formulas.").build())
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("filter","The names of the properties to check.").setDefaultValueString("all").build())
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("filter","The names of the properties to check.").setDefaultValueString("all").makeOptional().build())
.build());
this->addOption(storm::settings::OptionBuilder(moduleName,transitionRewardsOptionName,false,"If given, the transition rewards are read from this file and added to the explicit model. Note that this requires the model to be given as an explicit model (i.e., via --"+explicitOptionName+").")
@ -91,7 +93,7 @@ namespace storm {
this->addOption(storm::settings::OptionBuilder(moduleName,constantsOptionName,false,"Specifies the constant replacements to use in symbolic models. Note that this requires the model to be given as an symbolic model (i.e., via --"+prismInputOptionName+" or --"+janiInputOptionName+").").setShortName(constantsOptionShortName)
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("values","A comma separated list of constants and their value, e.g. a=1,b=2,c=3.").setDefaultValueString("").build()).build());
this->addOption(storm::settings::OptionBuilder(moduleName,janiPropertyOptionName,false,"Specifies the properties from the jani model (given by --"+janiInputOptionName+") to be checked.").setShortName(janiPropertyOptionShortName)
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("values","A comma separated list of properties to be checked").setDefaultValueString("").build()).build());
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("values","A comma separated list of properties to be checked").setDefaultValueString("").makeOptional().build()).build());
this->addOption(storm::settings::OptionBuilder(moduleName,qvbsInputOptionName,false,"Selects a model from the Quantitative Verification Benchmark Set.").setShortName(qvbsInputOptionShortName)
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("model","The short model name as in the benchmark set.").build())
this->addOption(storm::settings::OptionBuilder(moduleName,detLraMethodOptionName,true,"Sets which method is preferred for computing long run averages on deterministic models.").setIsAdvanced()
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("name","The name of a long run average computation method.").addValidatorString(ArgumentValidatorFactory::createMultipleChoiceValidator(detLraMethods)).setDefaultValueString("gb").build()).build());
this->addOption(storm::settings::OptionBuilder(moduleName,nondetLraMethodOptionName,true,"Sets which method is preferred for computing long run averages on models with nondeterminism.").setIsAdvanced()
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("name","The name of a long run average computation method.").addValidatorString(ArgumentValidatorFactory::createMultipleChoiceValidator(nondetLraMethods)).setDefaultValueString("vi").build()).build());
this->addOption(storm::settings::OptionBuilder(moduleName,maximalIterationsOptionName,false,"The maximal number of iterations to perform before iterative solving is aborted.").setShortName(maximalIterationsOptionShortName).setIsAdvanced().addArgument(storm::settings::ArgumentBuilder::createUnsignedIntegerArgument("count","The maximal iteration count.").build()).build());
this->addOption(storm::settings::OptionBuilder(moduleName,precisionOptionName,false,"The precision used for detecting convergence of iterative methods.").setIsAdvanced().addArgument(storm::settings::ArgumentBuilder::createDoubleArgument("value","The precision to achieve.").setDefaultValueDouble(1e-06).addValidatorDouble(ArgumentValidatorFactory::createDoubleRangeValidatorExcluding(0.0,1.0)).build()).build());
this->addOption(storm::settings::OptionBuilder(moduleName,absoluteOptionName,false,"Sets whether the relative or the absolute error is considered for detecting convergence.").setIsAdvanced().build());
this->addOption(storm::settings::OptionBuilder(moduleName,aperiodicFactorOptionName,true,"If required by the selected method (e.g. vi), this factor controls how the system is made aperiodic").setIsAdvanced().addArgument(storm::settings::ArgumentBuilder::createDoubleArgument("value","The factor.").setDefaultValueDouble(0.125).addValidatorDouble(ArgumentValidatorFactory::createDoubleRangeValidatorExcluding(0.0,1.0)).build()).build());
this->addOption(storm::settings::OptionBuilder(moduleName,absoluteOptionName,false,"Sets whether the relative or the absolute error is considered for detecting convergence.").setIsAdvanced().build());
this->addOption(storm::settings::OptionBuilder(moduleName,lraMethodOptionName,false,"Sets which method is preferred for computing long run averages.").setIsAdvanced()
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("name","The name of a long run average computation method.").addValidatorString(ArgumentValidatorFactory::createMultipleChoiceValidator(lraMethods)).setDefaultValueString("vi").build()).build());
this->addOption(storm::settings::OptionBuilder(moduleName,markovAutomatonBoundedReachabilityMethodOptionName,false,"The method to use to solve bounded reachability queries on MAs.").setIsAdvanced().addArgument(storm::settings::ArgumentBuilder::createStringArgument("name","The name of the method to use.").addValidatorString(ArgumentValidatorFactory::createMultipleChoiceValidator(maMethods)).setDefaultValueString("unifplus").build()).build());
env.solver().lra().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-8));// Need to increase precision because eq sys yields incorrect results
env.solver().lra().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-8));// Need to increase precision because eq sys yields incorrect results
returnenv;
}
};
classGBSparseEigenDGmresEnvironment{
public:
staticconststorm::dd::DdTypeddType=storm::dd::DdType::Sylvan;// unused for sparse models
env.solver().lra().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-8));// Need to increase precision because eq sys yields incorrect results
returnenv;
}
};
classDistrSparseEigenDoubleLUEnvironment{
public:
staticconststorm::dd::DdTypeddType=storm::dd::DdType::Sylvan;// unused for sparse models