Browse Source

param: store whether the parametric engine is used for exact or parametric analysis, adapt log output / errors

master
Joachim Klein 8 years ago
committed by Dave Parker
parent
commit
2dc08f6fb1
  1. 17
      prism/src/param/ModelBuilder.java
  2. 63
      prism/src/param/ParamMode.java
  3. 45
      prism/src/param/ParamModelChecker.java
  4. 11
      prism/src/param/ParamResult.java
  5. 4
      prism/src/param/ValueComputer.java
  6. 8
      prism/src/prism/Prism.java

17
prism/src/param/ModelBuilder.java

@ -55,6 +55,8 @@ import prism.PrismSettings;
*/ */
public final class ModelBuilder extends PrismComponent public final class ModelBuilder extends PrismComponent
{ {
/** mode (parametric / exact) */
private final ParamMode mode;
/** the ModelGeneratorSymbolic interface providing the model to be transformed to a {@code ParamModel} */ /** the ModelGeneratorSymbolic interface providing the model to be transformed to a {@code ParamModel} */
private ModelGeneratorSymbolic modelGenSym; private ModelGeneratorSymbolic modelGenSym;
/** function factory used in the constructed parametric model */ /** function factory used in the constructed parametric model */
@ -76,9 +78,10 @@ public final class ModelBuilder extends PrismComponent
/** /**
* Constructor * Constructor
*/ */
public ModelBuilder(PrismComponent parent) throws PrismException
public ModelBuilder(PrismComponent parent, ParamMode mode) throws PrismException
{ {
super(parent); super(parent);
this.mode = mode;
// If present, initialise settings from PrismSettings // If present, initialise settings from PrismSettings
if (settings != null) { if (settings != null) {
functionType = settings.getString(PrismSettings.PRISM_PARAM_FUNCTION); functionType = settings.getString(PrismSettings.PRISM_PARAM_FUNCTION);
@ -132,7 +135,7 @@ public final class ModelBuilder extends PrismComponent
case ExpressionBinaryOp.DIVIDE: case ExpressionBinaryOp.DIVIDE:
return f1.divide(f2); return f1.divide(f2);
default: default:
throw new PrismNotSupportedException("parametric analysis with rate/probability of " + expr + " not implemented");
throw new PrismNotSupportedException("For " + mode.engine() + ", analysis with rate/probability of " + expr + " not implemented");
} }
} else if (expr instanceof ExpressionUnaryOp) { } else if (expr instanceof ExpressionUnaryOp) {
ExpressionUnaryOp unExpr = ((ExpressionUnaryOp) expr); ExpressionUnaryOp unExpr = ((ExpressionUnaryOp) expr);
@ -143,7 +146,7 @@ public final class ModelBuilder extends PrismComponent
case ExpressionUnaryOp.PARENTH: case ExpressionUnaryOp.PARENTH:
return f; return f;
default: default:
throw new PrismNotSupportedException("parametric analysis with rate/probability of " + expr + " not implemented");
throw new PrismNotSupportedException("For " + mode.engine() + ", analysis with rate/probability of " + expr + " not implemented");
} }
} else if (expr instanceof ExpressionITE){ } else if (expr instanceof ExpressionITE){
ExpressionITE iteExpr = (ExpressionITE) expr; ExpressionITE iteExpr = (ExpressionITE) expr;
@ -165,7 +168,7 @@ public final class ModelBuilder extends PrismComponent
// Do nothing here, exception is thrown below // Do nothing here, exception is thrown below
} }
} }
throw new PrismNotSupportedException("parametric analysis with rate/probability of " + expr + " not implemented");
throw new PrismNotSupportedException("For " + mode.engine() + ", analysis with rate/probability of " + expr + " not implemented");
} else if (expr instanceof ExpressionFunc) { } else if (expr instanceof ExpressionFunc) {
// functions (min, max, floor, ...) are supported if // functions (min, max, floor, ...) are supported if
// they don't refer to parametric constants in their arguments // they don't refer to parametric constants in their arguments
@ -178,10 +181,10 @@ public final class ModelBuilder extends PrismComponent
return factory.fromBigRational(value); return factory.fromBigRational(value);
} catch (PrismException e) { } catch (PrismException e) {
// Most likely, a parametric constant occurred. // Most likely, a parametric constant occurred.
throw new PrismNotSupportedException("parametric analysis with rate/probability of " + expr + " not implemented");
throw new PrismNotSupportedException("For " + mode.engine() + ", analysis with rate/probability of " + expr + " not implemented");
} }
} else { } else {
throw new PrismNotSupportedException("parametric analysis with rate/probability of " + expr + " not implemented");
throw new PrismNotSupportedException("For " + mode.engine() + ", analysis with rate/probability of " + expr + " not implemented");
} }
} }
@ -248,7 +251,7 @@ public final class ModelBuilder extends PrismComponent
});*/ });*/
// Build/return model // Build/return model
mainLog.print("\nBuilding model...\n");
mainLog.print("\nBuilding model (" + mode.engine() + ")...\n");
long time = System.currentTimeMillis(); long time = System.currentTimeMillis();
ParamModel modelExpl = doModelConstruction(modelGenSym); ParamModel modelExpl = doModelConstruction(modelGenSym);
time = System.currentTimeMillis() - time; time = System.currentTimeMillis() - time;

