def fu_0_1_(self):
        omega = self.omega
        V = self.V
        Delta_2 = self.Delta_2
        inv_A = self.inv_A
        invA_B = self.invA_B
        omega_star = self.omega_star
        V_star = self.V_star

        fu_0 = 1 / 2 * (gaussian(omega, invA_B, V + Delta_2 + inv_A) *
                        (1 + erf(omega_star / sqrt(2 * V_star))) +
                        gaussian(invA_B, 0, Delta_2 + inv_A) *
                        (1 - erf(omega / sqrt(2 * V))))

        dfu_0 = 1 / 2 * (
            gaussian(omega, invA_B, V + Delta_2 + inv_A) *
            (inv(V + Delta_2 + inv_A) * (omega - invA_B) *
             (1 + erf(omega_star / sqrt(2 * V_star))) +
             2 / sqrt(2 * pi * V_star) * exp(-1 / 2 * omega_star**2 / V_star) *
             V_star * inv(Delta_2 + inv_A)) - gaussian(
                 invA_B, 0, Delta_2 + inv_A) * inv(Delta_2 + inv_A) * invA_B *
            (1 - erf(omega / sqrt(2 * V))))

        res = 1 / fu_0 * (dfu_0)**2
        return res
    def gout_(self):
        omega = self.omega
        V = self.V
        Delta_2 = self.Delta_2
        inv_A = self.inv_A
        invA_B = self.invA_B
        inv_V = inv(V)
        V_star = self.V_star
        omega_star = self.omega_star

        self.fout_()
        fout = self.fout

        dfout = 1 / 2 * (
            gaussian(omega, invA_B, V + Delta_2 + inv_A) *
            (inv(V + Delta_2 + inv_A) * (invA_B - omega) *
             (1 + erf(omega_star / sqrt(2 * V_star))) +
             2 / sqrt(2 * pi * V_star) * exp(-1 / 2 * omega_star**2 / V_star) *
             V_star * inv_V) + gaussian(invA_B, 0, Delta_2 + inv_A) *
            (-2 / sqrt(2 * pi * V) * exp(-1 / 2 * omega**2 / V)))

        if fout < self.threshold_zero:
            gout = 0
        else:
            gout = dfout / fout
        self.fout = fout
        self.dfout = dfout
        self.gout = gout
    def fu_1_(self):
        omega = self.omega
        V = self.V
        Delta_2 = self.Delta_2
        inv_A = self.inv_A
        invA_B = self.invA_B
        omega_star = self.omega_star
        V_star = self.V_star

        self.fu_0_()
        fu_0 = self.fu_0

        dfu_0 = 1 / 2 * (
            gaussian(omega, invA_B, V + Delta_2 + inv_A) *
            (inv(V + Delta_2 + inv_A) * (omega - invA_B) *
             (1 + erf(omega_star / sqrt(2 * V_star))) +
             2 / sqrt(2 * pi * V_star) * exp(-1 / 2 * omega_star**2 / V_star) *
             V_star * inv(Delta_2 + inv_A)) - gaussian(
                 invA_B, 0, Delta_2 + inv_A) * inv(Delta_2 + inv_A) * invA_B *
            (1 - erf(omega / sqrt(2 * V))))

        if fu_0 < self.threshold_zero:
            fu_1 = 0
        else:
            fu_1 = inv_A * dfu_0 / fu_0 + invA_B
        self.fu_0 = fu_0
        self.dfu_0 = dfu_0
        self.fu_1 = fu_1
