def __init__()

in optimizer.py [0:0]


    def __init__(self, job_data_access_df,
                 workload_print_info,
                 db_table_size_file_name,
                 rep_threshold=None,
                 rep_strategy="",
                 yugong=False,
                 ownership=None,
                 rep_list=None,
                 k=1.0,
                 log_dir='.',
                 ):
        self.df = None
        self.previous_placement_path = None
        self.prev_z = None
        self.prev_w = None

        self.db_table_num = None
        self.abFP_num = None
        self.total_storage_gb = None
        self.dataset_num = None

        self.job_data_access_df = job_data_access_df
        self.workload_print_info = workload_print_info
        print("workload info", workload_print_info)
        self.db_table_size_path = db_table_size_file_name
        print("db_table_size path", db_table_size_file_name)

        self.rep_threshold = rep_threshold
        self.rep_strategy = rep_strategy
        self.rep_constr = []
        self.rep_list = []

        self.yugong = yugong
        self.ownership = None
        if yugong:
            print("** Yugong mode **")
            assert ownership is not None, "Ownership must be provided in Yugong mode"
            assert rep_list is not None, "Replication list must be provided in Yugong mode (to align with Moirai)"
            self.ownership = ownership
            self.rep_list = rep_list

        self.s = None
        self.adj_list_input = defaultdict(dict)  # Maps table id -> {job id: input_size}
        self.adj_list_output = defaultdict(dict)  # Maps table id -> {job id: output_size}
        self.c = None

        self.k = k
        self.X_scale = 0
        self.load_workload()
        assert self.X_scale > 0

        self.df_table_size = None
        self.prepare_db_table_size(db_table_size_file_name)
        assert self.df_table_size is not None

        self.unique_abFP = {}
        self.unique_db_tables = self.prepare_replication()
        self.prepare_workload()

        self.model = None  # gurobi model
        self.prepare_basic_model()
        self.y, self.z, self.w, self.u, self.v = (None, None, None, None, None)

        self.log_dir = log_dir
        self.add_y_z_w_u_v(self.abFP_num, self.dataset_num, True, log_dir=log_dir)
        self.workload_constrs = self.add_workload_constr()