net.sf.colossus.client
Class PredictSplitNode

java.lang.Object
  extended by net.sf.colossus.client.PredictSplitNode
All Implemented Interfaces:
java.lang.Comparable<PredictSplitNode>

public class PredictSplitNode
extends java.lang.Object
implements java.lang.Comparable<PredictSplitNode>

Predicts splits for one enemy player, and adjusts predictions as creatures are revealed.

Author:
David Ripton, Kim Milvang-Jensen See docs/SplitPrediction.txt

Field Summary
private  CreatureType angel
           
private  PredictSplitNode child1
           
private  PredictSplitNode child2
           
private  int childSize2
           
private static CreatureInfoComparator cic
           
private  CreatureInfoList creatures
           
private  java.lang.String markerId
           
private  PredictSplitNode parent
           
private  CreatureInfoList removed
           
private  CreatureType titan
           
private  int turnCreated
           
private  Variant variant
           
 
Constructor Summary
PredictSplitNode(java.lang.String markerId, int turnCreated, CreatureInfoList cil, PredictSplitNode parent, Variant variant)
           
 
Method Summary
(package private)  void addCreature(CreatureType type)
           
(package private)  boolean allCertain()
           
(package private)  boolean allDescendentsCertain()
          Return true if all of this node's children, grandchildren, etc.
(package private)  java.util.List<CreatureType> chooseCreaturesToSplitOut(java.util.List<java.util.List<CreatureType>> possibleSplits)
          Decide how to split this legion, and return a list of creatures names to remove.
private  void clearChildren()
           
 int compareTo(PredictSplitNode other)
           
(package private)  void computeSplit(int childSize, java.util.List<CreatureType> knownKeep, java.util.List<CreatureType> knownSplit, CreatureInfoList keepList, CreatureInfoList splitList)
          Computes the predicted split of childsize, given that we may already know some pieces that are keept or spilt.
(package private)  int count(java.util.List<?> li, java.lang.Object ob)
          Return the number of times ob is found in li
(package private) static int count(java.util.List<java.lang.String> li, java.lang.String name)
          Return the number of times name occurs in li
(package private)  java.util.List<java.util.List<CreatureType>> findAllPossibleSplits(int childSize, java.util.List<CreatureType> knownKeep, java.util.List<CreatureType> knownSplit)
          Return a list of all legal combinations of splitoffs.
(package private)  CreatureInfoList getAfterSplitCreatures()
          Return list of CreatureInfo where atSplit == false.
(package private)  CreatureInfoList getAtSplitOrRemovedCreatures()
          Return list of CreatureInfo where atSplit == true, plus removed creatures.
(package private)  CreatureInfoList getCertainAtSplitOrRemovedCreatures()
          Return list of CreatureInfo where both certain and atSplit are true, plus removed creatures.
(package private)  CreatureInfoList getCertainCreatures()
          Return list of CreatureInfo where certain == true.
 PredictSplitNode getChild1()
           
 PredictSplitNode getChild2()
           
(package private)  java.util.List<PredictSplitNode> getChildren()
           
(package private)  CreatureInfoList getCreatures()
          Return list of CreatureInfo
 java.lang.String getFullName()
           
(package private)  int getHeight()
           
 java.lang.String getMarkerId()
           
(package private)  java.lang.String getOtherChildMarkerId()
           
 PredictSplitNode getParent()
           
(package private)  CreatureInfoList getRemovedCreatures()
          Return list of CreatureInfo
 int getTurnCreated()
           
(package private)  boolean hasSplit()
           
 boolean isLegalInitialSplitoff(java.util.List<CreatureType> types)
           
(package private)  void merge(PredictSplitNode other)
          Recombine this legion and other, because it was not possible to move.
(package private) static int minCount(java.util.List<java.util.List<java.lang.String>> lili, java.lang.String name)
          lili is a list of lists.
(package private)  int numCertainCreatures()
           
(package private)  int numUncertainCreatures()
           
(package private)  void removeCreature(CreatureType type)
           
(package private)  void removeCreatures(java.util.List<CreatureType> creatureTypes)
           
(package private)  void reSplit()
          Recompute the split of a stack, taking advantage of any information potentially gained from the children
(package private)  void revealCreatures(java.util.List<CreatureType> cnl)
           
private static
<T> boolean
safeEquals(T obj1, T obj2)
           
(package private)  void setCreatures(CreatureInfoList creatures)
           
(package private)  void split(int childSize, Legion otherLegion, int turn)
          Perform the initial split of a stack, and create the children
(package private) static
<T> java.util.List<T>
subtractLists(java.util.List<T> big, java.util.List<T> little)
           
(package private) static
<T> boolean
superset(java.util.List<T> big, java.util.List<T> little)
          Return true if big is a superset of little.
 java.lang.String toString()
           
(package private)  void updateInitialSplitInfo(CreatureInfoList newList)
          This takes potentially new information about the legion's composition at split and applies the later changes to the legion to get a new predicton of contents.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

markerId

private final java.lang.String markerId

turnCreated

private final int turnCreated

creatures

private CreatureInfoList creatures

removed

private final CreatureInfoList removed

parent

private final PredictSplitNode parent

childSize2

private int childSize2

child1

private PredictSplitNode child1

child2

private PredictSplitNode child2

variant

private final Variant variant

titan

private final CreatureType titan

angel

private final CreatureType angel

cic

private static CreatureInfoComparator cic
Constructor Detail

PredictSplitNode