示例#4
0
    def fu_2_(self):
        omega = self.omega
        V = self.V
        Delta_2 = self.Delta_2
        inv_A = self.inv_A
        invA_B = self.invA_B
        inv_Delta2_A = self.inv_Delta2_A

        self.fu_1_()
        fu_0 = self.fu_0
        fu_1 = self.fu_1

        term1 = - 1/2 * inv_Delta2_A * \
            gaussian(invA_B, 1, Delta_2 + inv_A) * (1 + erf(omega/sqrt(2*V)))
        term2 = 1/2 * (inv_Delta2_A * (1 - invA_B))**2 * gaussian(invA_B, 1, Delta_2 + inv_A) * \
            (1 + erf(omega/sqrt(2*V)))
        term3 = - 1/2 * inv_Delta2_A * \
            gaussian(invA_B, -1, Delta_2 + inv_A) * (1 - erf(omega/sqrt(2*V)))
        term4 = 1/2 * (inv_Delta2_A * (-1 - invA_B))**2 * gaussian(invA_B, -1, Delta_2 + inv_A) * \
            (1 - erf(omega/sqrt(2*V)))
        ddfu_0 = term1 + term2 + term3 + term4

        if fu_0 < self.threshold_zero:
            fu_2 = 0
        else:
            fu_2 = inv_A**2 * 1/fu_0 * ddfu_0 + inv_A - \
                invA_B**2 + 2 * invA_B * fu_1 - fu_1**2

        self.fu_2 = fu_2
示例#5
0
    def fu_1_(self):
        omega = self.omega
        V = self.V
        Delta_2 = self.Delta_2
        inv_A = self.inv_A
        invA_B = self.invA_B
        inv_Delta2_A = self.inv_Delta2_A

        self.fu_0_()
        fu_0 = self.fu_0

        term1 = 1/2 * inv_Delta2_A * \
            (1 - invA_B) * gaussian(invA_B, 1, Delta_2 + inv_A) * \
            (1 + erf(omega/sqrt(2*V)))
        term2 = 1/2 * inv_Delta2_A * \
            (-1 - invA_B) * gaussian(invA_B, -1,
                                     Delta_2 + inv_A) * (1 - erf(omega/sqrt(2*V)))
        dfu_0 = term1 + term2

        if np.abs(fu_0) < self.threshold_zero:
            fu_1 = 0
        else:
            fu_1 = inv_A * dfu_0 / fu_0 + invA_B
        self.fu_0 = fu_0
        self.dfu_0 = dfu_0
        self.fu_1 = fu_1
示例#6
0
 def integrand_dfout(self, z, s, j):
     A, B, C = self.omega[0], self.V_tilde_inv[1], self.V_tilde[1]
     i = 1
     omega_tilde = self.omega_tilde(z, i, self.omega, self.inv_V)
     term1 = 1/2 * (1 + s * erf(omega_tilde / sqrt(2*C))) * 1 / \
         self.V_tilde_inv[1] * (z - self.omega[0]) if j == 0 else 0
     tmp = self.inv_V[0, 1] / self.inv_V[1, 1] if j == 0 else 1
     term2 = s * gaussian(0, omega_tilde, self.V_tilde[1]) * tmp
     res = gaussian(z, A, B) * (term1 + term2)
     return res
示例#7
0
    def fu_0_(self):
        omega = self.omega
        V = self.V
        Delta_2 = self.Delta_2
        inv_A = self.inv_A
        invA_B = self.invA_B

        fu_0 = 1/2 * gaussian(invA_B, 1, Delta_2 + inv_A) * (1 + erf(omega/sqrt(2*V))) \
            + 1/2 * gaussian(invA_B, -1, Delta_2 + inv_A) * \
            (1 - erf(omega/sqrt(2*V)))
        if np.abs(fu_0) < self.threshold_zero:
            fu_0 = 0
        self.fu_0 = fu_0
    def fu_0_(self):
        omega = self.omega
        V = self.V
        Delta_2 = self.Delta_2
        inv_A = self.inv_A
        invA_B = self.invA_B
        omega_star = self.omega_star
        V_star = self.V_star

        fu_0 = 1 / 2 * (gaussian(omega, invA_B, V + Delta_2 + inv_A) *
                        (1 + erf(omega_star / sqrt(2 * V_star))) +
                        gaussian(invA_B, 0, Delta_2 + inv_A) *
                        (1 - erf(omega / sqrt(2 * V))))

        self.fu_0 = fu_0
示例#9
0
    def fout_(self):
        omega = self.omega
        V = self.V
        Delta_2 = self.Delta_2
        inv_A = self.inv_A
        invA_B = self.invA_B

        fout = 1/2 * gaussian(invA_B, 1, Delta_2 + inv_A) * (1 + erf(omega/sqrt(2*V))) \
            + 1/2 * gaussian(invA_B, -1, Delta_2 + inv_A) * \
            (1 - erf(omega/sqrt(2*V)))

        if fout < self.threshold_zero:
            fout = 0

        self.fout = fout
