aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Aren Babikian <aren.babikian@mail.mcgill.ca>2021-01-20 08:44:27 +0100
committerLibravatar Aren Babikian <aren.babikian@mail.mcgill.ca>2021-01-20 08:44:27 +0100
commit41a48543aea119acae321aae61b85d711610b652 (patch)
treeda29d1d172eaaa4c9744d77851966b727720ce06
parentadd Actor+CollisionExists constrs & adjust dreal parser & measurements (diff)
downloadVIATRA-Generator-41a48543aea119acae321aae61b85d711610b652.tar.gz
VIATRA-Generator-41a48543aea119acae321aae61b85d711610b652.tar.zst
VIATRA-Generator-41a48543aea119acae321aae61b85d711610b652.zip
almost finish crossscen VQL + implement ITE handling + prelim results
-rw-r--r--Domains/crossingScenario/.gitignore9
-rw-r--r--Domains/crossingScenario/inputs/crossingScenarioGen.vsconfig14
-rw-r--r--Domains/crossingScenario/plugin.xml5
-rw-r--r--Domains/crossingScenario/queries/crossingScenarioQueries.vql277
-rw-r--r--Domains/crossingScenario/results-prelim/plot_RQ2_FamilyTree.pdfbin0 -> 4775 bytes
-rw-r--r--Domains/crossingScenario/results-prelim/stats1010.csv3
-rw-r--r--Domains/crossingScenario/results-prelim/stats1515.csv3
-rw-r--r--Domains/crossingScenario/results-prelim/stats2020.csv3
-rw-r--r--Domains/crossingScenario/results-prelim/stats2525.csv3
-rw-r--r--Domains/crossingScenario/src/crossingScenario/run/CrossingScenarioMain.java14
-rw-r--r--Domains/crossingScenario/src/queries/queries.vql10
-rw-r--r--Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/ExpressionEvaluation2Logic.xtend38
-rw-r--r--Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/NumericDrealProblemSolver.java83
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasonerConfiguration.xtend2
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/NumericSolver.xtend3
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.run/MODELS2020Plots-temp.ipynb92
-rw-r--r--Tests/MODELS2020-CaseStudies/case.study.pledge.run/plots/plot_RQ2_FamilyTree.pdfbin4542 -> 4775 bytes
17 files changed, 366 insertions, 193 deletions
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 @@
1/bin/ 1/bin/
2/outputs/ 2/outputs/
3/src-gen/ 3/src-gen/
4/xtend-gen/ 4/xtend-gen/
5/src/queries/
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 {
7 partial-model = { "inputs/crossingScenarioInit.xmi"} 7 partial-model = { "inputs/crossingScenarioInit.xmi"}
8 solver = ViatraSolver 8 solver = ViatraSolver
9 scope = { 9 scope = {
10 #node = 10..100, 10 #node = 2..*
11 #int = {}, 11 //,
12 #<Lane> = 10..25, 12 //#<Lane> = 25..*
13 #<Actor> = 10..25, 13 //,#<Actor> = 25..*
14 #<CollisionExists> = 1..10//, 14 //,#<CollisionExists> = 1..10
15 //#<Relation> = 1..10 15 //,#<SeparationDistance> = 1..10
16 //,#<VisionBlocked> = 1..10
17 //,#<Relation> = 1..10
16 } 18 }
17 19
18 config = { 20 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 @@
4 <!-- @generated crossingScenario --> 4 <!-- @generated crossingScenario -->
5 <package class="crossingScenario.CrossingScenarioPackage" genModel="model/crossingScenario.genmodel" uri="http://www.example.com/crossingScenario"/> 5 <package class="crossingScenario.CrossingScenarioPackage" genModel="model/crossingScenario.genmodel" uri="http://www.example.com/crossingScenario"/>
6 </extension> 6 </extension>
7 <extension id="queries.Queries" point="org.eclipse.viatra.query.runtime.queryspecification">
8 <group group="org.eclipse.viatra.query.runtime.extensibility.SingletonExtensionFactory:queries.Queries" id="queries.Queries">
9 <query-specification fqn="queries.x"/>
10 </group>
11 </extension>
7</plugin> 12</plugin>
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
424 check((xPos1 + (xSpeed1 * cTime)) + (w1/2) < (xPos2 + (xSpeed2 * cTime)) - (w2/2)); 424 check((xPos1 + (xSpeed1 * cTime)) + (w1/2) < (xPos2 + (xSpeed2 * cTime)) - (w2/2));
425} 425}
426 426
427//////////////// 427//////////////
428////SeparationDistance 428//SeparationDistance
429//////////////// 429//////////////
430//@Constraint(severity="error", key={a1, sd}, message="x") 430@Constraint(severity="error", key={a1, sd}, message="x")
431//pattern SeparationDistance_near_lb(a1:Actor, a2:Actor, sd:SeparationDistance) { 431pattern SeparationDistance_near_lb(a1:Actor, a2:Actor, sd:SeparationDistance) {
432// //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1 432 //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1
433// Actor.relations(a1, sd); 433 Actor.relations(a1, sd);
434// SeparationDistance.target(sd, a2); 434 SeparationDistance.target(sd, a2);
435// SeparationDistance.distance(sd, Distance::Near); 435 SeparationDistance.distance(sd, Distance::D_Near);
436// 436
437// Actor.xPos(a1, x1); 437 Actor.xPos(a1, x1);
438// Actor.yPos(a1, y1); 438 Actor.yPos(a1, y1);
439// Actor.xPos(a2, x2); 439 Actor.xPos(a2, x2);
440// Actor.yPos(a2, y2); 440 Actor.yPos(a2, y2);
441// //check(dx^2 + dy^2 < 5^2) 441 //check(dx^2 + dy^2 < 5^2)
442// check((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) < 5*5); 442 check((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) < 5*5);
443//} 443}
444// 444
445//@Constraint(severity="error", key={a1, sd}, message="x") 445@Constraint(severity="error", key={a1, sd}, message="x")
446//pattern SeparationDistance_near_ub(a1:Actor, a2:Actor, sd:SeparationDistance) { 446pattern SeparationDistance_near_ub(a1:Actor, a2:Actor, sd:SeparationDistance) {
447// //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1 447 //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1
448// Actor.relations(a1, sd); 448 Actor.relations(a1, sd);
449// SeparationDistance.target(sd, a2); 449 SeparationDistance.target(sd, a2);
450// SeparationDistance.distance(sd, Distance::Near); 450 SeparationDistance.distance(sd, Distance::D_Near);
451// 451
452// Actor.xPos(a1, x1); 452 Actor.xPos(a1, x1);
453// Actor.yPos(a1, y1); 453 Actor.yPos(a1, y1);
454// Actor.xPos(a2, x2); 454 Actor.xPos(a2, x2);
455// Actor.yPos(a2, y2); 455 Actor.yPos(a2, y2);
456// //check(dx^2 + dy^2 > 10^2) 456 //check(dx^2 + dy^2 > 10^2)
457// check((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) > 10*10); 457 check((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) > 10*10);
458//} 458}
459// 459
460//@Constraint(severity="error", key={a1, sd}, message="x") 460@Constraint(severity="error", key={a1, sd}, message="x")
461//pattern SeparationDistance_medium_lb(a1:Actor, a2:Actor, sd:SeparationDistance) { 461pattern SeparationDistance_medium_lb(a1:Actor, a2:Actor, sd:SeparationDistance) {
462// //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1 462 //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1
463// Actor.relations(a1, sd); 463 Actor.relations(a1, sd);
464// SeparationDistance.target(sd, a2); 464 SeparationDistance.target(sd, a2);
465// SeparationDistance.distance(sd, Distance::Medium); 465 SeparationDistance.distance(sd, Distance::D_Med);
466// 466
467// Actor.xPos(a1, x1); 467 Actor.xPos(a1, x1);
468// Actor.yPos(a1, y1); 468 Actor.yPos(a1, y1);
469// Actor.xPos(a2, x2); 469 Actor.xPos(a2, x2);
470// Actor.yPos(a2, y2); 470 Actor.yPos(a2, y2);
471// //check(dx^2 + dy^2 < 10^2) 471 //check(dx^2 + dy^2 < 10^2)
472// check((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) < 10*10); 472 check((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) < 10*10);
473//} 473}
474// 474
475//@Constraint(severity="error", key={a1, sd}, message="x") 475@Constraint(severity="error", key={a1, sd}, message="x")
476//pattern SeparationDistance_medium_ub(a1:Actor, a2:Actor, sd:SeparationDistance) { 476pattern SeparationDistance_medium_ub(a1:Actor, a2:Actor, sd:SeparationDistance) {
477// //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1 477 //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1
478// Actor.relations(a1, sd); 478 Actor.relations(a1, sd);
479// SeparationDistance.target(sd, a2); 479 SeparationDistance.target(sd, a2);
480// SeparationDistance.distance(sd, Distance::Medium); 480 SeparationDistance.distance(sd, Distance::D_Med);
481// 481
482// Actor.xPos(a1, x1); 482 Actor.xPos(a1, x1);
483// Actor.yPos(a1, y1); 483 Actor.yPos(a1, y1);
484// Actor.xPos(a2, x2); 484 Actor.xPos(a2, x2);
485// Actor.yPos(a2, y2); 485 Actor.yPos(a2, y2);
486// //check(dx^2 + dy^2 > 1^2) 486 //check(dx^2 + dy^2 > 1^2)
487// check((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) > 15*15); 487 check((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) > 15*15);
488//} 488}
489// 489
490//@Constraint(severity="error", key={a1, sd}, message="x") 490@Constraint(severity="error", key={a1, sd}, message="x")
491//pattern SeparationDistance_far_lb(a1:Actor, a2:Actor, sd:SeparationDistance) { 491pattern SeparationDistance_far_lb(a1:Actor, a2:Actor, sd:SeparationDistance) {
492// //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1 492 //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1
493// Actor.relations(a1, sd); 493 Actor.relations(a1, sd);
494// SeparationDistance.target(sd, a2); 494 SeparationDistance.target(sd, a2);
495// SeparationDistance.distance(sd, Distance::Far); 495 SeparationDistance.distance(sd, Distance::D_Far);
496// 496
497// Actor.xPos(a1, x1); 497 Actor.xPos(a1, x1);
498// Actor.yPos(a1, y1); 498 Actor.yPos(a1, y1);
499// Actor.xPos(a2, x2); 499 Actor.xPos(a2, x2);
500// Actor.yPos(a2, y2); 500 Actor.yPos(a2, y2);
501// //check(dx^2 + dy^2 < 15^2) 501 //check(dx^2 + dy^2 < 15^2)
502// check((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) < 15*15); 502 check((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) < 15*15);
503//} 503}
504// 504
505//////////////// 505////////////////
506////CollisionDoesNotExist 506////CollisionDoesNotExist
507//////////////// 507////////////////
508// 508//TODO
509////@Constraint(severity="error", key={a1, cdne}, message="x") 509////@Constraint(severity="error", key={a1, cdne}, message="x")
510////pattern collisionDoesNotExist(a1:Actor, a2:Actor, ss:CrossingScenario, cdne:CollisionDoesNotExist) { 510////pattern collisionDoesNotExist(a1:Actor, a2:Actor, ss:CrossingScenario, cdne:CollisionDoesNotExist) {
511//// //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1 511//// //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
532//// //check(dx^2 + dy^2 < 15^2) 532//// //check(dx^2 + dy^2 < 15^2)
533//// check((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) < 15*15); 533//// check((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) < 15*15);
534////} 534////}
535// 535
536//////////////// 536//////////////
537////VisionBlocked 537//VisionBlocked
538//////////////// 538//////////////
539// 539
540////OPTIONS 1: everything is from a single check expression containing ITEs 540@Constraint(severity="error", key={a1, a2}, message="x")
541////Currently unhandled bygenerator 541pattern visionBlocked_invalidBlocker(a1:Actor, a2:Actor) {
542//@Constraint(severity="error", key={a1, vb}, message="x") 542 Actor.relations(a1, vb);
543//pattern visionBlocked_ites_top(a1:Actor, a2:Actor, vb:VisionBlocked) { 543 VisionBlocked.target(vb, a2);
544// //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1 544 VisionBlocked.blockedBy(vb, a1);
545// Actor.relations(a1, vb); 545} or {
546// VisionBlocked.target(vb, a2); 546 Actor.relations(a1, vb);
547// VisionBlocked.blockedBy(vb, aBlocker); 547 VisionBlocked.target(vb, a2);
548// 548 VisionBlocked.blockedBy(vb, a1);
549// Actor.xPos(a1, x1); 549}
550// Actor.yPos(a1, y1); 550
551// Actor.xPos(a2, x2); 551//OPTIONS 1: everything is from a single check expression containing ITEs
552// Actor.yPos(a2, y2); 552//Currently unhandled bygenerator
553// Actor.xPos(aBlocker, xBlocker); 553@Constraint(severity="error", key={a1, vb}, message="x")
554// Actor.yPos(aBlocker, yBlocker); 554pattern visionBlocked_ites_top(a1:Actor, a2:Actor, vb:VisionBlocked) {
555// Actor.length(aBlocker, lenBlocker); 555 //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1
556// Actor.width(aBlocker, widBlocker); 556 Actor.relations(a1, vb);
557// 557 VisionBlocked.target(vb, a2);
558// //check(slope of a1-to-BlockerTop < slope of a1-to-a2) 558 VisionBlocked.blockedBy(vb, aBlocker);
559// check( 559
560// ( yBlocker - y1 + (if(xBlocker > x1){lenBlocker/2}else{0-lenBlocker/2})) / 560 Actor.xPos(a1, x1);
561// ( xBlocker - x1 + (if(yBlocker > y1){0-widBlocker/2}else{widBlocker/2})) 561 Actor.yPos(a1, y1);
562// < ((y1-y2)/(x1-x2))); 562 Actor.xPos(a2, x2);
563//} 563 Actor.yPos(a2, y2);
564// 564 Actor.xPos(aBlocker, xBlocker);
565//@Constraint(severity="error", key={a1, vb}, message="x") 565 Actor.yPos(aBlocker, yBlocker);
566//pattern visionBlocked_ites_bottom(a1:Actor, a2:Actor, vb:VisionBlocked) { 566 Actor.length(aBlocker, lenBlocker);
567// //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1 567 Actor.width(aBlocker, widBlocker);
568// Actor.relations(a1, vb); 568
569// VisionBlocked.target(vb, a2); 569 //check(slope of a1-to-BlockerTop < slope of a1-to-a2)
570// VisionBlocked.blockedBy(vb, aBlocker); 570 check(
571// 571 ( yBlocker - y1 + (if(xBlocker > x1){lenBlocker/2}else{0-lenBlocker/2})) /
572// Actor.xPos(a1, x1); 572 ( xBlocker - x1 + (if(yBlocker > y1){0-widBlocker/2}else{widBlocker/2}))
573// Actor.yPos(a1, y1); 573 < ((y1-y2)/(x1-x2)));
574// Actor.xPos(a2, x2); 574}
575// Actor.yPos(a2, y2); 575
576// Actor.xPos(aBlocker, xBlocker); 576@Constraint(severity="error", key={a1, vb}, message="x")
577// Actor.yPos(aBlocker, yBlocker); 577pattern visionBlocked_ites_bottom(a1:Actor, a2:Actor, vb:VisionBlocked) {
578// Actor.length(aBlocker, lenBlocker); 578 //This second one is required because we do not want to enforce both a1->c->a2 and a2->c->a1
579// Actor.width(aBlocker, widBlocker); 579 Actor.relations(a1, vb);
580// 580 VisionBlocked.target(vb, a2);
581// //check(slope of a1-to-BlockerBottom > slope of a1-to-a2) 581 VisionBlocked.blockedBy(vb, aBlocker);
582// check( 582
583// ( yBlocker - y1 + (if(xBlocker > x1){0-lenBlocker/2}else{lenBlocker/2})) / 583 Actor.xPos(a1, x1);
584// ( xBlocker - x1 + (if(yBlocker > y1){widBlocker/2}else{0-widBlocker/2})) 584 Actor.yPos(a1, y1);
585// > ((y1-y2)/(x1-x2))); 585 Actor.xPos(a2, x2);
586//} 586 Actor.yPos(a2, y2);
587// 587 Actor.xPos(aBlocker, xBlocker);
588 Actor.yPos(aBlocker, yBlocker);
589 Actor.length(aBlocker, lenBlocker);
590 Actor.width(aBlocker, widBlocker);
591
592 //check(slope of a1-to-BlockerBottom > slope of a1-to-a2)
593 check(
594 ( yBlocker - y1 + (if(xBlocker > x1){0-lenBlocker/2}else{lenBlocker/2})) /
595 ( xBlocker - x1 + (if(yBlocker > y1){widBlocker/2}else{0-widBlocker/2}))
596 > ((y1-y2)/(x1-x2)));
597}
598
599
600
588////OPTION 2: 601////OPTION 2:
589////we handle ITE by seperating the constraints 602////we handle ITE by seperating the constraints
590// 603//
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
--- /dev/null
+++ b/Domains/crossingScenario/results-prelim/plot_RQ2_FamilyTree.pdf
Binary files 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 @@
1Task,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
21,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
3
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 @@
1Task,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
21,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
3
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 @@
1Task,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
21,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
3
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 @@
1Task,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
21,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
3
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;
3import java.awt.Desktop; 3import java.awt.Desktop;
4import java.io.File; 4import java.io.File;
5import java.io.IOException; 5import java.io.IOException;
6import java.nio.file.CopyOption;
6import java.nio.file.Files; 7import java.nio.file.Files;
7import java.nio.file.Path; 8import java.nio.file.Path;
8import java.nio.file.Paths; 9import java.nio.file.Paths;
10import java.nio.file.StandardCopyOption;
9import java.util.List; 11import java.util.List;
10 12
11import hu.bme.mit.inf.dslreasoner.application.execution.StandaloneScriptExecutor; 13import hu.bme.mit.inf.dslreasoner.application.execution.StandaloneScriptExecutor;
@@ -26,7 +28,12 @@ public class CrossingScenarioMain {
26 if (errorMessages != null) { 28 if (errorMessages != null) {
27 System.out.println(errorMessages); 29 System.out.println(errorMessages);
28 } 30 }
29 Path path = Paths.get("outputs/statistics.csv"); 31
32
33 Path path = Paths.get("outputs/statistics.csv");
34 Path target = Paths.get("../..//Tests/MODELS2020-CaseStudies/case.study.pledge.run/measurements1/stats.csv");
35 Files.copy(path, target, StandardCopyOption.REPLACE_EXISTING);
36
30 List<String> content = Files.readAllLines(path); 37 List<String> content = Files.readAllLines(path);
31 String[] times = content.get(1).split(","); 38 String[] times = content.get(1).split(",");
32 System.out.println("STATISTICS"); 39 System.out.println("STATISTICS");
@@ -45,7 +52,10 @@ public class CrossingScenarioMain {
45 52
46 String p1 = "outputs/models/1.xmi"; 53 String p1 = "outputs/models/1.xmi";
47 String p2 = "outputs/simplePrevLane.tgf"; 54 String p2 = "outputs/simplePrevLane.tgf";
48 QueryDebug.checkPrevLanes(p1, p2); 55// QueryDebug.checkPrevLanes(p1, p2);
49// Desktop.getDesktop().open(new File(p2)); 56// Desktop.getDesktop().open(new File(p2));
57 System.gc();
58 System.gc();
59 System.gc();
50 } 60 }
51} 61}
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 @@
1package queries
2
3import "http://www.example.com/crossingScenario"
4import "http://www.eclipse.org/emf/2002/Ecore"
5
6/////////pedestrian-width (4) //TODO Derived?
7pattern x(p:Pedestrian) {
8 Pedestrian.length(p, l);
9 check(l != 1.0);
10} \ 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 @@
1package hu.bme.mit.inf.dslreasoner.viatra2logic 1package hu.bme.mit.inf.dslreasoner.viatra2logic
2 2
3import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder 3import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder
4import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.IfThenElse
4import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Term 5import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Term
5import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Variable 6import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Variable
6import java.util.Map 7import java.util.Map
@@ -8,9 +9,11 @@ import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable
8import org.eclipse.xtext.xbase.XBinaryOperation 9import org.eclipse.xtext.xbase.XBinaryOperation
9import org.eclipse.xtext.xbase.XExpression 10import org.eclipse.xtext.xbase.XExpression
10import org.eclipse.xtext.xbase.XFeatureCall 11import org.eclipse.xtext.xbase.XFeatureCall
12import org.eclipse.xtext.xbase.XIfExpression
11import org.eclipse.xtext.xbase.XMemberFeatureCall 13import org.eclipse.xtext.xbase.XMemberFeatureCall
12import org.eclipse.xtext.xbase.XNumberLiteral 14import org.eclipse.xtext.xbase.XNumberLiteral
13import org.eclipse.xtext.xbase.XUnaryOperation 15import org.eclipse.xtext.xbase.XUnaryOperation
16import org.eclipse.xtext.xbase.XBlockExpression
14 17
15class ExpressionEvaluation2Logic { 18class ExpressionEvaluation2Logic {
16 val extension LogicProblemBuilder builder = new LogicProblemBuilder 19 val extension LogicProblemBuilder builder = new LogicProblemBuilder
@@ -139,6 +142,41 @@ class ExpressionEvaluation2Logic {
139 throw new UnsupportedOperationException('''Unsupported numeric type: "«s»"''') 142 throw new UnsupportedOperationException('''Unsupported numeric type: "«s»"''')
140 } 143 }
141 144
145 def protected dispatch Term transform(XIfExpression i, Map<PVariable, Variable> variable2Variable) {
146
147 val cond_op = i.^if.transform(variable2Variable)
148 val then_op = i.then.transform(variable2Variable)
149 val else_op = i.^else.transform(variable2Variable)
150
151 if (cond_op === null) {
152 println("-> " + i.^if)
153 println("-> " + i.then)
154 println("-> " + i.^else)
155 throw new UnsupportedOperationException('''Your ITE statement has a null condition.''')
156 }
157 if (then_op === null) {
158 println("-> " + i.^if)
159 println("-> " + i.then)
160 println("-> " + i.^else)
161 throw new UnsupportedOperationException('''Your ITE statement has a null "then" statement"".''')
162 }
163 return ITE(cond_op, then_op, else_op)
164 }
165
166 def protected dispatch Term transform(XBlockExpression b, Map<PVariable, Variable> variable2Variable) {
167 val exprs = newArrayList
168 for(e:b.expressions){ exprs.add(transform(e, variable2Variable)) }
169
170 if (exprs.size > 1)
171 throw new UnsupportedOperationException('''blocks with more than 1 statement are not currently supportes: "«exprs»"''')
172 if (exprs.isEmpty)
173 throw new UnsupportedOperationException('''blocks is empty: "«exprs»"''')
174
175 return exprs.get(0)
176 }
177
178
179
142 def protected dispatch Term transform(XExpression e, Map<PVariable, Variable> variable2Variable) { 180 def protected dispatch Term transform(XExpression e, Map<PVariable, Variable> variable2Variable) {
143 throw new UnsupportedOperationException('''Unsupported expression: "«e.class.simpleName»" - «e»''') 181 throw new UnsupportedOperationException('''Unsupported expression: "«e.class.simpleName»" - «e»''')
144 } 182 }
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;
20 20
21import org.eclipse.xtext.common.types.JvmIdentifiableElement; 21import org.eclipse.xtext.common.types.JvmIdentifiableElement;
22import org.eclipse.xtext.xbase.XBinaryOperation; 22import org.eclipse.xtext.xbase.XBinaryOperation;
23import org.eclipse.xtext.xbase.XBlockExpression;
23import org.eclipse.xtext.xbase.XExpression; 24import org.eclipse.xtext.xbase.XExpression;
24import org.eclipse.xtext.xbase.XFeatureCall; 25import org.eclipse.xtext.xbase.XFeatureCall;
26import org.eclipse.xtext.xbase.XIfExpression;
25import org.eclipse.xtext.xbase.XNumberLiteral; 27import org.eclipse.xtext.xbase.XNumberLiteral;
26import org.eclipse.xtext.xbase.XUnaryOperation; 28import org.eclipse.xtext.xbase.XUnaryOperation;
27 29
@@ -72,7 +74,7 @@ public class NumericDrealProblemSolver extends NumericProblemSolver{
72 //TODO timeout if needed 74 //TODO timeout if needed
73 if (!p.waitFor(timeout, TimeUnit.SECONDS)) { 75 if (!p.waitFor(timeout, TimeUnit.SECONDS)) {
74 p.destroy(); 76 p.destroy();
75 System.err.println("TIMEOUT"); //DEBUG 77 return null;
76 } 78 }
77 return p; 79 return p;
78 } 80 }
@@ -147,7 +149,7 @@ public class NumericDrealProblemSolver extends NumericProblemSolver{
147 } 149 }
148 150
149 private String formNumericConstraint(XExpression e, Map<JvmIdentifiableElement, PrimitiveElement> aMatch) throws Exception { 151 private String formNumericConstraint(XExpression e, Map<JvmIdentifiableElement, PrimitiveElement> aMatch) throws Exception {
150 //The check equation MUST be a binary operation 152 //The check equation MUST be a binary operation of the listed types (comparisons)
151 if (!(e instanceof XBinaryOperation)) { 153 if (!(e instanceof XBinaryOperation)) {
152 throw new Exception ("error in check expression!!!"); 154 throw new Exception ("error in check expression!!!");
153 } 155 }
@@ -159,19 +161,20 @@ public class NumericDrealProblemSolver extends NumericProblemSolver{
159 String left_operand = formNumericConstraintHelper(((XBinaryOperation) e).getLeftOperand(), aMatch); 161 String left_operand = formNumericConstraintHelper(((XBinaryOperation) e).getLeftOperand(), aMatch);
160 String right_operand = formNumericConstraintHelper(((XBinaryOperation) e).getRightOperand(), aMatch); 162 String right_operand = formNumericConstraintHelper(((XBinaryOperation) e).getRightOperand(), aMatch);
161 163
164 //NOTE that everything is inverted, due to how the MG handles vql constraints
162 if (nameEndsWith(name, N_LESSTHAN)) { 165 if (nameEndsWith(name, N_LESSTHAN)) {
163 operator = "<"; 166 operator = ">";
164 } else if (nameEndsWith(name, N_LESSEQUALSTHAN)) { 167 } else if (nameEndsWith(name, N_LESSEQUALSTHAN)) {
165 operator = "<="; 168 operator = ">=";
166 } else if (nameEndsWith(name, N_GREATERTHAN)) { 169 } else if (nameEndsWith(name, N_GREATERTHAN)) {
167 operator = ">"; 170 operator = "<";
168 } else if (nameEndsWith(name, N_GREATEREQUALTHAN)) { 171 } else if (nameEndsWith(name, N_GREATEREQUALTHAN)) {
169 operator = ">="; 172 operator = "<=";
170 } else if (nameEndsWith(name, N_EQUALS)) { 173 } else if (nameEndsWith(name, N_EQUALS)) {
171 operator = "<";
172 } else if (nameEndsWith(name, N_NOTEQUALS)) {
173 //Exceptional case 174 //Exceptional case
174 return "(not (=" + " " + left_operand + " " + right_operand + "))"; 175 return "(not (=" + " " + left_operand + " " + right_operand + "))";
176 } else if (nameEndsWith(name, N_NOTEQUALS)) {
177 operator = "=";
175// } else if (nameEndsWith(name, N_EQUALS3)) { 178// } else if (nameEndsWith(name, N_EQUALS3)) {
176// operator = "<"; 179// operator = "<";
177// } else if (nameEndsWith(name, N_NOTEQUALS3)) { 180// } else if (nameEndsWith(name, N_NOTEQUALS3)) {
@@ -240,6 +243,19 @@ public class NumericDrealProblemSolver extends NumericProblemSolver{
240 operator = "*"; 243 operator = "*";
241 } else if (nameEndsWith(name, N_DIVIDE)) { 244 } else if (nameEndsWith(name, N_DIVIDE)) {
242 operator = "/"; 245 operator = "/";
246 } else if (nameEndsWith(name, N_LESSTHAN)) {
247 operator = "<";
248 } else if (nameEndsWith(name, N_LESSEQUALSTHAN)) {
249 operator = "<=";
250 } else if (nameEndsWith(name, N_GREATERTHAN)) {
251 operator = ">";
252 } else if (nameEndsWith(name, N_GREATEREQUALTHAN)) {
253 operator = ">=";
254 } else if (nameEndsWith(name, N_EQUALS)) {
255 operator = "<";
256 } else if (nameEndsWith(name, N_NOTEQUALS)) {
257 //Exceptional case
258 return "(not (=" + " " + left_operand + " " + right_operand + "))";
243// } else if (nameEndsWith(name, N_MODULO)) { 259// } else if (nameEndsWith(name, N_MODULO)) {
244// expr = ctx.mkMod((IntExpr)left_operand, (IntExpr)right_operand); 260// expr = ctx.mkMod((IntExpr)left_operand, (IntExpr)right_operand);
245 } else { 261 } else {
@@ -249,12 +265,30 @@ public class NumericDrealProblemSolver extends NumericProblemSolver{
249 expr = "(" + operator + " " + left_operand + " " + right_operand + ")"; 265 expr = "(" + operator + " " + left_operand + " " + right_operand + ")";
250 } 266 }
251 else if (e instanceof XUnaryOperation){ 267 else if (e instanceof XUnaryOperation){
252 String name = ((XUnaryOperation) e).getFeature().getQualifiedName(); 268 //TODO
253 System.out.println(name); 269 //This is, for example, "-1000"
254 String op = ((XUnaryOperation) e).getOperand().toString();
255 System.out.println(op);
256 throw new Exception ("Unsupported expression " + e.getClass().getSimpleName()); 270 throw new Exception ("Unsupported expression " + e.getClass().getSimpleName());
257 } else { 271 }
272 else if (e instanceof XIfExpression) {
273
274 String if_operand = formNumericConstraintHelper(((XIfExpression) e).getIf(), aMatch);
275 String then_operand = formNumericConstraintHelper(((XIfExpression) e).getThen(), aMatch);
276 String else_operand = formNumericConstraintHelper(((XIfExpression) e).getElse(), aMatch);
277
278 expr = "(ite " + if_operand + " " + then_operand + " " + else_operand + ")";
279 }
280 else if (e instanceof XBlockExpression) {
281 XBlockExpression ebl = (XBlockExpression) e;
282
283 if (ebl.getExpressions().size() > 1)
284 throw new Exception("Unsupported: blocks with more than 1 statement are not currently supportes: " + ebl);
285 if (ebl.getExpressions().isEmpty())
286 throw new Exception("Unsupported: blocks is empty:" + ebl);
287
288 //TODO make this more general
289 expr = formNumericConstraintHelper(ebl.getExpressions().get(0), aMatch);
290 }
291 else {
258 throw new Exception ("Unsupported expression " + e.getClass().getSimpleName()); 292 throw new Exception ("Unsupported expression " + e.getClass().getSimpleName());
259 } 293 }
260 return expr; 294 return expr;
@@ -279,7 +313,7 @@ public class NumericDrealProblemSolver extends NumericProblemSolver{
279 Iterable<Map<JvmIdentifiableElement, PrimitiveElement>> matchSets = matches.get(e); 313 Iterable<Map<JvmIdentifiableElement, PrimitiveElement>> matchSets = matches.get(e);
280 for (Map<JvmIdentifiableElement, PrimitiveElement> aMatch: matchSets) { 314 for (Map<JvmIdentifiableElement, PrimitiveElement> aMatch: matchSets) {
281 String constraint = formNumericConstraint(e, aMatch); 315 String constraint = formNumericConstraint(e, aMatch);
282 String negAssert = "(assert (not " + constraint + "))"; 316 String negAssert = "(assert " + constraint + ")";
283 curConstraints.add(negAssert); 317 curConstraints.add(negAssert);
284 } 318 }
285 } 319 }
@@ -329,16 +363,24 @@ public class NumericDrealProblemSolver extends NumericProblemSolver{
329 Process outputProcess; 363 Process outputProcess;
330 if (this.useDocker) outputProcess = callDrealDocker(numProbContent, false); 364 if (this.useDocker) outputProcess = callDrealDocker(numProbContent, false);
331 else outputProcess = callDrealLocal(numProbContent, false); 365 else outputProcess = callDrealLocal(numProbContent, false);
332 366
333 List<List<String>> outputs = getProcessOutput(outputProcess); 367 boolean result = false;
334 boolean result = getDrealResult(outputProcess.exitValue(), outputs); 368 List<List<String>> outputs = null;
369 if (outputProcess != null) {
370 outputs = getProcessOutput(outputProcess);
371 result = getDrealResult(outputProcess.exitValue(), outputs);
372 }
335 endSolvingProblem = System.nanoTime()-startSolvingProblem; 373 endSolvingProblem = System.nanoTime()-startSolvingProblem;
336 374
337 //DEBUG - Print things 375 //DEBUG - Print things
376 if (outputProcess == null) {
377 System.err.println("TIMEOUT");
378// printOutput(numProbContent);
379 }
338// printOutput(numProbContent); 380// printOutput(numProbContent);
339// printOutput(outputs.get(0)); 381// if (outputs != null) printOutput(outputs.get(0));
340 System.out.println(result); 382// System.out.println(result);
341 //END DEBUG 383// END DEBUG
342 384
343 return result; 385 return result;
344 } 386 }
@@ -391,6 +433,7 @@ public class NumericDrealProblemSolver extends NumericProblemSolver{
391 endSolvingProblem = System.nanoTime()-startSolvingProblem; 433 endSolvingProblem = System.nanoTime()-startSolvingProblem;
392 434
393 //DEBUG - Print things 435 //DEBUG - Print things
436 System.out.println("Getting Solution!");
394// printOutput(numProbContent); 437// printOutput(numProbContent);
395// printOutput(outputs.get(0)); 438// printOutput(outputs.get(0));
396// System.out.println(result); 439// 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 {
76 public var nonContainmentWeight = 1 76 public var nonContainmentWeight = 1
77 public var unfinishedWFWeight = 1 77 public var unfinishedWFWeight = 1
78 public var calculateObjectCreationCosts = false 78 public var calculateObjectCreationCosts = false
79 public var numericSolverSelection = NumericSolverSelection.DREAL_DOCKER //currently defaulted to DREAL 79 public NumericSolverSelection numericSolverSelection = NumericSolverSelection.DREAL_DOCKER //currently defaulted to DREAL
80 public var drealLocalPath = "<path-to-dreal>"; 80 public var drealLocalPath = "<path-to-dreal>";
81 81
82 public var ScopePropagatorStrategy scopePropagatorStrategy = new ScopePropagatorStrategy.Polyhedral( 82 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
12import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ModelGenerationMethod 12import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ModelGenerationMethod
13import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.NumericSolverSelection 13import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.NumericSolverSelection
14import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration 14import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration
15import java.math.BigDecimal
16import java.util.HashMap 15import java.util.HashMap
17import java.util.LinkedHashMap 16import java.util.LinkedHashMap
18import java.util.LinkedHashSet 17import java.util.LinkedHashSet
@@ -103,7 +102,7 @@ class NumericSolver {
103 finalResult=true 102 finalResult=true
104 } else { 103 } else {
105 val propagatedConstraints = new HashMap 104 val propagatedConstraints = new HashMap
106 println("<<<<START-STEP>>>>") 105// println("<<<<START-STEP>>>>")
107 for(entry : matches.entrySet) { 106 for(entry : matches.entrySet) {
108 val constraint = entry.key 107 val constraint = entry.key
109// println("--match?-- " + constraint) 108// 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 @@
146 }, 146 },
147 { 147 {
148 "cell_type": "code", 148 "cell_type": "code",
149 "execution_count": 4, 149 "execution_count": 6,
150 "metadata": {}, 150 "metadata": {},
151 "outputs": [], 151 "outputs": [],
152 "source": [ 152 "source": [
@@ -158,7 +158,7 @@
158 " scale_fill_brewer(palette='Set2',\n", 158 " scale_fill_brewer(palette='Set2',\n",
159 " labels=rev(c('Refinement', 'Backtracking', 'State Coding', 'SMT Solver Calls', 'Additional Model Generation')),\n", 159 " labels=rev(c('Refinement', 'Backtracking', 'State Coding', 'SMT Solver Calls', 'Additional Model Generation')),\n",
160 " guide=FALSE) +\n", 160 " guide=FALSE) +\n",
161 " scale_x_continuous(breaks=c(20, 40, 60, 80, 100), name=\"Model Size (# nodes)\") +\n", 161 " scale_x_continuous(breaks=c(20, 30, 40, 50, 100), name=\"Model Size (# nodes)\") +\n",
162 " scale_y_continuous(name=\"Runtime (s)\") +\n", 162 " scale_y_continuous(name=\"Runtime (s)\") +\n",
163 " theme_bw()\n", 163 " theme_bw()\n",
164 " ggsave(plot=plot, filename=paste0('plots/plot_RQ2_', name, '.pdf'), width=3.5, height=2.5)\n", 164 " ggsave(plot=plot, filename=paste0('plots/plot_RQ2_', name, '.pdf'), width=3.5, height=2.5)\n",
@@ -175,7 +175,7 @@
175 }, 175 },
176 { 176 {
177 "cell_type": "code", 177 "cell_type": "code",
178 "execution_count": 5, 178 "execution_count": 7,
179 "metadata": {}, 179 "metadata": {},
180 "outputs": [ 180 "outputs": [
181 { 181 {
@@ -184,6 +184,15 @@
184 "text": [ 184 "text": [
185 "Warning message:\n", 185 "Warning message:\n",
186 "“`cols` is now required when using unnest().\n", 186 "“`cols` is now required when using unnest().\n",
187 "Please use `cols = c(Solution1DetailedStatistics)`”\n",
188 "Warning message:\n",
189 "“`cols` is now required when using unnest().\n",
190 "Please use `cols = c(Solution1DetailedStatistics)`”\n",
191 "Warning message:\n",
192 "“`cols` is now required when using unnest().\n",
193 "Please use `cols = c(Solution1DetailedStatistics)`”\n",
194 "Warning message:\n",
195 "“`cols` is now required when using unnest().\n",
187 "Please use `cols = c(Solution1DetailedStatistics)`”\n" 196 "Please use `cols = c(Solution1DetailedStatistics)`”\n"
188 ] 197 ]
189 }, 198 },
@@ -191,39 +200,54 @@
191 "data": { 200 "data": {
192 "text/html": [ 201 "text/html": [
193 "<table>\n", 202 "<table>\n",
194 "<caption>A tibble: 1 × 8</caption>\n", 203 "<caption>A tibble: 4 × 8</caption>\n",
195 "<thead>\n", 204 "<thead>\n",
196 "\t<tr><th scope=col>n</th><th scope=col>Run</th><th scope=col>preprocessingTime</th><th scope=col>StateCoderTime</th><th scope=col>ForwardTime</th><th scope=col>BacktrackingTime</th><th scope=col>NumericalSolverSumTime</th><th scope=col>additionalTime</th></tr>\n", 205 "\t<tr><th scope=col>n</th><th scope=col>Run</th><th scope=col>preprocessingTime</th><th scope=col>StateCoderTime</th><th scope=col>ForwardTime</th><th scope=col>BacktrackingTime</th><th scope=col>NumericalSolverSumTime</th><th scope=col>additionalTime</th></tr>\n",
197 "\t<tr><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th></tr>\n", 206 "\t<tr><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th></tr>\n",
198 "</thead>\n", 207 "</thead>\n",
199 "<tbody>\n", 208 "<tbody>\n",
200 "\t<tr><td>20</td><td>1</td><td>14735</td><td>994</td><td>1890</td><td>1272</td><td>4391</td><td>14750</td></tr>\n", 209 "\t<tr><td>20</td><td>1</td><td>33339</td><td> 878</td><td> 2654</td><td>1610</td><td> 7655</td><td> 39044</td></tr>\n",
210 "\t<tr><td>30</td><td>1</td><td>36670</td><td>2016</td><td> 5187</td><td>2687</td><td> 33695</td><td>103508</td></tr>\n",
211 "\t<tr><td>40</td><td>1</td><td>48868</td><td>3907</td><td> 9219</td><td>4814</td><td> 99075</td><td>309361</td></tr>\n",
212 "\t<tr><td>50</td><td>1</td><td>62541</td><td>5581</td><td>12720</td><td>5863</td><td>268490</td><td>552214</td></tr>\n",
201 "</tbody>\n", 213 "</tbody>\n",
202 "</table>\n" 214 "</table>\n"
203 ], 215 ],
204 "text/latex": [ 216 "text/latex": [
205 "A tibble: 1 × 8\n", 217 "A tibble: 4 × 8\n",
206 "\\begin{tabular}{llllllll}\n", 218 "\\begin{tabular}{llllllll}\n",
207 " n & Run & preprocessingTime & StateCoderTime & ForwardTime & BacktrackingTime & NumericalSolverSumTime & additionalTime\\\\\n", 219 " n & Run & preprocessingTime & StateCoderTime & ForwardTime & BacktrackingTime & NumericalSolverSumTime & additionalTime\\\\\n",
208 " <dbl> & <dbl> & <dbl> & <dbl> & <dbl> & <dbl> & <dbl> & <dbl>\\\\\n", 220 " <dbl> & <dbl> & <dbl> & <dbl> & <dbl> & <dbl> & <dbl> & <dbl>\\\\\n",
209 "\\hline\n", 221 "\\hline\n",
210 "\t 20 & 1 & 14735 & 994 & 1890 & 1272 & 4391 & 14750\\\\\n", 222 "\t 20 & 1 & 33339 & 878 & 2654 & 1610 & 7655 & 39044\\\\\n",
223 "\t 30 & 1 & 36670 & 2016 & 5187 & 2687 & 33695 & 103508\\\\\n",
224 "\t 40 & 1 & 48868 & 3907 & 9219 & 4814 & 99075 & 309361\\\\\n",
225 "\t 50 & 1 & 62541 & 5581 & 12720 & 5863 & 268490 & 552214\\\\\n",
211 "\\end{tabular}\n" 226 "\\end{tabular}\n"
212 ], 227 ],
213 "text/markdown": [ 228 "text/markdown": [
214 "\n", 229 "\n",
215 "A tibble: 1 × 8\n", 230 "A tibble: 4 × 8\n",
216 "\n", 231 "\n",
217 "| n &lt;dbl&gt; | Run &lt;dbl&gt; | preprocessingTime &lt;dbl&gt; | StateCoderTime &lt;dbl&gt; | ForwardTime &lt;dbl&gt; | BacktrackingTime &lt;dbl&gt; | NumericalSolverSumTime &lt;dbl&gt; | additionalTime &lt;dbl&gt; |\n", 232 "| n &lt;dbl&gt; | Run &lt;dbl&gt; | preprocessingTime &lt;dbl&gt; | StateCoderTime &lt;dbl&gt; | ForwardTime &lt;dbl&gt; | BacktrackingTime &lt;dbl&gt; | NumericalSolverSumTime &lt;dbl&gt; | additionalTime &lt;dbl&gt; |\n",
218 "|---|---|---|---|---|---|---|---|\n", 233 "|---|---|---|---|---|---|---|---|\n",
219 "| 20 | 1 | 14735 | 994 | 1890 | 1272 | 4391 | 14750 |\n", 234 "| 20 | 1 | 33339 | 878 | 2654 | 1610 | 7655 | 39044 |\n",
235 "| 30 | 1 | 36670 | 2016 | 5187 | 2687 | 33695 | 103508 |\n",
236 "| 40 | 1 | 48868 | 3907 | 9219 | 4814 | 99075 | 309361 |\n",
237 "| 50 | 1 | 62541 | 5581 | 12720 | 5863 | 268490 | 552214 |\n",
220 "\n" 238 "\n"
221 ], 239 ],
222 "text/plain": [ 240 "text/plain": [
223 " n Run preprocessingTime StateCoderTime ForwardTime BacktrackingTime\n", 241 " n Run preprocessingTime StateCoderTime ForwardTime BacktrackingTime\n",
224 "1 20 1 14735 994 1890 1272 \n", 242 "1 20 1 33339 878 2654 1610 \n",
243 "2 30 1 36670 2016 5187 2687 \n",
244 "3 40 1 48868 3907 9219 4814 \n",
245 "4 50 1 62541 5581 12720 5863 \n",
225 " NumericalSolverSumTime additionalTime\n", 246 " NumericalSolverSumTime additionalTime\n",
226 "1 4391 14750 " 247 "1 7655 39044 \n",
248 "2 33695 103508 \n",
249 "3 99075 309361 \n",
250 "4 268490 552214 "
227 ] 251 ]
228 }, 252 },
229 "metadata": {}, 253 "metadata": {},
@@ -233,39 +257,54 @@
233 "data": { 257 "data": {
234 "text/html": [ 258 "text/html": [
235 "<table>\n", 259 "<table>\n",
236 "<caption>A tibble: 1 × 7</caption>\n", 260 "<caption>A tibble: 4 × 7</caption>\n",
237 "<thead>\n", 261 "<thead>\n",
238 "\t<tr><th scope=col>n</th><th scope=col>preprocessingTime</th><th scope=col>StateCoderTime</th><th scope=col>ForwardTime</th><th scope=col>BacktrackingTime</th><th scope=col>NumericalSolverSumTime</th><th scope=col>additionalTime</th></tr>\n", 262 "\t<tr><th scope=col>n</th><th scope=col>preprocessingTime</th><th scope=col>StateCoderTime</th><th scope=col>ForwardTime</th><th scope=col>BacktrackingTime</th><th scope=col>NumericalSolverSumTime</th><th scope=col>additionalTime</th></tr>\n",
239 "\t<tr><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th></tr>\n", 263 "\t<tr><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th></tr>\n",
240 "</thead>\n", 264 "</thead>\n",
241 "<tbody>\n", 265 "<tbody>\n",
242 "\t<tr><td>20</td><td>14.735</td><td>0.994</td><td>1.89</td><td>1.272</td><td>4.391</td><td>14.75</td></tr>\n", 266 "\t<tr><td>20</td><td>33.339</td><td>0.878</td><td> 2.654</td><td>1.610</td><td> 7.655</td><td> 39.044</td></tr>\n",
267 "\t<tr><td>30</td><td>36.670</td><td>2.016</td><td> 5.187</td><td>2.687</td><td> 33.695</td><td>103.508</td></tr>\n",
268 "\t<tr><td>40</td><td>48.868</td><td>3.907</td><td> 9.219</td><td>4.814</td><td> 99.075</td><td>309.361</td></tr>\n",
269 "\t<tr><td>50</td><td>62.541</td><td>5.581</td><td>12.720</td><td>5.863</td><td>268.490</td><td>552.214</td></tr>\n",
243 "</tbody>\n", 270 "</tbody>\n",
244 "</table>\n" 271 "</table>\n"
245 ], 272 ],
246 "text/latex": [ 273 "text/latex": [
247 "A tibble: 1 × 7\n", 274 "A tibble: 4 × 7\n",
248 "\\begin{tabular}{lllllll}\n", 275 "\\begin{tabular}{lllllll}\n",
249 " n & preprocessingTime & StateCoderTime & ForwardTime & BacktrackingTime & NumericalSolverSumTime & additionalTime\\\\\n", 276 " n & preprocessingTime & StateCoderTime & ForwardTime & BacktrackingTime & NumericalSolverSumTime & additionalTime\\\\\n",
250 " <dbl> & <dbl> & <dbl> & <dbl> & <dbl> & <dbl> & <dbl>\\\\\n", 277 " <dbl> & <dbl> & <dbl> & <dbl> & <dbl> & <dbl> & <dbl>\\\\\n",
251 "\\hline\n", 278 "\\hline\n",
252 "\t 20 & 14.735 & 0.994 & 1.89 & 1.272 & 4.391 & 14.75\\\\\n", 279 "\t 20 & 33.339 & 0.878 & 2.654 & 1.610 & 7.655 & 39.044\\\\\n",
280 "\t 30 & 36.670 & 2.016 & 5.187 & 2.687 & 33.695 & 103.508\\\\\n",
281 "\t 40 & 48.868 & 3.907 & 9.219 & 4.814 & 99.075 & 309.361\\\\\n",
282 "\t 50 & 62.541 & 5.581 & 12.720 & 5.863 & 268.490 & 552.214\\\\\n",
253 "\\end{tabular}\n" 283 "\\end{tabular}\n"
254 ], 284 ],
255 "text/markdown": [ 285 "text/markdown": [
256 "\n", 286 "\n",
257 "A tibble: 1 × 7\n", 287 "A tibble: 4 × 7\n",
258 "\n", 288 "\n",
259 "| n &lt;dbl&gt; | preprocessingTime &lt;dbl&gt; | StateCoderTime &lt;dbl&gt; | ForwardTime &lt;dbl&gt; | BacktrackingTime &lt;dbl&gt; | NumericalSolverSumTime &lt;dbl&gt; | additionalTime &lt;dbl&gt; |\n", 289 "| n &lt;dbl&gt; | preprocessingTime &lt;dbl&gt; | StateCoderTime &lt;dbl&gt; | ForwardTime &lt;dbl&gt; | BacktrackingTime &lt;dbl&gt; | NumericalSolverSumTime &lt;dbl&gt; | additionalTime &lt;dbl&gt; |\n",
260 "|---|---|---|---|---|---|---|\n", 290 "|---|---|---|---|---|---|---|\n",
261 "| 20 | 14.735 | 0.994 | 1.89 | 1.272 | 4.391 | 14.75 |\n", 291 "| 20 | 33.339 | 0.878 | 2.654 | 1.610 | 7.655 | 39.044 |\n",
292 "| 30 | 36.670 | 2.016 | 5.187 | 2.687 | 33.695 | 103.508 |\n",
293 "| 40 | 48.868 | 3.907 | 9.219 | 4.814 | 99.075 | 309.361 |\n",
294 "| 50 | 62.541 | 5.581 | 12.720 | 5.863 | 268.490 | 552.214 |\n",
262 "\n" 295 "\n"
263 ], 296 ],
264 "text/plain": [ 297 "text/plain": [
265 " n preprocessingTime StateCoderTime ForwardTime BacktrackingTime\n", 298 " n preprocessingTime StateCoderTime ForwardTime BacktrackingTime\n",
266 "1 20 14.735 0.994 1.89 1.272 \n", 299 "1 20 33.339 0.878 2.654 1.610 \n",
300 "2 30 36.670 2.016 5.187 2.687 \n",
301 "3 40 48.868 3.907 9.219 4.814 \n",
302 "4 50 62.541 5.581 12.720 5.863 \n",
267 " NumericalSolverSumTime additionalTime\n", 303 " NumericalSolverSumTime additionalTime\n",
268 "1 4.391 14.75 " 304 "1 7.655 39.044 \n",
305 "2 33.695 103.508 \n",
306 "3 99.075 309.361 \n",
307 "4 268.490 552.214 "
269 ] 308 ]
270 }, 309 },
271 "metadata": {}, 310 "metadata": {},
@@ -274,16 +313,16 @@
274 { 313 {
275 "data": { 314 "data": {
276 "text/html": [ 315 "text/html": [
277 "14.735" 316 "42.769"
278 ], 317 ],
279 "text/latex": [ 318 "text/latex": [
280 "14.735" 319 "42.769"
281 ], 320 ],
282 "text/markdown": [ 321 "text/markdown": [
283 "14.735" 322 "42.769"
284 ], 323 ],
285 "text/plain": [ 324 "text/plain": [
286 "[1] 14.735" 325 "[1] 42.769"
287 ] 326 ]
288 }, 327 },
289 "metadata": {}, 328 "metadata": {},
@@ -291,7 +330,7 @@
291 }, 330 },
292 { 331 {
293 "data": { 332 "data": {
294 "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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", 333 "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",
295 "text/plain": [ 334 "text/plain": [
296 "plot without title" 335 "plot without title"
297 ] 336 ]
@@ -312,7 +351,10 @@
312 "source": [ 351 "source": [
313 "FamilyTreeRQ2Raw <- rbind(\n", 352 "FamilyTreeRQ2Raw <- rbind(\n",
314 "# Load10Log(\"measurements/stats/FamilyTree//size010to-1r10n10rt300nsdrealstats_06-0249.csv\", 10),\n", 353 "# Load10Log(\"measurements/stats/FamilyTree//size010to-1r10n10rt300nsdrealstats_06-0249.csv\", 10),\n",
315 " Load10Log(\"measurements1/stats.csv\", 20)\n", 354 " Load10Log(\"measurements1/stats1010.csv\", 20),\n",
355 " Load10Log(\"measurements1/stats1515.csv\", 30),\n",
356 " Load10Log(\"measurements1/stats2020.csv\", 40),\n",
357 " Load10Log(\"measurements1/stats2525.csv\", 50)\n",
316 ")\n", 358 ")\n",
317 "FamilyTreeRQ2Raw\n", 359 "FamilyTreeRQ2Raw\n",
318 "FamilyTreeRQ2 <- FamilyTreeRQ2Raw %>% ProcessRQ2\n", 360 "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
--- 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
Binary files differ