import numpy as np

from tensorflow import keras
from mu import *
from n2ulayer import ulayer

from loss import loss



def choosenext(given,possble):
    """given is a list of scores. possble is a list of list of scores. We want to find the combination of elements in possble that has the lowest correlation to given"""
    opt=len(possble)
    np.random.shuffle(possble)
    possble=np.transpose(possble)
    given=np.expand_dims(given,axis=1)


    #print("given",given.shape)
    #print("possble",possble.shape)
    #print(loss(given,possble,K=np))
    #exit()
    inp=keras.layers.Input(shape=possble.shape[1:])
    q=inp
    #q=ulayer(opt,0,1)(q)
    q=partr(q,1,opt,ulayer)

    model=keras.models.Model(inputs=inp,outputs=q)
    model.compile(loss=loss,optimizer=keras.optimizers.Adam(lr=0.001))
    model.summary()

    model.fit(possble,given,
                batch_size=32,
                epochs=100,
                verbose=1,
                validation_split=0.0,#that stuff cant overfit
                shuffle=True,
                callbacks=[keras.callbacks.EarlyStopping(monitor='loss',patience=10,restore_best_weights=True)])




    return model.predict(possble)


if __name__=="__main__":
    f=np.load("merged.npz")
    x=f["ps"]
    given=x[0]
    possble=x[1:5]
    choosenext(given,possble)



