package core.controller; import core.Environment; import core.algo.EpisodicLearning; import core.algo.Method; import core.gui.LearningView; import core.gui.View; import core.listener.ViewListener; import javax.swing.*; import java.util.List; public class RLControllerGUI extends RLController implements ViewListener { private LearningView learningView; public RLControllerGUI(Environment env, Method method, A... actions) { super(env, method, actions); } @Override protected void initListeners() { SwingUtilities.invokeLater(() -> { learningView = new View<>(learning, environment, this); learning.addListener(this); }); } /************************************************* ** View LISTENERS ** *************************************************/ @Override public void onLoadState(String fileName) { super.loadState(fileName); SwingUtilities.invokeLater(() -> learningView.updateLearningInfoPanel()); } @Override public void onSaveState(String fileName) { super.saveState(fileName); } @Override public void onShowQTable() { learningView.showQTableFrame(); } @Override public void onEpsilonChange(float epsilon) { super.changeEpsilon(epsilon); SwingUtilities.invokeLater(() -> learningView.updateLearningInfoPanel()); } @Override public void onDelayChange(int delay) { super.changeLearningDelay(delay); SwingUtilities.invokeLater(() -> learningView.updateLearningInfoPanel()); } @Override public void onFastLearnChange(boolean isFastLearn) { super.changeFastLearning(isFastLearn); SwingUtilities.invokeLater(() -> learningView.updateLearningInfoPanel()); } @Override protected void changeLearningDelay(int delay) { super.changeLearningDelay(delay); SwingUtilities.invokeLater(() -> learningView.updateLearningInfoPanel()); } @Override public void onLearnMoreEpisodes(int nrOfEpisodes) { super.learnMoreEpisodes(nrOfEpisodes); learningView.updateLearningInfoPanel(); } /************************************************* ** LEARNING LISTENERS ** *************************************************/ @Override public void onEpisodeEnd(List rewardHistory) { super.onEpisodeEnd(rewardHistory); SwingUtilities.invokeLater(() -> { if(!fastLearning) { learningView.updateRewardGraph(latestRewardsHistory); learningView.updateQTable(); } learningView.updateLearningInfoPanel(); }); } @Override public void onStepEnd() { if(!fastLearning) { SwingUtilities.invokeLater(() -> learningView.repaintEnvironment()); } } @Override public void onLearningEnd() { super.onLearningEnd(); onSaveState(method.toString() + System.currentTimeMillis() / 1000 + (learning instanceof EpisodicLearning ? "e" + ((EpisodicLearning) learning).getCurrentEpisode() : "")); SwingUtilities.invokeLater(() -> learningView.updateRewardGraph(latestRewardsHistory)); } }