예제 #1
0
        private void PreviewMapClicked()
        {
            MoveToPointPreview preview = FindObjectOfType <MoveToPointPreview>();

            if (_previewSelectionMap.Value_ID >= 0)
            {
                preview.SelectedGeneId = _previewSelectionMap.Value_ID;
            }

            preview.GetComponent <PeriodicUpdate>()?.MarkToTrigger();

            Debug.Log("PreviewClicked");
            ParetoGeneBank.Genome gi = GeneBankManager.Inst.GetGenomeByID(_previewSelectionMap.Value_ID);
            if (gi == null)
            {
                return;
            }

            MultiLayerPerception mlp = new MultiLayerPerception(MoveSimParams.GetDefault().mlpShape, Layer.FusedActivation.Relu6);

            mlp.LoadWeights(gi._weights.ToArray());
            _nnDisplay._TestMLP = mlp;
            _nnDisplay.MarkDirtyRepaint();
            Debug.Log("SetNNDisp");
        }
    void OnPeriodicUpdate()
    {
        if (GeneBankManager.Inst.GenomeCount <= 0)
        {
            return;
        }

        float3 state = MoveContext.GetRandomState(in _simParams);

        ParetoGeneBank.Genome gi = GeneBankManager.Inst.GetGenomeByID(SelectedGeneId);
        Debug.Log(SelectedGeneId);
        if (gi == null)
        {
            return;
        }
        MultiLayerPerception mlp = new MultiLayerPerception(_simParams.mlpShape, Layer.FusedActivation.Relu6);

        mlp.LoadWeights(gi._weights.ToArray());
        IWorker worker   = WorkerFactory.CreateWorker(WorkerFactory.Type.Auto, mlp.model, false);
        Tensor  inTensor = new Tensor(1, _simParams.mlpShape.inputSize);

        for (int i = 0; i < _simParams.iterations; i++)
        {
            float2 obs = AcademyMove.Observe(state);
            for (int iINode = 0; iINode < _simParams.mlpShape.inputSize; iINode++)
            {
                _observeBuffer[i][iINode] = (iINode < 2) ? obs[iINode] : inTensor[runIdx, iINode];
                inTensor[runIdx, iINode]  = _observeBuffer[i][iINode];
            }
            worker.SetInput(inTensor);
            worker.Execute().FlushSchedule(true);
            using (Tensor outTensor = worker.PeekOutput()) {
                float2 act = 0;
                Debug.Assert(0 <= outTensor[runIdx, 0] && outTensor[runIdx, 0] <= 6);
                Debug.Assert(0 <= outTensor[runIdx, 1] && outTensor[runIdx, 1] <= 6);
                act.x = math.remap(0, 6, 0, 1, outTensor[runIdx, 0]);
                act.y = math.remap(0, 6, -1, 1, outTensor[runIdx, 1]);

                for (int iINode = 2; iINode < _simParams.mlpShape.inputSize; iINode++)
                {
                    inTensor[runIdx, iINode] = outTensor[runIdx, iINode];
                }
                float2 dir = new float2(math.cos(state.z), math.sin(state.z));
                act           = math.clamp(act, _simParams.actionSpaceMin, _simParams.actionSpaceMax);
                _actBuffer[i] = act;
                state.z      += act.y * _simParams.dt;
                state.xy     += dir * act.x * _simParams.dt;
            }
            _stateBuffer[i] = state;
        }
        worker.Dispose();
        inTensor.Dispose();
        if (_NetDraw)
        {
            _NetDraw._TestMLP = mlp;
        }
    }
 private void LogRemove(ParetoGeneBank.Genome gi) => _remLog.WriteLine(gi.GetYamlEntry());
 private void LogAdd(ParetoGeneBank.Genome gi) => _addLog.WriteLine(gi.GetYamlEntry());