Skip to content

decode

dict_to_record(results, compiled_model)

convert to jm.Record from dict result

Parameters:

Name Type Description Default
results Iterable[dict[int, int | float]]

dict result

required
compiled_model CompiledInstance

compiled_model to get var_map and fixed_variables.

required

Returns:

Type Description
Record

jm.Record: converted record.

Source code in jijmodeling_transpiler/core/decode/decode.py
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
def dict_to_record(
    results: typ.Iterable[dict[int, int | float]],
    compiled_model: CompiledInstance,
) -> jm.Record:
    """convert to jm.Record from dict result

    Args:
        results (typ.Iterable[dict[int, int  |  float]]): dict result
        compiled_model (CompiledInstance): compiled_model to get var_map and fixed_variables.

    Returns:
        jm.Record: converted record.
    """
    decoded_solutions: dict = {}
    var_map = compiled_model.var_map.var_map
    for label in var_map.keys():
        decoded_solutions[label] = []

    for sample in results:
        decoded_subs: dict[str, tuple[list[int], ...]] = {}
        decoded_values = {label: [] for label in var_map.keys()}
        decoded_shape = {}
        for label, _var_map in var_map.items():
            for subs, var_index in _var_map.items():
                if label not in decoded_subs:
                    decoded_subs[label] = tuple([[] for _ in range(len(subs))])
                if label not in decoded_shape:
                    decoded_shape[label] = tuple([0 for _ in range(len(subs))])
                value = sample.get(var_index, 0.0)
                if value != 0.0:
                    for _i, s in enumerate(subs):
                        decoded_subs[label][_i].append(s)
                    decoded_values[label].append(value)

        for label, fixed_vars in compiled_model.data.fixed_variables.items():
            for subs, value in fixed_vars.items():
                if label not in decoded_subs:
                    decoded_subs[label] = tuple([[] for _ in range(len(subs))])
                if value != 0.0:
                    for _i, s in enumerate(subs):
                        decoded_subs[label][_i].append(s)
                    decoded_values[label].append(value)

        # format to record
        for label in var_map.keys():
            shape_value = compiled_model.deci_var_shape[label]
            shape: tuple[int, ...] = tuple(
                [s if s is not None else 0 for s in shape_value]
            )
            sparse_solution = (
                decoded_subs[label],
                decoded_values[label],
                shape,
            )
            decoded_solutions[label].append(sparse_solution)

    record = jm.Record(solution=decoded_solutions, num_occurrences=[1 for _ in range(len(decoded_solutions))])  # type: ignore
    return record