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());