PredictSplitNode(java.lang.String markerId,
                 int turnCreated,
                 CreatureInfoList cil,
                 PredictSplitNode parent,
                 Variant variant)
Method Detail

clearChildren

private void clearChildren()

getMarkerId

public java.lang.String getMarkerId()

getFullName

public java.lang.String getFullName()

getChild1

public PredictSplitNode getChild1()

getChild2

public PredictSplitNode getChild2()

getParent

public PredictSplitNode getParent()

getTurnCreated

public int getTurnCreated()

toString

public java.lang.String toString()
Overrides:
toString in class java.lang.Object

getCreatures

CreatureInfoList getCreatures()
Return list of CreatureInfo


setCreatures

void setCreatures(CreatureInfoList creatures)

getRemovedCreatures

CreatureInfoList getRemovedCreatures()
Return list of CreatureInfo


getCertainCreatures

CreatureInfoList getCertainCreatures()
Return list of CreatureInfo where certain == true.


numCertainCreatures

int numCertainCreatures()

numUncertainCreatures

int numUncertainCreatures()

allCertain

boolean allCertain()

hasSplit

boolean hasSplit()

getChildren

java.util.List<PredictSplitNode> getChildren()

allDescendentsCertain

boolean allDescendentsCertain()
Return true if all of this node's children, grandchildren, etc. have no uncertain creatures


getAtSplitOrRemovedCreatures

CreatureInfoList getAtSplitOrRemovedCreatures()
Return list of CreatureInfo where atSplit == true, plus removed creatures.


getAfterSplitCreatures

CreatureInfoList getAfterSplitCreatures()
Return list of CreatureInfo where atSplit == false.


getCertainAtSplitOrRemovedCreatures

CreatureInfoList getCertainAtSplitOrRemovedCreatures()
Return list of CreatureInfo where both certain and atSplit are true, plus removed creatures.


getOtherChildMarkerId

java.lang.String getOtherChildMarkerId()

getHeight

int getHeight()

superset

static <T> boolean superset(java.util.List<T> big,
                            java.util.List<T> little)
Return true if big is a superset of little. Note that this treats repeated elements as distinct, i.e. if the little list contains two copies of something, then the big list has to contain two copies, too. It differs in that regard from Collection.containsAll(Collection) which is implemented in a fashion where this is not necessary (the specification as of JDK 1.5 is actually blurry on the matter).


revealCreatures

void revealCreatures(java.util.List<CreatureType> cnl)

isLegalInitialSplitoff

public boolean isLegalInitialSplitoff(java.util.List<CreatureType> types)

findAllPossibleSplits

java.util.List<java.util.List<CreatureType>> findAllPossibleSplits(int childSize,
                                                                   java.util.List<CreatureType> knownKeep,
                                                                   java.util.List<CreatureType> knownSplit)
Return a list of all legal combinations of splitoffs. Also update knownKeep and knownSplit if we conclude that more creatures are certain.

Parameters:
childSize -
knownKeep -
knownSplit -
Returns:

safeEquals

private static <T> boolean safeEquals(T obj1,
                                      T obj2)

chooseCreaturesToSplitOut

java.util.List<CreatureType> chooseCreaturesToSplitOut(java.util.List<java.util.List<CreatureType>> possibleSplits)
Decide how to split this legion, and return a list of creatures names to remove. Return empty list on error.


count

int count(java.util.List<?> li,
          java.lang.Object ob)
Return the number of times ob is found in li


computeSplit

void computeSplit(int childSize,
                  java.util.List<CreatureType> knownKeep,
                  java.util.List<CreatureType> knownSplit,
                  CreatureInfoList keepList,
                  CreatureInfoList splitList)
Computes the predicted split of childsize, given that we may already know some pieces that are keept or spilt. Also makes the new CreatureInfoLists. Note that knownKeep and knownSplit will be altered, and be empty after call

Parameters:
childSize -
knownKeep - certain creatures to keep
knownSplit - certain creatures to split
keepList - return argument
splitList - return argument

split

void split(int childSize,
           Legion otherLegion,
           int turn)
Perform the initial split of a stack, and create the children

Parameters:
childSize -
otherMarkerId -
turn -

reSplit

void reSplit()
Recompute the split of a stack, taking advantage of any information potentially gained from the children


updateInitialSplitInfo

void updateInitialSplitInfo(CreatureInfoList newList)
This takes potentially new information about the legion's composition at split and applies the later changes to the legion to get a new predicton of contents. It then recursively resplits.

Parameters:
newList -

merge

void merge(PredictSplitNode other)
Recombine this legion and other, because it was not possible to move. They must share a parent. If either legion has the parent's markerId, then that legion will remain. Otherwise this legion will remain. Also used to undo splits.


addCreature

void addCreature(CreatureType type)

removeCreature

void removeCreature(CreatureType type)

removeCreatures

void removeCreatures(java.util.List<CreatureType> creatureTypes)

compareTo

public int compareTo(PredictSplitNode other)
Specified by:
compareTo in interface java.lang.Comparable<PredictSplitNode>

subtractLists

static <T> java.util.List<T> subtractLists(java.util.List<T> big,
                                           java.util.List<T> little)

count

static int count(java.util.List<java.lang.String> li,
                 java.lang.String name)
Return the number of times name occurs in li


minCount

static int minCount(java.util.List<java.util.List<java.lang.String>> lili,
                    java.lang.String name)
lili is a list of lists. Return the minimum number of times name appears in any of the lists contained in lili.