-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathCube.py
85 lines (70 loc) · 3.03 KB
/
Cube.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
from unified_planning.shortcuts import Not, And, Exists, Forall
from .CubeSide import CubeSide
from AIROB.domain import PDDLObject
from AIROB.domain.decorators import PDDLEffect, PDDLPrecondition, PDDLPredicate, PDDLType, PDDLAction, PDDLEnvironment, \
PDDLActionMessage
@PDDLType
class Cube(PDDLObject):
def __init__(self, idx):
super().__init__()
env = PDDLEnvironment.get_instance()
self.sides = [env.add_object(CubeSide(i == 0, i, idx)) for i in range(6)]
self.loaded = False
self.idx = idx
self.dry = True
def get_id(self) -> str:
return f"Cube_{self.idx}"
@PDDLPredicate()
def cube_has_side(self: 'Cube', side: 'CubeSide'):
for s in self.sides:
if s.instance.get_id() == side.get_id(): return True
return False
def isPainted(self):
return all(map(lambda x: x.instance.isPainted(), self.sides))
@PDDLPredicate(derived=True)
def painted(self: 'Cube'):
return And(x.painted() for x in self.sides)
@PDDLPredicate(derived=True)
def dry(self: 'Cube'):
return And(x.dry() for x in self.sides)
def isLoaded(self):
return self.loaded
@PDDLPredicate()
def loaded(self: 'Cube'):
return self.isLoaded()
@PDDLPrecondition(lambda cube, env:
And(Not(cube.loaded()),
Not(Exists(Cube.loaded(env.var(Cube)), env.var(Cube)))))
@PDDLEffect(lambda cube: cube.loaded(), True)
@PDDLAction(True)
def load(cube: 'Cube'):
print(f"Loading cube {cube.idx}")
cube.loaded = True
@PDDLActionMessage("Cube_load")
def load_message(cube: 'Cube'):
return f"Please load the cube {cube.idx}"
@PDDLPrecondition(lambda cube, env: And(cube.loaded(),
Forall(CubeSide.dry(env.var(CubeSide)), env.var(CubeSide))))
@PDDLEffect(lambda cube: cube.loaded(), False)
@PDDLAction()
def unload(cube: 'Cube'):
print(f"Unloading cube {cube.idx}")
cube.loaded = False
@PDDLActionMessage("Cube_unload")
def unload_message(cube: 'Cube'):
return f"Please unload the cube {cube.idx}"
@PDDLPrecondition(lambda cube, old_up, new_up: And(old_up.up(),
Not(new_up.up()),
cube.cube_has_side(old_up),
cube.cube_has_side(new_up),
old_up.dry()))
@PDDLEffect(lambda old_up: old_up.up(), False)
@PDDLEffect(lambda new_up: new_up.up(), True)
@PDDLAction(True)
def rotate(cube: 'Cube', old_up: 'CubeSide', new_up: 'CubeSide'):
print(f"Rotating cube {cube.idx} side {new_up.idx} up")
old_up.setUp(False)
new_up.setUp(True)
@PDDLActionMessage("Cube_rotate")
def rotate_message(cube: 'Cube', old_up: 'CubeSide', new_up: 'CubeSide'):
return f"Please rotate the cube from side {old_up.idx} to side {new_up.idx}"