def modify()

in Luminous4Alfred/TaskParser/cdf_gene/utils.py [0:0]


def modify(cdf_dict):
    '''
    Modify cdf by implicit rules
    '''
    #{"name": "Box_1", "location": [{"Sofa_1": "on"}]}, {"name": "DeskLamp_1"}]}

    required_objects = cdf_dict["scene"]["required_objects"]
    solving_scripts = cdf_dict["script"]
    task_goals = cdf_dict["task_goals"]

    # if len(required_objects) == 0:
    #     return
    
    # #print(required_objects)

    # # different room cases:
    # if cdf_dict["scene"]["scene_type"][0] in [1]: # living room 
    #     # modify desklamp: put it on a side table
    #     side_table_index = 1
    #     for req_obj in required_objects:
    #         if "SideTable" in req_obj["name"]: 
    #             side_table_index += 1

    #     has_desklamp = False
    #     for req_obj in required_objects:
    #         if "DeskLamp_1" in req_obj["name"]: 
    #             req_obj["name"] = "SideTable_{}".format(side_table_index)
    #             has_desklamp = True
    #             break
    #     if has_desklamp:
    #         new_req_obj = {"name": "DeskLamp_1", "location": [{"SideTable_{}".format(side_table_index): "on"}]}
    #         required_objects.append(new_req_obj)

    #     # rename Shelf: doesn't exist in the new version of ithor
    #     for req_obj in required_objects:
    #         if "Shelf_" in req_obj["name"] or "Drawer_" in req_obj["name"]: 
    #             req_obj["name"] = req_obj["name"].replace("Shelf_", "SideTable_").replace("Drawer_", "Desk_")
    #         if "location" in req_obj:
    #             #print(req_obj["location"])
    #             key_value  = req_obj["location"][0]
    #             key = list(key_value)[0]
    #             value = key_value[key]
    #             if "Shelf_" in str(key) or "Drawer_" in str(key):
    #                 new_key = str(key).replace("Shelf_", "SideTable_").replace("Drawer_", "Desk_")
    #                 req_obj["location"].append({new_key: value})
    #                 req_obj["location"].remove(key_value)
        
    #     # rename shelf for solving script
    #     for script in solving_scripts:
    #          if "Shelf_" in script["name"] or "Drawer_" in script["name"]: 
    #             script["name"] = script["name"].replace("Shelf_", "SideTable_").replace("Drawer_", "Desk_")

    #     # rename shelf for target goals
    #     for goal in task_goals:
    #         for obj_state in goal["object_states"]:
    #             if "name" in obj_state and ("Shelf_" in obj_state["name"] or "Drawer_" in obj_state["name"]): 
    #                 obj_state["name"] = obj_state["name"].replace("Shelf_", "SideTable_").replace("Drawer_", "Desk_")
    #             if "receptacle_name" in obj_state and ("Shelf_" in obj_state["receptacle_name"] or "Drawer_" in obj_state["receptacle_name"]): 
    #                 obj_state["receptacle_name"] = obj_state["receptacle_name"].replace("Shelf_", "SideTable_").replace("Drawer_", "Desk_")
                
    
    # elif cdf_dict["scene"]["scene_type"][0] in [2]: #bedroom

    #     # modify desklamp: put it on a side table
    #     desk_index = 1
    #     # for req_obj in required_objects:
    #     #     if "SideTable" in req_obj["name"]: 
    #     #         desk_index += 1

    #     has_desklamp = False
    #     for req_obj in required_objects:
    #         if "DeskLamp_1" in req_obj["name"]: 
    #             req_obj["name"] = "Desk_{}".format(desk_index)
    #             has_desklamp = True
    #             break
    #     if has_desklamp:
    #         new_req_obj = {"name": "DeskLamp_1", "location": [{"Desk_{}".format(desk_index): "on"}]}
    #         required_objects.append(new_req_obj)

    #     # rename Shelf: doesn't exist in the new version of ithor
    #     for req_obj in required_objects:
    #         if "Shelf_" in req_obj["name"] or "Drawer_" in req_obj["name"]: 
    #             req_obj["name"] = req_obj["name"].replace("Shelf_", "SideTable_").replace("Drawer_", "Desk_")
    #         if "location" in req_obj:
    #             #print(req_obj["location"])
    #             key_value  = req_obj["location"][0]
    #             key = list(key_value)[0]
    #             value = key_value[key]
    #             if "Shelf_" in str(key) or "Drawer_" in str(key):
    #                 new_key = str(key).replace("Shelf_", "SideTable_").replace("Drawer_", "Desk_")
    #                 req_obj["location"].append({new_key: value})
    #                 req_obj["location"].remove(key_value)

    #     # rename shelf for solving script
    #     for script in solving_scripts:
    #          if "Shelf_" in script["name"] or "Drawer_" in script["name"]: 
    #             script["name"] = script["name"].replace("Shelf_", "SideTable_").replace("Drawer_", "Desk_")

    #     # rename shelf for target goals
    #     # print(task_goals)
    #     for goal in task_goals:
    #         for obj_state in goal["object_states"]:
    #             if "name" in obj_state and ("Shelf_" in obj_state["name"] or "Drawer_" in obj_state["name"]): 
    #                 obj_state["name"] = obj_state["name"].replace("Shelf_", "SideTable_").replace("Drawer_", "Desk_")
    #             if "receptacle_name" in obj_state and ("Shelf_" in obj_state["receptacle_name"] or "Drawer_" in obj_state["receptacle_name"]): 
    #                 obj_state["receptacle_name"] = obj_state["receptacle_name"].replace("Shelf_", "SideTable_").replace("Drawer_", "Desk_")

    
    # # Delete Kitchen CounterTop: for default, we already include some countertops in the scene

    # elif cdf_dict["scene"]["scene_type"][0] in [0]: # Kitchen
    #     new_required_objects = []
    #     for req_obj in required_objects: 
    #         req_obj_name = req_obj["name"].split("_")[0]
    #         #print(req_obj_name)
    #         if not ("CounterTop" in req_obj["name"] or  "SinkBasin" in req_obj["name"] or "StoveBurner" in req_obj["name"] or \
    #             "Sink" in req_obj["name"] or "Drawer" in req_obj["name"] or "Cabinet" in req_obj["name"] or "Shelf" in req_obj["name"]):
    #             new_required_objects.append(req_obj)
        
    #     required_objects = new_required_objects
    #     cdf_dict["scene"]["required_objects"] = required_objects
    #     # for req_obj in required_objects: 
    #     #     if "CounterTop" in req_obj["name"] or  "SinkBasin" in req_obj["name"] or "StoveBurner" in req_obj["name"] or \
    #     #         "Sink" in req_obj["name"] or "Drawer" in req_obj["name"] or "Cabinet" in req_obj["name"]:
    #     #         required_objects.remove(req_obj)
        
    #     # rename bottle
    #     for req_obj in required_objects: 
    #         if "Glassbottle" in req_obj["name"]:
    #             req_obj["name"] = req_obj["name"].replace("Glassbottle","Bottle")
    #             #print("req_obj", req_obj["name"])

    #  # Delete Bath tub: for default, we already include some Bathtub in the scene
    # else: # Bathroom 
    #     #print("enter bathroom")
    #     remove_obj_list = ["BathtubBasin", "Cabinet", "CounterTop", "Drawer", "SinkBasin", "Sink", "ToiletPaperHanger", 
    #         "HandTowelHolder", "Shelf", "Bathtub"]
    #     new_required_objects = []
    #     for req_obj in required_objects: 
    #         req_obj_name = req_obj["name"].split("_")[0]
    #         #print(req_obj_name)
    #         if req_obj_name not in remove_obj_list:
    #             new_required_objects.append(req_obj)
        
    #     required_objects = new_required_objects
    #     cdf_dict["scene"]["required_objects"] = required_objects
        
        
    #     has_cart, need_cart = False, False

    #     # modify shelf : put it on a side cart
    #     # modify toilet paper hanger : put it on toilet
    #     has_toilet, need_toilet = False, False
    #     for req_obj in required_objects:
    #         if "Cart" in req_obj["name"]: 
    #             has_cart = True
    #         if "Toilet" in req_obj["name"]: 
    #             has_toilet = True
    #         if "location" in req_obj:
    #             #print(req_obj["location"])
    #             key_value  = req_obj["location"][0]
    #             key = list(key_value)[0]
    #             value = key_value[key]
    #             if "Shelf_" in str(key) or "HandTowelHolder_" in str(key):
    #                 need_cart = True
    #                 new_key = str(key).replace("Shelf_", "Cart_").replace("HandTowelHolder_", "Cart_")
    #                 req_obj["location"].append({new_key: value})
    #                 req_obj["location"].remove(key_value)
    #             if "ToiletPaperHanger_" in str(key):
    #                 need_toilet = True
    #                 new_key = str(key).replace("ToiletPaperHanger_", "Toilet_")
    #                 req_obj["location"].append({new_key: value})
    #                 req_obj["location"].remove(key_value)
        
    #     if (not has_cart) and need_cart:
    #         new_req_obj = {"name": "Cart_1"}
    #         required_objects.insert(0, new_req_obj)
        
    #     if not has_toilet:
    #         new_req_obj = {"name": "Toilet_1"}
    #         required_objects.insert(0, new_req_obj)
    
    # # cdf_dict["scene"]["required_objects"] = required_objects

    # # general cases
    # # remove duplicated objects
    # new_required_objects = []
    # for required_obj in required_objects:
    #     obj_name =  required_obj["name"]
    #     recept_name = list(required_obj["location"][0].keys())[0] if "location" in required_obj else None
    #     if recept_name == None or recept_name != obj_name:
    #         # print("name duplicated loc", required_obj)
    #         new_required_objects.append(required_obj)

    # cdf_dict["scene"]["required_objects"] = new_required_objects

    # modify scripts
    new_high_pddl = []
    for script in solving_scripts:
        if script["action"] == "GotoLocation":
            obj_name = script["name"]
            target_name = obj_name
            for required_obj in cdf_dict["scene"]["required_objects"]:
                if required_obj["name"] == obj_name:
                    if "location" in required_obj:
                        recept_name = list(required_obj["location"][0].keys())[0]
                        target_name = recept_name
                        break
            
            new_high_pddl.append({
                "action": "GotoLocation",
                "name": target_name
            })
        else:
            new_high_pddl.append(script)

    cdf_dict["high_pddl"] = new_high_pddl