def regularize_coarse(lenses, coarse_costs, disparities, penalty1=0.08, penalty2=0.15, max_cost=10.0):

    intensity_grid = dict()
    tmp_costs = dict()
    coarse_disp = dict()

    for lcoord in lenses:
        intensity_grid[lcoord] = np.mean(lenses[lcoord].img[lenses[lcoord].mask > 0])

    sgm_cost = rtxsgm.hex_sgm(coarse_costs, intensity_grid, penalty1, penalty2, max_cost=max_cost)
    
    for lcoord in sgm_cost:
        coarse_disp[lcoord], _ = rtxdisp.cost_minimum_interp(sgm_cost[lcoord], disparities)
    return coarse_disp
def real_lut(lens,
             lenses,
             coarse_costs,
             disparities,
             max_cost=10.0,
             nb_args=None):

    # get some parameters
    target_lenses = list(nb_args['target_lenses'].values())
    min_disp = nb_args['min_disp']
    max_disp = nb_args['max_disp']
    trade_off = nb_args['trade_off']

    # LUT to pick best combination or best performances
    B = np.array([[np.sqrt(3) / 2, 0.5], [0, 1]]).T

    #assert len(coarse_costs) <= len(target_lenses)

    offsets = []

    tref = rtxhexgrid.hex_focal_type(lens.lcoord)

    #read the lut
    lut_filename = '../disparity/lut_table.json'
    with open(lut_filename, 'r') as f:
        lut_str = json.load(f)

    lut_length = len(lut_str['most_acc_0'])
    lut_step = (max_disp - min_disp) / lut_length
    mavg = 0
    mvavg = 0
    counter = 0

    for i, ctmp in enumerate(coarse_costs):

        m, mval = rtxdisp.cost_minimum_interp(ctmp, disparities)

        mvavg += mval
        mavg += m
        counter += 1

    # m avg should be the value for the disparity
    mavg /= (counter)
    mvavg /= counter

    # look for the correct index
    disp_int = lut_str['disp_int_interp']
    disp_int['0'][0] = 20.0  #disparities[len(disparities)-1]
    disp_int[str(len(disp_int) - 1)][1] = 0.0
    disp_vals = lut_str['disp_vals_interp']
    found = False
    finished = False
    jj = 0
    while (not found and not finished):
        if jj >= len(disp_int):
            finished = True
            jj = 0
        elif mavg < disp_int[str(jj)][0] and mavg > disp_int[str(jj)][1]:
            found = True
        else:
            jj += 1

    ### need to show somehow if I didn't find it
    #if (finished and not found):
    #print("Not found! \nmavg={0}\ndisp_int={1}\ndisp_vals={2}\n".format(mavg, disp_int, disp_vals))
    index_lut = jj  #lut_length - math.floor(m / (lut_step))
    #print("m:{0}, mval:{1}, index:{2}".format(mavg, mvavg, jj))

    if trade_off == 1:
        if tref == 0:
            strat = lut_str['most_acc_0'][index_lut]
        elif tref == 1:
            strat = lut_str['most_acc_1'][index_lut]
        elif tref == 2:
            strat = lut_str['most_acc_2'][index_lut]
    elif trade_off == 0:
        if tref == 0:
            strat = lut_str['best_perf_0'][index_lut]
        elif tref == 1:
            strat = lut_str['best_perf_1'][index_lut]
        elif tref == 2:
            strat = lut_str['best_perf_2'][index_lut]

    targets = from_strat_to_offsets(strat)

    return targets, mavg