def spawn(self, newN, verbose): level = len(self.N) ret = CombinationResult(self.total, self.weight, self.N) ret.weight += Chem.getBlockMasses(level) * newN ret.N.append(newN) if verbose: print('spawning %s => %s' % (self, ret)) return ret
def __init__(self, total, weight=None, N=[]): self.N = copy.copy(N) self.total = total if weight: self.weight = copy.copy(weight) else: self.weight = 0.0 for i in range(len(self.N)): self.weight += self.N[i] * Chem.getBlockMasses(i)
def iterate(self, verbose): if self.isComplete(): return else: level = len(self.N) maxN = math.ceil( (self.total - self.weight) / Chem.getBlockMasses(level)) + 1 if verbose: print('Iterating level %d, N=%s, w=%f' % (level, str(self.N), self.weight)) for i in range(maxN + 1): if verbose: print(' trying %d for level %d' % (i, level)) yield self.spawn(i, verbose) return