@@ 527-779 (lines=253) @@ | ||
524 | * @param decision |
|
525 | * @return |
|
526 | */ |
|
527 | private boolean isPredicateUnificationFeasible(Decision goal, Decision decision) |
|
528 | { |
|
529 | // feasibility flag |
|
530 | boolean feasible = true; |
|
531 | // first check if the decisions refer to the same values |
|
532 | if (!decision.getValue().equals(goal.getValue()) && |
|
533 | decision.getComponent().equals(goal.getComponent())) { |
|
534 | ||
535 | // not feasible unification |
|
536 | feasible = false; |
|
537 | debug("Not feasible predicate unification:\n" |
|
538 | + "- planning goal: " + goal + "\n" |
|
539 | + "- unification decision: " + decision + "\n"); |
|
540 | } |
|
541 | else |
|
542 | { |
|
543 | // list of committed parameter constraints |
|
544 | Set<Relation> committed = new HashSet<>(); |
|
545 | // list of translated parameter relations - reference |
|
546 | Set<ParameterRelation> translatedReferenceGoalRelations = new HashSet<>(); |
|
547 | // list of translated parameter relations - target |
|
548 | Set<ParameterRelation> translatedTargetGoalRelations = new HashSet<>(); |
|
549 | ||
550 | // get goal component |
|
551 | DomainComponent goalComp = goal.getComponent(); |
|
552 | // get all (pending) relation concerning the goal decision |
|
553 | Set<Relation> pending = goalComp.getRelations(goal); |
|
554 | // check relations |
|
555 | for (Relation rel : pending) |
|
556 | { |
|
557 | // check parameter constraint type |
|
558 | if (rel.getCategory().equals(ConstraintCategory.PARAMETER_CONSTRAINT)) |
|
559 | { |
|
560 | // check relation type |
|
561 | switch (rel.getType()) |
|
562 | { |
|
563 | // bind parameter |
|
564 | case BIND_PARAMETER: |
|
565 | { |
|
566 | // the goal can be only the reference of the relation |
|
567 | ParameterRelation pRel = (ParameterRelation) rel; |
|
568 | ||
569 | // get relation reference parameter label |
|
570 | String refParamLabel = pRel.getReferenceParameterLabel(); |
|
571 | // get label index |
|
572 | int refParameterIndex = pRel.getReference().getParameterIndexByLabel(refParamLabel); |
|
573 | // get unification decision parameter label |
|
574 | String label = decision.getParameterLabelByIndex(refParameterIndex); |
|
575 | ||
576 | // update reference decision |
|
577 | pRel.setReference(decision); |
|
578 | ||
579 | // update reference label of the relation |
|
580 | pRel.setReferenceParameterLabel(label); |
|
581 | // add relation to the list of translated ones |
|
582 | translatedReferenceGoalRelations.add(pRel); |
|
583 | } |
|
584 | break; |
|
585 | ||
586 | case EQUAL_PARAMETER : |
|
587 | { |
|
588 | // get parameter relation |
|
589 | EqualParameterRelation eqRel = (EqualParameterRelation) rel; |
|
590 | // check if the goal is the reference or the parameter constraint |
|
591 | if (eqRel.getReference().equals(goal)) |
|
592 | { |
|
593 | // get relation reference parameter label |
|
594 | String refParamLabel = eqRel.getReferenceParameterLabel(); |
|
595 | // get label index |
|
596 | int refParameterIndex = eqRel.getReference().getParameterIndexByLabel(refParamLabel); |
|
597 | // get unification decision parameter label |
|
598 | String label = decision.getParameterLabelByIndex(refParameterIndex); |
|
599 | ||
600 | // update reference decision |
|
601 | eqRel.setReference(decision); |
|
602 | // update reference label of the relation |
|
603 | eqRel.setReferenceParameterLabel(label); |
|
604 | // add relation to the list of translated ones |
|
605 | translatedReferenceGoalRelations.add(eqRel); |
|
606 | } |
|
607 | else // the goal is the target of the relation |
|
608 | { |
|
609 | // get relation reference parameter label |
|
610 | String refParamLabel = eqRel.getTargetParameterLabel(); |
|
611 | // get label index |
|
612 | int refParameterIndex = eqRel.getTarget().getParameterIndexByLabel(refParamLabel); |
|
613 | // get unification decision parameter label |
|
614 | String label = decision.getParameterLabelByIndex(refParameterIndex); |
|
615 | ||
616 | // update reference decision |
|
617 | eqRel.setTarget(decision); |
|
618 | // update reference label of the relation |
|
619 | eqRel.setTargetParameterLabel(label); |
|
620 | // add relation to the list of translated ones |
|
621 | translatedTargetGoalRelations.add(eqRel); |
|
622 | } |
|
623 | } |
|
624 | break; |
|
625 | ||
626 | case NOT_EQUAL_PARAMETER : |
|
627 | { |
|
628 | // get parameter relation |
|
629 | NotEqualParameterRelation neqRel = (NotEqualParameterRelation) rel; |
|
630 | // check if the goal is the reference or the parameter constraint |
|
631 | if (neqRel.getReference().equals(goal)) |
|
632 | { |
|
633 | // get relation reference parameter label |
|
634 | String refParamLabel = neqRel.getReferenceParameterLabel(); |
|
635 | // get label index |
|
636 | int refParameterIndex = neqRel.getReference().getParameterIndexByLabel(refParamLabel); |
|
637 | // get unification decision parameter label |
|
638 | String label = decision.getParameterLabelByIndex(refParameterIndex); |
|
639 | ||
640 | // update reference decision |
|
641 | neqRel.setReference(decision); |
|
642 | // update reference label of the relation |
|
643 | neqRel.setReferenceParameterLabel(label); |
|
644 | // add relation to the list of translated ones |
|
645 | translatedReferenceGoalRelations.add(neqRel); |
|
646 | } |
|
647 | else // the goal is the target of the relation |
|
648 | { |
|
649 | // get relation reference parameter label |
|
650 | String refParamLabel = neqRel.getTargetParameterLabel(); |
|
651 | // get label index |
|
652 | int refParameterIndex = neqRel.getTarget().getParameterIndexByLabel(refParamLabel); |
|
653 | // get unification decision parameter label |
|
654 | String label = decision.getParameterLabelByIndex(refParameterIndex); |
|
655 | ||
656 | // update reference decision |
|
657 | neqRel.setTarget(decision); |
|
658 | // update reference label of the relation |
|
659 | neqRel.setTargetParameterLabel(label); |
|
660 | // add relation to the list of translated ones |
|
661 | translatedTargetGoalRelations.add(neqRel); |
|
662 | } |
|
663 | } |
|
664 | break; |
|
665 | ||
666 | ||
667 | default: |
|
668 | // unknown parameter relation |
|
669 | throw new RuntimeException("Unknown Parameter relation type : " + rel.getType() + "\n"); |
|
670 | } |
|
671 | } |
|
672 | } |
|
673 | ||
674 | try |
|
675 | { |
|
676 | // activate translated relations |
|
677 | for (Relation rel : translatedReferenceGoalRelations) { |
|
678 | // check if can be activated |
|
679 | if (rel.getReference().getComponent().activate(rel)) { |
|
680 | // add relation to the committed list |
|
681 | committed.add(rel); |
|
682 | } |
|
683 | } |
|
684 | ||
685 | // activate translated relations |
|
686 | for (Relation rel : translatedTargetGoalRelations) { |
|
687 | // check if can be activated |
|
688 | if (rel.getReference().getComponent().activate(rel)) { |
|
689 | // add relation to the committed list |
|
690 | committed.add(rel); |
|
691 | } |
|
692 | } |
|
693 | ||
694 | // check parameter of the plan |
|
695 | this.pdb.verify(); |
|
696 | } |
|
697 | catch (ConsistencyCheckException | RelationPropagationException ex) { |
|
698 | // not feasible |
|
699 | feasible = false; |
|
700 | // not feasible unification |
|
701 | debug("Not feasible predicate unification:\n" |
|
702 | + "- planning goal: " + goal + "\n" |
|
703 | + "- unification decision: " + decision + "\n"); |
|
704 | } |
|
705 | finally |
|
706 | { |
|
707 | // check committed relations |
|
708 | for (Relation rel : committed) { |
|
709 | // deactivate relation |
|
710 | rel.getReference().getComponent().deactivate(rel); |
|
711 | } |
|
712 | ||
713 | ||
714 | // translated back parameter relations |
|
715 | for (ParameterRelation rel : translatedReferenceGoalRelations) |
|
716 | { |
|
717 | // get relation reference parameter label |
|
718 | String refParamLabel = rel.getReferenceParameterLabel(); |
|
719 | // get label index |
|
720 | int pIndex = rel.getReference().getParameterIndexByLabel(refParamLabel); |
|
721 | // get goal decision parameter label |
|
722 | String label = goal.getParameterLabelByIndex(pIndex); |
|
723 | ||
724 | // update relation |
|
725 | rel.setReference(goal); |
|
726 | rel.setReferenceParameterLabel(label); |
|
727 | } |
|
728 | ||
729 | // translated back parameter relations |
|
730 | for (ParameterRelation rel : translatedTargetGoalRelations) |
|
731 | { |
|
732 | // check relation |
|
733 | switch (rel.getType()) |
|
734 | { |
|
735 | case EQUAL_PARAMETER : |
|
736 | { |
|
737 | // get equal relation |
|
738 | EqualParameterRelation eqRel = (EqualParameterRelation) rel; |
|
739 | // get relation reference parameter label |
|
740 | String tarParamLabel = eqRel.getTargetParameterLabel(); |
|
741 | // get label index |
|
742 | int pIndex = eqRel.getTarget().getParameterIndexByLabel(tarParamLabel); |
|
743 | // get goal decision parameter label |
|
744 | String label = goal.getParameterLabelByIndex(pIndex); |
|
745 | ||
746 | // update relation |
|
747 | eqRel.setTarget(goal); |
|
748 | eqRel.setTargetParameterLabel(label); |
|
749 | } |
|
750 | break; |
|
751 | ||
752 | case NOT_EQUAL_PARAMETER : |
|
753 | { |
|
754 | // get equal relation |
|
755 | NotEqualParameterRelation neqRel = (NotEqualParameterRelation) rel; |
|
756 | // get relation reference parameter label |
|
757 | String tarParamLabel = neqRel.getTargetParameterLabel(); |
|
758 | // get label index |
|
759 | int pIndex = neqRel.getTarget().getParameterIndexByLabel(tarParamLabel); |
|
760 | // get goal decision parameter label |
|
761 | String label = goal.getParameterLabelByIndex(pIndex); |
|
762 | ||
763 | // update relation |
|
764 | neqRel.setTarget(goal); |
|
765 | neqRel.setTargetParameterLabel(label); |
|
766 | } |
|
767 | break; |
|
768 | ||
769 | default: |
|
770 | // unknown parameter relation |
|
771 | throw new RuntimeException("Unknown Parameter relation type : " + rel.getType() + "\n"); |
|
772 | ||
773 | } |
|
774 | } |
|
775 | } |
|
776 | } |
|
777 | ||
778 | // get feasibility flag |
|
779 | return feasible; |
|
780 | } |
|
781 | ||
782 | /** |
@@ 532-782 (lines=251) @@ | ||
529 | * @param decision |
|
530 | * @return |
|
531 | */ |
|
532 | private boolean isPredicateUnificationFeasible(Decision goal, Decision decision) { |
|
533 | ||
534 | // feasibility flag |
|
535 | boolean feasible = true; |
|
536 | // first check if the decisions refer to the same values |
|
537 | if (!decision.getValue().equals(goal.getValue()) && |
|
538 | decision.getComponent().equals(goal.getComponent())) { |
|
539 | ||
540 | // not feasible unification |
|
541 | feasible = false; |
|
542 | debug("Not feasible predicate unification:\n" |
|
543 | + "- planning goal: " + goal + "\n" |
|
544 | + "- unification decision: " + decision + "\n"); |
|
545 | } else { |
|
546 | ||
547 | // list of committed parameter constraints |
|
548 | Set<Relation> committed = new HashSet<>(); |
|
549 | // list of translated parameter relations - reference |
|
550 | Set<ParameterRelation> translatedReferenceGoalRelations = new HashSet<>(); |
|
551 | // list of translated parameter relations - target |
|
552 | Set<ParameterRelation> translatedTargetGoalRelations = new HashSet<>(); |
|
553 | ||
554 | // get goal component |
|
555 | DomainComponent goalComp = goal.getComponent(); |
|
556 | // get all (pending) relation concerning the goal decision |
|
557 | Set<Relation> pending = goalComp.getRelations(goal); |
|
558 | // check relations |
|
559 | for (Relation rel : pending) |
|
560 | { |
|
561 | // check parameter constraint type |
|
562 | if (rel.getCategory().equals(ConstraintCategory.PARAMETER_CONSTRAINT)) |
|
563 | { |
|
564 | // check relation type |
|
565 | switch (rel.getType()) |
|
566 | { |
|
567 | // bind parameter |
|
568 | case BIND_PARAMETER: |
|
569 | { |
|
570 | // the goal can be only the reference of the relation |
|
571 | ParameterRelation pRel = (ParameterRelation) rel; |
|
572 | ||
573 | // get relation reference parameter label |
|
574 | String refParamLabel = pRel.getReferenceParameterLabel(); |
|
575 | // get label index |
|
576 | int refParameterIndex = pRel.getReference().getParameterIndexByLabel(refParamLabel); |
|
577 | // get unification decision parameter label |
|
578 | String label = decision.getParameterLabelByIndex(refParameterIndex); |
|
579 | ||
580 | // update reference decision |
|
581 | pRel.setReference(decision); |
|
582 | ||
583 | // update reference label of the relation |
|
584 | pRel.setReferenceParameterLabel(label); |
|
585 | // add relation to the list of translated ones |
|
586 | translatedReferenceGoalRelations.add(pRel); |
|
587 | } |
|
588 | break; |
|
589 | ||
590 | case EQUAL_PARAMETER : |
|
591 | { |
|
592 | // get parameter relation |
|
593 | EqualParameterRelation eqRel = (EqualParameterRelation) rel; |
|
594 | // check if the goal is the reference or the parameter constraint |
|
595 | if (eqRel.getReference().equals(goal)) |
|
596 | { |
|
597 | // get relation reference parameter label |
|
598 | String refParamLabel = eqRel.getReferenceParameterLabel(); |
|
599 | // get label index |
|
600 | int refParameterIndex = eqRel.getReference().getParameterIndexByLabel(refParamLabel); |
|
601 | // get unification decision parameter label |
|
602 | String label = decision.getParameterLabelByIndex(refParameterIndex); |
|
603 | ||
604 | // update reference decision |
|
605 | eqRel.setReference(decision); |
|
606 | // update reference label of the relation |
|
607 | eqRel.setReferenceParameterLabel(label); |
|
608 | // add relation to the list of translated ones |
|
609 | translatedReferenceGoalRelations.add(eqRel); |
|
610 | } |
|
611 | else // the goal is the target of the relation |
|
612 | { |
|
613 | // get relation reference parameter label |
|
614 | String refParamLabel = eqRel.getTargetParameterLabel(); |
|
615 | // get label index |
|
616 | int refParameterIndex = eqRel.getTarget().getParameterIndexByLabel(refParamLabel); |
|
617 | // get unification decision parameter label |
|
618 | String label = decision.getParameterLabelByIndex(refParameterIndex); |
|
619 | ||
620 | // update reference decision |
|
621 | eqRel.setTarget(decision); |
|
622 | // update reference label of the relation |
|
623 | eqRel.setTargetParameterLabel(label); |
|
624 | // add relation to the list of translated ones |
|
625 | translatedTargetGoalRelations.add(eqRel); |
|
626 | } |
|
627 | } |
|
628 | break; |
|
629 | ||
630 | case NOT_EQUAL_PARAMETER : |
|
631 | { |
|
632 | // get parameter relation |
|
633 | NotEqualParameterRelation neqRel = (NotEqualParameterRelation) rel; |
|
634 | // check if the goal is the reference or the parameter constraint |
|
635 | if (neqRel.getReference().equals(goal)) |
|
636 | { |
|
637 | // get relation reference parameter label |
|
638 | String refParamLabel = neqRel.getReferenceParameterLabel(); |
|
639 | // get label index |
|
640 | int refParameterIndex = neqRel.getReference().getParameterIndexByLabel(refParamLabel); |
|
641 | // get unification decision parameter label |
|
642 | String label = decision.getParameterLabelByIndex(refParameterIndex); |
|
643 | ||
644 | // update reference decision |
|
645 | neqRel.setReference(decision); |
|
646 | // update reference label of the relation |
|
647 | neqRel.setReferenceParameterLabel(label); |
|
648 | // add relation to the list of translated ones |
|
649 | translatedReferenceGoalRelations.add(neqRel); |
|
650 | } |
|
651 | else // the goal is the target of the relation |
|
652 | { |
|
653 | // get relation reference parameter label |
|
654 | String refParamLabel = neqRel.getTargetParameterLabel(); |
|
655 | // get label index |
|
656 | int refParameterIndex = neqRel.getTarget().getParameterIndexByLabel(refParamLabel); |
|
657 | // get unification decision parameter label |
|
658 | String label = decision.getParameterLabelByIndex(refParameterIndex); |
|
659 | ||
660 | // update reference decision |
|
661 | neqRel.setTarget(decision); |
|
662 | // update reference label of the relation |
|
663 | neqRel.setTargetParameterLabel(label); |
|
664 | // add relation to the list of translated ones |
|
665 | translatedTargetGoalRelations.add(neqRel); |
|
666 | } |
|
667 | } |
|
668 | break; |
|
669 | ||
670 | ||
671 | default: |
|
672 | // unknown parameter relation |
|
673 | throw new RuntimeException("Unknown Parameter relation type : " + rel.getType() + "\n"); |
|
674 | } |
|
675 | } |
|
676 | } |
|
677 | ||
678 | try { |
|
679 | ||
680 | // activate translated relations |
|
681 | for (Relation rel : translatedReferenceGoalRelations) { |
|
682 | // check if can be activated |
|
683 | if (rel.getReference().getComponent().activate(rel)) { |
|
684 | // add relation to the committed list |
|
685 | committed.add(rel); |
|
686 | } |
|
687 | } |
|
688 | ||
689 | // activate translated relations |
|
690 | for (Relation rel : translatedTargetGoalRelations) { |
|
691 | // check if can be activated |
|
692 | if (rel.getReference().getComponent().activate(rel)) { |
|
693 | // add relation to the committed list |
|
694 | committed.add(rel); |
|
695 | } |
|
696 | } |
|
697 | ||
698 | // check parameter of the plan |
|
699 | this.pdb.verify(); |
|
700 | } |
|
701 | catch (ConsistencyCheckException | RelationPropagationException ex) { |
|
702 | // not feasible |
|
703 | feasible = false; |
|
704 | // not feasible unification |
|
705 | debug("Not feasible predicate unification:\n" |
|
706 | + "- planning goal: " + goal + "\n" |
|
707 | + "- unification decision: " + decision + "\n"); |
|
708 | ||
709 | } finally { |
|
710 | ||
711 | // check committed relations |
|
712 | for (Relation rel : committed) { |
|
713 | // deactivate relation |
|
714 | rel.getReference().getComponent().deactivate(rel); |
|
715 | } |
|
716 | ||
717 | // translated back parameter relations |
|
718 | for (ParameterRelation rel : translatedReferenceGoalRelations) { |
|
719 | ||
720 | // get relation reference parameter label |
|
721 | String refParamLabel = rel.getReferenceParameterLabel(); |
|
722 | // get label index |
|
723 | int pIndex = rel.getReference().getParameterIndexByLabel(refParamLabel); |
|
724 | // get goal decision parameter label |
|
725 | String label = goal.getParameterLabelByIndex(pIndex); |
|
726 | ||
727 | // update relation |
|
728 | rel.setReference(goal); |
|
729 | rel.setReferenceParameterLabel(label); |
|
730 | } |
|
731 | ||
732 | // translated back parameter relations |
|
733 | for (ParameterRelation rel : translatedTargetGoalRelations) |
|
734 | { |
|
735 | // check relation |
|
736 | switch (rel.getType()) |
|
737 | { |
|
738 | case EQUAL_PARAMETER : |
|
739 | { |
|
740 | // get equal relation |
|
741 | EqualParameterRelation eqRel = (EqualParameterRelation) rel; |
|
742 | // get relation reference parameter label |
|
743 | String tarParamLabel = eqRel.getTargetParameterLabel(); |
|
744 | // get label index |
|
745 | int pIndex = eqRel.getTarget().getParameterIndexByLabel(tarParamLabel); |
|
746 | // get goal decision parameter label |
|
747 | String label = goal.getParameterLabelByIndex(pIndex); |
|
748 | ||
749 | // update relation |
|
750 | eqRel.setTarget(goal); |
|
751 | eqRel.setTargetParameterLabel(label); |
|
752 | } |
|
753 | break; |
|
754 | ||
755 | case NOT_EQUAL_PARAMETER : |
|
756 | { |
|
757 | // get equal relation |
|
758 | NotEqualParameterRelation neqRel = (NotEqualParameterRelation) rel; |
|
759 | // get relation reference parameter label |
|
760 | String tarParamLabel = neqRel.getTargetParameterLabel(); |
|
761 | // get label index |
|
762 | int pIndex = neqRel.getTarget().getParameterIndexByLabel(tarParamLabel); |
|
763 | // get goal decision parameter label |
|
764 | String label = goal.getParameterLabelByIndex(pIndex); |
|
765 | ||
766 | // update relation |
|
767 | neqRel.setTarget(goal); |
|
768 | neqRel.setTargetParameterLabel(label); |
|
769 | } |
|
770 | break; |
|
771 | ||
772 | default: |
|
773 | // unknown parameter relation |
|
774 | throw new RuntimeException("Unknown Parameter relation type : " + rel.getType() + "\n"); |
|
775 | ||
776 | } |
|
777 | } |
|
778 | } |
|
779 | } |
|
780 | ||
781 | // get feasibility flag |
|
782 | return feasible; |
|
783 | } |
|
784 | ||
785 | /** |