diff options
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) { | 431 | pattern 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) { | 446 | pattern 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) { | 461 | pattern 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) { | 476 | pattern 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) { | 491 | pattern 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 | 541 | pattern 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); | 554 | pattern 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); | 577 | pattern 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 @@ | |||
1 | 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 | ||
2 | 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 | ||
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 @@ | |||
1 | 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 | ||
2 | 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 | ||
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 @@ | |||
1 | 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 | ||
2 | 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 | ||
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 @@ | |||
1 | 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 | ||
2 | 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 | ||
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; | |||
3 | import java.awt.Desktop; | 3 | import java.awt.Desktop; |
4 | import java.io.File; | 4 | import java.io.File; |
5 | import java.io.IOException; | 5 | import java.io.IOException; |
6 | import java.nio.file.CopyOption; | ||
6 | import java.nio.file.Files; | 7 | import java.nio.file.Files; |
7 | import java.nio.file.Path; | 8 | import java.nio.file.Path; |
8 | import java.nio.file.Paths; | 9 | import java.nio.file.Paths; |
10 | import java.nio.file.StandardCopyOption; | ||
9 | import java.util.List; | 11 | import java.util.List; |
10 | 12 | ||
11 | import hu.bme.mit.inf.dslreasoner.application.execution.StandaloneScriptExecutor; | 13 | import 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 @@ | |||
1 | package queries | ||
2 | |||
3 | import "http://www.example.com/crossingScenario" | ||
4 | import "http://www.eclipse.org/emf/2002/Ecore" | ||
5 | |||
6 | /////////pedestrian-width (4) //TODO Derived? | ||
7 | pattern 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 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.viatra2logic | 1 | package hu.bme.mit.inf.dslreasoner.viatra2logic |
2 | 2 | ||
3 | import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder | 3 | import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder |
4 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.IfThenElse | ||
4 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Term | 5 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Term |
5 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Variable | 6 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Variable |
6 | import java.util.Map | 7 | import java.util.Map |
@@ -8,9 +9,11 @@ import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable | |||
8 | import org.eclipse.xtext.xbase.XBinaryOperation | 9 | import org.eclipse.xtext.xbase.XBinaryOperation |
9 | import org.eclipse.xtext.xbase.XExpression | 10 | import org.eclipse.xtext.xbase.XExpression |
10 | import org.eclipse.xtext.xbase.XFeatureCall | 11 | import org.eclipse.xtext.xbase.XFeatureCall |
12 | import org.eclipse.xtext.xbase.XIfExpression | ||
11 | import org.eclipse.xtext.xbase.XMemberFeatureCall | 13 | import org.eclipse.xtext.xbase.XMemberFeatureCall |
12 | import org.eclipse.xtext.xbase.XNumberLiteral | 14 | import org.eclipse.xtext.xbase.XNumberLiteral |
13 | import org.eclipse.xtext.xbase.XUnaryOperation | 15 | import org.eclipse.xtext.xbase.XUnaryOperation |
16 | import org.eclipse.xtext.xbase.XBlockExpression | ||
14 | 17 | ||
15 | class ExpressionEvaluation2Logic { | 18 | class 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 | ||
21 | import org.eclipse.xtext.common.types.JvmIdentifiableElement; | 21 | import org.eclipse.xtext.common.types.JvmIdentifiableElement; |
22 | import org.eclipse.xtext.xbase.XBinaryOperation; | 22 | import org.eclipse.xtext.xbase.XBinaryOperation; |
23 | import org.eclipse.xtext.xbase.XBlockExpression; | ||
23 | import org.eclipse.xtext.xbase.XExpression; | 24 | import org.eclipse.xtext.xbase.XExpression; |
24 | import org.eclipse.xtext.xbase.XFeatureCall; | 25 | import org.eclipse.xtext.xbase.XFeatureCall; |
26 | import org.eclipse.xtext.xbase.XIfExpression; | ||
25 | import org.eclipse.xtext.xbase.XNumberLiteral; | 27 | import org.eclipse.xtext.xbase.XNumberLiteral; |
26 | import org.eclipse.xtext.xbase.XUnaryOperation; | 28 | import 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 | |||
12 | import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ModelGenerationMethod | 12 | import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ModelGenerationMethod |
13 | import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.NumericSolverSelection | 13 | import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.NumericSolverSelection |
14 | import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration | 14 | import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration |
15 | import java.math.BigDecimal | ||
16 | import java.util.HashMap | 15 | import java.util.HashMap |
17 | import java.util.LinkedHashMap | 16 | import java.util.LinkedHashMap |
18 | import java.util.LinkedHashSet | 17 | import 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><dbl></th><th scope=col><dbl></th><th scope=col><dbl></th><th scope=col><dbl></th><th scope=col><dbl></th><th scope=col><dbl></th><th scope=col><dbl></th><th scope=col><dbl></th></tr>\n", | 206 | "\t<tr><th scope=col><dbl></th><th scope=col><dbl></th><th scope=col><dbl></th><th scope=col><dbl></th><th scope=col><dbl></th><th scope=col><dbl></th><th scope=col><dbl></th><th scope=col><dbl></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 <dbl> | Run <dbl> | preprocessingTime <dbl> | StateCoderTime <dbl> | ForwardTime <dbl> | BacktrackingTime <dbl> | NumericalSolverSumTime <dbl> | additionalTime <dbl> |\n", | 232 | "| n <dbl> | Run <dbl> | preprocessingTime <dbl> | StateCoderTime <dbl> | ForwardTime <dbl> | BacktrackingTime <dbl> | NumericalSolverSumTime <dbl> | additionalTime <dbl> |\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><dbl></th><th scope=col><dbl></th><th scope=col><dbl></th><th scope=col><dbl></th><th scope=col><dbl></th><th scope=col><dbl></th><th scope=col><dbl></th></tr>\n", | 263 | "\t<tr><th scope=col><dbl></th><th scope=col><dbl></th><th scope=col><dbl></th><th scope=col><dbl></th><th scope=col><dbl></th><th scope=col><dbl></th><th scope=col><dbl></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 <dbl> | preprocessingTime <dbl> | StateCoderTime <dbl> | ForwardTime <dbl> | BacktrackingTime <dbl> | NumericalSolverSumTime <dbl> | additionalTime <dbl> |\n", | 289 | "| n <dbl> | preprocessingTime <dbl> | StateCoderTime <dbl> | ForwardTime <dbl> | BacktrackingTime <dbl> | NumericalSolverSumTime <dbl> | additionalTime <dbl> |\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 | |||