def __init__(self, _energyWrapper):
     EnergyFunctionPy.__init__(self)
     self.energyWrapper = _energyWrapper
     self.st = 0.0
     self.lambda_s = 0.0
     self.potts = self.energyWrapper.potts
     self.cellField = self.energyWrapper.potts.getCellFieldG()
     self.nfparams = NeighborFinderParams()
 def __init__(self,_energyWrapper):
     EnergyFunctionPy.__init__(self)
     self.energyWrapper=_energyWrapper
     self.st=0.0
     self.lambda_s=0.0
     self.potts=self.energyWrapper.potts
     self.cellField=self.energyWrapper.potts.getCellFieldG()
     self.nfparams=NeighborFinderParams()
class SurfaceEnergyFunction(EnergyFunctionPy):
    def __init__(self,_energyWrapper):
        EnergyFunctionPy.__init__(self)
        self.energyWrapper=_energyWrapper
        self.st=0.0
        self.lambda_s=0.0
        self.potts=self.energyWrapper.potts
        self.cellField=self.energyWrapper.potts.getCellFieldG()
        self.nfparams=NeighborFinderParams()
        
    def diffEnergy(self, surface, diff):
        return self.lambda_s *(diff * diff + 2 * diff * (surface - self.st))

    def setParams(self,_lambda,_targetSurface):
        self.lambda_s=_lambda;
        self.st=_targetSurface
     
    def changeEnergy(self):
        energy=0.0
        oldDiff=0
        newDiff=0
        oldCellId=-1
        newCellId=-1
        nCellId=-1
        print_flag=0;
        
        #print "changePoint=",self.energyWrapper.changePt
        #if self.energyWrapper.changePoint.x==35 and self.energyWrapper.changePoint.y==16:
            #print_flag=1;
            #print "got:",self.energyWrapper.changePoint
        if self.energyWrapper.isOldCellValid():
            oldCellId=self.energyWrapper.oldCell.id
            
        if self.energyWrapper.isNewCellValid():
            newCellId=self.energyWrapper.newCell.id
        
        #if print_flag:
            #print "changePoint:",self.energyWrapper.changePoint
        self.nfparams.reset()
        self.nfparams.pt=self.energyWrapper.changePoint
        self.nfparams.checkBounds=0
        #print "nfparams.pt=",self.nfparams.pt," neighbor=",self.cellField.nextNeighbor(self.nfparams)
        while 1:
            n=self.cellField.nextNeighbor(self.nfparams)
            if self.nfparams.distance>1:
                break
            #if print_flag:
                #print "chPt=",self.nfparams.pt," n=",n
            nCell=self.cellField.get(n)
            if self.energyWrapper.isCellMedium(nCell):
                nCellId=-1
            else:
                nCellId=nCell.id;
            
            #print "energyWrapper.newCell=",self.energyWrapper.newCell.id," nCell=",nCell.id
            if newCellId==nCellId:
                newDiff=newDiff-1
            else:
                newDiff=newDiff+1
                
            if oldCellId==nCellId:
                oldDiff=oldDiff+1
            else:
                oldDiff=oldDiff-1
        #if print_flag:
            #print "oldDiff=",oldDiff," newDiff",newDiff
        if(self.energyWrapper.isNewCellValid()):
            #print "newCell.id=",self.energyWrapper.newCell.id
            #print "self.energyWrapper.newCell.surface=",self.energyWrapper.newCell.surface
            #energy+=self.diffEnergy(self.energyWrapper.newCell.surface, newDiff)
            energy+=self.lambda_s *(newDiff**2 + 2 * newDiff * (self.energyWrapper.newCell.surface - self.st))
            #if print_flag:
                #print "self.energyWrapper.newCell.surface=",self.energyWrapper.newCell.surface
        #else:
            #print "NONE newCell.id=",self.energyWrapper.newCell.id
        if(self.energyWrapper.isOldCellValid()):
            #energy+=self.diffEnergy(self.energyWrapper.oldCell.surface, oldDiff)
            energy+=self.lambda_s *(oldDiff**2 + 2 * oldDiff * (self.energyWrapper.oldCell.surface - self.st))
            #if print_flag:
                #print "self.energyWrapper.oldCell.surface=",self.energyWrapper.oldCell.surface
        #print "energy=",energy
        #if print_flag:
            #print "pt=",self.energyWrapper.changePoint," e=",energy
        return energy
