Ejemplo n.º 1
0
def _null_prev_day_values(layout: Layout, last_update: str = None):
    null_by_date = pd.Timestamp.now(
    ) if last_update is None else pd.Timestamp.strptime(
        last_update, DATE_FORMAT)
    required_idxs = [[] for _ in range(layout.width)]
    for i in range(layout.data.shape[0]):
        if pd.isnull(layout.data[layout_config.IN_PLACES_COL][i]):
            continue
        current_idx = i % layout.width
        now_delta = (null_by_date -
                     layout.data[layout_config.IN_DATES_COL][i]).days
        if now_delta <= 0:
            break
        for j in range(i, min(i + layout.max_days + 1, layout.data.shape[0])):
            delta = (layout.data[layout_config.OUT_DATES_COL][j] -
                     layout.data[layout_config.IN_DATES_COL][i]).days
            if np.isnan(delta) or delta < layout.min_days:
                continue
            if delta > layout.max_days:
                break
            if pd.isnull(layout.data[layout_config.OUT_PLACES_COL][j]):
                continue
            required = layout.data[get_required_col(current_idx)][j]
            if not required:
                required_idxs[current_idx].append(j)
    for i in range(layout.width):
        layout.data[get_required_col(i)][required_idxs[i]] = True
        layout.data[get_layout_col(i)][required_idxs[i]] = 0
Ejemplo n.º 2
0
def _update_required_fields_with_col_priorities(
        new_layout_obj: core_layout.Layout, old_layout_obj: core_layout.Layout,
        avail_in_places, avail_out_places, old_avail_in_places,
        old_avail_out_places):
    required_idxs = [[] for _ in range(old_layout_obj.width)]
    required_values = [[] for _ in range(old_layout_obj.width)]
    for i in range(old_layout_obj.data.shape[0]):
        if avail_in_places[i] is None or old_avail_in_places[
                i] is None or old_avail_in_places == 0:
            continue
        coef = avail_in_places[i] / old_avail_in_places[i]
        current_idx = i % old_layout_obj.width
        for j in range(
                i,
                min(i + old_layout_obj.max_days + 1,
                    old_layout_obj.data.shape[0])):
            delta = (old_layout_obj.data[OUT_DATES_COL][j] -
                     old_layout_obj.data[IN_DATES_COL][i]).days
            if np.isnan(delta) or delta < old_layout_obj.min_days:
                continue
            if delta > old_layout_obj.max_days:
                break
            if avail_out_places[j] is None or old_avail_out_places[j] is None:
                continue
            amount = old_layout_obj.data[get_layout_col(current_idx)][j]
            required = old_layout_obj.data[get_required_col(current_idx)][j]
            if required:
                new_amount = int(amount * coef)
                required_values[current_idx].append(new_amount)
                required_idxs[current_idx].append(j)
    for i in range(old_layout_obj.width):
        new_layout_obj.data[get_required_col(i)][required_idxs[i]] = True
        new_layout_obj.data[get_layout_col(i)][required_idxs[i]] = np.array(
            required_values[i])
Ejemplo n.º 3
0
def _satisfy_ub_reqs(layout: Layout, avail_out_places):
    height = layout.data.shape[0]
    required_idxs = [[] for _ in range(layout.width)]
    required_values = [[] for _ in range(layout.width)]
    for i in range(height):
        if pd.isnull(avail_out_places[i]):
            continue
        col_idxs = []
        col_values = []
        used_sum = 0
        for j in range(layout.width):
            amount = layout.data[get_layout_col(j)][i]
            required = layout.data[get_required_col(j)][i]
            if not required and not pd.isnull(amount):
                col_idxs.append(j)
                col_values.append(int(amount))
                used_sum += int(amount)
        if used_sum <= avail_out_places[i]:
            continue
        coef = avail_out_places[i] / used_sum
        for idx, old_value in zip(col_idxs, col_values):
            required_values[idx].append(int(old_value * coef))
            required_idxs[idx].append(i)
    for i in range(layout.width):
        layout.data[get_layout_col(i)][required_idxs[i]] = np.array(
            required_values[i])
