Revision: 1382
Author: laurent.verbruggen
Date: Thu May 13 01:37:32 2010
Log: Added online learning to MCTSBot
http://code.google.com/p/cspoker/source/detail?r=1382
Added:
/trunk/ai/bots/src/main/java/org/cspoker/ai/opponentmodels/OpponentModelPool.java
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/ARFFPlayer.java
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/WekaOptions.java
/trunk/ai/opponentmodels/weka/src/main/resources/org/cspoker/ai/opponentmodels/weka/models/arff
Modified:
/trunk
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/mcts/FixedSampleMCTSBotFactory.java
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/mcts/MCTSBot.java
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/mcts/MCTSBotFactory.java
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/mcts/nodes/InnerNode.java
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/search/expander/Expander.java
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/search/expander/TokenExpander.java
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/search/expander/sampling/RelativeBetDistribution.java
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/search/expander/sampling/RouletteWheelSampler.java
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/search/expander/sampling/SmartSampler.java
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/search/expander/sampling/StochasticSampler.java
/trunk/ai/experiments/src/main/java/org/cspoker/ai/bots/BotRunner.java
/trunk/ai/experiments/src/main/java/org/cspoker/ai/bots/RunHumanVsBot.java
/trunk/ai/experiments/src/main/java/org/cspoker/ai/experiments/RunExperimentB.java
/trunk/ai/experiments/src/main/java/org/cspoker/ai/experiments/RunExperimentC.java
/trunk/ai/experiments/src/main/java/org/cspoker/ai/experiments/RunExperimentD.java
/trunk/ai/experiments/src/main/java/org/cspoker/ai/experiments/RunExperimentF.java
/trunk/ai/lore/src/main/java/org/cspoker/ai/lore/Lore.java
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/ARFFFile.java
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/ARFFPropositionalizer.java
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/ActionTrackingVisitor.java
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/WekaModel.java
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/WekaRegressionModel.java
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/WekaRegressionModelFactory.java
/trunk/common/common/src/main/java/org/cspoker/common/elements/hand/HandRanks.java
=======================================
--- /dev/null
+++
/trunk/ai/bots/src/main/java/org/cspoker/ai/opponentmodels/OpponentModelPool.java
Thu May 13 01:37:32 2010
@@ -0,0 +1,64 @@
+package org.cspoker.ai.opponentmodels;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.cspoker.client.common.gamestate.GameState;
+
+public class OpponentModelPool {
+
+ private ConcurrentHashMap<Object, OpponentModel> pool = new
ConcurrentHashMap<Object, OpponentModel>();
+
+ private static OpponentModelPool instance;
+
+ public static OpponentModelPool getInstance() {
+ if (instance == null)
+ instance = new OpponentModelPool();
+ return instance;
+ }
+
+ public int size() {
+ return pool.size();
+ }
+
+ public void addModel(Object player, OpponentModel model) {
+ System.out.println("Adding model for player " + player + ":");
+// System.out.println(model);
+ pool.put(player, model);
+ System.out.println(pool.size() + " model(s) in pool!");
+ }
+
+ public OpponentModel getModel(Object player) {
+ if (!pool.containsKey(player))
+ return null;
+ else {
+ return pool.get(player);
+ }
+ }
+
+ public Object getPlayer(OpponentModel model) {
+ for(Object o:pool.keySet()){
+ if(pool.get(o).equals(model)) {
+ return o;
+ }
+ }
+ return null;
+ }
+
+ public void assumePermanently(GameState gameState) {
+ for (Object key : pool.keySet()) {
+ pool.get(key).assumePermanently(gameState);
+ }
+ }
+
+ public void assumeTemporarily(GameState gameState) {
+ for (Object key : pool.keySet()) {
+ pool.get(key).assumeTemporarily(gameState);
+ }
+ }
+
+ public void forgetLastAssumption() {
+ for (Object key : pool.keySet()) {
+ pool.get(key).forgetLastAssumption();
+ }
+ }
+}
=======================================
--- /dev/null
+++
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/ARFFPlayer.java
Thu May 13 01:37:32 2010
@@ -0,0 +1,172 @@
+package org.cspoker.ai.opponentmodels.weka;
+
+import java.io.*;
+
+import org.apache.log4j.Logger;
+import org.cspoker.ai.opponentmodels.OpponentModelPool;
+
+import weka.core.Instance;
+
+public class ARFFPlayer {
+
+ private final static Logger logger = Logger.getLogger(ARFFPlayer.class);
+
+ private final String folder
= "../../src/main/resources/org/cspoker/ai/opponentmodels/weka/models/arff/";
+
+ 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) throws
IOException {
+ this.player = player;
+
+ if (OpponentModelPool.getInstance().getModel(player) != null) {
+ modelCreated = true;
+ preCheckBetCreated = true;
+ postCheckBetCreated = true;
+ preFoldCallRaiseCreated = true;
+ postFoldCallRaiseCreated = true;
+ showdownCreated = true;
+ }
+
+ if (!modelCreated || (modelCreated &&
WekaOptions.isContinueAfterCreation())){
+ String path = (getClass().getProtectionDomain().getCodeSource()
+ .getLocation().getPath() + folder).replace("%20", " ");
+ 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);
+ }
+ }
+
+ 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"}));
+ // add it to pool
+ OpponentModelPool.getInstance().addModel(player, model);
+ 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"}));
+ // add it to pool
+ OpponentModelPool.getInstance().addModel(player, model);
+ 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"}));
+ // add it to pool
+ OpponentModelPool.getInstance().addModel(player, model);
+ 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"}));
+ // add it to pool
+ OpponentModelPool.getInstance().addModel(player, model);
+ 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();
+ }
+ }
+ }
+}
=======================================
--- /dev/null
+++
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/WekaOptions.java
Thu May 13 01:37:32 2010
@@ -0,0 +1,50 @@
+package org.cspoker.ai.opponentmodels.weka;
+
+public class WekaOptions {
+
+ private static boolean arffPersistency = true;
+ private static boolean arffOverwrite = true;
+ private static long modelCreationTreshold = 500;
+ private static boolean continueAfterCreation = false;
+ private static boolean modelPersistency = true;
+
+ public static boolean isArffPersistency() {
+ return arffPersistency;
+ }
+
+ public static void setArffPersistency(boolean arffPersistency) {
+ WekaOptions.arffPersistency = arffPersistency;
+ }
+
+ public static boolean isArffOverwrite() {
+ return arffOverwrite;
+ }
+
+ public static void setArffOverwrite(boolean arffOverwrite) {
+ WekaOptions.arffOverwrite = arffOverwrite;
+ }
+
+ public static long getModelCreationTreshold() {
+ return modelCreationTreshold;
+ }
+
+ public static void setModelCreationTreshold(long modelCreationTreshold) {
+ WekaOptions.modelCreationTreshold = modelCreationTreshold;
+ }
+
+ public static boolean isContinueAfterCreation() {
+ return continueAfterCreation;
+ }
+
+ public static void setContinueAfterCreation(boolean
continueAfterCreation) {
+ WekaOptions.continueAfterCreation = continueAfterCreation;
+ }
+
+ public static boolean isModelPersistency() {
+ return modelPersistency;
+ }
+
+ public static void setModelPersistency(boolean modelPersistency) {
+ WekaOptions.modelPersistency = modelPersistency;
+ }
+}
=======================================
---
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/mcts/FixedSampleMCTSBotFactory.java
Tue Mar 9 06:36:20 2010
+++
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/mcts/FixedSampleMCTSBotFactory.java
Thu May 13 01:37:32 2010
@@ -16,7 +16,6 @@
*/
package org.cspoker.ai.bots.bot.gametree.mcts;
-import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import org.cspoker.ai.bots.bot.Bot;
@@ -29,6 +28,7 @@
import org.cspoker.ai.bots.bot.gametree.search.expander.sampling.Sampler;
import org.cspoker.ai.bots.listener.BotListener;
import org.cspoker.ai.opponentmodels.OpponentModel;
+import org.cspoker.ai.opponentmodels.OpponentModelPool;
import org.cspoker.client.common.SmartLobbyContext;
import org.cspoker.common.elements.player.PlayerId;
import org.cspoker.common.elements.table.TableId;
@@ -38,7 +38,6 @@
private static int copies = 0;
- private final ConcurrentHashMap<PlayerId, OpponentModel> opponentModels =
new ConcurrentHashMap<PlayerId, OpponentModel>();
private final MCTSListener.Factory[] listeners;
private final OpponentModel.Factory opponentModelFactory;
private final SelectionStrategy decisionNodeSelectionStrategy;
@@ -87,10 +86,10 @@
SmartLobbyContext lobby, int buyIn, ExecutorService executor,
BotListener... botListeners) {
copies++;
- OpponentModel opponentModel = opponentModels.get(botId);
+ OpponentModel opponentModel =
OpponentModelPool.getInstance().getModel(botId);
if(opponentModel==null){
opponentModel = opponentModelFactory.create();
- opponentModels.put(botId, opponentModel);
+ OpponentModelPool.getInstance().addModel(botId, opponentModel);
}
Config config = new Config(opponentModel, showdownNodeFactory,
decisionNodeSelectionStrategy, opponentNodeSelectionStrategy,
=======================================
---
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/mcts/MCTSBot.java
Mon Mar 15 05:15:17 2010
+++
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/mcts/MCTSBot.java
Thu May 13 01:37:32 2010
@@ -22,15 +22,19 @@
import org.cspoker.ai.bots.bot.AbstractBot;
import org.cspoker.ai.bots.bot.gametree.action.SearchBotAction;
import org.cspoker.ai.bots.bot.gametree.mcts.listeners.MCTSListener;
+import org.cspoker.ai.bots.bot.gametree.mcts.listeners.SWTTreeListener;
+import org.cspoker.ai.bots.bot.gametree.mcts.listeners.TextTreeListener;
import org.cspoker.ai.bots.bot.gametree.mcts.nodes.Config;
import org.cspoker.ai.bots.bot.gametree.mcts.nodes.INode;
import org.cspoker.ai.bots.bot.gametree.mcts.nodes.RootNode;
import org.cspoker.ai.bots.listener.BotListener;
+import org.cspoker.ai.opponentmodels.OpponentModelPool;
import org.cspoker.client.common.SmartLobbyContext;
import org.cspoker.client.common.gamestate.GameState;
import org.cspoker.common.api.shared.exception.IllegalActionException;
import org.cspoker.common.elements.player.PlayerId;
import org.cspoker.common.elements.table.TableId;
+import org.eclipse.swt.widgets.Display;
public class MCTSBot extends AbstractBot {
@@ -106,6 +110,13 @@
for (MCTSListener listener : listeners) {
listener.onMCTS(root);
}
+// if (OpponentModelPool.getInstance().size() > 1) {
+// TextTreeListener.Factory factory = new TextTreeListener.Factory();
+//// SWTTreeListener.Factory factory = new
SWTTreeListener.Factory(Display.getDefault());
+// MCTSListener listener = factory.create(gameState, botId);
+// listener.onMCTS(root);
+// System.out.println("Tree printed");
+// }
}
// long currentCount = 0;
=======================================
---
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/mcts/MCTSBotFactory.java
Tue Mar 9 06:36:20 2010
+++
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/mcts/MCTSBotFactory.java
Thu May 13 01:37:32 2010
@@ -16,7 +16,6 @@
*/
package org.cspoker.ai.bots.bot.gametree.mcts;
-import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import org.cspoker.ai.bots.bot.Bot;
@@ -29,6 +28,7 @@
import org.cspoker.ai.bots.bot.gametree.search.expander.sampling.Sampler;
import org.cspoker.ai.bots.listener.BotListener;
import org.cspoker.ai.opponentmodels.OpponentModel;
+import org.cspoker.ai.opponentmodels.OpponentModelPool;
import org.cspoker.client.common.SmartLobbyContext;
import org.cspoker.common.elements.player.PlayerId;
import org.cspoker.common.elements.table.TableId;
@@ -36,7 +36,6 @@
public class MCTSBotFactory implements BotFactory {
- private final ConcurrentHashMap<PlayerId, OpponentModel> opponentModels =
new ConcurrentHashMap<PlayerId, OpponentModel>();
private final MCTSListener.Factory[] listeners;
private final OpponentModel.Factory opponentModelFactory;
private final SelectionStrategy decisionNodeSelectionStrategy;
@@ -75,10 +74,10 @@
public Bot createBot(final PlayerId botId, TableId tableId,
SmartLobbyContext lobby, int buyIn, ExecutorService executor,
BotListener... botListeners) {
- OpponentModel opponentModel = opponentModels.get(botId);
+ OpponentModel opponentModel =
OpponentModelPool.getInstance().getModel(botId);
if(opponentModel==null){
opponentModel = opponentModelFactory.create();
- opponentModels.put(botId, opponentModel);
+ OpponentModelPool.getInstance().addModel(botId, opponentModel);
}
Config config = new Config(opponentModel, showdownNodeFactory,
decisionNodeSelectionStrategy, opponentNodeSelectionStrategy,
=======================================
---
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/mcts/nodes/InnerNode.java
Tue Mar 9 06:36:20 2010
+++
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/mcts/nodes/InnerNode.java
Thu May 13 01:37:32 2010
@@ -25,6 +25,7 @@
import
org.cspoker.ai.bots.bot.gametree.mcts.strategies.backpropagation.BackPropagationStrategy;
import
org.cspoker.ai.bots.bot.gametree.mcts.strategies.selection.SelectionStrategy;
import org.cspoker.ai.bots.bot.gametree.search.expander.Expander;
+import org.cspoker.ai.opponentmodels.OpponentModelPool;
import org.cspoker.client.common.gamestate.GameState;
import org.cspoker.common.elements.player.PlayerId;
@@ -62,15 +63,19 @@
public INode selectRecursively(){
//if(!inTree) return this;
+// long size = config.getModel().getVisitorSize();
boolean needsChildExpansion = (children==null);
if(needsChildExpansion){
- config.getModel().assumeTemporarily(gameState);
+ OpponentModelPool.getInstance().assumeTemporarily(gameState);
+// config.getModel().assumeTemporarily(gameState);
expandChildren();
}
INode selectedChild = selectChild().selectRecursively();
if(needsChildExpansion){
- config.getModel().forgetLastAssumption();
- }
+// config.getModel().forgetLastAssumption();
+ OpponentModelPool.getInstance().forgetLastAssumption();
+ }
+// if (size != config.getModel().getVisitorSize()) throw new
IllegalStateException("Model didn't forget last assumption");
return selectedChild;
}
@@ -155,7 +160,7 @@
protected void expandChildren(){
if(children == null){
- Expander expander = new Expander(gameState, config.getModel(),
gameState.getNextToAct(), bot, config.getSampler());
+ Expander expander = new Expander(gameState, gameState.getNextToAct(),
bot, config.getSampler());
List<ProbabilityAction> actions = expander.getProbabilityActions();
ImmutableList.Builder<INode> childrenBuilder = ImmutableList.builder();
probabilities = new double[actions.size()];
=======================================
---
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/search/expander/Expander.java
Tue Mar 9 06:36:20 2010
+++
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/search/expander/Expander.java
Thu May 13 01:37:32 2010
@@ -19,31 +19,32 @@
import org.cspoker.ai.bots.bot.gametree.search.InnerGameTreeNode;
import org.cspoker.ai.bots.bot.gametree.search.expander.sampling.Sampler;
import org.cspoker.ai.opponentmodels.OpponentModel;
+import org.cspoker.ai.opponentmodels.OpponentModelPool;
import org.cspoker.client.common.gamestate.GameState;
import org.cspoker.common.elements.player.PlayerId;
import com.google.common.collect.ImmutableList;
public class Expander {
- public static final int nbBetSizeSamples = 3;
+ public static final int nbBetSizeSamples = 5;
private final GameState gameState;
- private final OpponentModel model;
private final PlayerId actor;
private final PlayerId bot;
private final Sampler sampler;
- public Expander(GameState gameState, OpponentModel model,
+ public Expander(GameState gameState,
PlayerId actor, PlayerId bot, Sampler sampler) {
this.gameState = gameState;
- this.model = model;
this.actor = actor;
this.bot = bot;
this.sampler = sampler;
}
public ImmutableList<ProbabilityAction> getProbabilityActions() {
- return sampler.getProbabilityActions(gameState, model, actor, bot);
+ OpponentModel actorModel =
OpponentModelPool.getInstance().getModel(actor);
+ if (actorModel == null) actorModel =
OpponentModelPool.getInstance().getModel(bot);
+ return sampler.getProbabilityActions(gameState, actorModel, actor, bot);
}
public static interface Factory {
=======================================
---
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/search/expander/TokenExpander.java
Tue Mar 9 06:36:20 2010
+++
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/search/expander/TokenExpander.java
Thu May 13 01:37:32 2010
@@ -29,7 +29,7 @@
protected final InnerGameTreeNode node;
public TokenExpander(InnerGameTreeNode node, int tokens, Sampler sampler)
{
- super(node.getGameState(), node.getOpponentModel(), node.getPlayerId(),
node.getBotId(), sampler);
+ super(node.getGameState(), node.getPlayerId(), node.getBotId(), sampler);
this.tokens = tokens;
this.node = node;
}
=======================================
---
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/search/expander/sampling/RelativeBetDistribution.java
Tue Mar 9 06:36:20 2010
+++
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/search/expander/sampling/RelativeBetDistribution.java
Thu May 13 01:37:32 2010
@@ -392,6 +392,10 @@
0.96304667, 0.963062045, 0.963069732, 0.963069732, 0.96307742,
0.96307742, 0.96307742, 1 };
+ public int length() {
+ return probs.length;
+ }
+
public double pdf(double x) {
if (x < 0 || x > 1)
return 0;
=======================================
---
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/search/expander/sampling/RouletteWheelSampler.java
Tue Mar 9 06:36:20 2010
+++
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/search/expander/sampling/RouletteWheelSampler.java
Thu May 13 01:37:32 2010
@@ -1,6 +1,8 @@
package org.cspoker.ai.bots.bot.gametree.search.expander.sampling;
+import java.util.ArrayList;
import java.util.Arrays;
+import java.util.List;
public class RouletteWheelSampler extends StochasticSampler {
@@ -12,20 +14,97 @@
super(nbBetSizeSamples);
}
+ class Bucket {
+ private double start;
+ private double end;
+ private double prob;
+ private double totalProb;
+ private double averageProb;
+
+ public Bucket(double start, double prob, double totalProb) {
+ this.start = start;
+ this.setProb(prob);
+ this.setTotalProb(totalProb);
+ }
+ public double getStart() {
+ return start;
+ }
+ public double getEnd() {
+ return end;
+ }
+ public void setEnd(double end) {
+ this.end = end;
+ }
+ public double getProb() {
+ return prob;
+ }
+ private void setProb(double prob) {
+ this.prob = prob;
+ }
+ public double getTotalProb() {
+ return totalProb;
+ }
+ public void setTotalProb(double totalProb) {
+ this.totalProb = totalProb;
+ }
+ public String toString() {
+ return "Start: " + start + ", \t end: " + end + ",\t prob: " +
+ prob + ", averageProb: " + averageProb + ", totalProb: " + totalProb;
+ }
+ public void setAverageProb(int length) {
+ if (end==start)
+ this.averageProb = totalProb;
+ else
+ this.averageProb = totalProb/((end-start)*(length-1));
+ }
+ public double getAverageProb() {
+ return averageProb;
+ }
+ }
+
+ @Override
protected double[] getStochasticSamples(int n) {
RelativeBetDistribution distr = new RelativeBetDistribution();
double[] samples = new double[n];
for (int i = 0; i < samples.length; i++)
- samples[i] = distr.inverseCdf(r.nextDouble());
+ samples[i] = distr.inverseCdf(r.nextDouble());
Arrays.sort(samples);
return samples;
}
+
+ protected List<Bucket> getStochasticSamples(double threshold) {
+ RelativeBetDistribution distr = new RelativeBetDistribution();
+ List<Bucket> buckets = new ArrayList<Bucket>();
+ // start of range bucket, prob of start, totalProb
+ Bucket bucket = new Bucket(0, distr.pdf(0), 0);
+ for (int i = 0; i < distr.length(); i++) {
+ double relBet = (double) i / (distr.length() - 1);
+ if (Math.abs(bucket.getProb() - distr.pdf(relBet)) > threshold) {
+ bucket.setEnd(relBet);
+ bucket.setAverageProb(distr.length());
+ buckets.add(bucket);
+ bucket = new Bucket(relBet, distr.pdf(relBet), 0);
+ }
+ bucket.setTotalProb(bucket.getTotalProb() + distr.pdf(relBet));
+ }
+ bucket.setEnd(1);
+ bucket.setAverageProb(distr.length());
+ buckets.add(bucket);
+ return buckets;
+ }
public static void main(String[] args) {
RouletteWheelSampler s = new RouletteWheelSampler();
- double[] list = s.getStochasticSamples(8);
- for (int i = 0; i < list.length; i++) {
- System.out.println(" - " + list[i]);
- }
+// double[] list = s.getStochasticSamples(8);
+// for (int i = 0; i < list.length; i++) {
+// System.out.println(" - " + list[i]);
+// }
+ List<Bucket> list = s.getStochasticSamples(0.01);
+ double totalProb = 0;
+ for (int i = 0; i < list.size(); i++) {
+ totalProb += list.get(i).getTotalProb();
+ System.out.println(" - " + list.get(i));
+ }
+ System.out.println("\n => TotalProb: " + totalProb);
}
}
=======================================
---
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/search/expander/sampling/SmartSampler.java
Tue Mar 9 06:36:20 2010
+++
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/search/expander/sampling/SmartSampler.java
Thu May 13 01:37:32 2010
@@ -24,11 +24,16 @@
public ImmutableList<ProbabilityAction> getProbabilityActions(
GameState gameState, OpponentModel model, PlayerId actor,
PlayerId bot) {
+// long size;
List<ProbabilityAction> actions =
Lists.newArrayListWithExpectedSize(2+relBetSizeSamples.length);
if (gameState.getDeficit(actor)>0) {
// call, raise or fold
- Triple<Double, Double, Double> probabilities;
- probabilities = model.getFoldCallRaiseProbabilities(gameState, actor);
+// size = model.getVisitorSize();
+ model.assumeTemporarily(gameState);
+ Triple<Double, Double, Double> probabilities =
+ model.getFoldCallRaiseProbabilities(gameState, actor);
+ model.forgetLastAssumption();
+// if (size != model.getVisitorSize()) throw new
IllegalStateException("Model didn't forget last assumption");
double foldProbability = probabilities.getLeft();
actions.add(new ProbabilityAction(new FoldAction(gameState, actor),
foldProbability));
@@ -44,7 +49,12 @@
}
} else {
// check or bet
+// size = model.getVisitorSize();
+ model.assumeTemporarily(gameState);
Pair<Double, Double> probabilities =
model.getCheckBetProbabilities(gameState, actor);
+ model.forgetLastAssumption();
+// if (size != model.getVisitorSize()) throw new
IllegalStateException("Model didn't forget last assumption");
+
double checkProbability = probabilities.getLeft();
actions.add(new ProbabilityAction(new CheckAction(gameState, actor),
checkProbability));
=======================================
---
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/search/expander/sampling/StochasticSampler.java
Mon Mar 15 05:15:17 2010
+++
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/search/expander/sampling/StochasticSampler.java
Thu May 13 01:37:32 2010
@@ -3,10 +3,7 @@
import java.util.List;
import java.util.Random;
-import org.cspoker.ai.bots.bot.gametree.action.CallAction;
-import org.cspoker.ai.bots.bot.gametree.action.CheckAction;
-import org.cspoker.ai.bots.bot.gametree.action.FoldAction;
-import org.cspoker.ai.bots.bot.gametree.action.ProbabilityAction;
+import org.cspoker.ai.bots.bot.gametree.action.*;
import org.cspoker.ai.opponentmodels.OpponentModel;
import org.cspoker.client.common.gamestate.GameState;
import org.cspoker.common.elements.player.PlayerId;
@@ -27,125 +24,133 @@
public StochasticSampler(int nbBetSizeSamples) {
this.nbBetSizeSamples = nbBetSizeSamples;
}
-
- @Override
- public ImmutableList<ProbabilityAction> getProbabilityActions(
- GameState gameState, OpponentModel model, PlayerId actor,
- PlayerId bot) {
- List<ProbabilityAction> actions =
Lists.newArrayListWithExpectedSize(2+nbBetSizeSamples);
- RelativeBetDistribution distr = new RelativeBetDistribution();
- if (gameState.getDeficit(actor)>0) {
- // call, raise or fold
- Triple<Double, Double, Double> probabilities;
- probabilities = model.getFoldCallRaiseProbabilities(gameState, actor);
-
- double foldProbability = probabilities.getLeft();
- actions.add(new ProbabilityAction(new FoldAction(gameState, actor),
foldProbability));
-
- double callProbability = probabilities.getMiddle();
- actions.add(new ProbabilityAction(new CallAction(gameState, actor),
callProbability));
-
- if (!gameState.getPlayer(bot).isAllIn()
- && gameState.isAllowedToRaise(actor)) {
- double raiseProbability = probabilities.getRight();
- double[] betSizeSamples = getStochasticSamples(nbBetSizeSamples);
- double[] pBetSizeSamples = new double[nbBetSizeSamples];
- for (int i = 0; i < betSizeSamples.length; i++)
- pBetSizeSamples[i] = distr.pdf(betSizeSamples[i]);
-
- addRaiseProbalities(gameState, actor, actions, raiseProbability, true,
- betSizeSamples, pBetSizeSamples);
- }
- } else {
- // check or bet
- Pair<Double, Double> probabilities =
model.getCheckBetProbabilities(gameState, actor);
- double checkProbability = probabilities.getLeft();
- actions.add(new ProbabilityAction(new CheckAction(gameState, actor),
checkProbability));
-
- if (!gameState.getPlayer(bot).isAllIn()
- && gameState.isAllowedToRaise(actor)) {
- double betProbability = probabilities.getRight();
- double[] betSizeSamples = getStochasticSamples(nbBetSizeSamples);
- double[] pBetSizeSamples = new double[nbBetSizeSamples];
- for (int i = 0; i < betSizeSamples.length; i++)
- pBetSizeSamples[i] = distr.pdf(betSizeSamples[i]);
-
- addRaiseProbalities(gameState, actor, actions, betProbability, true,
- betSizeSamples, pBetSizeSamples);
- }
- }
- ImmutableList.Builder<ProbabilityAction> normalizedActionsBuilder =
ImmutableList.builder();
- for (ProbabilityAction action : actions) {
- normalizedActionsBuilder.add(new ProbabilityAction(action
- .getActionWrapper(), action.getProbability()));
- }
- return normalizedActionsBuilder.build();
- }
// @Override
// public ImmutableList<ProbabilityAction> getProbabilityActions(
// GameState gameState, OpponentModel model, PlayerId actor,
// PlayerId bot) {
// List<ProbabilityAction> actions =
Lists.newArrayListWithExpectedSize(2+nbBetSizeSamples);
-// double totalProbability = 0;
+// RelativeBetDistribution distr = new RelativeBetDistribution();
// if (gameState.getDeficit(actor)>0) {
// // call, raise or fold
-// Triple<Double, Double, Double> probabilities;
-// probabilities = model.getFoldCallRaiseProbabilities(gameState, actor);
+// model.assumeTemporarily(gameState);
+// Triple<Double, Double, Double> probabilities =
+// model.getFoldCallRaiseProbabilities(gameState, actor);
+// model.forgetLastAssumption();
//
// double foldProbability = probabilities.getLeft();
-// totalProbability += foldProbability;
// actions.add(new ProbabilityAction(new FoldAction(gameState, actor),
foldProbability));
//
// double callProbability = probabilities.getMiddle();
-// totalProbability += callProbability;
// actions.add(new ProbabilityAction(new CallAction(gameState, actor),
callProbability));
//
// if (!gameState.getPlayer(bot).isAllIn()
// && gameState.isAllowedToRaise(actor)) {
// double raiseProbability = probabilities.getRight();
-// int lowerRaiseBound = gameState.getLowerRaiseBound(actor);
-// int upperRaiseBound = gameState.getUpperRaiseBound(actor);
// double[] betSizeSamples = getStochasticSamples(nbBetSizeSamples);
-// for (double betSizeSample : betSizeSamples) {
-// RaiseAction betAction = new RaiseAction(gameState, actor,
-// (int) Math.round(lowerRaiseBound + betSizeSample
-// * (upperRaiseBound - lowerRaiseBound)));
-// actions.add(new ProbabilityAction(betAction,
-// raiseProbability / nbBetSizeSamples));
-// totalProbability += raiseProbability / nbBetSizeSamples;
-// }
+// double[] pBetSizeSamples = new double[nbBetSizeSamples];
+// for (int i = 0; i < betSizeSamples.length; i++)
+// pBetSizeSamples[i] = distr.pdf(betSizeSamples[i]);
+//
+// addRaiseProbalities(gameState, actor, actions, raiseProbability,
true,
+// betSizeSamples, pBetSizeSamples);
// }
// } else {
// // check or bet
+// model.assumeTemporarily(gameState);
// Pair<Double, Double> probabilities =
model.getCheckBetProbabilities(gameState, actor);
+// model.forgetLastAssumption();
// double checkProbability = probabilities.getLeft();
-// totalProbability += checkProbability;
// actions.add(new ProbabilityAction(new CheckAction(gameState, actor),
checkProbability));
//
// if (!gameState.getPlayer(bot).isAllIn()
// && gameState.isAllowedToRaise(actor)) {
// double betProbability = probabilities.getRight();
-// int lowerRaiseBound = gameState.getLowerRaiseBound(actor);
-// int upperRaiseBound = gameState.getUpperRaiseBound(actor);
// double[] betSizeSamples = getStochasticSamples(nbBetSizeSamples);
-// for (double betSizeSample : betSizeSamples) {
-// BetAction betAction = new BetAction(gameState, actor,
-// (int) Math.round(lowerRaiseBound + betSizeSample
-// * (upperRaiseBound - lowerRaiseBound)));
-// actions.add(new ProbabilityAction(betAction,
-// betProbability / nbBetSizeSamples));
-// totalProbability += betProbability / nbBetSizeSamples;
-// }
+// double[] pBetSizeSamples = new double[nbBetSizeSamples];
+// for (int i = 0; i < betSizeSamples.length; i++)
+// pBetSizeSamples[i] = distr.pdf(betSizeSamples[i]);
+//
+// addRaiseProbalities(gameState, actor, actions, betProbability, true,
+// betSizeSamples, pBetSizeSamples);
// }
// }
// ImmutableList.Builder<ProbabilityAction> normalizedActionsBuilder =
ImmutableList.builder();
// for (ProbabilityAction action : actions) {
// normalizedActionsBuilder.add(new ProbabilityAction(action
-// .getActionWrapper(), action.getProbability() / totalProbability));
+// .getActionWrapper(), action.getProbability()));
// }
// return normalizedActionsBuilder.build();
// }
+
+ @Override
+ public ImmutableList<ProbabilityAction> getProbabilityActions(
+ GameState gameState, OpponentModel model, PlayerId actor,
+ PlayerId bot) {
+ List<ProbabilityAction> actions =
Lists.newArrayListWithExpectedSize(2+nbBetSizeSamples);
+ double totalProbability = 0;
+ if (gameState.getDeficit(actor)>0) {
+ // call, raise or fold
+// model.assumeTemporarily(gameState);
+ Triple<Double, Double, Double> probabilities =
+ model.getFoldCallRaiseProbabilities(gameState, actor);
+// model.forgetLastAssumption();
+
+ double foldProbability = probabilities.getLeft();
+ totalProbability += foldProbability;
+ actions.add(new ProbabilityAction(new FoldAction(gameState, actor),
foldProbability));
+
+ double callProbability = probabilities.getMiddle();
+ totalProbability += callProbability;
+ actions.add(new ProbabilityAction(new CallAction(gameState, actor),
callProbability));
+
+ if (!gameState.getPlayer(bot).isAllIn()
+ && gameState.isAllowedToRaise(actor)) {
+ double raiseProbability = probabilities.getRight();
+ int lowerRaiseBound = gameState.getLowerRaiseBound(actor);
+ int upperRaiseBound = gameState.getUpperRaiseBound(actor);
+ double[] betSizeSamples = getStochasticSamples(nbBetSizeSamples);
+ for (double betSizeSample : betSizeSamples) {
+ RaiseAction betAction = new RaiseAction(gameState, actor,
+ (int) Math.round(lowerRaiseBound + betSizeSample
+ * (upperRaiseBound - lowerRaiseBound)));
+ actions.add(new ProbabilityAction(betAction,
+ raiseProbability / nbBetSizeSamples));
+ totalProbability += raiseProbability / nbBetSizeSamples;
+ }
+ }
+ } else {
+ // check or bet
+// model.assumeTemporarily(gameState);
+ Pair<Double, Double> probabilities =
model.getCheckBetProbabilities(gameState, actor);
+// model.forgetLastAssumption();
+ double checkProbability = probabilities.getLeft();
+ totalProbability += checkProbability;
+ actions.add(new ProbabilityAction(new CheckAction(gameState, actor),
checkProbability));
+
+ if (!gameState.getPlayer(bot).isAllIn()
+ && gameState.isAllowedToRaise(actor)) {
+ double betProbability = probabilities.getRight();
+ int lowerRaiseBound = gameState.getLowerRaiseBound(actor);
+ int upperRaiseBound = gameState.getUpperRaiseBound(actor);
+ double[] betSizeSamples = getStochasticSamples(nbBetSizeSamples);
+ for (double betSizeSample : betSizeSamples) {
+ BetAction betAction = new BetAction(gameState, actor,
+ (int) Math.round(lowerRaiseBound + betSizeSample
+ * (upperRaiseBound - lowerRaiseBound)));
+ actions.add(new ProbabilityAction(betAction,
+ betProbability / nbBetSizeSamples));
+ totalProbability += betProbability / nbBetSizeSamples;
+ }
+ }
+ }
+ ImmutableList.Builder<ProbabilityAction> normalizedActionsBuilder =
ImmutableList.builder();
+ for (ProbabilityAction action : actions) {
+ normalizedActionsBuilder.add(new ProbabilityAction(action
+ .getActionWrapper(), action.getProbability() / totalProbability));
+ }
+ return normalizedActionsBuilder.build();
+ }
protected abstract double[] getStochasticSamples(int n);
=======================================
--- /trunk/ai/experiments/src/main/java/org/cspoker/ai/bots/BotRunner.java
Mon Mar 15 08:33:39 2010
+++ /trunk/ai/experiments/src/main/java/org/cspoker/ai/bots/BotRunner.java
Thu May 13 01:37:32 2010
@@ -27,6 +27,8 @@
import org.cspoker.ai.bots.bot.Bot;
import org.cspoker.ai.bots.bot.BotFactory;
import org.cspoker.ai.bots.bot.gametree.mcts.*;
+import org.cspoker.ai.bots.bot.gametree.mcts.listeners.SWTTreeListener;
+import org.cspoker.ai.bots.bot.gametree.mcts.listeners.TextTreeListener;
import org.cspoker.ai.bots.bot.gametree.mcts.nodes.*;
import org.cspoker.ai.bots.bot.gametree.mcts.strategies.backpropagation.*;
import org.cspoker.ai.bots.bot.gametree.mcts.strategies.selection.*;
@@ -40,6 +42,7 @@
import org.cspoker.ai.bots.listener.ReSitInBotListener;
import org.cspoker.ai.bots.listener.SpeedTestBotListener;
import org.cspoker.ai.experiments.util.CombinationGenerator;
+import org.cspoker.ai.opponentmodels.weka.WekaOptions;
import org.cspoker.ai.opponentmodels.weka.WekaRegressionModelFactory;
import org.cspoker.client.common.SmartClientContext;
import org.cspoker.client.common.SmartLobbyContext;
@@ -55,6 +58,7 @@
import org.cspoker.common.util.Log4JPropertiesLoader;
import org.cspoker.common.util.threading.GlobalThreadPool;
import org.cspoker.common.util.threading.SingleThreadRequestExecutor;
+import org.eclipse.swt.widgets.Display;
@NotThreadSafe
public class BotRunner implements LobbyListener {
@@ -63,13 +67,13 @@
private static final TableConfiguration config = new
TableConfiguration(100,
0, false, true, true,0);
- public static final int nbGamesPerConfrontation = 10;
+ public static final int nbGamesPerConfrontation = 2000;
public final int nbPlayersPerGame;
- public static final int reportInterval = 1;
+ public static final int reportInterval = 50;
public final String expName;
- public final int nbExperiments = 1;
+ public final int nbExperiments = 3;
public static int currentExperiment = 1;
static {
@@ -107,13 +111,13 @@
// if(false){
// throw new ClassNotFoundException();
// }
- Sampler s = new SmartSampler();
- boolean overwrite = false;
- return new BotRunner(cspokerServer, "test",
+// WekaOptions.setArffPersistency(false);
+ Sampler s = new StochasticUniversalSampler(5);
+ return new BotRunner(cspokerServer, "testLearning",
new BotFactory[] {
new CallBotFactory("CallBot"),
- new CardBotFactory("CardBot"),
- new HandBotFactory("HandBot"),
+// new CardBotFactory("CardBot"),
+// new HandBotFactory("HandBot"),
// new FixedSampleMCTSBotFactory("MCTSBot",
//
WekaRegressionModelFactory.createForZip(overwrite, "org/cspoker/ai/opponentmodels/weka/models/model1.zip"),
// new SamplingToFunctionSelector(50,new UCTSelector(40000)),
@@ -127,7 +131,7 @@
// ),s,
// 1000,1000,1000,1000),
new MCTSBotFactory("MCTSBot",
-
WekaRegressionModelFactory.createForZip(overwrite, "org/cspoker/ai/opponentmodels/weka/models/model1.zip"),
+
WekaRegressionModelFactory.createForZip("org/cspoker/ai/opponentmodels/weka/models/model1.zip"),
new SamplingToFunctionSelector(50,new UCTSelector(2000)),
new SamplingSelector(),
new MaxValueSelector(),
@@ -269,8 +273,8 @@
bot[0] = botFactories[botIndex[0]].createBot(botIDs[botIndex[0]],
tableId,
botLobbies[botIndex[0]], buyIn, executor,
-// new ReSitInBotListener(this), csvLogger, speedMonitor, gameLimiter);
- new ReSitInBotListener(this), csvLogger, gameLimiter);
+ new ReSitInBotListener(this), csvLogger, speedMonitor, gameLimiter);
+// new ReSitInBotListener(this), csvLogger, gameLimiter);
bot[0].start();
for (int i = 1; i < nbPlayersPerGame; i++) {
bot[i] = botFactories[botIndex[i]].createBot(botIDs[botIndex[i]],
=======================================
---
/trunk/ai/experiments/src/main/java/org/cspoker/ai/bots/RunHumanVsBot.java
Mon Mar 15 08:33:39 2010
+++
/trunk/ai/experiments/src/main/java/org/cspoker/ai/bots/RunHumanVsBot.java
Thu May 13 01:37:32 2010
@@ -141,7 +141,7 @@
try {
botFactory = new FixedSampleMCTSBotFactory(
"Plus Bot",
-
WekaRegressionModelFactory.createForZip(true, "org/cspoker/ai/opponentmodels/weka/models/model1.zip"),
+
WekaRegressionModelFactory.createForZip("org/cspoker/ai/opponentmodels/weka/models/model1.zip"),
new SamplingToFunctionSelector(50,new UCTSelector(40000)),
new SamplingToFunctionSelector(50,new UCTPlusPlusSelector()),
new MaxValueSelector(),
=======================================
---
/trunk/ai/experiments/src/main/java/org/cspoker/ai/experiments/RunExperimentB.java
Mon Mar 15 08:33:39 2010
+++
/trunk/ai/experiments/src/main/java/org/cspoker/ai/experiments/RunExperimentB.java
Thu May 13 01:37:32 2010
@@ -46,14 +46,13 @@
int treshold1 = Integer.parseInt(args[3]);
int treshold2 = Integer.parseInt(args[4]);
- boolean overwrite = Boolean.parseBoolean(args[5]);
new BotRunner(
new EmbeddedCSPokerServer(),
new BotFactory[] {
new MCTSBotFactory(
"Standard Bot",
-
WekaRegressionModelFactory.createForZip(overwrite,"org/cspoker/ai/opponentmodels/weka/models/model1.zip"),
+
WekaRegressionModelFactory.createForZip("org/cspoker/ai/opponentmodels/weka/models/model1.zip"),
new SamplingToFunctionSelector(treshold1,new UCTSelector(C)),
new SamplingSelector(),
new MaxValueSelector(),
@@ -64,7 +63,7 @@
),
new MCTSBotFactory(
"MaxDistribution Bot",
-
WekaRegressionModelFactory.createForZip(overwrite,"org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
+
WekaRegressionModelFactory.createForZip("org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
new SamplingToFunctionSelector(treshold1,new UCTSelector(C)),
new SamplingSelector(),
new MaxValueSelector(),
@@ -90,7 +89,6 @@
int treshold1 = Integer.parseInt(args[6]);
int treshold2 = Integer.parseInt(args[7]);
- boolean overwrite = Boolean.parseBoolean(args[8]);
new BotRunner(
@@ -98,7 +96,7 @@
new BotFactory[] {
new FixedSampleMCTSBotFactory(
"Standard Bot",
-
WekaRegressionModelFactory.createForZip(overwrite,"org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
+
WekaRegressionModelFactory.createForZip("org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
new SamplingToFunctionSelector(treshold1,new UCTSelector(C)),
new SamplingSelector(),
new MaxValueSelector(),
@@ -109,7 +107,7 @@
),
new FixedSampleMCTSBotFactory(
"MaxDistribution Bot",
-
WekaRegressionModelFactory.createForZip(overwrite,"org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
+
WekaRegressionModelFactory.createForZip("org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
new SamplingToFunctionSelector(treshold1,new UCTSelector(C)),
new SamplingSelector(),
new MaxValueSelector(),
=======================================
---
/trunk/ai/experiments/src/main/java/org/cspoker/ai/experiments/RunExperimentC.java
Mon Mar 15 08:33:39 2010
+++
/trunk/ai/experiments/src/main/java/org/cspoker/ai/experiments/RunExperimentC.java
Thu May 13 01:37:32 2010
@@ -49,14 +49,12 @@
int treshold1 = Integer.parseInt(args[4]);
int treshold2 = Integer.parseInt(args[5]);
- boolean overwrite = Boolean.parseBoolean(args[6]);
-
new BotRunner(
new EmbeddedCSPokerServer(),
new BotFactory[] {
new MCTSBotFactory(
"Standard Bot",
-
WekaRegressionModelFactory.createForZip(overwrite,"org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
+
WekaRegressionModelFactory.createForZip("org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
new SamplingToFunctionSelector(treshold1,new UCTSelector(C)),
new SamplingSelector(),
new MaxValueSelector(),
@@ -67,7 +65,7 @@
),
new MCTSBotFactory(
"MaxDistribution Bot",
-
WekaRegressionModelFactory.createForZip(overwrite,"org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
+
WekaRegressionModelFactory.createForZip("org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
new SamplingToFunctionSelector(treshold1,new UCTPlusSelector(C,
C2)),
new SamplingSelector(),
new MaxValueSelector(),
@@ -93,16 +91,13 @@
double C2 = Double.parseDouble(args[6]);
int treshold1 = Integer.parseInt(args[7]);
int treshold2 = Integer.parseInt(args[8]);
-
- boolean overwrite = Boolean.parseBoolean(args[9]);
-
new BotRunner(
new EmbeddedCSPokerServer(),
new BotFactory[] {
new FixedSampleMCTSBotFactory(
"Standard Bot",
-
WekaRegressionModelFactory.createForZip(overwrite,"org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
+
WekaRegressionModelFactory.createForZip("org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
new SamplingToFunctionSelector(treshold1,new UCTSelector(C)),
new SamplingSelector(),
new MaxValueSelector(),
@@ -113,7 +108,7 @@
),
new FixedSampleMCTSBotFactory(
"MaxDistribution Bot",
-
WekaRegressionModelFactory.createForZip(overwrite,"org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
+
WekaRegressionModelFactory.createForZip("org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
new SamplingToFunctionSelector(treshold1,new UCTPlusSelector(C,
C2)),
new SamplingSelector(),
new MaxValueSelector(),
=======================================
---
/trunk/ai/experiments/src/main/java/org/cspoker/ai/experiments/RunExperimentD.java
Mon Mar 15 08:33:39 2010
+++
/trunk/ai/experiments/src/main/java/org/cspoker/ai/experiments/RunExperimentD.java
Thu May 13 01:37:32 2010
@@ -48,14 +48,13 @@
int treshold1 = Integer.parseInt(args[4]);
int treshold2 = Integer.parseInt(args[5]);
- boolean overwrite = Boolean.parseBoolean(args[6]);
new BotRunner(
new EmbeddedCSPokerServer(),
new BotFactory[] {
new MCTSBotFactory(
"Standard Bot",
-
WekaRegressionModelFactory.createForZip(overwrite,"org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
+
WekaRegressionModelFactory.createForZip("org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
new SamplingToFunctionSelector(treshold1,new UCTSelector(C)),
new SamplingSelector(),
new MaxValueSelector(),
@@ -70,7 +69,7 @@
),
new MCTSBotFactory(
"MaxDistribution Bot",
-
WekaRegressionModelFactory.createForZip(overwrite,"org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
+
WekaRegressionModelFactory.createForZip("org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
new SamplingToFunctionSelector(treshold1,new UCTPlusSelector(C,
C2)),
new SamplingSelector(),
new MaxValueSelector(),
@@ -96,15 +95,13 @@
double C2 = Double.parseDouble(args[6]);
int treshold1 = Integer.parseInt(args[7]);
int treshold2 = Integer.parseInt(args[8]);
- boolean overwrite = Boolean.parseBoolean(args[9]);
-
new BotRunner(
new EmbeddedCSPokerServer(),
new BotFactory[] {
new FixedSampleMCTSBotFactory(
"Standard Bot",
-
WekaRegressionModelFactory.createForZip(overwrite,"org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
+
WekaRegressionModelFactory.createForZip("org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
new SamplingToFunctionSelector(treshold1,new UCTSelector(C)),
new SamplingSelector(),
new MaxValueSelector(),
@@ -119,7 +116,7 @@
),
new FixedSampleMCTSBotFactory(
"MaxDistribution Bot",
-
WekaRegressionModelFactory.createForZip(overwrite,"org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
+
WekaRegressionModelFactory.createForZip("org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
new SamplingToFunctionSelector(treshold1,new UCTPlusSelector(C,
C2)),
new SamplingSelector(),
new MaxValueSelector(),
=======================================
---
/trunk/ai/experiments/src/main/java/org/cspoker/ai/experiments/RunExperimentF.java
Mon Mar 15 08:33:39 2010
+++
/trunk/ai/experiments/src/main/java/org/cspoker/ai/experiments/RunExperimentF.java
Thu May 13 01:37:32 2010
@@ -47,7 +47,6 @@
int C = Integer.parseInt(args[2]);
int treshold1 = Integer.parseInt(args[3]);
int treshold2 = Integer.parseInt(args[4]);
- boolean overwrite = Boolean.parseBoolean(args[5]);
new BotRunner(
new EmbeddedCSPokerServer(),
@@ -56,7 +55,7 @@
new HandBotFactory("HandBot"),
new MCTSBotFactory(
"MaxDistribution Bot",
-
WekaRegressionModelFactory.createForZip(overwrite,"org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
+
WekaRegressionModelFactory.createForZip("org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
new SamplingToFunctionSelector(treshold1,new UCTSelector(C)),
new SamplingSelector(),
new MaxValueSelector(),
@@ -81,9 +80,6 @@
int C = Integer.parseInt(args[5]);
int treshold1 = Integer.parseInt(args[6]);
int treshold2 = Integer.parseInt(args[7]);
-
- boolean overwrite = Boolean.parseBoolean(args[8]);
-
new BotRunner(
new EmbeddedCSPokerServer(),
@@ -92,7 +88,7 @@
new HandBotFactory("HandBot"),
new FixedSampleMCTSBotFactory(
"MaxDistribution Bot",
-
WekaRegressionModelFactory.createForZip(overwrite,"org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
+
WekaRegressionModelFactory.createForZip("org/cspoker/client/bots/bot/search/opponentmodel/weka/models/model1.zip"),
new SamplingToFunctionSelector(treshold1,new UCTSelector(C)),
new SamplingSelector(),
new MaxValueSelector(),
=======================================
--- /trunk/ai/lore/src/main/java/org/cspoker/ai/lore/Lore.java Mon Mar 15
08:33:39 2010
+++ /trunk/ai/lore/src/main/java/org/cspoker/ai/lore/Lore.java Thu May 13
01:37:32 2010
@@ -24,8 +24,7 @@
import org.cspoker.ai.bots.bot.BotFactory;
import org.cspoker.ai.bots.bot.gametree.mcts.MCTSBotFactory;
import
org.cspoker.ai.bots.bot.gametree.mcts.listeners.MCTSListener.Factory;
-import org.cspoker.ai.bots.bot.gametree.mcts.nodes.MCTSBucketShowdownNode;
-import org.cspoker.ai.bots.bot.gametree.mcts.nodes.MCTSShowdownRollOutNode;
+import org.cspoker.ai.bots.bot.gametree.mcts.nodes.*;
import
org.cspoker.ai.bots.bot.gametree.mcts.strategies.backpropagation.SampleWeightedBackPropStrategy;
import
org.cspoker.ai.bots.bot.gametree.mcts.strategies.selection.MaxValueSelector;
import
org.cspoker.ai.bots.bot.gametree.mcts.strategies.selection.SamplingSelector;
@@ -74,7 +73,7 @@
// new CallBotFactory();
new MCTSBotFactory(
"CSPoker Bot",
-
WekaRegressionModelFactory.createForZip(true, "org/cspoker/ai/opponentmodels/weka/models/model1.zip"),
+
WekaRegressionModelFactory.createForZip("org/cspoker/ai/opponentmodels/weka/models/model1.zip"),
new SamplingToFunctionSelector(50,new UCTSelector(2000000)),
new SamplingSelector(),
new MaxValueSelector(),
=======================================
---
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/ARFFFile.java
Mon Mar 15 08:33:39 2010
+++
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/ARFFFile.java
Thu May 13 01:37:32 2010
@@ -4,204 +4,127 @@
import org.cspoker.ai.opponentmodels.weka.instances.InstancesBuilder;
+import weka.classifiers.Classifier;
+import weka.classifiers.trees.M5P;
import weka.core.Instance;
+import weka.core.Instances;
+import weka.core.SerializationHelper;
+import weka.core.converters.ConverterUtils.DataSource;
+import weka.filters.Filter;
+import weka.filters.unsupervised.attribute.Remove;
public class ARFFFile {
-
- private final String nl = InstancesBuilder.nl;
- private final String folder
= "org/cspoker/ai/opponentmodels/weka/models/";
+
+ private final String nl = InstancesBuilder.nl;
private final String path;
private final Object player;
-
- private final String preCheckBet = "PreCheckBet.arff";
- private final String postCheckBet = "PostCheckBet.arff";
- private final String preFoldCallRaise = "PreFoldCallRaise.arff";
- private final String postFoldCallRaise = "PostFoldCallRaise.arff";
- private final String showdown = "Showdown.arff";
-
- private Writer preCheckBetFile;
- private Writer postCheckBetFile;
- private Writer preFoldCallRaiseFile;
- private Writer postFoldCallRaiseFile;
- private Writer showdownFile;
-
- public ARFFFile(Object player, boolean overwrite) throws IOException {
- this.path = (getClass().getProtectionDomain().getCodeSource()
- .getLocation().getPath() + folder).replace("%20", " ");
+ private final String name;
+
+ private Writer file;
+ private double count;
+
+ private boolean modelReady;
+
+ public ARFFFile(String path, Object player, String name, String
attributes,
+ boolean overwrite) throws IOException {
+ this.path = path;
this.player = player;
-
- boolean preCheckBetExists = fileExists(preCheckBet, player);
- preCheckBetFile = new BufferedWriter(new FileWriter(path + player
- + "PreCheckBet.arff", !overwrite));
- boolean postCheckBetExists = fileExists(postCheckBet, player);
- postCheckBetFile = new BufferedWriter(new FileWriter(path + player
- + "PostCheckBet.arff", !overwrite));
- boolean preFoldCallRaiseExists = fileExists(preFoldCallRaise, player);
- preFoldCallRaiseFile = new BufferedWriter(new FileWriter(path + player
- + "PreFoldCallRaise.arff", !overwrite));
- boolean postFoldCallRaiseExists = fileExists(postFoldCallRaise, player);
- postFoldCallRaiseFile = new BufferedWriter(new FileWriter(path + player
- + "PostFoldCallRaise.arff", !overwrite));
- boolean showdownExists = fileExists(showdown, player);
- showdownFile = new BufferedWriter(new FileWriter(path + player
- + "Showdown.arff", !overwrite));
-
- if (overwrite || !preCheckBetExists) {
-
preCheckBetFile.write(ARFFPropositionalizer.getPreCheckBetInstance().toString());
- preCheckBetFile.flush();
- }
- if (overwrite || !postCheckBetExists) {
-
postCheckBetFile.write(ARFFPropositionalizer.getPostCheckBetInstance().toString());
- postCheckBetFile.flush();
- }
- if (overwrite || !preFoldCallRaiseExists) {
-
preFoldCallRaiseFile.write(ARFFPropositionalizer.getPreFoldCallRaiseInstance().toString());
- preFoldCallRaiseFile.flush();
- }
- if (overwrite || !postFoldCallRaiseExists) {
-
postFoldCallRaiseFile.write(ARFFPropositionalizer.getPostFoldCallRaiseInstance().toString());
- postFoldCallRaiseFile.flush();
- }
- if (overwrite || !showdownExists) {
-
showdownFile.write(ARFFPropositionalizer.getShowdownInstance().toString());
- showdownFile.flush();
- }
+
this.name = name;
+
+ boolean fileExists = fileExists();
+ file = new BufferedWriter(new FileWriter(path + player +
name, !overwrite));
+
+ if (overwrite || !fileExists) {
+ file.write(attributes);
+ file.flush();
+ }
+
+ count = countDataLines();
+ if (count >= WekaOptions.getModelCreationTreshold())
+ modelReady = true;
}
- private double countDataLines(String filename) throws IOException {
- InputStream is = new BufferedInputStream(new
FileInputStream(filename));
- byte[] c = new byte[1024];
- int count = 0;
- int readChars = 0;
- boolean startReading = false;
- while ((readChars = is.read(c)) != -1) {
- for (int i = 0; i < readChars; ++i) {
+ private double countDataLines() throws IOException {
+ InputStream is = new BufferedInputStream(new FileInputStream(path +
player + name));
+ byte[] c = new byte[1024];
+ int count = 0;
+ int readChars = 0;
+ boolean startReading = false;
+ while ((readChars = is.read(c)) != -1) {
+ for (int i = 0; i < readChars; ++i) {
if (c[i] == '\n' && startReading)
++count;
- else if (!startReading && i >= 4
- && c[i - 4] == '@' && c[i - 3] == 'd'
- && c[i - 2] == 'a' && c[i - 1] == 't'
- && c[i] == 'a')
+ else if (!startReading && i >= 4 && c[i - 4] == '@'
+ && c[i - 3] == 'd' && c[i - 2] == 'a'
+ && c[i - 1] == 't' && c[i] == 'a')
startReading = true;
- }
- }
+ }
+ }
+ is.close();
return count + (count > 0 ? -1 : 0);
}
- private boolean fileExists(String fileName, Object player) throws
FileNotFoundException {
- return new File(path + player + fileName).exists();
+ private boolean fileExists() throws FileNotFoundException {
+ return new File(path + player + name).exists();
}
public void close() throws IOException {
- preCheckBetFile.close();
- postCheckBetFile.close();
- preFoldCallRaiseFile.close();
- postFoldCallRaiseFile.close();
- showdownFile.close();
+ file.close();
}
- public void writePreCheckBet(Instance instance) {
+ public void write(Instance instance) {
try {
- preCheckBetFile.write(instance.toString()+nl);
- preCheckBetFile.flush();
+ file.write(instance.toString() + nl);
+ file.flush();
+ count++;
+ if (count >= WekaOptions.getModelCreationTreshold())
+ modelReady = true;
} catch (IOException e) {
e.printStackTrace();
throw new IllegalStateException(e);
- } catch(ArrayIndexOutOfBoundsException e){
+ } catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
throw new IllegalStateException(e);
}
}
-
- public double getPreCheckBetCount() {
- try {
- return countDataLines(path + player + preCheckBet);
- } catch (IOException e) {
- return 0;
- }
- }
-
- public void writePostCheckBet(Instance instance) {
- try {
- postCheckBetFile.write(instance.toString()+nl);
- postCheckBetFile.flush();
- } catch (IOException e) {
- e.printStackTrace();
- throw new IllegalStateException(e);
- } catch(ArrayIndexOutOfBoundsException e){
- e.printStackTrace();
- throw new IllegalStateException(e);
- }
+
+ public boolean isModelReady() {
+ return modelReady;
}
- public double getPostCheckBetCount() {
- try {
- return countDataLines(path + player + postCheckBet);
- } catch (IOException e) {
- return 0;
- }
- }
-
- public void writePreFoldCallRaise(Instance instance) {
- try {
- preFoldCallRaiseFile.write(instance.toString()+nl);
- preFoldCallRaiseFile.flush();
- } catch (IOException e) {
- e.printStackTrace();
- throw new IllegalStateException(e);
- } catch(ArrayIndexOutOfBoundsException e){
- e.printStackTrace();
- throw new IllegalStateException(e);
- }
- }
-
- public double getPreFoldCallRaiseCount() {
- try {
- return countDataLines(path + player + preFoldCallRaise);
- } catch (IOException e) {
- return 0;
- }
- }
-
- public void writePostFoldCallRaise(Instance instance) {
- try {
- postFoldCallRaiseFile.write(instance.toString()+nl);
- postFoldCallRaiseFile.flush();
- } catch (IOException e) {
- e.printStackTrace();
- throw new IllegalStateException(e);
- } catch(ArrayIndexOutOfBoundsException e){
- e.printStackTrace();
- throw new IllegalStateException(e);
- }
- }
-
- public double getPostFoldCallRaiseCount() {
- try {
- return countDataLines(path + player + postFoldCallRaise);
- } catch (IOException e) {
- return 0;
- }
- }
-
- public void writeShowdown(Instance instance) {
- try {
- showdownFile.write(instance.toString()+nl);
- showdownFile.flush();
- } catch (IOException e) {
- e.printStackTrace();
- throw new IllegalStateException(e);
- } catch(ArrayIndexOutOfBoundsException e){
- e.printStackTrace();
- throw new IllegalStateException(e);
- }
- }
-
- public double getShowdownCount() {
- try {
- return countDataLines(path + player + showdown);
- } catch (IOException e) {
- return 0;
- }
+ public Classifier createModel(String fileName, String attribute, String[]
rmAttributes) throws Exception {
+ if (!modelReady) throw new IllegalStateException("Model didn't reach
threshold for creation!");
+
+ DataSource source = new DataSource(path + player + name);
+ Instances data = source.getDataSet();
+ if (rmAttributes.length > 0) {
+ String[] optionsDel = new String[2];
+ optionsDel[0] = "-R";
+ optionsDel[1] = "";
+ for (int i = 0; i < rmAttributes.length; i++)
+ optionsDel[1] += (1+data.attribute(rmAttributes[i]).index()) + ",";
+ Remove remove = new Remove();
+ remove.setOptions(optionsDel);
+ remove.setInputFormat(data);
+ data = Filter.useFilter(data, remove);
+ }
+ // setting class attribute if the data format does not provide this
information
+ // E.g., the XRFF format saves the class attribute information as well
+ if (data.classIndex() == -1)
+ data.setClass(data.attribute(attribute));
+
+ // train M5P
+ M5P cl = new M5P();
+ cl.setBuildRegressionTree(true);
+ cl.setUnpruned(false);
+ cl.setUseUnsmoothed(false);
+ // further options...
+ cl.buildClassifier(data);
+
+ // save model + header
+ if (WekaOptions.isModelPersistency())
+ SerializationHelper.write(path + "../" + player + fileName
+ ".model", cl);
+
+ return cl;
}
}
=======================================
---
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/ARFFPropositionalizer.java
Mon Mar 15 08:33:39 2010
+++
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/ARFFPropositionalizer.java
Thu May 13 01:37:32 2010
@@ -17,9 +17,9 @@
// private final static Logger logger =
Logger.getLogger(ARFFPropositionalizer.class);
private static final String nl = InstancesBuilder.nl;
+ private static HashMap<Object, ARFFPlayer> arffFiles = new
HashMap<Object, ARFFPlayer>();
private final HashMap<String, Card> cards = new HashMap<String, Card>();
- private HashMap<Object, ARFFFile> arffFiles = new HashMap<Object,
ARFFFile>();
private final PreCheckBetInstances preCheckBetInstance;
private final PostCheckBetInstances postCheckBetInstance;
@@ -28,10 +28,10 @@
private final ShowdownInstances showdownInstance;
private boolean newDeal = false;
- private boolean overwrite;
-
- public ARFFPropositionalizer(boolean overwrite) throws IOException {
- this.overwrite = overwrite;
+ private final WekaRegressionModel baseModel;
+
+ public ARFFPropositionalizer(WekaRegressionModel baseModel) throws
IOException {
+ this.baseModel = baseModel;
this.preCheckBetInstance = getPreCheckBetInstance();
this.postCheckBetInstance = getPostCheckBetInstance();
this.preFoldCallRaiseInstance = getPreFoldCallRaiseInstance();
@@ -42,14 +42,7 @@
cards.put(c.getShortDescription(), c);
}
}
-
- @Override
- public ARFFPropositionalizer clone() {
- ARFFPropositionalizer clone = (ARFFPropositionalizer)super.clone();
- clone.arffFiles = new HashMap<Object, ARFFFile>(arffFiles);
- return clone;
- }
-
+
public static PreCheckBetInstances getPreCheckBetInstance() {
return new PreCheckBetInstances("PreCheckBet",
"@attribute betProb real" + nl
@@ -88,12 +81,12 @@
+ "@attribute avgPartition {0,1,2,3,4,5}" + nl);
}
- private ARFFFile getARFF(Object actorId) {
+ private ARFFPlayer getARFF(Object actorId) {
if (arffFiles.containsKey(actorId))
return arffFiles.get(actorId);
else {
try {
- ARFFFile f = new ARFFFile(actorId, overwrite);
+ ARFFPlayer f = new ARFFPlayer(actorId, baseModel);
arffFiles.put(actorId, f);
return f;
} catch (IOException e) {
=======================================
---
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/ActionTrackingVisitor.java
Mon Mar 15 08:33:39 2010
+++
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/ActionTrackingVisitor.java
Thu May 13 01:37:32 2010
@@ -31,9 +31,9 @@
private final static Logger logger =
Logger.getLogger(ARFFPropositionalizer.class);
- public ActionTrackingVisitor(boolean overwrite) {
+ public ActionTrackingVisitor(WekaRegressionModel baseModel) {
try {
- this.propz = new ARFFPropositionalizer(overwrite);
+ this.propz = new ARFFPropositionalizer(baseModel);
} catch (IOException e) {
e.printStackTrace();
}
=======================================
---
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/WekaModel.java
Mon Mar 15 08:33:39 2010
+++
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/WekaModel.java
Thu May 13 01:37:32 2010
@@ -35,7 +35,7 @@
protected static final Logger logger =
Logger.getLogger(WekaRegressionModel.class);
- protected final PlayerTrackingVisitor visitor;
+ protected PlayerTrackingVisitor visitor;
private final Deque<PlayerTrackingVisitor> visitors = new
ArrayDeque<PlayerTrackingVisitor>();
private final PostCheckBetInstances postCheckBetInstance;
@@ -44,8 +44,8 @@
private final PostFoldCallRaiseInstances postFoldCallRaiseInstance;
private final ShowdownInstances showdownInstance;
- public WekaModel(boolean overwrite) {
- this.visitor = new ActionTrackingVisitor(overwrite);
+ public WekaModel() {
+ this.visitor = new PlayerTrackingVisitor();
this.preCheckBetInstance = new
PreCheckBetInstances("PreCheckBet", "@attribute prob
real"+InstancesBuilder.nl);
this.postCheckBetInstance = new
PostCheckBetInstances("PostCheckBet", "@attribute prob
real"+InstancesBuilder.nl);
@@ -54,6 +54,11 @@
this.showdownInstance = new ShowdownInstances("Showdown", "@attribute
prob real"+InstancesBuilder.nl);
}
+// public long getVisitorSize() {
+// System.out.print("<" + visitors.size() + ">");
+// return visitors.size();
+// }
+
@Override
public void assumePermanently(GameState gameState) {
visitor.readHistory(gameState);
@@ -69,7 +74,8 @@
@Override
public void forgetLastAssumption() {
- visitors.pop();
+ if(!visitors.isEmpty())
+ visitors.pop();
}
protected PlayerTrackingVisitor getTopVisitor() {
=======================================
---
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/WekaRegressionModel.java
Mon Mar 15 08:33:39 2010
+++
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/WekaRegressionModel.java
Thu May 13 01:37:32 2010
@@ -15,7 +15,6 @@
*/
package org.cspoker.ai.opponentmodels.weka;
-
import org.cspoker.client.common.gamestate.GameState;
import org.cspoker.common.elements.player.PlayerId;
import org.cspoker.common.elements.table.Round;
@@ -27,27 +26,26 @@
public class WekaRegressionModel extends WekaModel {
- protected final Classifier preBetModel;
- protected final Classifier preFoldModel;
- protected final Classifier preCallModel;
- protected final Classifier preRaiseModel;
- protected final Classifier postBetModel;
- protected final Classifier postFoldModel;
- protected final Classifier postCallModel;
- protected final Classifier postRaiseModel;
- protected final Classifier showdown0Model;
- protected final Classifier showdown1Model;
- protected final Classifier showdown2Model;
- protected final Classifier showdown3Model;
- protected final Classifier showdown4Model;
- protected final Classifier showdown5Model;
-
- public WekaRegressionModel(boolean overwrite,
+ protected Classifier preBetModel;
+ protected Classifier preFoldModel;
+ protected Classifier preCallModel;
+ protected Classifier preRaiseModel;
+ protected Classifier postBetModel;
+ protected Classifier postFoldModel;
+ protected Classifier postCallModel;
+ protected Classifier postRaiseModel;
+ protected Classifier showdown0Model;
+ protected Classifier showdown1Model;
+ protected Classifier showdown2Model;
+ protected Classifier showdown3Model;
+ protected Classifier showdown4Model;
+ protected Classifier showdown5Model;
+
+ public WekaRegressionModel(
Classifier preBetModel, Classifier preFoldModel, Classifier
preCallModel, Classifier preRaiseModel,
Classifier postBetModel, Classifier postFoldModel, Classifier
postCallModel, Classifier postRaiseModel,
Classifier showdown0Model, Classifier showdown1Model, Classifier
showdown2Model, Classifier showdown3Model,
Classifier showdown4Model, Classifier showdown5Model) {
- super(overwrite);
this.preBetModel = preBetModel;
this.preFoldModel = preFoldModel;
this.preCallModel = preCallModel;
@@ -62,6 +60,45 @@
this.showdown3Model = showdown3Model;
this.showdown4Model = showdown4Model;
this.showdown5Model = showdown5Model;
+ if (WekaOptions.isArffPersistency())
+ this.visitor = new ActionTrackingVisitor(this);
+ }
+
+ public WekaRegressionModel(WekaRegressionModel model) {
+ this.preBetModel = model.preBetModel;
+ this.preFoldModel = model.preFoldModel;
+ this.preCallModel = model.preCallModel;
+ this.preRaiseModel = model.preRaiseModel;
+ this.postBetModel = model.postBetModel;
+ this.postFoldModel = model.postFoldModel;
+ this.postCallModel = model.postCallModel;
+ this.postRaiseModel = model.postRaiseModel;
+ this.showdown0Model = model.showdown0Model;
+ this.showdown1Model = model.showdown1Model;
+ this.showdown2Model = model.showdown2Model;
+ this.showdown3Model = model.showdown3Model;
+ this.showdown4Model = model.showdown4Model;
+ this.showdown5Model = model.showdown5Model;
+ }
+
+ @Override
+ public String toString() {
+ String str = "";
+ str += "preBetModel " + preBetModel.toString().length(); // (preBetModel
== null?"NULL":"OK");
+ str += "\npreFoldModel " + preFoldModel.toString().length(); //
(preFoldModel == null?"NULL":"OK");
+ str += "\npreCallModel " + preCallModel.toString().length(); //
(preCallModel == null?"NULL":"OK");
+ str += "\npreRaiseModel " + preRaiseModel.toString().length(); //
(preRaiseModel == null?"NULL":"OK");
+ str += "\npostBetModel " + postBetModel.toString().length(); //
(postBetModel == null?"NULL":"OK");
+ str += "\npostFoldModel " + postFoldModel.toString().length(); //
(postFoldModel == null?"NULL":"OK");
+ str += "\npostCallModel " + postCallModel.toString().length(); //
(postCallModel == null?"NULL":"OK");
+ str += "\npostRaiseModel " + postRaiseModel.toString().length(); //
(postRaiseModel == null?"NULL":"OK");
+ str += "\nshowdown0Model " + showdown0Model.toString().length(); //
(showdown0Model == null?"NULL":"OK");
+ str += "\nshowdown1Model " + showdown1Model.toString().length(); //
(showdown1Model == null?"NULL":"OK");
+ str += "\nshowdown2Model " + showdown2Model.toString().length(); //
(showdown2Model == null?"NULL":"OK");
+ str += "\nshowdown3Model " + showdown3Model.toString().length(); //
(showdown3Model == null?"NULL":"OK");
+ str += "\nshowdown4Model " + showdown4Model.toString().length(); //
(showdown4Model == null?"NULL":"OK");
+ str += "\nshowdown5Model " + showdown5Model.toString().length(); //
(showdown5Model == null?"NULL":"OK");
+ return str;
}
@Override
@@ -76,8 +113,10 @@
try {
double prediction;
if(Round.PREFLOP.equals(gameState.getRound())){
+ if (preBetModel == null) System.out.println(this);
prediction = preBetModel.classifyInstance(instance);
}else{
+ if (postBetModel == null) System.out.println(this);
prediction = postBetModel.classifyInstance(instance);
}
double prob = Math.min(1,Math.max(0, prediction));
@@ -91,7 +130,7 @@
}
return result;
} catch (Exception e) {
- throw new IllegalStateException(instance.toString(), e);
+ throw new IllegalStateException(e.toString() + "\n" + actor + " " +
gameState.getRound() + ": " + instance.toString(), e);
}
}
@@ -108,24 +147,30 @@
try {
double probFold;
if(preshowdown){
+ if (preFoldModel == null) System.out.println(this);
probFold = preFoldModel.classifyInstance(instance);
}else{
+ if (postFoldModel == null) System.out.println(this);
probFold = postFoldModel.classifyInstance(instance);
}
probFold = Math.min(1,Math.max(0, probFold));
double probCall;
if(preshowdown){
+ if (preCallModel == null) System.out.println(this);
probCall = preCallModel.classifyInstance(instance);
}else{
+ if (postCallModel == null) System.out.println(this);
probCall = postCallModel.classifyInstance(instance);
}
probCall = Math.min(1,Math.max(0, probCall));
double probRaise;
if(preshowdown){
+ if (preRaiseModel == null) System.out.println(this);
probRaise = preRaiseModel.classifyInstance(instance);
}else{
+ if (postRaiseModel == null) System.out.println(this);
probRaise = postRaiseModel.classifyInstance(instance);
}
probRaise = Math.min(1,Math.max(0, probRaise));
@@ -140,7 +185,7 @@
}
return result;
} catch (Exception e) {
- throw new IllegalStateException(gameState.getRound() + " " +
instance.toString(), e);
+ throw new IllegalStateException(e.toString() + "\n" + actor + " " +
gameState.getRound() + ": " + instance.toString(), e);
}
}
@@ -164,4 +209,115 @@
}
}
-}
+ public Classifier getPreBetModel() {
+ return preBetModel;
+ }
+
+ public void setPreBetModel(Classifier preBetModel) {
+ this.preBetModel = preBetModel;
+ }
+
+ public Classifier getPreFoldModel() {
+ return preFoldModel;
+ }
+
+ public void setPreFoldModel(Classifier preFoldModel) {
+ this.preFoldModel = preFoldModel;
+ }
+
+ public Classifier getPreCallModel() {
+ return preCallModel;
+ }
+
+ public void setPreCallModel(Classifier preCallModel) {
+ this.preCallModel = preCallModel;
+ }
+
+ public Classifier getPreRaiseModel() {
+ return preRaiseModel;
+ }
+
+ public void setPreRaiseModel(Classifier preRaiseModel) {
+ this.preRaiseModel = preRaiseModel;
+ }
+
+ public Classifier getPostBetModel() {
+ return postBetModel;
+ }
+
+ public void setPostBetModel(Classifier postBetModel) {
+ this.postBetModel = postBetModel;
+ }
+
+ public Classifier getPostFoldModel() {
+ return postFoldModel;
+ }
+
+ public void setPostFoldModel(Classifier postFoldModel) {
+ this.postFoldModel = postFoldModel;
+ }
+
+ public Classifier getPostCallModel() {
+ return postCallModel;
+ }
+
+ public void setPostCallModel(Classifier postCallModel) {
+ this.postCallModel = postCallModel;
+ }
+
+ public Classifier getPostRaiseModel() {
+ return postRaiseModel;
+ }
+
+ public void setPostRaiseModel(Classifier postRaiseModel) {
+ this.postRaiseModel = postRaiseModel;
+ }
+
+ public Classifier getShowdown0Model() {
+ return showdown0Model;
+ }
+
+ public void setShowdown0Model(Classifier showdown0Model) {
+ this.showdown0Model = showdown0Model;
+ }
+
+ public Classifier getShowdown1Model() {
+ return showdown1Model;
+ }
+
+ public void setShowdown1Model(Classifier showdown1Model) {
+ this.showdown1Model = showdown1Model;
+ }
+
+ public Classifier getShowdown2Model() {
+ return showdown2Model;
+ }
+
+ public void setShowdown2Model(Classifier showdown2Model) {
+ this.showdown2Model = showdown2Model;
+ }
+
+ public Classifier getShowdown3Model() {
+ return showdown3Model;
+ }
+
+ public void setShowdown3Model(Classifier showdown3Model) {
+ this.showdown3Model = showdown3Model;
+ }
+
+ public Classifier getShowdown4Model() {
+ return showdown4Model;
+ }
+
+ public void setShowdown4Model(Classifier showdown4Model) {
+ this.showdown4Model = showdown4Model;
+ }
+
+ public Classifier getShowdown5Model() {
+ return showdown5Model;
+ }
+
+ public void setShowdown5Model(Classifier showdown5Model) {
+ this.showdown5Model = showdown5Model;
+ }
+}
=======================================
---
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/WekaRegressionModelFactory.java
Mon Mar 15 08:33:39 2010
+++
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/WekaRegressionModelFactory.java
Thu May 13 01:37:32 2010
@@ -33,10 +33,8 @@
@ThreadSafe
public class WekaRegressionModelFactory implements OpponentModel.Factory {
-
- private boolean overwrite;
-
- public static WekaRegressionModelFactory createForZip(boolean overwrite,
String zippedModel) throws IOException, ClassNotFoundException {
+
+ public static WekaRegressionModelFactory createForZip(String zippedModel)
throws IOException, ClassNotFoundException {
ZipInputStream zis = null;
ClassLoader classLoader =
WekaRegressionModelFactory.class.getClassLoader();
@@ -56,14 +54,14 @@
zis.close();
fis.close();
- return new WekaRegressionModelFactory(overwrite,
classifiers.get("preBet.model"), classifiers.get("preFold.model"),
classifiers.get("preCall.model"), classifiers.get("preRaise.model"),
classifiers.get("postBet.model"), classifiers.get("postFold.model"),
classifiers.get("postCall.model"), classifiers.get("postRaise.model"),
+ return new WekaRegressionModelFactory(classifiers.get("preBet.model"),
classifiers.get("preFold.model"), classifiers.get("preCall.model"),
classifiers.get("preRaise.model"), classifiers.get("postBet.model"),
classifiers.get("postFold.model"), classifiers.get("postCall.model"),
classifiers.get("postRaise.model"),
classifiers.get("showdown0.model"),
classifiers.get("showdown1.model"), classifiers.get("showdown2.model"),
classifiers.get("showdown3.model"), classifiers.get("showdown4.model"),
classifiers.get("showdown5.model"));
}
private final static Logger logger = Logger
.getLogger(WekaRegressionModelFactory.class);
- public static WekaRegressionModelFactory createForDir(boolean overwrite,
String models) throws IOException, ClassNotFoundException {
+ public static WekaRegressionModelFactory createForDir(String models)
throws IOException, ClassNotFoundException {
Classifier preBetModel, preFoldModel, preCallModel, preRaiseModel,
postBetModel, postFoldModel, postCallModel, postRaiseModel,
showdown0Model, showdown1Model, showdown2Model, showdown3Model,
showdown4Model, showdown5Model;
ClassLoader classLoader =
WekaRegressionModelFactory.class.getClassLoader();
@@ -109,16 +107,15 @@
in = new
ObjectInputStream(classLoader.getResourceAsStream(models+"showdown5.model"));
showdown5Model = (Classifier)in.readObject();
in.close();
- return new WekaRegressionModelFactory(overwrite, preBetModel,
preFoldModel, preCallModel, preRaiseModel, postBetModel, postFoldModel,
postCallModel, postRaiseModel,
+ return new WekaRegressionModelFactory(preBetModel, preFoldModel,
preCallModel, preRaiseModel, postBetModel, postFoldModel, postCallModel,
postRaiseModel,
showdown0Model, showdown1Model, showdown2Model, showdown3Model,
showdown4Model, showdown5Model);
}
- public WekaRegressionModelFactory(boolean overwrite,
+ public WekaRegressionModelFactory(
Classifier preBetModel, Classifier preFoldModel, Classifier
preCallModel, Classifier preRaiseModel,
Classifier postBetModel, Classifier postFoldModel, Classifier
postCallModel, Classifier postRaiseModel,
Classifier showdown0Model, Classifier showdown1Model, Classifier
showdown2Model, Classifier showdown3Model,
Classifier showdown4Model, Classifier showdown5Model) {
- this.overwrite = overwrite;
this.preBetModel = preBetModel;
this.preFoldModel = preFoldModel;
this.preCallModel = preCallModel;
@@ -141,7 +138,7 @@
@Override
public OpponentModel create() {
- return new WekaRegressionModel(overwrite, preBetModel, preFoldModel,
preCallModel, preRaiseModel, postBetModel, postFoldModel, postCallModel,
postRaiseModel,
+ return new WekaRegressionModel(preBetModel, preFoldModel, preCallModel,
preRaiseModel, postBetModel, postFoldModel, postCallModel, postRaiseModel,
showdown0Model, showdown1Model, showdown2Model, showdown3Model,
showdown4Model, showdown5Model);
}
=======================================
---
/trunk/common/common/src/main/java/org/cspoker/common/elements/hand/HandRanks.java
Sat Aug 22 02:19:53 2009
+++
/trunk/common/common/src/main/java/org/cspoker/common/elements/hand/HandRanks.java
Thu May 13 01:37:32 2010
@@ -17,9 +17,10 @@
package org.cspoker.common.elements.hand;
import java.io.BufferedReader;
+import java.io.DataInputStream;
+import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
-import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
@@ -74,12 +75,11 @@
}
private void loadHandRanks() {
- final InputStream in = this
- .getClass()
- .getClassLoader()
- .getResourceAsStream(
- "org/cspoker/common/elements/hand/handRanks.txt");
try {
+ FileInputStream fstream = new
FileInputStream(getClass().getProtectionDomain().
+ getCodeSource().getLocation().getPath().replace("%20"," ") +
+
"../../src/main/resources/org/cspoker/common/elements/hand/handRanks.txt");
+ DataInputStream in = new DataInputStream(fstream);
final BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(in));
--
You received this message because you are subscribed to the Google Groups "cspoker-commits" group.
To post to this group, send email to
cspoker...@googlegroups.com.
To unsubscribe from this group, send email to
cspoker-commi...@googlegroups.com.
For more options, visit this group at
http://groups.google.com/group/cspoker-commits?hl=en.