diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..17ce236 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,17 @@ +# FROM nvidia/cuda:12.2.0-base-ubuntu20.04 +FROM ubuntu:20.04 +ENV DEBIAN_FRONTEND=noninteractive +RUN apt update && apt install -y build-essential git cmake curl wget flex bison python3-pip python-is-python3 +RUN rm -rf /var/lib/apt/lists/* +WORKDIR /opt + +# Get Docker +RUN curl -fsSL https://get.docker.com -o get-docker.sh +RUN sh get-docker.sh + +# Get Taskography +RUN git clone https://github.com/jiadingfang/taskography-api.git --recurse-submodules +WORKDIR /opt/taskography-api +RUN pip install . +RUN pip install -r requirements.txt +ENV PYTHONPATH "${PYTHONPATH}:/opt/taskography-api" \ No newline at end of file diff --git a/docker/docker.sh b/docker/docker.sh new file mode 100644 index 0000000..7475fac --- /dev/null +++ b/docker/docker.sh @@ -0,0 +1,2 @@ +docker build -t taskography . +docker run -it --rm -v $DATA/3dscenegraph/:/data/3dscenegraph -v /var/run/docker.sock:/var/run/docker.sock taskography \ No newline at end of file diff --git a/scripts/benchmark/test.py b/scripts/benchmark/test.py new file mode 100644 index 0000000..6ab978a --- /dev/null +++ b/scripts/benchmark/test.py @@ -0,0 +1,11 @@ +import os +from third_party.pddlgym_planners.pddlgym_planners import _SATISFICING, _OPTIMAL + +planners = list(_SATISFICING.keys()) + list(_OPTIMAL.keys()) +print('planners: ', planners) # ['FF', 'FF-X', 'FD-lama-first', 'Cerberus-seq-sat', 'Cerberus-seq-agl', 'DecStar-agl-decoupled', 'lapkt-bfws', 'FD-seq-opt-lmcut', 'Delfi', 'DecStar-opt-decoupled'] + +pddl_domain = 'taskographyv2tiny1' + +for planner in planners: + print('running planner: ', planner) + os.system('python scripts/benchmark/plan.py --domain-name {} --planner {} --expid {}_{}'.format(pddl_domain, planner, pddl_domain, planner)) \ No newline at end of file diff --git a/scripts/procthor_scenegraph.py b/scripts/procthor_scenegraph.py new file mode 100644 index 0000000..1dbf412 --- /dev/null +++ b/scripts/procthor_scenegraph.py @@ -0,0 +1,139 @@ +import json + +class SceneGraphNode(object): + def __init__(self): + self.id = None + + def set_attribute(self, attr, value): + if attr not in self.__dict__.keys(): + raise ValueError(f"Unknown attribute: {attr}") + self.__dict__[attr] = value + + def get_attribute(self, attr): + if attr not in self.__dict__.keys(): + raise ValueError(f"Unknown attribute: {attr}") + return self.__dict__[attr] + + def print_attributes(self): + print(f"--- {self.__class__.__name__} ID: {self.get_attribute('id')} ---") + for key in self.__dict__.keys(): + print(f"Key: {key} | Value: {self.get_attribute(key)}") + + +class Door(SceneGraphNode): + def __init__(self, data=None): + super().__init__() + self.asset_id = None + self.asset_position = None + self.hole_polygon = None + self.openable = None + self.openness = None + self.rooms = None + self.walls = None + if data is not None: + self.set_attribute('asset_id', data['assetId']) + self.set_attribute('asset_position', data['assetPosition']) + self.set_attribute('hole_polygon', data['holePolygon']) + self.set_attribute('id', data['id']) + self.set_attribute('openable', data['openable']) + self.set_attribute('openness', data['openness']) + self.set_attribute('rooms', [data['room0'], data['room1']]) + self.set_attribute('walls', [data['wall0'], data['wall1']]) + + +class ObjectChild(SceneGraphNode): + def __init__(self, data=None): + super().__init__() + self.asset_id = None + self.kinematic = None + self.position = None + self.rotation = None + if data is not None: + self.set_attribute('asset_id', data['assetId']) + self.set_attribute('id', data['id']) + self.set_attribute('kinematic', data['kinematic']) + self.set_attribute('position', data['position']) + self.set_attribute('rotation', data['rotation']) + + +class Object(SceneGraphNode): + def __init__(self, data=None): + super().__init__() + self.asset_id = None + self.children = None + self.kinematic = None + self.material = None + self.position = None + self.rotation = None + if data is not None: + self.set_attribute('asset_id', data['assetId']) + # self.set_attribute('children', [ObjectChild(child) for child in data['children']]) + self.set_attribute('id', data['id']) + self.set_attribute('kinematic', data['kinematic']) + self.set_attribute('material', data['material']) + self.set_attribute('position', data['position']) + self.set_attribute('rotation', data['rotation']) + if 'children' in data: + self.set_attribute('children', [ObjectChild(child) for child in data['children']]) + else: + self.set_attribute('children', []) + +class Room(SceneGraphNode): + def __init__(self, data=None): + super().__init__() + self.ceilings = None + self.children = None + self.floor_material = None + self.floor_polygon = None + self.room_type = None + if data is not None: + self.set_attribute('ceilings', data['ceilings']) + self.set_attribute('children', data['children']) + self.set_attribute('floor_material', data['floorMaterial']) + self.set_attribute('floor_polygon', data['floorPolygon']) + self.set_attribute('id', data['id']) + self.set_attribute('room_type', data['roomType']) + + +class Wall(SceneGraphNode): + def __init__(self, data=None): + super().__init__() + self.color = None + self.material = None + self.polygon = None + self.room_id = None + if data is not None: + self.set_attribute('id', data['id']) + self.set_attribute('material', data['material']) + self.set_attribute('polygon', data['polygon']) + self.set_attribute('room_id', data['roomId']) + if 'color' in data: + self.set_attribute('color', data['color']) + + +class House(SceneGraphNode): + def __init__(self, json_data=None): + super().__init__() + self.doors = None + self.objects = None + self.rooms = None + self.walls = None + self.windows = None + self.metadata = None + self.procedural_parameters = None + if json_data is not None: + self.set_attribute('doors', [Door(door) for door in json_data.get('doors', [])]) + self.set_attribute('objects', [Object(obj) for obj in json_data.get('objects', [])]) + self.set_attribute('rooms', [Room(room) for room in json_data.get('rooms', [])]) + self.set_attribute('walls', [Wall(wall) for wall in json_data.get('walls', [])]) + self.set_attribute('windows', json_data.get('windows', [])) + self.set_attribute('metadata', json_data.get('metadata', {})) + self.set_attribute('procedural_parameters', json_data.get('proceduralParameters', {})) + + +if __name__ == "__main__": + procthor_json_path = 'procthor_houses/procthor-10k_train_0.json' + with open(procthor_json_path, 'r') as f: + procthor_json = json.load(f) + house = House(procthor_json) + house.print_attributes() diff --git a/setup.py b/setup.py index edeeef7..1a3de07 100644 --- a/setup.py +++ b/setup.py @@ -23,7 +23,7 @@ "scipy", "setuptools", "scikit-image", - "tqdm" + "tqdm", f"pddlgym_planners @ file://localhost/{Path(__file__).parent}/third_party/pddlgym_planners", ] diff --git a/taskography_api/taskography/samplers/problem_sampler_base.py b/taskography_api/taskography/samplers/problem_sampler_base.py index ce33f3e..3eb20cc 100644 --- a/taskography_api/taskography/samplers/problem_sampler_base.py +++ b/taskography_api/taskography/samplers/problem_sampler_base.py @@ -1,5 +1,5 @@ -from typing import List, Dict, Set, ClassVar from __future__ import annotations +from typing import List, Dict, Set, ClassVar import os import json diff --git a/taskography_api/taskography/utils/loader.py b/taskography_api/taskography/utils/loader.py index cea8e8f..badd62a 100644 --- a/taskography_api/taskography/utils/loader.py +++ b/taskography_api/taskography/utils/loader.py @@ -115,8 +115,8 @@ def scenegraph_mst(building: Building) -> None: # floor-floor heuristic: mean of min connection between rooms in both floors n, m = len(floor_a_rooms), len(floor_b_rooms) - floor_a_rooms_repeat = np.repeat(np.array(floor_a_rooms, dtype=np.int), m) - floor_b_rooms_tile = np.tile(np.array(floor_b_rooms, dtype=np.int), n) + floor_a_rooms_repeat = np.repeat(np.array(floor_a_rooms, dtype=int), m) + floor_b_rooms_tile = np.tile(np.array(floor_b_rooms, dtype=int), n) room_a_to_b_dist = room_dist_mat[floor_a_rooms_repeat, floor_b_rooms_tile].reshape( n, m ) @@ -147,8 +147,8 @@ def scenegraph_mst(building: Building) -> None: # connect all rooms in each floor for _, rooms in floor_rooms.items(): - room_idx_repeat = np.repeat(np.array(list(rooms), dtype=np.int), len(rooms)) - room_idx_tile = np.tile(np.array(list(rooms), dtype=np.int), len(rooms)) + room_idx_repeat = np.repeat(np.array(list(rooms), dtype=int), len(rooms)) + room_idx_tile = np.tile(np.array(list(rooms), dtype=int), len(rooms)) room_dist = room_dist_mat[room_idx_repeat, room_idx_tile] room_graph.add_weighted_edges_from(list(zip(room_idx_repeat, room_idx_tile, room_dist)))