diff --git a/src/statebag.py b/src/statebag.py --- a/src/statebag.py +++ b/src/statebag.py @@ -42,6 +42,7 @@ class GameTreeNode: ## Connect itself after v if it gains itself more weight. def tryConnect(self,v,diff): moves=getTransitionSequence(v.parent,self.parent,-1*v.color,self.color,diff) + if not moves: return w=v.weight+2-len(moves) # proper one move transition increases the weight by 1 if w>self.weight: self.moves=moves @@ -57,10 +58,10 @@ class BoardState: self._hash=None def tryConnect(self,s): - diff=s-self + diff=self-s distEst=estimateDistance(diff) if distEst>3: return # we couldn't find every such move sequence anyway without a clever algorithm - weightEst=s.getWeight()-distEst + weightEst=s.getWeight()+2-distEst if weightEst<=self.getWeight(): return for v1 in s.nodes: for v2 in self.nodes: @@ -94,9 +95,16 @@ class BoardState: def __eq__(self,x): return self.hash()==x.hash() + def setWeight(self,val): + for v in self.nodes: v.weight=val + def getWeight(self): return max(v.weight for v in self.nodes) + def getPrev(self): + v=max(self.nodes, key=lambda v: v.weight) + return v.prev.parent if v.prev else None + class StateBag: def __init__(self): @@ -104,11 +112,15 @@ class StateBag: def pushState(self,board): sn=BoardState(board) - if self._states and sn==self._states[-1]: return # no change + if len(self._states)>0: + if sn==self._states[-1]: return None # no change + sn.diff2Prev=sn-self._states[-1] + else: sn.setWeight(1) for s in reversed(self._states): sn.tryConnect(s) self._states.append(sn) + return sn def merge(self,branch): pass