RLPark 1.0.0
Reinforcement Learning Framework in Java
|
00001 package rlpark.plugin.robot.internal.statemachine; 00002 00003 import java.util.ArrayList; 00004 import java.util.List; 00005 00006 import rlpark.plugin.rltoys.utils.Utils; 00007 import zephyr.plugin.core.api.signals.Signal; 00008 00009 public class StateMachine<T> { 00010 public final Signal<StateMachine<T>> onEnd = new Signal<StateMachine<T>>(); 00011 public final Signal<StateMachine<T>> onStateChange = new Signal<StateMachine<T>>(); 00012 private int currentStateIndex; 00013 private final List<StateNode<T>> nodes; 00014 private boolean stateChanged = false; 00015 00016 public StateMachine(StateNode<T>... nodes) { 00017 this(Utils.asList(nodes)); 00018 } 00019 00020 public StateMachine(List<? extends StateNode<T>> nodes) { 00021 currentStateIndex = 0; 00022 this.nodes = new ArrayList<StateNode<T>>(nodes); 00023 } 00024 00025 public void step(T t) { 00026 if (currentStateIndex >= nodes.size()) { 00027 currentStateIndex = 0; 00028 onEnd.fire(this); 00029 } 00030 StateNode<T> currentState = nodes.get(currentStateIndex); 00031 if (stateChanged) { 00032 currentState.start(); 00033 stateChanged = false; 00034 } 00035 currentState.step(t); 00036 if (currentState.isDone()) { 00037 onStateChange.fire(this); 00038 stateChanged = true; 00039 currentStateIndex++; 00040 } 00041 } 00042 00043 public StateNode<T> currentState() { 00044 if (currentStateIndex < nodes.size()) 00045 return nodes.get(currentStateIndex); 00046 return null; 00047 } 00048 00049 public void setNodes(List<StateNode<T>> nodes) { 00050 this.nodes.clear(); 00051 this.nodes.addAll(nodes); 00052 } 00053 }