class CoefficientOptimizer: """Class for optimizing Gaussian/reference overlap. Given matrices of scalar products s and S as returned by overlaps(), finds the optimal set of coefficients resulting in the largest overlap. ccount is the number of coefficients. if fix is True, the first coefficient will be set to 1, and only the remaining coefficients will be subject to optimization. """ def __init__(self, s_kmii, S_kmii, ccount, fix=False): self.s_kmii = s_kmii self.S_kmii = S_kmii self.fix = fix function = self.evaluate self.lastterms = None if fix: function = self.evaluate_fixed ccount -= 1 ones = np.ones((ccount, ccount)) diag = np.identity(ccount) simplex = np.concatenate((np.ones((ccount, 1)), ones + .5 * diag), axis=1) simplex = np.transpose(simplex) self.amoeba = Amoeba(function, simplex, tolerance=1e-10) def find_coefficients(self): self.amoeba.optimize() coefficients = self.amoeba.simplex[0] if self.fix: coefficients = [1.] + list(coefficients) return coefficients def evaluate_fixed(self, coef): return self.evaluate([1.] + list(coef)) def evaluate(self, coef): coef = np.array(coef) # complex coefficients? terms_km = np.zeros(self.S_kmii.shape[0:2]) for i, (s_mii, S_mii) in enumerate(zip(self.s_kmii, self.S_kmii)): for j, (s_ii, S_ii) in enumerate(zip(s_mii, S_mii)): numerator = np.vdot(coef, np.dot(S_ii, coef)) denominator = np.vdot(coef, np.dot(s_ii, coef)) terms_km[i, j] = numerator / denominator #print terms_km self.lastterms = terms_km quality = terms_km.sum() badness = -quality return badness
class CoefficientOptimizer: """Class for optimizing Gaussian/reference overlap. Given matrices of scalar products s and S as returned by overlaps(), finds the optimal set of coefficients resulting in the largest overlap. ccount is the number of coefficients. if fix is True, the first coefficient will be set to 1, and only the remaining coefficients will be subject to optimization. """ def __init__(self, s_kmii, S_kmii, ccount, fix=False): self.s_kmii = s_kmii self.S_kmii = S_kmii self.fix = fix function = self.evaluate self.lastterms = None if fix: function = self.evaluate_fixed ccount -= 1 ones = np.ones((ccount, ccount)) diag = np.identity(ccount) simplex = np.concatenate((np.ones((ccount,1)), ones + .5 * diag), axis=1) simplex = np.transpose(simplex) self.amoeba = Amoeba(function, simplex, tolerance=1e-10) def find_coefficients(self): self.amoeba.optimize() coefficients = self.amoeba.simplex[0] if self.fix: coefficients = [1.] + list(coefficients) return coefficients def evaluate_fixed(self, coef): return self.evaluate([1.] + list(coef)) def evaluate(self, coef): coef = np.array(coef) # complex coefficients? terms_km = np.zeros(self.S_kmii.shape[0:2]) for i, (s_mii, S_mii) in enumerate(zip(self.s_kmii, self.S_kmii)): for j, (s_ii, S_ii) in enumerate(zip(s_mii, S_mii)): numerator = np.vdot(coef, np.dot(S_ii, coef)) denominator = np.vdot(coef, np.dot(s_ii, coef)) terms_km[i, j] = numerator / denominator #print terms_km self.lastterms = terms_km quality = terms_km.sum() badness = - quality return badness
def __init__(self, s_kmii, S_kmii, ccount, fix=False): self.s_kmii = s_kmii self.S_kmii = S_kmii self.fix = fix function = self.evaluate self.lastterms = None if fix: function = self.evaluate_fixed ccount -= 1 ones = np.ones((ccount, ccount)) diag = np.identity(ccount) simplex = np.concatenate((np.ones((ccount, 1)), ones + .5 * diag), axis=1) simplex = np.transpose(simplex) self.amoeba = Amoeba(function, simplex, tolerance=1e-10)
def __init__(self, s_kmii, S_kmii, ccount, fix=False): self.s_kmii = s_kmii self.S_kmii = S_kmii self.fix = fix function = self.evaluate self.lastterms = None if fix: function = self.evaluate_fixed ccount -= 1 ones = np.ones((ccount, ccount)) diag = np.identity(ccount) simplex = np.concatenate((np.ones((ccount,1)), ones + .5 * diag), axis=1) simplex = np.transpose(simplex) self.amoeba = Amoeba(function, simplex, tolerance=1e-10)