def __call__(self, orgs, prob=1.0): if np.random.random_sample() > prob: return orgs[0], orgs[1] if isinstance(orgs[0], np.ndarray): idx = np.random.random_integers(0, len(orgs[0]) - 1) return (np.append(orgs[0][:idx], orgs[1][idx:], axis=0), np.append(orgs[1][:idx], orgs[0][idx:], axis=0)) elif isinstance(orgs[0], TernaryString): idx = np.random.random_integers(0, orgs[0].length - 1) ret1 = TernaryString(orgs[0].base, orgs[0].known, orgs[0].length) ret2 = TernaryString(orgs[1].base, orgs[1].known, orgs[1].length) ret1[idx:] = orgs[1][idx:] ret2[idx:] = orgs[0][idx:] return ret1, ret2 else: raise ValueError("Received unknown type in OnePointDualCrosser.")
def partition(self): """ compute the partition function - only for small dimension !!! """ from pyec.util.TernaryString import TernaryString total = 0 vsize = self.vsize hsize = self.hsize all = (1L << (vsize + hsize)) - 1L for i in xrange(1 << (vsize + hsize)): total += exp(self.__call__(TernaryString(long(i), all))) return total
def mutate(self, x): """This method uses an iterative algorithm to flip bits in a TernaryString with a given probability. The algorithm essentially uses the binary representation of the bit-flipping probability in order to convert random byte sampling (``p=.5``) to account for any probability, with resolution of ``1e-16``. """ flipped = TernaryString.bernoulli(self.p(), self.config.space.dim) base = x.base & ~flipped.base | ~x.base & flipped.base known = x.known & flipped.known return TernaryString(base, known, self.config.space.dim)
def __call__(self, network): numBytes = int(ceil(len(network.variables) / 8.0)) numFull = len(network.variables) / 8 initial = '' if numBytes != numFull: extra = len(network.variables) % 8 initMask = 0 for i in xrange(extra): initMask <<= 1 initMask |= 1 initial = struct.pack('B',initMask) base = long(binascii.hexlify(random.bytes(numBytes)), 16) known = long(binascii.hexlify(initial + '\xff'*numFull), 16) return TernaryString(base, known)
def __call__(self, orgs, prob): if np.random.random_sample() > prob: return orgs[0] if self.config.space.type == np.ndarray: rnd = np.random.random_sample(len(orgs[0])).round() return rnd * orgs[0] + (1 - rnd) * orgs[1] elif self.config.space.type == TernaryString: rnd = np.random.bytes(len(str(orgs[0])) * 8) rnd = long(binascii.hexlify(rnd), 16) base = rnd & orgs[0].base | ~rnd & orgs[1].base known = rnd & orgs[0].known | ~rnd & orgs[1].known return TernaryString(base, known, self.config.space.dim) else: err = "Unknown type for UniformCrossover: {0}" raise NotImplementException(err.format(self.config.space.type))
def extent(self): lower = 0L | (self.spec.known & self.spec.base) upper = -1L & (self.spec.known & self.spec.base | ~self.spec.known) return (TernaryString(lower, self.spec.known, self.spec.length), TernaryString(upper, self.spec.known, self.spec.length))
def configurations(self): cnt = 1L << (len(self.parents)) for i in xrange(cnt): yield TernaryString(self.expand(long(i)), self.known) raise StopIteration
def values(self): mask = 1L << self.index yield TernaryString(0L, mask) yield TernaryString(mask, mask) raise StopIteration