-
Notifications
You must be signed in to change notification settings - Fork 0
/
paths.py
55 lines (46 loc) · 1.73 KB
/
paths.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
import sys
import os.path
import pickle
import io
from clingo.symbol import Number
from clingo.application import Application, clingo_main
from modules.create_environments.convert import convert_to_clingo
from modules.generate_paths.visualize import render
class Flatland(Application):
program_name = "flatland"
version = "1.0"
def __init__(self, action_list, env):
self.action_list = action_list
self.env_pkl = env
def main(self, ctl, files):
# parse through files
for f in files:
if os.path.splitext(f)[1] == '.lp':
ctl.load(f)
if os.path.splitext(f)[1] == '.pkl':
self.env_pkl = pickle.load(open(f, "rb"))
env_lp = convert_to_clingo(self.env_pkl)
ctl.add(env_lp)
if not files: ctl.load("-")
# ground the program
ctl.ground([("base", [])], context=self)
ctl.configuration.solve.models="1"
# solve and save models
models = []
with ctl.solve(yield_=True) as handle:
for model in handle:
models.append(model.symbols(atoms=True))
# capture output actions for renderer
action_list = []
for func in models[0]: # only the first model
prefix = func.name[:6]
if prefix == "action":
action = func.arguments[1].name
agent, timestep = func.arguments[0], func.arguments[2]
agent_num = agent.arguments[0].number
self.action_list.append((agent_num,action,timestep.number))
if __name__ == "__main__":
app = Flatland([], None)
clingo_main(app, sys.argv[1:])
print(app.action_list) #debug
render(app.env_pkl, app.action_list)