Exemple #1
0
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
Exemple #2
0
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
Exemple #3
0
 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)
Exemple #4
0
 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)