in EAIEvaluation/ET/et_train/custom_eval.py [0:0]
def get_goal_conditions_meet(task_type:str, pddl, state, env=None):
targets = {
'object': pddl['object_target'],
'parent': pddl['parent_target'],
'toggle': pddl['toggle_target'],
'mrecep': pddl['mrecep_target'],
}
if task_type == "look_at_obj_in_light":
ts = 2
s = 0
toggleables = get_objects_with_name_and_prop(
pddl['toggle_target'], 'toggleable', state.metadata)
pickupables = get_objects_with_name_and_prop(
pddl['object_target'], 'pickupable', state.metadata)
inventory_objects = state.metadata['inventoryObjects']
# check if object needs to be sliced
if 'Sliced' in pddl['object_target']:
ts += 1
if len([p for p in pickupables if 'Sliced' in p['objectId']]) >= 1:
s += 1
# check if the right object is in hand
if len(inventory_objects) > 0 and inventory_objects[0]['objectId'] in [p['objectId'] for p in pickupables]:
s += 1
# check if the lamp is visible and turned on
if np.any([t['isToggled'] and t['visible'] for t in toggleables]):
s += 1
return s, ts
elif task_type == "pick_and_place_simple":
ts = 1
s = 0
receptacles = get_objects_with_name_and_prop(
targets['parent'], 'receptacle', state.metadata)
pickupables = get_objects_with_name_and_prop(
targets['object'], 'pickupable', state.metadata)
# check if object needs to be sliced
if 'Sliced' in targets['object']:
ts += 1
if len([p for p in pickupables if 'Sliced' in p['objectId']]) >= 1:
s += 1
if np.any([np.any([p['objectId'] in r['receptacleObjectIds']
for r in receptacles if r['receptacleObjectIds'] is not None])
for p in pickupables]):
s += 1
return s, ts
elif task_type == "pick_and_place_with_movable_recep":
ts = 3
s = 0
receptacles = get_objects_with_name_and_prop(
targets['parent'], 'receptacle', state.metadata)
pickupables = get_objects_with_name_and_prop(
targets['object'], 'pickupable', state.metadata)
movables = get_objects_with_name_and_prop(
targets['mrecep'], 'pickupable', state.metadata)
# check if object needs to be sliced
if 'Sliced' in targets['object']:
ts += 1
if len([p for p in pickupables if 'Sliced' in p['objectId']]) >= 1:
s += 1
pickup_in_place = [p for p in pickupables for m in movables
if 'receptacleObjectIds' in p and m['receptacleObjectIds'] is not None
and p['objectId'] in m['receptacleObjectIds']]
movable_in_place = [m for m in movables for r in receptacles
if 'receptacleObjectIds' in r and r['receptacleObjectIds'] is not None
and m['objectId'] in r['receptacleObjectIds']]
# check if the object is in the final receptacle
if len(pickup_in_place) > 0:
s += 1
# check if the movable receptacle is in the final receptacle
if len(movable_in_place) > 0:
s += 1
# check if both the object and movable receptacle stack is in the final receptacle
if np.any([np.any([p['objectId'] in m['receptacleObjectIds'] for p in pickupables]) and
np.any([r['objectId'] in m['parentReceptacles'] for r in receptacles]) for m in movables
if m['parentReceptacles'] is not None and m['receptacleObjectIds'] is not None]):
s += 1
return s, ts
elif task_type == "pick_clean_then_place_in_recep":
ts = 3
s = 0
receptacles = get_objects_with_name_and_prop(
targets['parent'], 'receptacle', state.metadata)
pickupables = get_objects_with_name_and_prop(
targets['object'], 'pickupable', state.metadata)
if 'Sliced' in targets['object']:
ts += 1
if len([p for p in pickupables if 'Sliced' in p['objectId']]) >= 1:
s += 1
objs_in_place = [p['objectId'] for p in pickupables for r in receptacles
if r['receptacleObjectIds'] is not None and p['objectId'] in r['receptacleObjectIds']]
objs_cleaned = [p['objectId'] for p in pickupables if p['objectId'] in env.cleaned_objects]
# check if object is in the receptacle
if len(objs_in_place) > 0:
s += 1
# check if some object was cleaned
if len(objs_cleaned) > 0:
s += 1
# check if the object is both in the receptacle and clean
if np.any([obj_id in objs_cleaned for obj_id in objs_in_place]):
s += 1
return s, ts
elif task_type == "pick_heat_then_place_in_recep":
ts = 3
s = 0
receptacles = get_objects_with_name_and_prop(
targets['parent'], 'receptacle', state.metadata)
pickupables = get_objects_with_name_and_prop(
targets['object'], 'pickupable', state.metadata)
# check if object needs to be sliced
if 'Sliced' in targets['object']:
ts += 1
if len([p for p in pickupables if 'Sliced' in p['objectId']]) >= 1:
s += 1
objs_in_place = [p['objectId'] for p in pickupables for r in receptacles
if r['receptacleObjectIds'] is not None and p['objectId'] in r['receptacleObjectIds']]
objs_heated = [p['objectId'] for p in pickupables if p['objectId'] in env.heated_objects]
# check if object is in the receptacle
if len(objs_in_place) > 0:
s += 1
# check if some object was heated
if len(objs_heated) > 0:
s += 1
# check if the object is both in the receptacle and hot
if np.any([obj_id in objs_heated for obj_id in objs_in_place]):
s += 1
return s, ts
elif task_type == "pick_cool_then_place_in_recep":
ts = 3
s = 0
receptacles = get_objects_with_name_and_prop(
targets['parent'], 'receptacle', state.metadata)
pickupables = get_objects_with_name_and_prop(
targets['object'], 'pickupable', state.metadata)
if 'Sliced' in targets['object']:
ts += 1
if len([p for p in pickupables if 'Sliced' in p['objectId']]) >= 1:
s += 1
objs_in_place = [p['objectId'] for p in pickupables for r in receptacles
if r['receptacleObjectIds'] is not None and p['objectId'] in r['receptacleObjectIds']]
objs_cooled = [p['objectId'] for p in pickupables if p['objectId'] in env.cooled_objects]
# check if object is in the receptacle
if len(objs_in_place) > 0:
s += 1
# check if some object was cooled
if len(objs_cooled) > 0:
s += 1
# check if the object is both in the receptacle and cold
if np.any([obj_id in objs_cooled for obj_id in objs_in_place]):
s += 1
return s, ts
else: # pick_two
ts = 2
s = 0
receptacles = get_objects_with_name_and_prop(
targets['parent'], 'receptacle', state.metadata)
pickupables = get_objects_with_name_and_prop(
targets['object'], 'pickupable', state.metadata)
# check if object needs to be sliced
if 'Sliced' in targets['object']:
ts += 2
s += min(len([p for p in pickupables if 'Sliced' in p['objectId']]), 2)
# placing each object counts as a goal_condition
s += min(np.max([sum([1 if r['receptacleObjectIds'] is not None
and p['objectId'] in r['receptacleObjectIds'] else 0
for p in pickupables])
for r in receptacles]), 2)
return s, ts