class SurfaceEnergyFunction(EnergyFunctionPy):
    def __init__(self, _energyWrapper):
        EnergyFunctionPy.__init__(self)
        self.energyWrapper = _energyWrapper
        self.st = 0.0
        self.lambda_s = 0.0
        self.potts = self.energyWrapper.potts
        self.cellField = self.energyWrapper.potts.getCellFieldG()
        self.nfparams = NeighborFinderParams()

    def diffEnergy(self, surface, diff):
        return self.lambda_s * (diff * diff + 2 * diff * (surface - self.st))

    def setParams(self, _lambda, _targetSurface):
        self.lambda_s = _lambda
        self.st = _targetSurface

    def changeEnergy(self):
        energy = 0.0
        oldDiff = 0
        newDiff = 0
        oldCellId = -1
        newCellId = -1
        nCellId = -1
        print_flag = 0

        #print "changePoint=",self.energyWrapper.changePt
        #if self.energyWrapper.changePoint.x==35 and self.energyWrapper.changePoint.y==16:
        #print_flag=1;
        #print "got:",self.energyWrapper.changePoint
        if self.energyWrapper.isOldCellValid():
            oldCellId = self.energyWrapper.oldCell.id

        if self.energyWrapper.isNewCellValid():
            newCellId = self.energyWrapper.newCell.id

        #if print_flag:
        #print "changePoint:",self.energyWrapper.changePoint
        self.nfparams.reset()
        self.nfparams.pt = self.energyWrapper.changePoint
        self.nfparams.checkBounds = 0
        #print "nfparams.pt=",self.nfparams.pt," neighbor=",self.cellField.nextNeighbor(self.nfparams)
        while 1:
            n = self.cellField.nextNeighbor(self.nfparams)
            if self.nfparams.distance > 1:
                break
            #if print_flag:
            #print "chPt=",self.nfparams.pt," n=",n
            nCell = self.cellField.get(n)
            if self.energyWrapper.isCellMedium(nCell):
                nCellId = -1
            else:
                nCellId = nCell.id

            #print "energyWrapper.newCell=",self.energyWrapper.newCell.id," nCell=",nCell.id
            if newCellId == nCellId:
                newDiff = newDiff - 1
            else:
                newDiff = newDiff + 1

            if oldCellId == nCellId:
                oldDiff = oldDiff + 1
            else:
                oldDiff = oldDiff - 1
        #if print_flag:
        #print "oldDiff=",oldDiff," newDiff",newDiff
        if (self.energyWrapper.isNewCellValid()):
            #print "newCell.id=",self.energyWrapper.newCell.id
            #print "self.energyWrapper.newCell.surface=",self.energyWrapper.newCell.surface
            #energy+=self.diffEnergy(self.energyWrapper.newCell.surface, newDiff)
            energy += self.lambda_s * (
                newDiff**2 + 2 * newDiff *
                (self.energyWrapper.newCell.surface - self.st))
            #if print_flag:
            #print "self.energyWrapper.newCell.surface=",self.energyWrapper.newCell.surface
        #else:
        #print "NONE newCell.id=",self.energyWrapper.newCell.id
        if (self.energyWrapper.isOldCellValid()):
            #energy+=self.diffEnergy(self.energyWrapper.oldCell.surface, oldDiff)
            energy += self.lambda_s * (
                oldDiff**2 + 2 * oldDiff *
                (self.energyWrapper.oldCell.surface - self.st))
            #if print_flag:
            #print "self.energyWrapper.oldCell.surface=",self.energyWrapper.oldCell.surface
        #print "energy=",energy
        #if print_flag:
        #print "pt=",self.energyWrapper.changePoint," e=",energy
        return energy