public void ParseTaskJson()

in Luminous4Alfred/TaskSolver/Algorithms/AlfredAgent.cs [276:612]


    public void ParseTaskJson(bool deleteUnsucceeful = true) {

        //initialize traj json
        actionList.Clear();
        trajJson = new TrajJson();

        //scene object record
        RecordObjLocationsAndPDDL();

        //load json
        JObject jsonRule = JObject.Parse(File.ReadAllText(taskJsonPath));


        //set folder
        string taskDesc = (string)jsonRule["task_desc"];
        string taskFolder = taskDesc.Split('/')[0] + taskSuffix;
        string trialFolder = taskDesc.Split('/')[1];

        if (!System.IO.Directory.Exists(System.IO.Path.Combine(saveRoot, taskFolder))) {
            System.IO.Directory.CreateDirectory(System.IO.Path.Combine(saveRoot, taskFolder));
        }

        string trajFolder = System.IO.Path.Combine(saveRoot, taskFolder, trialFolder);
        if (!Directory.Exists(trajFolder)) {
            System.IO.Directory.CreateDirectory(trajFolder);
        }

        string rawImageFolder = System.IO.Path.Combine(trajFolder, "raw_images");
        if (!Directory.Exists(rawImageFolder)) {
            System.IO.Directory.CreateDirectory(rawImageFolder);
        }

        try {
            //resolve initial image
            LookDown();
            LookDown();
            RecordFrame(0, rawImageFolder);
            ImageJson imageJsonInit = new ImageJson();
            imageJsonInit.low_idx = 0;
            imageJsonInit.high_idx = 0;
            imageJsonInit.image_name = 0.ToString("D9") + ".png";
            trajJson.images.Add(imageJsonInit);

            //Get agent init poses
            AgentInitInfo agentMeta = trajJson.scene.init_action;
            agentMeta.rotation = (int)PhysicsController.transform.eulerAngles.y;
            float cameraX = PhysicsController.m_Camera.transform.rotation.eulerAngles.x;
            agentMeta.horizon = (int)(cameraX > 180 ? cameraX - 360 : cameraX);
            agentMeta.x = PhysicsController.transform.position.x;
            agentMeta.y = PhysicsController.transform.position.y;
            agentMeta.z = PhysicsController.transform.position.z;


            //initial look down event
            LookDown();
            RecordFrame(1, rawImageFolder);
            ImageJson imageJsonLookDown = new ImageJson();
            imageJsonLookDown.low_idx = 1;
            imageJsonLookDown.high_idx = 0;
            imageJsonLookDown.image_name = 1.ToString("D9") + ".png";
            trajJson.images.Add(imageJsonLookDown);


            LowAction low_action_look_down = new LowAction();
            low_action_look_down.api_action.action = LowLevelActionType.LookDown.ToString();
            low_action_look_down.discrete_action.action = "LookDown_15";
            low_action_look_down.high_idx = 0;

            trajJson.plan.low_actions.Add(low_action_look_down);

            int high_idx = 0;
            int low_idx = 2;
            foreach (var s in jsonRule["script"]) {

                //resolve high level plan
                HighPddl high_pddl = new HighPddl();
                string actionH = (string)s["action"];

                //modify toggle object high description
                string MactionH = actionH == "ToggleObjectOn" ? "ToggleObject" : actionH;

                high_pddl.discrete_action.action = MactionH;
                high_pddl.planner_action.action = MactionH;
                high_pddl.high_idx = high_idx;

                //this arg for navigation
                string args1 = (string)s["name"];
                Debug.Log("actionH: " + actionH + "; object: " + args1);
                string objectId = GameObject.Find((string)s["name"]).GetComponent<SimObjPhysics>().objectID;

                //this arg for high pddl language description
                string args2 = (string)jsonRule["high_pddl"][high_idx]["name"];
                args2 = args2.Split('_')[0].ToLower();

                //args1 = args1.Split('_')[0].ToLower();
                high_pddl.discrete_action.args.Add(args2);



                trajJson.plan.high_pddl.Add(high_pddl);

                actionList.Clear();
                List<string> actioInteractionIds = new List<string>();

                //resolve low level plan
                if (actionH == "GotoLocation") {
                    Vector3 targetLoc = GameObject.Find((string)s["name"]).transform.position;
                    if (objectId.Contains("Fridge")) {
                        //Debug.Log("?????????????Fridge" + targetLoc);
                        targetLoc = ModifyLastLocation(targetLoc);
                        //Debug.Log("?????????????Fridge after" + targetLoc);
                    }

                    bool final_look_up = false;
                    if (args2.Contains("floorlamp")) {
                        final_look_up = true;
                    }

                    GoToLocation(targetLoc, low_idx, rawImageFolder, final_look_up);
                } else if (actionH == "PickupObject") {

                    PickUpObject(objectId);
                    RecordFrame(low_idx, rawImageFolder);
                    objInHand = args2;
                    actionList.Add(LowLevelActionType.PickupObject);
                    actioInteractionIds.Add(objectId);

                } else if (actionH == "PutObject") {
                    if (AlfredDefinitions.NeedOpenObjs.Contains(args2)) {
                        OpenObject(objectId);
                        RecordFrame(low_idx, rawImageFolder);
                        actionList.Add(LowLevelActionType.OpenObject);
                        actioInteractionIds.Add(objectId);

                        PutObject(objectId);
                        RecordFrame(low_idx + 1, rawImageFolder);
                        high_pddl.discrete_action.args.Insert(0, objInHand);
                        actionList.Add(LowLevelActionType.PutObject);
                        actioInteractionIds.Add(objectId);

                    } else {
                        PutObject(objectId);
                        RecordFrame(low_idx, rawImageFolder);
                        high_pddl.discrete_action.args.Insert(0, objInHand);
                        actionList.Add(LowLevelActionType.PutObject);
                        actioInteractionIds.Add(objectId);
                    }

                } else if (actionH == "ToggleObjectOff") {
                    ToggleObjectOff(objectId);
                    RecordFrame(low_idx, rawImageFolder);
                    actioInteractionIds.Add(objectId);
                    actionList.Add(LowLevelActionType.ToggleObjectOff);
                } else if (actionH == "ToggleObjectOn") {
                    ToggleObjectOn(objectId);
                    RecordFrame(low_idx, rawImageFolder);
                    actioInteractionIds.Add(objectId);
                    actionList.Add(LowLevelActionType.ToggleObjectOn);
                } else if (actionH == "CleanObject") {
                    string sinkId = GameObject.Find("SinkBasin_1").GetComponent<SimObjPhysics>().objectID;
                    PutObject(sinkId);
                    RecordFrame(low_idx, rawImageFolder);
                    actionList.Add(LowLevelActionType.PutObject);
                    actioInteractionIds.Add(sinkId);

                    string faucetId = GameObject.Find("Faucet_1").GetComponent<SimObjPhysics>().objectID;
                    ToggleObjectOn(faucetId);
                    RecordFrame(low_idx + 1, rawImageFolder);
                    actionList.Add(LowLevelActionType.ToggleObjectOn);
                    actioInteractionIds.Add(faucetId);

                    //set clean
                    SimObjPhysics objSop = getSimObjectFromId(objectId);
                    Dirty objDirty = objSop.gameObject.GetComponent<Dirty>();
                    if (objDirty != null) {
                        objDirty.ToggleCleanOrDirty();
                    }

                    ToggleObjectOff(faucetId);
                    RecordFrame(low_idx + 2, rawImageFolder);
                    actionList.Add(LowLevelActionType.ToggleObjectOff);
                    actioInteractionIds.Add(faucetId);

                    PickUpObject(objectId);
                    RecordFrame(low_idx + 3, rawImageFolder);
                    objInHand = args2;
                    actionList.Add(LowLevelActionType.PickupObject);
                    actioInteractionIds.Add(objectId);
                } else if (actionH == "CoolObject") {
                    string fridgeId = GameObject.Find("Fridge_1").GetComponent<SimObjPhysics>().objectID;
                    OpenObject(fridgeId);
                    RecordFrame(low_idx, rawImageFolder);
                    actionList.Add(LowLevelActionType.OpenObject);
                    actioInteractionIds.Add(fridgeId);

                    PutObject(fridgeId);
                    RecordFrame(low_idx + 1, rawImageFolder);
                    actionList.Add(LowLevelActionType.PutObject);
                    actioInteractionIds.Add(fridgeId);

                    CloseObject(fridgeId);
                    RecordFrame(low_idx + 2, rawImageFolder);
                    actionList.Add(LowLevelActionType.CloseObject);
                    actioInteractionIds.Add(fridgeId);

                    OpenObject(fridgeId);
                    RecordFrame(low_idx + 3, rawImageFolder);
                    actionList.Add(LowLevelActionType.OpenObject);
                    actioInteractionIds.Add(fridgeId);

                    PickUpObject(objectId);
                    RecordFrame(low_idx + 4, rawImageFolder);
                    objInHand = args2;
                    actionList.Add(LowLevelActionType.PickupObject);
                    actioInteractionIds.Add(objectId);

                    CloseObject(fridgeId);
                    RecordFrame(low_idx + 5, rawImageFolder);
                    actionList.Add(LowLevelActionType.CloseObject);
                    actioInteractionIds.Add(fridgeId);

                } else if (actionH == "HeatObject") {
                    string microwaveId = GameObject.Find("Microwave_1").GetComponent<SimObjPhysics>().objectID;
                    OpenObject(microwaveId);
                    RecordFrame(low_idx, rawImageFolder);
                    actionList.Add(LowLevelActionType.OpenObject);
                    actioInteractionIds.Add(microwaveId);

                    PutObject(microwaveId);
                    RecordFrame(low_idx + 1, rawImageFolder);
                    actionList.Add(LowLevelActionType.PutObject);
                    actioInteractionIds.Add(microwaveId);

                    CloseObject(microwaveId);
                    RecordFrame(low_idx + 2, rawImageFolder);
                    actionList.Add(LowLevelActionType.CloseObject);
                    actioInteractionIds.Add(microwaveId);

                    ToggleObjectOn(microwaveId);
                    RecordFrame(low_idx + 3, rawImageFolder);
                    actionList.Add(LowLevelActionType.ToggleObjectOn);
                    actioInteractionIds.Add(microwaveId);

                    ToggleObjectOff(microwaveId);
                    RecordFrame(low_idx + 4, rawImageFolder);
                    actionList.Add(LowLevelActionType.ToggleObjectOff);
                    actioInteractionIds.Add(microwaveId);

                    OpenObject(microwaveId);
                    RecordFrame(low_idx + 5, rawImageFolder);
                    actionList.Add(LowLevelActionType.OpenObject);
                    actioInteractionIds.Add(microwaveId);

                    PickUpObject(objectId);
                    RecordFrame(low_idx + 6, rawImageFolder);
                    objInHand = args2;
                    actionList.Add(LowLevelActionType.PickupObject);
                    actioInteractionIds.Add(objectId);

                    CloseObject(microwaveId);
                    RecordFrame(low_idx + 7, rawImageFolder);
                    actionList.Add(LowLevelActionType.CloseObject);
                    actioInteractionIds.Add(microwaveId);

                } else if (actionH == "SliceObject") {
                    //sliceobj
                    string changeToObjId = getSimObjectFromId(objectId).gameObject.GetComponent<SliceObject>().ObjectToChangeTo.name;

                    SliceObject(objectId);
                    RecordFrame(low_idx, rawImageFolder);
                    actionList.Add(LowLevelActionType.SliceObject);
                    actioInteractionIds.Add(objectId);

                    //after slice rename

                } else {
                    throw new ArgumentException("No such action: " + actionH);
                }

                for (int j = 0; j < actionList.Count; ++j) {
                    LowLevelActionType actionL = actionList[j];
                    LowAction low_action = new LowAction();
                    low_action.api_action.action = actionL.ToString();

                    if (AlfredDefinitions.ApiActionName2DiscreteActionName.ContainsKey(actionL.ToString())) {
                        low_action.discrete_action.action = AlfredDefinitions.ApiActionName2DiscreteActionName[actionL.ToString()];
                    } else {
                        low_action.discrete_action.action = low_action.api_action.action;
                    }

                    if (AlfredDefinitions.InteractiveActionType.Contains(actionL)) {
                        low_action.api_action.objectId = actioInteractionIds[j];
                    }

                    low_action.high_idx = high_idx;

                    trajJson.plan.low_actions.Add(low_action);

                    //resolve image
                    ImageJson imageJson = new ImageJson();
                    imageJson.low_idx = low_idx;
                    imageJson.high_idx = j == actionList.Count - 1 ? high_idx + 1 : high_idx;
                    imageJson.image_name = low_idx.ToString("D9") + ".png";

                    trajJson.images.Add(imageJson);

                    low_idx++;

                    if (taskSuccess == false) {
                        break;
                    }
                }

                //update high idx
                high_idx++;
            }

            //save json
            using (StreamWriter saveTrajJsonFile = File.CreateText(trajFolder + "/traj_data.json")) {
                //remove that last image in traj_json: this is because of the ET format
                trajJson.images.RemoveAt(trajJson.images.Count - 1);

                JsonSerializer serializer = new JsonSerializer();
                serializer.Serialize(saveTrajJsonFile, trajJson);
            }
        } catch (Exception e) {
            Debug.LogException(e, this);
            taskSuccess = false;
        }
        //task file: delete data
        if (taskSuccess == false && deleteUnsucceeful) {
            ClearFolder(trajFolder);
            Directory.Delete(trajFolder);
        }

        taskFinish = true;
    }