Modified:
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/AbstractBot.java
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/Bot.java
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/mcts/MCTSBot.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/bots/listener/CSVLogListener.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/WekaLearningModel.java
=======================================
--- /trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/AbstractBot.java
Wed Sep 16 07:58:09 2009
+++ /trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/AbstractBot.java
Mon Aug 16 10:38:42 2010
@@ -80,6 +80,10 @@
this.buyIn = buyIn;
this.executor = executor;
}
+
+ public PlayerId getId() {
+ return botId;
+ }
public void start() {
executor.execute(new Runnable() {
=======================================
--- /trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/Bot.java Mon Sep
7 11:24:40 2009
+++ /trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/Bot.java Mon Aug
16 10:38:42 2010
@@ -21,8 +21,11 @@
import
org.cspoker.common.api.lobby.holdemtable.holdemplayer.listener.HoldemPlayerListener;
import
org.cspoker.common.api.lobby.holdemtable.listener.HoldemTableListener;
import org.cspoker.common.api.shared.exception.IllegalActionException;
+import org.cspoker.common.elements.player.PlayerId;
public interface Bot extends HoldemTableListener, HoldemPlayerListener{
+
+ PlayerId getId();
void doNextAction() throws RemoteException, IllegalActionException;
=======================================
---
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/mcts/MCTSBot.java
Fri Aug 6 01:01:02 2010
+++
/trunk/ai/bots/src/main/java/org/cspoker/ai/bots/bot/gametree/mcts/MCTSBot.java
Mon Aug 16 10:38:42 2010
@@ -61,6 +61,10 @@
this.MCTSlistenerFactories = MCTSlisteners;
this.decisionTime = decisionTime;
}
+
+ public Config getConfig() {
+ return config;
+ }
@Override
public void doNextAction() throws RemoteException, IllegalActionException
{
=======================================
--- /trunk/ai/experiments/src/main/java/org/cspoker/ai/bots/BotRunner.java
Wed Aug 11 08:56:53 2010
+++ /trunk/ai/experiments/src/main/java/org/cspoker/ai/bots/BotRunner.java
Mon Aug 16 10:38:42 2010
@@ -69,7 +69,7 @@
0, false, true, true,0);
public static final int nbGamesPerConfrontation = 2000;
- public static final int reportInterval = 2000;
+ public static final int reportInterval = 1;
public final int nbExperiments = 1;
public static int currentExperiment = 1;
@@ -107,7 +107,7 @@
public static void create(RemoteCSPokerServer cspokerServer) {
kullbackLeibler = new KullbackLeiblerListener(reportInterval);
// new BotRunner(cspokerServer, "bucketSampler0.01VsRulebots");
- new BotRunner(cspokerServer, "test", getBots());
+ new BotRunner(cspokerServer, "CardBotAccuracy2", getBots());
}
public static BotFactory[] getBots() {
@@ -123,8 +123,8 @@
configNoPersist.setUseOnlineLearning(false);
WekaOptions configPersist = new WekaOptions();
- configPersist.setContinuousLearning(true);
- configPersist.setModelCreationTreshold(1500);
+ configPersist.setContinuousLearning(false);
+ configPersist.setModelCreationTreshold(2000);
configPersist.setContinueAfterCreation(false);
Sampler s = new BucketSampler(0.01);
@@ -134,8 +134,8 @@
return new BotFactory[] {
new CallBotFactory("CallBot"), // 62% precision, 71% accuracy
-// new CardBotFactory("CardBot"), // 60% precision, 71% accuracy
-// new HandBotFactory("HandBot"), // 41% accuracy
+ new CardBotFactory("CardBot"), // 60% precision, 71% accuracy
+ new HandBotFactory("HandBot"), // 41% accuracy
// new FixedSampleMCTSBotFactory("MCTSBot",
//
WekaRegressionModelFactory.createForZip("org/cspoker/ai/opponentmodels/weka/models/model1.zip",
// configNoPersist),
@@ -169,7 +169,7 @@
new MCTSShowdownRollOutNode.Factory(),
new SampleWeightedBackPropStrategy.Factory(),
s,
- 250
+ 500
),
// new SearchBotFactory( // 42,5% accuracy
//
WekaRegressionModelFactory.createForZip("org/cspoker/ai/opponentmodels/weka/models/model1.zip",
configNoPersist),
=======================================
---
/trunk/ai/experiments/src/main/java/org/cspoker/ai/bots/RunHumanVsBot.java
Fri Aug 6 01:01:02 2010
+++
/trunk/ai/experiments/src/main/java/org/cspoker/ai/bots/RunHumanVsBot.java
Mon Aug 16 10:38:42 2010
@@ -68,9 +68,19 @@
private final static Logger logger =
Logger.getLogger(RunHumanVsBot.class);
- public static void main(String[] args) throws LoginException,
- RemoteException, IllegalActionException {
- new RunHumanVsBot().testPlay();
+ public static void main(String[] args) {
+ try {
+ new RunHumanVsBot().testPlay();
+ } catch (LoginException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (RemoteException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IllegalActionException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
}
private ClientCore client;
=======================================
---
/trunk/ai/experiments/src/main/java/org/cspoker/ai/bots/listener/CSVLogListener.java
Mon Jun 14 18:22:02 2010
+++
/trunk/ai/experiments/src/main/java/org/cspoker/ai/bots/listener/CSVLogListener.java
Mon Aug 16 10:38:42 2010
@@ -17,10 +17,18 @@
import java.io.FileWriter;
import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
import org.apache.log4j.Logger;
import org.cspoker.ai.bots.BotRunner;
+import org.cspoker.ai.bots.bot.gametree.mcts.MCTSBot;
+import org.cspoker.ai.bots.bot.gametree.mcts.nodes.Config;
import org.cspoker.ai.bots.util.RunningStats;
+import org.cspoker.ai.opponentmodels.weka.ARFFPlayer;
+import org.cspoker.ai.opponentmodels.weka.WekaLearningModel;
+import org.cspoker.ai.opponentmodels.weka.WekaRegressionModel;
+import org.cspoker.common.elements.player.PlayerId;
public class CSVLogListener extends DealCountingListener {
@@ -59,27 +67,31 @@
if (deals == 1)
overallStartTime = startTime;
if (startTime > 0) {
- logger.info("deal #" + deals + " at " + reportInterval * 1000.0
- / (nowTime - startTime) + " games/s");
+// logger.info("deal #" + deals + " at " + reportInterval * 1000.0
+// / (nowTime - startTime) + " games/s");
try {
file.write(deals+"");
} catch (IOException e) {
throw new IllegalStateException(e);
}
for (int i = 0; i < runner.nbPlayersPerGame; i++) {
- RunningStats profit = runner.getBot(i).getProfit();
- int smallBet = runner.getConfig().getSmallBet();
- double mean = profit.getMean() / smallBet;
- double stdDevMean = profit.getEVStdDev()/ smallBet;
try {
- file.write(","+mean+","+stdDevMean);
+ if (modelCreated(runner.getBot(i).getId()))
+ file.write("\tMODELCREATED");
+ else
+ file.write("\t");
+ RunningStats profit = runner.getBot(i).getProfit();
+ int smallBet = runner.getConfig().getSmallBet();
+ double mean = profit.getMean() / smallBet;
+ double stdDevMean = profit.getEVStdDev()/ smallBet;
+ file.write("\t"+mean+"\t"+stdDevMean);
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
try {
- file.write("," + deals * 1000.0/ (nowTime - overallStartTime));
+ file.write("\t" + deals * 1000.0/ (nowTime - overallStartTime));
file.write("\n");
file.flush();
} catch (IOException e) {
@@ -90,5 +102,38 @@
}
super.onNewDeal();
}
+
+ private static MCTSBot bot = null;
+
+ private MCTSBot getLearningMCTSBot() {
+ if (bot != null) return bot;
+
+ for (int i = 0; i < runner.nbPlayersPerGame; i++) {
+ try {
+ bot = (MCTSBot) runner.getBot(i);
+ Config config = bot.getConfig();
+ WekaLearningModel model = (WekaLearningModel) config.getModel();
+ if (model.getConfig().useOnlineLearning())
+ return bot;
+ } catch (Exception e) {
+ bot = null;
+ }
+ }
+ return null;
+ }
+
+ private boolean modelCreated(PlayerId actor) {
+ try {
+ MCTSBot bot = getLearningMCTSBot();
+ if (bot.getId().equals(actor)) return false;
+ Config config = bot.getConfig();
+ WekaLearningModel model = (WekaLearningModel) config.getModel();
+ ARFFPlayer player = model.getPlayer(actor);
+ return player.learningAllowed();
+ } catch (Exception e) {
+ System.err.println(e);
+ return false;
+ }
+ }
}
=======================================
---
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/ARFFFile.java
Wed Aug 11 08:56:53 2010
+++
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/ARFFFile.java
Mon Aug 16 10:38:42 2010
@@ -99,6 +99,7 @@
public Classifier createModel(String fileName, String attribute, String[]
rmAttributes) throws Exception {
// System.out.println("Creating model for " + player + name);
DataSource source = new DataSource(path + player + name);
+// System.out.println(source + " > " + path + player + name);
Instances data = source.getDataSet();
if (rmAttributes.length > 0) {
String[] optionsDel = new String[2];
=======================================
---
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/ARFFPropositionalizer.java
Mon Jun 14 18:22:02 2010
+++
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/ARFFPropositionalizer.java
Mon Aug 16 10:38:42 2010
@@ -81,7 +81,7 @@
+ "@attribute avgPartition {0,1,2,3,4,5}" + nl);
}
- private ARFFPlayer getARFF(Object actorId) {
+ public ARFFPlayer getARFF(Object actorId) {
if (arffFiles.containsKey(actorId))
return arffFiles.get(actorId);
else {
=======================================
---
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/ActionTrackingVisitor.java
Wed Aug 11 08:56:53 2010
+++
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/ActionTrackingVisitor.java
Mon Aug 16 10:38:42 2010
@@ -34,15 +34,20 @@
private final static Logger logger =
Logger.getLogger(ARFFPropositionalizer.class);
- double truePositive = 0.0;
- double trueNegative = 0.0;
- double falsePositive = 0.0;
- double falseNegative = 0.0;
+ private class AccuracyData {
+ double truePositive = 0.0;
+ double trueNegative = 0.0;
+ double falsePositive = 0.0;
+ double falseNegative = 0.0;
+ }
+
+ private HashMap<PlayerId, AccuracyData> accuracyData;
public ActionTrackingVisitor(OpponentModel opponentModel, PlayerId bot) {
super(opponentModel);
try {
this.propz = new ARFFPropositionalizer(bot);
+ accuracyData = new HashMap<PlayerId, AccuracyData>();
} catch (IOException e) {
e.printStackTrace();
}
@@ -61,12 +66,14 @@
}
public void printAccuracy() {
- System.out.print(//" Accuracy : " +
- (trueNegative + truePositive) /
- (trueNegative + truePositive + falseNegative + falsePositive));
- System.out.println("\t-\t" + //" Precision : " +
- (truePositive) /
- (truePositive + falsePositive));
+ for (PlayerId id : accuracyData.keySet()) {
+ AccuracyData data = accuracyData.get(id);
+ System.out.print(//" Accuracy : " +
+ (data.trueNegative + data.truePositive) /
+ (data.trueNegative + data.truePositive + data.falseNegative +
data.falsePositive));
+ System.out.print("\t");
+ }
+ System.out.println("");
}
private Prediction getProbability(GameState gameState) {
@@ -190,26 +197,30 @@
}
// System.out.println(">----------------------------");
- for (Class<?> c : probs.keySet()) {
- if (c.equals(cProb))
- assimilatePrediction(new Prediction(action, 1, probs.get(cProb)));
- else
- assimilatePrediction(new Prediction(actions.get(c), 0, probs.get(c)));
- }
+// for (Class<?> c : probs.keySet()) {
+// if (c.equals(cProb))
+// assimilatePrediction(new Prediction(action, 1, probs.get(cProb)));
+// else
+// assimilatePrediction(new Prediction(actions.get(c), 0,
probs.get(c)));
+// }
// System.out.println("-----------------------------<");
- printAccuracy();
return new Prediction(action, 1, probs.get(cProb));
}
- private void assimilatePrediction(Prediction p) {
+ private void assimilatePrediction(PlayerId id, Prediction p) {
if (p == null || p.getAction() == null) return;
// System.out.println(p + ", TP: " + p.getTruePositive() + ", TN: " +
p.getTrueNegative()
// + ", FP: " + p.getFalsePositive() + ", FN: " + p.getFalseNegative());
- truePositive += p.getTruePositive();
- trueNegative += p.getTrueNegative();
- falsePositive += p.getFalsePositive();
- falseNegative += p.getFalseNegative();
+ if (!accuracyData.containsKey(id))
+ accuracyData.put(id, new AccuracyData());
+
+ AccuracyData data = accuracyData.get(id);
+ data.truePositive += p.getTruePositive();
+ data.trueNegative += p.getTrueNegative();
+ data.falsePositive += p.getFalsePositive();
+ data.falseNegative += p.getFalseNegative();
+ printAccuracy();
}
@Override
@@ -217,7 +228,7 @@
InnerNode node = getNode(callState);
if (node != null
&& !callState.getNextToAct().equals(parentOpponentModel.getBotId())) {
Prediction p = getProbability(callState);
-// assimilatePrediction(p);
+ assimilatePrediction(callState.getNextToAct(), p);
logger.trace(getPlayerName(callState) + " " + p);
} else {
logger.trace(getPlayerName(callState) + " CallState");
@@ -230,7 +241,7 @@
InnerNode node = getNode(raiseState);
if (node != null
&& !raiseState.getNextToAct().equals(parentOpponentModel.getBotId())) {
Prediction p = getProbability(raiseState,raiseState.getLargestBet());
-// assimilatePrediction(p);
+ assimilatePrediction(raiseState.getNextToAct(), p);
logger.trace(getPlayerName(raiseState) +
" Raise " + Util.parseDollars(raiseState.getLargestBet()) +
" - with <" + p + ">");
@@ -245,7 +256,7 @@
InnerNode node = getNode(foldState);
if (node != null
&& !foldState.getNextToAct().equals(parentOpponentModel.getBotId())) {
Prediction p = getProbability(foldState);
-// assimilatePrediction(p);
+ assimilatePrediction(foldState.getNextToAct(), p);
logger.trace(getPlayerName(foldState) + " " + p);
} else {
logger.trace(getPlayerName(foldState) + " FoldState");
@@ -258,7 +269,7 @@
InnerNode node = getNode(checkState);
if (node != null
&& !checkState.getNextToAct().equals(parentOpponentModel.getBotId())) {
Prediction p = getProbability(checkState);
-// assimilatePrediction(p);
+ assimilatePrediction(checkState.getNextToAct(), p);
logger.trace(getPlayerName(checkState) + " " + p);
} else {
logger.trace(getPlayerName(checkState) + " CheckState");
@@ -271,7 +282,7 @@
InnerNode node = getNode(betState);
if (node != null
&& !betState.getNextToAct().equals(parentOpponentModel.getBotId())) {
Prediction p = getProbability(betState,
betState.getEvent().getAmount());
-// assimilatePrediction(p);
+ assimilatePrediction(betState.getNextToAct(), p);
logger.trace(getPlayerName(betState) +
" Bet " + Util.parseDollars(betState.getEvent().getAmount()) +
" - with <" + p + ">");
@@ -286,7 +297,7 @@
InnerNode node = getNode(allInState);
if (node != null
&& !allInState.getNextToAct().equals(parentOpponentModel.getBotId())) {
Prediction p = getProbability(allInState,
allInState.getEvent().getMovedAmount());
-// assimilatePrediction(p);
+ assimilatePrediction(allInState.getNextToAct(), p);
logger.trace(getPlayerName(allInState) +
" All-in " + Util.parseDollars(allInState.getEvent().getMovedAmount())
+
" - with <" + p + ">");
=======================================
---
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/WekaLearningModel.java
Wed Aug 11 08:56:53 2010
+++
/trunk/ai/opponentmodels/weka/src/main/java/org/cspoker/ai/opponentmodels/weka/WekaLearningModel.java
Mon Aug 16 10:38:42 2010
@@ -112,6 +112,13 @@
}
return model;
}
+
+ public ARFFPlayer getPlayer(PlayerId actor) {
+ if (config.useOnlineLearning() && !actor.equals(bot)) {
+ return actionTrackingVisitor.getPropz().getARFF(actor);
+ } else
+ return null;
+ }
@Override
public Pair<Double, Double> getCheckBetProbabilities(GameState gameState,
PlayerId actor) {