package bots.mctsbot.ai.opponentmodels.weka; import java.io.IOException; import org.apache.log4j.Logger; import weka.core.Instance; /** * This {@link ARFFPlayer} manages and writes ARFFFiles for each player.<br /> * After a certain treshold is reached (see {@link WekaOptions} a new weka-model * is created with the data and the default model saved in a given * {@link WekaRegressionModel} replaced by the new data. */ public class ARFFPlayer { private final static Logger logger = Logger.getLogger(ARFFPlayer.class); private final Object player; private ARFFFile preCheckBetFile; private ARFFFile postCheckBetFile; private ARFFFile preFoldCallRaiseFile; private ARFFFile postFoldCallRaiseFile; private ARFFFile showdownFile; private boolean preCheckBetCreated = false; private boolean postCheckBetCreated = false; private boolean preFoldCallRaiseCreated = false; private boolean postFoldCallRaiseCreated = false; private boolean showdownCreated = false; private boolean modelCreated = false; private WekaRegressionModel model = null; public ARFFPlayer(Object player, WekaRegressionModel baseModel) { this.player = player; if (!modelCreated || (modelCreated && WekaOptions.isContinueAfterCreation())) { try { String path = "./data/mctsbot/"; this.model = new WekaRegressionModel(baseModel); boolean overwrite = WekaOptions.isArffOverwrite(); preCheckBetFile = new ARFFFile(path, player, "PreCheckBet.arff", ARFFPropositionalizer.getPreCheckBetInstance().toString(), overwrite); postCheckBetFile = new ARFFFile(path, player, "PostCheckBet.arff", ARFFPropositionalizer.getPostCheckBetInstance().toString(), overwrite); preFoldCallRaiseFile = new ARFFFile(path, player, "PreFoldCallRaise.arff", ARFFPropositionalizer.getPreFoldCallRaiseInstance().toString(), overwrite); postFoldCallRaiseFile = new ARFFFile(path, player, "PostFoldCallRaise.arff", ARFFPropositionalizer.getPostFoldCallRaiseInstance().toString(), overwrite); showdownFile = new ARFFFile(path, player, "Showdown.arff", ARFFPropositionalizer.getShowdownInstance().toString(), overwrite); } catch (IOException io) { throw new RuntimeException(io); } } } public void close() throws IOException { if (model != null) { preCheckBetFile.close(); postCheckBetFile.close(); preFoldCallRaiseFile.close(); postFoldCallRaiseFile.close(); showdownFile.close(); } } public void writePreCheckBet(Instance instance) { if (preCheckBetCreated && !WekaOptions.isContinueAfterCreation()) return; preCheckBetFile.write(instance); if (!preCheckBetCreated && preCheckBetFile.isModelReady()) { try { logger.info("Learning preBetModel for player " + player); model.setPreBetModel(preCheckBetFile.createModel("preBet", "betProb", new String[] { "action" })); preCheckBetCreated = true; } catch (Exception e) { e.printStackTrace(); } } } public void writePostCheckBet(Instance instance) { if (postCheckBetCreated && !WekaOptions.isContinueAfterCreation()) return; postCheckBetFile.write(instance); if (!postCheckBetCreated && postCheckBetFile.isModelReady()) { try { logger.info("Learning postBetModel for player " + player); model.setPostBetModel(postCheckBetFile.createModel("postBet", "betProb", new String[] { "action" })); postCheckBetCreated = true; } catch (Exception e) { e.printStackTrace(); } } } public void writePreFoldCallRaise(Instance instance) { if (preFoldCallRaiseCreated && !WekaOptions.isContinueAfterCreation()) return; preFoldCallRaiseFile.write(instance); if (!preFoldCallRaiseCreated && preFoldCallRaiseFile.isModelReady()) { try { logger.info("Learning preFoldModel for player " + player); model.setPreFoldModel(preFoldCallRaiseFile.createModel("preFold", "foldProb", new String[] { "callProb", "raiseProb", "action" })); logger.info("Learning preCallModel for player " + player); model.setPreCallModel(preFoldCallRaiseFile.createModel("preCall", "callProb", new String[] { "foldProb", "raiseProb", "action" })); logger.info("Learning preRaiseModel for player " + player); model.setPreRaiseModel(preFoldCallRaiseFile.createModel("preRaise", "raiseProb", new String[] { "callProb", "foldProb", "action" })); preFoldCallRaiseCreated = true; } catch (Exception e) { e.printStackTrace(); } } } public void writePostFoldCallRaise(Instance instance) { if (postFoldCallRaiseCreated && !WekaOptions.isContinueAfterCreation()) return; postFoldCallRaiseFile.write(instance); if (!postFoldCallRaiseCreated && postFoldCallRaiseFile.isModelReady()) { try { logger.info("Learning postFoldModel for player " + player); model.setPostFoldModel(postFoldCallRaiseFile.createModel("postFold", "foldProb", new String[] { "callProb", "raiseProb", "action" })); logger.info("Learning postCallModel for player " + player); model.setPostCallModel(postFoldCallRaiseFile.createModel("postCall", "callProb", new String[] { "foldProb", "raiseProb", "action" })); logger.info("Learning postRaiseModel for player " + player); model.setPostRaiseModel(postFoldCallRaiseFile.createModel("postRaise", "raiseProb", new String[] { "callProb", "foldProb", "action" })); postFoldCallRaiseCreated = true; } catch (Exception e) { e.printStackTrace(); } } } public void writeShowdown(Instance instance) { if (showdownCreated && !WekaOptions.isContinueAfterCreation()) return; showdownFile.write(instance); if (!showdownCreated && showdownFile.isModelReady()) { try { logger.info("Learning showdown0Model for player " + player); model.setShowdown0Model(showdownFile.createModel("showdown0", "part0Prob", new String[] { "part1Prob", "part2Prob", "part3Prob", "part4Prob", "part5Prob", "avgPartition" })); logger.info("Learning showdown1Model for player " + player); model.setShowdown1Model(showdownFile.createModel("showdown1", "part1Prob", new String[] { "part0Prob", "part2Prob", "part3Prob", "part4Prob", "part5Prob", "avgPartition" })); logger.info("Learning showdown2Model for player " + player); model.setShowdown2Model(showdownFile.createModel("showdown5", "part2Prob", new String[] { "part0Prob", "part1Prob", "part3Prob", "part4Prob", "part5Prob", "avgPartition" })); logger.info("Learning showdown3Model for player " + player); model.setShowdown3Model(showdownFile.createModel("showdown3", "part3Prob", new String[] { "part0Prob", "part1Prob", "part2Prob", "part4Prob", "part5Prob", "avgPartition" })); logger.info("Learning showdown4Model for player " + player); model.setShowdown4Model(showdownFile.createModel("showdown4", "part4Prob", new String[] { "part0Prob", "part1Prob", "part2Prob", "part3Prob", "part5Prob", "avgPartition" })); logger.info("Learning showdown5Model for player " + player); model.setShowdown5Model(showdownFile.createModel("showdown5", "part5Prob", new String[] { "part0Prob", "part1Prob", "part2Prob", "part3Prob", "part4Prob", "avgPartition" })); // add it to pool //OpponentModelPool.getInstance().addModel(player, model); showdownCreated = true; } catch (Exception e) { e.printStackTrace(); } } } }