Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
EnvironmentBuilder.cpp
Go to the documentation of this file.
2
34
35namespace {
36
37void applyPrecision(auto& environment, double precision) {
38 environment.setPrecision(storm::utility::convertNumber<storm::RationalNumber>(precision));
39}
40
41void applyPrecision(auto& environment, double precision, bool setFromDefault) {
42 environment.setPrecision(storm::utility::convertNumber<storm::RationalNumber>(precision), setFromDefault);
43}
44
45void applyIfSet(bool isSet, auto&& apply) {
46 if (isSet) {
47 apply();
48 }
49}
50
51// Not every executable registers every settings module, so modules that are absent leave the environment defaults untouched.
52template<typename SettingsType>
53void applyIfRegistered(auto&& apply) {
56 }
57}
58
59} // namespace
60
61namespace storm {
62namespace settings {
63
66
67 applyIfRegistered<storm::settings::modules::GeneralSettings>(
68 [&](auto const& generalSettings) { applyIfSet(generalSettings.isToleranceSet(), [&]() { env.setModelTolerance(generalSettings.getTolerance()); }); });
69
70 setSolverEnvironment(env.solver());
71 setModelcheckerEnvironment(env.modelchecker());
72 setDdEnvironment(env.dd());
73 setExplorationEnvironment(env.exploration());
74
75 return env;
76}
77
78void EnvironmentBuilder::setSolverEnvironment(storm::SolverEnvironment& solver) {
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());
84 });
85 applyIfRegistered<storm::settings::modules::DebugSettings>([&](auto const& debugSettings) { solver.setDebug(debugSettings.isDebugSet()); });
86 applyIfRegistered<storm::settings::modules::CoreSettings>([&](auto const& coreSettings) {
87 solver.setLinearEquationSolverType(coreSettings.getEquationSolver(), coreSettings.isEquationSolverSetFromDefaultValue());
88 solver.setLpSolverType(coreSettings.getLpSolver(), coreSettings.isLpSolverSetFromDefaultValue());
89 solver.setSmtSolverType(coreSettings.getSmtSolver(), coreSettings.isSmtSolverSetFromDefaultValue());
90 });
91
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()); });
99 });
100
101 applyIfRegistered<storm::settings::modules::EliminationSettings>([&](auto const& eliminationSettings) {
102 auto& elimination = solver.elimination();
103 elimination.setOrder(eliminationSettings.getEliminationOrder());
104 elimination.setMethod(eliminationSettings.getEliminationMethod());
105 elimination.setMaximalSccSize(eliminationSettings.getMaximalSccSize());
106 elimination.setEliminateEntryStatesLast(eliminationSettings.isEliminateEntryStatesLastSet());
107 });
108
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() ==
116 });
117
118 applyIfRegistered<storm::settings::modules::GlpkSettings>([&](auto const& glpkSettings) {
119 auto& glpk = solver.glpk();
120 glpk.setIntegerTolerance(glpkSettings.getIntegerTolerance());
121 glpk.setMILPPresolverEnabled(glpkSettings.isMILPPresolverEnabled());
122 glpk.setOutput(glpkSettings.isOutputSet());
123 });
124
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()); });
132 });
133
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());
142 });
143
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()); });
151 lra.setAperiodicFactor(storm::utility::convertNumber<storm::RationalNumber>(lraSettings.getAperiodicFactor()));
152 });
153
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());
163
164 auto& minMaxLp = minMax.lp();
165 minMaxLp.setUseNonTrivialBounds(minMaxSettings.getLpUseNonTrivialBounds());
166 minMaxLp.setOptimizeOnlyForInitialState(minMaxSettings.getLpUseOnlyInitialStateAsObjective());
167 minMaxLp.setUseEqualityForSingleActions(minMaxSettings.getLpUseEqualityForTrivialActions());
168 });
169
170 applyIfRegistered<storm::settings::modules::MultiplierSettings>([&](auto const& multiplierSettings) {
171 solver.multiplier().setType(multiplierSettings.getMultiplierType(), multiplierSettings.isMultiplierTypeSetFromDefaultValue());
172 });
173
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());
182 native.setSorOmega(storm::utility::convertNumber<storm::RationalNumber>(nativeSettings.getOmega()));
183 native.setSymmetricUpdates(nativeSettings.isForceIntervalIterationSymmetricUpdatesSet());
184 });
185
186 applyIfRegistered<storm::settings::modules::OviSolverSettings>([&](auto const& oviSettings) {
187 applyIfSet(oviSettings.hasUpperBoundGuessingFactorBeenSet(), [&]() {
188 solver.ovi().setUpperBoundGuessingFactor(storm::utility::convertNumber<storm::RationalNumber>(oviSettings.getUpperBoundGuessingFactor()));
189 });
190 });
191
192 applyIfRegistered<storm::settings::modules::TimeBoundedSolverSettings>([&](auto const& tbSettings) {
193 auto& timeBounded = solver.timeBounded();
194 timeBounded.setMaMethod(tbSettings.getMaMethod(), tbSettings.isMaMethodSetFromDefaultValue());
195 applyIfSet(tbSettings.isPrecisionSet(), [&]() { applyPrecision(timeBounded, tbSettings.getPrecision()); });
196 timeBounded.setRelativeTerminationCriterion(tbSettings.isRelativePrecision());
197 timeBounded.setUnifPlusKappa(storm::utility::convertNumber<storm::RationalNumber>(tbSettings.getUnifPlusKappa()));
198 });
199
200 applyIfRegistered<storm::settings::modules::TopologicalEquationSolverSettings>([&](auto const& topologicalSettings) {
201 auto& topological = solver.topological();
202 topological.setUnderlyingEquationSolverType(topologicalSettings.getUnderlyingEquationSolverType(),
203 topologicalSettings.isUnderlyingEquationSolverTypeSetFromDefaultValue());
204 topological.setUnderlyingMinMaxMethod(topologicalSettings.getUnderlyingMinMaxMethod(),
205 topologicalSettings.isUnderlyingMinMaxMethodSetFromDefaultValue());
206 topological.setExtendRelevantValues(topologicalSettings.isExtendRelevantValues());
207 });
208}
209
210void EnvironmentBuilder::setModelcheckerEnvironment(storm::ModelCheckerEnvironment& modelchecker) {
211 applyIfRegistered<storm::settings::modules::ModelCheckerSettings>([&](auto const& mcSettings) {
212 applyIfSet(mcSettings.isLtl2daToolSet(), [&]() { modelchecker.setLtl2daTool(mcSettings.getLtl2daTool()); });
213 modelchecker.setFilterRewZero(mcSettings.isFilterRewZeroSet());
214 });
215
216 applyIfRegistered<storm::settings::modules::IOSettings>([&](auto const& ioSettings) {
217 modelchecker.setSteadyStateDistributionAlgorithm(ioSettings.getSteadyStateDistributionAlgorithm());
218 modelchecker.setExportCdf(ioSettings.isExportCdfSet());
219 applyIfSet(ioSettings.isExportCdfSet(), [&]() { modelchecker.setExportCdfDirectory(ioSettings.getExportCdfDirectory()); });
220 });
221
222 applyIfRegistered<storm::settings::modules::ConditionalSettings>([&](auto const& conditionalSettings) {
223 auto& conditional = modelchecker.conditional();
224 conditional.setAlgorithm(conditionalSettings.getConditionalAlgorithmSetting());
225 applyPrecision(conditional, conditionalSettings.getConditionalPrecision(), conditionalSettings.isConditionalPrecisionSetFromDefaultValue());
226 conditional.setRelativePrecision(!conditionalSettings.isConditionalPrecisionAbsolute());
227 });
228
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");
237 });
238 applyIfSet(multiobjectiveSettings.isPrecisionSet(), [&]() { applyPrecision(multiobjective, multiobjectiveSettings.getPrecision()); });
239 if (multiobjectiveSettings.getPrecisionAbsolute()) {
241 } else if (multiobjectiveSettings.getPrecisionRelativeToDiff()) {
243 } else {
244 STORM_LOG_THROW(false, storm::exceptions::IllegalArgumentException, "Unhandled precision type.");
245 }
246 if (multiobjectiveSettings.isAutoEncodingSet()) {
247 multiobjective.setEncodingType(MultiObjectiveModelCheckerEnvironment::EncodingType::Auto);
248 } else if (multiobjectiveSettings.isClassicEncodingSet()) {
250 } else if (multiobjectiveSettings.isFlowEncodingSet()) {
251 multiobjective.setEncodingType(MultiObjectiveModelCheckerEnvironment::EncodingType::Flow);
252 } else {
253 STORM_LOG_THROW(false, storm::exceptions::IllegalArgumentException, "Unhandled encoding type.");
254 }
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()));
261 });
262 applyIfSet(multiobjectiveSettings.isMaxStepsSet(), [&]() { multiobjective.setMaxSteps(multiobjectiveSettings.getMaxSteps()); });
263 applyIfSet(multiobjectiveSettings.hasSchedulerRestriction(),
264 [&]() { multiobjective.setSchedulerRestriction(multiobjectiveSettings.getSchedulerRestriction()); });
265 multiobjective.setPrintResults(multiobjectiveSettings.isPrintResultsSet());
266 });
267}
268
269void EnvironmentBuilder::setDdEnvironment(storm::DdEnvironment& dd) {
270 applyIfRegistered<storm::settings::modules::CuddSettings>([&](auto const& cuddSettings) {
271 auto& cudd = dd.cudd();
272 cudd.setConstantPrecision(cuddSettings.getConstantPrecision());
273 cudd.setMaximalMemory(cuddSettings.getMaximalMemory());
274 cudd.setReorderingEnabled(cuddSettings.isReorderingEnabled());
275 cudd.setReorderingTechnique(cuddSettings.getReorderingTechnique());
276 });
277 applyIfRegistered<storm::settings::modules::SylvanSettings>([&](auto const& sylvanSettings) {
278 auto& sylvan = dd.sylvan();
279 sylvan.setMaximalMemory(sylvanSettings.getMaximalMemory());
280 applyIfSet(sylvanSettings.isNumberOfThreadsSet(), [&]() { sylvan.setNumberOfThreads(sylvanSettings.getNumberOfThreads()); });
281 });
282}
283
284void EnvironmentBuilder::setExplorationEnvironment(storm::ExplorationEnvironment& exploration) {
285 applyIfRegistered<storm::settings::modules::ExplorationSettings>([&](auto const& explorationSettings) {
286 exploration.setPrecomputationType(explorationSettings.getPrecomputationType());
287 exploration.setStepsUntilPrecomputation(static_cast<uint64_t>(explorationSettings.getNumberOfExplorationStepsUntilPrecomputation()));
288 applyIfSet(explorationSettings.isNumberOfSampledPathsUntilPrecomputationSet(),
289 [&]() { exploration.setSampledPathsUntilPrecomputation(explorationSettings.getNumberOfSampledPathsUntilPrecomputation()); });
290 exploration.setNextStateHeuristic(explorationSettings.getNextStateHeuristic());
291 applyIfSet(explorationSettings.isPrecisionSet(), [&]() { exploration.setPrecision(explorationSettings.getPrecision()); });
292 });
293}
294
295} // namespace settings
296} // namespace storm
CuddDdManagerEnvironment & cudd()
SylvanDdManagerEnvironment & sylvan()
void setMethod(storm::solver::EigenLinearEquationSolverMethod value, bool isSetFromDefault=false)
void setOrder(storm::solver::stateelimination::EliminationOrder value)
ExplorationEnvironment & exploration()
DdEnvironment & dd()
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 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()
ConditionalModelCheckerEnvironment & conditional()
void setSteadyStateDistributionAlgorithm(SteadyStateDistributionAlgorithm value)
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 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)
Definition macros.h:39
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)