63
prism/src/param/ParamMode.java

@ -0,0 +1,63 @@
//==============================================================================
//
// Copyright (c) 2017-
// Authors:
// * Joachim Klein <klein@tcs.inf.tu-dresden.de> (TU Dresden)
//
//------------------------------------------------------------------------------
//
// This file is part of PRISM.
//
// PRISM is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// PRISM is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with PRISM; if not, write to the Free Software Foundation,
// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
//==============================================================================
package param;
/** Mode (parametric / exact) */
public enum ParamMode {
/** Parametric analysis mode for the parametric engine */
PARAMETRIC("parametric"),
/** Exact analysis mode (i.e., using constant functions) for the parametric engine */
EXACT("exact");
/** The mode name */
private final String name;
/** Private constructor */
private ParamMode(String name)
{
this.name = name;
}
/** Get either "parametric" or "exact", depending on mode. */
public String toString()
{
return name;
}
/** Get "parametric engine" or "exact engine", depending on mode. */
public String engine()
{
return name + " engine";
}
/** Get "Parametric engine" or "Exact engine", depending on mode. */
public String Engine()
{
return name.substring(0,1).toUpperCase() + name.substring(1) + " engine";
}
}

45
prism/src/param/ParamModelChecker.java

@ -117,6 +117,9 @@ final public class ParamModelChecker extends PrismComponent
// Flags/settings // Flags/settings
/** The mode (parametric or exact)? */
private ParamMode mode;
// Verbosity level // Verbosity level
private int verbosity = 0; private int verbosity = 0;
@ -140,9 +143,10 @@ final public class ParamModelChecker extends PrismComponent
/** /**
* Constructor * Constructor
*/ */
public ParamModelChecker(PrismComponent parent) throws PrismException
public ParamModelChecker(PrismComponent parent, ParamMode mode) throws PrismException
{ {
super(parent); super(parent);
this.mode = mode;
// If present, initialise settings from PrismSettings // If present, initialise settings from PrismSettings
if (settings != null) { if (settings != null) {
@ -204,6 +208,11 @@ final public class ParamModelChecker extends PrismComponent
constantValues.addValues(propertiesFile.getConstantValues()); constantValues.addValues(propertiesFile.getConstantValues());
} }
public ParamMode getMode()
{
return mode;
}
// Model checking functions // Model checking functions
/** /**
@ -220,7 +229,7 @@ final public class ParamModelChecker extends PrismComponent
constraintChecker = new ConstraintChecker(numRandomPoints); constraintChecker = new ConstraintChecker(numRandomPoints);
regionFactory = new BoxRegionFactory(functionFactory, constraintChecker, precision, regionFactory = new BoxRegionFactory(functionFactory, constraintChecker, precision,
model.getNumStates(), model.getFirstInitialState(), simplifyRegions, splitMethod); model.getNumStates(), model.getFirstInitialState(), simplifyRegions, splitMethod);
valueComputer = new ValueComputer(this, paramModel, regionFactory, precision, eliminationOrder, bisimType);
valueComputer = new ValueComputer(this, mode, paramModel, regionFactory, precision, eliminationOrder, bisimType);
long timer = 0; long timer = 0;
@ -247,7 +256,7 @@ final public class ParamModelChecker extends PrismComponent
// Store result // Store result
result = new Result(); result = new Result();
vals.clearExceptInit(); vals.clearExceptInit();
result.setResult(new ParamResult(vals, modelBuilder, functionFactory));
result.setResult(new ParamResult(mode, vals, modelBuilder, functionFactory));
/* // Output plot to tex file /* // Output plot to tex file
if (paramLower.length == 2) { if (paramLower.length == 2) {
@ -315,7 +324,7 @@ final public class ParamModelChecker extends PrismComponent
break; break;
default: default:
throw new PrismNotSupportedException("operator \"" + ExpressionBinaryOp.opSymbols[parserOp] throw new PrismNotSupportedException("operator \"" + ExpressionBinaryOp.opSymbols[parserOp]
+ "\" not currently supported for parametric analyses");
+ "\" not currently supported for " + mode + " analyses");
} }
return regionOp; return regionOp;
} }
@ -335,7 +344,7 @@ final public class ParamModelChecker extends PrismComponent
break; break;
default: default:
throw new PrismNotSupportedException("operator \"" + ExpressionBinaryOp.opSymbols[parserOp] throw new PrismNotSupportedException("operator \"" + ExpressionBinaryOp.opSymbols[parserOp]
+ "\" not currently supported for parametric analyses");
+ "\" not currently supported for " + mode + " analyses");
} }
return regionOp; return regionOp;
} }
@ -399,13 +408,13 @@ final public class ParamModelChecker extends PrismComponent
BigRational exprRat = new BigRational(exprStr); BigRational exprRat = new BigRational(exprStr);
stateValues.setStateValue(state, functionFactory.fromBigRational(exprRat)); stateValues.setStateValue(state, functionFactory.fromBigRational(exprRat));
} else { } else {
throw new PrismNotSupportedException("model checking expresssion " + expr + " not supported for parametric models");
throw new PrismNotSupportedException("model checking expresssion " + expr + " not supported for " + mode + " models");
} }
} else if (exprVar instanceof ExpressionConstant) { } else if (exprVar instanceof ExpressionConstant) {
ExpressionConstant exprConst = (ExpressionConstant) exprVar; ExpressionConstant exprConst = (ExpressionConstant) exprVar;
stateValues.setStateValue(state, functionFactory.getVar(exprConst.getName())); stateValues.setStateValue(state, functionFactory.getVar(exprConst.getName()));
} else { } else {
throw new PrismNotSupportedException("cannot handle expression " + expr + " in parametric analysis");
throw new PrismNotSupportedException("cannot handle expression " + expr + " in " + mode + " analysis");
} }
} else { } else {
if (exprVar.getType() instanceof TypeBool) { if (exprVar.getType() instanceof TypeBool) {
@ -548,7 +557,7 @@ final public class ParamModelChecker extends PrismComponent
case MAX: case MAX:
case ARGMIN: case ARGMIN:
case ARGMAX: case ARGMAX:
throw new PrismNotSupportedException("operation not implemented for parametric models");
throw new PrismNotSupportedException("operation not implemented for " + mode + " models");
case COUNT: case COUNT:
resVals = vals.op(Region.COUNT, bsFilter); resVals = vals.op(Region.COUNT, bsFilter);
break; break;
@ -565,7 +574,7 @@ final public class ParamModelChecker extends PrismComponent
resVals = vals.op(Region.FIRST, bsFilter); resVals = vals.op(Region.FIRST, bsFilter);
break; break;
case RANGE: case RANGE:
throw new PrismNotSupportedException("operation not implemented for parametric models");
throw new PrismNotSupportedException("operation not implemented for " + mode + " models");
case FORALL: case FORALL:
resVals = vals.op(Region.FORALL, bsFilter); resVals = vals.op(Region.FORALL, bsFilter);
break; break;
@ -873,7 +882,7 @@ final public class ParamModelChecker extends PrismComponent
// Compute probabilities // Compute probabilities
if (!expr.getExpression().isSimplePathFormula()) { if (!expr.getExpression().isSimplePathFormula()) {
throw new PrismNotSupportedException("Parametric engine does not yet handle LTL-style path formulas");
throw new PrismNotSupportedException(mode.Engine() + " does not yet handle LTL-style path formulas");
} }
probs = checkProbPathFormulaSimple(model, expr.getExpression(), min, needStates); probs = checkProbPathFormulaSimple(model, expr.getExpression(), min, needStates);
probs.clearNotNeeded(needStates); probs.clearNotNeeded(needStates);
@ -912,7 +921,7 @@ final public class ParamModelChecker extends PrismComponent
// Next // Next
if (exprTemp.getOperator() == ExpressionTemporal.P_X) { if (exprTemp.getOperator() == ExpressionTemporal.P_X) {
throw new PrismNotSupportedException("Next operator not supported by parametric engine");
throw new PrismNotSupportedException("Next operator not supported by " + mode + " engine");
} }
// Until // Until
else if (exprTemp.getOperator() == ExpressionTemporal.P_U) { else if (exprTemp.getOperator() == ExpressionTemporal.P_U) {
@ -948,11 +957,11 @@ final public class ParamModelChecker extends PrismComponent
//RegionValues probs; //RegionValues probs;
switch (modelType) { switch (modelType) {
case CTMC: case CTMC:
throw new PrismNotSupportedException("Bounded until operator not supported by parametric engine");
throw new PrismNotSupportedException("Bounded until operator not supported by " + mode + " engine");
case DTMC: case DTMC:
throw new PrismNotSupportedException("Bounded until operator not supported by parametric engine");
throw new PrismNotSupportedException("Bounded until operator not supported by " + mode + " engine");
case MDP: case MDP:
throw new PrismNotSupportedException("Bounded until operator not supported by parametric engine");
throw new PrismNotSupportedException("Bounded until operator not supported by " + mode + " engine");
default: default:
throw new PrismNotSupportedException("Cannot model check for a " + modelType); throw new PrismNotSupportedException("Cannot model check for a " + modelType);
} }
@ -1013,7 +1022,7 @@ final public class ParamModelChecker extends PrismComponent
rewards = checkRewardSteady(model, rew, exprTemp, min, needStates); rewards = checkRewardSteady(model, rew, exprTemp, min, needStates);
break; break;
default: default:
throw new PrismNotSupportedException("Parametric engine does not yet handle the " + exprTemp.getOperatorSymbol() + " operator in the R operator");
throw new PrismNotSupportedException(mode.Engine() + " does not yet handle the " + exprTemp.getOperatorSymbol() + " operator in the R operator");
} }
} else if (expr.getType() instanceof TypePathBool || expr.getType() instanceof TypeBool) { } else if (expr.getType() instanceof TypePathBool || expr.getType() instanceof TypeBool) {
rewards = checkRewardPathFormula(model, rew, expr, min, needStates); rewards = checkRewardPathFormula(model, rew, expr, min, needStates);
@ -1034,7 +1043,7 @@ final public class ParamModelChecker extends PrismComponent
if (Expression.isReach(expr)) { if (Expression.isReach(expr)) {
return checkRewardReach(model, rew, (ExpressionTemporal) expr, min, needStates); return checkRewardReach(model, rew, (ExpressionTemporal) expr, min, needStates);
} else if (Expression.isCoSafeLTLSyntactic(expr, true)) { } else if (Expression.isCoSafeLTLSyntactic(expr, true)) {
throw new PrismNotSupportedException("Parametric engine does not yet support co-safe reward computation");
throw new PrismNotSupportedException(mode.Engine() + " does not yet support co-safe reward computation");
} else { } else {
throw new PrismException("R operator contains a path formula that is not syntactically co-safe: " + expr); throw new PrismException("R operator contains a path formula that is not syntactically co-safe: " + expr);
} }
@ -1052,7 +1061,7 @@ final public class ParamModelChecker extends PrismComponent
private RegionValues checkRewardSteady(ParamModel model, private RegionValues checkRewardSteady(ParamModel model,
ParamRewardStruct rew, ExpressionTemporal expr, boolean min, BitSet needStates) throws PrismException { ParamRewardStruct rew, ExpressionTemporal expr, boolean min, BitSet needStates) throws PrismException {
if (model.getModelType() != ModelType.DTMC && model.getModelType() != ModelType.CTMC) { if (model.getModelType() != ModelType.DTMC && model.getModelType() != ModelType.CTMC) {
throw new PrismNotSupportedException("Parametric long-run average rewards are only supported for DTMCs and CTMCs");
throw new PrismNotSupportedException(mode.Engine() + " long-run average rewards are only supported for DTMCs and CTMCs");
} }
RegionValues allTrue = regionFactory.completeCover(true); RegionValues allTrue = regionFactory.completeCover(true);
BitSet needStatesInner = new BitSet(needStates.size()); BitSet needStatesInner = new BitSet(needStates.size());
@ -1158,7 +1167,7 @@ final public class ParamModelChecker extends PrismComponent
RegionValues b = checkExpression(model,expr, needStatesInner); RegionValues b = checkExpression(model,expr, needStatesInner);
if (model.getModelType() != ModelType.DTMC if (model.getModelType() != ModelType.DTMC
&& model.getModelType() != ModelType.CTMC) { && model.getModelType() != ModelType.CTMC) {
throw new PrismNotSupportedException("Parametric engine currently only implements steady state for DTMCs and CTMCs.");
throw new PrismNotSupportedException(mode.Engine() + " currently only implements steady state for DTMCs and CTMCs.");
} }
return valueComputer.computeSteadyState(b, min, null); return valueComputer.computeSteadyState(b, min, null);
} }

11
prism/src/param/ParamResult.java

@ -48,6 +48,8 @@ import prism.PrismNotSupportedException;
*/ */
public class ParamResult public class ParamResult
{ {
/** The computation mode (parametric / exact) */
private ParamMode mode;
/** The actual result */ /** The actual result */
private RegionValues regionValues; private RegionValues regionValues;
/** The model builder (for accessing expr2func) */ /** The model builder (for accessing expr2func) */
@ -61,8 +63,9 @@ public class ParamResult
* @param modelBuilder the model builder used during checking * @param modelBuilder the model builder used during checking
* @param factory the function factory used during checking * @param factory the function factory used during checking
*/ */
public ParamResult(RegionValues regionValues, ModelBuilder modelBuilder, FunctionFactory factory)
public ParamResult(ParamMode mode, RegionValues regionValues, ModelBuilder modelBuilder, FunctionFactory factory)
{ {
this.mode = mode;
this.regionValues = regionValues; this.regionValues = regionValues;
this.modelBuilder = modelBuilder; this.modelBuilder = modelBuilder;
this.factory = factory; this.factory = factory;
@ -98,7 +101,7 @@ public class ParamResult
public Object getSimpleResult(Type propertyType) throws PrismException public Object getSimpleResult(Type propertyType) throws PrismException
{ {
if (regionValues.getNumRegions() != 1) if (regionValues.getNumRegions() != 1)
throw new PrismException("Unexpected result from parametric model checker");
throw new PrismException("Unexpected result from " + mode + " model checker");
if (propertyType.equals(TypeBool.getInstance())) { if (propertyType.equals(TypeBool.getInstance())) {
// boolean result // boolean result
@ -163,7 +166,7 @@ public class ParamResult
private boolean test(Type propertyType, Expression expected, String strExpected) throws PrismException private boolean test(Type propertyType, Expression expected, String strExpected) throws PrismException
{ {
if (regionValues.getNumRegions() != 1) { if (regionValues.getNumRegions() != 1) {
throw new PrismNotSupportedException("Testing parametric results with multiple regions not supported");
throw new PrismNotSupportedException("Testing " + mode + " results with multiple regions not supported");
} }
if (propertyType.equals(TypeBool.getInstance())) { if (propertyType.equals(TypeBool.getInstance())) {
@ -180,7 +183,7 @@ public class ParamResult
try { try {
funcExpected = modelBuilder.expr2function(factory, expected); funcExpected = modelBuilder.expr2function(factory, expected);
} catch (PrismException e) { } catch (PrismException e) {
throw new PrismException("Invalid (or unsupported) RESULT specification \"" + strExpected + "\" for parametric property");
throw new PrismException("Invalid (or unsupported) RESULT specification \"" + strExpected + "\" for " + mode + " property");
} }
param.Function func = regionValues.getResult(0).getInitStateValueAsFunction(); param.Function func = regionValues.getResult(0).getInitStateValueAsFunction();

4
prism/src/param/ValueComputer.java

@ -226,6 +226,7 @@ final class ValueComputer extends PrismComponent
} }
} }
private ParamMode mode;
private ParamModel model; private ParamModel model;
private RegionFactory regionFactory; private RegionFactory regionFactory;
private FunctionFactory functionFactory; private FunctionFactory functionFactory;
@ -236,8 +237,9 @@ final class ValueComputer extends PrismComponent
private StateEliminator.EliminationOrder eliminationOrder; private StateEliminator.EliminationOrder eliminationOrder;
private Lumper.BisimType bisimType; private Lumper.BisimType bisimType;
ValueComputer(PrismComponent parent, ParamModel model, RegionFactory regionFactory, BigRational precision, StateEliminator.EliminationOrder eliminationOrder, Lumper.BisimType bisimType) {
ValueComputer(PrismComponent parent, ParamMode mode, ParamModel model, RegionFactory regionFactory, BigRational precision, StateEliminator.EliminationOrder eliminationOrder, Lumper.BisimType bisimType) {
super(parent); super(parent);
this.mode = mode;
this.model = model; this.model = model;
this.regionFactory = regionFactory; this.regionFactory = regionFactory;
this.functionFactory = regionFactory.getFunctionFactory(); this.functionFactory = regionFactory.getFunctionFactory();

8
prism/src/prism/Prism.java

@ -3159,9 +3159,9 @@ public class Prism extends PrismComponent implements PrismSettingsListener
String[] paramLowerBounds = new String[] { "0" }; String[] paramLowerBounds = new String[] { "0" };
String[] paramUpperBounds = new String[] { "1" }; String[] paramUpperBounds = new String[] { "1" };
// And execute parameteric model checking // And execute parameteric model checking
param.ModelBuilder builder = new ModelBuilder(this);
param.ModelBuilder builder = new ModelBuilder(this, param.ParamMode.EXACT);
ParamModel modelExpl = builder.constructModel(new ModulesFileModelGeneratorSymbolic(currentModulesFile, this), paramNames, paramLowerBounds, paramUpperBounds); ParamModel modelExpl = builder.constructModel(new ModulesFileModelGeneratorSymbolic(currentModulesFile, this), paramNames, paramLowerBounds, paramUpperBounds);
ParamModelChecker mc = new ParamModelChecker(this);
ParamModelChecker mc = new ParamModelChecker(this, param.ParamMode.EXACT);
mc.setModelBuilder(builder); mc.setModelBuilder(builder);
mc.setParameters(paramNames, paramLowerBounds, paramUpperBounds); mc.setParameters(paramNames, paramLowerBounds, paramUpperBounds);
mc.setModulesFileAndPropertiesFile(currentModulesFile, propertiesFile); mc.setModulesFileAndPropertiesFile(currentModulesFile, propertiesFile);
@ -3233,9 +3233,9 @@ public class Prism extends PrismComponent implements PrismSettingsListener
if (definedPFConstants != null && definedPFConstants.getNumValues() > 0) if (definedPFConstants != null && definedPFConstants.getNumValues() > 0)
mainLog.println("Property constants: " + definedPFConstants); mainLog.println("Property constants: " + definedPFConstants);
param.ModelBuilder builder = new ModelBuilder(this);
param.ModelBuilder builder = new ModelBuilder(this, param.ParamMode.PARAMETRIC);
ParamModel modelExpl = builder.constructModel(new ModulesFileModelGeneratorSymbolic(currentModulesFile, this), paramNames, paramLowerBounds, paramUpperBounds); ParamModel modelExpl = builder.constructModel(new ModulesFileModelGeneratorSymbolic(currentModulesFile, this), paramNames, paramLowerBounds, paramUpperBounds);
ParamModelChecker mc = new ParamModelChecker(this);
ParamModelChecker mc = new ParamModelChecker(this, param.ParamMode.PARAMETRIC);
mc.setModelBuilder(builder); mc.setModelBuilder(builder);
mc.setParameters(paramNames, paramLowerBounds, paramUpperBounds); mc.setParameters(paramNames, paramLowerBounds, paramUpperBounds);
mc.setModulesFileAndPropertiesFile(currentModulesFile, propertiesFile); mc.setModulesFileAndPropertiesFile(currentModulesFile, propertiesFile);

Loading…
Cancel
Save