Skip to content

Commit

Permalink
- improved optimization
Browse files Browse the repository at this point in the history
 - evaluation derivations 


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@21184 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Vitalij Ruge committed Jun 18, 2014
1 parent 1201744 commit 3a23460
Show file tree
Hide file tree
Showing 13 changed files with 337 additions and 386 deletions.
21 changes: 14 additions & 7 deletions Compiler/BackEnd/BackendDAEOptimize.mo
Expand Up @@ -3135,9 +3135,9 @@ algorithm
case (backendDAE, true,_) // created linear model (matrixes) for optimization
equation
// A := der(x)
// B := L(x)
// C := M(x)
// D := {der(x), con(x)}
// B := {der(x), con(x), L(x)}
// C := {der(x), con(x), L(x), M(x)}
// D := {}

backendDAE2 = BackendDAEUtil.copyBackendDAE(backendDAE);
backendDAE2 = collapseIndependentBlocks(backendDAE2);
Expand Down Expand Up @@ -3177,24 +3177,31 @@ algorithm
Debug.fcall(Flags.JAC_DUMP2, print, "analytical Jacobians -> generated system for matrix A time: " +& realString(clock()) +& "\n");

// Differentiate the System w.r.t states&inputs for matrices B

optimizer_vars = BackendVariable.mergeVariables(statesarr, conVars);
object = checkObjectIsSet(outputvarsarr,"$TMP_lagrangeTerm");
(linearModelMatrix, sparsePattern, sparseColoring, funcs) = createJacobian(backendDAE2,states_inputs,statesarr,inputvarsarr,paramvarsarr,object,varlst,"B");
optimizer_vars = BackendVariable.mergeVariables(optimizer_vars, object);
//BackendDump.printVariables(optimizer_vars);
(linearModelMatrix, sparsePattern, sparseColoring, funcs) = createJacobian(backendDAE2,states_inputs,statesarr,inputvarsarr,paramvarsarr,optimizer_vars,varlst,"B");
functionTree = DAEUtil.joinAvlTrees(functionTree, funcs);
backendDAE2 = BackendDAEUtil.addBackendDAEFunctionTree(functionTree, backendDAE2);
linearModelMatrices = listAppend(linearModelMatrices,{(SOME(linearModelMatrix),sparsePattern,sparseColoring)});
Debug.fcall(Flags.JAC_DUMP2, print, "analytical Jacobians -> generated system for matrix B time: " +& realString(clock()) +& "\n");

// Differentiate the System w.r.t states for matrices C
object = checkObjectIsSet(outputvarsarr,"$TMP_mayerTerm");
(linearModelMatrix, sparsePattern, sparseColoring, funcs) = createJacobian(backendDAE2,states_inputs,statesarr,inputvarsarr,paramvarsarr,object,varlst,"C");
optimizer_vars = BackendVariable.mergeVariables(optimizer_vars, object);
//BackendDump.printVariables(optimizer_vars);
(linearModelMatrix, sparsePattern, sparseColoring, funcs) = createJacobian(backendDAE2,states_inputs,statesarr,inputvarsarr,paramvarsarr,optimizer_vars,varlst,"C");
functionTree = DAEUtil.joinAvlTrees(functionTree, funcs);
backendDAE2 = BackendDAEUtil.addBackendDAEFunctionTree(functionTree, backendDAE2);
linearModelMatrices = listAppend(linearModelMatrices,{(SOME(linearModelMatrix),sparsePattern,sparseColoring)});
Debug.fcall(Flags.JAC_DUMP2, print, "analytical Jacobians -> generated system for matrix C time: " +& realString(clock()) +& "\n");

// Differentiate the System w.r.t inputs for matrices D
optimizer_vars = BackendVariable.mergeVariables(statesarr, conVars);
(linearModelMatrix, sparsePattern, sparseColoring, funcs) = createJacobian(backendDAE2, states_inputs, statesarr, inputvarsarr, paramvarsarr, optimizer_vars, varlst, "D");
optimizer_vars = BackendVariable.emptyVars();

