Skip to content
This repository was archived by the owner on May 18, 2019. It is now read-only.

Commit 8a2def5

Browse files
arun3688OpenModelica-Hudson
authored andcommitted
fix csv file inputs and LOG_STATS for dataReconciliation
Belonging to [master]: - OpenModelica/OpenModelica#128 - #3039
1 parent 0a7961e commit 8a2def5

File tree

3 files changed

+363
-69
lines changed

3 files changed

+363
-69
lines changed

Compiler/BackEnd/Uncertainties.mo

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -349,10 +349,10 @@ algorithm
349349
SimCode.JacobianMatrix jacmatrix;
350350
list<SimCodeVar.SimVar> simcodevars;
351351
list<tuple<Integer,list<Integer>>> var_dependencytree,eq_dependencytree;
352-
BackendDAE.Variables outDiffVars,outResidualVars,outOtherVars;
352+
BackendDAE.Variables outDiffVars,outResidualVars,outOtherVars,tmpdatavars;
353353
BackendDAE.EquationArray outResidualEqns,outOtherEqns;
354354
list<BackendDAE.InnerEquation> sets_inner_equations;
355-
355+
String str;
356356
case(dae)
357357
equation
358358
BackendDAE.DAE(currentSystem::eqsyslist,shared) = dae;
@@ -430,15 +430,14 @@ algorithm
430430

431431
BackendDump.dumpEquationList(setC_eq,"SET_C");
432432
BackendDump.dumpEquationList(setS_eq,"SET_S");
433-
434-
VerifyDataReconciliation(tempsetC,tempsetS,knowns,unknowns,mExt,var,constantvars,approximatedEquations,allVars,allEqs);
435-
433+
VerifyDataReconciliation(tempsetC,tempsetS,knowns,unknowns,mExt,var,constantvars,approximatedEquations,allVars,allEqs,mapIncRowEqn);
436434
//outDae = BackendDAE.DAE({currentSystem}, shared);
437435