Ejemplo n.º 4
0
def _set_initial_values(layout: Layout, avail_in_places, corr_relations,
                        vars_num):
    height = layout.data[layout_config.IN_PLACES_COL].shape[0]
    init_values = [[] for _ in range(layout.width)]
    init_idxs = [[] for _ in range(layout.width)]
    for i in range(height):
        cur_idx = i % layout.width
        cur_init_values = [
            int(pr *
                avail_in_places[i]) if avail_in_places[i] is not None else None
            for pr in corr_relations[i]
        ]
        for j in range(i, min(i + layout.max_days + 1, height)):
            delta = (layout.data[layout_config.OUT_DATES_COL][j] -
                     layout.data[layout_config.IN_DATES_COL][i]).days
            if np.isnan(delta) or delta < layout.min_days:
                continue
            if delta > layout.max_days:
                break
            cur_init_idx = delta - layout.min_days
            if not layout.data[get_required_col(cur_idx)][j]:
                init_idxs[cur_idx].append(j)
                init_values[cur_idx].append(cur_init_values[cur_init_idx])
    for i in range(layout.width):
        layout.data[get_layout_col(i)][init_idxs[i]] = np.array(init_values[i])
    return vars_num
Ejemplo n.º 5
0
def _update_required_fields_with_row_priorities(
        new_layout_obj: core_layout.Layout, old_layout_obj: core_layout.Layout,
        avail_out_places, old_avail_out_places):
    required_idxs = [[] for _ in range(old_layout_obj.width)]
    required_values = [[] for _ in range(old_layout_obj.width)]
    for i in range(old_layout_obj.data.shape[0]):
        if avail_out_places[i] is None or old_avail_out_places[i] == 0:
            continue
        col_idxs = []
        col_values = []
        new_col_values = []
        used_sum = 0
        for j in range(new_layout_obj.width):
            old_amount = old_layout_obj.data[get_layout_col(j)][i]
            new_amount = new_layout_obj.data[get_layout_col(j)][i]
            required = old_layout_obj.data[get_required_col(j)][i]
            if required:
                col_idxs.append(j)
                col_values.append(int(old_amount))
                new_col_values.append(int(new_amount))
                used_sum += int(new_amount)
        if used_sum <= avail_out_places[i]:
            continue
        coef = avail_out_places[i] / old_avail_out_places[i]
        for idx, old_value, new_value in zip(col_idxs, col_values,
                                             new_col_values):
            required_values[idx].append(min(int(old_value * coef), new_value))
            required_idxs[idx].append(i)
    for i in range(old_layout_obj.width):
        new_layout_obj.data[get_layout_col(i)][required_idxs[i]] = np.array(
            required_values[i])
Ejemplo n.º 6
0
def generate_layout(initial_data_filename, min_days, max_days, duration_limit, relations, width, name, id):
    initial_data = read_excel(initial_data_filename)
    # layout = pd.DataFrame()
    try:
        layout = _get_layout_data_from_file(initial_data, name)
        # layout[layout_config.IN_DATES_COL] = initial_data[init_config.IN_DATES_COL]
        # layout[layout_config.IN_PLACES_COL] = initial_data[init_config.IN_PLACES_COL]
        for i in range(width):
            layout = layout.assign(**{get_layout_col(i): layout[layout_config.IN_PLACES_COL].apply(lambda _: None)})
        # layout[layout_config.OUT_PLACES_COL] = initial_data[init_config.OUT_PLACES_COL]
        # layout[layout_config.OUT_DATES_COL] = initial_data[init_config.OUT_DATES_COL]
        for i in range(width):
            layout = layout.assign(**{get_required_col(i): layout[layout_config.IN_PLACES_COL].apply(lambda _: False)})
        date_relations = [None for _ in layout[layout_config.IN_DATES_COL]]
        out_of_order = [[] for _ in layout[layout_config.IN_DATES_COL]]
        no_losses = [[False, False] for _ in layout[layout_config.IN_DATES_COL]]
    except KeyError:
        raise WRONG_EXCEL_FORMAT_ERROR

    layout_obj = Layout(name, layout, date_relations, out_of_order, None, no_losses, duration_limit=duration_limit,
                        width=width, max_days=max_days, min_days=min_days, relations=relations, id=id)

    return layout_obj