"""
main_SAA.py — Ottimizzazione con Sample Average Approximation (SAA)

Script di main per risolvere il problema di assortimento con l'approccio SAA.

Come funziona:
  1. prepare_input_data()                   : funzione che carica/genera gli scenari di domanda e i parametri fisici
  2. AssortmentOptimizer.build_model_SAA()  : costruisce il MILP in Gurobi
  3. solve()                                : risolve il modello
  4. export_to_text_SAA()                   : scrive il report su file .txt

Output:
  - analisi_risultati_seed*.txt : report con assortimento ottimale, KPI, sostituzioni medie

Parametri da modificare in main():
  - used_seed            : seed per la riproducibilità degli scenari
  - n_scenari_domanda_SAA: numero di scenari  
  - 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=True,used_seed=6791, n_scenari_domanda_SAA=100, nome_file="") #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 sia di mercato che di scenario

    #istanziamo la classe dell'ottimizzazione e richiamamo i moetodi associati al modello SAA
    optimizer=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)
    optimizer.build_model_SAA(data["saa_input"]["demand_weekly"],data["saa_input"]["scenario_prob"],gap=True,write=False)
    if optimizer.solve(model=optimizer.models["saa"]):
        optimizer.export_to_text_SAA(data["saa_input"]["demand_weekly"],file_mean="analisi_risultati_seed6791.txt")
        optimizer.close_model("saa")

if __name__ == "__main__":
    main()