示例#10
0
 def integrand_fout(self, z, s):
     A, B, C = self.omega[0], self.V_tilde_inv[1], self.V_tilde[1]
     i = 1
     omega_tilde = self.omega_tilde(z, i, self.omega, self.inv_V)
     res = 1/2 * gaussian(z, A, B) * (1 + s *
                                      erf(omega_tilde / sqrt(2*C)))
     return res
示例#11
0
    def fout_gout_(self):
        omega = self.omega
        V = self.V
        Delta_2 = self.Delta_2
        inv_A = self.inv_A
        invA_B = self.invA_B

        fout = 1/2 * gaussian(invA_B, 1, Delta_2 + inv_A) * (1 + erf(omega/sqrt(2*V))) \
            + 1/2 * gaussian(invA_B, -1, Delta_2 + inv_A) * \
            (1 - erf(omega/sqrt(2*V)))
            
        dfout = (gaussian(invA_B, 1, Delta_2 + inv_A) - gaussian(invA_B, -1, Delta_2 + inv_A)) * \
            gaussian(omega, 0, V)
        
        res = 1/fout * dfout**2
        return res
    def fout_(self):
        omega = self.omega
        V = self.V
        Delta_2 = self.Delta_2
        inv_A = self.inv_A
        invA_B = self.invA_B
        V_star = self.V_star

        omega_star = self.omega_star

        fout = 1 / 2 * (gaussian(omega, invA_B, V + Delta_2 + inv_A) *
                        (1 + erf(omega_star / sqrt(2 * V_star))) +
                        gaussian(invA_B, 0, Delta_2 + inv_A) *
                        (1 - erf(omega / sqrt(2 * V))))
        if fout < self.threshold_zero:
            fout = 0

        self.fout = fout
示例#13
0
 def dfu_0_sign_K2(self):
     dfu_0 = np.zeros((self.K))
     for i in range(self.K**2):
         phi_z = self.configuration_binary(i)
         norm = gaussian(self.mu, phi_z, self.Sigma)
         s = phi_z[1]
         borne_inf, borne_sup = self.select_bornes(phi_z[0])
         I = norm * quad(self.integrand_fout, borne_inf, borne_sup,
                         args=(s))[0]
         dfu_0 += self.inv_Sigma.dot(phi_z-self.mu) * I
     return dfu_0
示例#14
0
 def dfout_sign_K2(self):
     dfout = np.zeros((self.K))
     for i in range(self.K**2):
         phi_z = self.configuration_binary(i)
         norm = gaussian(self.mu, phi_z, self.Sigma)
         s = phi_z[1]
         borne_inf, borne_sup = self.select_bornes(phi_z[0])
         for j in range(self.K):
             dfout[j] += norm * quad(self.integrand_dfout, borne_inf, borne_sup,
                                     args=(s, j))[0]
     return dfout
示例#15
0
 def integrand_ddfout(self, z, s, j, k):
     A, B, C = self.omega[0], self.V_tilde_inv[1], self.V_tilde[1]
     i = 1
     omega_tilde = self.omega_tilde(z, i, self.omega, self.inv_V)
     term0 = 1 / self.V_tilde_inv[1] * (z - self.omega[0]) if k == 0 else 0
     term1 = 1/2 * (1 + s * erf(omega_tilde / sqrt(2*C))) * 1 / \
         self.V_tilde_inv[1] * (z - self.omega[0]) if j == 0 else 0
     tmp = self.inv_V[0, 1] / self.inv_V[1, 1] if j == 0 else 1
     term2 = s * gaussian(0, omega_tilde, self.V_tilde[1]) * tmp
     term3 = - 1/2 * (1 + s * erf(omega_tilde / sqrt(2*C))) * 1 / \
         self.V_tilde_inv[1] if (j == 0 and k == 0) else 0
     term4 = 1 / self.V_tilde_inv[1] * (z - self.omega[0]) if j == 0 else 0
     tmp2 = self.inv_V[0, 1] / self.inv_V[1, 1] if k == 0 else 1
     term5 = s * gaussian(0, omega_tilde, self.V_tilde[1]) * tmp2
     term6 = - s * \
         gaussian(0, omega_tilde, self.V_tilde[1]) * \
         tmp * 1 / self.V_tilde[1] * omega_tilde * tmp2
     res = gaussian(z, A, B) * (term0 * (term1 + term2) +
                                term3 + term4 * term5 + term6)
     return res
