37void applyPrecision(
auto& environment,
double precision) {
41void applyPrecision(
auto& environment,
double precision,
bool setFromDefault) {
45void applyIfSet(
bool isSet,
auto&& apply) {
52template<
typename SettingsType>
53void applyIfRegistered(
auto&& apply) {
67 applyIfRegistered<storm::settings::modules::GeneralSettings>(
68 [&](
auto const& generalSettings) { applyIfSet(generalSettings.isToleranceSet(), [&]() { env.setModelTolerance(generalSettings.getTolerance()); }); });
70 setSolverEnvironment(env.
solver());
72 setDdEnvironment(env.
dd());
79 applyIfRegistered<storm::settings::modules::GeneralSettings>([&](
auto const& generalSettings) {
80 solver.setForceSoundness(generalSettings.isSoundSet());
81 solver.setForceExact(generalSettings.isExactSet() || generalSettings.isExactFinitePrecisionSet());
82 solver.setVerbose(generalSettings.isVerboseSet());
83 solver.setShowProgressDelay(generalSettings.getShowProgressDelay());
85 applyIfRegistered<storm::settings::modules::DebugSettings>([&](
auto const& debugSettings) {
solver.setDebug(debugSettings.isDebugSet()); });
86 applyIfRegistered<storm::settings::modules::CoreSettings>([&](
auto const& coreSettings) {
88 solver.
setLpSolverType(coreSettings.getLpSolver(), coreSettings.isLpSolverSetFromDefaultValue());
89 solver.
setSmtSolverType(coreSettings.getSmtSolver(), coreSettings.isSmtSolverSetFromDefaultValue());
92 applyIfRegistered<storm::settings::modules::EigenEquationSolverSettings>([&](
auto const& eigenSettings) {
93 auto& eigen = solver.
eigen();
94 eigen.
setMethod(eigenSettings.getLinearEquationSystemMethod(), eigenSettings.isLinearEquationSystemMethodSetFromDefault());
95 eigen.setPreconditioner(eigenSettings.getPreconditioningMethod());
96 eigen.setRestartThreshold(eigenSettings.getRestartIterationCount());
97 applyIfSet(eigenSettings.isMaximalIterationCountSet(), [&]() { eigen.setMaximalNumberOfIterations(eigenSettings.getMaximalIterationCount()); });
98 applyIfSet(eigenSettings.isPrecisionSet(), [&]() { applyPrecision(eigen, eigenSettings.getPrecision()); });
101 applyIfRegistered<storm::settings::modules::EliminationSettings>([&](
auto const& eliminationSettings) {
103 elimination.
setOrder(eliminationSettings.getEliminationOrder());
104 elimination.setMethod(eliminationSettings.getEliminationMethod());
105 elimination.setMaximalSccSize(eliminationSettings.getMaximalSccSize());
106 elimination.setEliminateEntryStatesLast(eliminationSettings.isEliminateEntryStatesLastSet());
109 applyIfRegistered<storm::settings::modules::GameSolverSettings>([&](
auto const& gameSettings) {
110 auto& game = solver.
game();
111 game.
setMethod(gameSettings.getGameSolvingMethod(), gameSettings.isGameSolvingMethodSetFromDefaultValue());
112 applyIfSet(gameSettings.isMaximalIterationCountSet(), [&]() { game.setMaximalNumberOfIterations(gameSettings.getMaximalIterationCount()); });
113 applyIfSet(gameSettings.isPrecisionSet(), [&]() { applyPrecision(game, gameSettings.getPrecision()); });
114 game.setRelativeTerminationCriterion(gameSettings.getConvergenceCriterion() ==
118 applyIfRegistered<storm::settings::modules::GlpkSettings>([&](
auto const& glpkSettings) {
119 auto& glpk = solver.
glpk();
121 glpk.setMILPPresolverEnabled(glpkSettings.isMILPPresolverEnabled());
122 glpk.setOutput(glpkSettings.isOutputSet());
125 applyIfRegistered<storm::settings::modules::GmmxxEquationSolverSettings>([&](
auto const& gmmxxSettings) {
126 auto& gmmxx = solver.
gmmxx();
127 gmmxx.
setMethod(gmmxxSettings.getLinearEquationSystemMethod());
128 gmmxx.setPreconditioner(gmmxxSettings.getPreconditioningMethod());
129 gmmxx.setRestartThreshold(gmmxxSettings.getRestartIterationCount());
130 applyIfSet(gmmxxSettings.isMaximalIterationCountSet(), [&]() { gmmxx.setMaximalNumberOfIterations(gmmxxSettings.getMaximalIterationCount()); });
131 applyIfSet(gmmxxSettings.isPrecisionSet(), [&]() { applyPrecision(gmmxx, gmmxxSettings.getPrecision()); });
134 applyIfRegistered<storm::settings::modules::GurobiSettings>([&](
auto const& gurobiSettings) {
135 auto& gurobi = solver.
gurobi();
136 gurobi.
setMethod(gurobiSettings.getMethod());
137 gurobi.setNumberOfThreads(gurobiSettings.getNumberOfThreads());
138 gurobi.setMIPFocus(gurobiSettings.getMIPFocus());
139 gurobi.setNumberOfConcurrentMipThreads(gurobiSettings.getNumberOfConcurrentMipThreads());
140 gurobi.setIntegerTolerance(gurobiSettings.getIntegerTolerance());
141 gurobi.setOutput(gurobiSettings.isOutputSet());
144 applyIfRegistered<storm::settings::modules::LongRunAverageSolverSettings>([&](
auto const& lraSettings) {
145 auto& lra = solver.
lra();
146 lra.
setDetLraMethod(lraSettings.getDetLraMethod(), lraSettings.isDetLraMethodSetFromDefaultValue());
147 lra.setNondetLraMethod(lraSettings.getNondetLraMethod(), lraSettings.isNondetLraMethodSetFromDefaultValue());
148 applyIfSet(lraSettings.isPrecisionSet(), [&]() { applyPrecision(lra, lraSettings.getPrecision()); });
149 lra.setRelativeTerminationCriterion(lraSettings.isRelativePrecision());
150 applyIfSet(lraSettings.isMaximalIterationCountSet(), [&]() { lra.setMaximalIterationCount(lraSettings.getMaximalIterationCount()); });
154 applyIfRegistered<storm::settings::modules::MinMaxEquationSolverSettings>([&](
auto const& minMaxSettings) {
155 auto& minMax = solver.
minMax();
156 minMax.
setMethod(minMaxSettings.getMinMaxEquationSolvingMethod(), minMaxSettings.isMinMaxEquationSolvingMethodSetFromDefaultValue());
157 applyIfSet(minMaxSettings.isMaximalIterationCountSet(), [&]() { minMax.setMaximalNumberOfIterations(minMaxSettings.getMaximalIterationCount()); });
158 applyIfSet(minMaxSettings.isPrecisionSet(), [&]() { applyPrecision(minMax, minMaxSettings.getPrecision()); });
159 minMax.setRelativeTerminationCriterion(minMaxSettings.getConvergenceCriterion() ==
161 minMax.setMultiplicationStyle(minMaxSettings.getValueIterationMultiplicationStyle());
162 minMax.setForceRequireUnique(minMaxSettings.isForceUniqueSolutionRequirementSet());
164 auto& minMaxLp = minMax.lp();
165 minMaxLp.setUseNonTrivialBounds(minMaxSettings.getLpUseNonTrivialBounds());
166 minMaxLp.setOptimizeOnlyForInitialState(minMaxSettings.getLpUseOnlyInitialStateAsObjective());
167 minMaxLp.setUseEqualityForSingleActions(minMaxSettings.getLpUseEqualityForTrivialActions());
170 applyIfRegistered<storm::settings::modules::MultiplierSettings>([&](
auto const& multiplierSettings) {
171 solver.
multiplier().
setType(multiplierSettings.getMultiplierType(), multiplierSettings.isMultiplierTypeSetFromDefaultValue());
174 applyIfRegistered<storm::settings::modules::NativeEquationSolverSettings>([&](
auto const& nativeSettings) {
175 auto& native = solver.
native();
176 native.
setMethod(nativeSettings.getLinearEquationSystemMethod(), nativeSettings.isLinearEquationSystemTechniqueSetFromDefaultValue());
177 applyIfSet(nativeSettings.isMaximalIterationCountSet(), [&]() { native.setMaximalNumberOfIterations(nativeSettings.getMaximalIterationCount()); });
178 applyIfSet(nativeSettings.isPrecisionSet(), [&]() { applyPrecision(native, nativeSettings.getPrecision()); });
179 native.setRelativeTerminationCriterion(nativeSettings.getConvergenceCriterion() ==
181 native.setPowerMethodMultiplicationStyle(nativeSettings.getPowerMethodMultiplicationStyle());
183 native.setSymmetricUpdates(nativeSettings.isForceIntervalIterationSymmetricUpdatesSet());
186 applyIfRegistered<storm::settings::modules::OviSolverSettings>([&](
auto const& oviSettings) {
187 applyIfSet(oviSettings.hasUpperBoundGuessingFactorBeenSet(), [&]() {
188 solver.ovi().setUpperBoundGuessingFactor(storm::utility::convertNumber<storm::RationalNumber>(oviSettings.getUpperBoundGuessingFactor()));
192 applyIfRegistered<storm::settings::modules::TimeBoundedSolverSettings>([&](
auto const& tbSettings) {
194 timeBounded.
setMaMethod(tbSettings.getMaMethod(), tbSettings.isMaMethodSetFromDefaultValue());
195 applyIfSet(tbSettings.isPrecisionSet(), [&]() { applyPrecision(timeBounded, tbSettings.getPrecision()); });
196 timeBounded.setRelativeTerminationCriterion(tbSettings.isRelativePrecision());
200 applyIfRegistered<storm::settings::modules::TopologicalEquationSolverSettings>([&](
auto const& topologicalSettings) {
203 topologicalSettings.isUnderlyingEquationSolverTypeSetFromDefaultValue());
204 topological.setUnderlyingMinMaxMethod(topologicalSettings.getUnderlyingMinMaxMethod(),
205 topologicalSettings.isUnderlyingMinMaxMethodSetFromDefaultValue());
206 topological.setExtendRelevantValues(topologicalSettings.isExtendRelevantValues());
210void EnvironmentBuilder::setModelcheckerEnvironment(storm::ModelCheckerEnvironment& modelchecker) {
211 applyIfRegistered<storm::settings::modules::ModelCheckerSettings>([&](
auto const& mcSettings) {
212 applyIfSet(mcSettings.isLtl2daToolSet(), [&]() { modelchecker.setLtl2daTool(mcSettings.getLtl2daTool()); });
216 applyIfRegistered<storm::settings::modules::IOSettings>([&](
auto const& ioSettings) {
219 applyIfSet(ioSettings.isExportCdfSet(), [&]() { modelchecker.setExportCdfDirectory(ioSettings.getExportCdfDirectory()); });
222 applyIfRegistered<storm::settings::modules::ConditionalSettings>([&](
auto const& conditionalSettings) {
224 conditional.
setAlgorithm(conditionalSettings.getConditionalAlgorithmSetting());
225 applyPrecision(conditional, conditionalSettings.getConditionalPrecision(), conditionalSettings.isConditionalPrecisionSetFromDefaultValue());
226 conditional.setRelativePrecision(!conditionalSettings.isConditionalPrecisionAbsolute());
229 applyIfRegistered<storm::settings::modules::MultiObjectiveSettings>([&](
auto const& multiobjectiveSettings) {
230 auto& multiobjective = modelchecker.
multi();
231 multiobjective.
setMethod(multiobjectiveSettings.getMultiObjectiveMethod());
232 applyIfSet(multiobjectiveSettings.isExportPlotSet(), [&]() {
233 std::string const exportPlotDirectory = multiobjectiveSettings.getExportPlotDirectory();
234 multiobjective.setPlotPathUnderApproximation(exportPlotDirectory +
"underapproximation.csv");
235 multiobjective.setPlotPathOverApproximation(exportPlotDirectory +
"overapproximation.csv");
236 multiobjective.setPlotPathParetoPoints(exportPlotDirectory +
"paretopoints.csv");
238 applyIfSet(multiobjectiveSettings.isPrecisionSet(), [&]() { applyPrecision(multiobjective, multiobjectiveSettings.getPrecision()); });
239 if (multiobjectiveSettings.getPrecisionAbsolute()) {
241 }
else if (multiobjectiveSettings.getPrecisionRelativeToDiff()) {
244 STORM_LOG_THROW(
false, storm::exceptions::IllegalArgumentException,
"Unhandled precision type.");
246 if (multiobjectiveSettings.isAutoEncodingSet()) {
248 }
else if (multiobjectiveSettings.isClassicEncodingSet()) {
250 }
else if (multiobjectiveSettings.isFlowEncodingSet()) {
253 STORM_LOG_THROW(
false, storm::exceptions::IllegalArgumentException,
"Unhandled encoding type.");
255 multiobjective.setUseBsccOrderEncoding(multiobjectiveSettings.isBsccDetectionViaOrderConstraintsSet());
256 multiobjective.setUseIndicatorConstraints(multiobjectiveSettings.isIndicatorConstraintsSet());
257 multiobjective.setUseRedundantBsccConstraints(multiobjectiveSettings.isRedundantBsccConstraintsSet());
258 applyIfSet(multiobjectiveSettings.isWeightedSumApproximationTradeoffSet(), [&]() {
259 multiobjective.setApproximationTradeoff(
260 storm::utility::convertNumber<storm::RationalNumber>(multiobjectiveSettings.getWeightedSumApproximationTradeoff()));
262 applyIfSet(multiobjectiveSettings.isMaxStepsSet(), [&]() { multiobjective.setMaxSteps(multiobjectiveSettings.getMaxSteps()); });
263 applyIfSet(multiobjectiveSettings.hasSchedulerRestriction(),
264 [&]() { multiobjective.setSchedulerRestriction(multiobjectiveSettings.getSchedulerRestriction()); });
265 multiobjective.setPrintResults(multiobjectiveSettings.isPrintResultsSet());
269void EnvironmentBuilder::setDdEnvironment(storm::DdEnvironment& dd) {
270 applyIfRegistered<storm::settings::modules::CuddSettings>([&](
auto const& cuddSettings) {
271 auto& cudd = dd.
cudd();
273 cudd.setMaximalMemory(cuddSettings.getMaximalMemory());
274 cudd.setReorderingEnabled(cuddSettings.isReorderingEnabled());
275 cudd.setReorderingTechnique(cuddSettings.getReorderingTechnique());
277 applyIfRegistered<storm::settings::modules::SylvanSettings>([&](
auto const& sylvanSettings) {
278 auto& sylvan = dd.
sylvan();
280 applyIfSet(sylvanSettings.isNumberOfThreadsSet(), [&]() { sylvan.setNumberOfThreads(sylvanSettings.getNumberOfThreads()); });
284void EnvironmentBuilder::setExplorationEnvironment(storm::ExplorationEnvironment& exploration) {
285 applyIfRegistered<storm::settings::modules::ExplorationSettings>([&](
auto const& explorationSettings) {
287 exploration.
setStepsUntilPrecomputation(
static_cast<uint64_t
>(explorationSettings.getNumberOfExplorationStepsUntilPrecomputation()));
288 applyIfSet(explorationSettings.isNumberOfSampledPathsUntilPrecomputationSet(),
289 [&]() { exploration.setSampledPathsUntilPrecomputation(explorationSettings.getNumberOfSampledPathsUntilPrecomputation()); });
291 applyIfSet(explorationSettings.isPrecisionSet(), [&]() { exploration.setPrecision(explorationSettings.getPrecision()); });
void setAlgorithm(ConditionalAlgorithmSetting value)
void setConstantPrecision(double value)
CuddDdManagerEnvironment & cudd()
SylvanDdManagerEnvironment & sylvan()
void setMethod(storm::solver::EigenLinearEquationSolverMethod value, bool isSetFromDefault=false)
void setOrder(storm::solver::stateelimination::EliminationOrder value)
ExplorationEnvironment & exploration()
SolverEnvironment & solver()
ModelCheckerEnvironment & modelchecker()
void setPrecomputationType(storm::modelchecker::exploration_detail::PrecomputationType value)
void setStepsUntilPrecomputation(uint64_t value)
void setNextStateHeuristic(storm::modelchecker::exploration_detail::NextStateHeuristic value)
void setMethod(storm::solver::GameMethod value, bool isSetFromDefault=false)
void setIntegerTolerance(double value)
void setMethod(storm::solver::GmmxxLinearEquationSolverMethod value)
void setMethod(storm::solver::GurobiSolverMethod value)
void setDetLraMethod(storm::solver::LraMethod value, bool isSetFromDefault=false)
void setMethod(storm::solver::MinMaxMethod value, bool isSetFromDefault=false)
MultiObjectiveModelCheckerEnvironment & multi()
void setExportCdf(bool value)
void setFilterRewZero(bool value)
ConditionalModelCheckerEnvironment & conditional()
void setSteadyStateDistributionAlgorithm(SteadyStateDistributionAlgorithm value)
@ RelativeToDiff
Absolute precision.
@ Classic
Pick automatically.
@ Flow
The classic backwards encoding.
void setMethod(storm::modelchecker::multiobjective::MultiObjectiveMethod value)
void setType(storm::solver::MultiplierType value, bool isSetFromDefault=false)
void setMethod(storm::solver::NativeLinearEquationSolverMethod value, bool isSetFromDefault=false)
TopologicalSolverEnvironment & topological()
void setLinearEquationSolverType(storm::solver::EquationSolverType const &value, bool isSetFromDefault=false)
EigenSolverEnvironment & eigen()
MinMaxSolverEnvironment & minMax()
MultiplierEnvironment & multiplier()
EliminationSolverEnvironment & elimination()
GlpkSolverEnvironment & glpk()
GameSolverEnvironment & game()
void setLpSolverType(storm::solver::LpSolverType const &value, bool isSetFromDefault=false)
TimeBoundedSolverEnvironment & timeBounded()
NativeSolverEnvironment & native()
GurobiSolverEnvironment & gurobi()
GmmxxSolverEnvironment & gmmxx()
LongRunAverageSolverEnvironment & lra()
void setSmtSolverType(storm::solver::SmtSolverType const &value, bool isSetFromDefault=false)
void setMaximalMemory(uint64_t value)
void setMaMethod(storm::solver::MaBoundedReachabilityMethod value, bool isSetFromDefault=false)
void setUnderlyingEquationSolverType(storm::solver::EquationSolverType value, bool isSetFromDefault=false)
static storm::Environment buildEnvironment()
#define STORM_LOG_THROW(cond, exception, message)
Expression apply(std::vector< storm::expressions::Expression > const &expressions, std::function< Expression(Expression const &, Expression const &)> const &function)
bool hasModule()
Returns true if the given module is registered.
SettingsType const & getModule()
Get module.
TargetType convertNumber(SourceType const &number)