public override void OnImportAsset(AssetImportContext ctx)
        {
            var inputType = Path.GetExtension(ctx.assetPath);

            if (inputType == null)
            {
                throw new Exception("Demonstration import error.");
            }

            try
            {
                // Read first two proto objects containing metadata and brain parameters.
                Stream reader = File.OpenRead(ctx.assetPath);

                var metaDataProto = DemonstrationMetaProto.Parser.ParseDelimitedFrom(reader);
                var metaData      = new DemonstrationMetaData(metaDataProto);

                reader.Seek(DemonstrationStore.MetaDataBytes + 1, 0);
                var brainParamsProto = BrainParametersProto.Parser.ParseDelimitedFrom(reader);
                var brainParameters  = new BrainParameters(brainParamsProto);

                reader.Close();

                var demonstration = ScriptableObject.CreateInstance <Demonstration>();
                demonstration.Initialize(brainParameters, metaData);
                userData = demonstration.ToString();

                Texture2D texture = (Texture2D)
                                    AssetDatabase.LoadAssetAtPath(IconPath, typeof(Texture2D));

#if UNITY_2017_3_OR_NEWER
                ctx.AddObjectToAsset(ctx.assetPath, demonstration, texture);
                ctx.SetMainObject(demonstration);
#else
                ctx.SetMainAsset(ctx.assetPath, model);
#endif
            }
            catch
            {
                return;
            }
        }
Пример #2
0
        /// Helper function that resets all the data structures associated with
        /// the agent. Typically used when the agent is being initialized or reset
        /// at the end of an episode.
        void ResetData()
        {
            if (brain == null)
            {
                return;
            }

            BrainParameters param = brain.brainParameters;

            actionMasker = new ActionMasker(param);
            if (param.vectorActionSpaceType == SpaceType.continuous)
            {
                action.vectorActions     = new float[param.vectorActionSize[0]];
                info.storedVectorActions = new float[param.vectorActionSize[0]];
            }
            else
            {
                action.vectorActions     = new float[param.vectorActionSize.Length];
                info.storedVectorActions = new float[param.vectorActionSize.Length];
            }

            if (info.textObservation == null)
            {
                info.textObservation = "";
            }
            action.textActions     = "";
            info.memories          = new List <float>();
            action.memories        = new List <float>();
            info.vectorObservation =
                new List <float>(param.vectorObservationSize);
            info.stackedVectorObservation =
                new List <float>(param.vectorObservationSize
                                 * brain.brainParameters.numStackedVectorObservations);
            info.stackedVectorObservation.AddRange(
                new float[param.vectorObservationSize
                          * param.numStackedVectorObservations]);

            info.visualObservations = new List <Texture2D>();
            info.customObservation  = null;
        }
Пример #3
0
        /// <summary>
        /// Sends the Agent info to the linked Brain.
        /// </summary>
        void SendInfoToBrain()
        {
            if (brain == null)
            {
                return;
            }

            info.memories            = action.memories;
            info.storedVectorActions = action.vectorActions;
            info.storedTextActions   = action.textActions;
            info.vectorObservation.Clear();
            actionMasker.ResetMask();
            CollectObservations();
            info.actionMasks = actionMasker.GetMask();

            BrainParameters param = brain.brainParameters;

            if (info.vectorObservation.Count != param.vectorObservationSize)
            {
                throw new UnityAgentsException(string.Format(
                                                   "Vector Observation size mismatch between continuous " +
                                                   "agent {0} and brain {1}. " +
                                                   "Was Expecting {2} but received {3}. ",
                                                   gameObject.name, brain.name,
                                                   brain.brainParameters.vectorObservationSize,
                                                   info.vectorObservation.Count));
            }

            info.stackedVectorObservation.RemoveRange(
                0, param.vectorObservationSize);
            info.stackedVectorObservation.AddRange(info.vectorObservation);

            info.visualObservations.Clear();
            var visualObservationCount = agentParameters.agentCameras.Count + agentParameters.agentRenderTextures.Count;

            if (param.cameraResolutions.Length > visualObservationCount)
            {
                throw new UnityAgentsException(string.Format(
                                                   "Not enough cameras/renderTextures for agent {0} : Brain {1} expecting at " +
                                                   "least {2} cameras/renderTextures but only {3} were present.",
                                                   gameObject.name, brain.name,
                                                   brain.brainParameters.cameraResolutions.Length,
                                                   visualObservationCount));
            }

            //First add all cameras
            for (int i = 0; i < agentParameters.agentCameras.Count; i++)
            {
                ObservationToTexture(
                    agentParameters.agentCameras[i],
                    param.cameraResolutions[i].width,
                    param.cameraResolutions[i].height,
                    ref textureArray[i]);
                info.visualObservations.Add(textureArray[i]);
            }

            //Then add all renderTextures
            var camCount = agentParameters.agentCameras.Count;

            for (int i = 0; i < agentParameters.agentRenderTextures.Count; i++)
            {
                ObservationToTexture(
                    agentParameters.agentRenderTextures[i],
                    param.cameraResolutions[camCount + i].width,
                    param.cameraResolutions[camCount + i].height,
                    ref textureArray[i]);
                info.visualObservations.Add(textureArray[i]);
            }

            info.reward         = reward;
            info.done           = done;
            info.maxStepReached = maxStepReached;
            info.id             = id;

            brain.SendState(this, info);

            if (recorder != null && recorder.record && Application.isEditor)
            {
                recorder.WriteExperience(info);
            }

            info.textObservation = "";
        }
Пример #4
0
 public ActionMasker(BrainParameters brainParameters)
 {
     this._brainParameters = brainParameters;
 }
Пример #5
0
 public void Initialize(BrainParameters brainParameters,
                        DemonstrationMetaData demonstrationMetaData)
 {
     this.brainParameters = brainParameters;
     metaData             = demonstrationMetaData;
 }