示例#16
0
    def gout_(self):
        omega = self.omega
        V = self.V
        Delta_2 = self.Delta_2
        inv_A = self.inv_A
        invA_B = self.invA_B

        self.fout_()
        fout = self.fout

        dfout = (gaussian(invA_B, 1, Delta_2 + inv_A) - gaussian(invA_B, -1, Delta_2 + inv_A)) * \
            gaussian(omega, 0, V)

        if fout < self.threshold_zero:
            gout = 0
        else:
            gout = dfout / fout
        self.fout = fout
        self.dfout = dfout
        self.gout = gout
    def dgout_(self):
        omega = self.omega
        V = self.V
        Delta_2 = self.Delta_2
        inv_A = self.inv_A
        invA_B = self.invA_B
        inv_V = inv(V)
        V_star = self.V_star
        omega_star = self.omega_star

        self.gout_()
        fout = self.fout
        gout = self.gout

        if self.Nishimori_identity:
            ddfout = 0
        else:
            term1 = - inv(V + Delta_2 + inv_A) * \
                (1 + erf(omega_star / sqrt(2 * V_star)))
            term2 = inv(V + Delta_2 + inv_A) * (invA_B - omega) * 2 / sqrt(
                2 * pi * V_star) * exp(
                    -1 / 2 * omega_star**2 / V_star) * V_star * inv_V
            term3 = - omega_star / V_star * 2 / \
                sqrt(2 * pi * V_star) * exp(-1/2 * omega_star **
                                            2 / V_star) * (V_star * inv_V)**2
            term4 = inv(V + Delta_2 + inv_A) * (invA_B-omega) * \
                (1 + erf(omega_star / sqrt(2 * V_star))) + \
                2 / sqrt(2 * pi * V_star) * exp(-1/2 *
                                                omega_star**2 / V_star) * V_star * inv_V
            term5 = inv(V + Delta_2 + inv_A) * (invA_B - omega)
            term6 = - omega / V * gaussian(invA_B, 0, Delta_2 + inv_A) * \
                (- 2 / sqrt(2 * pi * V) * exp(-1/2 * omega**2 / V))
            ddfout = 1 / 2 * (gaussian(omega, invA_B, V + Delta_2 + inv_A) *
                              (term1 + term2 + term3 + term4 * term5) + term6)

        if fout < self.threshold_zero:
            dgout = 0
        else:
            dgout = 1 / fout * ddfout - gout**2
        self.ddfout = ddfout
        self.dgout = dgout
