Skip to content

Commit

Permalink
make create dynamic optimization problem as modul
Browse files Browse the repository at this point in the history
  • Loading branch information
vruge authored and OpenModelica-Hudson committed Jun 6, 2016
1 parent 43294bc commit 63527ec
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 37 deletions.
1 change: 0 additions & 1 deletion Compiler/BackEnd/BackendDAECreate.mo
Expand Up @@ -133,7 +133,6 @@ algorithm
// handle alias equations
(vars, globalKnownVars, extVars, aliasVars, eqns, reqns, ieqns) := handleAliasEquations(aliaseqns, vars, globalKnownVars, extVars, aliasVars, eqns, reqns, ieqns);
vars_1 := detectImplicitDiscrete(vars, globalKnownVars, eqns);
(vars_1, eqns, clsAttrs) := DynamicOptimization.addOptimizationVarsEqns(vars_1, eqns, Config.acceptOptimicaGrammar(), clsAttrs, constrs, globalKnownVars,Flags.getConfigBool(Flags.GENERATE_DYN_OPTIMIZATION_PROBLEM));
eqnarr := BackendEquation.listEquation(eqns);
reqnarr := BackendEquation.listEquation(reqns);
ieqnarr := BackendEquation.listEquation(ieqns);
Expand Down
6 changes: 5 additions & 1 deletion Compiler/BackEnd/BackendDAEUtil.mo
Expand Up @@ -7276,6 +7276,7 @@ protected function allPreOptimizationModules
"This list contains all back end pre-optimization modules."
output list<tuple<BackendDAEFunc.optimizationModule, String>> allPreOptimizationModules = {
(UnitCheck.unitChecking, "unitChecking"),
(DynamicOptimization.createDynamicOptimization,"createDynamicOptimization"),
(BackendInline.normalInlineFunction, "normalInlineFunction"),
(EvaluateParameter.evaluateAllParameters, "evaluateAllParameters"),
(EvaluateParameter.evaluateReplaceProtectedFinalEvaluateParameters, "evaluateReplaceProtectedFinalEvaluateParameters"),
Expand Down Expand Up @@ -7422,12 +7423,14 @@ algorithm

if Flags.getConfigBool(Flags.DEFAULT_OPT_MODULES_ORDERING) then
// handle special flags, which enable modules

enabledModules := deprecatedDebugFlag(Flags.SORT_EQNS_AND_VARS, enabledModules, "sortEqnsVars", "preOptModules+");
enabledModules := deprecatedDebugFlag(Flags.RESOLVE_LOOPS, enabledModules, "resolveLoops", "preOptModules+");
enabledModules := deprecatedDebugFlag(Flags.EVAL_ALL_PARAMS, enabledModules, "evaluateAllParameters", "preOptModules+");
enabledModules := deprecatedDebugFlag(Flags.ADD_DER_ALIASES, enabledModules, "introduceDerAlias", "preOptModules+");
if Config.acceptOptimicaGrammar() or Flags.getConfigBool(Flags.GENERATE_DYN_OPTIMIZATION_PROBLEM) then
enabledModules := "inputDerivativesForDynOpt"::enabledModules;
enabledModules := "createDynamicOptimization"::enabledModules;
end if;

// handle special flags, which disable modules
Expand All @@ -7438,6 +7441,7 @@ algorithm
disabledModules := "removeSimpleEquations"::disabledModules;
end if;


if not Flags.isSet(Flags.EVALUATE_CONST_FUNCTIONS) then
disabledModules := "evalFunc"::disabledModules;
Error.addCompilerWarning("Deprecated debug flag --d=evalConstFuncs=false detected. Use --preOptModules-=evalFunc instead.");
Expand Down Expand Up @@ -7497,7 +7501,7 @@ algorithm
Error.addCompilerWarning("Deprecated flag --disableLinearTearing detected. Use --maxSizeLinearTearing=0 instead.");
end if;

if Flags.getConfigBool(Flags.GENERATE_SYMBOLIC_LINEARIZATION) then
if Flags.getConfigBool(Flags.GENERATE_SYMBOLIC_LINEARIZATION) or Config.acceptOptimicaGrammar() or Flags.getConfigBool(Flags.GENERATE_DYN_OPTIMIZATION_PROBLEM) then
enabledModules := "generateSymbolicLinearization"::enabledModules;
end if;

Expand Down
107 changes: 72 additions & 35 deletions Compiler/BackEnd/DynamicOptimization.mo
Expand Up @@ -59,61 +59,98 @@ protected import ExpressionSimplify;
protected import Flags;
protected import List;

public function addOptimizationVarsEqns

public function createDynamicOptimization
input output BackendDAE.BackendDAE dae;
protected
BackendDAE.Variables vars;
BackendDAE.EqSystem syst;
BackendDAE.EquationArray eqns;
BackendDAE.Shared shared;
algorithm
shared := dae.shared;
{syst} := dae.eqs;
BackendDAE.EQSYSTEM(orderedVars=vars, orderedEqs=eqns) := syst;
(vars, eqns, shared) := addOptimizationVarsEqns(vars, eqns, shared);
syst.orderedVars := vars;
syst.orderedEqs := eqns;
dae.eqs := {syst};
dae.shared := shared;
end createDynamicOptimization;

protected function addOptimizationVarsEqns
"author: Vitalij Ruge
add objective function and constraints to DAE. Neeed for derivatives"
input BackendDAE.Variables inVars;
input list<BackendDAE.Equation> inEqns;
input Boolean inOptimicaFlag;
input list< .DAE.ClassAttributes> inClassAttr;
input list< .DAE.Constraint> inConstraint;
input BackendDAE.Variables globalKnownVars;
input Boolean inDynOptimization;
output BackendDAE.Variables outVars;
output list<BackendDAE.Equation> outEqns;
output list< .DAE.ClassAttributes> outClassAttr;
input output BackendDAE.Variables vars;
input output BackendDAE.EquationArray eqns;
input output BackendDAE.Shared shared;
protected
Option<DAE.Exp> mayer, lagrange, startTimeE, finalTimeE;
BackendDAE.Variables v, inVarsAndglobalKnownVars;
list<BackendDAE.Var> varlst;
BackendDAE.Var tG;
list<BackendDAE.Equation> e;
algorithm

if (not inOptimicaFlag and not inDynOptimization) or Flags.getConfigString(Flags.SIMCODE_TARGET) == "XML" then //no optimization
outVars := inVars;
outEqns := inEqns;
outClassAttr := inClassAttr;
Flags.setConfigBool(Flags.GENERATE_DYN_OPTIMIZATION_PROBLEM, false);
else
list<BackendDAE.Equation> eqnsLst;

if not inOptimicaFlag then
Flags.setConfigEnum(Flags.GRAMMAR, Flags.OPTIMICA);
list< .DAE.ClassAttributes> classAttrs;
list< .DAE.Constraint> constraints;
BackendDAE.Variables globalKnownVars;
Boolean inOptimicaFlag = Config.acceptOptimicaGrammar();
Boolean inDynOptimization = Flags.getConfigBool(Flags.GENERATE_DYN_OPTIMIZATION_PROBLEM);
constant Boolean debug = false;
algorithm
classAttrs := shared.classAttrs;
constraints := shared.constraints;
globalKnownVars := shared.globalKnownVars;
eqnsLst := {};

if not(inOptimicaFlag or inDynOptimization)
then
print("Something going wrong for postOptModul=createDynamicOptimization. Check your flags. You need +g=DynOpt or +g=Optimica!\n");
fail();
end if;
Flags.setConfigEnum(Flags.GRAMMAR, Flags.OPTIMICA);

//Flags.setConfigString(Flags.INDEX_REDUCTION_METHOD, "dummyDerivatives");

(mayer,lagrange,startTimeE,finalTimeE) := match(inClassAttr)
local Option<DAE.Exp> mayer_, lagrange_, startTimeE_, finalTimeE_;
case({DAE.OPTIMIZATION_ATTRS(objetiveE=mayer_, objectiveIntegrandE=lagrange_,startTimeE=startTimeE_,finalTimeE=finalTimeE_)}) then(mayer_,lagrange_,startTimeE_,finalTimeE_);
else (NONE(), NONE(),NONE(),NONE());
end match;

(mayer,lagrange,startTimeE,finalTimeE) := getOptimicaArgs(classAttrs);

_ := addTimeGrid(BackendVariable.varList(globalKnownVars), globalKnownVars);
inVarsAndglobalKnownVars := BackendVariable.addVariables(inVars, BackendVariable.copyVariables(globalKnownVars));
inVarsAndglobalKnownVars := BackendVariable.addVariables(vars, BackendVariable.copyVariables(globalKnownVars));
varlst := BackendVariable.varList(inVarsAndglobalKnownVars);
(v, e, mayer) := joinObjectFun(makeObject(BackendDAE.optimizationMayerTermName, findMayerTerm, varlst, mayer), inVars, inEqns);
(v, e, lagrange) := joinObjectFun(makeObject(BackendDAE.optimizationLagrangeTermName, findLagrangeTerm, varlst, lagrange), v, e);
(v, e) := joinConstraints(inConstraint, "$con$", BackendDAE.OPT_CONSTR(), globalKnownVars, varlst ,v, e, BackendVariable.hasConTermAnno);
(outVars, outEqns) := joinConstraints({}, "$finalCon$", BackendDAE.OPT_FCONSTR(), globalKnownVars, varlst, v, e, BackendVariable.hasFinalConTermAnno);

(vars, eqnsLst, mayer) := joinObjectFun(makeObject(BackendDAE.optimizationMayerTermName, findMayerTerm, varlst, mayer), vars, eqnsLst);
(vars, eqnsLst, lagrange) := joinObjectFun(makeObject(BackendDAE.optimizationLagrangeTermName, findLagrangeTerm, varlst, lagrange), vars, eqnsLst);

(vars, eqnsLst) := joinConstraints(constraints, "$con$", BackendDAE.OPT_CONSTR(), globalKnownVars, varlst, vars, eqnsLst, BackendVariable.hasConTermAnno);
(vars, eqnsLst) := joinConstraints({}, "$finalCon$", BackendDAE.OPT_FCONSTR(), globalKnownVars, varlst, vars, eqnsLst, BackendVariable.hasFinalConTermAnno);

// don't work....
Flags.setConfigBool(Flags.GENERATE_SYMBOLIC_LINEARIZATION, true);

outClassAttr := {DAE.OPTIMIZATION_ATTRS(mayer, lagrange, startTimeE, finalTimeE)};
end if;
shared.classAttrs := {DAE.OPTIMIZATION_ATTRS(mayer, lagrange, startTimeE, finalTimeE)};
if debug then
print("\neqs");
BackendDump.printEquationList(eqnsLst);
end if;
eqns := BackendEquation.addEquations(eqnsLst, eqns);

end addOptimizationVarsEqns;

protected function getOptimicaArgs
input list< .DAE.ClassAttributes> inClassAttr;
output Option<DAE.Exp> mayer,lagrange,startTimeE,finalTimeE;
algorithm
(mayer,lagrange,startTimeE,finalTimeE) :=
match(inClassAttr)
local Option<DAE.Exp> mayer_, lagrange_, startTimeE_, finalTimeE_;

case({DAE.OPTIMIZATION_ATTRS(objetiveE=mayer_, objectiveIntegrandE=lagrange_,startTimeE=startTimeE_,finalTimeE=finalTimeE_)})
then(mayer_,lagrange_,startTimeE_,finalTimeE_);

else (NONE(), NONE(),NONE(),NONE());
end match;
end getOptimicaArgs;


protected function addTimeGrid
input list<BackendDAE.Var> varlst;
Expand Down

0 comments on commit 63527ec

Please sign in to comment.