(linearModelMatrix, sparsePattern, sparseColoring, funcs) = createJacobian(backendDAE2, {}, statesarr, inputvarsarr, paramvarsarr, optimizer_vars, varlst, "D");
functionTree = DAEUtil.joinAvlTrees(functionTree, funcs);
linearModelMatrices = listAppend(linearModelMatrices,{(SOME(linearModelMatrix),sparsePattern,sparseColoring)});
Debug.fcall(Flags.JAC_DUMP2, print, "analytical Jacobians -> generated system for matrix D time: " +& realString(clock()) +& "\n");
Expand Down
4 changes: 0 additions & 4 deletions Compiler/BackEnd/BackendEquation.mo
Expand Up @@ -2298,10 +2298,6 @@ algorithm
dummyVar = BackendDAE.VAR(lhs, BackendDAE.OPT_CONSTR(), DAE.OUTPUT(), DAE.NON_PARALLEL(), DAE.T_REAL_DEFAULT, NONE(), NONE(), {}, DAE.emptyElementSource, NONE(), NONE(), DAE.NON_CONNECTOR());
(rhs, _) = ExpressionSimplify.simplify(DAE.BINARY(e2,DAE.SUB(DAE.T_REAL_DEFAULT),e1));
then ({BackendDAE.SOLVED_EQUATION(lhs, rhs,Source,false,BackendDAE.UNKNOWN_EQUATION_KIND())},dummyVar);
else equation
lhs = ComponentReference.makeCrefIdent("$TMP_eq_con" +& intString(inI), DAE.T_REAL_DEFAULT, {});
dummyVar = BackendDAE.VAR(lhs, BackendDAE.OPT_CONSTR(), DAE.OUTPUT(), DAE.NON_PARALLEL(), DAE.T_REAL_DEFAULT, NONE(), NONE(), {}, DAE.emptyElementSource, NONE(), NONE(), DAE.NON_CONNECTOR());
then ({},dummyVar);
end match;
end generateResidualfromRealtion;

