import numpy as np
import experiment_loader
import matplotlib
from fitensemble import belt
matplotlib.rcParams.update({'font.size': 20})

alpha = 0.2
num_grid = 500
phi = np.linspace(-180,180,num_grid)
O = np.ones(num_grid)
colors = ["b","g","r","y"]

simulation_data = {}

ff = "amber99"  # Load FF data for comparison, not used in actual figure
phi1, psi1, ass_raw, state_ind = experiment_loader.load_rama(ff, 1)

J = scalar_couplings.J3_HN_HA(phi)

predictions, measurements, uncertainties = experiment_loader.load(ff, keys=[("JC", 2, "J3_HN_HA")])
yi = measurements.iloc[0]
oi = uncertainties.iloc[0]

factor = 1.0
regularization_strength = 0.2
model = belt.MaxEntBELT(predictions.values, measurements.values, factor * uncertainties.values, regularization_strength)
model.sample(5000)

#obs = belt.

ai = model.mcmc.trace("alpha")[:]
import sys
import ALA3

ff = "amber96"

effective_counts = 1000.0
num_bins = 0
num_states = num_bins ** 2
prior = "BW%d" % num_bins

directory = "%s/%s" % (ALA3.data_dir, ff)
out_dir = directory + "/models-%s/" % prior
pymc_filename = out_dir + "/model.h5"

predictions, measurements, uncertainties = experiment_loader.load(ff, stride=ALA3.stride)
phi, psi, ass_raw, state_ind = experiment_loader.load_rama(ff, ALA3.stride)
num_frames, num_measurements = predictions.shape

if num_bins != 0:
    assignments = schwalbe_couplings.assign_grid(phi, psi, num_bins)[2]
else:
    assignments = ass_raw

prior_state_pops = np.bincount(assignments).astype("float")
prior_state_pops /= prior_state_pops.sum()
prior_state_pops *= effective_counts

ALA3.bw_num_samples = 10000
model = bayesian_weighting.BayesianWeighting(
    predictions.values, measurements.values, uncertainties.values, assignments, prior_state_pops=prior_state_pops
)
from fitensemble import lvbp
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import ALA3
import experiment_loader

ff = "amber99"
prior = "maxent"
regularization_strength = ALA3.regularization_strength_dict[prior][ff]
#regularization_strength = 5.0

data_directory = "/%s/%s/" % (ALA3.data_dir, ff)
model_directory = "/%s/%s/models-%s/" % (ALA3.data_dir, ff, prior)
#model_directory = "/%s/%s/models-all-expt-%s/" % (ALA3.data_dir, ff, prior)

predictions, measurements, uncertainties = experiment_loader.load(data_directory)
phi, psi, ass_raw, state_ind = experiment_loader.load_rama(data_directory, 1)
lvbp_model = lvbp.LVBP.load(model_directory + "/reg-%d-BB0.h5" % regularization_strength)

#p = np.loadtxt(model_directory + "reg-%d-frame-populations.dat" % regularization_strength)
a = lvbp_model.mcmc.trace("alpha")[:]
plot(a[:,0])
import numpy as np
from fitensemble import bayesian_weighting, belt
import experiment_loader
import ALA3

prior = "BW"
ff = "amber96"
stride = 1000
regularization_strength = 10.0

thin = 400
factor = 50
steps = 1000000

predictions_framewise, measurements, uncertainties = experiment_loader.load(ff, stride=stride)
phi, psi, ass_raw0, state_ind0 = experiment_loader.load_rama(ff, stride)

num_states = len(phi)
assignments = np.arange(num_states)

prior_pops = np.ones(num_states)

predictions = pd.DataFrame(bayesian_weighting.framewise_to_statewise(predictions_framewise, assignments), columns=predictions_framewise.columns)
model = bayesian_weighting.MaxentBayesianWeighting(predictions.values, measurements.values, uncertainties.values, assignments, regularization_strength)
model.sample(steps * factor, thin=thin * factor)

model2 = belt.MaxEntBELT(predictions.values, measurements.values, uncertainties.values, regularization_strength)
model2.sample(steps, thin=thin)

pi = model.mcmc.trace("matrix_populations")[:, 0]