package bots.mctsbot.ai.bots.bot.gametree.search.expander.sampling;
import java.util.List;
import bots.mctsbot.ai.bots.bot.gametree.action.BetAction;
import bots.mctsbot.ai.bots.bot.gametree.action.ProbabilityAction;
import bots.mctsbot.ai.bots.bot.gametree.action.RaiseAction;
import bots.mctsbot.ai.opponentmodels.OpponentModel;
import bots.mctsbot.client.common.gamestate.GameState;
import bots.mctsbot.common.elements.player.PlayerId;
import com.google.common.collect.ImmutableList;
public abstract class Sampler {
public abstract ImmutableList<ProbabilityAction> getProbabilityActions(GameState gameState, OpponentModel model, PlayerId actor, PlayerId bot);
protected void addRaiseProbalities(GameState gameState, PlayerId actor, List<ProbabilityAction> actions, double raiseProbability, boolean raise,
double[] relBetSizeSamples, double[] relPBetSizeSamples) {
int lowerRaiseBound = gameState.getLowerRaiseBound(actor);
int upperRaiseBound = gameState.getUpperRaiseBound(actor);
if (lowerRaiseBound < upperRaiseBound) {
int lastBetAmount = 0;
double skippedProbabilities = 0;
for (int i = 0; i < relBetSizeSamples.length; i++) {
double probability = raiseProbability * relPBetSizeSamples[i];
double amount = lowerRaiseBound + (upperRaiseBound - lowerRaiseBound) * relBetSizeSamples[i];
int smallBlind = gameState.getTableConfiguration().getSmallBlind();
int blindAdjustedAmount = Math.min((int) (smallBlind * Math.round(amount / smallBlind)), upperRaiseBound);
if (Math.abs(lastBetAmount - blindAdjustedAmount) < (2 * smallBlind)) {
// we skip some actions, if the new amount is not at least
// two smallblinds greater than the last
skippedProbabilities += probability;
} else {
if (blindAdjustedAmount < lowerRaiseBound)
blindAdjustedAmount += smallBlind;
if (blindAdjustedAmount > upperRaiseBound)
blindAdjustedAmount = upperRaiseBound;
if (raise) {
actions.add(new ProbabilityAction(new RaiseAction(gameState, actor, blindAdjustedAmount), skippedProbabilities));
} else
actions.add(new ProbabilityAction(new BetAction(gameState, actor, blindAdjustedAmount), skippedProbabilities));
lastBetAmount = blindAdjustedAmount;
skippedProbabilities = 0.0;
}
}
} else {
if (raise)
actions.add(new ProbabilityAction(new RaiseAction(gameState, actor, lowerRaiseBound), raiseProbability));
else
actions.add(new ProbabilityAction(new BetAction(gameState, actor, lowerRaiseBound), raiseProbability));
}
}
}