|
45 | 45 | TRUE_PREDICATE, |
46 | 46 | ) |
47 | 47 | from plan4past.exceptions import ProblemUnsolvableException |
48 | | -from plan4past.helpers.compilation_helper import CompilationManager, YesterdayAtom |
| 48 | +from plan4past.helpers.compilation_helper import ( |
| 49 | + CompilationManager, |
| 50 | + PredicateMapping, |
| 51 | + YesterdayAtom, |
| 52 | +) |
49 | 53 | from plan4past.helpers.utils import ( |
50 | 54 | add_val_prefix, |
51 | 55 | check_, |
|
55 | 59 | ) |
56 | 60 | from plan4past.helpers.yesterday_atom_helper import QUOTED_ATOM |
57 | 61 | from plan4past.utils.atoms_visitor import find_atoms |
58 | | -from plan4past.utils.derived_visitor import derived_predicates |
| 62 | +from plan4past.utils.derived_visitor import DerivedPredicatesVisitor |
59 | 63 | from plan4past.utils.dnf_visitor import dnf |
60 | 64 | from plan4past.utils.nnf_visitor import nnf |
61 | | -from plan4past.utils.predicates_visitor import predicates |
| 65 | +from plan4past.utils.predicates_visitor import PredicatesVisitor |
62 | 66 | from plan4past.utils.pylogics2pddl import Pylogics2PddlTranslator |
63 | 67 | from plan4past.utils.rewrite_formula_visitor import rewrite |
64 | | -from plan4past.utils.val_predicates_visitor import val_predicates |
| 68 | +from plan4past.utils.val_predicates_visitor import ValPredicatesVisitor |
65 | 69 |
|
66 | 70 |
|
67 | 71 | class Compiler: |
@@ -93,6 +97,7 @@ def __init__( |
93 | 97 |
|
94 | 98 | check_(self.formula.logic == Logic.PLTL, "only PPLTL is supported!") |
95 | 99 |
|
| 100 | + self._predicate_mapping = PredicateMapping() |
96 | 101 | self._executed: bool = False |
97 | 102 | self._result_domain: Optional[Domain] = None |
98 | 103 | self._result_problem: Optional[Problem] = None |
@@ -134,18 +139,27 @@ def result(self) -> Tuple[Domain, Problem]: |
134 | 139 |
|
135 | 140 | def compile(self): |
136 | 141 | """Compute the new domain and the new problem.""" |
137 | | - if not self._executed: |
138 | | - self._compile_domain() |
139 | | - self._compile_problem() |
140 | | - self._executed = True |
| 142 | + if self._executed: |
| 143 | + return |
| 144 | + |
| 145 | + self._compile_domain() |
| 146 | + self._compile_problem() |
| 147 | + |
| 148 | + self._executed = True |
141 | 149 |
|
142 | 150 | def _compile_domain(self): |
143 | 151 | """Compute the new domain.""" |
144 | | - new_predicates = predicates(self.formula).union(val_predicates(self.formula)) |
145 | | - new_derived_predicates = derived_predicates( |
146 | | - self.formula, self.from_atoms_to_fluent |
| 152 | + subformula_predicates_set = PredicatesVisitor(self._predicate_mapping).visit( |
| 153 | + self.formula |
| 154 | + ) |
| 155 | + val_predicates_set = ValPredicatesVisitor(self._predicate_mapping).visit( |
| 156 | + self.formula |
147 | 157 | ) |
148 | | - new_whens = _compute_whens(self.formula) |
| 158 | + new_predicates = subformula_predicates_set.union(val_predicates_set) |
| 159 | + new_derived_predicates = DerivedPredicatesVisitor( |
| 160 | + self._predicate_mapping, self.from_atoms_to_fluent |
| 161 | + ).visit(self.formula) |
| 162 | + new_whens = _compute_whens(subformula_predicates_set) |
149 | 163 | domain_actions = _update_domain_actions_det(self.domain.actions, new_whens) |
150 | 164 |
|
151 | 165 | self._result_domain = Domain( |
@@ -174,26 +188,25 @@ def _compile_problem(self): |
174 | 188 | else set(self.problem.init) |
175 | 189 | ) |
176 | 190 |
|
| 191 | + goal_predicate = self._predicate_mapping.get_predicate(self.formula) |
177 | 192 | self._result_problem = Problem( |
178 | 193 | name=self.problem.name, |
179 | 194 | domain_name=self.domain.name, |
180 | 195 | requirements=self.problem.requirements, |
181 | 196 | objects=[*self.problem.objects], |
182 | 197 | init=new_init, |
183 | | - goal=And( |
184 | | - Predicate(add_val_prefix(replace_symbols(to_string(self.formula)))) |
185 | | - ), |
| 198 | + goal=And(Predicate(add_val_prefix(goal_predicate.name))), |
186 | 199 | ) |
187 | 200 |
|
188 | 201 |
|
189 | | -def _compute_whens(formula: Formula) -> Set[When]: |
| 202 | +def _compute_whens(predicates: Set[Predicate]) -> Set[When]: |
190 | 203 | """Compute conditional effects for formula progression.""" |
191 | 204 | return { |
192 | 205 | When(Predicate(add_val_prefix(remove_yesterday_prefix(p.name))), p) |
193 | | - for p in predicates(formula) |
| 206 | + for p in predicates |
194 | 207 | }.union( |
195 | 208 | When(Not(Predicate(add_val_prefix(remove_yesterday_prefix(p.name)))), Not(p)) |
196 | | - for p in predicates(formula) |
| 209 | + for p in predicates |
197 | 210 | ) |
198 | 211 |
|
199 | 212 |
|
|
0 commit comments