示例#18
0
    def fu_0_1_(self):
        omega = self.omega
        V = self.V
        Delta_2 = self.Delta_2
        inv_A = self.inv_A
        invA_B = self.invA_B
        inv_Delta2_A = self.inv_Delta2_A

        fu_0 = 1/2 * gaussian(invA_B, 1, Delta_2 + inv_A) * (1 + erf(omega/sqrt(2*V))) \
            + 1/2 * gaussian(invA_B, -1, Delta_2 + inv_A) * \
            (1 - erf(omega/sqrt(2*V))) 

        term1 = 1/2 * inv_Delta2_A * \
            (1 - invA_B) * gaussian(invA_B, 1, Delta_2 + inv_A) * \
            (1 + erf(omega/sqrt(2*V)))
        term2 = 1/2 * inv_Delta2_A * \
            (-1 - invA_B) * gaussian(invA_B, -1,
                                     Delta_2 + inv_A) * (1 - erf(omega/sqrt(2*V)))
        dfu_0 = term1 + term2
        res = 1 / fu_0 * (dfu_0)**2
        return res
    def fu_2_(self):
        omega = self.omega
        V = self.V
        Delta_2 = self.Delta_2
        inv_A = self.inv_A
        invA_B = self.invA_B
        omega_star = self.omega_star
        V_star = self.V_star

        self.fu_1_()
        fu_0 = self.fu_0
        fu_1 = self.fu_1

        term1 = -inv(V + Delta_2 + inv_A) * \
            (1 + erf(omega_star / sqrt(2 * V_star)))
        term2 = (inv(V + Delta_2 + inv_A) * (omega - invA_B) * 2 /
                 sqrt(2 * pi * V_star) * exp(-1 / 2 * omega_star**2 / V_star) *
                 V_star * inv(Delta_2 + inv_A))
        term3 = - omega_star / V_star * 2 / sqrt(2 * pi * V_star) * \
            exp(-1/2 * omega_star**2 / V_star) * \
            (V_star * inv(Delta_2 + inv_A))**2
        term4 = (inv(V + Delta_2 + inv_A) * (omega - invA_B) *
                 (1 + erf(omega_star / sqrt(2 * V_star))) + 2 /
                 sqrt(2 * pi * V_star) * exp(-1 / 2 * omega_star**2 / V_star) *
                 V_star * inv(Delta_2 + inv_A)) * (inv(V + Delta_2 + inv_A) *
                                                   (omega - invA_B))
        term5 = (inv(Delta_2 + inv_A) - (inv(Delta_2 + inv_A) * invA_B) ** 2) * \
            (1 - erf(omega / sqrt(2 * V)))
        ddfu_0 = 1 / 2 * (gaussian(omega, invA_B, V + Delta_2 + inv_A) *
                          (term1 + term2 + term3 + term4) -
                          gaussian(invA_B, 0, Delta_2 + inv_A) * term5)

        if fu_0 < self.threshold_zero:
            fu_2 = 0
        else:
            fu_2 = inv_A**2 * 1/fu_0 * ddfu_0 + inv_A - \
                invA_B**2 + 2 * invA_B * fu_1 - fu_1**2

        self.fu_2 = fu_2
示例#20
0
 def fu_0_sign_K2(self):
     fu_0 = 0
     for i in range(self.K**2):
         phi_z = self.configuration_binary(i)
         norm = gaussian(self.mu, phi_z, self.Sigma)
         s = phi_z[1]
         borne_inf, borne_sup = self.select_bornes(phi_z[0])
         I = quad(self.integrand_fout, borne_inf, borne_sup,
                  args=(s))[0]
         I *= norm
         fu_0 += I
     self.fu_0 = fu_0
     return self.fu_0
    def fout_gout_(self):
        omega = self.omega
        V = self.V
        Delta_2 = self.Delta_2
        inv_A = self.inv_A
        invA_B = self.invA_B
        V_star = self.V_star
        omega_star = self.omega_star

        fout = 1 / 2 * (gaussian(omega, invA_B, V + Delta_2 + inv_A) *
                        (1 + erf(omega_star / sqrt(2 * V_star))) +
                        gaussian(invA_B, 0, Delta_2 + inv_A) *
                        (1 - erf(omega / sqrt(2 * V))))

        dfout = 1 / 2 * (
            gaussian(omega, invA_B, V + Delta_2 + inv_A) *
            (inv(V + Delta_2 + inv_A) * (invA_B - omega) *
             (1 + erf(omega_star / sqrt(2 * V_star))) +
             2 / sqrt(2 * pi * V_star) * exp(-1 / 2 * omega_star**2 / V_star) *
             V_star * inv_V) + gaussian(invA_B, 0, Delta_2 + inv_A) *
            (-2 / sqrt(2 * pi * V) * exp(-1 / 2 * omega**2 / V)))

        res = 1 / fout * dfout**2
        return res
示例#22
0
    def dgout_(self):
        omega = self.omega
        V = self.V
        Delta_2 = self.Delta_2
        inv_A = self.inv_A
        invA_B = self.invA_B
        inv_V = inv(V)

        self.gout_()
        fout = self.fout
        gout = self.gout

        if self.Nishimori_identity:
            ddfout = 0
        else:
            ddfout = (gaussian(invA_B, 1, Delta_2 + inv_A) - gaussian(invA_B, -1, Delta_2 + inv_A)) * \
                gaussian(omega, 0, V) * (-omega/V)

        if fout < self.threshold_zero:
            dgout = 0
        else:
            dgout = 1/fout * ddfout - gout**2
        self.ddfout = ddfout
        self.dgout = dgout