Expand Down
26 changes: 14 additions & 12 deletions Compiler/Template/CodegenC.tpl
Expand Up @@ -18,7 +18,7 @@
//
// - A line like this
// ..., Text var /*BUFP*/, ...
// declares that a template takes a text buffer as input parameter. In the
// declares that a template takes a tmext buffer as input parameter. In the
// new version of Susan it should be written like this instead:
// ..., Text &var, ...
//
Expand Down Expand Up @@ -521,8 +521,8 @@ template simulationFile_opt_header(SimCode simCode, String guid)
#if defined(__cplusplus)
extern "C" {
#endif
int <%symbolName(modelNamePrefixStr,"mayer")%>(DATA* data, modelica_real** res);
int <%symbolName(modelNamePrefixStr,"lagrange")%>(DATA* data, modelica_real** res);
int <%symbolName(modelNamePrefixStr,"mayer")%>(DATA* data, modelica_real** res, short*);
int <%symbolName(modelNamePrefixStr,"lagrange")%>(DATA* data, modelica_real** res, short *, short *);
int <%symbolName(modelNamePrefixStr,"pickUpBoundsForInputsInOptimization")%>(DATA* data, modelica_real* min, modelica_real* max, modelica_real*nominal, modelica_boolean *useNominal, char ** name, modelica_real * start, modelica_real * startTimeOpt);
#if defined(__cplusplus)
}
Expand Down Expand Up @@ -648,8 +648,8 @@ template simulationFile(SimCode simCode, String guid)
extern int <%symbolName(modelNamePrefixStr,"functionJacC_column")%>(void* data);
extern int <%symbolName(modelNamePrefixStr,"functionJacD_column")%>(void* data);
extern const char* <%symbolName(modelNamePrefixStr,"linear_model_frame")%>(void);
extern int <%symbolName(modelNamePrefixStr,"mayer")%>(DATA* data, modelica_real** res);
extern int <%symbolName(modelNamePrefixStr,"lagrange")%>(DATA* data, modelica_real** res);
extern int <%symbolName(modelNamePrefixStr,"mayer")%>(DATA* data, modelica_real** res, short *);
extern int <%symbolName(modelNamePrefixStr,"lagrange")%>(DATA* data, modelica_real** res, short *, short *);
extern int <%symbolName(modelNamePrefixStr,"pickUpBoundsForInputsInOptimization")%>(DATA* data, modelica_real* min, modelica_real* max, modelica_real*nominal, modelica_boolean *useNominal, char ** name, modelica_real * start, modelica_real * startTimeOpt);
struct OpenModelicaGeneratedFunctionCallbacks <%symbolName(modelNamePrefixStr,"callback")%> = {
Expand Down Expand Up @@ -10582,8 +10582,8 @@ template optimizationComponents( list<DAE.ClassAttributes> classAttributes ,SimC
match classAttributes
case{} then
<<
int <%symbolName(modelNamePrefixStr,"mayer")%>(DATA* data, modelica_real** res){return -1;}
int <%symbolName(modelNamePrefixStr,"lagrange")%>(DATA* data, modelica_real** res){return -1;}
int <%symbolName(modelNamePrefixStr,"mayer")%>(DATA* data, modelica_real** res,short *i){return -1;}
int <%symbolName(modelNamePrefixStr,"lagrange")%>(DATA* data, modelica_real** res, short * i1, short*i2){return -1;}
int <%symbolName(modelNamePrefixStr,"pickUpBoundsForInputsInOptimization")%>(DATA* data, modelica_real* min, modelica_real* max, modelica_real*nominal, modelica_boolean *useNominal, char ** name, modelica_real * start, modelica_real * startTimeOpt){return -1;}
>>
else
Expand All @@ -10604,6 +10604,7 @@ template optimizationComponents1(ClassAttributes classAttribute, SimCode simCode
case SOME(exp) then
<<
*res = &$P$TMP_mayerTerm;
*index_Dres = $P$TMP_mayerTerm$pDERC$indexdiffed;
return 0;
>>
let startTimeOpt = match startTimeE
Expand All @@ -10616,6 +10617,8 @@ template optimizationComponents1(ClassAttributes classAttribute, SimCode simCode
let objectiveIntegrand = match objectiveIntegrandE case SOME(exp) then
<<
*res = &$P$TMP_lagrangeTerm;
*index_DresB = $P$TMP_lagrangeTerm$pDERB$indexdiffed;
*index_DresC = $P$TMP_lagrangeTerm$pDERC$indexdiffed;
return 0;
>>
let inputBounds = match simCode
Expand All @@ -10624,13 +10627,12 @@ template optimizationComponents1(ClassAttributes classAttribute, SimCode simCode
case MODELINFO(vars=SIMVARS(__)) then
<<
<%vars.inputVars |> SIMVAR(__) hasindex i0 =>
'min[<%i0%>] = $P$ATTRIBUTE<%cref(name)%>.min;<%\n%>max[<%i0%>] = $P$ATTRIBUTE<%cref(name)%>.max;<%\n%>nominal[<%i0%>] = $P$ATTRIBUTE<%cref(name)%>.nominal;<%\n%>useNominal[<%i0%>] = $P$ATTRIBUTE<%cref(name)%>.useNominal;<%\n%>name[<%i0%>] = <%cref(name)%>__varInfo.name;<%\n%>start[<%i0%>] = $P$ATTRIBUTE<%cref(name)%>.start;'
'min[<%i0%>] = $P$ATTRIBUTE<%cref(name)%>.min;<%\n%>max[<%i0%>] = $P$ATTRIBUTE<%cref(name)%>.max;<%\n%>nominal[<%i0%>] = $P$ATTRIBUTE<%cref(name)%>.nominal;<%\n%>useNominal[<%i0%>] = $P$ATTRIBUTE<%cref(name)%>.useNominal;<%\n%>name[<%i0%>] =(char *) <%cref(name)%>__varInfo.name;<%\n%>start[<%i0%>] = $P$ATTRIBUTE<%cref(name)%>.start;'
;separator="\n"%>
>>
<<
/* objectiveFunction */

int <%symbolName(modelNamePrefixStr,"mayer")%>(DATA* data, modelica_real** res)
/* objectiveFunction */
int <%symbolName(modelNamePrefixStr,"mayer")%>(DATA* data, modelica_real** res, short * index_Dres)
{
<%varDecls%>
<%preExp%>
Expand All @@ -10639,7 +10641,7 @@ template optimizationComponents1(ClassAttributes classAttribute, SimCode simCode
}

/* objectiveIntegrand */
int <%symbolName(modelNamePrefixStr,"lagrange")%>(DATA* data, modelica_real** res)
int <%symbolName(modelNamePrefixStr,"lagrange")%>(DATA* data, modelica_real** res, short * index_DresB, short *index_DresC)
{
<%varDecls1%>
<%preExp1%>
Expand Down
4 changes: 2 additions & 2 deletions SimulationRuntime/c/openmodelica_func.h
Expand Up @@ -262,14 +262,14 @@ const char *(*linear_model_frame)(void); /* printf format-string with holes for
* and calculates the mayer term. In case it's not present
* a dummy function is added which return -1.
*/
int (*mayer)(DATA* data, modelica_real** res);
int (*mayer)(DATA* data, modelica_real** res, short *);

/*
* This function is used only for optimization purpose
* and calculates the lagrange term. In case it's not present
* a dummy function is added which return -1.
*/
int (*lagrange)(DATA* data, modelica_real** res);
int (*lagrange)(DATA* data, modelica_real** res, short *, short *);

/*
* This function is used only for optimization purpose
Expand Down

0 comments on commit 3a23460

Please sign in to comment.