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
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
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
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
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
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
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
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
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
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
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
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
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
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
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