438436
/* Prepare Torn systems for Jacobians */
439437
//create the Set-S equation to BackendDae innerequation structure
440-
sets_inner_equations=createInnerEquations(tempsetS,var);
441-
(outDiffVars,outResidualVars,outOtherVars,outResidualEqns,outOtherEqns)=SymbolicJacobian.prepareTornStrongComponentData(allVars,allEqs,listReverse(knowns),tempsetC,sets_inner_equations,shared.functionTree);
438+
sets_inner_equations=createInnerEquations(tempsetS,var,setS);
439+
//sets_inner_equations={BackendDAE.INNEREQUATION(eqn = 56, vars = {48}), BackendDAE.INNEREQUATION(eqn = 3, vars = {70}), BackendDAE.INNEREQUATION(eqn = 6, vars = {77}),BackendDAE.INNEREQUATION(eqn = 23, vars = {55}), BackendDAE.INNEREQUATION(eqn = 20, vars = {42}), BackendDAE.INNEREQUATION(eqn = 50, vars = {20})};
440+
(outDiffVars,outResidualVars,outOtherVars,outResidualEqns,outOtherEqns)=SymbolicJacobian.prepareTornStrongComponentData(allVars,allEqs,listReverse(knowns),setC,sets_inner_equations,shared.functionTree);
442441
// Dump the torn systems
443442
/*
444443
BackendDump.dumpVariables(outDiffVars,"Jacobian_knownVariables");
@@ -452,33 +451,59 @@ algorithm
452451
setcVars=BackendVariable.listVar(List.map1r(getRemovedEquationSolvedVariables(tempsetC,var),BackendVariable.getVarAt,allVars));
453452
shared.dataReconciliationData = SOME(BackendDAE.DATA_RECON(symbolicJacobian=simcodejacobian,setcVars=outResidualVars));
454453
//BackendDump.dumpVariables(setcVars,"SET_C_SOLVEDVARS");
454+
455455
// Prepare the final DAE System with Set-c equations as residual equations
456456
currentSystem=BackendDAEUtil.setEqSystVars(currentSystem,BackendVariable.mergeVariables(outResidualVars, outOtherVars));
457457
currentSystem=BackendDAEUtil.setEqSystEqs(currentSystem,BackendEquation.merge(outResidualEqns,outOtherEqns));
458+
458459
// set the variables of interest as INPUTS
459460
tempvar=BackendVariable.varList(outDiffVars);
460461
tempvar1= List.map1r(inputvarlist,BackendVariable.getVarAt,allVars);
461462
tmpglobalKnownVars=BackendVariable.listVar(List.map1(listAppend(tempvar,tempvar1),BackendVariable.setVarDirection,DAE.INPUT()));
462463
shared = BackendDAEUtil.setSharedGlobalKnownVars(shared,BackendVariable.mergeVariables(globalKnownVars, tmpglobalKnownVars));
463-
//BackendDump.dumpVariables(tmpglobalKnownVars,"input_vars");
464+
//BackendDump.dumpVariables(tmpglobalKnownVars,"inputvars");
465+
466+
// write the variables to the csv file
467+
str = "Variable Names,Measured Value-x,HalfWidthConfidenceInterval,xi,xk,rx_ik\n";
468+
str = dumpToCsv(str,tempvar);
469+
System.writeFile(modelname+"_Inputs.csv", str);
464470
outDae=BackendDAE.DAE({currentSystem}, shared);
465471
then
466472
outDae;
467473
case(_) then inDae;
468474
end match;
469475
end dataReconciliation;
470476

477+
/* function which dumps the variable names to csv file */
478+
public function dumpToCsv
479+
input String instring;
480+
input list<BackendDAE.Var> invar;
481+
output String outstring="";
482+
protected
483+
DAE.ComponentRef cr;
484+
algorithm
485+
for i in invar loop
486+
cr:= BackendVariable.varCref(i);
487+
outstring:= outstring + ComponentReference.crefStr(cr) +"\n";
488+
end for;
489+
outstring:=instring+outstring;
490+
end dumpToCsv;
491+
471492
/* creates list of equations from SET-S needed for jacobian calculation */
472493
public function createInnerEquations
473-
input list<Integer> sets;
494+
input list<Integer> tempsets;
474495
input list<tuple<Integer,Integer>> solvedeqvar;
496+
input list<Integer> sets;
475497
output BackendDAE.InnerEquations outequations={};
476498
protected
477499
Integer eqnumber,varnumber;
500+
Integer count=1;
478501
algorithm
479-
for i in sets loop
502+
for i in tempsets loop
480503
(eqnumber,varnumber):=getSolvedVariableNumber(i,solvedeqvar);
481-
outequations:=BackendDAE.INNEREQUATION(eqnumber,{varnumber})::outequations;
504+
// map the tempsets with setS, to get the correct equation index for example (26/37) in ordered equation list
505+
outequations:=BackendDAE.INNEREQUATION(listGet(sets, count),{varnumber})::outequations;
506+
count:=count+1;
482507
end for;
483508
outequations:=listReverse(outequations);
484509
end createInnerEquations;
@@ -491,6 +516,7 @@ public function dumpDependencyTree
491516
input list<Integer> constantvars;
492517
input BackendDAE.Variables allVars;
493518
input BackendDAE.EquationArray allEqs;
519+
input array<Integer> mapIncRowEqn;
494520
protected
495521
Integer varnumber,count=1;
496522
list<Integer> eqs,varlist;
@@ -503,7 +529,7 @@ algorithm
503529
(varnumber,varlist):=i;
504530
(_,eqs):=listGet(ineqtree,count);
505531
var:=List.map1r({varnumber},BackendVariable.getVarAt,allVars);
506-
depeqs:=List.map1r(eqs, BackendEquation.get, allEqs);
532+
depeqs:=List.map1r(List.map1r(eqs, listGet, arrayList(mapIncRowEqn)), BackendEquation.get, allEqs);
507533
(kn1,kn2,kn3):=List.intersection1OnTrue(varlist,listAppend(knowns,constantvars),intEq);
508534
//(c1,c2,c3):=List.intersection1OnTrue(varlist,constantvars,intEq);
509535

@@ -599,6 +625,7 @@ public function VerifyDataReconciliation
599625
input list<Integer> approximatedEquations;
600626
input BackendDAE.Variables allVars;
601627
input BackendDAE.EquationArray allEqs;
628+
input array<Integer> mapIncRowEqn;
602629
protected
603630
list<Integer> matchedeq,matchedknownssetc,matchedunknownssetc,matchedknownssets,matchedunknownssets;
604631
list<Integer> tmpunknowns,tmpknowns,tmplist1,tmplist2,tmplist3,tmplist1sets,setstmp;
@@ -698,14 +725,14 @@ algorithm
698725
(tmplist1,tmplist2,tmplist3):=List.intersection1OnTrue(sets_eqs,sets,intEq);
699726
if(listEmpty(tmplist2)) then
700727
BackendDump.dumpVarList(List.map1r(matchedunknownssetc,BackendVariable.getVarAt,allVars),"-SET_C has intermediate variables:" +dumplistInteger(matchedunknownssetc));
701-
BackendDump.dumpEquationList(List.map1r(sets_eqs, BackendEquation.get, allEqs),"-SET_S has equations which can compute above intermediate variable");
728+
BackendDump.dumpEquationList(List.map1r(List.map1r(sets_eqs, listGet, arrayList(mapIncRowEqn)), BackendEquation.get, allEqs),"-SET_S has equations which can compute above intermediate variable");
702729
else
703730
BackendDump.dumpVarList(List.map1r(tmplistvar2,BackendVariable.getVarAt,allVars),"SET_S cannot compute intermediate variables :" +dumplistInteger(tmplistvar2));
704731
Error.addMessage(Error.INTERNAL_ERROR, {": Condition 5-Failed : The system is ill-posed."});
705732
return;
706733
end if;
707734
(_,extractedeqs,var_dependencytree,eq_dependencytree):= BuildSquareSubSet(sets_eqs,sets_vars,knowns,mExt,solvedvar,constantvars,approximatedEquations);
708-
dumpDependencyTree(var_dependencytree,eq_dependencytree,knowns,constantvars,allVars,allEqs);
735+
dumpDependencyTree(var_dependencytree,eq_dependencytree,knowns,constantvars,allVars,allEqs,mapIncRowEqn);
709736
end if;
710737
end VerifyDataReconciliation;
711738

