From fde55c1fb95c3d228f436b87fcc22a47a0754e57 Mon Sep 17 00:00:00 2001 From: haz Date: Fri, 23 Jun 2023 02:52:15 +0000 Subject: [PATCH] [auto] Update docs and distribution --- dist/macq-0.3.3.tar.gz | Bin 70382 -> 0 bytes ...ne-any.whl => macq-0.3.4-py3-none-any.whl} | Bin 87218 -> 87801 bytes dist/macq-0.3.4.tar.gz | Bin 0 -> 70974 bytes docs/macq.html | 2 +- docs/macq/extract.html | 2398 +++++++++-------- docs/macq/generate.html | 16 +- docs/macq/generate/pddl.html | 305 ++- docs/macq/observation.html | 298 +- docs/macq/trace.html | 498 +++- docs/macq/utils.html | 16 +- docs/macq/utils/progress.html | 59 +- docs/search.js | 2 +- 12 files changed, 2498 insertions(+), 1096 deletions(-) delete mode 100644 dist/macq-0.3.3.tar.gz rename dist/{macq-0.3.3-py3-none-any.whl => macq-0.3.4-py3-none-any.whl} (74%) create mode 100644 dist/macq-0.3.4.tar.gz diff --git a/dist/macq-0.3.3.tar.gz b/dist/macq-0.3.3.tar.gz deleted file mode 100644 index 8a3c1e7e7c2dcb3f5cb20852c3a64799b57ae2fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70382 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
  • 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 E0CtZ`&Hw-a diff --git a/dist/macq-0.3.3-py3-none-any.whl b/dist/macq-0.3.4-py3-none-any.whl similarity index 74% rename from dist/macq-0.3.3-py3-none-any.whl rename to dist/macq-0.3.4-py3-none-any.whl index 4a880c6f0ec2e31ce356935a45a46f7408fa83bb..eba4b776dc20ce9a45125836a0321b09ac0f6d61 100644 GIT binary patch delta 16971 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 U5CGtM`82%&09Hg^E&<^G0|W5*jsO4v diff --git a/dist/macq-0.3.4.tar.gz b/dist/macq-0.3.4.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..92602495034f03dd09e0624f42196d912f1f198f GIT binary patch literal 70974 zcmV)5K*_%!iwFqR2$f_4|7~GoaV;<|GcGhPbYXG;?7ho&8%dHVm}`867u2@}WP(8g zq#lhfW*0?K5>HDaugI$G9tZ~&1OjA;fe2&-z(?}1Pw%E?dslbP%&cZN%UR7=^heZ} zjG6f(+&w%307a=%l|*HUK!m&b%iP?|+#cS#xBiDi|LRTPkAn2OFY?*opR&Ij8=G7C zcYNM%Z$0UJ$F9En3ZHp4^HXU4z6be@d^*qBWEM_>?e^2>&$gaFf7aRZHlDV(+E2D> z-#vW(?mrWM`19I^x9M%If3Y@jKRkQ#1pl_5J!#YL_OnfM&l~%Hv$NIyjy?IB`#+t> zaTNg^CByTo_uuIL_kIoZzw@+6|2H4#|5u^^9gF^NYfI#|KINK?!7DE>m{qJl%d1meZtq$^k8((w(|3>NmyZvMKHXH_V7Sw9H$@Dr6PtRtoF>JC9tPK0_ z^B{;HXYAdaz4cFOwZkBtgjp6QF$*(x7No(+H9JlHcovLWY@7xGOU7(?=BKAYi_H?| z$JcBcq#0C5PG)`>hw&-%*$|qlLCM(}fXR~a?9xvIC_G|*mLtT8(aSp7)Us5hyRQQ$|lFlP8pzG9c*>@1njSQ=!rG#ny~77OEHG#_Cfqt9=Dnjb*!3w+=uAvehEFcfl8HHzFsqH{X$(yURA-dHlu?VHg5eCGVDWJh zMad-&ZJ5NP5J!}CYqeu|<)0)M0gZ((Z=B4atGo-i0MmR`#jEVhk0N#whzWysVS0US zI4L#{dncZSe#E9pO6}Rh^q~DWd+g}o)$va|ANJV(5j*^F@TdKkdoNji=Lmk+TkNO( z<2MI?JZ4bh!_NETe`g1;*v|WZXaBnY{$-2p{oCP(y`v*`@S(Q=!i?+Agt+xxKl27d0m*nhi!{O_&WtNr8m2=mp! z2e!iwcRn2N@BZ=a&Ifk*#}9`GM|;rxO91wc_s1XLXA4I8;aFAuY5!=i#dbdI zAK`?&`f%{BRm16o8V3Xf>b>9NP;jc5u_90efB*4lPXS~v_jcX_tRt+9LzIQR2gcy< z?c+V@e;)Kd5Bi@6{(o!z@LylA!GU-1wfX<2Pm28iCd&U0{Qp4^U1_due)rA7;5BaciE5II4LiKY?y{qM5eXf z1aW7!c6>br9GnGLGuSri`6#)JYcQCL5RiUt?+S3P3&Qb*MAx-fAVWj9xu&O9d&J)D z41We(0g>$;VeF2EvByagorkkpt@pd$?tZ_q#J*kki7aI6upiFHAdY71!?R#`?p;r! z^%H+|8hF{oX>%o5O==(JHHB5lYlf3kFFOl^Xq0(jvJP`MO~QEgFY`3o&Y@>Bk2e9* zd^+T_My;LszpQU;`oqnQCnsB-(X-({`J=61yxD1QZf>8Sq!49&P2<`hnn)Q`en0@OuK0-?p2pk^fwE?E}LuuA5^j(NoXm;oNvYJdLopQoH2 z3gE+^8MF%Lihzeop#ZnwaF!SGk`qA03*IYHd>?mxIJ-W`U%>%3OD5qE&M(xjXm4=S zo(3}*nGY+8Y~uI!S{Q z1@Y1Y&rf8yniM6pKR7!+-HHe0mF0{{=d zI~y$)&nE)~3;NLX_^+C1!ISU@lOzoq?G3;vff?JPzrBq<{O9qfd9~SKj?2{G&jI^4 zyp1O<#{cy^kALlphID8(=w5?QNSBVb6BKI{1UrZ{KD3zX)qwH%w&^{uM=v+ zIJ%w$faU=UfO4>8IGm?G9{Dicdfz#)B%2kXaVY+H7NpAnnI$tn8Vmtcqlw5$xO+5D zFM{h@?cb9*8~UhIB^6-6#`7p**)W+Bu&IywNZe5woFpmN{?SONK5MA$1+Q=iCGax6 z1Rkl${24KLKr0B}3mE7zq6ujLqYMFCudzV~yA%x1;t)8lj9rFY73q&gT>pt@0Yj

    n30x`Vwx6#e5Q4thNdVcLO5 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 - + macq API documentation diff --git a/docs/macq/extract.html b/docs/macq/extract.html index 9238da0e..ec921f48 100644 --- a/docs/macq/extract.html +++ b/docs/macq/extract.html @@ -3,7 +3,7 @@ - + macq.extract API documentation @@ -86,6 +86,21 @@

    API Documentation

  • LearnedAction
  • +
  • + name +
  • +
  • + obj_params +
  • +
  • + precond +
  • +
  • + add +
  • +
  • + delete +
  • details
  • @@ -113,6 +128,21 @@

    API Documentation

  • LearnedLiftedAction
  • +
  • + name +
  • +
  • + param_sorts +
  • +
  • + precond +
  • +
  • + add +
  • +
  • + delete +
  • details
  • @@ -134,6 +164,12 @@

    API Documentation

  • LearnedFluent
  • +
  • + name +
  • +
  • + objects +
  • details
  • @@ -146,6 +182,15 @@

    API Documentation

  • LearnedLiftedFluent
  • +
  • + name +
  • +
  • + param_sorts +
  • +
  • + param_act_inds +
  • details
  • @@ -158,6 +203,12 @@

    API Documentation

  • Model
  • +
  • + fluents +
  • +
  • + actions +
  • details
  • @@ -279,7 +330,7 @@

    API Documentation

    LOCM
  • - get_state_machines + zero_obj
  • @@ -290,6 +341,12 @@

    API Documentation

  • SLAF
  • +
  • + top +
  • +
  • + bottom +
  • @@ -705,6 +762,61 @@

    API Documentation

    + +
    +
    + name + + +
    + + + + +
    +
    +
    + obj_params + + +
    + + + + +
    +
    +
    + precond + + +
    + + + + +
    +
    +
    + add + + +
    + + + + +
    +
    +
    + delete + + +
    + + + +
    @@ -969,6 +1081,61 @@

    API Documentation

    +
    +
    +
    + name + + +
    + + + + +
    +
    +
    + param_sorts + + +
    + + + + +
    +
    +
    + precond + + +
    + + + + +
    +
    +
    + add + + +
    + + + + +
    +
    +
    + delete + + +
    + + + +
    @@ -1158,6 +1325,28 @@

    API Documentation

    +
    +
    +
    + name + + +
    + + + + +
    +
    +
    + objects + + +
    + + + +
    @@ -1212,7 +1401,7 @@

    API Documentation

    51 return hash(self.details()) 52 53 def __str__(self): -54 return self.details() +54 return self.details() + f" {self.param_act_inds}" 55 56 def __repr__(self): 57 return self.details() @@ -1246,6 +1435,39 @@

    API Documentation

    +
    +
    +
    + name + + +
    + + + + +
    +
    +
    + param_sorts + + +
    + + + + +
    +
    +
    + param_act_inds + + +
    + + + +
    @@ -1411,166 +1633,163 @@

    API Documentation

    148 if not problem_filename: 149 problem_filename = problem_name + ".pddl" 150 -151 if ( -152 isinstance(list(self.fluents)[0], LearnedLiftedFluent) and -153 isinstance(list(self.actions)[0], LearnedLiftedAction) # fmt: skip -154 ): -155 self.to_pddl_lifted( -156 domain_name, problem_name, domain_filename, problem_filename -157 ) -158 elif isinstance(list(self.actions)[0], LearnedAction): -159 self.to_pddl_grounded( -160 domain_name, problem_name, domain_filename, problem_filename -161 ) -162 else: -163 raise ValueError( -164 f"Could not determine whether the model is grounded or lifted. Fluents are of type {type(list(self.fluents)[0])} while actions are of type {type(list(self.actions)[0])}" -165 ) -166 -167 def to_pddl_lifted( -168 self, -169 domain_name: str, -170 problem_name: str, -171 domain_filename: str, -172 problem_filename: str, -173 ): -174 """Dumps a Model with typed lifted actions & fluents to PDDL files. -175 -176 Args: -177 domain_name (str): -178 The name of the domain to be generated. -179 problem_name (str): -180 The name of the problem to be generated. -181 domain_filename (str): -182 The name of the domain file to be generated. -183 problem_filename (str): -184 The name of the problem file to be generated. -185 """ -186 self.fluents: Set[LearnedLiftedFluent] -187 self.actions: Set[LearnedLiftedAction] -188 -189 lang = tarski.language(domain_name) -190 problem = tarski.fstrips.create_fstrips_problem( -191 domain_name=domain_name, problem_name=problem_name, language=lang -192 ) -193 sorts = set() -194 -195 if self.fluents: -196 for f in self.fluents: -197 for sort in f.param_sorts: -198 if sort not in sorts: -199 lang.sort(sort) -200 sorts.add(sort) -201 -202 lang.predicate(f.name, *f.param_sorts) -203 -204 if self.actions: -205 for a in self.actions: -206 vars = [lang.variable(f"x{i}", s) for i, s in enumerate(a.param_sorts)] -207 -208 if len(a.precond) == 1: -209 precond = lang.get(list(a.precond)[0].name)(*[vars[i] for i in a.precond[0].param_act_inds]) # type: ignore -210 else: -211 precond = CompoundFormula( -212 Connective.And, -213 [ -214 lang.get(f.name)(*[vars[i] for i in f.param_act_inds]) # type: ignore -215 for f in a.precond -216 ], -217 ) -218 -219 adds = [lang.get(f.name)(*[vars[i] for i in f.param_act_inds]) for f in a.add] # type: ignore -220 dels = [lang.get(f.name)(*[vars[i] for i in f.param_act_inds]) for f in a.delete] # type: ignore -221 effects = [fs.AddEffect(e) for e in adds] + [fs.DelEffect(e) for e in dels] # fmt: skip -222 -223 problem.action( -224 a.name, -225 parameters=vars, -226 precondition=precond, -227 effects=effects, -228 ) -229 -230 problem.init = tarski.model.create(lang) # type: ignore -231 problem.goal = land() # type: ignore -232 writer = iofs.FstripsWriter(problem) -233 writer.write(domain_filename, problem_filename) -234 -235 def to_pddl_grounded( -236 self, -237 domain_name: str, -238 problem_name: str, -239 domain_filename: str, -240 problem_filename: str, -241 ): -242 """Dumps a Model to two PDDL files. The conversion only uses 0-arity predicates, and no types, objects, -243 or parameters of any kind are used. Actions are represented as ground actions with no parameters. -244 -245 Args: -246 domain_name (str): -247 The name of the domain to be generated. -248 problem_name (str): -249 The name of the problem to be generated. -250 domain_filename (str): -251 The name of the domain file to be generated. -252 problem_filename (str): -253 The name of the problem file to be generated. -254 """ -255 lang = tarski.language(domain_name) -256 problem = tarski.fstrips.create_fstrips_problem( -257 domain_name=domain_name, problem_name=problem_name, language=lang -258 ) -259 if self.fluents: -260 # create 0-arity predicates -261 for f in self.fluents: -262 # NOTE: want there to be no brackets in any fluents referenced as tarski adds these later. -263 # fluents (their string conversion) must be in the following format: (on object a object b) -264 test = str(f) -265 lang.predicate(str(f)[1:-1].replace(" ", "_")) -266 if self.actions: -267 for a in self.actions: -268 # fetch all the relevant 0-arity predicates and create formulas to set up the ground actions -269 preconds = self.__to_tarski_formula({a[1:-1] for a in a.precond}, lang) -270 adds = [lang.get(f"{e.replace(' ', '_')[1:-1]}")() for e in a.add] -271 dels = [lang.get(f"{e.replace(' ', '_')[1:-1]}")() for e in a.delete] -272 effects = [fs.AddEffect(e) for e in adds] -273 effects.extend([fs.DelEffect(e) for e in dels]) -274 # set up action -275 problem.action( -276 name=a.details() -277 .replace("(", "") -278 .replace(")", "") -279 .replace(" ", "_"), -280 parameters=[], -281 precondition=preconds, -282 effects=effects, -283 ) -284 # create empty init and goal -285 problem.init = tarski.model.create(lang) -286 problem.goal = land() -287 # write to files -288 writer = iofs.FstripsWriter(problem) -289 writer.write(domain_filename, problem_filename) +151 if isinstance(list(self.actions)[0], LearnedLiftedAction): +152 self.to_pddl_lifted( +153 domain_name, problem_name, domain_filename, problem_filename +154 ) +155 elif isinstance(list(self.actions)[0], LearnedAction): +156 self.to_pddl_grounded( +157 domain_name, problem_name, domain_filename, problem_filename +158 ) +159 else: +160 raise ValueError( +161 f"Could not determine whether the model is grounded or lifted. Fluents are of type {type(list(self.fluents)[0])} while actions are of type {type(list(self.actions)[0])}" +162 ) +163 +164 def to_pddl_lifted( +165 self, +166 domain_name: str, +167 problem_name: str, +168 domain_filename: str, +169 problem_filename: str, +170 ): +171 """Dumps a Model with typed lifted actions & fluents to PDDL files. +172 +173 Args: +174 domain_name (str): +175 The name of the domain to be generated. +176 problem_name (str): +177 The name of the problem to be generated. +178 domain_filename (str): +179 The name of the domain file to be generated. +180 problem_filename (str): +181 The name of the problem file to be generated. +182 """ +183 self.fluents: Set[LearnedLiftedFluent] +184 self.actions: Set[LearnedLiftedAction] +185 +186 lang = tarski.language(domain_name) +187 problem = tarski.fstrips.create_fstrips_problem( +188 domain_name=domain_name, problem_name=problem_name, language=lang +189 ) +190 sorts = set() +191 +192 if self.fluents: +193 for f in self.fluents: +194 for sort in f.param_sorts: +195 if sort not in sorts: +196 lang.sort(sort) +197 sorts.add(sort) +198 +199 lang.predicate(f.name, *f.param_sorts) +200 +201 if self.actions: +202 for a in self.actions: +203 vars = [lang.variable(f"x{i}", s) for i, s in enumerate(a.param_sorts)] +204 +205 if len(a.precond) == 1: +206 precond = lang.get(list(a.precond)[0].name)(*[vars[i] for i in a.precond[0].param_act_inds]) # type: ignore +207 else: +208 precond = CompoundFormula( +209 Connective.And, +210 [ +211 lang.get(f.name)(*[vars[i] for i in f.param_act_inds]) # type: ignore +212 for f in a.precond +213 ], +214 ) +215 +216 adds = [lang.get(f.name)(*[vars[i] for i in f.param_act_inds]) for f in a.add] # type: ignore +217 dels = [lang.get(f.name)(*[vars[i] for i in f.param_act_inds]) for f in a.delete] # type: ignore +218 effects = [fs.AddEffect(e) for e in adds] + [fs.DelEffect(e) for e in dels] # fmt: skip +219 +220 problem.action( +221 a.name, +222 parameters=vars, +223 precondition=precond, +224 effects=effects, +225 ) +226 +227 problem.init = tarski.model.create(lang) # type: ignore +228 problem.goal = land() # type: ignore +229 writer = iofs.FstripsWriter(problem) +230 writer.write(domain_filename, problem_filename) +231 +232 def to_pddl_grounded( +233 self, +234 domain_name: str, +235 problem_name: str, +236 domain_filename: str, +237 problem_filename: str, +238 ): +239 """Dumps a Model to two PDDL files. The conversion only uses 0-arity predicates, and no types, objects, +240 or parameters of any kind are used. Actions are represented as ground actions with no parameters. +241 +242 Args: +243 domain_name (str): +244 The name of the domain to be generated. +245 problem_name (str): +246 The name of the problem to be generated. +247 domain_filename (str): +248 The name of the domain file to be generated. +249 problem_filename (str): +250 The name of the problem file to be generated. +251 """ +252 lang = tarski.language(domain_name) +253 problem = tarski.fstrips.create_fstrips_problem( +254 domain_name=domain_name, problem_name=problem_name, language=lang +255 ) +256 if self.fluents: +257 # create 0-arity predicates +258 for f in self.fluents: +259 # NOTE: want there to be no brackets in any fluents referenced as tarski adds these later. +260 # fluents (their string conversion) must be in the following format: (on object a object b) +261 test = str(f) +262 lang.predicate(str(f)[1:-1].replace(" ", "_")) +263 if self.actions: +264 for a in self.actions: +265 # fetch all the relevant 0-arity predicates and create formulas to set up the ground actions +266 preconds = self.__to_tarski_formula({a[1:-1] for a in a.precond}, lang) +267 adds = [lang.get(f"{e.replace(' ', '_')[1:-1]}")() for e in a.add] +268 dels = [lang.get(f"{e.replace(' ', '_')[1:-1]}")() for e in a.delete] +269 effects = [fs.AddEffect(e) for e in adds] +270 effects.extend([fs.DelEffect(e) for e in dels]) +271 # set up action +272 problem.action( +273 name=a.details() +274 .replace("(", "") +275 .replace(")", "") +276 .replace(" ", "_"), +277 parameters=[], +278 precondition=preconds, +279 effects=effects, +280 ) +281 # create empty init and goal +282 problem.init = tarski.model.create(lang) +283 problem.goal = land() +284 # write to files +285 writer = iofs.FstripsWriter(problem) +286 writer.write(domain_filename, problem_filename) +287 +288 def _serialize(self): +289 return dict(fluents=list(self.fluents), actions=list(self.actions)) 290 -291 def _serialize(self): -292 return dict(fluents=list(self.fluents), actions=list(self.actions)) -293 -294 @staticmethod -295 def deserialize(string: str): -296 """Deserializes a json string into a Model. -297 -298 Args: -299 string (str): -300 The json string representing a model. -301 -302 Returns: -303 A Model object matching the one specified by `string`. -304 """ -305 return Model._from_json(loads(string)) -306 -307 @classmethod -308 def _from_json(cls, data: dict): -309 actions = set(map(LearnedAction._deserialize, data["actions"])) -310 return cls(set(data["fluents"]), actions) +291 @staticmethod +292 def deserialize(string: str): +293 """Deserializes a json string into a Model. +294 +295 Args: +296 string (str): +297 The json string representing a model. +298 +299 Returns: +300 A Model object matching the one specified by `string`. +301 """ +302 return Model._from_json(loads(string)) +303 +304 @classmethod +305 def _from_json(cls, data: dict): +306 actions = set(map(LearnedAction._deserialize, data["actions"])) +307 return cls(set(data["fluents"]), actions)
    @@ -1627,6 +1846,28 @@

    API Documentation

    + +
    +
    + fluents + + +
    + + + + +
    +
    +
    + actions + + +
    + + + +
    @@ -1727,21 +1968,18 @@

    API Documentation

    148 if not problem_filename: 149 problem_filename = problem_name + ".pddl" 150 -151 if ( -152 isinstance(list(self.fluents)[0], LearnedLiftedFluent) and -153 isinstance(list(self.actions)[0], LearnedLiftedAction) # fmt: skip -154 ): -155 self.to_pddl_lifted( -156 domain_name, problem_name, domain_filename, problem_filename -157 ) -158 elif isinstance(list(self.actions)[0], LearnedAction): -159 self.to_pddl_grounded( -160 domain_name, problem_name, domain_filename, problem_filename -161 ) -162 else: -163 raise ValueError( -164 f"Could not determine whether the model is grounded or lifted. Fluents are of type {type(list(self.fluents)[0])} while actions are of type {type(list(self.actions)[0])}" -165 ) +151 if isinstance(list(self.actions)[0], LearnedLiftedAction): +152 self.to_pddl_lifted( +153 domain_name, problem_name, domain_filename, problem_filename +154 ) +155 elif isinstance(list(self.actions)[0], LearnedAction): +156 self.to_pddl_grounded( +157 domain_name, problem_name, domain_filename, problem_filename +158 ) +159 else: +160 raise ValueError( +161 f"Could not determine whether the model is grounded or lifted. Fluents are of type {type(list(self.fluents)[0])} while actions are of type {type(list(self.actions)[0])}" +162 )
    @@ -1759,73 +1997,73 @@

    API Documentation

    -
    167    def to_pddl_lifted(
    -168        self,
    -169        domain_name: str,
    -170        problem_name: str,
    -171        domain_filename: str,
    -172        problem_filename: str,
    -173    ):
    -174        """Dumps a Model with typed lifted actions & fluents to PDDL files.
    -175
    -176        Args:
    -177            domain_name (str):
    -178                The name of the domain to be generated.
    -179            problem_name (str):
    -180                The name of the problem to be generated.
    -181            domain_filename (str):
    -182                The name of the domain file to be generated.
    -183            problem_filename (str):
    -184                The name of the problem file to be generated.
    -185        """
    -186        self.fluents: Set[LearnedLiftedFluent]
    -187        self.actions: Set[LearnedLiftedAction]
    -188
    -189        lang = tarski.language(domain_name)
    -190        problem = tarski.fstrips.create_fstrips_problem(
    -191            domain_name=domain_name, problem_name=problem_name, language=lang
    -192        )
    -193        sorts = set()
    -194
    -195        if self.fluents:
    -196            for f in self.fluents:
    -197                for sort in f.param_sorts:
    -198                    if sort not in sorts:
    -199                        lang.sort(sort)
    -200                        sorts.add(sort)
    -201
    -202                lang.predicate(f.name, *f.param_sorts)
    -203
    -204        if self.actions:
    -205            for a in self.actions:
    -206                vars = [lang.variable(f"x{i}", s) for i, s in enumerate(a.param_sorts)]
    -207
    -208                if len(a.precond) == 1:
    -209                    precond = lang.get(list(a.precond)[0].name)(*[vars[i] for i in a.precond[0].param_act_inds])  # type: ignore
    -210                else:
    -211                    precond = CompoundFormula(
    -212                        Connective.And,
    -213                        [
    -214                            lang.get(f.name)(*[vars[i] for i in f.param_act_inds])  # type: ignore
    -215                            for f in a.precond
    -216                        ],
    -217                    )
    -218
    -219                adds = [lang.get(f.name)(*[vars[i] for i in f.param_act_inds]) for f in a.add]  # type: ignore
    -220                dels = [lang.get(f.name)(*[vars[i] for i in f.param_act_inds]) for f in a.delete]  # type: ignore
    -221                effects = [fs.AddEffect(e) for e in adds] + [fs.DelEffect(e) for e in dels]  # fmt: skip
    -222
    -223                problem.action(
    -224                    a.name,
    -225                    parameters=vars,
    -226                    precondition=precond,
    -227                    effects=effects,
    -228                )
    -229
    -230        problem.init = tarski.model.create(lang)  # type: ignore
    -231        problem.goal = land()  # type: ignore
    -232        writer = iofs.FstripsWriter(problem)
    -233        writer.write(domain_filename, problem_filename)
    +            
    164    def to_pddl_lifted(
    +165        self,
    +166        domain_name: str,
    +167        problem_name: str,
    +168        domain_filename: str,
    +169        problem_filename: str,
    +170    ):
    +171        """Dumps a Model with typed lifted actions & fluents to PDDL files.
    +172
    +173        Args:
    +174            domain_name (str):
    +175                The name of the domain to be generated.
    +176            problem_name (str):
    +177                The name of the problem to be generated.
    +178            domain_filename (str):
    +179                The name of the domain file to be generated.
    +180            problem_filename (str):
    +181                The name of the problem file to be generated.
    +182        """
    +183        self.fluents: Set[LearnedLiftedFluent]
    +184        self.actions: Set[LearnedLiftedAction]
    +185
    +186        lang = tarski.language(domain_name)
    +187        problem = tarski.fstrips.create_fstrips_problem(
    +188            domain_name=domain_name, problem_name=problem_name, language=lang
    +189        )
    +190        sorts = set()
    +191
    +192        if self.fluents:
    +193            for f in self.fluents:
    +194                for sort in f.param_sorts:
    +195                    if sort not in sorts:
    +196                        lang.sort(sort)
    +197                        sorts.add(sort)
    +198
    +199                lang.predicate(f.name, *f.param_sorts)
    +200
    +201        if self.actions:
    +202            for a in self.actions:
    +203                vars = [lang.variable(f"x{i}", s) for i, s in enumerate(a.param_sorts)]
    +204
    +205                if len(a.precond) == 1:
    +206                    precond = lang.get(list(a.precond)[0].name)(*[vars[i] for i in a.precond[0].param_act_inds])  # type: ignore
    +207                else:
    +208                    precond = CompoundFormula(
    +209                        Connective.And,
    +210                        [
    +211                            lang.get(f.name)(*[vars[i] for i in f.param_act_inds])  # type: ignore
    +212                            for f in a.precond
    +213                        ],
    +214                    )
    +215
    +216                adds = [lang.get(f.name)(*[vars[i] for i in f.param_act_inds]) for f in a.add]  # type: ignore
    +217                dels = [lang.get(f.name)(*[vars[i] for i in f.param_act_inds]) for f in a.delete]  # type: ignore
    +218                effects = [fs.AddEffect(e) for e in adds] + [fs.DelEffect(e) for e in dels]  # fmt: skip
    +219
    +220                problem.action(
    +221                    a.name,
    +222                    parameters=vars,
    +223                    precondition=precond,
    +224                    effects=effects,
    +225                )
    +226
    +227        problem.init = tarski.model.create(lang)  # type: ignore
    +228        problem.goal = land()  # type: ignore
    +229        writer = iofs.FstripsWriter(problem)
    +230        writer.write(domain_filename, problem_filename)
     
    @@ -1855,61 +2093,61 @@

    API Documentation

    -
    235    def to_pddl_grounded(
    -236        self,
    -237        domain_name: str,
    -238        problem_name: str,
    -239        domain_filename: str,
    -240        problem_filename: str,
    -241    ):
    -242        """Dumps a Model to two PDDL files. The conversion only uses 0-arity predicates, and no types, objects,
    -243        or parameters of any kind are used. Actions are represented as ground actions with no parameters.
    -244
    -245        Args:
    -246            domain_name (str):
    -247                The name of the domain to be generated.
    -248            problem_name (str):
    -249                The name of the problem to be generated.
    -250            domain_filename (str):
    -251                The name of the domain file to be generated.
    -252            problem_filename (str):
    -253                The name of the problem file to be generated.
    -254        """
    -255        lang = tarski.language(domain_name)
    -256        problem = tarski.fstrips.create_fstrips_problem(
    -257            domain_name=domain_name, problem_name=problem_name, language=lang
    -258        )
    -259        if self.fluents:
    -260            # create 0-arity predicates
    -261            for f in self.fluents:
    -262                # NOTE: want there to be no brackets in any fluents referenced as tarski adds these later.
    -263                # fluents (their string conversion) must be in the following format: (on object a object b)
    -264                test = str(f)
    -265                lang.predicate(str(f)[1:-1].replace(" ", "_"))
    -266        if self.actions:
    -267            for a in self.actions:
    -268                # fetch all the relevant 0-arity predicates and create formulas to set up the ground actions
    -269                preconds = self.__to_tarski_formula({a[1:-1] for a in a.precond}, lang)
    -270                adds = [lang.get(f"{e.replace(' ', '_')[1:-1]}")() for e in a.add]
    -271                dels = [lang.get(f"{e.replace(' ', '_')[1:-1]}")() for e in a.delete]
    -272                effects = [fs.AddEffect(e) for e in adds]
    -273                effects.extend([fs.DelEffect(e) for e in dels])
    -274                # set up action
    -275                problem.action(
    -276                    name=a.details()
    -277                    .replace("(", "")
    -278                    .replace(")", "")
    -279                    .replace(" ", "_"),
    -280                    parameters=[],
    -281                    precondition=preconds,
    -282                    effects=effects,
    -283                )
    -284        # create empty init and goal
    -285        problem.init = tarski.model.create(lang)
    -286        problem.goal = land()
    -287        # write to files
    -288        writer = iofs.FstripsWriter(problem)
    -289        writer.write(domain_filename, problem_filename)
    +            
    232    def to_pddl_grounded(
    +233        self,
    +234        domain_name: str,
    +235        problem_name: str,
    +236        domain_filename: str,
    +237        problem_filename: str,
    +238    ):
    +239        """Dumps a Model to two PDDL files. The conversion only uses 0-arity predicates, and no types, objects,
    +240        or parameters of any kind are used. Actions are represented as ground actions with no parameters.
    +241
    +242        Args:
    +243            domain_name (str):
    +244                The name of the domain to be generated.
    +245            problem_name (str):
    +246                The name of the problem to be generated.
    +247            domain_filename (str):
    +248                The name of the domain file to be generated.
    +249            problem_filename (str):
    +250                The name of the problem file to be generated.
    +251        """
    +252        lang = tarski.language(domain_name)
    +253        problem = tarski.fstrips.create_fstrips_problem(
    +254            domain_name=domain_name, problem_name=problem_name, language=lang
    +255        )
    +256        if self.fluents:
    +257            # create 0-arity predicates
    +258            for f in self.fluents:
    +259                # NOTE: want there to be no brackets in any fluents referenced as tarski adds these later.
    +260                # fluents (their string conversion) must be in the following format: (on object a object b)
    +261                test = str(f)
    +262                lang.predicate(str(f)[1:-1].replace(" ", "_"))
    +263        if self.actions:
    +264            for a in self.actions:
    +265                # fetch all the relevant 0-arity predicates and create formulas to set up the ground actions
    +266                preconds = self.__to_tarski_formula({a[1:-1] for a in a.precond}, lang)
    +267                adds = [lang.get(f"{e.replace(' ', '_')[1:-1]}")() for e in a.add]
    +268                dels = [lang.get(f"{e.replace(' ', '_')[1:-1]}")() for e in a.delete]
    +269                effects = [fs.AddEffect(e) for e in adds]
    +270                effects.extend([fs.DelEffect(e) for e in dels])
    +271                # set up action
    +272                problem.action(
    +273                    name=a.details()
    +274                    .replace("(", "")
    +275                    .replace(")", "")
    +276                    .replace(" ", "_"),
    +277                    parameters=[],
    +278                    precondition=preconds,
    +279                    effects=effects,
    +280                )
    +281        # create empty init and goal
    +282        problem.init = tarski.model.create(lang)
    +283        problem.goal = land()
    +284        # write to files
    +285        writer = iofs.FstripsWriter(problem)
    +286        writer.write(domain_filename, problem_filename)
     
    @@ -1941,18 +2179,18 @@

    API Documentation

    -
    294    @staticmethod
    -295    def deserialize(string: str):
    -296        """Deserializes a json string into a Model.
    -297
    -298        Args:
    -299            string (str):
    -300                The json string representing a model.
    -301
    -302        Returns:
    -303            A Model object matching the one specified by `string`.
    -304        """
    -305        return Model._from_json(loads(string))
    +            
    291    @staticmethod
    +292    def deserialize(string: str):
    +293        """Deserializes a json string into a Model.
    +294
    +295        Args:
    +296            string (str):
    +297                The json string representing a model.
    +298
    +299        Returns:
    +300            A Model object matching the one specified by `string`.
    +301        """
    +302        return Model._from_json(loads(string))
     
    @@ -2259,6 +2497,7 @@
    Inherited Members
    builtins.BaseException
    with_traceback
    +
    args
    @@ -4110,6 +4349,7 @@
    Inherited Members
    builtins.BaseException
    with_traceback
    +
    args
    @@ -4901,665 +5141,700 @@
    Inherited Members
    -
    166class LOCM:
    -167    """LOCM"""
    -168
    -169    zero_obj = PlanningObject("zero", "zero")
    -170
    -171    def __new__(
    -172        cls,
    -173        obs_tracelist: ObservedTraceList,
    -174        statics: Optional[Statics] = None,
    -175        viz: bool = False,
    -176        view: bool = False,
    -177        debug: Union[bool, Dict[str, bool], List[str]] = False,
    -178    ):
    -179        """Creates a new Model object.
    -180        Args:
    -181            observations (ObservationList):
    -182                The state observations to extract the model from.
    -183            statics (Dict[str, List[str]]):
    -184                A dictionary mapping an action name and its arguments to the
    -185                list of static preconditions of the action. A precondition should
    -186                be a tuple, where the first element is the predicate name and the
    -187                rest correspond to the arguments of the action (1-indexed).
    -188                E.g. static( next(C1, C2), put_on_card_in_homecell(C2, C1, _) )
    -189                should is provided as: {"put_on_card_in_homecell": [("next", 2, 1)]}
    -190            viz (bool):
    -191                Whether to visualize the FSM.
    -192            view (bool):
    -193                Whether to view the FSM visualization.
    -194
    -195        Raises:
    -196            IncompatibleObservationToken:
    -197                Raised if the observations are not identity observation.
    -198        """
    -199        if obs_tracelist.type is not ActionObservation:
    -200            raise IncompatibleObservationToken(obs_tracelist.type, LOCM)
    -201
    -202        if len(obs_tracelist) != 1:
    -203            warn("LOCM only supports a single trace, using first trace only")
    -204
    -205        if isinstance(debug, bool) and debug:
    -206            debug = defaultdict(lambda: True)
    -207        elif isinstance(debug, dict):
    -208            debug = defaultdict(lambda: False, debug)
    -209        elif isinstance(debug, list):
    -210            debug = defaultdict(lambda: False, {k: True for k in debug})
    -211        else:
    -212            debug = defaultdict(lambda: False)
    -213
    -214        obs_trace = obs_tracelist[0]
    -215        fluents, actions = None, None
    -216
    -217        sorts = LOCM._get_sorts(obs_trace, debug=debug["get_sorts"])
    +            
    183class LOCM:
    +184    """LOCM"""
    +185
    +186    zero_obj = PlanningObject("zero", "zero")
    +187
    +188    def __new__(
    +189        cls,
    +190        obs_tracelist: ObservedTraceList,
    +191        statics: Optional[Statics] = None,
    +192        viz: bool = False,
    +193        view: bool = False,
    +194        debug: Union[bool, Dict[str, bool], List[str]] = False,
    +195    ):
    +196        """Creates a new Model object.
    +197        Args:
    +198            observations (ObservationList):
    +199                The state observations to extract the model from.
    +200            statics (Dict[str, List[str]]):
    +201                A dictionary mapping an action name and its arguments to the
    +202                list of static preconditions of the action. A precondition should
    +203                be a tuple, where the first element is the predicate name and the
    +204                rest correspond to the arguments of the action (1-indexed).
    +205                E.g. static( next(C1, C2), put_on_card_in_homecell(C2, C1, _) )
    +206                should is provided as: {"put_on_card_in_homecell": [("next", 2, 1)]}
    +207            viz (bool):
    +208                Whether to visualize the FSM.
    +209            view (bool):
    +210                Whether to view the FSM visualization.
    +211
    +212        Raises:
    +213            IncompatibleObservationToken:
    +214                Raised if the observations are not identity observation.
    +215        """
    +216        if obs_tracelist.type is not ActionObservation:
    +217            raise IncompatibleObservationToken(obs_tracelist.type, LOCM)
     218
    -219        if debug["sorts"]:
    -220            print(f"Sorts:\n{sorts}", end="\n\n")
    +219        if len(obs_tracelist) != 1:
    +220            warn("LOCM only supports a single trace, using first trace only")
     221
    -222        TS, ap_state_pointers, OS = LOCM._step1(obs_trace, sorts, debug["step1"])
    -223        HS = LOCM._step3(TS, ap_state_pointers, OS, sorts, debug["step3"])
    -224        bindings = LOCM._step4(HS, debug["step4"])
    -225        bindings = LOCM._step5(HS, bindings, debug["step5"])
    -226        fluents, actions = LOCM._step7(
    -227            OS,
    -228            ap_state_pointers,
    -229            sorts,
    -230            bindings,
    -231            statics if statics is not None else {},
    -232            debug["step7"],
    -233        )
    -234
    -235        if viz:
    -236            state_machines = LOCM.get_state_machines(ap_state_pointers, OS, bindings)
    -237            for sm in state_machines:
    -238                sm.render(view=view)
    -239
    -240        return Model(fluents, actions)
    -241
    -242    @staticmethod
    -243    def _get_sorts(obs_trace: List[Observation], debug=False) -> Sorts:
    -244        sorts = []  # initialize list of sorts for this trace
    -245        # track actions seen in the trace, and the sort each actions params belong to
    -246        ap_sort_pointers: Dict[str, List[int]] = {}
    -247        # track objects seen in the trace, and the sort each belongs to
    -248        # obj_sort_pointers: Dict[str, int] = {}
    -249        sorted_objs = []
    -250
    -251        def get_obj_sort(obj: PlanningObject) -> int:
    -252            """Returns the sort index of the object"""
    -253            for i, sort in enumerate(sorts):
    -254                if obj in sort:
    -255                    return i
    -256            raise ValueError(f"Object {obj} not in any sort")
    +222        if isinstance(debug, bool) and debug:
    +223            debug = defaultdict(lambda: True)
    +224        elif isinstance(debug, dict):
    +225            debug = defaultdict(lambda: False, debug)
    +226        elif isinstance(debug, list):
    +227            debug = defaultdict(lambda: False, {k: True for k in debug})
    +228        else:
    +229            debug = defaultdict(lambda: False)
    +230
    +231        obs_trace = obs_tracelist[0]
    +232        fluents, actions = None, None
    +233
    +234        sorts = LOCM._get_sorts(obs_trace, debug=debug["get_sorts"])
    +235
    +236        if debug["sorts"]:
    +237            sortid2objs = {v: [] for v in set(sorts.values())}
    +238            for k, v in sorts.items():
    +239                sortid2objs[v].append(k)
    +240            print("\nSorts:\n")
    +241            pprint(sortid2objs)
    +242            print("\n")
    +243
    +244        TS, ap_state_pointers, OS = LOCM._step1(obs_trace, sorts, debug["step1"])
    +245        HS = LOCM._step3(TS, ap_state_pointers, OS, sorts, debug["step3"])
    +246        bindings = LOCM._step4(HS, debug["step4"])
    +247        bindings = LOCM._step5(HS, bindings, debug["step5"])
    +248        fluents, actions = LOCM._step7(
    +249            OS,
    +250            ap_state_pointers,
    +251            sorts,
    +252            bindings,
    +253            statics if statics is not None else {},
    +254            debug["step7"],
    +255            viz,
    +256        )
     257
    -258        for obs in obs_trace:
    -259            action = obs.action
    -260            if action is None:
    -261                continue
    -262
    -263            if debug:
    -264                print("\n\naction:", action.name, action.obj_params)
    -265
    -266            if action.name not in ap_sort_pointers:  # new action
    -267                if debug:
    -268                    print("new action")
    -269
    -270                ap_sort_pointers[action.name] = []
    -271
    -272                # for each parameter of the action
    -273                for obj in action.obj_params:
    -274                    if obj.name not in sorted_objs:  # unsorted object
    -275                        # append a sort (set) containing the object
    -276                        sorts.append({obj})
    -277
    -278                        # record the object has been sorted and the index of the sort it belongs to
    -279                        obj_sort = len(sorts) - 1
    -280                        sorted_objs.append(obj.name)
    -281                        ap_sort_pointers[action.name].append(obj_sort)
    -282
    -283                        if debug:
    -284                            print("new object", obj.name)
    -285                            print("sorts:", sorts)
    -286
    -287                    else:  # object already sorted
    -288                        # look up the sort of the object
    -289                        obj_sort = get_obj_sort(obj)
    -290                        ap_sort_pointers[action.name].append(obj_sort)
    -291
    -292                        if debug:
    -293                            print("sorted object", obj.name)
    -294                            print("sorts:", sorts)
    +258        return Model(fluents, actions)
    +259
    +260    @staticmethod
    +261    def _get_sorts(obs_trace: List[Observation], debug=False) -> Sorts:
    +262        sorts = []  # initialize list of sorts for this trace
    +263        # track actions seen in the trace, and the sort each actions params belong to
    +264        ap_sort_pointers: Dict[str, List[int]] = {}
    +265        # track objects seen in the trace, and the sort each belongs to
    +266        # obj_sort_pointers: Dict[str, int] = {}
    +267        sorted_objs = []
    +268
    +269        def get_obj_sort(obj: PlanningObject) -> int:
    +270            """Returns the sort index of the object"""
    +271            for i, sort in enumerate(sorts):
    +272                if obj in sort:
    +273                    return i
    +274            raise ValueError(f"Object {obj} not in any sort")
    +275
    +276        for obs in obs_trace:
    +277            action = obs.action
    +278            if action is None:
    +279                continue
    +280
    +281            if debug:
    +282                print("\n\naction:", action.name, action.obj_params)
    +283
    +284            if action.name not in ap_sort_pointers:  # new action
    +285                if debug:
    +286                    print("new action")
    +287
    +288                ap_sort_pointers[action.name] = []
    +289
    +290                # for each parameter of the action
    +291                for obj in action.obj_params:
    +292                    if obj.name not in sorted_objs:  # unsorted object
    +293                        # append a sort (set) containing the object
    +294                        sorts.append({obj})
     295
    -296                if debug:
    -297                    print("ap sorts:", ap_sort_pointers)
    -298
    -299            else:  # action seen before
    -300                if debug:
    -301                    print("seen action")
    -302
    -303                for ap_sort, obj in zip(
    -304                    ap_sort_pointers[action.name], action.obj_params
    -305                ):
    -306                    if debug:
    -307                        print("checking obj", obj.name)
    -308                        print("ap sort:", ap_sort)
    +296                        # record the object has been sorted and the index of the sort it belongs to
    +297                        obj_sort = len(sorts) - 1
    +298                        sorted_objs.append(obj.name)
    +299                        ap_sort_pointers[action.name].append(obj_sort)
    +300
    +301                        if debug:
    +302                            print("new object", obj.name)
    +303                            print("sorts:", sorts)
    +304
    +305                    else:  # object already sorted
    +306                        # look up the sort of the object
    +307                        obj_sort = get_obj_sort(obj)
    +308                        ap_sort_pointers[action.name].append(obj_sort)
     309
    -310                    if obj.name not in sorted_objs:  # unsorted object
    -311                        if debug:
    -312                            print("unsorted object", obj.name)
    -313                            print("sorts:", sorts)
    -314
    -315                        # add the object to the sort of current action parameter
    -316                        sorts[ap_sort].add(obj)
    -317                        sorted_objs.append(obj.name)
    -318
    -319                    else:  # object already has a sort
    -320                        # retrieve the sort the object belongs to
    -321                        obj_sort = get_obj_sort(obj)
    -322
    -323                        if debug:
    -324                            print(f"retrieving sorted obj {obj.name}")
    -325                            print(f"obj_sort_idx: {obj_sort}")
    -326                            print(f"seq_sorts: {sorts}")
    +310                        if debug:
    +311                            print("sorted object", obj.name)
    +312                            print("sorts:", sorts)
    +313
    +314                if debug:
    +315                    print("ap sorts:", ap_sort_pointers)
    +316
    +317            else:  # action seen before
    +318                if debug:
    +319                    print("seen action")
    +320
    +321                for ap_sort, obj in zip(
    +322                    ap_sort_pointers[action.name], action.obj_params
    +323                ):
    +324                    if debug:
    +325                        print("checking obj", obj.name)
    +326                        print("ap sort:", ap_sort)
     327
    -328                        # check if the object's sort matches the action paremeter's
    -329                        # if so, do nothing and move on to next step
    -330                        # otherwise, unite the two sorts
    -331                        if obj_sort == ap_sort:
    -332                            if debug:
    -333                                print("obj sort matches action")
    -334                        else:
    -335                            if debug:
    -336                                print(
    -337                                    f"obj sort {obj_sort} doesn't match action {ap_sort}"
    -338                                )
    -339                                print(f"seq_sorts: {sorts}")
    +328                    if obj.name not in sorted_objs:  # unsorted object
    +329                        if debug:
    +330                            print("unsorted object", obj.name)
    +331                            print("sorts:", sorts)
    +332
    +333                        # add the object to the sort of current action parameter
    +334                        sorts[ap_sort].add(obj)
    +335                        sorted_objs.append(obj.name)
    +336
    +337                    else:  # object already has a sort
    +338                        # retrieve the sort the object belongs to
    +339                        obj_sort = get_obj_sort(obj)
     340
    -341                            # unite the action parameter's sort and the object's sort
    -342                            sorts[obj_sort] = sorts[obj_sort].union(sorts[ap_sort])
    -343
    -344                            # drop the not unionized sort
    -345                            sorts.pop(ap_sort)
    -346
    -347                            old_obj_sort = obj_sort
    -348
    -349                            obj_sort = get_obj_sort(obj)
    -350
    -351                            if debug:
    -352                                print(
    -353                                    f"united seq_sorts[{ap_sort}] and seq_sorts[{obj_sort}]"
    -354                                )
    -355                                print(f"seq_sorts: {sorts}")
    -356                                print(f"ap_sort_pointers: {ap_sort_pointers}")
    -357                                print("updating pointers...")
    +341                        if debug:
    +342                            print(f"retrieving sorted obj {obj.name}")
    +343                            print(f"obj_sort_idx: {obj_sort}")
    +344                            print(f"seq_sorts: {sorts}")
    +345
    +346                        # check if the object's sort matches the action paremeter's
    +347                        # if so, do nothing and move on to next step
    +348                        # otherwise, unite the two sorts
    +349                        if obj_sort == ap_sort:
    +350                            if debug:
    +351                                print("obj sort matches action")
    +352                        else:
    +353                            if debug:
    +354                                print(
    +355                                    f"obj sort {obj_sort} doesn't match action {ap_sort}"
    +356                                )
    +357                                print(f"seq_sorts: {sorts}")
     358
    -359                            min_idx = min(ap_sort, obj_sort)
    -360
    -361                            # update all outdated records of which sort the affected objects belong to
    -362                            for action_name, ap_sorts in ap_sort_pointers.items():
    -363                                for p, sort in enumerate(ap_sorts):
    -364                                    if sort == ap_sort or sort == old_obj_sort:
    -365                                        ap_sort_pointers[action_name][p] = obj_sort
    -366                                    elif sort > min_idx:
    -367                                        ap_sort_pointers[action_name][p] -= 1
    +359                            # unite the action parameter's sort and the object's sort
    +360                            sorts[obj_sort] = sorts[obj_sort].union(sorts[ap_sort])
    +361
    +362                            # drop the not unionized sort
    +363                            sorts.pop(ap_sort)
    +364
    +365                            old_obj_sort = obj_sort
    +366
    +367                            obj_sort = get_obj_sort(obj)
     368
     369                            if debug:
    -370                                print(f"ap_sort_pointers: {ap_sort_pointers}")
    -371
    -372        obj_sorts = {}
    -373        for i, sort in enumerate(sorts):
    -374            for obj in sort:
    -375                # NOTE: object sorts are 1-indexed so the zero-object can be sort 0
    -376                obj_sorts[obj.name] = i + 1
    -377
    -378        return obj_sorts
    -379
    -380    @staticmethod
    -381    def _pointer_to_set(states: List[Set], pointer, pointer2=None) -> Tuple[int, int]:
    -382        state1, state2 = None, None
    -383        for i, state_set in enumerate(states):
    -384            if pointer in state_set:
    -385                state1 = i
    -386            if pointer2 is None or pointer2 in state_set:
    -387                state2 = i
    -388            if state1 is not None and state2 is not None:
    -389                break
    -390
    -391        assert state1 is not None, f"Pointer ({pointer}) not in states: {states}"
    -392        assert state2 is not None, f"Pointer ({pointer2}) not in states: {states}"
    -393        return state1, state2
    -394
    -395    @staticmethod
    -396    def _step1(
    -397        obs_trace: List[Observation], sorts: Sorts, debug: bool = False
    -398    ) -> Tuple[TSType, APStatePointers, OSType]:
    -399        """Step 1: Create a state machine for each object sort
    -400        Implicitly includes Step 2 (zero analysis) by including the zero-object throughout
    -401        """
    -402
    -403        # create the zero-object for zero analysis (step 2)
    -404        zero_obj = LOCM.zero_obj
    -405
    -406        # collect action sequences for each object
    -407        obj_traces: Dict[PlanningObject, List[AP]] = defaultdict(list)
    -408        for obs in obs_trace:
    -409            action = obs.action
    -410            if action is not None:
    -411                # add the step for the zero-object
    -412                obj_traces[zero_obj].append(AP(action, pos=0, sort=0))
    -413                # for each combination of action name A and argument pos P
    -414                for j, obj in enumerate(action.obj_params):
    -415                    # create transition A.P
    -416                    ap = AP(action, pos=j + 1, sort=sorts[obj.name])
    -417                    obj_traces[obj].append(ap)
    -418
    -419        # initialize the state set OS and transition set TS
    -420        OS: OSType = defaultdict(list)
    -421        TS: TSType = defaultdict(dict)
    -422        # track pointers mapping A.P to its start and end states
    -423        ap_state_pointers = defaultdict(dict)
    -424        # iterate over each object and its action sequence
    -425        for obj, seq in obj_traces.items():
    -426            state_n = 1  # count current (new) state id
    -427            sort = sorts[obj.name] if obj != zero_obj else 0
    -428            TS[sort][obj] = seq  # add the sequence to the transition set
    -429            prev_states: StatePointers = None  # type: ignore
    -430            # iterate over each transition A.P in the sequence
    -431            for ap in seq:
    -432                # if the transition has not been seen before for the current sort
    -433                if ap not in ap_state_pointers[sort]:
    -434                    ap_state_pointers[sort][ap] = StatePointers(state_n, state_n + 1)
    -435
    -436                    # add the start and end states to the state set as unique states
    -437                    OS[sort].append({state_n})
    -438                    OS[sort].append({state_n + 1})
    -439
    -440                    state_n += 2
    -441
    -442                ap_states = ap_state_pointers[sort][ap]
    -443
    -444                if prev_states is not None:
    -445                    # get the state ids (indecies) of the state sets containing
    -446                    # start(A.P) and the end state of the previous transition
    -447                    start_state, prev_end_state = LOCM._pointer_to_set(
    -448                        OS[sort], ap_states.start, prev_states.end
    -449                    )
    -450
    -451                    # if not the same state set, merge the two
    -452                    if start_state != prev_end_state:
    -453                        OS[sort][start_state] = OS[sort][start_state].union(
    -454                            OS[sort][prev_end_state]
    -455                        )
    -456                        OS[sort].pop(prev_end_state)
    -457
    -458                prev_states = ap_states
    -459
    -460        # remove the zero-object sort if it only has one state
    -461        if len(OS[0]) == 1:
    -462            ap_state_pointers[0] = {}
    -463            OS[0] = []
    +370                                print(
    +371                                    f"united seq_sorts[{ap_sort}] and seq_sorts[{obj_sort}]"
    +372                                )
    +373                                print(f"seq_sorts: {sorts}")
    +374                                print(f"ap_sort_pointers: {ap_sort_pointers}")
    +375                                print("updating pointers...")
    +376
    +377                            min_idx = min(ap_sort, obj_sort)
    +378
    +379                            # update all outdated records of which sort the affected objects belong to
    +380                            for action_name, ap_sorts in ap_sort_pointers.items():
    +381                                for p, sort in enumerate(ap_sorts):
    +382                                    if sort == ap_sort or sort == old_obj_sort:
    +383                                        ap_sort_pointers[action_name][p] = obj_sort
    +384                                    elif sort > min_idx:
    +385                                        ap_sort_pointers[action_name][p] -= 1
    +386
    +387                            if debug:
    +388                                print(f"ap_sort_pointers: {ap_sort_pointers}")
    +389
    +390        obj_sorts = {}
    +391        for i, sort in enumerate(sorts):
    +392            for obj in sort:
    +393                # NOTE: object sorts are 1-indexed so the zero-object can be sort 0
    +394                obj_sorts[obj.name] = i + 1
    +395
    +396        return obj_sorts
    +397
    +398    @staticmethod
    +399    def _pointer_to_set(states: List[Set], pointer, pointer2=None) -> Tuple[int, int]:
    +400        state1, state2 = None, None
    +401        for i, state_set in enumerate(states):
    +402            if pointer in state_set:
    +403                state1 = i
    +404            if pointer2 is None or pointer2 in state_set:
    +405                state2 = i
    +406            if state1 is not None and state2 is not None:
    +407                break
    +408
    +409        assert state1 is not None, f"Pointer ({pointer}) not in states: {states}"
    +410        assert state2 is not None, f"Pointer ({pointer2}) not in states: {states}"
    +411        return state1, state2
    +412
    +413    @staticmethod
    +414    def _step1(
    +415        obs_trace: List[Observation], sorts: Sorts, debug: bool = False
    +416    ) -> Tuple[TSType, APStatePointers, OSType]:
    +417        """Step 1: Create a state machine for each object sort
    +418        Implicitly includes Step 2 (zero analysis) by including the zero-object throughout
    +419        """
    +420
    +421        # create the zero-object for zero analysis (step 2)
    +422        zero_obj = LOCM.zero_obj
    +423
    +424        # collect action sequences for each object
    +425        obj_traces: Dict[PlanningObject, List[AP]] = defaultdict(list)
    +426        for obs in obs_trace:
    +427            action = obs.action
    +428            if action is not None:
    +429                # add the step for the zero-object
    +430                obj_traces[zero_obj].append(AP(action, pos=0, sort=0))
    +431                # for each combination of action name A and argument pos P
    +432                for j, obj in enumerate(action.obj_params):
    +433                    # create transition A.P
    +434                    ap = AP(action, pos=j + 1, sort=sorts[obj.name])
    +435                    obj_traces[obj].append(ap)
    +436
    +437        # initialize the state set OS and transition set TS
    +438        OS: OSType = defaultdict(list)
    +439        TS: TSType = defaultdict(dict)
    +440        # track pointers mapping A.P to its start and end states
    +441        ap_state_pointers = defaultdict(dict)
    +442        # iterate over each object and its action sequence
    +443        for obj, seq in obj_traces.items():
    +444            sort = sorts[obj.name] if obj != zero_obj else 0
    +445            TS[sort][obj] = seq  # add the sequence to the transition set
    +446            # max of the states already in OS[sort], plus 1
    +447            state_n = (
    +448                max([max(s) for s in OS[sort]] + [0]) + 1
    +449            )  # count current (new) state id
    +450            prev_states: StatePointers = None  # type: ignore
    +451            # iterate over each transition A.P in the sequence
    +452            for ap in seq:
    +453                # if the transition has not been seen before for the current sort
    +454                if ap not in ap_state_pointers[sort]:
    +455                    ap_state_pointers[sort][ap] = StatePointers(state_n, state_n + 1)
    +456
    +457                    # add the start and end states to the state set as unique states
    +458                    OS[sort].append({state_n})
    +459                    OS[sort].append({state_n + 1})
    +460
    +461                    state_n += 2
    +462
    +463                ap_states = ap_state_pointers[sort][ap]
     464
    -465        return dict(TS), dict(ap_state_pointers), dict(OS)
    -466
    -467    @staticmethod
    -468    def _step3(
    -469        TS: TSType,
    -470        ap_state_pointers: APStatePointers,
    -471        OS: OSType,
    -472        sorts: Sorts,
    -473        debug: bool = False,
    -474    ) -> Hypotheses:
    -475        """Step 3: Induction of parameterised FSMs"""
    -476
    -477        zero_obj = LOCM.zero_obj
    -478
    -479        # indexed by B.k and C.l for 3.2 matching hypotheses against transitions
    -480        HS: Dict[HSIndex, Set[HSItem]] = defaultdict(set)
    +465                if prev_states is not None:
    +466                    # get the state ids (indecies) of the state sets containing
    +467                    # start(A.P) and the end state of the previous transition
    +468                    start_state, prev_end_state = LOCM._pointer_to_set(
    +469                        OS[sort], ap_states.start, prev_states.end
    +470                    )
    +471
    +472                    # if not the same state set, merge the two
    +473                    if start_state != prev_end_state:
    +474                        OS[sort][start_state] = OS[sort][start_state].union(
    +475                            OS[sort][prev_end_state]
    +476                        )
    +477                        OS[sort].pop(prev_end_state)
    +478                    assert len(set.union(*OS[sort])) == sum([len(s) for s in OS[sort]])
    +479
    +480                prev_states = ap_states
     481
    -482        # 3.1: Form hypotheses from state machines
    -483        for G, sort_ts in TS.items():
    -484            # for each O ∈ O_u (not including the zero-object)
    -485            for obj, seq in sort_ts.items():
    -486                if obj == zero_obj:
    -487                    continue
    -488                # for each pair of transitions B.k and C.l consecutive for O
    -489                for B, C in zip(seq, seq[1:]):
    -490                    # skip if B or C only have one parameter, since there is no k' or l' to match on
    -491                    if len(B.action.obj_params) == 1 or len(C.action.obj_params) == 1:
    -492                        continue
    -493
    -494                    k = B.pos
    -495                    l = C.pos
    -496
    -497                    # check each pair B.k' and C.l'
    -498                    for i, Bk_ in enumerate(B.action.obj_params):
    -499                        k_ = i + 1
    -500                        if k_ == k:
    -501                            continue
    -502                        G_ = sorts[Bk_.name]
    -503                        for j, Cl_ in enumerate(C.action.obj_params):
    -504                            l_ = j + 1
    -505                            if l_ == l:
    -506                                continue
    -507
    -508                            # check that B.k' and C.l' are of the same sort
    -509                            if sorts[Cl_.name] == G_:
    -510                                # check that end(B.P) = start(C.P)
    -511                                # NOTE: just a sanity check, should never fail
    -512                                S, S2 = LOCM._pointer_to_set(
    -513                                    OS[G],
    -514                                    ap_state_pointers[G][B].end,
    -515                                    ap_state_pointers[G][C].start,
    -516                                )
    -517                                assert (
    -518                                    S == S2
    -519                                ), f"end(B.P) != start(C.P)\nB.P: {B}\nC.P: {C}"
    -520
    -521                                # save the hypothesis in the hypothesis set
    -522                                HS[HSIndex(B, k, C, l)].add(
    -523                                    HSItem(S, k_, l_, G, G_, supported=False)
    -524                                )
    -525
    -526        # 3.2: Test hypotheses against sequence
    -527        for G, sort_ts in TS.items():
    -528            # for each O ∈ O_u (not including the zero-object)
    -529            for obj, seq in sort_ts.items():
    -530                if obj == zero_obj:
    -531                    continue
    -532                # for each pair of transitions Ap.m and Aq.n consecutive for O
    -533                for Ap, Aq in zip(seq, seq[1:]):
    -534                    m = Ap.pos
    -535                    n = Aq.pos
    -536                    # Check if we have a hypothesis matching Ap=B, m=k, Aq=C, n=l
    -537                    BkCl = HSIndex(Ap, m, Aq, n)
    -538                    if BkCl in HS:
    -539                        # check each matching hypothesis
    -540                        for H in HS[BkCl].copy():
    -541                            # if Op,k' = Oq,l' then mark the hypothesis as supported
    -542                            if (
    -543                                Ap.action.obj_params[H.k_ - 1]
    -544                                == Aq.action.obj_params[H.l_ - 1]
    -545                            ):
    -546                                H.supported = True
    -547                            else:  # otherwise remove the hypothesis
    -548                                HS[BkCl].remove(H)
    -549
    -550        # Remove any unsupported hypotheses (but yet undisputed)
    -551        for hind, hs in HS.copy().items():
    -552            for h in hs:
    -553                if not h.supported:
    -554                    hs.remove(h)
    -555            if len(hs) == 0:
    -556                del HS[hind]
    -557
    -558        # Converts HS {HSIndex: HSItem} to a mapping of hypothesis for states of a sort {sort: {state: Hypothesis}}
    -559        return Hypothesis.from_dict(HS)
    -560
    -561    @staticmethod
    -562    def _step4(
    -563        HS: Dict[int, Dict[int, Set[Hypothesis]]], debug: bool = False
    -564    ) -> Bindings:
    -565        """Step 4: Creation and merging of state parameters"""
    -566
    -567        # bindings = {sort: {state: [(hypothesis, state param)]}}
    -568        bindings: Bindings = defaultdict(dict)
    -569        for sort, hs_sort in HS.items():
    -570            for state, hs_sort_state in hs_sort.items():
    -571                # state_bindings = {hypothesis (h): state param (v)}
    -572                state_bindings: Dict[Hypothesis, int] = {}
    -573
    -574                # state_params = [set(v)]; params in the same set are the same
    -575                state_params: List[Set[int]] = []
    -576
    -577                # state_param_pointers = {v: P}; maps state param to the state_params set index
    -578                # i.e. map hypothesis state param v -> actual state param P
    -579                state_param_pointers: Dict[int, int] = {}
    -580
    -581                # for each hypothesis h,
    -582                hs_sort_state = list(hs_sort_state)
    -583                for v, h in enumerate(hs_sort_state):
    -584                    # add the <h, v> binding pair
    -585                    state_bindings[h] = v
    -586                    # add a param v as a unique state parameter
    -587                    state_params.append({v})
    -588                    state_param_pointers[v] = v
    -589
    -590                # for each (unordered) pair of hypotheses h1, h2
    -591                for i, h1 in enumerate(hs_sort_state):
    -592                    for h2 in hs_sort_state[i + 1 :]:
    -593                        # check if hypothesis parameters (v1 & v2) need to be unified
    -594                        if (
    -595                            (h1.B == h2.B and h1.k == h2.k and h1.k_ == h2.k_)
    -596                            or
    -597                            (h1.C == h2.C and h1.l == h2.l and h1.l_ == h2.l_)  # fmt: skip
    -598                        ):
    -599                            v1 = state_bindings[h1]
    -600                            v2 = state_bindings[h2]
    -601
    -602                            # get the parameter sets P1, P2 that v1, v2 belong to
    -603                            P1, P2 = LOCM._pointer_to_set(state_params, v1, v2)
    -604
    -605                            if P1 != P2:
    -606                                # merge P1 and P2
    -607                                state_params[P1] = state_params[P1].union(
    -608                                    state_params[P2]
    -609                                )
    -610                                state_params.pop(P2)
    -611                                state_param_pointers[v2] = P1
    -612
    -613                # add state bindings for the sort to the output bindings
    -614                # replacing hypothesis params with actual state params
    -615                bindings[sort][state] = [
    -616                    Binding(h, LOCM._pointer_to_set(state_params, v)[0])
    -617                    for h, v in state_bindings.items()
    -618                ]
    -619
    -620        return dict(bindings)
    -621
    -622    @staticmethod
    -623    def _step5(
    -624        HS: Dict[int, Dict[int, Set[Hypothesis]]],
    -625        bindings: Bindings,
    -626        debug: bool = False,
    -627    ) -> Bindings:
    -628        """Step 5: Removing parameter flaws"""
    -629
    -630        # check each bindings[G][S] -> (h, P)
    -631        for sort, hs_sort in HS.items():
    -632            for state in hs_sort:
    -633                # track all the h.Bs that occur in bindings[G][S]
    -634                all_hB = set()
    -635                # track the set of h.B that set parameter P
    -636                sets_P = defaultdict(set)
    -637                for h, P in bindings[sort][state]:
    -638                    sets_P[P].add(h.B)
    -639                    all_hB.add(h.B)
    -640
    -641                # for each P, check if there is a transition h.B that never sets parameter P
    -642                # i.e. if sets_P[P] != all_hB
    -643                for P, setby in sets_P.items():
    -644                    if not setby == all_hB:  # P is a flawed parameter
    -645                        # remove all bindings referencing P
    -646                        for h, P_ in bindings[sort][state].copy():
    -647                            if P_ == P:
    -648                                bindings[sort][state].remove(Binding(h, P_))
    -649                        if len(bindings[sort][state]) == 0:
    -650                            del bindings[sort][state]
    -651
    -652        for k, v in bindings.copy().items():
    -653            if not v:
    -654                del bindings[k]
    -655
    -656        return bindings
    -657
    -658    @staticmethod
    -659    def get_state_machines(
    -660        ap_state_pointers: APStatePointers,
    -661        OS: OSType,
    -662        bindings: Optional[Bindings] = None,
    -663    ):
    -664        from graphviz import Digraph
    -665
    -666        state_machines = []
    -667        for (sort, trans), states in zip(ap_state_pointers.items(), OS.values()):
    -668            graph = Digraph(f"LOCM-step1-sort{sort}")
    -669            for state in range(len(states)):
    -670                label = f"state{state}"
    -671                if (
    -672                    bindings is not None
    -673                    and sort in bindings
    -674                    and state in bindings[sort]
    -675                ):
    -676                    label += f"\n["
    -677                    params = []
    -678                    for binding in bindings[sort][state]:
    -679                        params.append(f"{binding.hypothesis.G_}")
    -680                    label += f",".join(params)
    -681                    label += f"]"
    -682                graph.node(str(state), label=label, shape="oval")
    -683            for ap, apstate in trans.items():
    -684                start_idx, end_idx = LOCM._pointer_to_set(
    -685                    states, apstate.start, apstate.end
    -686                )
    -687                graph.edge(
    -688                    str(start_idx), str(end_idx), label=f"{ap.action.name}.{ap.pos}"
    -689                )
    +482        # remove the zero-object sort if it only has one state
    +483        if len(OS[0]) == 1:
    +484            ap_state_pointers[0] = {}
    +485            OS[0] = []
    +486
    +487        return dict(TS), dict(ap_state_pointers), dict(OS)
    +488
    +489    @staticmethod
    +490    def _step3(
    +491        TS: TSType,
    +492        ap_state_pointers: APStatePointers,
    +493        OS: OSType,
    +494        sorts: Sorts,
    +495        debug: bool = False,
    +496    ) -> Hypotheses:
    +497        """Step 3: Induction of parameterised FSMs"""
    +498
    +499        zero_obj = LOCM.zero_obj
    +500
    +501        # indexed by B.k and C.l for 3.2 matching hypotheses against transitions
    +502        HS: Dict[HSIndex, Set[HSItem]] = defaultdict(set)
    +503
    +504        # 3.1: Form hypotheses from state machines
    +505        for G, sort_ts in TS.items():
    +506            # for each O ∈ O_u (not including the zero-object)
    +507            for obj, seq in sort_ts.items():
    +508                if obj == zero_obj:
    +509                    continue
    +510                # for each pair of transitions B.k and C.l consecutive for O
    +511                for B, C in zip(seq, seq[1:]):
    +512                    # skip if B or C only have one parameter, since there is no k' or l' to match on
    +513                    if len(B.action.obj_params) == 1 or len(C.action.obj_params) == 1:
    +514                        continue
    +515
    +516                    k = B.pos
    +517                    l = C.pos
    +518
    +519                    # check each pair B.k' and C.l'
    +520                    for i, Bk_ in enumerate(B.action.obj_params):
    +521                        k_ = i + 1
    +522                        if k_ == k:
    +523                            continue
    +524                        G_ = sorts[Bk_.name]
    +525                        for j, Cl_ in enumerate(C.action.obj_params):
    +526                            l_ = j + 1
    +527                            if l_ == l:
    +528                                continue
    +529
    +530                            # check that B.k' and C.l' are of the same sort
    +531                            if sorts[Cl_.name] == G_:
    +532                                # check that end(B.P) = start(C.P)
    +533                                # NOTE: just a sanity check, should never fail
    +534                                S, S2 = LOCM._pointer_to_set(
    +535                                    OS[G],
    +536                                    ap_state_pointers[G][B].end,
    +537                                    ap_state_pointers[G][C].start,
    +538                                )
    +539                                assert (
    +540                                    S == S2
    +541                                ), f"end(B.P) != start(C.P)\nB.P: {B}\nC.P: {C}"
    +542
    +543                                # save the hypothesis in the hypothesis set
    +544                                HS[HSIndex(B, k, C, l)].add(
    +545                                    HSItem(S, k_, l_, G, G_, supported=False)
    +546                                )
    +547
    +548        # 3.2: Test hypotheses against sequence
    +549        for G, sort_ts in TS.items():
    +550            # for each O ∈ O_u (not including the zero-object)
    +551            for obj, seq in sort_ts.items():
    +552                if obj == zero_obj:
    +553                    continue
    +554                # for each pair of transitions Ap.m and Aq.n consecutive for O
    +555                for Ap, Aq in zip(seq, seq[1:]):
    +556                    m = Ap.pos
    +557                    n = Aq.pos
    +558                    # Check if we have a hypothesis matching Ap=B, m=k, Aq=C, n=l
    +559                    BkCl = HSIndex(Ap, m, Aq, n)
    +560                    if BkCl in HS:
    +561                        # check each matching hypothesis
    +562                        for H in HS[BkCl].copy():
    +563                            # if Op,k' = Oq,l' then mark the hypothesis as supported
    +564                            if (
    +565                                Ap.action.obj_params[H.k_ - 1]
    +566                                == Aq.action.obj_params[H.l_ - 1]
    +567                            ):
    +568                                H.supported = True
    +569                            else:  # otherwise remove the hypothesis
    +570                                HS[BkCl].remove(H)
    +571
    +572        # Remove any unsupported hypotheses (but yet undisputed)
    +573        for hind, hs in HS.copy().items():
    +574            for h in hs.copy():
    +575                if not h.supported:
    +576                    hs.remove(h)
    +577            if len(hs) == 0:
    +578                del HS[hind]
    +579
    +580        # Converts HS {HSIndex: HSItem} to a mapping of hypothesis for states of a sort {sort: {state: Hypothesis}}
    +581        return Hypothesis.from_dict(HS)
    +582
    +583    @staticmethod
    +584    def _step4(HS: Hypotheses, debug: bool = False) -> Bindings:
    +585        """Step 4: Creation and merging of state parameters"""
    +586        # bindings = {sort: {state: [(hypothesis, state param)]}}
    +587        bindings: Bindings = defaultdict(dict)
    +588        for sort, hs_sort in HS.items():
    +589            for state, hs_sort_state in hs_sort.items():
    +590                # state_bindings = {hypothesis (h): state param (v)}
    +591                state_bindings: Dict[Hypothesis, int] = {}
    +592
    +593                # state_params = [set(v)]; params in the same set are the same
    +594                state_params: List[Set[int]] = []
    +595
    +596                # state_param_pointers = {v: P}; maps state param to the state_params set index
    +597                # i.e. map hypothesis state param v -> actual state param P
    +598                state_param_pointers: Dict[int, int] = {}
    +599
    +600                # for each hypothesis h,
    +601                hs_sort_state = list(hs_sort_state)
    +602                for v, h in enumerate(hs_sort_state):
    +603                    # add the <h, v> binding pair
    +604                    state_bindings[h] = v
    +605                    # add a param v as a unique state parameter
    +606                    state_params.append({v})
    +607                    state_param_pointers[v] = v
    +608
    +609                # for each (unordered) pair of hypotheses h1, h2
    +610                for i, h1 in enumerate(hs_sort_state):
    +611                    for h2 in hs_sort_state[i + 1 :]:
    +612                        # check if hypothesis parameters (v1 & v2) need to be unified
    +613                        if (
    +614                            (h1.B == h2.B and h1.k == h2.k and h1.k_ == h2.k_)
    +615                                    and   # See https://github.com/AI-Planning/macq/discussions/200
    +616                            (h1.C == h2.C and h1.l == h2.l and h1.l_ == h2.l_)  # fmt: skip
    +617                        ):
    +618                            v1 = state_bindings[h1]
    +619                            v2 = state_bindings[h2]
    +620
    +621                            # get the parameter sets P1, P2 that v1, v2 belong to
    +622                            P1, P2 = LOCM._pointer_to_set(state_params, v1, v2)
    +623
    +624                            if P1 != P2:
    +625                                # merge P1 and P2
    +626                                state_params[P1] = state_params[P1].union(
    +627                                    state_params[P2]
    +628                                )
    +629                                state_params.pop(P2)
    +630                                state_param_pointers[v2] = P1
    +631
    +632                                # fix state_param_pointers after v2
    +633                                for ind in range(v2 + 1, len(state_param_pointers)):
    +634                                    state_param_pointers[ind] -= 1
    +635
    +636                # add state bindings for the sort to the output bindings
    +637                # replacing hypothesis params with actual state params
    +638                bindings[sort][state] = [
    +639                    Binding(h, LOCM._pointer_to_set(state_params, v)[0])
    +640                    for h, v in state_bindings.items()
    +641                ]
    +642
    +643        return dict(bindings)
    +644
    +645    @staticmethod
    +646    def _step5(
    +647        HS: Hypotheses,
    +648        bindings: Bindings,
    +649        debug: bool = False,
    +650    ) -> Bindings:
    +651        """Step 5: Removing parameter flaws"""
    +652
    +653        # check each bindings[G][S] -> (h, P)
    +654        for sort, hs_sort in HS.items():
    +655            for state_id in hs_sort:
    +656                # track all the h.Bs that occur in bindings[G][S]
    +657                all_hB = set()
    +658                # track the set of h.B that set parameter P
    +659                sets_P = defaultdict(set)
    +660                for h, P in bindings[sort][state_id]:
    +661                    sets_P[P].add(h.B)
    +662                    all_hB.add(h.B)
    +663
    +664                # for each P, check if there is a transition h.B that never sets parameter P
    +665                # i.e. if sets_P[P] != all_hB
    +666                for P, setby in sets_P.items():
    +667                    if not setby == all_hB:  # P is a flawed parameter
    +668                        # remove all bindings referencing P
    +669                        for h, P_ in bindings[sort][state_id].copy():
    +670                            if P_ == P:
    +671                                bindings[sort][state_id].remove(Binding(h, P_))
    +672                        if len(bindings[sort][state_id]) == 0:
    +673                            del bindings[sort][state_id]
    +674
    +675                # do the same for checking h.C reading parameter P
    +676                # See https://github.com/AI-Planning/macq/discussions/200
    +677                all_hC = set()
    +678                reads_P = defaultdict(set)
    +679                if state_id in bindings[sort]:
    +680                    for h, P in bindings[sort][state_id]:
    +681                        reads_P[P].add(h.C)
    +682                        all_hC.add(h.C)
    +683                    for P, readby in reads_P.items():
    +684                        if not readby == all_hC:
    +685                            for h, P_ in bindings[sort][state_id].copy():
    +686                                if P_ == P:
    +687                                    bindings[sort][state_id].remove(Binding(h, P_))
    +688                            if len(bindings[sort][state_id]) == 0:
    +689                                del bindings[sort][state_id]
     690
    -691            state_machines.append(graph)
    -692
    -693        return state_machines
    +691        for k, v in bindings.copy().items():
    +692            if not v:
    +693                del bindings[k]
     694
    -695    @staticmethod
    -696    def _step7(
    -697        OS: OSType,
    -698        ap_state_pointers: APStatePointers,
    -699        sorts: Sorts,
    -700        bindings: Bindings,
    -701        statics: Statics,
    -702        debug: bool = False,
    -703    ) -> Tuple[Set[LearnedLiftedFluent], Set[LearnedLiftedAction]]:
    -704        """Step 7: Formation of PDDL action schema
    -705        Implicitly includes Step 6 (statics) by including statics as an argument
    -706        and adding to the relevant actions while being constructed.
    -707        """
    -708
    -709        # delete zero-object if it's state machine was discarded
    -710        if not OS[0]:
    -711            del OS[0]
    -712            del ap_state_pointers[0]
    -713
    -714        if debug:
    -715            print("ap state pointers")
    -716            pprint(ap_state_pointers)
    -717            print()
    -718
    -719            print("OS:")
    -720            pprint(OS)
    -721            print()
    -722
    -723            print("bindings:")
    -724            pprint(bindings)
    -725            print()
    -726
    -727        bound_param_sorts = {
    -728            sort: {
    -729                state: [
    -730                    binding.hypothesis.G_
    -731                    for binding in bindings.get(sort, {}).get(state, [])
    -732                ]
    -733                for state in range(len(states))
    -734            }
    -735            for sort, states in OS.items()
    -736        }
    +695        return bindings
    +696
    +697    @staticmethod
    +698    def _debug_state_machines(OS, ap_state_pointers, state_params):
    +699        import os
    +700
    +701        import networkx as nx
    +702
    +703        for sort in OS:
    +704            G = nx.DiGraph()
    +705            for n in range(len(OS[sort])):
    +706                lbl = f"state{n}"
    +707                if (
    +708                    state_params is not None
    +709                    and sort in state_params
    +710                    and n in state_params[sort]
    +711                ):
    +712                    lbl += str(
    +713                        [
    +714                            state_params[sort][n][v]
    +715                            for v in sorted(state_params[sort][n].keys())
    +716                        ]
    +717                    )
    +718                G.add_node(n, label=lbl, shape="oval")
    +719            for ap, apstate in ap_state_pointers[sort].items():
    +720                start_idx, end_idx = LOCM._pointer_to_set(
    +721                    OS[sort], apstate.start, apstate.end
    +722                )
    +723                # check if edge is already in graph
    +724                if G.has_edge(start_idx, end_idx):
    +725                    # append to the edge label
    +726                    G.edges[start_idx, end_idx][
    +727                        "label"
    +728                    ] += f"\n{ap.action.name}.{ap.pos}"
    +729                else:
    +730                    G.add_edge(start_idx, end_idx, label=f"{ap.action.name}.{ap.pos}")
    +731            # write to dot file
    +732            nx.drawing.nx_pydot.write_dot(G, f"LOCM-step7-sort{sort}.dot")
    +733            os.system(
    +734                f"dot -Tpng LOCM-step7-sort{sort}.dot -o LOCM-step7-sort{sort}.png"
    +735            )
    +736            os.system(f"rm LOCM-step7-sort{sort}.dot")
     737
    -738        actions = {}
    -739        fluents = defaultdict(dict)
    -740
    -741        all_aps: Dict[str, List[AP]] = defaultdict(list)
    -742        for aps in ap_state_pointers.values():
    -743            for ap in aps:
    -744                all_aps[ap.action.name].append(ap)
    -745
    -746        for action, aps in all_aps.items():
    -747            actions[action] = LearnedLiftedAction(
    -748                action, [f"sort{ap.sort}" for ap in aps]
    -749            )
    -750
    -751        @dataclass
    -752        class TemplateFluent:
    -753            name: str
    -754            param_sorts: List[str]
    -755
    -756            def __hash__(self) -> int:
    -757                return hash(self.name + "".join(self.param_sorts))
    -758
    -759        for sort, state_bindings in bound_param_sorts.items():
    -760            for state, bound_sorts in state_bindings.items():
    -761                fluents[sort][state] = TemplateFluent(
    -762                    f"sort{sort}_state{state}",
    -763                    [f"sort{sort}"] + [f"sort{s}" for s in bound_sorts],
    -764                )
    -765
    -766        for (sort, aps), states in zip(ap_state_pointers.items(), OS.values()):
    -767            for ap, pointers in aps.items():
    -768                start_state, end_state = LOCM._pointer_to_set(
    -769                    states, pointers.start, pointers.end
    -770                )
    -771
    -772                # preconditions += fluent for origin state
    -773                start_fluent_temp = fluents[sort][start_state]
    -774
    -775                bound_param_inds = []
    -776
    -777                # for each bindings on the start state (if there are any)
    -778                # then add each binding.hypothesis.l_
    -779                if sort in bindings and start_state in bindings[sort]:
    -780                    bound_param_inds = [
    -781                        b.hypothesis.l_ - 1 for b in bindings[sort][start_state]
    -782                    ]
    +738    @staticmethod
    +739    def _step7(
    +740        OS: OSType,
    +741        ap_state_pointers: APStatePointers,
    +742        sorts: Sorts,
    +743        bindings: Bindings,
    +744        statics: Statics,
    +745        debug: bool = False,
    +746        viz: bool = False,
    +747    ) -> Tuple[Set[LearnedLiftedFluent], Set[LearnedLiftedAction]]:
    +748        """Step 7: Formation of PDDL action schema
    +749        Implicitly includes Step 6 (statics) by including statics as an argument
    +750        and adding to the relevant actions while being constructed.
    +751        """
    +752
    +753        # delete zero-object if it's state machine was discarded
    +754        if not OS[0]:
    +755            del OS[0]
    +756            del ap_state_pointers[0]
    +757
    +758        # all_aps = {action_name: [AP]}
    +759        all_aps: Dict[str, List[AP]] = defaultdict(list)
    +760        for aps in ap_state_pointers.values():
    +761            for ap in aps:
    +762                all_aps[ap.action.name].append(ap)
    +763
    +764        state_params = defaultdict(dict)
    +765        state_params_to_hyps = defaultdict(dict)
    +766        for sort in bindings:
    +767            state_params[sort] = defaultdict(dict)
    +768            state_params_to_hyps[sort] = defaultdict(dict)
    +769            for state in bindings[sort]:
    +770                keys = {b.param for b in bindings[sort][state]}
    +771                typ = None
    +772                for key in keys:
    +773                    hyps = [
    +774                        b.hypothesis for b in bindings[sort][state] if b.param == key
    +775                    ]
    +776                    # assert that all are the same G_
    +777                    assert len(set([h.G_ for h in hyps])) == 1
    +778                    state_params[sort][state][key] = hyps[0].G_
    +779                    state_params_to_hyps[sort][state][key] = hyps
    +780
    +781        if viz:
    +782            LOCM._debug_state_machines(OS, ap_state_pointers, state_params)
     783
    -784                start_fluent = LearnedLiftedFluent(
    -785                    start_fluent_temp.name,
    -786                    start_fluent_temp.param_sorts,
    -787                    [ap.pos - 1] + bound_param_inds,
    -788                )
    -789                fluents[sort][start_state] = start_fluent
    -790                actions[ap.action.name].update_precond(start_fluent)
    -791
    -792                if start_state != end_state:
    -793                    # del += fluent for origin state
    -794                    actions[ap.action.name].update_delete(start_fluent)
    -795
    -796                    # add += fluent for destination state
    -797                    end_fluent_temp = fluents[sort][end_state]
    -798                    bound_param_inds = []
    -799                    if sort in bindings and end_state in bindings[sort]:
    -800                        bound_param_inds = [
    -801                            b.hypothesis.l_ - 1 for b in bindings[sort][end_state]
    -802                        ]
    -803                    end_fluent = LearnedLiftedFluent(
    -804                        end_fluent_temp.name,
    -805                        end_fluent_temp.param_sorts,
    -806                        [ap.pos - 1] + bound_param_inds,
    -807                    )
    -808                    fluents[sort][end_state] = end_fluent
    -809                    actions[ap.action.name].update_add(end_fluent)
    +784        fluents = defaultdict(dict)
    +785        actions = {}
    +786        for sort in ap_state_pointers:
    +787            sort_str = f"sort{sort}"
    +788            for ap in ap_state_pointers[sort]:
    +789                if ap.action.name not in actions:
    +790                    actions[ap.action.name] = LearnedLiftedAction(
    +791                        ap.action.name,
    +792                        [None for _ in range(len(all_aps[ap.action.name]))],  # type: ignore
    +793                    )
    +794                a = actions[ap.action.name]
    +795                a.param_sorts[ap.pos - 1] = sort_str
    +796
    +797                start_pointer, end_pointer = ap_state_pointers[sort][ap]
    +798                start_state, end_state = LOCM._pointer_to_set(
    +799                    OS[sort], start_pointer, end_pointer
    +800                )
    +801
    +802                start_fluent_name = f"sort{sort}_state{start_state}"
    +803                if start_fluent_name not in fluents[ap.action.name]:
    +804                    start_fluent = LearnedLiftedFluent(
    +805                        start_fluent_name,
    +806                        param_sorts=[sort_str],
    +807                        param_act_inds=[ap.pos - 1],
    +808                    )
    +809                    fluents[ap.action.name][start_fluent_name] = start_fluent
     810
    -811        fluents = set(fluent for sort in fluents.values() for fluent in sort.values())
    -812        actions = set(actions.values())
    -813
    -814        # Step 6: Extraction of static preconditions
    -815        for action in actions:
    -816            if action.name in statics:
    -817                for static in statics[action.name]:
    -818                    action.update_precond(static)
    -819
    -820        if debug:
    -821            pprint(fluents)
    -822            pprint(actions)
    -823
    -824        return fluents, actions
    +811                start_fluent = fluents[ap.action.name][start_fluent_name]
    +812
    +813                if (
    +814                    sort in state_params_to_hyps
    +815                    and start_state in state_params_to_hyps[sort]
    +816                ):
    +817                    for param in state_params_to_hyps[sort][start_state]:
    +818                        psort = None
    +819                        pind = None
    +820                        for hyp in state_params_to_hyps[sort][start_state][param]:
    +821                            if hyp.C == ap:
    +822                                assert psort is None or psort == hyp.G_
    +823                                assert pind is None or pind == hyp.l_
    +824                                psort = hyp.G_
    +825                                pind = hyp.l_
    +826                        assert psort is not None
    +827                        assert pind is not None
    +828                        start_fluent.param_sorts.append(f"sort{psort}")
    +829                        start_fluent.param_act_inds.append(pind - 1)
    +830
    +831                a.update_precond(start_fluent)
    +832
    +833                if end_state != start_state:
    +834                    end_fluent_name = f"sort{sort}_state{end_state}"
    +835                    if end_fluent_name not in fluents[ap.action.name]:
    +836                        end_fluent = LearnedLiftedFluent(
    +837                            end_fluent_name,
    +838                            param_sorts=[sort_str],
    +839                            param_act_inds=[ap.pos - 1],
    +840                        )
    +841                        fluents[ap.action.name][end_fluent_name] = end_fluent
    +842
    +843                    end_fluent = fluents[ap.action.name][end_fluent_name]
    +844
    +845                    if (
    +846                        sort in state_params_to_hyps
    +847                        and end_state in state_params_to_hyps[sort]
    +848                    ):
    +849                        for param in state_params_to_hyps[sort][end_state]:
    +850                            psort = None
    +851                            pind = None
    +852                            for hyp in state_params_to_hyps[sort][end_state][param]:
    +853                                if hyp.B == ap:
    +854                                    assert psort is None or psort == hyp.G_
    +855                                    assert pind is None or pind == hyp.k_
    +856                                    psort = hyp.G_
    +857                                    pind = hyp.k_
    +858                            assert psort is not None
    +859                            assert pind is not None
    +860                            end_fluent.param_sorts.append(f"sort{psort}")
    +861                            end_fluent.param_act_inds.append(pind - 1)
    +862
    +863                    a.update_delete(start_fluent)
    +864                    a.update_add(end_fluent)
    +865
    +866        # Step 6: Extraction of static preconditions
    +867        for action in actions.values():
    +868            if action.name in statics:
    +869                for static in statics[action.name]:
    +870                    action.update_precond(static)
    +871
    +872        return set(
    +873            fluent
    +874            for action_fluents in fluents.values()
    +875            for fluent in action_fluents.values()
    +876        ), set(actions.values())
     
    @@ -5577,76 +5852,77 @@
    Inherited Members
    -
    171    def __new__(
    -172        cls,
    -173        obs_tracelist: ObservedTraceList,
    -174        statics: Optional[Statics] = None,
    -175        viz: bool = False,
    -176        view: bool = False,
    -177        debug: Union[bool, Dict[str, bool], List[str]] = False,
    -178    ):
    -179        """Creates a new Model object.
    -180        Args:
    -181            observations (ObservationList):
    -182                The state observations to extract the model from.
    -183            statics (Dict[str, List[str]]):
    -184                A dictionary mapping an action name and its arguments to the
    -185                list of static preconditions of the action. A precondition should
    -186                be a tuple, where the first element is the predicate name and the
    -187                rest correspond to the arguments of the action (1-indexed).
    -188                E.g. static( next(C1, C2), put_on_card_in_homecell(C2, C1, _) )
    -189                should is provided as: {"put_on_card_in_homecell": [("next", 2, 1)]}
    -190            viz (bool):
    -191                Whether to visualize the FSM.
    -192            view (bool):
    -193                Whether to view the FSM visualization.
    -194
    -195        Raises:
    -196            IncompatibleObservationToken:
    -197                Raised if the observations are not identity observation.
    -198        """
    -199        if obs_tracelist.type is not ActionObservation:
    -200            raise IncompatibleObservationToken(obs_tracelist.type, LOCM)
    -201
    -202        if len(obs_tracelist) != 1:
    -203            warn("LOCM only supports a single trace, using first trace only")
    -204
    -205        if isinstance(debug, bool) and debug:
    -206            debug = defaultdict(lambda: True)
    -207        elif isinstance(debug, dict):
    -208            debug = defaultdict(lambda: False, debug)
    -209        elif isinstance(debug, list):
    -210            debug = defaultdict(lambda: False, {k: True for k in debug})
    -211        else:
    -212            debug = defaultdict(lambda: False)
    -213
    -214        obs_trace = obs_tracelist[0]
    -215        fluents, actions = None, None
    -216
    -217        sorts = LOCM._get_sorts(obs_trace, debug=debug["get_sorts"])
    +            
    188    def __new__(
    +189        cls,
    +190        obs_tracelist: ObservedTraceList,
    +191        statics: Optional[Statics] = None,
    +192        viz: bool = False,
    +193        view: bool = False,
    +194        debug: Union[bool, Dict[str, bool], List[str]] = False,
    +195    ):
    +196        """Creates a new Model object.
    +197        Args:
    +198            observations (ObservationList):
    +199                The state observations to extract the model from.
    +200            statics (Dict[str, List[str]]):
    +201                A dictionary mapping an action name and its arguments to the
    +202                list of static preconditions of the action. A precondition should
    +203                be a tuple, where the first element is the predicate name and the
    +204                rest correspond to the arguments of the action (1-indexed).
    +205                E.g. static( next(C1, C2), put_on_card_in_homecell(C2, C1, _) )
    +206                should is provided as: {"put_on_card_in_homecell": [("next", 2, 1)]}
    +207            viz (bool):
    +208                Whether to visualize the FSM.
    +209            view (bool):
    +210                Whether to view the FSM visualization.
    +211
    +212        Raises:
    +213            IncompatibleObservationToken:
    +214                Raised if the observations are not identity observation.
    +215        """
    +216        if obs_tracelist.type is not ActionObservation:
    +217            raise IncompatibleObservationToken(obs_tracelist.type, LOCM)
     218
    -219        if debug["sorts"]:
    -220            print(f"Sorts:\n{sorts}", end="\n\n")
    +219        if len(obs_tracelist) != 1:
    +220            warn("LOCM only supports a single trace, using first trace only")
     221
    -222        TS, ap_state_pointers, OS = LOCM._step1(obs_trace, sorts, debug["step1"])
    -223        HS = LOCM._step3(TS, ap_state_pointers, OS, sorts, debug["step3"])
    -224        bindings = LOCM._step4(HS, debug["step4"])
    -225        bindings = LOCM._step5(HS, bindings, debug["step5"])
    -226        fluents, actions = LOCM._step7(
    -227            OS,
    -228            ap_state_pointers,
    -229            sorts,
    -230            bindings,
    -231            statics if statics is not None else {},
    -232            debug["step7"],
    -233        )
    -234
    -235        if viz:
    -236            state_machines = LOCM.get_state_machines(ap_state_pointers, OS, bindings)
    -237            for sm in state_machines:
    -238                sm.render(view=view)
    -239
    -240        return Model(fluents, actions)
    +222        if isinstance(debug, bool) and debug:
    +223            debug = defaultdict(lambda: True)
    +224        elif isinstance(debug, dict):
    +225            debug = defaultdict(lambda: False, debug)
    +226        elif isinstance(debug, list):
    +227            debug = defaultdict(lambda: False, {k: True for k in debug})
    +228        else:
    +229            debug = defaultdict(lambda: False)
    +230
    +231        obs_trace = obs_tracelist[0]
    +232        fluents, actions = None, None
    +233
    +234        sorts = LOCM._get_sorts(obs_trace, debug=debug["get_sorts"])
    +235
    +236        if debug["sorts"]:
    +237            sortid2objs = {v: [] for v in set(sorts.values())}
    +238            for k, v in sorts.items():
    +239                sortid2objs[v].append(k)
    +240            print("\nSorts:\n")
    +241            pprint(sortid2objs)
    +242            print("\n")
    +243
    +244        TS, ap_state_pointers, OS = LOCM._step1(obs_trace, sorts, debug["step1"])
    +245        HS = LOCM._step3(TS, ap_state_pointers, OS, sorts, debug["step3"])
    +246        bindings = LOCM._step4(HS, debug["step4"])
    +247        bindings = LOCM._step5(HS, bindings, debug["step5"])
    +248        fluents, actions = LOCM._step7(
    +249            OS,
    +250            ap_state_pointers,
    +251            sorts,
    +252            bindings,
    +253            statics if statics is not None else {},
    +254            debug["step7"],
    +255            viz,
    +256        )
    +257
    +258        return Model(fluents, actions)
     
    @@ -5673,57 +5949,15 @@
    Inherited Members
    -
    - -
    -
    @staticmethod
    - - def - get_state_machines( ap_state_pointers: Dict[int, Dict[macq.extract.locm.AP, macq.extract.locm.StatePointers]], OS: Dict[int, List[Set[int]]], bindings: Union[Dict[int, Dict[int, List[macq.extract.locm.Binding]]], NoneType] = None): - - +
    +
    + zero_obj = +zero zero +
    - -
    658    @staticmethod
    -659    def get_state_machines(
    -660        ap_state_pointers: APStatePointers,
    -661        OS: OSType,
    -662        bindings: Optional[Bindings] = None,
    -663    ):
    -664        from graphviz import Digraph
    -665
    -666        state_machines = []
    -667        for (sort, trans), states in zip(ap_state_pointers.items(), OS.values()):
    -668            graph = Digraph(f"LOCM-step1-sort{sort}")
    -669            for state in range(len(states)):
    -670                label = f"state{state}"
    -671                if (
    -672                    bindings is not None
    -673                    and sort in bindings
    -674                    and state in bindings[sort]
    -675                ):
    -676                    label += f"\n["
    -677                    params = []
    -678                    for binding in bindings[sort][state]:
    -679                        params.append(f"{binding.hypothesis.G_}")
    -680                    label += f",".join(params)
    -681                    label += f"]"
    -682                graph.node(str(state), label=label, shape="oval")
    -683            for ap, apstate in trans.items():
    -684                start_idx, end_idx = LOCM._pointer_to_set(
    -685                    states, apstate.start, apstate.end
    -686                )
    -687                graph.edge(
    -688                    str(start_idx), str(end_idx), label=f"{ap.action.name}.{ap.pos}"
    -689                )
    -690
    -691            state_machines.append(graph)
    -692
    -693        return state_machines
    -
    - - + +
    @@ -6277,6 +6511,30 @@
    Inherited Members
    +
    +
    +
    + top = +true + + +
    + + + + +
    +
    +
    + bottom = +false + + +
    + + + +
    diff --git a/docs/macq/generate.html b/docs/macq/generate.html index 4ee59753..8015f74a 100644 --- a/docs/macq/generate.html +++ b/docs/macq/generate.html @@ -3,7 +3,7 @@ - + macq.generate API documentation @@ -62,6 +62,9 @@

    API Documentation

  • Plan
  • +
  • + actions +
  • write_to_file
  • @@ -194,6 +197,17 @@

    + +
    +
    + actions + + +
    + + + +
    diff --git a/docs/macq/generate/pddl.html b/docs/macq/generate/pddl.html index 826c9c4a..3e3f4b90 100644 --- a/docs/macq/generate/pddl.html +++ b/docs/macq/generate/pddl.html @@ -3,7 +3,7 @@ - + macq.generate.pddl API documentation @@ -58,6 +58,30 @@

    API Documentation

  • Generator
  • +
  • + pddl_dom +
  • +
  • + pddl_prob +
  • +
  • + problem_id +
  • +
  • + observe_pres_effs +
  • +
  • + lang +
  • +
  • + instance +
  • +
  • + grounded_fluents +
  • +
  • + op_dict +
  • extract_action_typing
  • @@ -91,6 +115,15 @@

    API Documentation

  • VanillaSampling
  • +
  • + max_time +
  • +
  • + plan_len +
  • +
  • + num_traces +
  • generate_traces
  • @@ -106,6 +139,9 @@

    API Documentation

  • TraceFromGoal
  • +
  • + trace +
  • generate_trace
  • @@ -118,6 +154,18 @@

    API Documentation

  • RandomGoalSampling
  • +
  • + steps_deep +
  • +
  • + enforced_hill_climbing_sampling +
  • +
  • + subset_size_perc +
  • +
  • + goals_inits_plans +
  • goal_sampling
  • @@ -136,6 +184,12 @@

    API Documentation

  • FDRandomWalkSampling
  • +
  • + plan_len +
  • +
  • + traces +
  • @@ -695,6 +749,94 @@

    + +
    +
    + pddl_dom + + +
    + + + + +
    +
    +
    + pddl_prob + + +
    + + + + +
    +
    +
    + problem_id + + +
    + + + + +
    +
    +
    + observe_pres_effs + + +
    + + + + +
    +
    +
    + lang + + +
    + + + + +
    +
    +
    + instance + + +
    + + + + +
    +
    +
    + grounded_fluents + + +
    + + + + +
    +
    +
    + op_dict + + +
    + + + +
    @@ -1434,6 +1576,39 @@

    + +
    +
    + max_time + + +
    + + + + +
    +
    +
    + plan_len + + +
    + + + + +
    +
    +
    + num_traces + + +
    + + + +
    +
    +
    + trace + + +
    + + + +
    @@ -1714,7 +1908,15 @@
    Inherited Members
    Inherited Members
    +
    +
    +
    + steps_deep + + +
    + + + + +
    +
    +
    + enforced_hill_climbing_sampling + + +
    + + + + +
    +
    +
    + subset_size_perc + + +
    + + + + +
    +
    +
    + goals_inits_plans + + +
    + + + +
    @@ -2072,7 +2318,7 @@
    Inherited Members
    -

    Samples goals by randomly generating candidate goal states k (steps_deep) steps deep, then running planners on those +

    Samples goals by randomly generating candidate goal states k (steps_deep) steps deep, then running planners on those goal states to ensure the goals are complex enough (i.e. cannot be reached in too few steps). Candidate goal states are generated for a set amount of time indicated by MAX_GOAL_SEARCH_TIME, and the goals with the longest plans (the most complex goals) are selected.

    @@ -2216,11 +2462,22 @@
    Inherited Members
    Inherited Members
    +
    +
    +
    + plan_len + + +
    + + + + +
    +
    +
    + traces + + +
    + + + +
    Inherited Members
    Generator
    -
    extract_action_typing
    +
    pddl_dom
    +
    pddl_prob
    +
    problem_id
    +
    observe_pres_effs
    +
    lang
    +
    instance
    +
    grounded_fluents
    +
    op_dict
    +
    extract_action_typing
    extract_predicate_typing
    tarski_state_to_macq
    tarski_act_to_macq
    diff --git a/docs/macq/observation.html b/docs/macq/observation.html index 5467639c..9dbbd122 100644 --- a/docs/macq/observation.html +++ b/docs/macq/observation.html @@ -3,7 +3,7 @@ - + macq.observation API documentation @@ -58,6 +58,15 @@

    API Documentation

  • Observation
  • +
  • + index +
  • +
  • + state +
  • +
  • + action +
  • get_details
  • @@ -79,6 +88,12 @@

    API Documentation

  • ObservedTraceList
  • +
  • + observations +
  • +
  • + type +
  • insert
  • @@ -130,6 +145,9 @@

    API Documentation

  • IdentityObservation
  • +
  • + state +
  • IdentityObservation.IdentityState
  • +
  • + action +
  • @@ -154,6 +184,12 @@

    API Documentation

  • PartialObservation
  • +
  • + state +
  • +
  • + action +
  • hide_random_subset
  • @@ -169,6 +205,12 @@

    API Documentation

  • ActionObservation
  • +
  • + state +
  • +
  • + action +
  • @@ -178,6 +220,12 @@

    API Documentation

  • AtomicPartialObservation
  • +
  • + state +
  • +
  • + action +
  • details
  • @@ -190,6 +238,12 @@

    API Documentation

  • NoisyObservation
  • +
  • + state +
  • +
  • + action +
  • random_noisy_subset
  • @@ -211,6 +265,9 @@

    API Documentation

  • NoisyPartialDisorderedParallelObservation
  • +
  • + par_act_set_ID +
  • @@ -402,6 +459,39 @@

    +
    +
    +
    + index: int + + +
    + + + + +
    +
    +
    + state: Union[macq.trace.state.State, NoneType] + + +
    + + + + +
    +
    +
    + action: Union[macq.trace.action.Action, NoneType] + + +
    + + + +
    @@ -858,6 +948,28 @@

    +

    +
    +
    + observations: List[List[macq.observation.Observation]] + + +
    + + + + +
    +
    +
    + type: Type[macq.observation.Observation] + + +
    + + + +
    @@ -1250,6 +1362,7 @@
    Inherited Members
    builtins.BaseException
    with_traceback
    +
    args
    @@ -1368,12 +1481,35 @@
    Inherited Members
    +
    +
    +
    + state: macq.trace.state.State + + +
    + + + + +
    +
    +
    + action + + +
    + + + +
    Inherited Members
    Observation
    -
    get_details
    +
    index
    +
    get_details
    extract_fluent_subset
    matches
    serialize
    @@ -1458,6 +1594,39 @@
    Inherited Members
    +
    +
    +
    + name: str + + +
    + + + + +
    +
    +
    + obj_params: List[str] + + +
    + + + + +
    +
    +
    + cost: Union[int, NoneType] + + +
    + + + +

    @@ -1628,6 +1797,28 @@
    Inherited Members
    + +
    +
    + state: Union[macq.trace.state.State, NoneType] + + +
    + + + + +
    +
    +
    + action: Union[macq.trace.action.Action, NoneType] + + +
    + + + +
    @@ -1714,7 +1905,8 @@
    Inherited Members
    Inherited Members
    Observation
    -
    get_details
    +
    index
    +
    get_details
    extract_fluent_subset
    matches
    serialize
    @@ -1820,12 +2012,35 @@
    Inherited Members
    +
    +
    +
    + state: Union[macq.trace.state.State, NoneType] + + +
    + + + + +
    +
    +
    + action: Union[macq.trace.action.Action, NoneType] + + +
    + + + +
    Inherited Members
    Observation
    -
    get_details
    +
    index
    +
    get_details
    extract_fluent_subset
    matches
    serialize
    @@ -1957,6 +2172,28 @@
    Inherited Members
    +
    +
    +
    + state: Union[macq.trace.state.State, NoneType] + + +
    + + + + +
    +
    +
    + action: Union[macq.trace.action.Action, NoneType] + + +
    + + + +
    @@ -1986,7 +2223,8 @@
    Inherited Members
    Observation
    -
    get_details
    +
    index
    +
    get_details
    extract_fluent_subset
    matches
    serialize
    @@ -2136,6 +2374,28 @@
    Inherited Members
    + +
    +
    + state: Union[macq.trace.state.State, NoneType] + + +
    + + + + +
    +
    +
    + action: Union[macq.trace.action.Action, NoneType] + + +
    + + + +
    @@ -2209,7 +2469,8 @@
    Inherited Members
    Inherited Members
    Observation
    -
    get_details
    +
    index
    +
    get_details
    extract_fluent_subset
    matches
    serialize
    @@ -2353,7 +2614,9 @@
    Inherited Members
    Inherited Members
    @@ -2362,7 +2625,8 @@
    Inherited Members
    Observation
    -
    get_details
    +
    index
    +
    get_details
    extract_fluent_subset
    matches
    serialize
    @@ -2505,12 +2769,25 @@
    Inherited Members
    +
    +
    +
    + par_act_set_ID + + +
    + + + +
    Inherited Members
    @@ -2519,7 +2796,8 @@
    Inherited Members
    Observation
    -
    get_details
    +
    index
    +
    get_details
    extract_fluent_subset
    matches
    serialize
    diff --git a/docs/macq/trace.html b/docs/macq/trace.html index 8eee4876..813355dd 100644 --- a/docs/macq/trace.html +++ b/docs/macq/trace.html @@ -3,7 +3,7 @@ - + macq.trace API documentation @@ -58,6 +58,24 @@

    API Documentation

  • Action
  • +
  • + name +
  • +
  • + obj_params +
  • +
  • + cost +
  • +
  • + precond +
  • +
  • + add +
  • +
  • + delete +
  • details
  • @@ -73,6 +91,12 @@

    API Documentation

  • PlanningObject
  • +
  • + obj_type +
  • +
  • + name +
  • details
  • @@ -85,6 +109,12 @@

    API Documentation

  • Fluent
  • +
  • + name +
  • +
  • + objects +
  • @@ -94,6 +124,9 @@

    API Documentation

  • State
  • +
  • + fluents +
  • clear
  • @@ -133,6 +166,9 @@

    API Documentation

  • PartialState
  • +
  • + fluents +
  • @@ -142,6 +178,15 @@

    API Documentation

  • Step
  • +
  • + state +
  • +
  • + action +
  • +
  • + index +
  • @@ -160,6 +205,9 @@

    API Documentation

    +
  • + steps +
  • append
  • @@ -241,6 +289,15 @@

    API Documentation

  • SAS
  • +
  • + pre_state +
  • +
  • + action +
  • +
  • + post_state +
  • @@ -256,9 +313,21 @@

    API Documentation

  • MissingGenerator
  • +
  • + trace_list +
  • +
  • + message +
  • +
  • + traces +
  • +
  • + generator +
  • copy
  • @@ -292,6 +361,39 @@

    API Documentation

  • DisorderedParallelActionsObservationLists
  • +
  • + observations +
  • +
  • + type +
  • +
  • + all_par_act_sets +
  • +
  • + all_states +
  • +
  • + features +
  • +
  • + learned_theta +
  • +
  • + actions +
  • +
  • + propositions +
  • +
  • + cross_actions +
  • +
  • + denominator +
  • +
  • + probabilities +
  • tokenize
  • @@ -304,6 +406,9 @@

    API Documentation

  • ActionPair
  • +
  • + actions +
  • tup
  • @@ -462,7 +567,7 @@

    Grounded action.

    An Action represents a grounded action in a Trace or a Model. The action's -precond, add, and delete attributes characterize a Model, and are +precond, add, and delete attributes characterize a Model, and are found during model extraction.

    Attributes: @@ -527,7 +632,7 @@

    Initializes an Action with the parameters provided. -The precond, add, and delete args should only be provided in +The precond, add, and delete args should only be provided in Model deserialization. Args: name (str): @@ -545,6 +650,72 @@

    +

    +
    +
    + name + + +
    + + + + +
    +
    +
    + obj_params + + +
    + + + + +
    +
    +
    + cost + + +
    + + + + +
    +
    +
    + precond + + +
    + + + + +
    +
    +
    + add + + +
    + + + + +
    +
    +
    + delete + + +
    + + + +
    @@ -689,6 +860,28 @@

    +

    +
    +
    + obj_type + + +
    + + + + +
    +
    +
    + name + + +
    + + + +
    @@ -819,6 +1012,28 @@

    + +
    +
    + name + + +
    + + + + +
    +
    +
    + objects + + +
    + + + +
    @@ -963,6 +1178,17 @@

    + +
    +
    + fluents + + +
    + + + +
    @@ -1221,6 +1447,17 @@

    + +
    +
    + fluents + + +
    + + + +
    Inherited Members
    @@ -1341,6 +1578,39 @@
    Inherited Members
    + +
    +
    + state + + +
    + + + + +
    +
    +
    + action + + +
    + + + + +
    +
    +
    + index + + +
    + + + +

    @@ -1791,6 +2061,17 @@
    Inherited Members
    + +
    +
    + steps + + +
    + + + +
    @@ -2633,6 +2914,7 @@
    Inherited Members
    builtins.BaseException
    with_traceback
    +
    args
    @@ -2676,6 +2958,39 @@
    Inherited Members
    +
    +
    +
    + pre_state: macq.trace.State + + +
    + + + + +
    +
    +
    + action: macq.trace.Action + + +
    + + + + +
    +
    +
    + post_state: macq.trace.State + + +
    + + + +
    @@ -2889,6 +3204,28 @@
    Inherited Members
    + +
    +
    + traces: List[macq.trace.Trace] + + +
    + + + + +
    +
    +
    + generator: Union[Callable, NoneType] + + +
    + + + +
    @@ -3225,12 +3562,35 @@
    Inherited Members
    +
    +
    +
    + trace_list + + +
    + + + + +
    +
    +
    + message + + +
    + + + +
    Inherited Members
    builtins.BaseException
    with_traceback
    +
    args
    @@ -3624,6 +3984,127 @@
    Inherited Members
    + +
    +
    + observations: List[List[macq.observation.observation.Observation]] + + +
    + + + + +
    +
    +
    + type: Type[macq.observation.observation.Observation] + + +
    + + + + +
    +
    +
    + all_par_act_sets + + +
    + + + + +
    +
    +
    + all_states + + +
    + + + + +
    +
    +
    + features + + +
    + + + + +
    +
    +
    + learned_theta + + +
    + + + + +
    +
    +
    + actions + + +
    + + + + +
    +
    +
    + propositions + + +
    + + + + +
    +
    +
    + cross_actions + + +
    + + + + +
    +
    +
    + denominator + + +
    + + + + +
    +
    +
    + probabilities + + +
    + + + +
    @@ -3831,6 +4312,17 @@
    Inherited Members
    +
    +
    +
    + actions: Set[macq.trace.Action] + + +
    + + + +
    diff --git a/docs/macq/utils.html b/docs/macq/utils.html index 0f812e0b..15f6bf8b 100644 --- a/docs/macq/utils.html +++ b/docs/macq/utils.html @@ -3,7 +3,7 @@ - + macq.utils API documentation @@ -325,6 +325,7 @@
    Inherited Members
    builtins.BaseException
    with_traceback
    +
    args
    @@ -386,6 +387,7 @@
    Inherited Members
    builtins.BaseException
    with_traceback
    +
    args
    @@ -485,6 +487,14 @@
    Inherited Members
    json.encoder.JSONEncoder
    JSONEncoder
    +
    item_separator
    +
    key_separator
    +
    skipkeys
    +
    ensure_ascii
    +
    check_circular
    +
    allow_nan
    +
    sort_keys
    +
    indent
    encode
    iterencode
    @@ -544,6 +554,7 @@
    Inherited Members
    builtins.BaseException
    with_traceback
    +
    args
    @@ -687,6 +698,7 @@
    Inherited Members
    builtins.BaseException
    with_traceback
    +
    args
    @@ -746,6 +758,7 @@
    Inherited Members
    builtins.BaseException
    with_traceback
    +
    args
    @@ -805,6 +818,7 @@
    Inherited Members
    builtins.BaseException
    with_traceback
    +
    args
    diff --git a/docs/macq/utils/progress.html b/docs/macq/utils/progress.html index 57754593..18942155 100644 --- a/docs/macq/utils/progress.html +++ b/docs/macq/utils/progress.html @@ -3,7 +3,7 @@ - + macq.utils.progress API documentation @@ -61,9 +61,21 @@

    API Documentation

  • vanilla_progress
  • +
  • + iterable +
  • +
  • + args +
  • +
  • + kwargs +
  • +
  • + progress +
  • @@ -261,6 +273,51 @@

    +
    +
    + iterable + + +
    + + + + +
    +
    +
    + args + + +
    + + + + +
    +
    +
    + kwargs + + +
    + + + + +
    +
    +
    +
    + progress = +<class 'macq.utils.progress.vanilla_progress'> + + +
    + + + +