def log_prob(theta):
    mol_radii, mol_scales = construct_arrays(theta)
    if min(theta) < 0.001 or max(theta) > 2:
        print('out of bounds!')
        return -np.inf
    logp = 0
    for i in range(len(mols)):
        radii = mol_radii[i]
        scales = mol_scales[i]
        W_F = np.array([
            compute_OBC_energy_vectorized(distance_matrix, radii, scales,
                                          charges[i])
            for distance_matrix in distance_matrices[i]
        ])
        w_F = W_F * kj_mol_to_kT
        pred_free_energy = one_sided_exp(w_F)

        if gaussian_ll:
            logp += norm.logpdf(pred_free_energy,
                                loc=expt_means[i],
                                scale=expt_uncs[i]**2)
        else:
            logp += student_t.logpdf(pred_free_energy,
                                     loc=expt_means[i],
                                     scale=expt_uncs[i],
                                     df=7)
    return logp
示例#2
0
def log_prob(theta):
    L = log_prior(theta)
    if not (L > -np.inf):
        return L
    else:
        parameterized_list = construct_arrays(theta)

        for i in range(len(mols)):
            radii, scales = parameterized_list[i]
            W_F = np.array([
                compute_OBC_energy_vectorized(distance_matrix, radii, scales,
                                              charges[i])
                for distance_matrix in distance_matrices[i]
            ])
            w_F = W_F * kj_mol_to_kT
            pred_free_energy = one_sided_exp(w_F)

            if ll == 'gaussian':
                L += norm.logpdf(pred_free_energy,
                                 loc=expt_means[i],
                                 scale=expt_uncs[i]**2)
            else:
                L += student_t.logpdf(pred_free_energy,
                                      loc=expt_means[i],
                                      scale=expt_uncs[i]**2,
                                      df=7)
    return L