Compiler/SimCode/SimCodeUtil.mo

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ protected
243243
list<DAE.Constraint> constraints;
244244
list<DAE.Exp> lits;
245245
list<SimCode.ClockedPartition> clockedPartitions;
246-
list<SimCode.JacobianMatrix> LinearMatrices, SymbolicJacs, SymbolicJacsTemp, SymbolicJacsStateSelect, SymbolicJacsStateSelectInternal, SymbolicJacsNLS, SymbolicJacsFMI={};
246+
list<SimCode.JacobianMatrix> LinearMatrices, SymbolicJacs, SymbolicJacsTemp, SymbolicJacsStateSelect, SymbolicJacsStateSelectInternal, SymbolicJacsNLS, SymbolicJacsFMI={},SymbolicJacsdatarecon={};
247247
list<SimCode.SimEqSystem> algorithmAndEquationAsserts;
248248
list<SimCode.SimEqSystem> localKnownVars;
249249
list<SimCode.SimEqSystem> allEquations;
@@ -524,15 +524,13 @@ algorithm
524524
SymbolicJacsNLS := listAppend(SymbolicJacsTemp, SymbolicJacsNLS);
525525

526526
// Generate jacobian code for DataReconciliation
527-
//if Flags.isSet(Flags.UNCERTAINTIES) then
528-
if Util.isSome(shared.dataReconciliationData) then
529-
BackendDAE.DATA_RECON(dataReconJac,setcVars) := Util.getOption(shared.dataReconciliationData);
530-
(SOME(dataReconSimJac), uniqueEqIndex, tempvars) := createSymbolicSimulationJacobian(dataReconJac, uniqueEqIndex, tempvars);
531-
({dataReconSimJac}, modelInfo, SymbolicJacsTemp) := addAlgebraicLoopsModelInfoSymJacs({dataReconSimJac}, modelInfo);
532-
SymbolicJacsNLS := listAppend(SymbolicJacsTemp, SymbolicJacsNLS);
533-
SymbolicJacsNLS := dataReconSimJac::SymbolicJacsNLS;
534-
end if;
535-
//end if;
527+
if Util.isSome(shared.dataReconciliationData) then
528+
BackendDAE.DATA_RECON(dataReconJac,setcVars) := Util.getOption(shared.dataReconciliationData);
529+
(SOME(dataReconSimJac), uniqueEqIndex, tempvars) := createSymbolicSimulationJacobian(dataReconJac, uniqueEqIndex, tempvars);
530+
(SymbolicJacsdatarecon, modelInfo, SymbolicJacsTemp) := addAlgebraicLoopsModelInfoSymJacs({dataReconSimJac}, modelInfo);
531+
SymbolicJacsNLS := listAppend(SymbolicJacsTemp, SymbolicJacsNLS);
532+
//SymbolicJacsNLS := dataReconSimJac::SymbolicJacsNLS;
533+
end if;
536534

537535
// collect symbolic jacobians from state selection
538536
(stateSets, modelInfo, SymbolicJacsStateSelect, SymbolicJacsStateSelectInternal) := addAlgebraicLoopsModelInfoStateSets(stateSets, modelInfo);
@@ -549,6 +547,8 @@ algorithm
549547
(SymbolicJacs, modelInfo, SymbolicJacsTemp) := addAlgebraicLoopsModelInfoSymJacs(LinearMatrices, modelInfo);
550548
SymbolicJacs := listAppend(SymbolicJacsFMI, SymbolicJacs);
551549
SymbolicJacs := listAppend(SymbolicJacs, SymbolicJacsStateSelect);
550+
// append datareconciliation jacobians equation to SymbolicJacs for correct generation of equations in model_info.json
551+
SymbolicJacs := listAppend(SymbolicJacs, SymbolicJacsdatarecon);
552552
// collect jacobian equation only for equantion info file
553553
jacobianEquations := collectAllJacobianEquations(SymbolicJacs);
554554
if debug then execStat("simCode: create Jacobian linear code"); end if;

0 commit comments

Comments
 (0)