7
7
8
8
def create_type (name , Base = None ) -> type :
9
9
if Base :
10
- Type = type (name , (Base ,), {"section" : "types" })
11
- Type .create_objs = classmethod (_create_objs )
10
+ Type = type (name , (Base ,), {
11
+ "section" : "types" ,
12
+ "create_objs" : classmethod (_create_objs )
13
+ })
12
14
else :
13
15
Type = type (
14
16
name ,
15
17
(UserString ,),
16
18
{
17
19
"section" : "types" ,
18
20
"__repr__" : lambda self : f"{ name } ('{ self .data } ')" ,
21
+ "create_objs" : classmethod (_create_objs )
19
22
})
20
- Type .create_objs = classmethod (_create_objs )
21
23
return Type
22
24
23
25
@@ -39,7 +41,8 @@ def __init__(self, typ, *args, **kwargs):
39
41
def __getitem__ (self , key ):
40
42
if key not in self .data :
41
43
raise KeyError (
42
- f"Key '{ key } ' does not exist for { self .typ } . Did you define the objects correctly?" )
44
+ f"Key '{ key } ' does not exist for { self .typ } . "
45
+ "Have you defined the objects correctly?" )
43
46
else :
44
47
return self .data [key ]
45
48
@@ -54,7 +57,7 @@ def goal(self):
54
57
55
58
def generate_domain_pddl (self , * , filename = "domain" ):
56
59
filename = filename + ".pddl"
57
- hder = Domain . _generate_header ()
60
+ hder = self . _generate_header_domain ()
58
61
reqs = Domain ._generate_requirements ()
59
62
typs = self ._generate_types ()
60
63
prds = self ._generate_predicates ()
@@ -75,25 +78,33 @@ def generate_problem_pddl(self, *,
75
78
goal = {}
76
79
filename = filename + ".pddl"
77
80
78
- hder = Domain ._generate_header_prob ()
79
- domain = "\t " + "(:domain somedomain)"
81
+ hder = self ._generate_header_prob ()
80
82
objs = self ._generate_objects ()
81
83
inits = "\t " + self .init (** init )
82
84
goals = "\t " + self .goal (** goal )
83
85
84
- pddl = join ([hder , domain , objs , inits , goals , ")\n " ],
86
+ pddl = join ([hder , objs , inits , goals , ")\n " ],
85
87
"\n " , and_marker = False )
86
88
with open (filename , "w" , encoding = "utf-8" ) as f :
87
89
f .write (str (pddl ))
88
90
print (f"Problem PDDL written to { filename } ." )
89
91
90
- @staticmethod
91
- def _generate_header (name = "somedomain" ):
92
+ def _generate_header_domain (self ):
93
+ cls = self .__class__
94
+ while cls .__bases__ [0 ] != Domain :
95
+ cls = cls .__bases__ [0 ]
96
+ name = cls .__name__ .lower ().replace ("domain" , "" )
92
97
return f"(define\n \t (domain { name } )"
93
98
94
- @staticmethod
95
- def _generate_header_prob (name = "someproblem" ):
96
- return f"(define\n \t (problem { name } )"
99
+ def _generate_header_prob (self ):
100
+ cls = self .__class__
101
+ if cls .__bases__ [0 ] == Domain :
102
+ raise RuntimeError ("Unable to generate the problem header. "
103
+ "Call `generate_problem_pddl` from an instance "
104
+ "of a subclassed Domain." )
105
+ domain_name = cls .__bases__ [0 ].__name__ .lower ().replace ("domain" , "" )
106
+ problem_name = cls .__name__ .lower ().replace ("problem" , "" )
107
+ return f"(define\n \t (problem { problem_name } )" + "\n \t " + f"(:domain { domain_name } )"
97
108
98
109
@staticmethod
99
110
def _generate_requirements ():
@@ -232,6 +243,7 @@ def wrapper(*args, **kwargs):
232
243
# Final
233
244
actn = [action_name , repre , precond , effect , "\t )" ]
234
245
actn = join (actn , "\n " , False )
246
+ actn = actn .replace ('_' , '-' )
235
247
236
248
return actn
237
249
@@ -272,7 +284,7 @@ def wrapper(*args, **kwargs):
272
284
repr1 = []
273
285
for param , Class in zip (params , Types ):
274
286
param_name , _ = param
275
- repr1 .append (f"?{ param_name . replace ( '_' , '-' ) } - { Class .__name__ .lower ()} " )
287
+ repr1 .append (f"?{ param_name } - { Class .__name__ .lower ()} " )
276
288
repr1 = " " .join (repr1 )
277
289
repr1 = f"({ func_name } { repr1 } )"
278
290
@@ -282,7 +294,7 @@ def wrapper(*args, **kwargs):
282
294
repr2 = f"({ func_name } { repr2 } )"
283
295
284
296
# Representation 3 (in :init and :goal)
285
- args = [str (arg ) for arg in args ]
297
+ args = [str (arg ). replace ( '_' , '-' ) for arg in args ]
286
298
params3 = "(" + " " .join ([func_name , * args ]) + ")"
287
299
288
300
return PDDLString (repr1 ) + " | " + PDDLString (repr2 ) + " | " + PDDLString (params3 )
0 commit comments