"""
main_NN.py — Ottimizzazione con Surrogate Neural Network

Script di main per risolvere il problema di assortimento usando una rete neurale surrogata 
al posto del calcolo esplicito del ricorso stocastico.

La NN (già addestrata da train_ML/train_NN.py) viene incorporata come vincolo nel
modello Gurobi tramite la libreria gurobi_ml, sfruttando la struttura ReLU.

Prerequisiti (file .pkl richiesti):
  - surrogate_mlp.pkl   : rete neurale surrogata (MLPRegressor sklearn)
  - scaler_input.pkl    : MinMaxScaler per le quantità y in input alla NN
  - scaler_target.pkl   : StandardScaler per denormalizzare l'output della NN

Come funziona:
  1. prepare_input_data(SAA_flag=False)  : carica i parametri fisici, imponendo SAA_flag=True li ricalcola
  2. AssortmentOptimizer.build_model_NN(): costruisce il modello con la NN 
  3. solve()                             : risolve il modello
  4. export_to_text_NN()                 : scrive il report su file .txt

Output:
  - analisi_risultati_NN.txt    : report con assortimento ottimale e KPI

Parametri da modificare in main():
  - force_recalculate            : flag per stabilire se ricalcolare il file o usare uno già presente
  - nome_file                    : per imposatre il nome del file da usare o svrascrivere
"""

from models import *
from optimization import *
from prepare_data import *

def main():
    data = prepare_input_data(force_recalculate=False, SAA_flag=False,nome_file='dati_progetto_NN.pkl') #funzione in prepare_data.py: importa il dataset dei prodotti, definisce le costatnti del modello di ottimizzazione, genera le probabilità richiamando le classi del simulazione e fornisce come output tutti i valori utili: in questo caso serviranno solo gli elementi che definiscono la simulazione e non gli scenari

    #istanziamo la classe dell'ottimizzazione e richiamamo i moetodi associati al modello surrogato
    optimiz = AssortmentOptimizer(data["base"]["prodotti_tab"], data["base"]["sub_matrix"], data["base"]["prezzi"], data["base"]["cost"], data["base"]["holding"], data["base"]["capacita_scaffale_dict"], data["base"]["capacita_frigo_dict"], data["base"]["costo_fisso_scaffale"], data["base"]["penalty_lost_sales"], data["base"]["penale_SL"], data["base"]["SL_target"], flag_shelf=True)
    optimiz.build_model_NN(mlp_path='surrogate_mlp.pkl', scaler_path_target='scaler_target.pkl', scaler_path_input='scaler_input.pkl', write=False)
    if optimiz.solve(model=optimiz.models["nn"]):
        optimiz.export_to_text_NN()
        optimiz.close_model("nn")

if __name__ == "__main__":
    main()
