From 41a48543aea119acae321aae61b85d711610b652 Mon Sep 17 00:00:00 2001 From: Aren Babikian Date: Wed, 20 Jan 2021 08:44:27 +0100 Subject: almost finish crossscen VQL + implement ITE handling + prelim results --- Domains/crossingScenario/.gitignore | 9 +- .../inputs/crossingScenarioGen.vsconfig | 14 +- Domains/crossingScenario/plugin.xml | 5 + .../queries/crossingScenarioQueries.vql | 277 +++++++++++---------- .../results-prelim/plot_RQ2_FamilyTree.pdf | Bin 0 -> 4775 bytes .../crossingScenario/results-prelim/stats1010.csv | 3 + .../crossingScenario/results-prelim/stats1515.csv | 3 + .../crossingScenario/results-prelim/stats2020.csv | 3 + .../crossingScenario/results-prelim/stats2525.csv | 3 + .../crossingScenario/run/CrossingScenarioMain.java | 14 +- Domains/crossingScenario/src/queries/queries.vql | 10 + .../viatra2logic/ExpressionEvaluation2Logic.xtend | 38 +++ .../viatra2logic/NumericDrealProblemSolver.java | 83 ++++-- .../reasoner/ViatraReasonerConfiguration.xtend | 2 +- .../viatrasolver/reasoner/dse/NumericSolver.xtend | 3 +- .../MODELS2020Plots-temp.ipynb | 92 +++++-- .../plots/plot_RQ2_FamilyTree.pdf | Bin 4542 -> 4775 bytes 17 files changed, 366 insertions(+), 193 deletions(-) create mode 100644 Domains/crossingScenario/results-prelim/plot_RQ2_FamilyTree.pdf create mode 100644 Domains/crossingScenario/results-prelim/stats1010.csv create mode 100644 Domains/crossingScenario/results-prelim/stats1515.csv create mode 100644 Domains/crossingScenario/results-prelim/stats2020.csv create mode 100644 Domains/crossingScenario/results-prelim/stats2525.csv create mode 100644 Domains/crossingScenario/src/queries/queries.vql diff --git a/Domains/crossingScenario/.gitignore b/Domains/crossingScenario/.gitignore index 4c033661..50267f31 100644 --- a/Domains/crossingScenario/.gitignore +++ b/Domains/crossingScenario/.gitignore @@ -1,5 +1,4 @@ -/bin/ -/outputs/ -/src-gen/ -/xtend-gen/ -/src/queries/ +/bin/ +/outputs/ +/src-gen/ +/xtend-gen/ diff --git a/Domains/crossingScenario/inputs/crossingScenarioGen.vsconfig b/Domains/crossingScenario/inputs/crossingScenarioGen.vsconfig index acd622c5..a5c862e4 100644 --- a/Domains/crossingScenario/inputs/crossingScenarioGen.vsconfig +++ b/Domains/crossingScenario/inputs/crossingScenarioGen.vsconfig @@ -7,12 +7,14 @@ generate { partial-model = { "inputs/crossingScenarioInit.xmi"} solver = ViatraSolver scope = { - #node = 10..100, - #int = {}, - # = 10..25, - # = 10..25, - # = 1..10//, - //# = 1..10 + #node = 2..* + //, + //# = 25..* + //,# = 25..* + //,# = 1..10 + //,# = 1..10 + //,# = 1..10 + //,# = 1..10 } config = { diff --git a/Domains/crossingScenario/plugin.xml b/Domains/crossingScenario/plugin.xml index c8846e1b..39c9cd2b 100644 --- a/Domains/crossingScenario/plugin.xml +++ b/Domains/crossingScenario/plugin.xml @@ -4,4 +4,9 @@ + + + + + diff --git a/Domains/crossingScenario/queries/crossingScenarioQueries.vql b/Domains/crossingScenario/queries/crossingScenarioQueries.vql index 03dafc97..34eff55c 100644 --- a/Domains/crossingScenario/queries/crossingScenarioQueries.vql +++ b/Domains/crossingScenario/queries/crossingScenarioQueries.vql @@ -424,88 +424,88 @@ pattern collisionExists_defineCollision_x2(a1:Actor, a2:Actor, c:CollisionExists check((xPos1 + (xSpeed1 * cTime)) + (w1/2) < (xPos2 + (xSpeed2 * cTime)) - (w2/2)); } -//////////////// -////SeparationDistance -//////////////// -//@Constraint(severity="error", key={a1, sd}, message="x") -//pattern SeparationDistance_near_lb(a1:Actor, a2:Actor, sd:SeparationDistance) { -// //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1 -// Actor.relations(a1, sd); -// SeparationDistance.target(sd, a2); -// SeparationDistance.distance(sd, Distance::Near); -// -// Actor.xPos(a1, x1); -// Actor.yPos(a1, y1); -// Actor.xPos(a2, x2); -// Actor.yPos(a2, y2); -// //check(dx^2 + dy^2 < 5^2) -// check((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) < 5*5); -//} -// -//@Constraint(severity="error", key={a1, sd}, message="x") -//pattern SeparationDistance_near_ub(a1:Actor, a2:Actor, sd:SeparationDistance) { -// //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1 -// Actor.relations(a1, sd); -// SeparationDistance.target(sd, a2); -// SeparationDistance.distance(sd, Distance::Near); -// -// Actor.xPos(a1, x1); -// Actor.yPos(a1, y1); -// Actor.xPos(a2, x2); -// Actor.yPos(a2, y2); -// //check(dx^2 + dy^2 > 10^2) -// check((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) > 10*10); -//} -// -//@Constraint(severity="error", key={a1, sd}, message="x") -//pattern SeparationDistance_medium_lb(a1:Actor, a2:Actor, sd:SeparationDistance) { -// //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1 -// Actor.relations(a1, sd); -// SeparationDistance.target(sd, a2); -// SeparationDistance.distance(sd, Distance::Medium); -// -// Actor.xPos(a1, x1); -// Actor.yPos(a1, y1); -// Actor.xPos(a2, x2); -// Actor.yPos(a2, y2); -// //check(dx^2 + dy^2 < 10^2) -// check((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) < 10*10); -//} -// -//@Constraint(severity="error", key={a1, sd}, message="x") -//pattern SeparationDistance_medium_ub(a1:Actor, a2:Actor, sd:SeparationDistance) { -// //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1 -// Actor.relations(a1, sd); -// SeparationDistance.target(sd, a2); -// SeparationDistance.distance(sd, Distance::Medium); -// -// Actor.xPos(a1, x1); -// Actor.yPos(a1, y1); -// Actor.xPos(a2, x2); -// Actor.yPos(a2, y2); -// //check(dx^2 + dy^2 > 1^2) -// check((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) > 15*15); -//} -// -//@Constraint(severity="error", key={a1, sd}, message="x") -//pattern SeparationDistance_far_lb(a1:Actor, a2:Actor, sd:SeparationDistance) { -// //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1 -// Actor.relations(a1, sd); -// SeparationDistance.target(sd, a2); -// SeparationDistance.distance(sd, Distance::Far); -// -// Actor.xPos(a1, x1); -// Actor.yPos(a1, y1); -// Actor.xPos(a2, x2); -// Actor.yPos(a2, y2); -// //check(dx^2 + dy^2 < 15^2) -// check((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) < 15*15); -//} -// +////////////// +//SeparationDistance +////////////// +@Constraint(severity="error", key={a1, sd}, message="x") +pattern SeparationDistance_near_lb(a1:Actor, a2:Actor, sd:SeparationDistance) { + //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1 + Actor.relations(a1, sd); + SeparationDistance.target(sd, a2); + SeparationDistance.distance(sd, Distance::D_Near); + + Actor.xPos(a1, x1); + Actor.yPos(a1, y1); + Actor.xPos(a2, x2); + Actor.yPos(a2, y2); + //check(dx^2 + dy^2 < 5^2) + check((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) < 5*5); +} + +@Constraint(severity="error", key={a1, sd}, message="x") +pattern SeparationDistance_near_ub(a1:Actor, a2:Actor, sd:SeparationDistance) { + //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1 + Actor.relations(a1, sd); + SeparationDistance.target(sd, a2); + SeparationDistance.distance(sd, Distance::D_Near); + + Actor.xPos(a1, x1); + Actor.yPos(a1, y1); + Actor.xPos(a2, x2); + Actor.yPos(a2, y2); + //check(dx^2 + dy^2 > 10^2) + check((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) > 10*10); +} + +@Constraint(severity="error", key={a1, sd}, message="x") +pattern SeparationDistance_medium_lb(a1:Actor, a2:Actor, sd:SeparationDistance) { + //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1 + Actor.relations(a1, sd); + SeparationDistance.target(sd, a2); + SeparationDistance.distance(sd, Distance::D_Med); + + Actor.xPos(a1, x1); + Actor.yPos(a1, y1); + Actor.xPos(a2, x2); + Actor.yPos(a2, y2); + //check(dx^2 + dy^2 < 10^2) + check((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) < 10*10); +} + +@Constraint(severity="error", key={a1, sd}, message="x") +pattern SeparationDistance_medium_ub(a1:Actor, a2:Actor, sd:SeparationDistance) { + //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1 + Actor.relations(a1, sd); + SeparationDistance.target(sd, a2); + SeparationDistance.distance(sd, Distance::D_Med); + + Actor.xPos(a1, x1); + Actor.yPos(a1, y1); + Actor.xPos(a2, x2); + Actor.yPos(a2, y2); + //check(dx^2 + dy^2 > 1^2) + check((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) > 15*15); +} + +@Constraint(severity="error", key={a1, sd}, message="x") +pattern SeparationDistance_far_lb(a1:Actor, a2:Actor, sd:SeparationDistance) { + //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1 + Actor.relations(a1, sd); + SeparationDistance.target(sd, a2); + SeparationDistance.distance(sd, Distance::D_Far); + + Actor.xPos(a1, x1); + Actor.yPos(a1, y1); + Actor.xPos(a2, x2); + Actor.yPos(a2, y2); + //check(dx^2 + dy^2 < 15^2) + check((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) < 15*15); +} + //////////////// ////CollisionDoesNotExist //////////////// -// +//TODO ////@Constraint(severity="error", key={a1, cdne}, message="x") ////pattern collisionDoesNotExist(a1:Actor, a2:Actor, ss:CrossingScenario, cdne:CollisionDoesNotExist) { //// //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1 @@ -532,59 +532,72 @@ pattern collisionExists_defineCollision_x2(a1:Actor, a2:Actor, c:CollisionExists //// //check(dx^2 + dy^2 < 15^2) //// check((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) < 15*15); ////} -// -//////////////// -////VisionBlocked -//////////////// -// -////OPTIONS 1: everything is from a single check expression containing ITEs -////Currently unhandled bygenerator -//@Constraint(severity="error", key={a1, vb}, message="x") -//pattern visionBlocked_ites_top(a1:Actor, a2:Actor, vb:VisionBlocked) { -// //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1 -// Actor.relations(a1, vb); -// VisionBlocked.target(vb, a2); -// VisionBlocked.blockedBy(vb, aBlocker); -// -// Actor.xPos(a1, x1); -// Actor.yPos(a1, y1); -// Actor.xPos(a2, x2); -// Actor.yPos(a2, y2); -// Actor.xPos(aBlocker, xBlocker); -// Actor.yPos(aBlocker, yBlocker); -// Actor.length(aBlocker, lenBlocker); -// Actor.width(aBlocker, widBlocker); -// -// //check(slope of a1-to-BlockerTop < slope of a1-to-a2) -// check( -// ( yBlocker - y1 + (if(xBlocker > x1){lenBlocker/2}else{0-lenBlocker/2})) / -// ( xBlocker - x1 + (if(yBlocker > y1){0-widBlocker/2}else{widBlocker/2})) -// < ((y1-y2)/(x1-x2))); -//} -// -//@Constraint(severity="error", key={a1, vb}, message="x") -//pattern visionBlocked_ites_bottom(a1:Actor, a2:Actor, vb:VisionBlocked) { -// //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1 -// Actor.relations(a1, vb); -// VisionBlocked.target(vb, a2); -// VisionBlocked.blockedBy(vb, aBlocker); -// -// Actor.xPos(a1, x1); -// Actor.yPos(a1, y1); -// Actor.xPos(a2, x2); -// Actor.yPos(a2, y2); -// Actor.xPos(aBlocker, xBlocker); -// Actor.yPos(aBlocker, yBlocker); -// Actor.length(aBlocker, lenBlocker); -// Actor.width(aBlocker, widBlocker); -// -// //check(slope of a1-to-BlockerBottom > slope of a1-to-a2) -// check( -// ( yBlocker - y1 + (if(xBlocker > x1){0-lenBlocker/2}else{lenBlocker/2})) / -// ( xBlocker - x1 + (if(yBlocker > y1){widBlocker/2}else{0-widBlocker/2})) -// > ((y1-y2)/(x1-x2))); -//} -// + +////////////// +//VisionBlocked +////////////// + +@Constraint(severity="error", key={a1, a2}, message="x") +pattern visionBlocked_invalidBlocker(a1:Actor, a2:Actor) { + Actor.relations(a1, vb); + VisionBlocked.target(vb, a2); + VisionBlocked.blockedBy(vb, a1); +} or { + Actor.relations(a1, vb); + VisionBlocked.target(vb, a2); + VisionBlocked.blockedBy(vb, a1); +} + +//OPTIONS 1: everything is from a single check expression containing ITEs +//Currently unhandled bygenerator +@Constraint(severity="error", key={a1, vb}, message="x") +pattern visionBlocked_ites_top(a1:Actor, a2:Actor, vb:VisionBlocked) { + //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1 + Actor.relations(a1, vb); + VisionBlocked.target(vb, a2); + VisionBlocked.blockedBy(vb, aBlocker); + + Actor.xPos(a1, x1); + Actor.yPos(a1, y1); + Actor.xPos(a2, x2); + Actor.yPos(a2, y2); + Actor.xPos(aBlocker, xBlocker); + Actor.yPos(aBlocker, yBlocker); + Actor.length(aBlocker, lenBlocker); + Actor.width(aBlocker, widBlocker); + + //check(slope of a1-to-BlockerTop < slope of a1-to-a2) + check( + ( yBlocker - y1 + (if(xBlocker > x1){lenBlocker/2}else{0-lenBlocker/2})) / + ( xBlocker - x1 + (if(yBlocker > y1){0-widBlocker/2}else{widBlocker/2})) + < ((y1-y2)/(x1-x2))); +} + +@Constraint(severity="error", key={a1, vb}, message="x") +pattern visionBlocked_ites_bottom(a1:Actor, a2:Actor, vb:VisionBlocked) { + //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1 + Actor.relations(a1, vb); + VisionBlocked.target(vb, a2); + VisionBlocked.blockedBy(vb, aBlocker); + + Actor.xPos(a1, x1); + Actor.yPos(a1, y1); + Actor.xPos(a2, x2); + Actor.yPos(a2, y2); + Actor.xPos(aBlocker, xBlocker); + Actor.yPos(aBlocker, yBlocker); + Actor.length(aBlocker, lenBlocker); + Actor.width(aBlocker, widBlocker); + + //check(slope of a1-to-BlockerBottom > slope of a1-to-a2) + check( + ( yBlocker - y1 + (if(xBlocker > x1){0-lenBlocker/2}else{lenBlocker/2})) / + ( xBlocker - x1 + (if(yBlocker > y1){widBlocker/2}else{0-widBlocker/2})) + > ((y1-y2)/(x1-x2))); +} + + + ////OPTION 2: ////we handle ITE by seperating the constraints // diff --git a/Domains/crossingScenario/results-prelim/plot_RQ2_FamilyTree.pdf b/Domains/crossingScenario/results-prelim/plot_RQ2_FamilyTree.pdf new file mode 100644 index 00000000..c6cda90a Binary files /dev/null and b/Domains/crossingScenario/results-prelim/plot_RQ2_FamilyTree.pdf differ diff --git a/Domains/crossingScenario/results-prelim/stats1010.csv b/Domains/crossingScenario/results-prelim/stats1010.csv new file mode 100644 index 00000000..9755619c --- /dev/null +++ b/Domains/crossingScenario/results-prelim/stats1010.csv @@ -0,0 +1,3 @@ +Task,Run,Result,Domain to logic transformation time,Logic to solver transformation time,Solver time,Postprocessing time,Solution0FoundAt,Solution1FoundAt,Solution2FoundAt,Solution3FoundAt,Solution4FoundAt,Solution5FoundAt,Solution6FoundAt,Solution7FoundAt,Solution8FoundAt,Solution9FoundAt,Solution1DetailedStatistics,Solution2DetailedStatistics,Solution3DetailedStatistics,Solution4DetailedStatistics,Solution5DetailedStatistics,Solution6DetailedStatistics,Solution7DetailedStatistics,Solution8DetailedStatistics,Solution9DetailedStatistics,Solution10DetailedStatistics,ExplorationInitializationTime,TransformationExecutionTime,ScopePropagationTime,MustRelationPropagationTime,TypeAnalysisTime,StateCoderTime,StateCoderFailCount,SolutionCopyTime,States,ForwardTime,BacktrackingTime,GlobalConstraintEvaluationTime,FitnessCalculationTime,ActivationSelectionTime,Decisions,Transformations,ScopePropagations,ScopePropagationsSolverCalls,NumericalSolverSumTime,NumericalSolverProblemFormingTime,NumericalSolverSolvingTime,NumericalSolverInterpretingSolution,NumericalSolverCachingTime,NumericalSolverCallNumber,NumericalSolverCachedAnswerNumber +1,1,ModelResultImpl,9010,23452,51887,1485,12797,15916,19434,23446,27192,31111,35422,40827,46435,51841,(TransformationExecutionTime164|StateCoderTime:878|ForwardTime:2360|Backtrackingtime:664|GlobalConstraintEvaluationTime:133|FitnessCalculationTime:161|ActivationSelectionTime:3|SolutionCopyTime:15|NumericalSolverSumTime:7655|NumericalSolverProblemFormingTime:7245|NumericalSolverSolvingTime:7245|NumericalSolverInterpretingSolution:11),(TransformationExecutionTime183|StateCoderTime:973|ForwardTime:2865|Backtrackingtime:808|GlobalConstraintEvaluationTime:138|FitnessCalculationTime:161|ActivationSelectionTime:4|SolutionCopyTime:32|NumericalSolverSumTime:9872|NumericalSolverProblemFormingTime:9491|NumericalSolverSolvingTime:9491|NumericalSolverInterpretingSolution:504),(TransformationExecutionTime194|StateCoderTime:1057|ForwardTime:3165|Backtrackingtime:916|GlobalConstraintEvaluationTime:142|FitnessCalculationTime:161|ActivationSelectionTime:4|SolutionCopyTime:55|NumericalSolverSumTime:12751|NumericalSolverProblemFormingTime:12412|NumericalSolverSolvingTime:12412|NumericalSolverInterpretingSolution:547),(TransformationExecutionTime203|StateCoderTime:1151|ForwardTime:3464|Backtrackingtime:1086|GlobalConstraintEvaluationTime:147|FitnessCalculationTime:161|ActivationSelectionTime:4|SolutionCopyTime:66|NumericalSolverSumTime:16025|NumericalSolverProblemFormingTime:15702|NumericalSolverSolvingTime:15702|NumericalSolverInterpretingSolution:615),(TransformationExecutionTime215|StateCoderTime:1246|ForwardTime:3765|Backtrackingtime:1215|GlobalConstraintEvaluationTime:152|FitnessCalculationTime:161|ActivationSelectionTime:5|SolutionCopyTime:75|NumericalSolverSumTime:19113|NumericalSolverProblemFormingTime:18809|NumericalSolverSolvingTime:18809|NumericalSolverInterpretingSolution:721),(TransformationExecutionTime226|StateCoderTime:1352|ForwardTime:4089|Backtrackingtime:1369|GlobalConstraintEvaluationTime:156|FitnessCalculationTime:161|ActivationSelectionTime:5|SolutionCopyTime:88|NumericalSolverSumTime:22319|NumericalSolverProblemFormingTime:22064|NumericalSolverSolvingTime:22064|NumericalSolverInterpretingSolution:804),(TransformationExecutionTime241|StateCoderTime:1478|ForwardTime:4395|Backtrackingtime:1512|GlobalConstraintEvaluationTime:160|FitnessCalculationTime:161|ActivationSelectionTime:5|SolutionCopyTime:102|NumericalSolverSumTime:25900|NumericalSolverProblemFormingTime:25664|NumericalSolverSolvingTime:25664|NumericalSolverInterpretingSolution:955),(TransformationExecutionTime252|StateCoderTime:1630|ForwardTime:4770|Backtrackingtime:1626|GlobalConstraintEvaluationTime:166|FitnessCalculationTime:161|ActivationSelectionTime:5|SolutionCopyTime:121|NumericalSolverSumTime:30532|NumericalSolverProblemFormingTime:30342|NumericalSolverSolvingTime:30342|NumericalSolverInterpretingSolution:984),(TransformationExecutionTime268|StateCoderTime:1781|ForwardTime:5284|Backtrackingtime:1781|GlobalConstraintEvaluationTime:171|FitnessCalculationTime:161|ActivationSelectionTime:5|SolutionCopyTime:130|NumericalSolverSumTime:35154|NumericalSolverProblemFormingTime:35000|NumericalSolverSolvingTime:35000|NumericalSolverInterpretingSolution:1038),(TransformationExecutionTime288|StateCoderTime:1947|ForwardTime:5919|Backtrackingtime:1949|GlobalConstraintEvaluationTime:189|FitnessCalculationTime:161|ActivationSelectionTime:6|SolutionCopyTime:141|NumericalSolverSumTime:39426|NumericalSolverProblemFormingTime:39283|NumericalSolverSolvingTime:39283|NumericalSolverInterpretingSolution:1147),877,288,74,0,425,1947,0,141,1029,5919,1980,189,161,6,1028,1334,693,0,39426,213,39283,1147,89,644,0 + diff --git a/Domains/crossingScenario/results-prelim/stats1515.csv b/Domains/crossingScenario/results-prelim/stats1515.csv new file mode 100644 index 00000000..b4629b3c --- /dev/null +++ b/Domains/crossingScenario/results-prelim/stats1515.csv @@ -0,0 +1,3 @@ +Task,Run,Result,Domain to logic transformation time,Logic to solver transformation time,Solver time,Postprocessing time,Solution0FoundAt,Solution1FoundAt,Solution2FoundAt,Solution3FoundAt,Solution4FoundAt,Solution5FoundAt,Solution6FoundAt,Solution7FoundAt,Solution8FoundAt,Solution9FoundAt,Solution1DetailedStatistics,Solution2DetailedStatistics,Solution3DetailedStatistics,Solution4DetailedStatistics,Solution5DetailedStatistics,Solution6DetailedStatistics,Solution7DetailedStatistics,Solution8DetailedStatistics,Solution9DetailedStatistics,Solution10DetailedStatistics,ExplorationInitializationTime,TransformationExecutionTime,ScopePropagationTime,MustRelationPropagationTime,TypeAnalysisTime,StateCoderTime,StateCoderFailCount,SolutionCopyTime,States,ForwardTime,BacktrackingTime,GlobalConstraintEvaluationTime,FitnessCalculationTime,ActivationSelectionTime,Decisions,Transformations,ScopePropagations,ScopePropagationsSolverCalls,NumericalSolverSumTime,NumericalSolverProblemFormingTime,NumericalSolverSolvingTime,NumericalSolverInterpretingSolution,NumericalSolverCachingTime,NumericalSolverCallNumber,NumericalSolverCachedAnswerNumber +1,1,ModelResultImpl,8909,26896,147364,4539,43585,55701,66321,75680,88212,97969,110930,122811,135475,147093,(TransformationExecutionTime303|StateCoderTime:2016|ForwardTime:4913|Backtrackingtime:1500|GlobalConstraintEvaluationTime:162|FitnessCalculationTime:112|ActivationSelectionTime:7|SolutionCopyTime:29|NumericalSolverSumTime:33695|NumericalSolverProblemFormingTime:33071|NumericalSolverSolvingTime:33071|NumericalSolverInterpretingSolution:23),(TransformationExecutionTime347|StateCoderTime:2433|ForwardTime:6020|Backtrackingtime:1930|GlobalConstraintEvaluationTime:172|FitnessCalculationTime:112|ActivationSelectionTime:8|SolutionCopyTime:61|NumericalSolverSumTime:43518|NumericalSolverProblemFormingTime:42992|NumericalSolverSolvingTime:42992|NumericalSolverInterpretingSolution:1719),(TransformationExecutionTime369|StateCoderTime:2705|ForwardTime:6493|Backtrackingtime:2159|GlobalConstraintEvaluationTime:179|FitnessCalculationTime:112|ActivationSelectionTime:8|SolutionCopyTime:80|NumericalSolverSumTime:52854|NumericalSolverProblemFormingTime:52340|NumericalSolverSolvingTime:52340|NumericalSolverInterpretingSolution:2050),(TransformationExecutionTime387|StateCoderTime:3023|ForwardTime:7076|Backtrackingtime:2414|GlobalConstraintEvaluationTime:186|FitnessCalculationTime:112|ActivationSelectionTime:8|SolutionCopyTime:91|NumericalSolverSumTime:60837|NumericalSolverProblemFormingTime:60372|NumericalSolverSolvingTime:60372|NumericalSolverInterpretingSolution:2100),(TransformationExecutionTime416|StateCoderTime:3404|ForwardTime:7759|Backtrackingtime:2662|GlobalConstraintEvaluationTime:195|FitnessCalculationTime:112|ActivationSelectionTime:9|SolutionCopyTime:111|NumericalSolverSumTime:71781|NumericalSolverProblemFormingTime:71360|NumericalSolverSolvingTime:71360|NumericalSolverInterpretingSolution:2284),(TransformationExecutionTime431|StateCoderTime:3688|ForwardTime:8238|Backtrackingtime:2873|GlobalConstraintEvaluationTime:204|FitnessCalculationTime:112|ActivationSelectionTime:9|SolutionCopyTime:143|NumericalSolverSumTime:80265|NumericalSolverProblemFormingTime:79879|NumericalSolverSolvingTime:79879|NumericalSolverInterpretingSolution:4294),(TransformationExecutionTime454|StateCoderTime:4163|ForwardTime:8946|Backtrackingtime:3138|GlobalConstraintEvaluationTime:212|FitnessCalculationTime:112|ActivationSelectionTime:10|SolutionCopyTime:182|NumericalSolverSumTime:91499|NumericalSolverProblemFormingTime:91124|NumericalSolverSolvingTime:91124|NumericalSolverInterpretingSolution:5232),(TransformationExecutionTime468|StateCoderTime:4556|ForwardTime:9636|Backtrackingtime:3481|GlobalConstraintEvaluationTime:221|FitnessCalculationTime:112|ActivationSelectionTime:11|SolutionCopyTime:245|NumericalSolverSumTime:101575|NumericalSolverProblemFormingTime:101228|NumericalSolverSolvingTime:101228|NumericalSolverInterpretingSolution:7283),(TransformationExecutionTime493|StateCoderTime:5131|ForwardTime:10356|Backtrackingtime:3869|GlobalConstraintEvaluationTime:228|FitnessCalculationTime:112|ActivationSelectionTime:15|SolutionCopyTime:257|NumericalSolverSumTime:112229|NumericalSolverProblemFormingTime:111903|NumericalSolverSolvingTime:111903|NumericalSolverInterpretingSolution:7470),(TransformationExecutionTime505|StateCoderTime:5330|ForwardTime:11359|Backtrackingtime:4059|GlobalConstraintEvaluationTime:236|FitnessCalculationTime:112|ActivationSelectionTime:16|SolutionCopyTime:264|NumericalSolverSumTime:122243|NumericalSolverProblemFormingTime:122057|NumericalSolverSolvingTime:122057|NumericalSolverInterpretingSolution:7581),865,505,129,0,359,5330,0,264,1467,11359,4130,236,112,16,1466,2149,1125,0,122243,535,122057,7581,192,917,0 + diff --git a/Domains/crossingScenario/results-prelim/stats2020.csv b/Domains/crossingScenario/results-prelim/stats2020.csv new file mode 100644 index 00000000..95c7b6ed --- /dev/null +++ b/Domains/crossingScenario/results-prelim/stats2020.csv @@ -0,0 +1,3 @@ +Task,Run,Result,Domain to logic transformation time,Logic to solver transformation time,Solver time,Postprocessing time,Solution0FoundAt,Solution1FoundAt,Solution2FoundAt,Solution3FoundAt,Solution4FoundAt,Solution5FoundAt,Solution6FoundAt,Solution7FoundAt,Solution8FoundAt,Solution9FoundAt,Solution1DetailedStatistics,Solution2DetailedStatistics,Solution3DetailedStatistics,Solution4DetailedStatistics,Solution5DetailedStatistics,Solution6DetailedStatistics,Solution7DetailedStatistics,Solution8DetailedStatistics,Solution9DetailedStatistics,Solution10DetailedStatistics,ExplorationInitializationTime,TransformationExecutionTime,ScopePropagationTime,MustRelationPropagationTime,TypeAnalysisTime,StateCoderTime,StateCoderFailCount,SolutionCopyTime,States,ForwardTime,BacktrackingTime,GlobalConstraintEvaluationTime,FitnessCalculationTime,ActivationSelectionTime,Decisions,Transformations,ScopePropagations,ScopePropagationsSolverCalls,NumericalSolverSumTime,NumericalSolverProblemFormingTime,NumericalSolverSolvingTime,NumericalSolverInterpretingSolution,NumericalSolverCachingTime,NumericalSolverCallNumber,NumericalSolverCachedAnswerNumber +1,1,ModelResultImpl,8960,38152,426782,5154,117015,139402,165609,258797,291602,320720,333001,373921,402602,426376,(TransformationExecutionTime494|StateCoderTime:3907|ForwardTime:8581|Backtrackingtime:2766|GlobalConstraintEvaluationTime:412|FitnessCalculationTime:226|ActivationSelectionTime:18|SolutionCopyTime:21|NumericalSolverSumTime:99075|NumericalSolverProblemFormingTime:97727|NumericalSolverSolvingTime:97727|NumericalSolverInterpretingSolution:5),(TransformationExecutionTime529|StateCoderTime:4517|ForwardTime:9707|Backtrackingtime:3074|GlobalConstraintEvaluationTime:427|FitnessCalculationTime:226|ActivationSelectionTime:19|SolutionCopyTime:29|NumericalSolverSumTime:118946|NumericalSolverProblemFormingTime:117798|NumericalSolverSolvingTime:117798|NumericalSolverInterpretingSolution:388),(TransformationExecutionTime544|StateCoderTime:4788|ForwardTime:10245|Backtrackingtime:3260|GlobalConstraintEvaluationTime:437|FitnessCalculationTime:226|ActivationSelectionTime:20|SolutionCopyTime:92|NumericalSolverSumTime:143648|NumericalSolverProblemFormingTime:142864|NumericalSolverSolvingTime:142864|NumericalSolverInterpretingSolution:2381),(TransformationExecutionTime585|StateCoderTime:5301|ForwardTime:11459|Backtrackingtime:3906|GlobalConstraintEvaluationTime:448|FitnessCalculationTime:226|ActivationSelectionTime:20|SolutionCopyTime:102|NumericalSolverSumTime:233896|NumericalSolverProblemFormingTime:232994|NumericalSolverSolvingTime:232994|NumericalSolverInterpretingSolution:2689),(TransformationExecutionTime624|StateCoderTime:5709|ForwardTime:12394|Backtrackingtime:4231|GlobalConstraintEvaluationTime:457|FitnessCalculationTime:226|ActivationSelectionTime:21|SolutionCopyTime:115|NumericalSolverSumTime:264480|NumericalSolverProblemFormingTime:263825|NumericalSolverSolvingTime:263825|NumericalSolverInterpretingSolution:2953),(TransformationExecutionTime654|StateCoderTime:6243|ForwardTime:13200|Backtrackingtime:4497|GlobalConstraintEvaluationTime:465|FitnessCalculationTime:226|ActivationSelectionTime:22|SolutionCopyTime:125|NumericalSolverSumTime:291496|NumericalSolverProblemFormingTime:291108|NumericalSolverSolvingTime:291108|NumericalSolverInterpretingSolution:3763),(TransformationExecutionTime666|StateCoderTime:6435|ForwardTime:13585|Backtrackingtime:4642|GlobalConstraintEvaluationTime:472|FitnessCalculationTime:226|ActivationSelectionTime:22|SolutionCopyTime:158|NumericalSolverSumTime:302593|NumericalSolverProblemFormingTime:302543|NumericalSolverSolvingTime:302543|NumericalSolverInterpretingSolution:3952),(TransformationExecutionTime687|StateCoderTime:6874|ForwardTime:14385|Backtrackingtime:4953|GlobalConstraintEvaluationTime:481|FitnessCalculationTime:226|ActivationSelectionTime:23|SolutionCopyTime:168|NumericalSolverSumTime:341436|NumericalSolverProblemFormingTime:341581|NumericalSolverSolvingTime:341581|NumericalSolverInterpretingSolution:4292),(TransformationExecutionTime743|StateCoderTime:7449|ForwardTime:16003|Backtrackingtime:5450|GlobalConstraintEvaluationTime:488|FitnessCalculationTime:226|ActivationSelectionTime:24|SolutionCopyTime:186|NumericalSolverSumTime:366975|NumericalSolverProblemFormingTime:367335|NumericalSolverSolvingTime:367335|NumericalSolverInterpretingSolution:4611),(TransformationExecutionTime770|StateCoderTime:7890|ForwardTime:17008|Backtrackingtime:5725|GlobalConstraintEvaluationTime:496|FitnessCalculationTime:226|ActivationSelectionTime:24|SolutionCopyTime:193|NumericalSolverSumTime:388630|NumericalSolverProblemFormingTime:389219|NumericalSolverSolvingTime:389219|NumericalSolverInterpretingSolution:4691),1756,770,161,0,482,7890,0,193,1913,17008,5828,496,226,24,1923,3123,1560,0,388630,758,389219,4691,326,1157,0 + diff --git a/Domains/crossingScenario/results-prelim/stats2525.csv b/Domains/crossingScenario/results-prelim/stats2525.csv new file mode 100644 index 00000000..3ef3b993 --- /dev/null +++ b/Domains/crossingScenario/results-prelim/stats2525.csv @@ -0,0 +1,3 @@ +Task,Run,Result,Domain to logic transformation time,Logic to solver transformation time,Solver time,Postprocessing time,Solution0FoundAt,Solution1FoundAt,Solution2FoundAt,Solution3FoundAt,Solution4FoundAt,Solution5FoundAt,Solution6FoundAt,Solution7FoundAt,Solution8FoundAt,Solution9FoundAt,Solution1DetailedStatistics,Solution2DetailedStatistics,Solution3DetailedStatistics,Solution4DetailedStatistics,Solution5DetailedStatistics,Solution6DetailedStatistics,Solution7DetailedStatistics,Solution8DetailedStatistics,Solution9DetailedStatistics,Solution10DetailedStatistics,ExplorationInitializationTime,TransformationExecutionTime,ScopePropagationTime,MustRelationPropagationTime,TypeAnalysisTime,StateCoderTime,StateCoderFailCount,SolutionCopyTime,States,ForwardTime,BacktrackingTime,GlobalConstraintEvaluationTime,FitnessCalculationTime,ActivationSelectionTime,Decisions,Transformations,ScopePropagations,ScopePropagationsSolverCalls,NumericalSolverSumTime,NumericalSolverProblemFormingTime,NumericalSolverSolvingTime,NumericalSolverInterpretingSolution,NumericalSolverCachingTime,NumericalSolverCallNumber,NumericalSolverCachedAnswerNumber +1,1,ModelResultImpl,16616,45089,845556,6143,292654,361779,420309,481525,545119,607816,665526,713971,778821,844868,(TransformationExecutionTime635|StateCoderTime:5581|ForwardTime:12383|Backtrackingtime:3798|GlobalConstraintEvaluationTime:254|FitnessCalculationTime:83|ActivationSelectionTime:18|SolutionCopyTime:115|NumericalSolverSumTime:268490|NumericalSolverProblemFormingTime:267792|NumericalSolverSolvingTime:267792|NumericalSolverInterpretingSolution:19),(TransformationExecutionTime731|StateCoderTime:6897|ForwardTime:14757|Backtrackingtime:4503|GlobalConstraintEvaluationTime:272|FitnessCalculationTime:83|ActivationSelectionTime:19|SolutionCopyTime:122|NumericalSolverSumTime:332112|NumericalSolverProblemFormingTime:331778|NumericalSolverSolvingTime:331778|NumericalSolverInterpretingSolution:1898),(TransformationExecutionTime764|StateCoderTime:7443|ForwardTime:15699|Backtrackingtime:4794|GlobalConstraintEvaluationTime:283|FitnessCalculationTime:83|ActivationSelectionTime:20|SolutionCopyTime:167|NumericalSolverSumTime:388161|NumericalSolverProblemFormingTime:388433|NumericalSolverSolvingTime:388433|NumericalSolverInterpretingSolution:2204),(TransformationExecutionTime799|StateCoderTime:8129|ForwardTime:16840|Backtrackingtime:5221|GlobalConstraintEvaluationTime:300|FitnessCalculationTime:83|ActivationSelectionTime:21|SolutionCopyTime:184|NumericalSolverSumTime:446208|NumericalSolverProblemFormingTime:447299|NumericalSolverSolvingTime:447299|NumericalSolverInterpretingSolution:3008),(TransformationExecutionTime835|StateCoderTime:8878|ForwardTime:17877|Backtrackingtime:5537|GlobalConstraintEvaluationTime:310|FitnessCalculationTime:83|ActivationSelectionTime:22|SolutionCopyTime:191|NumericalSolverSumTime:506613|NumericalSolverProblemFormingTime:508301|NumericalSolverSolvingTime:508301|NumericalSolverInterpretingSolution:3261),(TransformationExecutionTime933|StateCoderTime:9919|ForwardTime:20737|Backtrackingtime:6289|GlobalConstraintEvaluationTime:320|FitnessCalculationTime:83|ActivationSelectionTime:22|SolutionCopyTime:203|NumericalSolverSumTime:563726|NumericalSolverProblemFormingTime:565943|NumericalSolverSolvingTime:565943|NumericalSolverInterpretingSolution:3396),(TransformationExecutionTime974|StateCoderTime:11009|ForwardTime:22343|Backtrackingtime:6905|GlobalConstraintEvaluationTime:331|FitnessCalculationTime:83|ActivationSelectionTime:23|SolutionCopyTime:213|NumericalSolverSumTime:617206|NumericalSolverProblemFormingTime:619686|NumericalSolverSolvingTime:619686|NumericalSolverInterpretingSolution:3626),(TransformationExecutionTime1001|StateCoderTime:11697|ForwardTime:23206|Backtrackingtime:7223|GlobalConstraintEvaluationTime:339|FitnessCalculationTime:83|ActivationSelectionTime:24|SolutionCopyTime:244|NumericalSolverSumTime:663109|NumericalSolverProblemFormingTime:665951|NumericalSolverSolvingTime:665951|NumericalSolverInterpretingSolution:4870),(TransformationExecutionTime1049|StateCoderTime:12433|ForwardTime:24701|Backtrackingtime:7654|GlobalConstraintEvaluationTime:348|FitnessCalculationTime:83|ActivationSelectionTime:25|SolutionCopyTime:250|NumericalSolverSumTime:724603|NumericalSolverProblemFormingTime:727988|NumericalSolverSolvingTime:727988|NumericalSolverInterpretingSolution:5635),(TransformationExecutionTime1126|StateCoderTime:13570|ForwardTime:26801|Backtrackingtime:8243|GlobalConstraintEvaluationTime:373|FitnessCalculationTime:83|ActivationSelectionTime:26|SolutionCopyTime:259|NumericalSolverSumTime:785878|NumericalSolverProblemFormingTime:789775|NumericalSolverSolvingTime:789775|NumericalSolverInterpretingSolution:5726),836,1126,209,0,1317,13570,0,259,2859,26801,8319,373,83,26,2859,5353,2592,0,785878,1005,789775,5726,409,1693,0 + diff --git a/Domains/crossingScenario/src/crossingScenario/run/CrossingScenarioMain.java b/Domains/crossingScenario/src/crossingScenario/run/CrossingScenarioMain.java index 9b8f10dc..57a91dfc 100644 --- a/Domains/crossingScenario/src/crossingScenario/run/CrossingScenarioMain.java +++ b/Domains/crossingScenario/src/crossingScenario/run/CrossingScenarioMain.java @@ -3,9 +3,11 @@ package crossingScenario.run; import java.awt.Desktop; import java.io.File; import java.io.IOException; +import java.nio.file.CopyOption; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; import java.util.List; import hu.bme.mit.inf.dslreasoner.application.execution.StandaloneScriptExecutor; @@ -26,7 +28,12 @@ public class CrossingScenarioMain { if (errorMessages != null) { System.out.println(errorMessages); } - Path path = Paths.get("outputs/statistics.csv"); + + + Path path = Paths.get("outputs/statistics.csv"); + Path target = Paths.get("../..//Tests/MODELS2020-CaseStudies/case.study.pledge.run/measurements1/stats.csv"); + Files.copy(path, target, StandardCopyOption.REPLACE_EXISTING); + List content = Files.readAllLines(path); String[] times = content.get(1).split(","); System.out.println("STATISTICS"); @@ -45,7 +52,10 @@ public class CrossingScenarioMain { String p1 = "outputs/models/1.xmi"; String p2 = "outputs/simplePrevLane.tgf"; - QueryDebug.checkPrevLanes(p1, p2); +// QueryDebug.checkPrevLanes(p1, p2); // Desktop.getDesktop().open(new File(p2)); + System.gc(); + System.gc(); + System.gc(); } } diff --git a/Domains/crossingScenario/src/queries/queries.vql b/Domains/crossingScenario/src/queries/queries.vql new file mode 100644 index 00000000..d00fae3f --- /dev/null +++ b/Domains/crossingScenario/src/queries/queries.vql @@ -0,0 +1,10 @@ +package queries + +import "http://www.example.com/crossingScenario" +import "http://www.eclipse.org/emf/2002/Ecore" + +/////////pedestrian-width (4) //TODO Derived? +pattern x(p:Pedestrian) { + Pedestrian.length(p, l); + check(l != 1.0); +} \ No newline at end of file diff --git a/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/ExpressionEvaluation2Logic.xtend b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/ExpressionEvaluation2Logic.xtend index 1b68fed2..9e11d2cf 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/ExpressionEvaluation2Logic.xtend +++ b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/ExpressionEvaluation2Logic.xtend @@ -1,6 +1,7 @@ package hu.bme.mit.inf.dslreasoner.viatra2logic import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.IfThenElse import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Term import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Variable import java.util.Map @@ -8,9 +9,11 @@ import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable import org.eclipse.xtext.xbase.XBinaryOperation import org.eclipse.xtext.xbase.XExpression import org.eclipse.xtext.xbase.XFeatureCall +import org.eclipse.xtext.xbase.XIfExpression import org.eclipse.xtext.xbase.XMemberFeatureCall import org.eclipse.xtext.xbase.XNumberLiteral import org.eclipse.xtext.xbase.XUnaryOperation +import org.eclipse.xtext.xbase.XBlockExpression class ExpressionEvaluation2Logic { val extension LogicProblemBuilder builder = new LogicProblemBuilder @@ -139,6 +142,41 @@ class ExpressionEvaluation2Logic { throw new UnsupportedOperationException('''Unsupported numeric type: "«s»"''') } + def protected dispatch Term transform(XIfExpression i, Map variable2Variable) { + + val cond_op = i.^if.transform(variable2Variable) + val then_op = i.then.transform(variable2Variable) + val else_op = i.^else.transform(variable2Variable) + + if (cond_op === null) { + println("-> " + i.^if) + println("-> " + i.then) + println("-> " + i.^else) + throw new UnsupportedOperationException('''Your ITE statement has a null condition.''') + } + if (then_op === null) { + println("-> " + i.^if) + println("-> " + i.then) + println("-> " + i.^else) + throw new UnsupportedOperationException('''Your ITE statement has a null "then" statement"".''') + } + return ITE(cond_op, then_op, else_op) + } + + def protected dispatch Term transform(XBlockExpression b, Map variable2Variable) { + val exprs = newArrayList + for(e:b.expressions){ exprs.add(transform(e, variable2Variable)) } + + if (exprs.size > 1) + throw new UnsupportedOperationException('''blocks with more than 1 statement are not currently supportes: "«exprs»"''') + if (exprs.isEmpty) + throw new UnsupportedOperationException('''blocks is empty: "«exprs»"''') + + return exprs.get(0) + } + + + def protected dispatch Term transform(XExpression e, Map variable2Variable) { throw new UnsupportedOperationException('''Unsupported expression: "«e.class.simpleName»" - «e»''') } diff --git a/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/NumericDrealProblemSolver.java b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/NumericDrealProblemSolver.java index 30e68260..575a9224 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/NumericDrealProblemSolver.java +++ b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/NumericDrealProblemSolver.java @@ -20,8 +20,10 @@ import java.util.regex.Pattern; import org.eclipse.xtext.common.types.JvmIdentifiableElement; import org.eclipse.xtext.xbase.XBinaryOperation; +import org.eclipse.xtext.xbase.XBlockExpression; import org.eclipse.xtext.xbase.XExpression; import org.eclipse.xtext.xbase.XFeatureCall; +import org.eclipse.xtext.xbase.XIfExpression; import org.eclipse.xtext.xbase.XNumberLiteral; import org.eclipse.xtext.xbase.XUnaryOperation; @@ -72,7 +74,7 @@ public class NumericDrealProblemSolver extends NumericProblemSolver{ //TODO timeout if needed if (!p.waitFor(timeout, TimeUnit.SECONDS)) { p.destroy(); - System.err.println("TIMEOUT"); //DEBUG + return null; } return p; } @@ -147,7 +149,7 @@ public class NumericDrealProblemSolver extends NumericProblemSolver{ } private String formNumericConstraint(XExpression e, Map aMatch) throws Exception { - //The check equation MUST be a binary operation + //The check equation MUST be a binary operation of the listed types (comparisons) if (!(e instanceof XBinaryOperation)) { throw new Exception ("error in check expression!!!"); } @@ -159,19 +161,20 @@ public class NumericDrealProblemSolver extends NumericProblemSolver{ String left_operand = formNumericConstraintHelper(((XBinaryOperation) e).getLeftOperand(), aMatch); String right_operand = formNumericConstraintHelper(((XBinaryOperation) e).getRightOperand(), aMatch); + //NOTE that everything is inverted, due to how the MG handles vql constraints if (nameEndsWith(name, N_LESSTHAN)) { - operator = "<"; + operator = ">"; } else if (nameEndsWith(name, N_LESSEQUALSTHAN)) { - operator = "<="; + operator = ">="; } else if (nameEndsWith(name, N_GREATERTHAN)) { - operator = ">"; + operator = "<"; } else if (nameEndsWith(name, N_GREATEREQUALTHAN)) { - operator = ">="; + operator = "<="; } else if (nameEndsWith(name, N_EQUALS)) { - operator = "<"; - } else if (nameEndsWith(name, N_NOTEQUALS)) { //Exceptional case return "(not (=" + " " + left_operand + " " + right_operand + "))"; + } else if (nameEndsWith(name, N_NOTEQUALS)) { + operator = "="; // } else if (nameEndsWith(name, N_EQUALS3)) { // operator = "<"; // } else if (nameEndsWith(name, N_NOTEQUALS3)) { @@ -240,6 +243,19 @@ public class NumericDrealProblemSolver extends NumericProblemSolver{ operator = "*"; } else if (nameEndsWith(name, N_DIVIDE)) { operator = "/"; + } else if (nameEndsWith(name, N_LESSTHAN)) { + operator = "<"; + } else if (nameEndsWith(name, N_LESSEQUALSTHAN)) { + operator = "<="; + } else if (nameEndsWith(name, N_GREATERTHAN)) { + operator = ">"; + } else if (nameEndsWith(name, N_GREATEREQUALTHAN)) { + operator = ">="; + } else if (nameEndsWith(name, N_EQUALS)) { + operator = "<"; + } else if (nameEndsWith(name, N_NOTEQUALS)) { + //Exceptional case + return "(not (=" + " " + left_operand + " " + right_operand + "))"; // } else if (nameEndsWith(name, N_MODULO)) { // expr = ctx.mkMod((IntExpr)left_operand, (IntExpr)right_operand); } else { @@ -249,12 +265,30 @@ public class NumericDrealProblemSolver extends NumericProblemSolver{ expr = "(" + operator + " " + left_operand + " " + right_operand + ")"; } else if (e instanceof XUnaryOperation){ - String name = ((XUnaryOperation) e).getFeature().getQualifiedName(); - System.out.println(name); - String op = ((XUnaryOperation) e).getOperand().toString(); - System.out.println(op); + //TODO + //This is, for example, "-1000" throw new Exception ("Unsupported expression " + e.getClass().getSimpleName()); - } else { + } + else if (e instanceof XIfExpression) { + + String if_operand = formNumericConstraintHelper(((XIfExpression) e).getIf(), aMatch); + String then_operand = formNumericConstraintHelper(((XIfExpression) e).getThen(), aMatch); + String else_operand = formNumericConstraintHelper(((XIfExpression) e).getElse(), aMatch); + + expr = "(ite " + if_operand + " " + then_operand + " " + else_operand + ")"; + } + else if (e instanceof XBlockExpression) { + XBlockExpression ebl = (XBlockExpression) e; + + if (ebl.getExpressions().size() > 1) + throw new Exception("Unsupported: blocks with more than 1 statement are not currently supportes: " + ebl); + if (ebl.getExpressions().isEmpty()) + throw new Exception("Unsupported: blocks is empty:" + ebl); + + //TODO make this more general + expr = formNumericConstraintHelper(ebl.getExpressions().get(0), aMatch); + } + else { throw new Exception ("Unsupported expression " + e.getClass().getSimpleName()); } return expr; @@ -279,7 +313,7 @@ public class NumericDrealProblemSolver extends NumericProblemSolver{ Iterable> matchSets = matches.get(e); for (Map aMatch: matchSets) { String constraint = formNumericConstraint(e, aMatch); - String negAssert = "(assert (not " + constraint + "))"; + String negAssert = "(assert " + constraint + ")"; curConstraints.add(negAssert); } } @@ -329,16 +363,24 @@ public class NumericDrealProblemSolver extends NumericProblemSolver{ Process outputProcess; if (this.useDocker) outputProcess = callDrealDocker(numProbContent, false); else outputProcess = callDrealLocal(numProbContent, false); - - List> outputs = getProcessOutput(outputProcess); - boolean result = getDrealResult(outputProcess.exitValue(), outputs); + + boolean result = false; + List> outputs = null; + if (outputProcess != null) { + outputs = getProcessOutput(outputProcess); + result = getDrealResult(outputProcess.exitValue(), outputs); + } endSolvingProblem = System.nanoTime()-startSolvingProblem; //DEBUG - Print things + if (outputProcess == null) { + System.err.println("TIMEOUT"); +// printOutput(numProbContent); + } // printOutput(numProbContent); -// printOutput(outputs.get(0)); - System.out.println(result); - //END DEBUG +// if (outputs != null) printOutput(outputs.get(0)); +// System.out.println(result); +// END DEBUG return result; } @@ -391,6 +433,7 @@ public class NumericDrealProblemSolver extends NumericProblemSolver{ endSolvingProblem = System.nanoTime()-startSolvingProblem; //DEBUG - Print things + System.out.println("Getting Solution!"); // printOutput(numProbContent); // printOutput(outputs.get(0)); // System.out.println(result); diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasonerConfiguration.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasonerConfiguration.xtend index c0daaad2..759f434b 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasonerConfiguration.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasonerConfiguration.xtend @@ -76,7 +76,7 @@ class ViatraReasonerConfiguration extends LogicSolverConfiguration { public var nonContainmentWeight = 1 public var unfinishedWFWeight = 1 public var calculateObjectCreationCosts = false - public var numericSolverSelection = NumericSolverSelection.DREAL_DOCKER //currently defaulted to DREAL + public NumericSolverSelection numericSolverSelection = NumericSolverSelection.DREAL_DOCKER //currently defaulted to DREAL public var drealLocalPath = ""; public var ScopePropagatorStrategy scopePropagatorStrategy = new ScopePropagatorStrategy.Polyhedral( diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/NumericSolver.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/NumericSolver.xtend index 9223ecc8..fc1a616b 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/NumericSolver.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/NumericSolver.xtend @@ -12,7 +12,6 @@ import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.par import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ModelGenerationMethod import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.NumericSolverSelection import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration -import java.math.BigDecimal import java.util.HashMap import java.util.LinkedHashMap import java.util.LinkedHashSet @@ -103,7 +102,7 @@ class NumericSolver { finalResult=true } else { val propagatedConstraints = new HashMap - println("<<<>>>") +// println("<<<>>>") for(entry : matches.entrySet) { val constraint = entry.key // println("--match?-- " + constraint) diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/MODELS2020Plots-temp.ipynb b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/MODELS2020Plots-temp.ipynb index b91d8e53..cc342a87 100644 --- a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/MODELS2020Plots-temp.ipynb +++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/MODELS2020Plots-temp.ipynb @@ -146,7 +146,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -158,7 +158,7 @@ " scale_fill_brewer(palette='Set2',\n", " labels=rev(c('Refinement', 'Backtracking', 'State Coding', 'SMT Solver Calls', 'Additional Model Generation')),\n", " guide=FALSE) +\n", - " scale_x_continuous(breaks=c(20, 40, 60, 80, 100), name=\"Model Size (# nodes)\") +\n", + " scale_x_continuous(breaks=c(20, 30, 40, 50, 100), name=\"Model Size (# nodes)\") +\n", " scale_y_continuous(name=\"Runtime (s)\") +\n", " theme_bw()\n", " ggsave(plot=plot, filename=paste0('plots/plot_RQ2_', name, '.pdf'), width=3.5, height=2.5)\n", @@ -175,13 +175,22 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ + "Warning message:\n", + "“`cols` is now required when using unnest().\n", + "Please use `cols = c(Solution1DetailedStatistics)`”\n", + "Warning message:\n", + "“`cols` is now required when using unnest().\n", + "Please use `cols = c(Solution1DetailedStatistics)`”\n", + "Warning message:\n", + "“`cols` is now required when using unnest().\n", + "Please use `cols = c(Solution1DetailedStatistics)`”\n", "Warning message:\n", "“`cols` is now required when using unnest().\n", "Please use `cols = c(Solution1DetailedStatistics)`”\n" @@ -191,39 +200,54 @@ "data": { "text/html": [ "\n", - "\n", + "\n", "\n", "\t\n", "\t\n", "\n", "\n", - "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", "\n", "
A tibble: 1 × 8A tibble: 4 × 8
nRunpreprocessingTimeStateCoderTimeForwardTimeBacktrackingTimeNumericalSolverSumTimeadditionalTime
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl>
2011473599418901272439114750
20133339 878 26541610 7655 39044
301366702016 51872687 33695103508
401488683907 92194814 99075309361
501625415581127205863268490552214
\n" ], "text/latex": [ - "A tibble: 1 × 8\n", + "A tibble: 4 × 8\n", "\\begin{tabular}{llllllll}\n", " n & Run & preprocessingTime & StateCoderTime & ForwardTime & BacktrackingTime & NumericalSolverSumTime & additionalTime\\\\\n", " & & & & & & & \\\\\n", "\\hline\n", - "\t 20 & 1 & 14735 & 994 & 1890 & 1272 & 4391 & 14750\\\\\n", + "\t 20 & 1 & 33339 & 878 & 2654 & 1610 & 7655 & 39044\\\\\n", + "\t 30 & 1 & 36670 & 2016 & 5187 & 2687 & 33695 & 103508\\\\\n", + "\t 40 & 1 & 48868 & 3907 & 9219 & 4814 & 99075 & 309361\\\\\n", + "\t 50 & 1 & 62541 & 5581 & 12720 & 5863 & 268490 & 552214\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", - "A tibble: 1 × 8\n", + "A tibble: 4 × 8\n", "\n", "| n <dbl> | Run <dbl> | preprocessingTime <dbl> | StateCoderTime <dbl> | ForwardTime <dbl> | BacktrackingTime <dbl> | NumericalSolverSumTime <dbl> | additionalTime <dbl> |\n", "|---|---|---|---|---|---|---|---|\n", - "| 20 | 1 | 14735 | 994 | 1890 | 1272 | 4391 | 14750 |\n", + "| 20 | 1 | 33339 | 878 | 2654 | 1610 | 7655 | 39044 |\n", + "| 30 | 1 | 36670 | 2016 | 5187 | 2687 | 33695 | 103508 |\n", + "| 40 | 1 | 48868 | 3907 | 9219 | 4814 | 99075 | 309361 |\n", + "| 50 | 1 | 62541 | 5581 | 12720 | 5863 | 268490 | 552214 |\n", "\n" ], "text/plain": [ " n Run preprocessingTime StateCoderTime ForwardTime BacktrackingTime\n", - "1 20 1 14735 994 1890 1272 \n", + "1 20 1 33339 878 2654 1610 \n", + "2 30 1 36670 2016 5187 2687 \n", + "3 40 1 48868 3907 9219 4814 \n", + "4 50 1 62541 5581 12720 5863 \n", " NumericalSolverSumTime additionalTime\n", - "1 4391 14750 " + "1 7655 39044 \n", + "2 33695 103508 \n", + "3 99075 309361 \n", + "4 268490 552214 " ] }, "metadata": {}, @@ -233,39 +257,54 @@ "data": { "text/html": [ "\n", - "\n", + "\n", "\n", "\t\n", "\t\n", "\n", "\n", - "\t\n", + "\t\n", + "\t\n", + "\t\n", + "\t\n", "\n", "
A tibble: 1 × 7A tibble: 4 × 7
npreprocessingTimeStateCoderTimeForwardTimeBacktrackingTimeNumericalSolverSumTimeadditionalTime
<dbl><dbl><dbl><dbl><dbl><dbl><dbl>
2014.7350.9941.891.2724.39114.75
2033.3390.878 2.6541.610 7.655 39.044
3036.6702.016 5.1872.687 33.695103.508
4048.8683.907 9.2194.814 99.075309.361
5062.5415.58112.7205.863268.490552.214
\n" ], "text/latex": [ - "A tibble: 1 × 7\n", + "A tibble: 4 × 7\n", "\\begin{tabular}{lllllll}\n", " n & preprocessingTime & StateCoderTime & ForwardTime & BacktrackingTime & NumericalSolverSumTime & additionalTime\\\\\n", " & & & & & & \\\\\n", "\\hline\n", - "\t 20 & 14.735 & 0.994 & 1.89 & 1.272 & 4.391 & 14.75\\\\\n", + "\t 20 & 33.339 & 0.878 & 2.654 & 1.610 & 7.655 & 39.044\\\\\n", + "\t 30 & 36.670 & 2.016 & 5.187 & 2.687 & 33.695 & 103.508\\\\\n", + "\t 40 & 48.868 & 3.907 & 9.219 & 4.814 & 99.075 & 309.361\\\\\n", + "\t 50 & 62.541 & 5.581 & 12.720 & 5.863 & 268.490 & 552.214\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", - "A tibble: 1 × 7\n", + "A tibble: 4 × 7\n", "\n", "| n <dbl> | preprocessingTime <dbl> | StateCoderTime <dbl> | ForwardTime <dbl> | BacktrackingTime <dbl> | NumericalSolverSumTime <dbl> | additionalTime <dbl> |\n", "|---|---|---|---|---|---|---|\n", - "| 20 | 14.735 | 0.994 | 1.89 | 1.272 | 4.391 | 14.75 |\n", + "| 20 | 33.339 | 0.878 | 2.654 | 1.610 | 7.655 | 39.044 |\n", + "| 30 | 36.670 | 2.016 | 5.187 | 2.687 | 33.695 | 103.508 |\n", + "| 40 | 48.868 | 3.907 | 9.219 | 4.814 | 99.075 | 309.361 |\n", + "| 50 | 62.541 | 5.581 | 12.720 | 5.863 | 268.490 | 552.214 |\n", "\n" ], "text/plain": [ " n preprocessingTime StateCoderTime ForwardTime BacktrackingTime\n", - "1 20 14.735 0.994 1.89 1.272 \n", + "1 20 33.339 0.878 2.654 1.610 \n", + "2 30 36.670 2.016 5.187 2.687 \n", + "3 40 48.868 3.907 9.219 4.814 \n", + "4 50 62.541 5.581 12.720 5.863 \n", " NumericalSolverSumTime additionalTime\n", - "1 4.391 14.75 " + "1 7.655 39.044 \n", + "2 33.695 103.508 \n", + "3 99.075 309.361 \n", + "4 268.490 552.214 " ] }, "metadata": {}, @@ -274,16 +313,16 @@ { "data": { "text/html": [ - "14.735" + "42.769" ], "text/latex": [ - "14.735" + "42.769" ], "text/markdown": [ - "14.735" + "42.769" ], "text/plain": [ - "[1] 14.735" + "[1] 42.769" ] }, "metadata": {}, @@ -291,7 +330,7 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0gAAANICAMAAADKOT/pAAAC+lBMVEUAAAABAQECAgIDAwME\nBAQFBQUGBgYHBwcICAgJCQkKCgoLCwsMDAwNDQ0ODg4PDw8QEBARERESEhITExMUFBQVFRUW\nFhYXFxcYGBgZGRkaGhobGxscHBwdHR0eHh4fHx8gICAhISEiIiIjIyMkJCQlJSUmJiYnJyco\nKCgpKSkqKiorKyssLCwtLS0uLi4vLy8wMDAxMTEyMjIzMzM0NDQ1NTU2NjY3Nzc4ODg5OTk6\nOjo7Ozs8PDw9PT0+Pj4/Pz9AQEBBQUFCQkJDQ0NERERFRUVGRkZHR0dISEhJSUlKSkpLS0tM\nTExNTU1OTk5PT09QUFBRUVFSUlJTU1NUVFRVVVVWVlZXV1dYWFhZWVlaWlpbW1tcXFxdXV1e\nXl5fX19gYGBhYWFiYmJjY2NkZGRlZWVmZmZmwqVoaGhpaWlqampra2tsbGxtbW1ubm5vb29w\ncHBxcXFycnJzc3N0dHR1dXV2dnZ3d3d4eHh5eXl6enp7e3t8fHx9fX1+fn5/f3+AgICBgYGC\ngoKDg4OEhISFhYWGhoaHh4eIiIiJiYmKioqLi4uMjIyNjY2NoMuOjo6Pj4+RkZGSkpKTk5OV\nlZWWlpaXl5eYmJiampqbm5ucnJydnZ2enp6fn5+goKChoaGjo6OkpKSlpaWmpqam2FSnp6eo\nqKipqamqqqqrq6usrKytra2urq6vr6+wsLCxsbGzs7O0tLS1tbW2tra3t7e4uLi5ubm6urq7\nu7u8vLy9vb2+vr6/v7/AwMDBwcHCwsLDw8PExMTFxcXGxsbHx8fIyMjJycnKysrLy8vMzMzO\nzs7Pz8/Q0NDR0dHS0tLT09PU1NTV1dXW1tbX19fY2NjZ2dna2trb29vc3Nzd3d3e3t7f39/g\n4ODh4eHi4uLj4+Pk5OTl5eXm5ubnisPn5+fo6Ojp6enq6urr6+vs7Ozt7e3u7u7v7+/w8PDx\n8fHy8vLz8/P09PT19fX29vb39/f4+Pj5+fn6+vr7+/v8jWL8/Pz9/f3+/v7///9xBoAgAAAA\nCXBIWXMAABJ0AAASdAHeZh94AAAXzUlEQVR4nO3dfbwddWHn8SGQRHmQWp4UUbr1AV0whYaC\nBbEVWGorSZCHUAISEh5WBBdFu9BCF1jasBWosZYtAgrSRYoPFdAIimBdgoKGCrIIibYEFsIl\n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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0gAAANICAIAAAByhViMAAAACXBIWXMAABJ0AAASdAHeZh94\nAAAgAElEQVR4nOzdfZyVdZ34/+ucM8MwA3MDciOEN4gIeBOGWpi3FZlppZaW6QbrTTLWfll0\nzdVyg7BNXddA0xapxQdboWxurrubuuJ9lrakqGTqGt58ASUcB+Yw9+fu+8f5dX7zQGYYmDke\n5jPP5x8+5lzncJ23n7k48+I6NxPL5XIRAAADX7zUAwAA0D+EHQBAIIQdAEAghB0AQCCEHQBA\nIIQdAEAghB0AQCCEHQBAIMpKPcCe+9a3vvX73/++X3aVy+VyuVw8LnOjKIqy2WwURVYjL5vN\nWoo8B0ZXDowCB0ZXDowCP1i7yv8yiFgs1i97Gzt27LJly7q7dgCHXUNDw6233rrffvv1fVfp\ndLqtra26urrvuxrostlsY2PjkCFDampqSj1L6eVyuW3bto0YMaLUg+wVGhsbY7GY1chrbGwc\nOXJkqafYKzQ1NaVSqX322ae/fmgNaMlkctiwYYlEotSDlF5zc3N7e3tdXV1Z2QAujf7S0tJS\nVlZWUVHR912lUqmzzz67hxtIaQCAQAg7AIBACDsAgEAIOwCAQAg7AIBACDsAgEAIOwCAQAg7\nAIBACDsAgEAIOwCAQAg7AIBACDsAgEAIOwCAQAg7AIBACDsAgEAIOwCAQAg7AIBACDsAgEAI\nOwCAQAg7AIBACDsAgEAIOwCAQAg7AIBACDsAgEAIOwCAQAg7AIBACDsAgEAIOwCAQAg7AIBA\nCDsAgEAIOwCAQAg7AIBACDsAgEAIOwCAQJSVegAAGBTm/mplqUeguG4/4bxSj+CMHQBAKIQd\nAEAghB0AQCCEHQBAIIQdAEAghB0AQCCEHQBAIIQdAEAghB0AQCCEHQBAIIQdAEAghB0AQCCE\nHQBAIIQdAEAghB0AQCCEHQBAIIQdAEAghB0AQCCEHQBAIIQdAEAghB0AQCCEHQBAIIQdAEAg\nhB0AQCCEHQBAIIQdAEAghB0AQCCEHQBAIIQdAEAghB0AQCCEHQBAIMqKuveNGzfecccdr7zy\nSjqdnjhx4le+8pVDDz00iqLm5uZly5a98MILqVRqypQp9fX1Y8aM6WE7AAC7VMQzdrlcbtGi\nRSNGjFi2bNmKFSsOP/zwhQsXbt++PYqiJUuWbNmyZcGCBTfeeGNVVdWiRYuy2WwP2wEA2KUi\nhl0ymdy8efOsWbOqqqoqKipOO+209vb2t99+u6GhYc2aNZdccsnEiRPHjx9fX1+/adOmdevW\ndbe9eBMCAISkiGFXW1s7derUBx54YPv27e3t7Q888MDYsWMPPPDAV199tby8fOLEifmbDR8+\nfMKECa+88kp324s3IQBASIr7Grurrrrq29/+9vnnnx9F0YgRI7797W8PGTIkmUxWV1fHYrHC\nzWpra5uammpra3e6vXDx+eefv/322wsXm5ubt2/f3vUGeyyXy2Wz2X7Z1UCXy+WiKEqn01Yj\nL5PJWIq8XC6Xy+WsRp5HjIJ0Oh1FUVNTU9dH70ErnU5v377dUgxa3T0sZDKZzs7O9vb2vt9F\nKpXq+VVqRQy7dDq9aNGiqVOn/v3f/315efl99923YMGCH/zgB1EUdXfQ9/yXobGx8X/+538K\nFydNmpROp1OpVH8N7PV8Bdls1moU9OMxFgCrUWApusrnHZGlGNx6fljIZDLFvouoqGG3bt26\n119//frrrx86dGgURWefffb999//5JNPjhkzJplM5nK5QsY1NTWNGDGirq5up9sLOzzhhBMe\neeSRwsUrrriirq5un3326fuo6XS6vb19+PDhfd/VQJfNZrdu3TpkyJDq6upSz1J6+RNUdXV1\npR5kr7B169ZYLGY18rZu3dr10WkwSyaTqVRq5MiRTlNFUbR9+/aqqqpEIlHqQSiN7pqktbU1\nkUhUVFT0/S5SqVQ83tPr6IoYdvknbrqe+Mn/O2by5MmpVGr9+vUHH3xwFEXJZHLDhg3Tpk0b\nN27cTrf//7OWldXU1BQuxv6s76Pmd+JRKeqyCFajwFJ0ZTUKLEVX/fVoHABLMZj18K3v32Lp\nQRHfPDF16tQRI0YsX768ubm5s7PzF7/4RUtLy9FHHz1y5Mhjjz32tttue/311zdt2rR48eJJ\nkyYdeuih3W0v3oQAACEp4hm7/AfRrVixor6+PpPJ7L///gsWLBg3blwURfPmzVu2bNnChQsz\nmcxhhx12zTXX5Au0u+0AAOxScd8Ve8ABB3z7299+7/aqqqr58+f3fjsAALvkd8UCAARC2AEA\nBELYAQAEQtgBAARC2AEABELYAQAEQtgBAARC2AEABELYAQAEQtgBAARC2AEABELYAQAEQtgB\nAARC2AEABELYAQAEQtgBAARC2AEABELYAQAEQtgBAARC2AEABELYAQAEQtgBAARC2AEABELY\nAQAEQtgBAARC2AEABELYAQAEQtgBAARC2AEABELYAQAEQtgBAARC2AEABELYAQAEQtgBAARC\n2AEABELYAQAEQtgBAARC2AEABELYAQAEQtgBAARC2AEABELYAQAEQtgBAARC2AEABELYAQAE\nQtgBAARC2AEABELYAQAEQtgBAARC2AEABELYAQAEQtgBAARC2AEABELYAQAEQtgBAARC2AEA\nBELYAQAEQtgBAARC2AEABELYAQAEQtgBAARC2AEABELYAQAEQtgBAARC2AEABELYAQAEQtgB\nAARC2AEABELYAQAEQtgBAARC2AEABELYAQAEQtgBAARC2AEABELYAQAEQtgBAARC2AEABKKs\n1APsuWw229HR0d7e3i+7ymQy/bKrgS6Xy0VRlM1mrUYURblcLpfLWYq8/LFhNfIcGAXZbDaK\novb29lgsVupZSi//gyked9JkkOruYSGdTud/oPT9LlKpVM/7GcBhF/35526/7Kfw30GusBRW\nI3Jg7IzVKLAUXVmNPA8ag1wP3/r+LZYeDOCwi8fjQ4cOrays7Puu0ul0Npvtl10NdNlstrW1\nNZFIWI0oinK5XEdHh6XIa2tri8ViViOvra3NUuR1dnZmMpnKykpn7KIoSqVSFRUViUSi1INQ\nGt09LGSz2bKysoqKir7fRVlZWc9/15wuBgAIhLADAAiEsAMACISwAwAIhLADAAiEsAMACISw\nAwAIhLADAAiEsAMACISwAwAIhLADAAiEsAMACISwAwAIhLADAAiEsAMACISwAwAIhLADAAiE\nsAMACISwAwAIhLADAAiEsAMACISwAwAIhLADAAiEsAMACISwAwAIhLADAAiEsAMACISwAwAI\nhLADAAiEsAMACISwAwAIhLADAAiEsAMACISwAwAIhLADAAiEsAMACISwAwAIhLADAAiEsAMA\nCISwAwAIhLADAAiEsAMACISwAwAIhLADAAiEsAMACISwAwAIhLADAAiEsAMACISwAwAIhLAD\nAAiEsAMACISwAwAIhLADAAiEsAMACISwAwAIhLADAAiEsAMACISwAwAIhLADAAiEsAMACISw\nAwAIhLADAAiEsAMACISwAwAIhLADAAiEsAMACISwAwAIhLADAAiEsAMACISwAwAIhLADAAiE\nsAMACISwAwAIhLADAAiEsAMACISwAwAIhLADAAhEWbHv4L777rvnnnvefffdD3zgA7Nnzz7m\n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\nU1NlZWV/jwQAwJ7oVdh98IMf/Md//Me2trauGxsbGxctWjRz5sziDAYAwO4p682NvvWtb82a\nNeuDH/zg6aefHkXRj370o6VLl95zzz1tbW1d304BAEAJ9eqM3cknn/zf//3f1dXVN998cxRF\ny5cvX7FixdSpU1evXn3ccccVeUIAAHqlV2fsoij6xCc+8eyzz27ZsuWtt96KouiAAw4YMWJE\nMQcDAGD39Dbs8iorKw888MD819u2bct/UVdX178zAQCwB3oVdq+99tq8efMee+yxlpaW916b\ny+X6eyoAAHZbr8LuoosuWrt27Zlnnjlu3LhEIlHsmQAA2AO9Crs1a9Y8+OCDH/3oR4s9DQAA\ne6xX74odNmxY4aV1AADsnXoVdl/5yleWL19e7FEAAOiLXj0V+73vfe/0009/4IEHjj322H32\n2WeHa6+66qoiDAYAwO7pVdh9//vff+ihh6Io+vWvf/3ea4UdQFdzf7Wy1CNQXLefcF6pR4Cd\n61XY3XLLLV/4whcuu+yyfffd17tiAQD2Tr0Ku8bGxltuuWX8+PHFngYAgD3WqzdPHHrooe+8\n806xRwEAoC96FXZLliy5/PLLX3jhhWJPAwDAHuvVU7Hf/OY333zzzenTpw8fPvy974p94403\n+n8uAAB2U6/CLh6PT5kyZcqUKcWeBgCAPdarsHviiSeKPQcAAH3Uq9fYAQCw9+vpjN3UqVPn\nzJlz9dVXT506tYebvfzyy/09FQAAu62nsKurq6usrMx/8X7NAwDAHuop7J5++ukdvgAAYK/V\nq9fYHX300S+99NJ7t//bv/3boYce2t8jAQCwJ3oVds8880xLS8sOG9Pp9Isvvrh+/foiTAUA\nwG7bxcedxGKx/BfHHHPMTm8wY8aMfp4IAIA9souwe+655x5//PG//uu/PuOMM0aNGtX1qlgs\nNn78+K9+9avFHA8AgN7aRdhNnz59+vTp991334033jh58uT3ZyYAAPZAr37zxAMPPFDsOQAA\n6KNehd2WLVuuvPLK1atXb968OZvN7nBtLpfb5R4efvjhm2+++Zvf/ObMmTOjKGpubl62bNkL\nL7yQSqWmTJlSX18/ZsyYHrYDALBLvQq7v/qrv7rnnntOOumkT37yk2VlvfojXW3btm3FihVD\nhgwpbFmyZElzc/OCBQsqKipWrly5aNGiW265JR6Pd7d9d+8RAGAQ6lWlPfLII3ffffcZZ5yx\nZ/exdOnSk08++bHHHstfbGhoWLNmzeLFiydOnBhFUX19/Ve+8pV169Z94AMf2On26dOn79n9\nAgAMKr0Ku7a2to9+9KN7dgdPPfXU+vXr58+fXwi7V199tby8PF9vURQNHz58woQJr7zySmtr\n6063F8Juy5YtL7zwQmHPqVSqs7Ozo6NjzwbrKpPJZDKZftnVQJd/Yj2bzVqNKIpyuVwul7MU\nefljw2rkOTAGue6++9lstrOz0xNNg1Z3B0Ymk+nN69Z6I5VK9byrXoXdUUcd9eKLL5588sm7\ne/fNzc1Lly697LLLhg4dWtiYTCarq6sLn5AXRVFtbW1TU1Ntbe1Otxcuvvjii1dddVXh4qRJ\nk1paWrZv3767U3WnH3c10KXTaatRYCkKcrmc1SiwFINZD9/9dDr9fk7CXqXnh4X29va+30X/\nhN3ixYu/9rWvLVmy5Nhjj92tu//nf/7nGTNmHHnkkTts71pvvdmeN2nSpP/zf/5P4eIjjzxS\nWVk5bNiw3Rppp7LZbCqVqqio6PuuBrpcLtfa2ppIJLq2+KCVy+Xa29srKytLPcheobW1NRaL\nWY281tbWqqqqUk9ByXT3o6ejo6O8vNwZu0GruwMjfx53D96l8F6pVKrnWOrVffz1X//122+/\n/dGPfrSqqmr06NE7XPvGG2/s9E8999xzzz777K233rrD9rq6umQymcvlCpM1NTWNGDGiu+2F\nP7j//vvPmTOncPE3v/nN0KFD++XHTDqdzmazfmJFUZTNZvNhZzWiPz/dZiny2trahF1BW1ub\npRjMuvvup1KpoUOHJhKJ93ke9hLdHRjZbLasrKxfzh+VlZX1Q9jF4/FDDjnkkEMO2a37Xr16\ndUtLS319ff5ic3Pz4sWLjzzyyLlz56ZSqfXr1x988MFRFCWTyQ0bNkybNm3cuHE73b5bdwoA\nMGj1KuyeeOKJPdh1fX39BRdcULh42WWXzZ49+yMf+UhNTc2xxx572223zZs3b8iQIT/+8Y8n\nTZp06KGHxmKxnW7fg7sGABiE+uHp3u5UV1dXV1cXLsZiserq6pqamiiK5s2bt2zZsoULF2Yy\nmcMOO+yaa67Jn1fsbjsAALvUq7AbNWpUd1d1dnYmk8ne7ORf/uVfCl9XVVXNnz//vbfpbjsA\nALvUq7A7/vjjd9jy9ttvr1u3btKkSSeddFIRpgIAYLf1Kuz+/d///b0bN2/e/KUvfenTn/50\nf48EAMCe2PPP2tl3331vuummBQsW9OM0AADssT59iOKECRP+8Ic/9NcoAAD0xZ6HXS6XW758\n+T777NOP0wAAsMd69Rq79/5OsEwms3nz5oaGhiuuuKIIUwEAsNv28HPsysvLP/jBD55xxhmF\nXywBAEBp9SrsnnvuuWLPAQBAH/XpzRNRFL3xxhv9MQYAAH21i7B74oknPvWpT02ePPlTn/rU\n/fff3/Wqjo6Ov//7v/e7XAEA9hI9hd3TTz89a9as1atXd3Z2Pvroo6effvrPf/7z/FUPPvjg\nEUcccc011+y///7vy5wAAOxCT2F3/fXXV1VVrV279s0339y4ceNRRx21YMGCjRs3nnPOOZ/6\n1KfeeeedxYsXr1u37n2bFQCAHvT05onnn3/+L//yL6dPnx5F0ZgxY6699tpPf/rTkydPTqVS\nl1566aJFi0aNGvV+zQkAwC70FHYbN2485JBDChenTZsWRdFHPvKRW2+99fDDDy/6aAAA7I6e\nnopNp9NDhgwpXKyoqIii6KqrrlJ1AAB7ob5+3AkAAHsJYQcAEIhd/OaJ11577emnn85/3djY\nGEXRyy+/XFdX1/U2M2fOLNJwAAD03i7C7rrrrrvuuuu6brnssst2uE0ul+vnoQAA2H09hd2C\nBQvetzkAAOijnsJu4cKF79cYAAD0lTdPAAAEQtgBAARC2AEABELYAQAEQtgBAARC2AEABELY\nAQAEQtgBAARC2AEABELYAQAEQtgBAARC2AEABELYAQAEQtgBAARC2AEABELYAQAEQtgBAARC\n2AEABELYAQAEQtgBAARC2AEABELYAQAEQtgBAARC2AEABELYAQAEQtgBAARC2AEABELYAQAE\nQtgBAARC2AEABELYAQAEQtgBAARC2AEABELYAQAEQtgBAARC2AEABELYAQAEQtgBAARC2AEA\nBELYAQAEQtgBAARC2AEABELYAQAEQtgBAARC2AEABELYAQAEQtgBAARC2AEABELYAQAEQtgB\nAARC2AEABELYAQAEQtgBAARC2AEABELYAQAEQtgBAASirNQD7LlMJtPU1DR8+PB+2Vs2m926\ndWu/7GpAy+VyURSlUimrkZfJZCxFXi6Xy+VyViPPI8Yg1913P5vNJpPJ93kY9h49HBixWKy1\ntbXvd5FKpbLZbA83GMBhl0gkamtrR4wY0fddpdPptra26urqvu9qoMtms42NjZpwVW8AAB7E\n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\nB8YAfmCld7r77mez2c7Oznh85ydNHBjB6+7AyGQy+R+vfZdKpXre1QA+zHK5XDqdTqVS/bKr\nbDbbL7sa6AphZzXycrmcpRjMevju93DVAH5gpXe6++7nfzDFYrGdXuvACF53B0Y2m+3HsOv5\nBgP4MIvH41VVVcOHD+/7rtLpdFtbW7/saqDLn6srKyuzGtGfq85SDGbdffc7Ozt7ODAyRZuH\nvUR33/1kMllVVZVIJHZ6rQMjeN0dGC0tLWVlZRUVFX2/i1Qq1d2/HPK8xg4AIBDCDgAgEMIO\nACAQwg4AIBDCDgAgEMIOACAQwg4AIBDCDgAgEMIOACAQwg4AIBDCDgAgEMIOACAQwg4AIBDC\nDgAgEMIOACAQwg4AIBDCDgAgEMIOACAQwg4AIBDCDgAgEMIOACAQwg4AIBDCDgAgEMIOACAQ\nwg4AIBDCDgAgEMIOACAQwg4AIBDCDgAgEMIOACAQwg4AIBDCDgAgEMIOACAQwg4AIBDCDgAg\nEMIOACAQwg4AIBDCDgAgEMIOACAQZaUeYACY+6uVpR6B4rr9hPNKPQIA9ANn7AAAAiHsAAAC\nIewAAAIh7AAAAiHsAAAC4V2xsId+uObhUo9A8XnHNDCgOGMHABAIYQcAEAhhBwAQCGEHABAI\nYQcAEAhhBwAQCGEHABAIYQcAEAhhBwAQCGEHABAIYQcAEAhhBwAQCGEHABAIYQcAEAhhBwAQ\nCGEHABCIslIPAACDws37XFrqESiuy0s9QOSMHQBAMIQdAEAghB0AQCC8xg4A3g/nbWkv9QiE\nT9gB9DOvkQ/e3vAaedgpT8UCAARC2AEABMJTsQD9zEupgFIRdrv2wzUPl3oEiuyE80o9ARC+\nRz93c6lHoLi+HB1f6hE8FQsAEAphBwAQCE/Fwh7ykRaDwZ59qoVn3IK3NzzjBjsl7GAPeYE8\nAHsbT8UCAARi7zpj19zcvGzZshdeeCGVSk2ZMqW+vn7MmDGlHgoAYGDYu8JuyZIlzc3NCxYs\nqKioWLly5aJFi2655ZZ4vMSnFd/JXFDaASi2fffoT3kd1WDgpVTAwLIXPRXb0NCwZs2aSy65\nZOLEiePHj6+vr9+0adO6detKPRcAwMCwF52xe/XVV8vLyydOnJi/OHz48AkTJrzyyivTp08v\n7WBOzATPWRkAwrAXhV0ymayuro7FYoUttbW1TU1NhYtPP/30ddddV7g4bNiwpqam4cOH9/2u\nc7lcLpfbunVr33fFQNTDtz6bzTowBrPuvvseMQa57r772Ww2mUy+z8Ow9+jhEaOjo6O1tbXv\nd5FKpbLZbA832IvCLoqirlW39zh1zLJSj/D+yeVy2Ww2FouV/KWNe79BdWBEUZR/KHFg9Mag\nOjay2Wwul0skEqUeZAAYhAdGPB7fO3+yB2wvCru6urpkMpnL5QoHQVNT04gRIwo3mDlz5r33\n3lu4OHfu3Nra2q432GPpdLqtra26urrvuxrostlsY2NjeXl5TU1NqWcpvVwut23btn45xgLQ\n2NgYi8WsRl5jY6OlyGtqakqlUnV1dX5+R1GUTCaHDRsmc6Moam5ubm9vr6mpKSvbi0qjVFpa\nWsrKyioqKvq+q1Qq1fM/sPeif3xPnjw5lUqtX78+fzGZTG7YsGHatGmlnQoAYKDYi8Ju5MiR\nxx577G233fb6669v2rRp8eLFkyZNOvTQQ0s9FwDAwLB3nSCdN2/esmXLFi5cmMlkDjvssGuu\nuca5fQCAXtq7wq6qqmr+/PmlngIAYEDai56KBQCgL4QdAEAghB0AQCCEHQBAIIQdAEAghB0A\nQCCEHQBAIIQdAEAghB0AQCCEHQBAIIQdAEAghB0AQCCEHQBAIIQdAEAghB0AQCCEHQBAIIQd\nAEAghB0AQCCEHQBAIIQdAEAghB0AQCCEHQBAIIQdAEAghB0AQCCEHQBAIIQdAEAghB0AQCCE\nHQBAIMpKPUCf3HPPPbW1tX3fTzabTaVSFRUVfd/VQJfL5VpbW8vKyqxGFEW5XK69vb2ysrLU\ng+wVWltbY7GY1chrbW2tqqoq9RR7hfb29kwmU1VVFYvFSj1L6XV0dJSXl8fjTppEnZ2dqVSq\nsrLSakRR1NnZGY/Hy8r6IboymUzPN4jlcrm+301JPPHEEw0NDf2yq1wul81mE4lEv+xtQOvo\n6HjooYdGjx794Q9/uNSz7BXS6XS//FUMwOrVq8vKyj72sY+VepC9ggOj4KmnnmpsbPz0pz/t\n53cURel0OpFIaNwoitatW/d//+//Pf744/vl/MtAl81moyjqr78jw4cPP+WUU7q7dgCHHcWw\nbdu2WbNmnXDCCYsXLy71LOxdTjnllMrKynvvvbfUg7B3mTt37jPPPPOb3/xmyJAhpZ6FvcgN\nN9zw85///Kc//enUqVNLPcvg4h9YAACBEHYAAIEQdgAAgfAaOwCAQDhjBwAQCGEHABAIYQcA\nEAgfsDnYNTY2Ll++/Pnnn+/s7DzooIMuuOCCQw45JIqi5ubmZcuWvfDCC6lUasqUKfX19WPG\njCn1sLx/NmzYsGLFipdeeimXy02cOPErX/lK/sOoHBjkPfzwwzfffPM3v/nNmTNnRg6MQW/e\nvHlvvPFG4eLQoUP/9V//NXJglII3Twx2l19++ZAhQy655JLKysqVK1euXbv2xz/+8dChQ7/7\n3e82NzfPnTu3oqJi5cqVb7zxxi233OKT5QeJdDp98cUXT58+/Ytf/GI8Hl+1atVvf/vb5cuX\nV1ZWOjCIomjbtm3z5s1rbW294oor8mHnwBjkLrzwws9//vP5gyGKong8PnLkyMiBUQoWd1Db\nvn376NGjv/71rx900EHjxo2bPXt2MpncsGFDQ0PDmjVrLrnkkokTJ44fP76+vn7Tpk3r1q0r\n9by8T1paWs4444z6+voPfOAD48aNO+ecc1paWt5++20HBnlLly49+eSTC78t14HB9u3b9913\n31F/lq86B0ZJCLtBrbq6+uqrr95vv/3yF9999914PD5q1KhXX321vLx84sSJ+e3Dhw+fMGHC\nK6+8UrpJeV/V1taeddZZlZWVURRt3779P/7jPyZMmLDffvs5MIii6Kmnnlq/fv15551X2OLA\nGORSqVRHR8dTTz01f/78iy666Lrrrtu0aVPkwCgRr7Hj/7N9+/Yf/OAHZ5555ogRI5LJZHV1\nddffY11bW9vU1FTC8Xj/ZbPZc845J5VKHX744ddee215ebkDg+bm5qVLl1522WVDhw4tbHRg\nDHKtra11dXXpdPprX/taFEV33nnn1Vdf/U//9E8OjJIQdkRRFG3cuPHaa6898sgj58yZk9/S\n9a8ig1M8Hr/55pu3bt36y1/+8pvf/OZNN90UOTAGvX/+53+eMWPGkUceucN2B8ZgVltb+y//\n8i+Fi1deeeWcOXN+85vfRA6MUvBULNHzzz//t3/7t5/97GcvvfTS/F/Curq6ZDLZ9Y01TU1N\nI0aMKN2MlMaECROOOOKIK6+8sqmp6fHHH3dgDHLPPffcs88+e+GFF+6w3YFBV5WVlaNHj25o\naHBglISwG+z+8Ic/3HDDDZdffvlnPvOZwsbJkyenUqn169fnL+bfUTFt2rQSzcj7be3atZdc\ncklHR0f+YiwWKysrixwYg97q1atbWlrq6+vPP//8888/v6mpafHixdddd50DY5B78803b731\n1nQ6nb/Y3t7+zjvv7Lvvvg6MkkgsXLiw1DNQMp2dnd/+9rdPPfXUGTNmtP5ZPB6vrq5+8803\nH3300SlTprS2tv7whz8cNmzY+eef76T6IFFdXX3vvfe+9tprBxxwQFtb21133fXKK69cfPHF\no0ePdmAMZh/84Ac/3cVjjz12wQUXnHXWWXV1dQ6MwSyRSCxdunTTpk0HHnhgU1PT7bff3tzc\nfOmll/pRUhI+x25Qe/755//u7/5uh41z5849/fTTW1tbly1btnbt2kwmc9hhh9XX1zt/Pqi8\n+eabd9xxxx/+8IdYLLb//vv/xV/8xfTp06MocmBQMHv27K997Wv5jy5zYAxyr7322h133JF/\nG+yUKVO++tWvjh07NnJglIKwAwAIhNfYAQAEQtgBAARC2AEABELYAQAEQtgBAARC2AEABELY\nAQAEQtgBe27hwoWxWGzMmDGpVOq911588cWxWOz444/fs52fe+65w4cP780tjz/++KlTp3Z3\nbUNDw/e+972jjjpq1KhR5eXlY8aMOfXUU//7v/+7cIOZM2f28Mf74t133z3wwAMvuuiiwpZf\n/OIXX/ziF/Nfv/POO+PHjy/G/e6g9yvZnWuuuWafffZ54403+mkioFjKSj0AMLDF4/HGxsZf\n/vKXZ555ZtftbW1tP//5z8vLy0s1WF5jY+MxxxyzZcuWCy+88PLLL08kEuvXr1++fPlpp532\ns5/97Nxzz42i6Nxzz21ra+v3u85ms+edd15tbe2tt95a2Pjss89+6EMfeu/Xe7nvfOc7v/nN\nb84+++xf//rXFRUVpR4H6JawA/okHo9/+MMfvuOOO3YIu3vuuaetrS3/i8hKaMWKFW+88cZd\nd931pS99qbDxa1/72hFHHHHVVVd98YtfjMfj8+fPL8Zdr1y58sEHH3zssccqKysLG5955pnC\n3T377LMzZswoxl33u0Qicdtttx1++OG33nrr3/zN35R6HKBbnooF+iSdTn/mM5+57777/vSn\nP3XdvmLFio997GM7nN25//77TzzxxOrq6srKysMPP/z73/9+4bca5nK5RYsW7bfffkOHDj3i\niCPuvvvuHe7o8ccf/+QnP1lTU1NVVTVjxozly5f3Zry33347iqKjjjqq68YRI0Y8/fTTL730\nUjwej7o8Ffu73/0utjO///3vd3eGTCZz7bXXnnjiiSeddFLX7V1jroewO/HEE0844YS1a9d+\n4hOfqKmpGTNmzJe//OUtW7YUblCklXz77be/+tWvHnDAAUOHDt13332/8IUvvPzyy/mrpk2b\ndvbZZ//DP/xDS0tLd//XQOnlAPbUggULoih69dVX4/H4P/7jPxa2b9y4MR6PL1++fObMmccd\nd1x+4z333BOLxU499dR///d/f+ihhy6//PIoir7xjW/kr73hhhuiKDr//PNXr169atWqww8/\nfMqUKcOGDctf+9BDDyUSiRNPPPE///M/H3zwwfr6+iiKCvd43HHHTZkyZacT3nnnnVEUnXXW\nWVu3bu3u/+IjH/lI/o8nk8nVXfzXf/3X6NGjJ0yYsG3btl3OsIPHH388iqLly5fnL954440V\nFRX5zK34s1gslv9i48aNO/zxT3ziE/vtt98xxxyzevXqP/3pT3fffXcikZgzZ06xV3LmzJn7\n7rvvj3/840ceeeRnP/vZEUccMWbMmJaWlvy1v/zlL6MoWrVqVXcrCZScsAP2XD7s2traZs2a\nddhhhxW2X3/99ZWVlclk8iMf+Ugh7KZOnbr//vt3dHQUbnbmmWeWl5c3NDRks9nx48cffvjh\nhaveeuut8vLyQo586EMfOvjggwuFkcvlPve5z1VXV7e1teV6DLtMJpN/s0JFRcVpp512ww03\nPP3005lMputtCmG3gwsuuKCiouK3v/1tb2bYwd/93d9FUbRDsd19992f//zn819v3rx5/Pjx\nO505l8t94hOfiKLoySef7LqlcPsirWRTU1MURVdddVXhqj/+8Y/f+973Nm3alL/Y0tIyZMiQ\niy66qLuxgZLzVCzQD/7yL//yxRdfXLNmTf7iihUrzjzzzOrq6sIN3nrrrZdffvm0004bMmRI\nYeNnP/vZVCr19NNPb9iw4a233vr4xz9euGrcuHFHH310/ustW7asXbv29NNPj8fj7X922mmn\nbd++fd26dT0PFo/HV61a9cADD3zhC1947rnn/vZv/3bmzJljx469+uqrW1tbe/iD//RP/3TH\nHXfceuutH/7wh/dghmeffXbs2LEf+MAHum789a9/XXiP8K9//euPfvSjPQxQVVV13HHHFS5O\nmDBh8+bNUTFXsrKycp999rnzzjsffvjhbDYbRdGkSZOuvvrqwlt3q6qqpk6d+swzz/QwNlBa\nwg7oB2eddVZ1dfUdd9wRRdGaNWteeuml2bNnd73Bpk2boijaIXTGjRsXRdFbb72VT5bRo0d3\nvbbQE2+99VYURTfffHNlF/nnEDdu3Nib8T71qU/97Gc/27Rp0/r163/0ox9Nmzbt+uuvnzVr\nVj5f3uupp56aP3/+JZdccvHFF+/ZDO+8886oUaN22Pjkk08WWu3JJ5/sOex2WI2ysrL8tMVb\nyfLy8nvvvTcej8+aNWvMmDFnn332ypUr0+l0112NGjWqoaGhh7GB0vKuWKAfVFVVnXPOOXfe\neef3v//9FStWjBs37pOf/GTXG8RisSiKdgipXC4XRVE8Hs/9+YX/XWUyma4XL7zwwq9+9as7\n3Obggw/erTkPOuiggw466KKLLrr44ouXL1/+5JNPnnjiiTvcZvPmzWefffaHPvShH/zgBztc\n1fsZksnkyJEjCxcnTJjQ0NDQ0dFRuLvOzs7y8vKrr776vPPO6+UbQfKKupLHHXfcq6+++vjj\nj99///333Xff+eefv3jx4ieeeKLwxt66urpt27b1flrgfSbsgP4xZ86c5cuXP/jgg6tWrZoz\nZ04ikeh67YQJE6I/n20qyF+cMGFC/gxT/mxTQeHjcPfff/8oijKZzMyZM3drpI6OjrvvvnvY\nsGE7fBRLLBY76aSTli9fvmHDhh3+SCqV+uIXv5jJZP7t3/6t63OduztDTU1N/iVreRs3bnzq\nqaeuvPLKX/3qV1EUpdPpESNGNDQ07MFnwhV7JROJxMc//vGPf/zjN974/9q7v1Dm/jgO4Oes\n7ZA/U/JnkYiSC+NwoRS50I5c6SjFzZS0MrRyIRfmT7uyJzcoUqjdLAcjrbXWilJ2M2MXhDJX\nipxwNWJ2notT67Sf/PKwZ5zn/bo6++6c9tn3Yn36fHY+59f8/LzRaOQ4rru7W3z34eEhKyvr\nozEDwF+DViwAfI3GxsbS0lKLxcLzfFwfliAIjUZTWVnpdDqfnp5iiw6HIy0trb6+vqSkJCcn\nx+12xwpR5+fnwWBQPM7Ozq6rq9va2pLWimw22+joaFyjMA5FUZOTkwaDIRQKSddfX1/X1tYI\ngqiqqoq7ZGhoyOfzcRwX1+v8aAy5ublxLcujoyOapsXjk5OTsrKyP5v0m7idPDg46OzslA5V\nYRiGIIjb29vYCs/zcX1eAPhWkNgBwNcgSVKv1/v9/urq6v8mTARBTE1NXV9ft7W1bW9vu91u\no9HodrvNZrNarVYoFH19fRcXFx0dHQ6HY2FhgWEY6Yw3q9UaDoebmppsNpvH4zGbzb29vVdX\nV0rle20HkiQXFxcfHx9pmjYYDDMzM0tLSxaLpba21ul0Dg4OarVa6fkcx83NzbW3tz8/P3sl\nxLzwQzHQNH1zcyOtq0kTu8PDw8+MJk7QThYWFrpcLp1Ot7y87PV6V1dX9Xq9Wq1mWVa8NhwO\nn52d/ZSnZQD8o5J7Uy4A/GixcSfiy1AoRJLk9PR07ATpuBNBEDweT0NDQ3p6ekpKSk1NTWzM\nmyAIkUhkZGREo9FQFKXVajc3NwcGBiiKip2wt7en0+kyMzNVKlV5ebnVan15eRHfemfciSAI\nx8fHPT09YoVMqVTm5+e3traur69LgxQvN5lMb/5Ojo+P/28McXZ2dgiCWFlZkX6K3+8Xj00m\n0+zs7Dsb29zcXFxcLF0RHzib6J0MBoMsy+bl5alUqoKCApZlA4FA7EKXy0UQhN1ufydyAEgu\nUnjrn7YAAPAZkUikoqKiqKhIzPDkoaury+v1Xl5eZmRkJDsWAHgbWrEAAF9PqVSOjY3t7u6K\nd0vIwOnpKcdxw8PDyOoAvjNU7AAAEiIajba0tPA87/P5UlNTkx3Op0SjUYZh7u7u9vf3f/p3\nAZA3VOwAABJCoVDY7fb7+/v+/v5kx/JZExMTgUBgY2MDWR3AN4eKHQAAAIBMoGIHAAAAIBNI\n7AAAAABkAokdAAAAgEwgsQMAAACQCSR2AAAAADKBxA4AAABAJpDYAQAAAMjEb/85njrbF1HE\nAAAAAElFTkSuQmCC", "text/plain": [ "plot without title" ] @@ -312,7 +351,10 @@ "source": [ "FamilyTreeRQ2Raw <- rbind(\n", "# Load10Log(\"measurements/stats/FamilyTree//size010to-1r10n10rt300nsdrealstats_06-0249.csv\", 10),\n", - " Load10Log(\"measurements1/stats.csv\", 20)\n", + " Load10Log(\"measurements1/stats1010.csv\", 20),\n", + " Load10Log(\"measurements1/stats1515.csv\", 30),\n", + " Load10Log(\"measurements1/stats2020.csv\", 40),\n", + " Load10Log(\"measurements1/stats2525.csv\", 50)\n", ")\n", "FamilyTreeRQ2Raw\n", "FamilyTreeRQ2 <- FamilyTreeRQ2Raw %>% ProcessRQ2\n", diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/plots/plot_RQ2_FamilyTree.pdf b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/plots/plot_RQ2_FamilyTree.pdf index 51da9fe0..c6cda90a 100644 Binary files a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/plots/plot_RQ2_FamilyTree.pdf and b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/plots/plot_RQ2_FamilyTree.pdf differ -- cgit v1.2.3-54-g00ecf