diff --git a/dc-opf/SD_relax_test.py b/dc-opf/SD_relax_test.py new file mode 100644 index 00000000..8b4b8f0c --- /dev/null +++ b/dc-opf/SD_relax_test.py @@ -0,0 +1,552 @@ +import marimo + +__generated_with = "0.15.0" +app = marimo.App(width="medium") + + +@app.cell +def _(cp, np): + def make_problem(incidence_mat, generator_dict, load_dict, flow_dict): + def indices_not_in_list(array_length, given_indices): + all_indices = set(range(array_length)) + given_indices_set = set(given_indices) + not_in_list_indices = all_indices - given_indices_set + return list(not_in_list_indices) + _B = incidence_mat + _A = np.abs(_B) @ np.abs(_B.T) - np.diag(np.diag(np.abs(_B) @ np.abs(_B.T))) + _yij = 1/(np.array([_v['r'] for _k, _v in flow_dict.items()]) + 1j * np.array([_v['x'] for _k, _v in flow_dict.items()])) + num_buses = _B.shape[0] + num_edges = _B.shape[1] + _Y = np.zeros((num_buses, num_buses), dtype=complex) + for _idx, _edge in enumerate(_B.T): + _i, _j = np.where(_edge==-1)[0], np.where(_edge==1)[0] + _Y[_i, _j] = _yij[_idx] + _Y[_j, _i] = _yij[_idx] + _YH = _Y.conjugate().T + gen_ixs = np.array(list(generator_dict.keys())) - 1 + nogen_ixs = indices_not_in_list(num_buses, gen_ixs) + # p_flows = cp.Variable((num_edges), name='line flows') + p_gen = cp.Variable((num_buses), nonneg=True, name='p_gen') + p_load = cp.Variable((num_buses), nonneg=True, name='p_load') + q_bus = cp.Variable((num_buses), name='q_bus') + V = cp.Variable((num_buses, num_buses), complex=True, name='V', PSD=True) + P = cp.Variable((num_buses, num_buses), name='P') + Q = cp.Variable((num_buses, num_buses), name='P') + l_min = cp.Parameter( + shape=num_buses, + value=[_v['l_min'] for _k, _v in load_dict.items()], + name='l_min' + ) + l_upper = cp.Parameter( + shape=num_buses, + value=[_v['l_upper'] for _k, _v in load_dict.items()], + name='l_upper' + ) + # l_cost = cp.Parameter( + # shape=num_buses, + # value=[_v['cost'] for _k, _v in load_dict.items()], + # name='l_cost' + # ) + l_cost = [_v['cost'] for _k, _v in load_dict.items()] + g_min = cp.Parameter( + shape=len(gen_ixs), + value=np.array([_v['p_min'] for _k, _v in generator_dict.items()]), + name='g_min' + ) + g_max = cp.Parameter( + shape=len(gen_ixs), + value=np.array([_v['p_max'] for _k, _v in generator_dict.items()]), + name='g_max' + ) + c0 = cp.Parameter( + shape=len(gen_ixs), + value=np.array([_v['c0'] for _k, _v in generator_dict.items()]), + name='c0' + ) + c1 = cp.Parameter( + shape=len(gen_ixs), + value=np.array([_v['c1'] for _k, _v in generator_dict.items()]), + name='c1' + ) + # c2 = cp.Parameter( + # shape=len(gen_ixs), + # value=np.array([_v['c2'] for _k, _v in generator_dict.items()]), + # name='c2' + # ) + c2 = np.array([_v['c2'] for _k, _v in generator_dict.items()]) + r = cp.Parameter( + shape=num_edges, + value=np.array([_v['r'] for _k, _v in flow_dict.items()]), + name='line resistance' + ) + f_max = cp.Parameter( + shape=num_edges, + value=np.array([_v['f_max'] for _k, _v in flow_dict.items()]), + name='line capacities' + ) + # generator costs + cost = cp.sum(c0 + cp.multiply(c1, p_gen[gen_ixs]) + cp.multiply(c2, cp.square(p_gen[gen_ixs]))) + # load curtailment costs + cost += cp.sum( + cp.multiply( + cp.neg(p_load - l_upper), + l_cost + ) + ) + # line penalties + cost += cp.sum_squares(cp.multiply(r, P)) + constraints = [ + (p_gen - p_load) + 1j * q_bus == cp.diag(V @ _YH), + cp.sum(P, axis=1) == p_gen - p_load, + cp.sum(Q, axis=1) == q_bus, + cp.multiply(P, 1 - _A) == 0, + cp.multiply(Q, 1 - _A) == 0, + p_load >= l_min, + cp.abs(P) <= f_max, + p_gen[nogen_ixs] == 0, + p_gen[gen_ixs] <= g_max, + p_gen[gen_ixs] >= g_min, + cp.real(cp.diag(V)) >= 0.9, + cp.real(cp.diag(V)) <= 1.1, + cp.imag(cp.diag(V)) == 0, + cp.real(V) == cp.real(V.T), + cp.imag(V) == -cp.imag(V.T) + ] + problem = cp.Problem(cp.Minimize(cost), constraints) + return problem + return (make_problem,) + + +@app.cell +def _(mo): + mo.md( + """ + # DC Optimal Power Flow + + This notebook demonstrates the optimal flow problem, over 6 test networks provided by [pypower](https://github.com/rwl/PYPOWER). + + - network with $n$ nodes, $m$ edges, given by $n \\times m$ incidence + matrix $A$ + - edge power vector $p \\in \\mathbf{R}^m$, + with capacity limits $|p_j| \\leq C_j$ + - node generator power $g_i$, load $l_i$, + each with lower and upper limits + - flow conservation $Af + g = l$ + - generator cost function is + $\\phi_i(g_i) = a_i g_i + b_i g_i^2$, total $G= \\sum_i \\phi_i (g_i)$ + - load shortfall cost is $\\psi_i(l_i) = c_i(l^\\text{tar}_i-l_i)_+$, + total is $S = \\sum_i \\psi_i(l_i)$ + - total line loss is $L = \\sum_j r_j p_j^2$ + - objective is $G + \\lambda L + \\mu S$ + + The model automatically populates parameters for the generators, loads, and lines, with the sliders set to the default values for the test case. Users may try adjusting these values with the sliders to see how it changes the optimal flow. + """ + ) + return + + +@app.cell(hide_code=True) +def _(mo, os, re): + # model loading widget + _list = sorted( + [x for x in os.listdir(".") if re.match("case.+.py",x)], # get only "case*.py" + key=lambda x: int(re.sub("[^0-9]*([0-9]+)[^0-9]*", r"\1", x, 1)), # sort by numerical order not lexical + ) + _options = {os.path.splitext(x)[0]: x for x in _list} + model_ui = mo.ui.dropdown( + options=_options, value=os.path.splitext(_list[0])[0], label='select model:' + ) + return (model_ui,) + + +@app.cell(hide_code=True) +def _(model_ui, os): + # import model from file + from importlib.machinery import SourceFileLoader + _n = model_ui.value.split('.')[0] + model_loader = SourceFileLoader(_n, os.path.join(".",model_ui.value)).load_module() + load_model = getattr(model_loader, _n) + model_data = load_model() + return (model_data,) + + +@app.cell(hide_code=True) +def _(model_data): + # define network + num_buses = model_data['bus'].shape[0] + lines = [(int(_b[0]), int(_b[1])) for _b in model_data['branch']] + return lines, num_buses + + +@app.cell(hide_code=True) +def _(both, gen_only, lines, load_only): + # build graph + graph = ["flowchart LR"] + for _ix, _l in enumerate(lines): + _f = _l[0] + _t = _l[1] + graph.append(f" {_f:.0f}(({_f})) == {_ix+1} === {_t:.0f}(({_t}))") + graph = "\n".join(graph) + graph += '''\n + classDef gen stroke-dasharray: 5 5;\n + classDef load fill:#f9f;\n + classDef genload stroke-dasharray: 5 5,fill:#f9f;''' + if len(load_only) > 0: + _str = ",".join([str(int(_i)) for _i in load_only]) + graph += "\n class "+_str+" gen;" + if len(gen_only) > 0: + _str = ",".join([str(int(_i)) for _i in gen_only]) + graph += "\n class "+_str+" load;" + if len(both) > 0: + _str = ",".join([str(int(_i)) for _i in both]) + graph += "\n class "+_str+" genload;" + return (graph,) + + +@app.cell(hide_code=True) +def _(lines, np, num_buses, sns): + # define incidence matrix + B = np.zeros((num_buses, len(lines))) + for _ix, _l in enumerate(lines): + B[_l[0]-1, _ix] = -1 + B[_l[1]-1, _ix] = 1 + fig_heatmap = sns.heatmap(B, cmap='bwr', center=0) + return B, fig_heatmap + + +@app.cell +def _(model_data, model_ui, np): + # construct dictionaries for problem formulation + def merge_nested_dicts(dict1, dict2): + result = {} + + for key in dict1.keys() | dict2.keys(): + inner_dict1 = dict1.get(key, {}) + inner_dict2 = dict2.get(key, {}) + + # Merge the inner dictionaries + merged_inner_dict = {**inner_dict1, **inner_dict2} + + result[key] = merged_inner_dict + + return result + # minimum generation value occaisonally negative + generator_dict1 = {int(_g[0]): {'p_min': np.clip(_g[9], 0, np.inf), 'p_max': _g[8]*2} for _g in model_data['gen']} + generator_dict2 = {int(model_data['gen'][_ix, 0]): {'c0': _g[-1], 'c1': _g[-2], 'c2': _g[-3]} for _ix, _g in enumerate(model_data['gencost'])} + generator_dict = merge_nested_dicts(generator_dict1, generator_dict2) + # power demand is occaisonally negative + # load_dict = {int(_l[0]): {'l_min': 0, 'l_upper': np.abs(_l[2]), 'cost': 250} for _l in model_data['bus']} + load_dict = {int(_l[0]): {'l_min': np.abs(_l[2]*0.5), 'l_upper': np.abs(_l[2]), 'cost': 1e4} for _l in model_data['bus']} + _fmax = 20 * np.max([np.max(_b[5:7]) for _b in model_data['branch']]) + + flow_dict = {} + for _ix, _b in enumerate(model_data['branch']): + _fx = np.max(_b[5:7]) + flow_dict[_ix] = {'r': _b[2], 'x': _b[3], 'b': _b[4], 'g': _b[2] / (_b[2]**2 + _b[3]**2)} + if model_ui.value == 'case14.py': + flow_dict[_ix]['f_max'] = 175 + elif _fx > 0: + flow_dict[_ix]['f_max'] = _fx + else: + flow_dict[_ix]['f_max'] = _fmax + line_resistance = model_data['branch'][:, 2] + return flow_dict, generator_dict, load_dict + + +@app.cell(hide_code=True) +def _(model_data, np): + # label nodes + generator_nodes = model_data['gen'][:, 0] + load_nodes = np.where(model_data['bus'][:, 2] != 0)[0] + 1 + set_gen_nodes = set(generator_nodes) + set_load_nodes = set(load_nodes) + gen_only = np.asarray(list(set_gen_nodes.difference(set_load_nodes))) + load_only = np.asarray(list(set_load_nodes.difference(set_gen_nodes))) + both = np.asarray(list(set_gen_nodes.intersection(set_load_nodes))) + return both, gen_only, load_only + + +@app.cell +def _(model_ui): + model_ui + return + + +@app.cell(hide_code=True) +def _(fig_heatmap, generator_dict, graph, load_dict, mo): + mo.ui.tabs({ + 'graph': mo.mermaid(graph), + 'incidence matrix': fig_heatmap, + 'generators': mo.accordion({str(_k): _v for _k, _v in generator_dict.items()}), + 'loads': mo.accordion({str(_k): _v for _k, _v in load_dict.items()}) + }) + return + + +@app.cell +def _(flow_limits, gen_limits, load_limits, mo): + mo.hstack([load_limits, gen_limits, flow_limits]) + return + + +@app.cell +def _(B, flow_dict, generator_dict, load_dict, make_problem): + problem = make_problem(B, generator_dict, load_dict, flow_dict) + return (problem,) + + +@app.cell(hide_code=True) +def _(flow_limits, gen_limits, load_limits, mo, np, problem): + # solve with updated parameters + am_solving = True + problem.param_dict['g_min'].value = [_v[0] for _v in gen_limits.value] + problem.param_dict['g_max'].value = [_v[1] for _v in gen_limits.value] + problem.param_dict['l_min'].value = [_v[0] for _v in load_limits.value] + problem.param_dict['l_upper'].value = [_v[1] for _v in load_limits.value] + problem.param_dict['line capacities'].value = flow_limits.value + obj_val = problem.solve(verbose=True, solver='CLARABEL') + constrained_lines = np.where(~np.isclose(problem.constraints[2].dual_value, 0, atol=1e-2))[0] + mo.md(f'objective value: {obj_val:.2f}') + return am_solving, constrained_lines + + +@app.cell +def _(am_solving, np, problem): + am_solving + evals, evecs = np.linalg.eig(problem.var_dict['V'].value) + return (evals,) + + +@app.cell +def _(am_solving, evals): + am_solving + evals + return + + +@app.cell +def _(am_solving, problem): + am_solving + problem.var_dict['V'].value + return + + +@app.cell +def _(np, problem, sns): + sns.heatmap(np.imag(problem.var_dict['V'].value), cmap='seismic', center=0) + return + + +@app.cell +def _(np, problem): + Vnew = np.imag(problem.var_dict['V'].value) + 1j * np.real(problem.var_dict['V'].value) + np.allclose(Vnew, Vnew.conjugate().T) + return (Vnew,) + + +@app.cell +def _(Vnew, np): + np.isclose(Vnew, Vnew.conjugate().T) + return + + +@app.cell +def _(problem): + problem.var_dict['V'].value - (problem.var_dict['V'].value).conjugate().T + return + + +@app.cell +def _(bus_power_fig, mo, solution, solution2): + mo.ui.tabs({ + 'bus power': bus_power_fig, + 'line flows': mo.mermaid(solution), + 'line flows ordered': mo.mermaid(solution2) + }) + return + + +@app.cell(hide_code=True) +def _(generator_dict, mo, np): + # generator ui + _max = np.ceil(1.5*np.max([_v['p_max'] for _k, _v in generator_dict.items()])) + gen_limits = mo.ui.array([mo.ui.range_slider(start=0, + stop=_max, + label=f'gen {_ix}', + value=[_gen['p_min'], _gen['p_max']], + debounce=True, + show_value=True) + for _ix, _gen in generator_dict.items()], label='generator limits') + return (gen_limits,) + + +@app.cell(hide_code=True) +def _(load_dict, mo, np): + # load ui + _max = np.ceil(1.5*np.max([_v['l_upper'] for _k, _v in load_dict.items()])) + load_limits = mo.ui.array([mo.ui.range_slider(start=0, + stop=_max, + label=f'load {_ix}', + value=[_load['l_min'], _load['l_upper']], + debounce=True, + show_value=True,) + for _ix, _load in load_dict.items()], label='load limits') + return (load_limits,) + + +@app.cell(hide_code=True) +def _(flow_dict, mo, np): + # flow ui + _max = np.ceil(1.5*np.max([_v['f_max'] for _k, _v in flow_dict.items()])) + flow_limits = mo.ui.array([mo.ui.slider(start=0, + stop=_max, + label=f'line {_ix+1}', + value=_line['f_max'], + debounce=True, + show_value=True,) + for _ix, _line in flow_dict.items()], label='flow limits') + return (flow_limits,) + + +@app.cell(hide_code=True) +def _( + am_solving, + gen_limits, + generator_dict, + load_limits, + np, + num_buses, + plt, + problem, +): + # plot bus generators and loads + am_solving + _fig, _ax = plt.subplots(nrows=3, sharex=True, figsize=(9, 5.5)) + _ax[0].stem(np.arange(num_buses)+1, problem.var_dict['p_gen'].value, label='gen') + _ax[0].plot((np.arange(num_buses)+1)[np.array(list(generator_dict.keys()))-1], [_v[1] for _v in gen_limits.value], + ls='none', marker=7, color='orange', label='max') + _ax[0].plot((np.arange(num_buses)+1)[np.array(list(generator_dict.keys()))-1], [_v[0] for _v in gen_limits.value], + ls='none', marker=6, color='red', label='min') + _ax[0].legend() + _ax[0].set_title('generator production') + _ax[0].set_ylabel('power [MW]') + _ax[1].stem(np.arange(num_buses)+1, problem.var_dict['p_load'].value, label='served') + _ax[1].plot(np.arange(num_buses)+1, [_v[1] for _v in load_limits.value], + ls='none', marker=7, color='orange', label='desired') + _ax[1].plot(np.arange(num_buses)+1, [_v[0] for _v in load_limits.value], + ls='none', marker=6, color='red', label='min') + _ax[1].legend() + _ax[1].set_title('load served') + _ax[1].set_ylabel('power [MW]') + _ax[2].scatter(np.arange(num_buses)+1, -1 * problem.constraints[0].dual_value) + _ax[2].set_title('node prices') + _ax[2].set_ylabel('dual value (price)') + _ax[2].set_xlabel('bus number') + plt.tight_layout() + bus_power_fig = _fig + return (bus_power_fig,) + + +@app.cell(hide_code=True) +def _( + am_solving, + both, + constrained_lines, + gen_only, + lines, + load_only, + problem, +): + # power flow graph view 1 + am_solving + solution2 = ["flowchart LR"] + for _ix, _l in enumerate(lines): + _f = _l[0] + _t = _l[1] + _lf = problem.var_dict['line flows'][_ix].value + if _lf >= 0: + solution2.append(f" {_f:.0f}(({_f})) == {_lf:.2f} ==> {_t:.0f}(({_t}))") + else: + # solution2.append(f" {_f:.0f}(({_f})) ~~~ {_t:.0f}(({_t}))") + solution2.append(f" {_t:.0f}(({_t})) == {-_lf:.2f} ==> {_f:.0f}(({_f}))") + solution2 = "\n".join(solution2) + solution2 += '''\n + classDef gen stroke-dasharray: 5 5;\n + classDef load fill:#f9f;\n + classDef genload stroke-dasharray: 5 5,fill:#f9f;''' + if len(load_only) > 0: + _str = ",".join([str(int(_i)) for _i in load_only]) + solution2 += "\n class "+_str+" gen;" + if len(gen_only) > 0: + _str = ",".join([str(int(_i)) for _i in gen_only]) + solution2 += "\n class "+_str+" load;" + if len(both) > 0: + _str = ",".join([str(int(_i)) for _i in both]) + solution2 += "\n class "+_str+" genload;" + if len(constrained_lines) > 0: + _str = ",".join([str(int(_i)) for _i in constrained_lines]) + solution2 += "\n linkStyle "+_str+" color:red;" + return (solution2,) + + +@app.cell +def _(solution): + solution + return + + +@app.cell(hide_code=True) +def _( + am_solving, + both, + constrained_lines, + gen_only, + lines, + load_only, + problem, +): + # power flow graph view 2 + am_solving + solution = ["flowchart LR"] + for _ix, _l in enumerate(lines): + _f = _l[0] + _t = _l[1] + _lf = problem.var_dict['line flows'][_ix].value + solution.append(f" {_f:.0f}(({_f})) == {_lf:.2f} ==> {_t:.0f}(({_t}))") + # if _lf >= 0: + # solution.append(f" {_f:.0f}(({_f})) == {_lf:.2f} ==> {_t:.0f}(({_t}))") + # else: + # solution.append(f" {_t:.0f}(({_t})) == {-_lf:.2f} ==> {_f:.0f}(({_f}))") + solution = "\n".join(solution) + solution += ''' + classDef gen stroke-dasharray: 5 5; + classDef load fill:#f9f; + classDef genload stroke-dasharray: 5 5,fill:#f9f;''' + if len(load_only) > 0: + _str = ",".join([str(int(_i)) for _i in load_only]) + solution += "\n class "+_str+" gen;" + if len(gen_only) > 0: + _str = ",".join([str(int(_i)) for _i in gen_only]) + solution += "\n class "+_str+" load;" + if len(both) > 0: + _str = ",".join([str(int(_i)) for _i in both]) + solution += "\n class "+_str+" genload;" + if len(constrained_lines) > 0: + _str = ",".join([str(int(_i)) for _i in constrained_lines]) + solution += "\n linkStyle "+_str+" color:red;" + return (solution,) + + +@app.cell +def _(): + import marimo as mo + import os, re + import numpy as np + import cvxpy as cp + import matplotlib.pyplot as plt + import seaborn as sns + return cp, mo, np, os, plt, re, sns + + +if __name__ == "__main__": + app.run() diff --git a/dc-opf/SD_relax_test_real.py b/dc-opf/SD_relax_test_real.py new file mode 100644 index 00000000..0f412583 --- /dev/null +++ b/dc-opf/SD_relax_test_real.py @@ -0,0 +1,585 @@ +import marimo + +__generated_with = "0.15.0" +app = marimo.App(width="medium") + + +@app.cell +def _(B, Yksbar, flow_dict, np): + _yij = 1/(np.array([_v['r'] for _k, _v in flow_dict.items()]) + 1j * np.array([_v['x'] for _k, _v in flow_dict.items()])) + _num_buses = B.shape[0] + _num_edges = B.shape[1] + _Y = np.zeros((_num_buses, _num_buses), dtype=complex) + for _idx, _edge in enumerate(B.T): + _i, _j = np.where(_edge==-1)[0], np.where(_edge==1)[0] + _Y[_i, _j] = -_yij[_idx] + _Y[_j, _i] = -_yij[_idx] + np.fill_diagonal(_Y, np.sum(-_Y, axis=1)) + Ysel = [np.outer(_e, _e) @ _Y for _e in np.eye(_Y.shape[0])] + Yks = [0.5 * np.block([[np.real(_Yk + _Yk.T), np.imag(_Yk.T - _Yk)], + [np.imag(_Yk - _Yk.T), np.real(_Yk + _Yk.T)]]) for _Yk in Ysel] + Yksbars = [-0.5 * np.block([[np.imag(_Yk + _Yk.T), np.real(_Yk - _Yk.T)], + [np.real(_Yk.T - _Yk), np.imag(_Yk + _Yk.T)]]) for _Yk in Ysel] + Yksbar[0] + return + + +@app.cell +def _(P, cp, np): + def make_problem(incidence_mat, generator_dict, load_dict, flow_dict): + def indices_not_in_list(array_length, given_indices): + all_indices = set(range(array_length)) + given_indices_set = set(given_indices) + not_in_list_indices = all_indices - given_indices_set + return list(not_in_list_indices) + ### Problem Data ### + _B = incidence_mat + _A = np.abs(_B) @ np.abs(_B.T) - np.diag(np.diag(np.abs(_B) @ np.abs(_B.T))) + _yij = 1/(np.array([_v['r'] for _k, _v in flow_dict.items()]) + 1j * np.array([_v['x'] for _k, _v in flow_dict.items()])) + num_buses = _B.shape[0] + num_edges = _B.shape[1] + _Y = np.zeros((num_buses, num_buses), dtype=complex) + for _idx, _edge in enumerate(_B.T): + _i, _j = np.where(_edge==-1)[0], np.where(_edge==1)[0] + _Y[_i, _j] = -_yij[_idx] + _Y[_j, _i] = -_yij[_idx] + np.fill_diagonal(_Y, np.sum(-_Y, axis=1)) + Ysel = [np.outer(_e, _e) @ _Y for _e in np.eye(_Y.shape[0])] + Yks = [0.5 * np.block([[np.real(_Yk + _Yk.T), np.imag(_Yk.T - _Yk)], + [np.imag(_Yk - _Yk.T), np.real(_Yk + _Yk.T)]])for _Yk in Ysel] + Yksbars = [-0.5 * np.block([[np.imag(_Yk + _Yk.T), np.real(_Yk - _Yk.T)], + [np.real(_Yk.T - _Yk), np.imag(_Yk + _Yk.T)]])for _Yk in Ysel] + gen_ixs = np.array(list(generator_dict.keys())) - 1 + nogen_ixs = indices_not_in_list(num_buses, gen_ixs) + ### Variables ### + p_gen = cp.Variable((num_buses), nonneg=True, name='p_gen') + p_load = cp.Variable((num_buses), nonneg=True, name='p_load') + q_bus = cp.Variable((num_buses), name='q_bus') + W = cp.Variable((2 * num_buses, 2 * num_buses), name='V', PSD=True) + v_bus = cp.Variable(num_buses, name='v') + ### Parameters ### + l_min = cp.Parameter( + shape=num_buses, + value=[_v['l_min'] for _k, _v in load_dict.items()], + name='l_min' + ) + l_upper = cp.Parameter( + shape=num_buses, + value=[_v['l_upper'] for _k, _v in load_dict.items()], + name='l_upper' + ) + # l_cost = cp.Parameter( + # shape=num_buses, + # value=[_v['cost'] for _k, _v in load_dict.items()], + # name='l_cost' + # ) + l_cost = [_v['cost'] for _k, _v in load_dict.items()] + g_min = cp.Parameter( + shape=len(gen_ixs), + value=np.array([_v['p_min'] for _k, _v in generator_dict.items()]), + name='g_min' + ) + g_max = cp.Parameter( + shape=len(gen_ixs), + value=np.array([_v['p_max'] for _k, _v in generator_dict.items()]), + name='g_max' + ) + c0 = cp.Parameter( + shape=len(gen_ixs), + value=np.array([_v['c0'] for _k, _v in generator_dict.items()]), + name='c0' + ) + c1 = cp.Parameter( + shape=len(gen_ixs), + value=np.array([_v['c1'] for _k, _v in generator_dict.items()]), + name='c1' + ) + # c2 = cp.Parameter( + # shape=len(gen_ixs), + # value=np.array([_v['c2'] for _k, _v in generator_dict.items()]), + # name='c2' + # ) + c2 = np.array([_v['c2'] for _k, _v in generator_dict.items()]) + r = cp.Parameter( + shape=num_edges, + value=np.array([_v['r'] for _k, _v in flow_dict.items()]), + name='line resistance' + ) + f_max = cp.Parameter( + shape=num_edges, + value=np.array([_v['f_max'] for _k, _v in flow_dict.items()]), + name='line capacities' + ) + ### Problem Formulation ### + # generator costs + cost = cp.sum(c0 + cp.multiply(c1, p_gen[gen_ixs]) + cp.multiply(c2, cp.square(p_gen[gen_ixs]))) + # load curtailment costs + cost += cp.sum( + cp.multiply( + cp.neg(p_load - l_upper), + l_cost + ) + ) + # line penalties + for _idx, _edge in enumerate(_B.T): + _i, _j = np.where(_edge==-1)[0], np.where(_edge==1)[0] + cost += 0.5 * r[_idx] * (P[_i, _j] + P[_j, _i]) + constraints = [ + + ] + # constraints = [ + # (p_gen - p_load) + 1j * q_bus == cp.diag(V @ _YH), + # cp.sum(P, axis=1) == p_gen - p_load, + # cp.sum(Q, axis=1) == q_bus, + # cp.multiply(P, 1 - _A) == 0, + # cp.multiply(Q, 1 - _A) == 0, + # p_load >= l_min, + # cp.abs(P) <= f_max, + # p_gen[nogen_ixs] == 0, + # p_gen[gen_ixs] <= g_max, + # p_gen[gen_ixs] >= g_min, + # cp.real(cp.diag(V)) >= 0.9, + # cp.real(cp.diag(V)) <= 1.1, + # cp.imag(cp.diag(V)) == 0, + # cp.real(V) == cp.real(V.T), + # cp.imag(V) == -cp.imag(V.T) + # ] + problem = cp.Problem(cp.Minimize(cost), constraints) + return problem + return (make_problem,) + + +@app.cell +def _(mo): + mo.md( + """ + # DC Optimal Power Flow + + This notebook demonstrates the optimal flow problem, over 6 test networks provided by [pypower](https://github.com/rwl/PYPOWER). + + - network with $n$ nodes, $m$ edges, given by $n \\times m$ incidence + matrix $A$ + - edge power vector $p \\in \\mathbf{R}^m$, + with capacity limits $|p_j| \\leq C_j$ + - node generator power $g_i$, load $l_i$, + each with lower and upper limits + - flow conservation $Af + g = l$ + - generator cost function is + $\\phi_i(g_i) = a_i g_i + b_i g_i^2$, total $G= \\sum_i \\phi_i (g_i)$ + - load shortfall cost is $\\psi_i(l_i) = c_i(l^\\text{tar}_i-l_i)_+$, + total is $S = \\sum_i \\psi_i(l_i)$ + - total line loss is $L = \\sum_j r_j p_j^2$ + - objective is $G + \\lambda L + \\mu S$ + + The model automatically populates parameters for the generators, loads, and lines, with the sliders set to the default values for the test case. Users may try adjusting these values with the sliders to see how it changes the optimal flow. + """ + ) + return + + +@app.cell +def _(am_solving, np, plt, problem, sns): + am_solving + sns.heatmap(np.real(problem.var_dict['V'].value), cmap='seismic', center=0) + plt.title('real part') + plt.gcf() + return + + +@app.cell +def _(am_solving, np, plt, problem, sns): + am_solving + sns.heatmap(np.imag(problem.var_dict['V'].value), cmap='seismic', center=0) + plt.title('imag part') + plt.gcf() + return + + +@app.cell +def _(am_solving, np, plt, problem): + am_solving + plt.stem(np.diag(problem.var_dict['V'].value)) + plt.gcf() + return + + +@app.cell(hide_code=True) +def _(mo, os, re): + # model loading widget + _list = sorted( + [x for x in os.listdir(".") if re.match("case.+.py",x)], # get only "case*.py" + key=lambda x: int(re.sub("[^0-9]*([0-9]+)[^0-9]*", r"\1", x, 1)), # sort by numerical order not lexical + ) + _options = {os.path.splitext(x)[0]: x for x in _list} + model_ui = mo.ui.dropdown( + options=_options, value=os.path.splitext(_list[0])[0], label='select model:' + ) + return (model_ui,) + + +@app.cell(hide_code=True) +def _(model_ui, os): + # import model from file + from importlib.machinery import SourceFileLoader + _n = model_ui.value.split('.')[0] + model_loader = SourceFileLoader(_n, os.path.join(".",model_ui.value)).load_module() + load_model = getattr(model_loader, _n) + model_data = load_model() + return (model_data,) + + +@app.cell(hide_code=True) +def _(model_data): + # define network + num_buses = model_data['bus'].shape[0] + lines = [(int(_b[0]), int(_b[1])) for _b in model_data['branch']] + return lines, num_buses + + +@app.cell(hide_code=True) +def _(both, gen_only, lines, load_only): + # build graph + graph = ["flowchart LR"] + for _ix, _l in enumerate(lines): + _f = _l[0] + _t = _l[1] + graph.append(f" {_f:.0f}(({_f})) == {_ix+1} === {_t:.0f}(({_t}))") + graph = "\n".join(graph) + graph += '''\n + classDef gen stroke-dasharray: 5 5;\n + classDef load fill:#f9f;\n + classDef genload stroke-dasharray: 5 5,fill:#f9f;''' + if len(load_only) > 0: + _str = ",".join([str(int(_i)) for _i in load_only]) + graph += "\n class "+_str+" gen;" + if len(gen_only) > 0: + _str = ",".join([str(int(_i)) for _i in gen_only]) + graph += "\n class "+_str+" load;" + if len(both) > 0: + _str = ",".join([str(int(_i)) for _i in both]) + graph += "\n class "+_str+" genload;" + return (graph,) + + +@app.cell(hide_code=True) +def _(lines, np, num_buses, sns): + # define incidence matrix + B = np.zeros((num_buses, len(lines))) + for _ix, _l in enumerate(lines): + B[_l[0]-1, _ix] = -1 + B[_l[1]-1, _ix] = 1 + fig_heatmap = sns.heatmap(B, cmap='bwr', center=0) + return B, fig_heatmap + + +@app.cell +def _(model_data, model_ui, np): + # construct dictionaries for problem formulation + def merge_nested_dicts(dict1, dict2): + result = {} + + for key in dict1.keys() | dict2.keys(): + inner_dict1 = dict1.get(key, {}) + inner_dict2 = dict2.get(key, {}) + + # Merge the inner dictionaries + merged_inner_dict = {**inner_dict1, **inner_dict2} + + result[key] = merged_inner_dict + + return result + # minimum generation value occaisonally negative + generator_dict1 = {int(_g[0]): {'p_min': np.clip(_g[9], 0, np.inf), 'p_max': _g[8]*2} for _g in model_data['gen']} + generator_dict2 = {int(model_data['gen'][_ix, 0]): {'c0': _g[-1], 'c1': _g[-2], 'c2': _g[-3]} for _ix, _g in enumerate(model_data['gencost'])} + generator_dict = merge_nested_dicts(generator_dict1, generator_dict2) + # power demand is occaisonally negative + # load_dict = {int(_l[0]): {'l_min': 0, 'l_upper': np.abs(_l[2]), 'cost': 250} for _l in model_data['bus']} + load_dict = {int(_l[0]): {'l_min': np.abs(_l[2]*0.5), 'l_upper': np.abs(_l[2]), 'cost': 1e4} for _l in model_data['bus']} + _fmax = 20 * np.max([np.max(_b[5:7]) for _b in model_data['branch']]) + + flow_dict = {} + for _ix, _b in enumerate(model_data['branch']): + _fx = np.max(_b[5:7]) + flow_dict[_ix] = {'r': _b[2], 'x': _b[3], 'b': _b[4], 'g': _b[2] / (_b[2]**2 + _b[3]**2)} + if model_ui.value == 'case14.py': + flow_dict[_ix]['f_max'] = 175 + elif _fx > 0: + flow_dict[_ix]['f_max'] = _fx + else: + flow_dict[_ix]['f_max'] = _fmax + line_resistance = model_data['branch'][:, 2] + return flow_dict, generator_dict, load_dict + + +@app.cell(hide_code=True) +def _(model_data, np): + # label nodes + generator_nodes = model_data['gen'][:, 0] + load_nodes = np.where(model_data['bus'][:, 2] != 0)[0] + 1 + set_gen_nodes = set(generator_nodes) + set_load_nodes = set(load_nodes) + gen_only = np.asarray(list(set_gen_nodes.difference(set_load_nodes))) + load_only = np.asarray(list(set_load_nodes.difference(set_gen_nodes))) + both = np.asarray(list(set_gen_nodes.intersection(set_load_nodes))) + return both, gen_only, load_only + + +@app.cell +def _(model_ui): + model_ui + return + + +@app.cell(hide_code=True) +def _(fig_heatmap, generator_dict, graph, load_dict, mo): + mo.ui.tabs({ + 'graph': mo.mermaid(graph), + 'incidence matrix': fig_heatmap, + 'generators': mo.accordion({str(_k): _v for _k, _v in generator_dict.items()}), + 'loads': mo.accordion({str(_k): _v for _k, _v in load_dict.items()}) + }) + return + + +@app.cell +def _(flow_limits, gen_limits, load_limits, mo): + mo.hstack([load_limits, gen_limits, flow_limits]) + return + + +@app.cell +def _(B, flow_dict, generator_dict, load_dict, make_problem): + problem = make_problem(B, generator_dict, load_dict, flow_dict) + return (problem,) + + +@app.cell(hide_code=True) +def _(flow_limits, gen_limits, load_limits, mo, np, problem): + # solve with updated parameters + am_solving = True + problem.param_dict['g_min'].value = [_v[0] for _v in gen_limits.value] + problem.param_dict['g_max'].value = [_v[1] for _v in gen_limits.value] + problem.param_dict['l_min'].value = [_v[0] for _v in load_limits.value] + problem.param_dict['l_upper'].value = [_v[1] for _v in load_limits.value] + problem.param_dict['line capacities'].value = flow_limits.value + obj_val = problem.solve(verbose=True, solver='CLARABEL') + constrained_lines = np.where(~np.isclose(problem.constraints[2].dual_value, 0, atol=1e-2))[0] + mo.md(f'objective value: {obj_val:.2f}') + return am_solving, constrained_lines + + +@app.cell +def _(am_solving, np, problem): + am_solving + evals, evecs = np.linalg.eigh(problem.var_dict['V'].value) + return (evals,) + + +@app.cell +def _(am_solving, evals): + am_solving + evals + return + + +@app.cell +def _(am_solving, problem): + am_solving + problem.var_dict['V'].value + return + + +@app.cell +def _(bus_power_fig, mo, solution, solution2): + mo.ui.tabs({ + 'bus power': bus_power_fig, + 'line flows': mo.mermaid(solution), + 'line flows ordered': mo.mermaid(solution2) + }) + return + + +@app.cell(hide_code=True) +def _(generator_dict, mo, np): + # generator ui + _max = np.ceil(1.5*np.max([_v['p_max'] for _k, _v in generator_dict.items()])) + gen_limits = mo.ui.array([mo.ui.range_slider(start=0, + stop=_max, + label=f'gen {_ix}', + value=[_gen['p_min'], _gen['p_max']], + debounce=True, + show_value=True) + for _ix, _gen in generator_dict.items()], label='generator limits') + return (gen_limits,) + + +@app.cell(hide_code=True) +def _(load_dict, mo, np): + # load ui + _max = np.ceil(1.5*np.max([_v['l_upper'] for _k, _v in load_dict.items()])) + load_limits = mo.ui.array([mo.ui.range_slider(start=0, + stop=_max, + label=f'load {_ix}', + value=[_load['l_min'], _load['l_upper']], + debounce=True, + show_value=True,) + for _ix, _load in load_dict.items()], label='load limits') + return (load_limits,) + + +@app.cell(hide_code=True) +def _(flow_dict, mo, np): + # flow ui + _max = np.ceil(1.5*np.max([_v['f_max'] for _k, _v in flow_dict.items()])) + flow_limits = mo.ui.array([mo.ui.slider(start=0, + stop=_max, + label=f'line {_ix+1}', + value=_line['f_max'], + debounce=True, + show_value=True,) + for _ix, _line in flow_dict.items()], label='flow limits') + return (flow_limits,) + + +@app.cell(hide_code=True) +def _( + am_solving, + gen_limits, + generator_dict, + load_limits, + np, + num_buses, + plt, + problem, +): + # plot bus generators and loads + am_solving + _fig, _ax = plt.subplots(nrows=3, sharex=True, figsize=(9, 5.5)) + _ax[0].stem(np.arange(num_buses)+1, problem.var_dict['p_gen'].value, label='gen') + _ax[0].plot((np.arange(num_buses)+1)[np.array(list(generator_dict.keys()))-1], [_v[1] for _v in gen_limits.value], + ls='none', marker=7, color='orange', label='max') + _ax[0].plot((np.arange(num_buses)+1)[np.array(list(generator_dict.keys()))-1], [_v[0] for _v in gen_limits.value], + ls='none', marker=6, color='red', label='min') + _ax[0].legend() + _ax[0].set_title('generator production') + _ax[0].set_ylabel('power [MW]') + _ax[1].stem(np.arange(num_buses)+1, problem.var_dict['p_load'].value, label='served') + _ax[1].plot(np.arange(num_buses)+1, [_v[1] for _v in load_limits.value], + ls='none', marker=7, color='orange', label='desired') + _ax[1].plot(np.arange(num_buses)+1, [_v[0] for _v in load_limits.value], + ls='none', marker=6, color='red', label='min') + _ax[1].legend() + _ax[1].set_title('load served') + _ax[1].set_ylabel('power [MW]') + _ax[2].scatter(np.arange(num_buses)+1, -1 * problem.constraints[0].dual_value) + _ax[2].set_title('node prices') + _ax[2].set_ylabel('dual value (price)') + _ax[2].set_xlabel('bus number') + plt.tight_layout() + bus_power_fig = _fig + return (bus_power_fig,) + + +@app.cell(hide_code=True) +def _( + am_solving, + both, + constrained_lines, + gen_only, + lines, + load_only, + problem, +): + # power flow graph view 1 + am_solving + solution2 = ["flowchart LR"] + for _ix, _l in enumerate(lines): + _f = _l[0] + _t = _l[1] + _lf = problem.var_dict['line flows'][_ix].value + if _lf >= 0: + solution2.append(f" {_f:.0f}(({_f})) == {_lf:.2f} ==> {_t:.0f}(({_t}))") + else: + # solution2.append(f" {_f:.0f}(({_f})) ~~~ {_t:.0f}(({_t}))") + solution2.append(f" {_t:.0f}(({_t})) == {-_lf:.2f} ==> {_f:.0f}(({_f}))") + solution2 = "\n".join(solution2) + solution2 += '''\n + classDef gen stroke-dasharray: 5 5;\n + classDef load fill:#f9f;\n + classDef genload stroke-dasharray: 5 5,fill:#f9f;''' + if len(load_only) > 0: + _str = ",".join([str(int(_i)) for _i in load_only]) + solution2 += "\n class "+_str+" gen;" + if len(gen_only) > 0: + _str = ",".join([str(int(_i)) for _i in gen_only]) + solution2 += "\n class "+_str+" load;" + if len(both) > 0: + _str = ",".join([str(int(_i)) for _i in both]) + solution2 += "\n class "+_str+" genload;" + if len(constrained_lines) > 0: + _str = ",".join([str(int(_i)) for _i in constrained_lines]) + solution2 += "\n linkStyle "+_str+" color:red;" + return (solution2,) + + +@app.cell +def _(solution): + solution + return + + +@app.cell(hide_code=True) +def _( + am_solving, + both, + constrained_lines, + gen_only, + lines, + load_only, + problem, +): + # power flow graph view 2 + am_solving + solution = ["flowchart LR"] + for _ix, _l in enumerate(lines): + _f = _l[0] + _t = _l[1] + _lf = problem.var_dict['line flows'][_ix].value + solution.append(f" {_f:.0f}(({_f})) == {_lf:.2f} ==> {_t:.0f}(({_t}))") + # if _lf >= 0: + # solution.append(f" {_f:.0f}(({_f})) == {_lf:.2f} ==> {_t:.0f}(({_t}))") + # else: + # solution.append(f" {_t:.0f}(({_t})) == {-_lf:.2f} ==> {_f:.0f}(({_f}))") + solution = "\n".join(solution) + solution += ''' + classDef gen stroke-dasharray: 5 5; + classDef load fill:#f9f; + classDef genload stroke-dasharray: 5 5,fill:#f9f;''' + if len(load_only) > 0: + _str = ",".join([str(int(_i)) for _i in load_only]) + solution += "\n class "+_str+" gen;" + if len(gen_only) > 0: + _str = ",".join([str(int(_i)) for _i in gen_only]) + solution += "\n class "+_str+" load;" + if len(both) > 0: + _str = ",".join([str(int(_i)) for _i in both]) + solution += "\n class "+_str+" genload;" + if len(constrained_lines) > 0: + _str = ",".join([str(int(_i)) for _i in constrained_lines]) + solution += "\n linkStyle "+_str+" color:red;" + return (solution,) + + +@app.cell +def _(): + import marimo as mo + import os, re + import numpy as np + import cvxpy as cp + import matplotlib.pyplot as plt + import seaborn as sns + return cp, mo, np, os, plt, re, sns + + +if __name__ == "__main__": + app.run() diff --git a/dc-opf/SD_relax_test_v2.py b/dc-opf/SD_relax_test_v2.py new file mode 100644 index 00000000..0f66f37b --- /dev/null +++ b/dc-opf/SD_relax_test_v2.py @@ -0,0 +1,559 @@ +import marimo + +__generated_with = "0.15.0" +app = marimo.App(width="medium") + + +@app.cell +def _(cp, np): + def make_problem(incidence_mat, generator_dict, load_dict, flow_dict): + def indices_not_in_list(array_length, given_indices): + all_indices = set(range(array_length)) + given_indices_set = set(given_indices) + not_in_list_indices = all_indices - given_indices_set + return list(not_in_list_indices) + ### Problem Data ### + _B = incidence_mat + _A = np.abs(_B) @ np.abs(_B.T) - np.diag(np.diag(np.abs(_B) @ np.abs(_B.T))) + _yij = 1/(np.array([_v['r'] for _k, _v in flow_dict.items()]) + 1j * np.array([_v['x'] for _k, _v in flow_dict.items()])) + num_buses = _B.shape[0] + num_edges = _B.shape[1] + _Y = np.zeros((num_buses, num_buses), dtype=complex) + for _idx, _edge in enumerate(_B.T): + _i, _j = np.where(_edge==-1)[0], np.where(_edge==1)[0] + _Y[_i, _j] = -_yij[_idx] + _Y[_j, _i] = -_yij[_idx] + np.fill_diagonal(_Y, np.sum(-_Y, axis=1)) + _YH = _Y.conjugate().T + gen_ixs = np.array(list(generator_dict.keys())) - 1 + nogen_ixs = indices_not_in_list(num_buses, gen_ixs) + ### Variables ### + p_gen = cp.Variable((num_buses), nonneg=True, name='p_gen') + p_load = cp.Variable((num_buses), nonneg=True, name='p_load') + q_bus = cp.Variable((num_buses), name='q_bus') + V = cp.Variable((num_buses, num_buses), complex=True, name='V', PSD=True) + P = cp.Variable((num_buses, num_buses), name='P') + Q = cp.Variable((num_buses, num_buses), name='P') + ### Parameters ### + l_min = cp.Parameter( + shape=num_buses, + value=[_v['l_min'] for _k, _v in load_dict.items()], + name='l_min' + ) + l_upper = cp.Parameter( + shape=num_buses, + value=[_v['l_upper'] for _k, _v in load_dict.items()], + name='l_upper' + ) + # l_cost = cp.Parameter( + # shape=num_buses, + # value=[_v['cost'] for _k, _v in load_dict.items()], + # name='l_cost' + # ) + l_cost = [_v['cost'] for _k, _v in load_dict.items()] + g_min = cp.Parameter( + shape=len(gen_ixs), + value=np.array([_v['p_min'] for _k, _v in generator_dict.items()]), + name='g_min' + ) + g_max = cp.Parameter( + shape=len(gen_ixs), + value=np.array([_v['p_max'] for _k, _v in generator_dict.items()]), + name='g_max' + ) + c0 = cp.Parameter( + shape=len(gen_ixs), + value=np.array([_v['c0'] for _k, _v in generator_dict.items()]), + name='c0' + ) + c1 = cp.Parameter( + shape=len(gen_ixs), + value=np.array([_v['c1'] for _k, _v in generator_dict.items()]), + name='c1' + ) + # c2 = cp.Parameter( + # shape=len(gen_ixs), + # value=np.array([_v['c2'] for _k, _v in generator_dict.items()]), + # name='c2' + # ) + c2 = np.array([_v['c2'] for _k, _v in generator_dict.items()]) + r = cp.Parameter( + shape=num_edges, + value=np.array([_v['r'] for _k, _v in flow_dict.items()]), + name='line resistance' + ) + f_max = cp.Parameter( + shape=num_edges, + value=np.array([_v['f_max'] for _k, _v in flow_dict.items()]), + name='line capacities' + ) + ### Problem Formulation ### + # generator costs + cost = cp.sum(c0 + cp.multiply(c1, p_gen[gen_ixs]) + cp.multiply(c2, cp.square(p_gen[gen_ixs]))) + # load curtailment costs + cost += cp.sum( + cp.multiply( + cp.neg(p_load - l_upper), + l_cost + ) + ) + # line penalties + for _idx, _edge in enumerate(_B.T): + _i, _j = np.where(_edge==-1)[0], np.where(_edge==1)[0] + cost += 0.5 * r[_idx] * (P[_i, _j] + P[_j, _i]) + constraints = [ + (p_gen - p_load) + 1j * q_bus == cp.diag(V @ _YH), + cp.sum(P, axis=1) == p_gen - p_load, + cp.sum(Q, axis=1) == q_bus, + cp.multiply(P, 1 - _A) == 0, + cp.multiply(Q, 1 - _A) == 0, + p_load >= l_min, + cp.abs(P) <= f_max, + p_gen[nogen_ixs] == 0, + p_gen[gen_ixs] <= g_max, + p_gen[gen_ixs] >= g_min, + cp.real(cp.diag(V)) >= 0.9, + cp.real(cp.diag(V)) <= 1.1, + cp.imag(cp.diag(V)) == 0, + cp.real(V) == cp.real(V.T), + cp.imag(V) == -cp.imag(V.T) + ] + problem = cp.Problem(cp.Minimize(cost), constraints) + return problem + return (make_problem,) + + +@app.cell +def _(mo): + mo.md( + """ + # DC Optimal Power Flow + + This notebook demonstrates the optimal flow problem, over 6 test networks provided by [pypower](https://github.com/rwl/PYPOWER). + + - network with $n$ nodes, $m$ edges, given by $n \\times m$ incidence + matrix $A$ + - edge power vector $p \\in \\mathbf{R}^m$, + with capacity limits $|p_j| \\leq C_j$ + - node generator power $g_i$, load $l_i$, + each with lower and upper limits + - flow conservation $Af + g = l$ + - generator cost function is + $\\phi_i(g_i) = a_i g_i + b_i g_i^2$, total $G= \\sum_i \\phi_i (g_i)$ + - load shortfall cost is $\\psi_i(l_i) = c_i(l^\\text{tar}_i-l_i)_+$, + total is $S = \\sum_i \\psi_i(l_i)$ + - total line loss is $L = \\sum_j r_j p_j^2$ + - objective is $G + \\lambda L + \\mu S$ + + The model automatically populates parameters for the generators, loads, and lines, with the sliders set to the default values for the test case. Users may try adjusting these values with the sliders to see how it changes the optimal flow. + """ + ) + return + + +@app.cell +def _(am_solving, np, plt, problem, sns): + am_solving + sns.heatmap(np.real(problem.var_dict['V'].value), cmap='seismic', center=0) + plt.title('real part') + plt.gcf() + return + + +@app.cell +def _(am_solving, np, plt, problem, sns): + am_solving + sns.heatmap(np.imag(problem.var_dict['V'].value), cmap='seismic', center=0) + plt.title('imag part') + plt.gcf() + return + + +@app.cell +def _(am_solving, np, plt, problem): + am_solving + plt.stem(np.diag(problem.var_dict['V'].value)) + plt.gcf() + return + + +@app.cell(hide_code=True) +def _(mo, os, re): + # model loading widget + _list = sorted( + [x for x in os.listdir(".") if re.match("case.+.py",x)], # get only "case*.py" + key=lambda x: int(re.sub("[^0-9]*([0-9]+)[^0-9]*", r"\1", x, 1)), # sort by numerical order not lexical + ) + _options = {os.path.splitext(x)[0]: x for x in _list} + model_ui = mo.ui.dropdown( + options=_options, value=os.path.splitext(_list[0])[0], label='select model:' + ) + return (model_ui,) + + +@app.cell(hide_code=True) +def _(model_ui, os): + # import model from file + from importlib.machinery import SourceFileLoader + _n = model_ui.value.split('.')[0] + model_loader = SourceFileLoader(_n, os.path.join(".",model_ui.value)).load_module() + load_model = getattr(model_loader, _n) + model_data = load_model() + return (model_data,) + + +@app.cell(hide_code=True) +def _(model_data): + # define network + num_buses = model_data['bus'].shape[0] + lines = [(int(_b[0]), int(_b[1])) for _b in model_data['branch']] + return lines, num_buses + + +@app.cell(hide_code=True) +def _(both, gen_only, lines, load_only): + # build graph + graph = ["flowchart LR"] + for _ix, _l in enumerate(lines): + _f = _l[0] + _t = _l[1] + graph.append(f" {_f:.0f}(({_f})) == {_ix+1} === {_t:.0f}(({_t}))") + graph = "\n".join(graph) + graph += '''\n + classDef gen stroke-dasharray: 5 5;\n + classDef load fill:#f9f;\n + classDef genload stroke-dasharray: 5 5,fill:#f9f;''' + if len(load_only) > 0: + _str = ",".join([str(int(_i)) for _i in load_only]) + graph += "\n class "+_str+" gen;" + if len(gen_only) > 0: + _str = ",".join([str(int(_i)) for _i in gen_only]) + graph += "\n class "+_str+" load;" + if len(both) > 0: + _str = ",".join([str(int(_i)) for _i in both]) + graph += "\n class "+_str+" genload;" + return (graph,) + + +@app.cell(hide_code=True) +def _(lines, np, num_buses, sns): + # define incidence matrix + B = np.zeros((num_buses, len(lines))) + for _ix, _l in enumerate(lines): + B[_l[0]-1, _ix] = -1 + B[_l[1]-1, _ix] = 1 + fig_heatmap = sns.heatmap(B, cmap='bwr', center=0) + return B, fig_heatmap + + +@app.cell +def _(model_data, model_ui, np): + # construct dictionaries for problem formulation + def merge_nested_dicts(dict1, dict2): + result = {} + + for key in dict1.keys() | dict2.keys(): + inner_dict1 = dict1.get(key, {}) + inner_dict2 = dict2.get(key, {}) + + # Merge the inner dictionaries + merged_inner_dict = {**inner_dict1, **inner_dict2} + + result[key] = merged_inner_dict + + return result + # minimum generation value occaisonally negative + generator_dict1 = {int(_g[0]): {'p_min': np.clip(_g[9], 0, np.inf), 'p_max': _g[8]*2} for _g in model_data['gen']} + generator_dict2 = {int(model_data['gen'][_ix, 0]): {'c0': _g[-1], 'c1': _g[-2], 'c2': _g[-3]} for _ix, _g in enumerate(model_data['gencost'])} + generator_dict = merge_nested_dicts(generator_dict1, generator_dict2) + # power demand is occaisonally negative + # load_dict = {int(_l[0]): {'l_min': 0, 'l_upper': np.abs(_l[2]), 'cost': 250} for _l in model_data['bus']} + load_dict = {int(_l[0]): {'l_min': np.abs(_l[2]*0.5), 'l_upper': np.abs(_l[2]), 'cost': 1e4} for _l in model_data['bus']} + _fmax = 20 * np.max([np.max(_b[5:7]) for _b in model_data['branch']]) + + flow_dict = {} + for _ix, _b in enumerate(model_data['branch']): + _fx = np.max(_b[5:7]) + flow_dict[_ix] = {'r': _b[2], 'x': _b[3], 'b': _b[4], 'g': _b[2] / (_b[2]**2 + _b[3]**2)} + if model_ui.value == 'case14.py': + flow_dict[_ix]['f_max'] = 175 + elif _fx > 0: + flow_dict[_ix]['f_max'] = _fx + else: + flow_dict[_ix]['f_max'] = _fmax + line_resistance = model_data['branch'][:, 2] + return flow_dict, generator_dict, load_dict + + +@app.cell(hide_code=True) +def _(model_data, np): + # label nodes + generator_nodes = model_data['gen'][:, 0] + load_nodes = np.where(model_data['bus'][:, 2] != 0)[0] + 1 + set_gen_nodes = set(generator_nodes) + set_load_nodes = set(load_nodes) + gen_only = np.asarray(list(set_gen_nodes.difference(set_load_nodes))) + load_only = np.asarray(list(set_load_nodes.difference(set_gen_nodes))) + both = np.asarray(list(set_gen_nodes.intersection(set_load_nodes))) + return both, gen_only, load_only + + +@app.cell +def _(model_ui): + model_ui + return + + +@app.cell(hide_code=True) +def _(fig_heatmap, generator_dict, graph, load_dict, mo): + mo.ui.tabs({ + 'graph': mo.mermaid(graph), + 'incidence matrix': fig_heatmap, + 'generators': mo.accordion({str(_k): _v for _k, _v in generator_dict.items()}), + 'loads': mo.accordion({str(_k): _v for _k, _v in load_dict.items()}) + }) + return + + +@app.cell +def _(flow_limits, gen_limits, load_limits, mo): + mo.hstack([load_limits, gen_limits, flow_limits]) + return + + +@app.cell +def _(B, flow_dict, generator_dict, load_dict, make_problem): + problem = make_problem(B, generator_dict, load_dict, flow_dict) + return (problem,) + + +@app.cell(hide_code=True) +def _(flow_limits, gen_limits, load_limits, mo, np, problem): + # solve with updated parameters + am_solving = True + problem.param_dict['g_min'].value = [_v[0] for _v in gen_limits.value] + problem.param_dict['g_max'].value = [_v[1] for _v in gen_limits.value] + problem.param_dict['l_min'].value = [_v[0] for _v in load_limits.value] + problem.param_dict['l_upper'].value = [_v[1] for _v in load_limits.value] + problem.param_dict['line capacities'].value = flow_limits.value + obj_val = problem.solve(verbose=True, solver='CLARABEL') + constrained_lines = np.where(~np.isclose(problem.constraints[2].dual_value, 0, atol=1e-2))[0] + mo.md(f'objective value: {obj_val:.2f}') + return am_solving, constrained_lines + + +@app.cell +def _(am_solving, np, problem): + am_solving + evals, evecs = np.linalg.eigh(problem.var_dict['V'].value) + return (evals,) + + +@app.cell +def _(am_solving, evals): + am_solving + evals + return + + +@app.cell +def _(am_solving, problem): + am_solving + problem.var_dict['V'].value + return + + +@app.cell +def _(bus_power_fig, mo, solution, solution2): + mo.ui.tabs({ + 'bus power': bus_power_fig, + 'line flows': mo.mermaid(solution), + 'line flows ordered': mo.mermaid(solution2) + }) + return + + +@app.cell(hide_code=True) +def _(generator_dict, mo, np): + # generator ui + _max = np.ceil(1.5*np.max([_v['p_max'] for _k, _v in generator_dict.items()])) + gen_limits = mo.ui.array([mo.ui.range_slider(start=0, + stop=_max, + label=f'gen {_ix}', + value=[_gen['p_min'], _gen['p_max']], + debounce=True, + show_value=True) + for _ix, _gen in generator_dict.items()], label='generator limits') + return (gen_limits,) + + +@app.cell(hide_code=True) +def _(load_dict, mo, np): + # load ui + _max = np.ceil(1.5*np.max([_v['l_upper'] for _k, _v in load_dict.items()])) + load_limits = mo.ui.array([mo.ui.range_slider(start=0, + stop=_max, + label=f'load {_ix}', + value=[_load['l_min'], _load['l_upper']], + debounce=True, + show_value=True,) + for _ix, _load in load_dict.items()], label='load limits') + return (load_limits,) + + +@app.cell(hide_code=True) +def _(flow_dict, mo, np): + # flow ui + _max = np.ceil(1.5*np.max([_v['f_max'] for _k, _v in flow_dict.items()])) + flow_limits = mo.ui.array([mo.ui.slider(start=0, + stop=_max, + label=f'line {_ix+1}', + value=_line['f_max'], + debounce=True, + show_value=True,) + for _ix, _line in flow_dict.items()], label='flow limits') + return (flow_limits,) + + +@app.cell(hide_code=True) +def _( + am_solving, + gen_limits, + generator_dict, + load_limits, + np, + num_buses, + plt, + problem, +): + # plot bus generators and loads + am_solving + _fig, _ax = plt.subplots(nrows=3, sharex=True, figsize=(9, 5.5)) + _ax[0].stem(np.arange(num_buses)+1, problem.var_dict['p_gen'].value, label='gen') + _ax[0].plot((np.arange(num_buses)+1)[np.array(list(generator_dict.keys()))-1], [_v[1] for _v in gen_limits.value], + ls='none', marker=7, color='orange', label='max') + _ax[0].plot((np.arange(num_buses)+1)[np.array(list(generator_dict.keys()))-1], [_v[0] for _v in gen_limits.value], + ls='none', marker=6, color='red', label='min') + _ax[0].legend() + _ax[0].set_title('generator production') + _ax[0].set_ylabel('power [MW]') + _ax[1].stem(np.arange(num_buses)+1, problem.var_dict['p_load'].value, label='served') + _ax[1].plot(np.arange(num_buses)+1, [_v[1] for _v in load_limits.value], + ls='none', marker=7, color='orange', label='desired') + _ax[1].plot(np.arange(num_buses)+1, [_v[0] for _v in load_limits.value], + ls='none', marker=6, color='red', label='min') + _ax[1].legend() + _ax[1].set_title('load served') + _ax[1].set_ylabel('power [MW]') + _ax[2].scatter(np.arange(num_buses)+1, -1 * problem.constraints[0].dual_value) + _ax[2].set_title('node prices') + _ax[2].set_ylabel('dual value (price)') + _ax[2].set_xlabel('bus number') + plt.tight_layout() + bus_power_fig = _fig + return (bus_power_fig,) + + +@app.cell(hide_code=True) +def _( + am_solving, + both, + constrained_lines, + gen_only, + lines, + load_only, + problem, +): + # power flow graph view 1 + am_solving + solution2 = ["flowchart LR"] + for _ix, _l in enumerate(lines): + _f = _l[0] + _t = _l[1] + _lf = problem.var_dict['line flows'][_ix].value + if _lf >= 0: + solution2.append(f" {_f:.0f}(({_f})) == {_lf:.2f} ==> {_t:.0f}(({_t}))") + else: + # solution2.append(f" {_f:.0f}(({_f})) ~~~ {_t:.0f}(({_t}))") + solution2.append(f" {_t:.0f}(({_t})) == {-_lf:.2f} ==> {_f:.0f}(({_f}))") + solution2 = "\n".join(solution2) + solution2 += '''\n + classDef gen stroke-dasharray: 5 5;\n + classDef load fill:#f9f;\n + classDef genload stroke-dasharray: 5 5,fill:#f9f;''' + if len(load_only) > 0: + _str = ",".join([str(int(_i)) for _i in load_only]) + solution2 += "\n class "+_str+" gen;" + if len(gen_only) > 0: + _str = ",".join([str(int(_i)) for _i in gen_only]) + solution2 += "\n class "+_str+" load;" + if len(both) > 0: + _str = ",".join([str(int(_i)) for _i in both]) + solution2 += "\n class "+_str+" genload;" + if len(constrained_lines) > 0: + _str = ",".join([str(int(_i)) for _i in constrained_lines]) + solution2 += "\n linkStyle "+_str+" color:red;" + return (solution2,) + + +@app.cell +def _(solution): + solution + return + + +@app.cell(hide_code=True) +def _( + am_solving, + both, + constrained_lines, + gen_only, + lines, + load_only, + problem, +): + # power flow graph view 2 + am_solving + solution = ["flowchart LR"] + for _ix, _l in enumerate(lines): + _f = _l[0] + _t = _l[1] + _lf = problem.var_dict['line flows'][_ix].value + solution.append(f" {_f:.0f}(({_f})) == {_lf:.2f} ==> {_t:.0f}(({_t}))") + # if _lf >= 0: + # solution.append(f" {_f:.0f}(({_f})) == {_lf:.2f} ==> {_t:.0f}(({_t}))") + # else: + # solution.append(f" {_t:.0f}(({_t})) == {-_lf:.2f} ==> {_f:.0f}(({_f}))") + solution = "\n".join(solution) + solution += ''' + classDef gen stroke-dasharray: 5 5; + classDef load fill:#f9f; + classDef genload stroke-dasharray: 5 5,fill:#f9f;''' + if len(load_only) > 0: + _str = ",".join([str(int(_i)) for _i in load_only]) + solution += "\n class "+_str+" gen;" + if len(gen_only) > 0: + _str = ",".join([str(int(_i)) for _i in gen_only]) + solution += "\n class "+_str+" load;" + if len(both) > 0: + _str = ",".join([str(int(_i)) for _i in both]) + solution += "\n class "+_str+" genload;" + if len(constrained_lines) > 0: + _str = ",".join([str(int(_i)) for _i in constrained_lines]) + solution += "\n linkStyle "+_str+" color:red;" + return (solution,) + + +@app.cell +def _(): + import marimo as mo + import os, re + import numpy as np + import cvxpy as cp + import matplotlib.pyplot as plt + import seaborn as sns + return cp, mo, np, os, plt, re, sns + + +if __name__ == "__main__": + app.run() diff --git a/dc-opf/SOC_relax_test.py b/dc-opf/SOC_relax_test.py new file mode 100644 index 00000000..9519a528 --- /dev/null +++ b/dc-opf/SOC_relax_test.py @@ -0,0 +1,635 @@ +import marimo + +__generated_with = "0.15.0" +app = marimo.App(width="medium") + + +@app.cell +def _(cp, np): + def make_problem(incidence_mat, generator_dict, load_dict, flow_dict, augmented=None, rho=1): + def indices_not_in_list(array_length, given_indices): + all_indices = set(range(array_length)) + given_indices_set = set(given_indices) + not_in_list_indices = all_indices - given_indices_set + return list(not_in_list_indices) + _B = incidence_mat + _A = np.abs(_B) @ np.abs(_B.T) - np.diag(np.diag(np.abs(_B) @ np.abs(_B.T))) + _yij = 1/(np.array([_v['r'] for _k, _v in flow_dict.items()]) + 1j * np.array([_v['x'] for _k, _v in flow_dict.items()])) + num_buses = _B.shape[0] + num_edges = _B.shape[1] + _Y = np.zeros((num_buses, num_buses), dtype=complex) + for _idx, _edge in enumerate(_B.T): + _i, _j = np.where(_edge==-1)[0], np.where(_edge==1)[0] + _Y[_i, _j] = -_yij[_idx] + _Y[_j, _i] = -_yij[_idx] + np.fill_diagonal(_Y, np.sum(-_Y, axis=1)) + _YH = _Y.conjugate().T + gen_ixs = np.array(list(generator_dict.keys())) - 1 + nogen_ixs = indices_not_in_list(num_buses, gen_ixs) + # p_flows = cp.Variable((num_edges), name='line flows') + p_gen = cp.Variable((num_buses), nonneg=True, name='p_gen') + p_load = cp.Variable((num_buses), nonneg=True, name='p_load') + q_bus = cp.Variable((num_buses), name='q_bus') + V = cp.Variable((num_buses, num_buses), complex=True, name='V') + P = cp.Variable((num_buses, num_buses), name='P') + Q = cp.Variable((num_buses, num_buses), name='P') + l_min = cp.Parameter( + shape=num_buses, + value=[_v['l_min'] for _k, _v in load_dict.items()], + name='l_min' + ) + l_upper = cp.Parameter( + shape=num_buses, + value=[_v['l_upper'] for _k, _v in load_dict.items()], + name='l_upper' + ) + # l_cost = cp.Parameter( + # shape=num_buses, + # value=[_v['cost'] for _k, _v in load_dict.items()], + # name='l_cost' + # ) + l_cost = [_v['cost'] for _k, _v in load_dict.items()] + g_min = cp.Parameter( + shape=len(gen_ixs), + value=np.array([_v['p_min'] for _k, _v in generator_dict.items()]), + name='g_min' + ) + g_max = cp.Parameter( + shape=len(gen_ixs), + value=np.array([_v['p_max'] for _k, _v in generator_dict.items()]), + name='g_max' + ) + c0 = cp.Parameter( + shape=len(gen_ixs), + value=np.array([_v['c0'] for _k, _v in generator_dict.items()]), + name='c0' + ) + c1 = cp.Parameter( + shape=len(gen_ixs), + value=np.array([_v['c1'] for _k, _v in generator_dict.items()]), + name='c1' + ) + # c2 = cp.Parameter( + # shape=len(gen_ixs), + # value=np.array([_v['c2'] for _k, _v in generator_dict.items()]), + # name='c2' + # ) + c2 = np.array([_v['c2'] for _k, _v in generator_dict.items()]) + r = cp.Parameter( + shape=num_edges, + value=np.array([_v['r'] for _k, _v in flow_dict.items()]), + name='line resistance' + ) + f_max = cp.Parameter( + shape=num_edges, + value=np.array([_v['f_max'] for _k, _v in flow_dict.items()]), + name='line capacities' + ) + # generator costs + cost = cp.sum(c0 + cp.multiply(c1, p_gen[gen_ixs]) + cp.multiply(c2, cp.square(p_gen[gen_ixs]))) + # load curtailment costs + cost += cp.sum( + cp.multiply( + cp.neg(p_load - l_upper), + l_cost + ) + ) + # line penalties + cost += cp.sum_squares(cp.multiply(r, P)) + # admm + if augmented is not None: + cost += rho * 0.5 * cp.sum_squares(V - augmented) + constraints = [ + (p_gen - p_load) + 1j * q_bus == cp.diag(V @ _YH), + cp.sum(P, axis=1) == p_gen - p_load, + cp.sum(Q, axis=1) == q_bus, + cp.multiply(P, 1 - _A) == 0, + cp.multiply(Q, 1 - _A) == 0, + p_load >= l_min, + cp.abs(P) <= f_max, + p_gen[nogen_ixs] == 0, + p_gen[gen_ixs] <= g_max, + p_gen[gen_ixs] >= g_min, + cp.real(cp.diag(V)) >= 0.9, + cp.real(cp.diag(V)) <= 1.1, + cp.imag(cp.diag(V)) == 0, + cp.real(V) == cp.real(V.T), + cp.imag(V) == -cp.imag(V.T) + ] + problem = cp.Problem(cp.Minimize(cost), constraints) + return problem + return (make_problem,) + + +@app.cell +def _(np): + def proj_rank1(mat): + _evals, _evecs = np.linalg.eigh(mat) + _k = 1 + _M = _evecs[:, -_k:] + _D = np.diag(_evals[-_k:]) + return _M @ _D @ _M.conjugate().T + return (proj_rank1,) + + +@app.cell +def _( + B, + flow_dict, + generator_dict, + load_dict, + make_problem, + np, + num_buses, + proj_rank1, +): + def admm_step(zlast=None, ulast=None, rho=1): + if zlast is None: + zlast = np.zeros((num_buses, num_buses)) + if ulast is None: + ulast = np.zeros((num_buses, num_buses)) + problem = make_problem(B, generator_dict, load_dict, flow_dict, augmented=zlast - ulast, rho=rho) + problem.solve(solver='CLARABEL') + xnew = problem.var_dict['V'].value + znew = proj_rank1(xnew + ulast) + unew = ulast + xnew - znew + return xnew, znew, unew, np.linalg.norm(xnew - znew) + return (admm_step,) + + +@app.cell +def _(admm_step, mo, plt): + _zl, _ul = None, None + _rho = 1 + rs = [] + for _i in range(500): + if (_i + 1) % 10 == 0: + _rho *= 2 + xnext, znext, unext, r = admm_step(zlast=_zl, ulast=_ul, rho=_rho) + _zl, _ul = znext, unext + rs.append(r) + fig = plt.plot(rs) + mo.output.replace(fig) + plt.close() + return xnext, znext + + +@app.cell +def _(am_solving, np, plt, sns, xnext): + am_solving + sns.heatmap(np.real(xnext), cmap='seismic', center=0) + plt.title('real part') + plt.gcf() + return + + +@app.cell +def _(am_solving, np, plt, xnext): + am_solving + plt.stem(np.diag(xnext)) + plt.gcf() + return + + +@app.cell +def _(np, znext): + _eval, _evec = np.linalg.eigh(znext) + _eval + return + + +@app.cell +def _(): + return + + +@app.cell +def _(am_solving, np, plt, problem, sns): + am_solving + sns.heatmap(np.real(problem.var_dict['V'].value), cmap='seismic', center=0) + plt.title('real part') + plt.gcf() + return + + +@app.cell +def _(am_solving, np, plt, problem2, sns): + am_solving + sns.heatmap(np.imag(problem2.var_dict['V'].value), cmap='seismic', center=0) + plt.title('imag part') + plt.gcf() + return + + +@app.cell +def _(am_solving, np, plt, problem): + am_solving + plt.stem(np.diag(problem.var_dict['V'].value)) + plt.gcf() + return + + +@app.cell +def _(problem, proj_rank1): + V_proj = proj_rank1(problem.var_dict["V"].value) + error = problem.var_dict["V"].value - V_proj + return V_proj, error + + +@app.cell +def _( + B, + V_proj, + error, + flow_dict, + flow_limits, + gen_limits, + generator_dict, + load_dict, + load_limits, + make_problem, +): + problem2 = make_problem(B, generator_dict, load_dict, flow_dict, augmented=V_proj - error) + # solve with updated parameters + # am_solving = True + problem2.param_dict['g_min'].value = [_v[0] for _v in gen_limits.value] + problem2.param_dict['g_max'].value = [_v[1] for _v in gen_limits.value] + problem2.param_dict['l_min'].value = [_v[0] for _v in load_limits.value] + problem2.param_dict['l_upper'].value = [_v[1] for _v in load_limits.value] + problem2.param_dict['line capacities'].value = flow_limits.value + obj_val2 = problem2.solve(verbose=True, solver='CLARABEL') + return (problem2,) + + +@app.cell +def _(am_solving, np, problem2): + am_solving + evals, evecs = np.linalg.eigh(problem2.var_dict['V'].value) + return (evals,) + + +@app.cell +def _(evals): + evals + return + + +@app.cell(hide_code=True) +def _(mo, os, re): + # model loading widget + _list = sorted( + [x for x in os.listdir(".") if re.match("case.+.py",x)], # get only "case*.py" + key=lambda x: int(re.sub("[^0-9]*([0-9]+)[^0-9]*", r"\1", x, 1)), # sort by numerical order not lexical + ) + _options = {os.path.splitext(x)[0]: x for x in _list} + model_ui = mo.ui.dropdown( + options=_options, value=os.path.splitext(_list[0])[0], label='select model:' + ) + return (model_ui,) + + +@app.cell(hide_code=True) +def _(model_ui, os): + # import model from file + from importlib.machinery import SourceFileLoader + _n = model_ui.value.split('.')[0] + model_loader = SourceFileLoader(_n, os.path.join(".",model_ui.value)).load_module() + load_model = getattr(model_loader, _n) + model_data = load_model() + return (model_data,) + + +@app.cell(hide_code=True) +def _(model_data): + # define network + num_buses = model_data['bus'].shape[0] + lines = [(int(_b[0]), int(_b[1])) for _b in model_data['branch']] + return lines, num_buses + + +@app.cell(hide_code=True) +def _(both, gen_only, lines, load_only): + # build graph + graph = ["flowchart LR"] + for _ix, _l in enumerate(lines): + _f = _l[0] + _t = _l[1] + graph.append(f" {_f:.0f}(({_f})) == {_ix+1} === {_t:.0f}(({_t}))") + graph = "\n".join(graph) + graph += '''\n + classDef gen stroke-dasharray: 5 5;\n + classDef load fill:#f9f;\n + classDef genload stroke-dasharray: 5 5,fill:#f9f;''' + if len(load_only) > 0: + _str = ",".join([str(int(_i)) for _i in load_only]) + graph += "\n class "+_str+" gen;" + if len(gen_only) > 0: + _str = ",".join([str(int(_i)) for _i in gen_only]) + graph += "\n class "+_str+" load;" + if len(both) > 0: + _str = ",".join([str(int(_i)) for _i in both]) + graph += "\n class "+_str+" genload;" + return (graph,) + + +@app.cell(hide_code=True) +def _(lines, np, num_buses, sns): + # define incidence matrix + B = np.zeros((num_buses, len(lines))) + for _ix, _l in enumerate(lines): + B[_l[0]-1, _ix] = -1 + B[_l[1]-1, _ix] = 1 + fig_heatmap = sns.heatmap(B, cmap='bwr', center=0) + return B, fig_heatmap + + +@app.cell +def _(model_data, model_ui, np): + # construct dictionaries for problem formulation + def merge_nested_dicts(dict1, dict2): + result = {} + + for key in dict1.keys() | dict2.keys(): + inner_dict1 = dict1.get(key, {}) + inner_dict2 = dict2.get(key, {}) + + # Merge the inner dictionaries + merged_inner_dict = {**inner_dict1, **inner_dict2} + + result[key] = merged_inner_dict + + return result + # minimum generation value occaisonally negative + generator_dict1 = {int(_g[0]): {'p_min': np.clip(_g[9], 0, np.inf), 'p_max': _g[8]*2} for _g in model_data['gen']} + generator_dict2 = {int(model_data['gen'][_ix, 0]): {'c0': _g[-1], 'c1': _g[-2], 'c2': _g[-3]} for _ix, _g in enumerate(model_data['gencost'])} + generator_dict = merge_nested_dicts(generator_dict1, generator_dict2) + # power demand is occaisonally negative + # load_dict = {int(_l[0]): {'l_min': 0, 'l_upper': np.abs(_l[2]), 'cost': 250} for _l in model_data['bus']} + load_dict = {int(_l[0]): {'l_min': np.abs(_l[2]*0.5), 'l_upper': np.abs(_l[2]), 'cost': 1e4} for _l in model_data['bus']} + _fmax = 20 * np.max([np.max(_b[5:7]) for _b in model_data['branch']]) + + flow_dict = {} + for _ix, _b in enumerate(model_data['branch']): + _fx = np.max(_b[5:7]) + flow_dict[_ix] = {'r': _b[2], 'x': _b[3], 'b': _b[4], 'g': _b[2] / (_b[2]**2 + _b[3]**2)} + if model_ui.value == 'case14.py': + flow_dict[_ix]['f_max'] = 175 + elif _fx > 0: + flow_dict[_ix]['f_max'] = _fx + else: + flow_dict[_ix]['f_max'] = _fmax + line_resistance = model_data['branch'][:, 2] + return flow_dict, generator_dict, load_dict + + +@app.cell(hide_code=True) +def _(model_data, np): + # label nodes + generator_nodes = model_data['gen'][:, 0] + load_nodes = np.where(model_data['bus'][:, 2] != 0)[0] + 1 + set_gen_nodes = set(generator_nodes) + set_load_nodes = set(load_nodes) + gen_only = np.asarray(list(set_gen_nodes.difference(set_load_nodes))) + load_only = np.asarray(list(set_load_nodes.difference(set_gen_nodes))) + both = np.asarray(list(set_gen_nodes.intersection(set_load_nodes))) + return both, gen_only, load_only + + +@app.cell +def _(model_ui): + model_ui + return + + +@app.cell(hide_code=True) +def _(fig_heatmap, generator_dict, graph, load_dict, mo): + mo.ui.tabs({ + 'graph': mo.mermaid(graph), + 'incidence matrix': fig_heatmap, + 'generators': mo.accordion({str(_k): _v for _k, _v in generator_dict.items()}), + 'loads': mo.accordion({str(_k): _v for _k, _v in load_dict.items()}) + }) + return + + +@app.cell +def _(flow_limits, gen_limits, load_limits, mo): + mo.hstack([load_limits, gen_limits, flow_limits]) + return + + +@app.cell +def _(B, flow_dict, generator_dict, load_dict, make_problem): + problem = make_problem(B, generator_dict, load_dict, flow_dict) + return (problem,) + + +@app.cell(hide_code=True) +def _(flow_limits, gen_limits, load_limits, mo, np, problem): + # solve with updated parameters + am_solving = True + problem.param_dict['g_min'].value = [_v[0] for _v in gen_limits.value] + problem.param_dict['g_max'].value = [_v[1] for _v in gen_limits.value] + problem.param_dict['l_min'].value = [_v[0] for _v in load_limits.value] + problem.param_dict['l_upper'].value = [_v[1] for _v in load_limits.value] + problem.param_dict['line capacities'].value = flow_limits.value + obj_val = problem.solve(verbose=True, solver='CLARABEL') + constrained_lines = np.where(~np.isclose(problem.constraints[2].dual_value, 0, atol=1e-2))[0] + mo.md(f'objective value: {obj_val:.2f}') + return am_solving, constrained_lines + + +@app.cell +def _(bus_power_fig, mo, solution, solution2): + mo.ui.tabs({ + 'bus power': bus_power_fig, + 'line flows': mo.mermaid(solution), + 'line flows ordered': mo.mermaid(solution2) + }) + return + + +@app.cell(hide_code=True) +def _(generator_dict, mo, np): + # generator ui + _max = np.ceil(1.5*np.max([_v['p_max'] for _k, _v in generator_dict.items()])) + gen_limits = mo.ui.array([mo.ui.range_slider(start=0, + stop=_max, + label=f'gen {_ix}', + value=[_gen['p_min'], _gen['p_max']], + debounce=True, + show_value=True) + for _ix, _gen in generator_dict.items()], label='generator limits') + return (gen_limits,) + + +@app.cell(hide_code=True) +def _(load_dict, mo, np): + # load ui + _max = np.ceil(1.5*np.max([_v['l_upper'] for _k, _v in load_dict.items()])) + load_limits = mo.ui.array([mo.ui.range_slider(start=0, + stop=_max, + label=f'load {_ix}', + value=[_load['l_min'], _load['l_upper']], + debounce=True, + show_value=True,) + for _ix, _load in load_dict.items()], label='load limits') + return (load_limits,) + + +@app.cell(hide_code=True) +def _(flow_dict, mo, np): + # flow ui + _max = np.ceil(1.5*np.max([_v['f_max'] for _k, _v in flow_dict.items()])) + flow_limits = mo.ui.array([mo.ui.slider(start=0, + stop=_max, + label=f'line {_ix+1}', + value=_line['f_max'], + debounce=True, + show_value=True,) + for _ix, _line in flow_dict.items()], label='flow limits') + return (flow_limits,) + + +@app.cell(hide_code=True) +def _( + am_solving, + gen_limits, + generator_dict, + load_limits, + np, + num_buses, + plt, + problem, +): + # plot bus generators and loads + am_solving + _fig, _ax = plt.subplots(nrows=3, sharex=True, figsize=(9, 5.5)) + _ax[0].stem(np.arange(num_buses)+1, problem.var_dict['p_gen'].value, label='gen') + _ax[0].plot((np.arange(num_buses)+1)[np.array(list(generator_dict.keys()))-1], [_v[1] for _v in gen_limits.value], + ls='none', marker=7, color='orange', label='max') + _ax[0].plot((np.arange(num_buses)+1)[np.array(list(generator_dict.keys()))-1], [_v[0] for _v in gen_limits.value], + ls='none', marker=6, color='red', label='min') + _ax[0].legend() + _ax[0].set_title('generator production') + _ax[0].set_ylabel('power [MW]') + _ax[1].stem(np.arange(num_buses)+1, problem.var_dict['p_load'].value, label='served') + _ax[1].plot(np.arange(num_buses)+1, [_v[1] for _v in load_limits.value], + ls='none', marker=7, color='orange', label='desired') + _ax[1].plot(np.arange(num_buses)+1, [_v[0] for _v in load_limits.value], + ls='none', marker=6, color='red', label='min') + _ax[1].legend() + _ax[1].set_title('load served') + _ax[1].set_ylabel('power [MW]') + _ax[2].scatter(np.arange(num_buses)+1, -1 * problem.constraints[0].dual_value) + _ax[2].set_title('node prices') + _ax[2].set_ylabel('dual value (price)') + _ax[2].set_xlabel('bus number') + plt.tight_layout() + bus_power_fig = _fig + return (bus_power_fig,) + + +@app.cell(hide_code=True) +def _( + am_solving, + both, + constrained_lines, + gen_only, + lines, + load_only, + problem, +): + # power flow graph view 1 + am_solving + solution2 = ["flowchart LR"] + for _ix, _l in enumerate(lines): + _f = _l[0] + _t = _l[1] + _lf = problem.var_dict['line flows'][_ix].value + if _lf >= 0: + solution2.append(f" {_f:.0f}(({_f})) == {_lf:.2f} ==> {_t:.0f}(({_t}))") + else: + # solution2.append(f" {_f:.0f}(({_f})) ~~~ {_t:.0f}(({_t}))") + solution2.append(f" {_t:.0f}(({_t})) == {-_lf:.2f} ==> {_f:.0f}(({_f}))") + solution2 = "\n".join(solution2) + solution2 += '''\n + classDef gen stroke-dasharray: 5 5;\n + classDef load fill:#f9f;\n + classDef genload stroke-dasharray: 5 5,fill:#f9f;''' + if len(load_only) > 0: + _str = ",".join([str(int(_i)) for _i in load_only]) + solution2 += "\n class "+_str+" gen;" + if len(gen_only) > 0: + _str = ",".join([str(int(_i)) for _i in gen_only]) + solution2 += "\n class "+_str+" load;" + if len(both) > 0: + _str = ",".join([str(int(_i)) for _i in both]) + solution2 += "\n class "+_str+" genload;" + if len(constrained_lines) > 0: + _str = ",".join([str(int(_i)) for _i in constrained_lines]) + solution2 += "\n linkStyle "+_str+" color:red;" + return (solution2,) + + +@app.cell +def _(solution): + solution + return + + +@app.cell(hide_code=True) +def _( + am_solving, + both, + constrained_lines, + gen_only, + lines, + load_only, + problem, +): + # power flow graph view 2 + am_solving + solution = ["flowchart LR"] + for _ix, _l in enumerate(lines): + _f = _l[0] + _t = _l[1] + _lf = problem.var_dict['line flows'][_ix].value + solution.append(f" {_f:.0f}(({_f})) == {_lf:.2f} ==> {_t:.0f}(({_t}))") + # if _lf >= 0: + # solution.append(f" {_f:.0f}(({_f})) == {_lf:.2f} ==> {_t:.0f}(({_t}))") + # else: + # solution.append(f" {_t:.0f}(({_t})) == {-_lf:.2f} ==> {_f:.0f}(({_f}))") + solution = "\n".join(solution) + solution += ''' + classDef gen stroke-dasharray: 5 5; + classDef load fill:#f9f; + classDef genload stroke-dasharray: 5 5,fill:#f9f;''' + if len(load_only) > 0: + _str = ",".join([str(int(_i)) for _i in load_only]) + solution += "\n class "+_str+" gen;" + if len(gen_only) > 0: + _str = ",".join([str(int(_i)) for _i in gen_only]) + solution += "\n class "+_str+" load;" + if len(both) > 0: + _str = ",".join([str(int(_i)) for _i in both]) + solution += "\n class "+_str+" genload;" + if len(constrained_lines) > 0: + _str = ",".join([str(int(_i)) for _i in constrained_lines]) + solution += "\n linkStyle "+_str+" color:red;" + return (solution,) + + +@app.cell +def _(): + import marimo as mo + import os, re + import numpy as np + import cvxpy as cp + import matplotlib.pyplot as plt + import seaborn as sns + return cp, mo, np, os, plt, re, sns + + +if __name__ == "__main__": + app.run() diff --git a/dc-opf/case240.py b/dc-opf/case240.py new file mode 100644 index 00000000..b6ab5dd1 --- /dev/null +++ b/dc-opf/case240.py @@ -0,0 +1,939 @@ +from numpy import array +def case240(): + return { + "version": '2', + "baseMVA": 100.0, + "bus": array([ + [1, 1, 0.0, 0.0, 0.0, 0.0, 1, 1.03401, 5.5785, 500.0, 3, 1.1, 0.9], + [2, 1, 226.8, 600.0, 0.0, 0.0, 1, 1.014, 8.3685, 345.0, 3, 1.1, 0.9], + [3, 1, 2153.3, -366.9, 0.0, 0.0, 1, 0.97318, -0.292, 230.0, 10, 1.1, 0.9], + [4, 1, 1037.9, -5.5, 0.0, 0.0, 1, 1.03, 18.8075, 345.0, 10, 1.1, 0.9], + [5, 2, 0.0, 0.0, 0.0, 0.0, 1, 1.0139, 8.9503, 20.0, 10, 1.1, 0.9], + [6, 2, 0.0, 0.0, 0.0, 0.0, 1, 1.03341, 20.4253, 20.0, 10, 1.1, 0.9], + [7, 1, 4527.4, 137.0, 0.0, 0.0, 1, 1.01, -13.5878, 500.0, 3, 1.1, 0.9], + [8, 1, 178.9, -23.7, 0.0, 0.0, 1, 0.99465, -4.7874, 345.0, 3, 1.1, 0.9], + [9, 2, 0.0, 0.0, 0.0, 0.0, 1, 1.00946, -12.8589, 20.0, 3, 1.1, 0.9], + [10, 1, 168.1, 2.0, 0.0, 0.0, 1, 1.09136, -6.6183, 500.0, 3, 1.1, 0.9], + [11, 1, 875.6, -287.1, 0.0, 0.0, 1, 1.08, -3.8673, 500.0, 3, 1.1, 0.9], + [12, 2, 0.0, 0.0, 0.0, 0.0, 1, 1.0799, -3.0358, 20.0, 3, 1.1, 0.9], + [13, 1, 2704.8, -352.8, 0.0, 0.0, 1, 1.045, -9.8666, 500.0, 3, 1.1, 0.9], + [14, 1, 17.5, -2.3, 0.0, 0.0, 1, 1.02442, -11.6849, 500.0, 9, 1.1, 0.9], + [15, 1, 6235.1, -813.3, 0.0, 0.0, 1, 1.005, -15.2256, 345.0, 9, 1.1, 0.9], + [16, 2, 0.0, 0.0, 0.0, 0.0, 1, 1.04505, -8.7861, 20.0, 3, 1.1, 0.9], + [17, 2, 0.0, 0.0, 0.0, 0.0, 1, 1.00792, -13.7701, 20.0, 9, 1.1, 0.9], + [18, 1, 6535.5, -1524.6, 0.0, 0.0, 1, 1.035, -14.7822, 500.0, 3, 1.1, 0.9], + [19, 1, 5373.3, 601.7, 0.0, 0.0, 1, 1.05895, -20.357, 500.0, 3, 1.1, 0.9], + [20, 1, 0.0, 0.0, 0.0, 0.0, 1, 1.03527, -14.4059, 230.0, 3, 1.1, 0.9], + [21, 2, 0.0, 0.0, 0.0, 0.0, 1, 1.04004, -12.4298, 20.0, 3, 1.1, 0.9], + [22, 1, 2207.2, -287.9, 0.0, 0.0, 4, 1.0, -16.7754, 230.0, 7, 1.1, 0.9], + [23, 2, 0.0, 0.0, 0.0, 0.0, 4, 1.00135, -16.0721, 20.0, 7, 1.1, 0.9], + [24, 1, 253.0, -49.3, 0.0, 0.0, 2, 1.035, -12.4531, 230.0, 2, 1.1, 0.9], + [25, 2, 0.0, 0.0, 0.0, 0.0, 2, 1.03554, -12.0979, 20.0, 2, 1.1, 0.9], + [26, 1, 0.0, 0.0, 0.0, 0.0, 2, 0.99375, -26.5153, 500.0, 2, 1.1, 0.9], + [27, 1, 1400.8, -245.0, 0.0, 0.0, 2, 0.99067, -27.7043, 230.0, 2, 1.1, 0.9], + [28, 1, 1537.7, -250.4, 0.0, 0.0, 2, 1.005, -27.9287, 230.0, 2, 1.1, 0.9], + [29, 2, 0.0, 0.0, 0.0, 0.0, 2, 1.00686, -27.6476, 20.0, 2, 1.1, 0.9], + [30, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.0356, -14.9787, 500.0, 2, 1.1, 0.9], + [31, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.035, -13.8866, 230.0, 2, 1.1, 0.9], + [32, 2, 0.0, 0.0, 0.0, 0.0, 2, 1.0352, -13.6518, 20.0, 2, 1.1, 0.9], + [33, 1, 763.5, -69.8, 0.0, 0.0, 2, 1.02954, -19.7851, 500.0, 2, 1.1, 0.9], + [34, 1, 794.4, -94.8, 0.0, 0.0, 2, 1.05, -13.6953, 500.0, 2, 1.1, 0.9], + [35, 1, 974.2, -74.1, 0.0, 0.0, 2, 1.03174, -18.0034, 500.0, 2, 1.1, 0.9], + [36, 1, 950.0, -35.1, 0.0, 0.0, 2, 1.02708, -22.3928, 500.0, 2, 1.1, 0.9], + [37, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.03914, -9.929, 500.0, 2, 1.1, 0.9], + [38, 1, 742.7, -20.6, 0.0, 0.0, 2, 1.01146, -11.0446, 230.0, 2, 1.1, 0.9], + [39, 1, 664.3, 36.7, 0.0, 0.0, 2, 1.00777, -14.9652, 230.0, 2, 1.1, 0.9], + [40, 1, 1570.0, 33.3, 0.0, 0.0, 2, 0.97489, -20.8953, 230.0, 2, 1.1, 0.9], + [41, 1, 1568.9, 65.4, 0.0, 0.0, 2, 1.009, -9.1772, 230.0, 2, 1.1, 0.9], + [42, 1, 1441.6, 78.0, 0.0, 0.0, 2, 1.02, -18.7773, 230.0, 2, 1.1, 0.9], + [43, 1, 1421.5, -52.5, 0.0, 0.0, 2, 1.0071, -14.6945, 230.0, 2, 1.1, 0.9], + [44, 1, 979.0, -68.4, 0.0, 0.0, 2, 1.02033, -11.4155, 230.0, 2, 1.1, 0.9], + [45, 2, 0.0, 0.0, 0.0, 0.0, 2, 1.04996, -13.6693, 20.0, 2, 1.1, 0.9], + [46, 2, 0.0, 0.0, 0.0, 0.0, 2, 1.02, -11.388, 20.0, 2, 1.1, 0.9], + [47, 2, 0.0, 0.0, 0.0, 0.0, 2, 1.00981, -7.7532, 20.0, 2, 1.1, 0.9], + [48, 2, 0.0, 0.0, 0.0, 0.0, 2, 1.01976, -18.7223, 20.0, 2, 1.1, 0.9], + [49, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.02693, -20.2708, 500.0, 2, 1.1, 0.9], + [50, 1, 2136.3, 83.0, 0.0, 0.0, 2, 1.0232, -21.6056, 230.0, 2, 1.1, 0.9], + [51, 1, 1661.3, -181.8, 0.0, 0.0, 2, 1.009, -23.5705, 230.0, 2, 1.1, 0.9], + [52, 2, 0.0, 0.0, 0.0, 0.0, 2, 1.00959, -23.0364, 20.0, 2, 1.1, 0.9], + [53, 1, -1680.8, 0.0, 0.0, 0.0, 2, 1.05578, -9.3695, 500.0, 2, 1.1, 0.9], + [54, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.04794, -9.8178, 500.0, 2, 1.1, 0.9], + [55, 1, 89.5, -11.7, 0.0, 0.0, 2, 1.02251, -9.435, 500.0, 2, 1.1, 0.9], + [56, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.05656, -10.0289, 500.0, 2, 1.1, 0.9], + [57, 1, 1845.7, 0.0, 0.0, 0.0, 2, 1.03, -3.339, 345.0, 2, 1.1, 0.9], + [58, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.02096, -7.2426, 287.0, 2, 1.1, 0.9], + [59, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.02096, -7.2426, 287.0, 2, 1.1, 0.9], + [60, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.04732, -9.098, 287.0, 2, 1.1, 0.9], + [61, 1, 89.4, -11.7, 0.0, 0.0, 2, 1.015, -9.4369, 230.0, 2, 1.1, 0.9], + [62, 1, 120.8, -24.2, 0.0, 0.0, 2, 0.99971, -7.7201, 230.0, 2, 1.1, 0.9], + [63, 1, 89.3, -11.7, 0.0, 0.0, 2, 1.004, 6.4589, 230.0, 2, 1.1, 0.9], + [64, 1, 89.4, -11.7, 0.0, 0.0, 2, 1.015, -9.6301, 230.0, 2, 1.1, 0.9], + [65, 1, 108.1, -22.3, 0.0, 0.0, 2, 1.01357, -9.996, 230.0, 2, 1.1, 0.9], + [66, 1, 286.2, -58.2, 0.0, 0.0, 2, 0.99477, -4.2231, 230.0, 2, 1.1, 0.9], + [67, 1, 123.4, -25.1, 0.0, 0.0, 2, 1.00215, -5.8005, 230.0, 2, 1.1, 0.9], + [68, 1, 722.5, -118.3, 0.0, 0.0, 2, 1.00539, -9.1473, 230.0, 2, 1.1, 0.9], + [69, 1, 104.6, -21.5, 0.0, 0.0, 2, 0.9967, -4.5571, 230.0, 2, 1.1, 0.9], + [70, 1, 108.2, -22.4, 0.0, 0.0, 2, 0.99769, -6.2866, 230.0, 2, 1.1, 0.9], + [71, 1, 793.4, 5.5, 0.0, 0.0, 2, 1.01112, -10.9936, 230.0, 2, 1.1, 0.9], + [72, 1, -2497.4, 0.0, 0.0, 0.0, 2, 1.01253, -9.6918, 230.0, 2, 1.1, 0.9], + [73, 1, 183.4, -15.7, 0.0, 0.0, 2, 1.00929, -10.0536, 230.0, 2, 1.1, 0.9], + [74, 1, 212.1, 56.6, 0.0, 0.0, 2, 1.01278, -6.9051, 138.0, 2, 1.1, 0.9], + [75, 2, 0.0, 0.0, 0.0, 0.0, 2, 1.00486, 7.1069, 20.0, 2, 1.1, 0.9], + [76, 2, 0.0, 0.0, 0.0, 0.0, 2, 1.01516, -9.5656, 20.0, 2, 1.1, 0.9], + [77, 2, 0.0, 0.0, 0.0, 0.0, 2, 1.02988, -2.924, 20.0, 2, 1.1, 0.9], + [78, 2, 0.0, 0.0, 0.0, 0.0, 2, 1.01377, -9.9729, 20.0, 2, 1.1, 0.9], + [79, 2, 0.0, 0.0, 0.0, 0.0, 2, 1.01504, -9.3813, 20.0, 2, 1.1, 0.9], + [80, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.10739, -9.9996, 500.0, 2, 1.1, 0.9], + [81, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.1174, -11.1977, 500.0, 2, 1.1, 0.9], + [82, 1, 307.7, -47.7, 0.0, 0.0, 2, 0.98132, -7.7767, 230.0, 2, 1.1, 0.9], + [83, 1, 143.7, -22.5, 0.0, 0.0, 2, 0.98603, -6.6336, 230.0, 2, 1.1, 0.9], + [84, 1, 377.6, -53.8, 0.0, 0.0, 2, 0.99272, -4.5012, 230.0, 2, 1.1, 0.9], + [85, 1, 279.5, -36.3, 0.0, 0.0, 2, 0.98581, -11.495, 115.0, 2, 1.1, 0.9], + [86, 1, 215.4, -44.2, 0.0, 0.0, 2, 1.0, -11.5056, 115.0, 2, 1.1, 0.9], + [87, 2, 0.0, 0.0, 0.0, 0.0, 2, 0.99266, -4.4922, 20.0, 2, 1.1, 0.9], + [88, 2, 0.0, 0.0, 0.0, 0.0, 2, 1.00043, -11.4426, 20.0, 2, 1.1, 0.9], + [89, 1, 418.7, -89.1, 0.0, 0.0, 2, 1.00361, -4.5744, 230.0, 2, 1.1, 0.9], + [90, 1, 530.2, -75.9, 0.0, 0.0, 2, 1.00231, -4.1296, 230.0, 2, 1.1, 0.9], + [91, 1, 592.9, -143.3, 0.0, 0.0, 2, 1.00055, -4.2221, 230.0, 2, 1.1, 0.9], + [92, 1, 601.9, -85.8, 0.0, 0.0, 2, 1.01, 0.1458, 230.0, 2, 1.1, 0.9], + [93, 1, 492.6, -70.3, 0.0, 0.0, 2, 1.00081, -2.5203, 230.0, 2, 1.1, 0.9], + [94, 2, 0.0, 0.0, 0.0, 0.0, 2, 1.01207, 1.2652, 20.0, 2, 1.1, 0.9], + [95, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.01131, -4.7303, 500.0, 2, 1.1, 0.9], + [96, 1, 311.4, -77.5, 0.0, 0.0, 2, 0.9843, -7.6693, 230.0, 2, 1.1, 0.9], + [97, 1, 562.9, -135.6, 0.0, 0.0, 2, 1.0, -5.4781, 230.0, 2, 1.1, 0.9], + [98, 1, 480.9, -110.7, 0.0, 0.0, 2, 0.98986, -7.0451, 230.0, 2, 1.1, 0.9], + [99, 1, 387.7, -55.2, 0.0, 0.0, 2, 0.99494, -4.7831, 230.0, 2, 1.1, 0.9], + [100, 2, 0.0, 0.0, 0.0, 0.0, 2, 1.00081, -5.246, 20.0, 2, 1.1, 0.9], + [101, 1, 505.8, -124.2, 0.0, 0.0, 2, 0.96667, -13.8507, 230.0, 2, 1.1, 0.9], + [102, 1, 0.0, 0.0, 0.0, 0.0, 2, 0.9688, -13.8643, 230.0, 2, 1.1, 0.9], + [103, 1, 464.4, -66.2, 0.0, 0.0, 2, 1.0, -1.5414, 230.0, 2, 1.1, 0.9], + [104, 1, 395.7, -56.2, 0.0, 0.0, 2, 0.98837, -8.6626, 230.0, 2, 1.1, 0.9], + [105, 1, 407.0, -58.2, 0.0, 0.0, 2, 0.9621, -15.576, 230.0, 2, 1.1, 0.9], + [106, 1, 0.0, 0.0, 0.0, 0.0, 2, 0.9688, -13.8643, 20.0, 2, 1.1, 0.9], + [107, 2, 0.0, 0.0, 0.0, 0.0, 2, 1.00024, -1.1903, 20.0, 2, 1.1, 0.9], + [108, 1, 562.5, -80.1, 0.0, 0.0, 2, 1.0, 1.6159, 230.0, 2, 1.1, 0.9], + [109, 2, 0.0, 0.0, 0.0, 0.0, 2, 1.00036, 1.9278, 20.0, 2, 1.1, 0.9], + [110, 1, 94.4, -13.4, 0.0, 0.0, 2, 1.015, -3.945, 115.0, 2, 1.1, 0.9], + [111, 2, 0.0, 0.0, 0.0, 0.0, 2, 1.01477, -3.918, 20.0, 2, 1.1, 0.9], + [112, 1, 319.1, -16.1, 0.0, 0.0, 1, 1.00657, -20.6887, 115.0, 9, 1.1, 0.9], + [113, 2, 0.0, 0.0, 0.0, 0.0, 1, 1.00596, -20.6259, 20.0, 9, 1.1, 0.9], + [114, 1, 172.1, -42.7, 0.0, 0.0, 2, 1.049, 0.2332, 500.0, 2, 1.1, 0.9], + [115, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.03709, -5.7476, 500.0, 2, 1.1, 0.9], + [116, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.04616, -7.1165, 500.0, 2, 1.1, 0.9], + [117, 1, 202.3, -50.3, 0.0, 0.0, 2, 1.00233, -7.1239, 230.0, 2, 1.1, 0.9], + [118, 1, 449.4, -146.8, 0.0, 0.0, 2, 1.035, -6.6568, 230.0, 2, 1.1, 0.9], + [119, 1, 260.6, -37.2, 0.0, 0.0, 2, 1.019, -3.5261, 230.0, 2, 1.1, 0.9], + [120, 2, 0.0, 0.0, 0.0, 0.0, 2, 1.04876, 0.7821, 20.0, 2, 1.1, 0.9], + [121, 2, 0.0, 0.0, 0.0, 0.0, 2, 1.03528, -6.5555, 20.0, 2, 1.1, 0.9], + [122, 2, 0.0, 0.0, 0.0, 0.0, 2, 1.01896, -3.3388, 20.0, 2, 1.1, 0.9], + [123, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.05217, -9.2502, 500.0, 2, 1.1, 0.9], + [124, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.03871, -3.908, 500.0, 2, 1.1, 0.9], + [125, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.03351, -13.1513, 500.0, 2, 1.1, 0.9], + [126, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.03851, -3.8546, 500.0, 2, 1.1, 0.9], + [127, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.0337, -13.1723, 500.0, 2, 1.1, 0.9], + [128, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.0389, -3.6959, 500.0, 2, 1.1, 0.9], + [129, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.03561, -13.0099, 500.0, 2, 1.1, 0.9], + [130, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.0299, -6.014, 500.0, 2, 1.1, 0.9], + [131, 1, 137.7, -34.4, 0.0, 0.0, 2, 1.0, -2.2632, 500.0, 2, 1.1, 0.9], + [132, 1, 197.4, -28.8, 0.0, 0.0, 2, 1.03465, -5.2887, 500.0, 2, 1.1, 0.9], + [133, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.03414, -5.4622, 500.0, 2, 1.1, 0.9], + [134, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.04915, -6.1484, 500.0, 2, 1.1, 0.9], + [135, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.06991, -5.5014, 500.0, 2, 1.1, 0.9], + [136, 1, 417.3, -57.3, 0.0, 0.0, 2, 0.96956, -13.7171, 230.0, 2, 1.1, 0.9], + [137, 1, 182.2, -22.7, 0.0, 0.0, 2, 0.97516, -16.5874, 230.0, 2, 1.1, 0.9], + [138, 1, 157.4, -37.5, 0.0, 0.0, 2, 0.98747, -17.7611, 230.0, 2, 1.1, 0.9], + [139, 1, 223.8, -32.8, 0.0, 0.0, 2, 0.97959, -12.9925, 230.0, 2, 1.1, 0.9], + [140, 1, 213.2, -43.8, 0.0, 0.0, 2, 1.04304, -4.1388, 230.0, 2, 1.1, 0.9], + [141, 1, 160.8, 0.6, 0.0, 0.0, 2, 1.02453, -10.2031, 230.0, 2, 1.1, 0.9], + [142, 1, 297.4, -39.3, 0.0, 0.0, 2, 0.98796, -12.6866, 230.0, 2, 1.1, 0.9], + [143, 1, 205.5, -47.5, 0.0, 0.0, 2, 0.99136, -2.1378, 230.0, 2, 1.1, 0.9], + [144, 1, 230.2, -48.5, 0.0, 0.0, 2, 0.99702, -3.3855, 230.0, 2, 1.1, 0.9], + [145, 1, 142.9, 0.0, 0.0, 0.0, 2, 1.02219, -9.9548, 230.0, 2, 1.1, 0.9], + [146, 1, 216.3, -40.3, 0.0, 0.0, 2, 1.01012, -8.3354, 230.0, 2, 1.1, 0.9], + [147, 1, 287.8, -68.1, 0.0, 0.0, 2, 0.99384, -6.0267, 230.0, 2, 1.1, 0.9], + [148, 1, 171.1, -23.0, 0.0, 0.0, 2, 0.99679, -16.618, 230.0, 2, 1.1, 0.9], + [149, 1, 157.3, -21.9, 0.0, 0.0, 2, 0.99025, -16.2913, 230.0, 2, 1.1, 0.9], + [150, 1, 135.8, -31.3, 0.0, 0.0, 2, 1.07, 1.5011, 230.0, 2, 1.1, 0.9], + [151, 1, 235.6, -30.6, 0.0, 0.0, 2, 1.01629, -12.7252, 230.0, 2, 1.1, 0.9], + [152, 1, 359.7, -60.5, 0.0, 0.0, 2, 1.01761, -1.025, 230.0, 2, 1.1, 0.9], + [153, 1, 303.0, -43.5, 0.0, 0.0, 2, 1.00949, -5.4562, 230.0, 2, 1.1, 0.9], + [154, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.02989, -4.0766, 115.0, 2, 1.1, 0.9], + [155, 1, 243.7, -15.4, 0.0, 0.0, 2, 0.99786, -19.5525, 115.0, 2, 1.1, 0.9], + [156, 2, 0.0, 0.0, 0.0, 0.0, 2, 1.07066, 1.8629, 20.0, 2, 1.1, 0.9], + [157, 2, 0.0, 0.0, 0.0, 0.0, 2, 0.99876, -1.8746, 20.0, 2, 1.1, 0.9], + [158, 3, 0.0, 0.0, 0.0, 0.0, 2, 1.02, 0.0, 20.0, 2, 1.1, 0.9], + [159, 1, 0.0, 0.0, 0.0, 600.0, 3, 1.08, -5.9328, 500.0, 11, 1.1, 0.9], + [160, 1, 172.1, -22.9, 0.0, 0.0, 3, 1.1141, -3.7122, 500.0, 11, 1.1, 0.9], + [161, 1, 0.0, 0.0, 0.0, 0.0, 3, 1.12835, 4.1039, 500.0, 11, 1.1, 0.9], + [162, 1, 273.3, -36.1, 0.0, 0.0, 3, 1.10132, -5.7208, 500.0, 11, 1.1, 0.9], + [163, 1, 480.1, -157.4, 0.0, 0.0, 3, 1.08, -5.3425, 500.0, 11, 1.1, 0.9], + [164, 1, 0.0, 0.0, 0.0, 0.0, 3, 1.07594, -8.9606, 500.0, 11, 1.1, 0.9], + [165, 1, 0.0, 0.0, 0.0, 0.0, 3, 1.07595, -9.1337, 500.0, 11, 1.1, 0.9], + [166, 1, 286.4, -37.5, 0.0, 0.0, 3, 1.08013, -8.1151, 345.0, 11, 1.1, 0.9], + [167, 1, 2208.7, -431.4, 0.0, 0.0, 3, 1.08, -11.4341, 230.0, 11, 1.1, 0.9], + [168, 1, 3133.1, 0.0, 0.0, 0.0, 3, 1.07871, -11.6748, 230.0, 11, 1.1, 0.9], + [169, 2, 0.0, 0.0, 0.0, 0.0, 3, 1.07685, -5.5496, 20.0, 11, 1.1, 0.9], + [170, 2, 0.0, 0.0, 0.0, 0.0, 3, 1.07767, -4.7798, 20.0, 11, 1.1, 0.9], + [171, 2, 0.0, 0.0, 0.0, 0.0, 3, 1.08393, -10.8846, 20.0, 13, 1.1, 0.9], + [172, 1, 0.0, 0.0, 0.0, 0.0, 3, 1.11068, -4.0346, 500.0, 11, 1.1, 0.9], + [173, 1, 0.0, 0.0, 0.0, 0.0, 3, 1.11061, -4.8922, 500.0, 11, 1.1, 0.9], + [174, 1, 0.0, 0.0, 0.0, 0.0, 3, 1.09408, -5.9281, 500.0, 11, 1.1, 0.9], + [175, 1, 0.0, 0.0, 0.0, 0.0, 3, 1.0923, -5.9578, 500.0, 11, 1.1, 0.9], + [176, 1, 0.0, 0.0, 0.0, 0.0, 3, 1.10593, -5.7326, 500.0, 11, 1.1, 0.9], + [177, 1, 0.0, 0.0, 0.0, 0.0, 3, 1.09241, -5.9401, 500.0, 11, 1.1, 0.9], + [178, 1, 0.0, 0.0, 0.0, 0.0, 3, 1.09042, -5.9721, 500.0, 11, 1.1, 0.9], + [179, 1, 0.0, 0.0, 0.0, 0.0, 3, 1.10568, -5.7303, 500.0, 11, 1.1, 0.9], + [180, 1, 995.0, -129.8, 0.0, 0.0, 3, 1.128, 11.2675, 500.0, 13, 1.1, 0.9], + [181, 1, 480.6, -68.7, 0.0, 0.0, 3, 1.096, 3.9997, 500.0, 13, 1.1, 0.9], + [182, 1, 11.7, -1.5, 0.0, 0.0, 3, 1.08083, -3.7392, 500.0, 13, 1.1, 0.9], + [183, 1, 2550.6, -335.7, 0.0, 0.0, 3, 1.05179, -14.7065, 230.0, 13, 1.1, 0.9], + [184, 2, 0.0, 0.0, 0.0, 0.0, 3, 1.13099, 13.1595, 20.0, 13, 1.1, 0.9], + [185, 2, 0.0, 0.0, 0.0, 0.0, 3, 1.09651, 5.6353, 20.0, 13, 1.1, 0.9], + [186, 1, 5762.7, -461.0, 0.0, 0.0, 3, 1.12, 4.0883, 500.0, 13, 1.1, 0.9], + [187, 1, 4558.2, -594.6, 0.0, 0.0, 3, 1.06, -8.249, 500.0, 13, 1.1, 0.9], + [188, 1, 4434.8, -585.8, 0.0, 0.0, 3, 1.02932, -11.4988, 500.0, 13, 1.1, 0.9], + [189, 1, 1008.4, -130.7, 0.0, 0.0, 3, 1.06186, -7.7302, 500.0, 13, 1.1, 0.9], + [190, 2, 0.0, 0.0, 0.0, 0.0, 3, 1.12632, 5.0125, 20.0, 13, 1.1, 0.9], + [191, 2, 0.0, 0.0, 0.0, 0.0, 3, 1.05994, -8.0228, 20.0, 13, 1.1, 0.9], + [192, 1, 7574.1, -1721.4, 0.0, 0.0, 3, 1.05, -5.7602, 500.0, 4, 1.1, 0.9], + [193, 1, 9004.0, -1174.4, 0.0, 0.0, 3, 1.055, -6.9724, 500.0, 1, 1.1, 0.9], + [194, 1, 620.9, -81.7, 0.0, 0.0, 3, 1.05368, -10.449, 230.0, 1, 1.1, 0.9], + [195, 1, 0.0, 0.0, 0.0, 0.0, 3, 1.08678, -12.6232, 230.0, 4, 1.1, 0.9], + [196, 2, 0.0, 0.0, 0.0, 0.0, 3, 1.05458, -4.0013, 20.0, 4, 1.1, 0.9], + [197, 2, 0.0, 0.0, 0.0, 0.0, 3, 1.0614, -4.5562, 20.0, 1, 1.1, 0.9], + [198, 1, 0.0, 0.0, 0.0, 0.0, 3, 1.0662, 13.9305, 500.0, 6, 1.1, 0.9], + [199, 1, 1053.1, 345.3, 0.0, 0.0, 3, 1.03, 16.7065, 345.0, 6, 1.1, 0.9], + [200, 1, 392.4, -51.3, 0.0, 0.0, 3, 1.01551, 14.8856, 345.0, 6, 1.1, 0.9], + [201, 1, 1700.1, -222.4, 0.0, 400.0, 3, 1.00976, 2.6761, 230.0, 6, 1.1, 0.9], + [202, 2, 0.0, 0.0, 0.0, 0.0, 3, 1.02575, 17.7272, 20.0, 6, 1.1, 0.9], + [203, 1, 205.8, -26.9, 0.0, 0.0, 3, 1.06, 7.3626, 500.0, 8, 1.1, 0.9], + [204, 1, 89.0, -13.6, 0.0, 0.0, 3, 1.09477, 2.7322, 500.0, 8, 1.1, 0.9], + [205, 1, 612.7, -145.3, 0.0, 0.0, 3, 1.00572, 6.4631, 230.0, 8, 1.1, 0.9], + [206, 1, 702.1, -157.7, 0.0, 0.0, 3, 1.05172, 3.1248, 230.0, 8, 1.1, 0.9], + [207, 1, 489.3, -86.3, 0.0, 0.0, 3, 1.05, 13.0019, 230.0, 8, 1.1, 0.9], + [208, 2, 0.0, 0.0, 0.0, 0.0, 3, 1.05917, 7.5999, 20.0, 8, 1.1, 0.9], + [209, 2, 0.0, 0.0, 0.0, 0.0, 3, 1.05069, 13.3683, 20.0, 8, 1.1, 0.9], + [210, 1, 517.7, -67.7, 0.0, 0.0, 3, 1.01772, 16.19, 345.0, 14, 1.1, 0.9], + [211, 1, 592.5, -77.4, 0.0, 0.0, 3, 1.00694, -32.2769, 345.0, 14, 1.1, 0.9], + [212, 1, 746.6, -97.4, 0.0, 0.0, 3, 1.03, 29.5363, 230.0, 14, 1.1, 0.9], + [213, 1, 0.0, 0.0, 0.0, 600.0, 3, 0.99528, -19.7357, 230.0, 14, 1.1, 0.9], + [214, 1, 60.2, -19.8, 0.0, 0.0, 3, 1.06, 29.9977, 230.0, 14, 1.1, 0.9], + [215, 2, 0.0, 0.0, 0.0, 0.0, 3, 1.03304, 30.548, 20.0, 14, 1.1, 0.9], + [216, 2, 0.0, 0.0, 0.0, 0.0, 3, 1.06359, 30.7165, 20.0, 14, 1.1, 0.9], + [217, 1, 1746.2, -237.8, 0.0, 0.0, 1, 1.07236, -19.1477, 345.0, 9, 1.1, 0.9], + [218, 1, 280.6, -37.7, 0.0, 0.0, 1, 1.03585, -21.0055, 115.0, 9, 1.1, 0.9], + [219, 1, 2.2, -0.3, 0.0, 0.0, 1, 1.11, 4.0155, 345.0, 9, 1.1, 0.9], + [220, 1, 29.8, -4.0, 0.0, 0.0, 1, 1.08194, -4.0766, 345.0, 9, 1.1, 0.9], + [221, 2, 0.0, 0.0, 0.0, 0.0, 1, 1.11115, 4.3221, 20.0, 9, 1.1, 0.9], + [222, 1, 197.3, -65.3, 0.0, 0.0, 3, 1.02227, -0.4241, 345.0, 12, 1.1, 0.9], + [223, 1, 1570.4, -283.0, 0.0, 0.0, 3, 1.02021, -1.1806, 345.0, 12, 1.1, 0.9], + [224, 1, 441.2, -144.6, 0.0, 0.0, 3, 1.065, 10.2234, 345.0, 12, 1.1, 0.9], + [225, 1, 300.4, -39.6, 0.0, 0.0, 3, 1.02275, -1.1804, 345.0, 12, 1.1, 0.9], + [226, 1, 7.0, -2.4, 0.0, 0.0, 3, 1.0714, 8.8513, 345.0, 12, 1.1, 0.9], + [227, 1, 0.0, 0.0, 0.0, 0.0, 3, 1.05902, 8.6263, 345.0, 12, 1.1, 0.9], + [228, 1, 554.9, 64.6, 0.0, 0.0, 3, 1.05132, 0.2894, 345.0, 12, 1.1, 0.9], + [229, 1, 132.6, -43.7, 0.0, 0.0, 3, 1.02819, 1.5377, 345.0, 12, 1.1, 0.9], + [230, 1, 8.7, -2.9, 0.0, 0.0, 3, 1.02095, -1.1618, 345.0, 12, 1.1, 0.9], + [231, 1, 1949.2, 109.3, 0.0, 0.0, 3, 0.98849, 0.3377, 230.0, 12, 1.1, 0.9], + [232, 2, 0.0, 0.0, 0.0, 0.0, 3, 1.06644, 11.0672, 20.0, 12, 1.1, 0.9], + [233, 1, 7000.9, -772.4, 0.0, 200.0, 3, 1.02, -33.8246, 345.0, 5, 1.1, 0.9], + [234, 1, 2554.8, 138.1, 0.0, 0.0, 3, 1.015, -30.6709, 345.0, 5, 1.1, 0.9], + [235, 2, 0.0, 0.0, 0.0, 0.0, 3, 1.02618, -32.574, 20.0, 5, 1.1, 0.9], + [236, 2, 0.0, 0.0, 0.0, 0.0, 3, 1.01535, -29.9099, 20.0, 5, 1.1, 0.9], + [237, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.06479, -6.0412, 500.0, 2, 1.1, 0.9], + [238, 1, 0.0, 0.0, 0.0, 0.0, 2, 1.04198, -7.7367, 500.0, 2, 1.1, 0.9], + [239, 1, 587.4, -76.6, 0.0, 0.0, 2, 1.075, -3.4806, 230.0, 2, 1.1, 0.9], + [240, 1, 3409.1, -444.7, 0.0, 0.0, 2, 1.0, -11.7273, 230.0, 2, 1.1, 0.9], + [241, 1, 1216.9, -162.5, 0.0, 0.0, 2, 1.00301, -13.4174, 230.0, 2, 1.1, 0.9], + [242, 2, 0.0, 0.0, 0.0, 0.0, 2, 1.07619, -3.1879, 20.0, 2, 1.1, 0.9], + [243, 2, 0.0, 0.0, 0.0, 0.0, 2, 1.00225, -10.7632, 20.0, 2, 1.1, 0.9], + ]), + "gen": array([ + [5, 712.0, -3.332, 200.0, -200.0, 1.014, 873.0, 1, 873.0, 0.0], + [5, 856.0, -3.332, 357.0, -357.0, 1.014, 1050.0, 1, 1050.0, 0.0], + [5, 520.0, -3.332, 360.0, -360.0, 1.014, 638.0, 1, 638.0, 0.0], + [6, 1847.0, 262.628, 500.0, -500.0, 1.03, 2100.0, 1, 1944.0, 0.0], + [6, 2565.0, 262.628, 918.0, -918.0, 1.03, 2900.0, 1, 2700.0, 0.0], + [6, 1598.0, 262.628, 800.0, -800.0, 1.03, 1682.0, 1, 1682.0, 0.0], + [9, 530.0, -46.791, 308.0, -308.0, 1.01, 1268.0, 1, 1268.0, 0.0], + [9, 2064.0, -46.791, 1916.0, -1916.0, 1.01, 4934.0, 1, 4934.0, 0.0], + [12, 2728.0, 0.604, 1208.0, -1208.0, 1.08, 4977.0, 1, 4977.0, 0.0], + [12, 657.0, 0.604, 628.0, -628.0, 1.08, 1199.0, 1, 1199.0, 0.0], + [16, 1986.0, 24.69, 841.0, -841.0, 1.045, 2167.0, 1, 2167.0, 0.0], + [16, 2133.0, 24.69, 1219.0, -1219.0, 1.045, 2328.0, 1, 2328.0, 0.0], + [17, 218.0, 217.32, 303.0, -303.0, 1.005, 418.0, 1, 418.0, 0.0], + [17, 3662.0, 217.32, 2746.0, -2746.0, 1.005, 7011.0, 1, 7011.0, 0.0], + [17, 1266.0, 217.32, 1300.0, -1300.0, 1.005, 2423.0, 1, 2423.0, 0.0], + [21, 5129.0, 409.166, 3559.0, -3559.0, 1.035, 9170.0, 1, 9170.0, 0.0], + [21, 2355.0, 409.166, 2057.0, -2057.0, 1.035, 4210.0, 1, 4210.0, 0.0], + [21, 1353.0, 409.166, 1000.0, -1000.0, 1.035, 2419.0, 1, 2419.0, 0.0], + [23, 605.0, 142.477, 350.0, -350.0, 1.0, 699.0, 1, 699.0, 0.0], + [23, 1853.0, 142.477, 1070.0, -1070.0, 1.0, 2140.0, 1, 2140.0, 0.0], + [25, 573.0, 28.722, 254.0, -254.0, 1.035, 831.0, 1, 831.0, 0.0], + [25, 404.0, 28.722, 200.0, -200.0, 1.035, 586.0, 1, 586.0, 0.0], + [25, 273.0, 28.722, 250.0, -250.0, 1.035, 396.0, 1, 396.0, 0.0], + [25, 79.0, 28.722, 86.0, -86.0, 1.035, 115.0, 1, 115.0, 0.0], + [29, 285.0, 125.466, 304.0, -118.0, 1.005, 1035.0, 1, 1035.0, 0.0], + [29, 506.0, 125.466, 611.0, -181.0, 1.005, 1837.0, 1, 1837.0, 0.0], + [29, 202.0, 125.466, 206.0, -155.0, 1.005, 733.0, 1, 733.0, 0.0], + [32, 878.0, 42.001, 590.0, -364.0, 1.035, 1333.0, 1, 1333.0, 0.0], + [45, 500.0, -46.886, 800.0, -800.0, 1.05, 1666.0, 1, 1666.0, 0.0], + [46, 500.0, -337.252, 500.0, -500.0, 1.02, 1489.0, 1, 1489.0, 0.0], + [47, 503.0, 32.102, 728.0, -454.0, 1.009, 2292.0, 1, 2292.0, 0.0], + [47, 0.0, 0.0, 0.5, 0.0, 1.009, 100.0, 0, 0.0, -1006.0], + [47, 1195.999, 32.102, 1902.0, -1168.0, 1.009, 5451.0, 1, 5451.0, 0.0], + [47, 251.0, 32.102, 800.0, -800.0, 1.009, 1146.0, 1, 1146.0, 0.0], + [47, 901.0, 32.102, 2301.0, -1053.0, 1.009, 4110.0, 1, 4110.0, 0.0], + [47, 233.0, 32.102, 659.0, -523.0, 1.009, 1460.0, 1, 1460.0, 0.0], + [47, 704.0, 32.102, 561.0, -553.0, 1.009, 3210.0, 1, 3210.0, 0.0], + [47, 1276.0, 32.102, 1910.0, -1150.0, 1.009, 5817.0, 1, 5817.0, 0.0], + [48, 1000.0, -242.186, 800.0, -800.0, 1.02, 1666.0, 1, 1666.0, 0.0], + [52, 1899.0, 127.613, 1100.0, -820.0, 1.009, 1999.0, 1, 1999.0, 0.0], + [75, 2282.0, 184.814, 1346.0, -1346.0, 1.004, 3947.0, 1, 3947.0, 0.0], + [76, 232.0, 32.063, 350.0, -350.0, 1.015, 520.0, 1, 520.0, 0.0], + [77, 1537.0, -18.88, 950.0, -950.0, 1.03, 1900.0, 1, 1618.0, 0.0], + [78, 83.0, 40.647, 110.0, -110.0, 1.01357, 200.0, 1, 87.0, 0.0], + [79, 200.0, 7.74, 100.0, -100.0, 1.015, 407.0, 1, 407.0, 0.0], + [87, 31.0, -12.551, 42.0, -29.0, 0.99272, 80.0, 1, 62.0, 0.0], + [87, 0.0, 0.0, 500.0, -500.0, 0.99272, 300.0, 0, 0.1, 0.0], + [88, 206.0, 42.757, 239.0, -201.0, 1.0, 541.0, 1, 541.0, 0.0], + [88, 14.0, 42.757, 100.0, -85.0, 1.0, 38.0, 1, 38.0, 0.0], + [94, 104.0, 101.0, 101.0, -75.0, 1.01, 177.0, 1, 177.0, 0.0], + [94, 2261.0, 118.878, 1244.0, -1234.0, 1.01, 3853.0, 1, 3853.0, 0.0], + [94, 608.0, 118.878, 382.0, -212.0, 1.01, 1037.0, 1, 1037.0, 0.0], + [94, 1021.0, 118.878, 150.0, -110.0, 1.01, 1740.0, 1, 1740.0, 0.0], + [100, 620.0, 81.668, 398.0, -226.0, 1.0, 1012.0, 1, 1012.0, 0.0], + [100, 191.0, 81.668, 202.0, -143.0, 1.0, 312.0, 1, 312.0, 0.0], + [106, 0.0, 0.0, 1568.0, -941.0, 1.0, 3746.0, 0, 3746.0, -2841.0], + [107, 481.0, 25.641, 231.0, -175.0, 1.0, 921.0, 1, 921.0, 0.0], + [107, 745.0, 25.641, 939.0, -562.0, 1.0, 1426.0, 1, 1426.0, 0.0], + [109, 783.0, 30.853, 1004.0, -599.0, 1.0, 1424.0, 1, 1424.0, 0.0], + [109, 293.0, 30.853, 253.0, -181.0, 1.0, 533.0, 1, 533.0, 0.0], + [109, 13.0, 13.0, 13.0, -10.0, 1.0, 24.0, 1, 24.0, 0.0], + [111, 30.0, -14.0, 20.0, -14.0, 1.015, 96.0, 1, 96.0, 0.0], + [111, 67.0, -33.095, 74.0, -34.0, 1.015, 210.0, 1, 210.0, 0.0], + [113, 222.0, -121.0, 200.0, -121.0, 1.0, 400.0, 1, 243.0, 0.0], + [120, 2108.0, -40.709, 1175.0, -980.0, 1.049, 2323.0, 1, 2323.0, 0.0], + [121, 0.0, 0.0, 0.5, 0.0, 1.035, 100.0, 0, 0.0, -510.0], + [121, 229.0, 28.865, 662.0, -479.0, 1.035, 2025.0, 1, 2025.0, 0.0], + [121, 150.0, 28.865, 500.0, -500.0, 1.035, 1333.0, 1, 1333.0, 0.0], + [122, 679.0, -6.822, 476.0, -352.0, 1.019, 1497.0, 1, 1497.0, 0.0], + [156, 235.0, 72.471, 151.0, -115.0, 1.07, 567.0, 1, 567.0, 0.0], + [156, 1212.0, 72.471, 1284.0, -946.0, 1.07, 2875.0, 1, 2875.0, 0.0], + [157, 1355.0, -242.757, 1150.0, -500.0, 1.0, 1426.0, 1, 1426.0, 0.0], + [158, 404.88, 88.652, 363.0, -82.0, 1.02, 865.0, 1, 865.0, 0.0], + [158, 161.484, 77.0, 77.0, -55.0, 1.02, 345.0, 1, 345.0, 0.0], + [158, 0.0, 0.0, 0.5, 0.0, 1.02, 100.0, 0, 0.0, -449.0], + [158, 901.97, 88.652, 500.0, -307.0, 1.02, 1927.0, 1, 1927.0, 0.0], + [158, 1275.022, 88.652, 1256.0, -1041.0, 1.02, 2774.0, 1, 2724.0, 0.0], + [158, 346.372, 88.652, 200.0, -200.0, 1.02, 740.0, 1, 740.0, 0.0], + [158, 623.937, 88.652, 800.0, -500.0, 1.02, 1333.0, 1, 1333.0, 0.0], + [169, 892.801, -168.528, 502.0, -502.0, 1.08, 2710.0, 1, 2710.0, 0.0], + [169, 313.199, -168.528, 489.0, -489.0, 1.08, 952.0, 1, 952.0, 0.0], + [169, 140.4, -168.528, 250.0, -250.0, 1.08, 427.0, 1, 427.0, 0.0], + [169, 208.8, -168.528, 240.0, -240.0, 1.08, 635.0, 1, 635.0, 0.0], + [170, 173.7, -122.614, 255.0, -255.0, 1.08, 642.0, 1, 642.0, 0.0], + [170, 448.2, -122.614, 307.0, -307.0, 1.08, 1656.0, 1, 1656.0, 0.0], + [170, 966.6, -122.614, 1836.0, -1836.0, 1.08, 3572.0, 1, 3572.0, 0.0], + [170, 697.5, -122.614, 800.0, -800.0, 1.08, 2578.0, 1, 2578.0, 0.0], + [171, 77.4, 102.0, 102.0, -102.0, 1.08, 150.0, 1, 150.0, 0.0], + [171, 1455.3, 380.224, 1459.0, -1459.0, 1.08, 2839.0, 1, 2839.0, 0.0], + [171, 712.8, 380.224, 500.0, -500.0, 1.08, 1290.0, 1, 1290.0, 0.0], + [184, 450.0, 150.0, 150.0, -150.0, 1.128, 711.0, 1, 711.0, 0.0], + [184, 7418.7, 543.401, 6482.0, -6482.0, 1.128, 12613.0, 1, 12613.0, 0.0], + [184, 555.3, 120.0, 120.0, -120.0, 1.128, 790.0, 1, 790.0, 0.0], + [185, 1854.899, 52.261, 1473.0, -1473.0, 1.096, 2170.0, 1, 2170.0, 0.0], + [185, 3835.801, 52.261, 2847.0, -2847.0, 1.096, 5539.0, 1, 5539.0, 0.0], + [185, 900.0, 52.261, 231.0, -231.0, 1.096, 1200.0, 1, 1200.0, 0.0], + [185, 270.0, 52.261, 160.0, -160.0, 1.096, 400.0, 1, 300.0, 0.0], + [190, 999.0, 485.229, 728.0, -728.0, 1.12, 1460.0, 1, 1460.0, 0.0], + [190, 664.2, 485.229, 659.0, -659.0, 1.12, 970.0, 1, 970.0, 0.0], + [190, 2406.601, 485.229, 1808.0, -1808.0, 1.12, 3517.0, 1, 3517.0, 0.0], + [191, 348.3, -3.607, 592.0, -592.0, 1.06, 872.0, 1, 872.0, 0.0], + [191, 222.3, -3.607, 287.0, -287.0, 1.06, 558.0, 1, 558.0, 0.0], + [191, 316.8, -3.607, 108.0, -108.0, 1.06, 695.0, 1, 695.0, 0.0], + [196, 821.7, 534.329, 605.0, -605.0, 1.05, 2650.0, 1, 2650.0, 0.0], + [196, 5976.0, 534.329, 4399.0, -4399.0, 1.05, 10747.0, 1, 10747.0, 0.0], + [197, 3646.8, 410.28, 2977.0, -2977.0, 1.055, 13039.0, 1, 13039.0, 0.0], + [197, 2695.5, 410.28, 2200.0, -2200.0, 1.055, 9636.0, 1, 9636.0, 0.0], + [197, 66.6, 54.0, 54.0, -54.0, 1.055, 108.0, 1, 108.0, 0.0], + [197, 2701.8, 410.28, 2205.0, -2205.0, 1.055, 4410.2, 1, 4410.2, 0.0], + [197, 331.2, 271.0, 271.0, -271.0, 1.055, 541.0, 1, 541.0, 0.0], + [202, 45.0, -20.0, 20.0, -20.0, 1.03, 122.0, 1, 122.0, 0.0], + [202, 1043.1, -147.0, 147.0, -147.0, 1.03, 1272.0, 1, 1272.0, 0.0], + [202, 1992.599, -387.445, 1072.0, -1072.0, 1.03, 2541.0, 1, 2541.0, 0.0], + [202, 180.0, -75.0, 75.0, -75.0, 1.03, 395.0, 1, 395.0, 0.0], + [202, 503.1, -210.0, 210.0, -210.0, 1.03, 973.0, 1, 973.0, 0.0], + [208, 705.15, -104.087, 1256.0, -1256.0, 1.06, 2488.0, 1, 2488.0, 0.0], + [208, 225.0, -70.0, 70.0, -70.0, 1.06, 250.0, 1, 250.0, 0.0], + [209, 90.0, 49.769, 64.0, -64.0, 1.05, 226.0, 1, 226.0, 0.0], + [209, 1040.4, 49.769, 347.0, -347.0, 1.05, 2671.0, 1, 2671.0, 0.0], + [209, 280.8, 49.769, 195.0, -195.0, 1.05, 720.0, 1, 720.0, 0.0], + [215, 2837.7, 330.576, 1671.0, -1671.0, 1.03, 4594.0, 1, 4594.0, 0.0], + [215, 919.8, 330.576, 350.0, -350.0, 1.03, 1489.0, 1, 1489.0, 0.0], + [216, 2274.3, 260.575, 968.0, -968.0, 1.06, 3000.0, 1, 2660.0, 0.0], + [216, 295.2, 260.575, 330.0, -330.0, 1.06, 418.0, 1, 418.0, 0.0], + [216, 259.2, 260.575, 406.0, -406.0, 1.06, 400.0, 1, 303.0, 0.0], + [221, 194.0, 74.552, 283.0, -283.0, 1.11, 391.0, 1, 391.0, 0.0], + [221, 372.0, 59.0, 59.0, -59.0, 1.11, 751.0, 1, 751.0, 0.0], + [221, 679.0, 74.552, 536.0, -536.0, 1.11, 1369.0, 1, 1369.0, 0.0], + [221, 75.0, 50.0, 50.0, -50.0, 1.11, 152.0, 1, 152.0, 0.0], + [232, 1318.501, 78.734, 1924.0, -1924.0, 1.065, 3276.0, 1, 3276.0, 0.0], + [232, 1213.201, 78.734, 880.0, -880.0, 1.065, 3239.0, 1, 3239.0, 0.0], + [232, 90.0, 75.0, 75.0, -75.0, 1.065, 275.0, 1, 275.0, 0.0], + [232, 566.1, 78.734, 500.0, -500.0, 1.065, 1407.0, 1, 1407.0, 0.0], + [232, 157.5, 20.0, 20.0, -20.0, 1.065, 391.0, 1, 391.0, 0.0], + [235, 1105.199, 380.609, 1419.0, -1419.0, 1.02, 3127.0, 1, 3127.0, 0.0], + [235, 2242.802, 380.609, 2092.0, -2092.0, 1.02, 6346.0, 1, 6346.0, 0.0], + [235, 123.3, 175.0, 175.0, -175.0, 1.02, 509.0, 1, 509.0, -509.0], + [235, 0.0, 0.0, 1000.0, -1000.0, 1.02, 100.0, 0, 0.1, 0.0], + [235, 1098.0, 380.609, 1000.0, -1000.0, 1.02, 3106.0, 1, 3106.0, 0.0], + [236, 1057.5, 22.012, 826.0, -826.0, 1.015, 1821.0, 1, 1821.0, 0.0], + [236, 861.3, 22.012, 489.0, -489.0, 1.015, 1483.0, 1, 1483.0, 0.0], + [236, 390.6, 22.012, 346.0, -346.0, 1.015, 672.0, 1, 672.0, 0.0], + [236, 428.4, 22.012, 230.0, -230.0, 1.015, 738.0, 1, 738.0, 0.0], + [242, 1182.0, 259.732, 786.0, -786.0, 1.075, 1394.0, 1, 1394.0, 0.0], + [243, 2946.0, 239.367, 1280.0, -1280.0, 1.0, 3754.0, 1, 3754.0, 0.0], + [243, 427.0, 239.367, 344.0, -344.0, 1.0, 544.0, 1, 544.0, 0.0], + ]), + "branch": array([ + [1, 10, 0.00177, 0.03169, 3.3446, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [1, 11, 0.0108, 0.0965, 0.3296, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [2, 4, 0.0005, 0.0053, 0.0882, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [2, 8, 0.00179, 0.01988, 2.576, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [2, 8, 0.00179, 0.01988, 2.576, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [2, 227, 0.0048, 0.0436, 0.7078, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [4, 233, 0.00811, 0.1369, 2.4348, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [4, 234, 0.00977, 0.11, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [7, 18, 0.0028, 0.0211, 1.0194, 0.0, 0.0, 1630.0, 0.0, 0.0, 1, -360.0, 360.0], + [7, 18, 0.0028, 0.0211, 1.0194, 0.0, 0.0, 1630.0, 0.0, 0.0, 1, -360.0, 360.0], + [10, 11, 0.00077, 0.00536, 1.39842, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [10, 19, 0.00179, 0.02592, 3.3922, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [10, 80, 0.00207, 0.01369, 3.9516, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [11, 14, 0.0028, 0.0211, 1.0194, 0.0, 0.0, 1630.0, 0.0, 0.0, 1, -360.0, 360.0], + [11, 19, 0.00241, 0.03489, 4.8656, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [13, 14, 0.0028, 0.0211, 1.0194, 0.0, 0.0, 1630.0, 0.0, 0.0, 1, -360.0, 360.0], + [13, 19, 0.0028, 0.0211, 1.0194, 0.0, 0.0, 1630.0, 0.0, 0.0, 1, -360.0, 360.0], + [13, 19, 0.0062, 0.0673, 1.1156, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [13, 56, 0.00179, 0.02524, 0.53546, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [13, 80, 0.0108, 0.0965, 0.3296, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [15, 228, 0.00811, 0.1369, 1.1156, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [18, 19, 0.0004, 0.0096, 0.9038, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [18, 19, 0.0004, 0.0096, 0.9038, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [18, 30, 0.00259, 0.02967, 2.153, 0.0, 0.0, 1800.0, 0.0, 0.0, 1, -360.0, 360.0], + [18, 33, 0.00259, 0.02967, 2.153, 0.0, 0.0, 1800.0, 0.0, 0.0, 1, -360.0, 360.0], + [20, 24, 0.00845, 0.07034, 0.15954, 0.0, 0.0, 1160.0, 0.0, 0.0, 1, -360.0, 360.0], + [22, 27, 0.00138, 0.05399, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [22, 31, 0.00138, 0.05399, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [24, 31, 0.00845, 0.07034, 0.15954, 0.0, 0.0, 1160.0, 0.0, 0.0, 1, -360.0, 360.0], + [26, 30, 0.00179, 0.02524, 2.153, 0.0, 0.0, 1800.0, 0.0, 0.0, 1, -360.0, 360.0], + [27, 28, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [27, 28, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [27, 51, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [28, 51, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [28, 51, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [33, 36, 0.00042, 0.00905, 0.66794, 0.0, 0.0, 3600.0, 0.0, 0.0, 1, -360.0, 360.0], + [34, 35, 0.00028, 0.00753, 0.51736, 0.0, 0.0, 3600.0, 0.0, 0.0, 1, -360.0, 360.0], + [34, 35, 0.00035, 0.0075, 0.5536, 0.0, 0.0, 3600.0, 0.0, 0.0, 1, -360.0, 360.0], + [34, 37, 0.00044, 0.01125, 0.8292, 0.0, 0.0, 3600.0, 0.0, 0.0, 1, -360.0, 360.0], + [34, 37, 0.00044, 0.01125, 0.8292, 0.0, 0.0, 3600.0, 0.0, 0.0, 1, -360.0, 360.0], + [34, 49, 0.0006, 0.0128, 0.9462, 0.0, 0.0, 3600.0, 0.0, 0.0, 1, -360.0, 360.0], + [34, 56, 0.0002, 0.0041, 0.2962, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [34, 80, 0.00193, 0.02779, 4.6712, 0.0, 0.0, 3600.0, 0.0, 0.0, 1, -360.0, 360.0], + [34, 81, 0.0019, 0.031, 4.1402, 0.0, 0.0, 3600.0, 0.0, 0.0, 1, -360.0, 360.0], + [35, 49, 0.00021, 0.00457, 0.32336, 0.0, 0.0, 3600.0, 0.0, 0.0, 1, -360.0, 360.0], + [36, 49, 0.0004, 0.0093, 0.6856, 0.0, 0.0, 3600.0, 0.0, 0.0, 1, -360.0, 360.0], + [37, 125, 0.0, -0.00935, 0.0, 0.0, 0.0, 2134.0, 0.0, 0.0, 1, -360.0, 360.0], + [37, 127, 0.0, -0.00935, 0.0, 0.0, 0.0, 2134.0, 0.0, 0.0, 1, -360.0, 360.0], + [37, 129, 0.0, -0.0084, 0.0, 0.0, 0.0, 2100.0, 0.0, 0.0, 1, -360.0, 360.0], + [38, 39, 0.0014, 0.0264, 0.102, 0.0, 0.0, 3070.0, 0.0, 0.0, 1, -360.0, 360.0], + [38, 43, 0.00065, 0.01187, 0.04672, 0.0, 0.0, 3070.0, 0.0, 0.0, 1, -360.0, 360.0], + [38, 43, 0.00065, 0.01187, 0.04672, 0.0, 0.0, 3070.0, 0.0, 0.0, 1, -360.0, 360.0], + [39, 41, 0.0019, 0.0258, 0.0984, 0.0, 0.0, 2320.0, 0.0, 0.0, 1, -360.0, 360.0], + [39, 43, 0.00845, 0.07034, 0.15954, 0.0, 0.0, 1160.0, 0.0, 0.0, 1, -360.0, 360.0], + [40, 41, 0.0011, 0.0127, 0.048, 0.0, 0.0, 2320.0, 0.0, 0.0, 1, -360.0, 360.0], + [41, 42, 0.00138, 0.05399, 0.15252, 0.0, 0.0, 2320.0, 0.0, 0.0, 1, -360.0, 360.0], + [41, 42, 0.00138, 0.05399, 0.15252, 0.0, 0.0, 2320.0, 0.0, 0.0, 1, -360.0, 360.0], + [41, 44, 0.0032, 0.0395, 0.144, 0.0, 0.0, 2320.0, 0.0, 0.0, 1, -360.0, 360.0], + [41, 50, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [42, 50, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [42, 51, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [43, 44, 0.00285, 0.03649, 0.12656, 0.0, 0.0, 2320.0, 0.0, 0.0, 1, -360.0, 360.0], + [43, 44, 0.00138, 0.03399, 0.11252, 0.0, 0.0, 2320.0, 0.0, 0.0, 1, -360.0, 360.0], + [50, 51, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [50, 51, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [53, 54, 0.00074, 0.01861, 1.40264, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [53, 55, 0.00082, 0.01668, 1.18802, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [53, 56, 0.0, 0.00159, 0.12002, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [53, 56, 0.0, 0.00159, 0.12002, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [54, 56, 0.00083, 0.01884, 1.66668, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [56, 80, 0.00179, 0.02524, 0.53546, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [57, 220, 0.0108, 0.0965, 0.3296, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [57, 225, 0.0018, 0.0245, 0.4392, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [57, 225, 0.0018, 0.0245, 0.4392, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [58, 60, 0.0107, 0.07905, 0.3667, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [59, 60, 0.0107, 0.07905, 0.3667, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [61, 64, 0.00221, 0.03346, 0.07338, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [61, 65, 0.0029, 0.038, 0.0824, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [61, 71, 0.00309, 0.04677, 0.1008, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [61, 72, 0.00226, 0.03422, 0.07506, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [62, 68, 0.00047, 0.00723, 0.01624, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [62, 70, 0.00035, 0.00536, 0.01204, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [63, 66, 0.0022, 0.03422, 0.07716, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [63, 66, 0.00238, 0.03669, 0.08284, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [63, 69, 0.00201, 0.03074, 0.06886, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [63, 70, 0.00281, 0.04296, 0.09648, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [64, 65, 0.00029, 0.00434, 0.0095, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [65, 68, 0.00229, 0.01583, 0.0306, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [65, 68, 0.00229, 0.01583, 0.0306, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [65, 71, 0.00141, 0.00967, 0.0194, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [65, 71, 0.00141, 0.00967, 0.0194, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [65, 71, 0.00161, 0.00971, 0.01928, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [65, 71, 0.00161, 0.00971, 0.01928, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [65, 72, 0.00027, 0.00393, 0.00918, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [65, 72, 0.00027, 0.00393, 0.00918, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [65, 72, 0.00027, 0.00393, 0.00918, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [65, 73, 0.00138, 0.01116, 0.0247, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [65, 73, 0.00138, 0.01116, 0.0247, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [66, 69, 0.00037, 0.00366, 0.0083, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [66, 70, 0.00055, 0.00586, 0.01246, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [67, 69, 0.00073, 0.01025, 0.02558, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [67, 69, 0.00073, 0.01025, 0.02558, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [68, 70, 0.00119, 0.01244, 0.02798, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [68, 70, 0.00119, 0.01244, 0.02798, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [68, 73, 0.00128, 0.00979, 0.0212, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [69, 70, 0.0011, 0.01189, 0.02514, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [80, 81, 0.00056, 0.01415, 1.0429, 0.0, 0.0, 3600.0, 0.0, 0.0, 1, -360.0, 360.0], + [82, 83, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [82, 83, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [83, 84, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [83, 84, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [83, 84, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [83, 96, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [84, 92, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [84, 92, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [84, 99, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [84, 99, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [85, 86, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [89, 90, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [89, 90, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [89, 91, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [89, 91, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [89, 152, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [89, 152, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [89, 153, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [89, 153, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [90, 91, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 0, -360.0, 360.0], + [90, 91, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [90, 92, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [90, 93, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [90, 153, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [90, 153, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [91, 92, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [91, 97, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [91, 97, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [91, 99, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [91, 152, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [91, 152, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [92, 93, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [92, 93, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [92, 152, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [92, 152, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [93, 143, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [93, 144, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [95, 131, 0.00053, 0.01297, 0.0, 0.0, 0.0, 2450.0, 0.0, 0.0, 1, -360.0, 360.0], + [95, 132, 0.0005, 0.00881, 0.59878, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [96, 98, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [96, 98, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [97, 98, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [97, 98, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [97, 98, 0.0011, 0.0127, 0.048, 0.0, 1120.0, 1120.0, 0.0, 0.0, 1, -360.0, 360.0], + [97, 147, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [97, 147, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [99, 152, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [101, 102, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [101, 102, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [101, 104, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [101, 105, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [101, 105, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [101, 117, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [103, 104, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [103, 117, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [104, 117, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 0, -360.0, 360.0], + [104, 117, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [104, 146, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [104, 147, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [105, 136, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [105, 136, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [108, 143, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [108, 144, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [110, 154, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [112, 155, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [112, 155, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [114, 115, 0.00079, 0.01937, 1.3285, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [114, 116, 0.00087, 0.02087, 1.4571, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [114, 116, 0.00087, 0.02087, 1.4571, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [115, 123, 0.00072, 0.016, 1.0879, 0.0, 0.0, 2450.0, 0.0, 0.0, 1, -360.0, 360.0], + [115, 130, 0.00083, 0.01985, 0.0, 0.0, 0.0, 2450.0, 0.0, 0.0, 1, -360.0, 360.0], + [116, 123, 2e-05, -0.00998, 0.0, 0.0, 0.0, 2450.0, 0.0, 0.0, 1, -360.0, 360.0], + [116, 124, 0.0, -0.00935, 0.0, 0.0, 0.0, 2134.0, 0.0, 0.0, 1, -360.0, 360.0], + [116, 126, 0.0, -0.00944, 0.0, 0.0, 0.0, 2134.0, 0.0, 0.0, 1, -360.0, 360.0], + [116, 128, 0.0, -0.00935, 0.0, 0.0, 0.0, 2134.0, 0.0, 0.0, 1, -360.0, 360.0], + [116, 130, 0.00153, 0.0147, 0.0, 0.0, 0.0, 1560.0, 0.0, 0.0, 1, -360.0, 360.0], + [117, 119, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [118, 119, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [124, 125, 0.00123, 0.02659, 1.98702, 0.0, 0.0, 3600.0, 0.0, 0.0, 1, -360.0, 360.0], + [126, 127, 0.00123, 0.02662, 1.9888, 0.0, 0.0, 3600.0, 0.0, 0.0, 1, -360.0, 360.0], + [128, 129, 0.00112, 0.02517, 1.83586, 0.0, 0.0, 3600.0, 0.0, 0.0, 1, -360.0, 360.0], + [130, 131, 0.00053, 0.01297, 0.0, 0.0, 0.0, 2450.0, 0.0, 0.0, 1, -360.0, 360.0], + [130, 132, 0.00093, 0.03644, 1.3895, 0.0, 0.0, 2450.0, 0.0, 0.0, 1, -360.0, 360.0], + [130, 238, 0.00068, 0.01585, 1.15126, 0.0, 0.0, 1800.0, 0.0, 0.0, 1, -360.0, 360.0], + [132, 133, 1e-05, 0.00359, 0.97812, 0.0, 0.0, 2450.0, 0.0, 0.0, 1, -360.0, 360.0], + [132, 134, 0.00098, 0.01035, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [132, 238, 0.00165, 0.05719, 2.4774, 0.0, 0.0, 2450.0, 0.0, 0.0, 1, -360.0, 360.0], + [133, 134, 0.0016, 0.01229, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [134, 135, 0.00072, 0.00346, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [135, 159, 0.00053, 0.00456, 0.7635, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [135, 159, 0.00053, 0.00456, 0.7635, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [136, 137, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [136, 152, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [136, 240, 0.01382, 0.09268, 0.1106, 0.0, 0.0, 747.0, 0.0, 0.0, 1, -360.0, 360.0], + [137, 149, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [138, 148, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [138, 149, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [139, 140, 0.02482, 0.16938, 0.20232, 0.0, 0.0, 838.0, 0.0, 0.0, 1, -360.0, 360.0], + [139, 153, 0.0148, 0.10101, 0.12066, 0.0, 0.0, 838.0, 0.0, 0.0, 1, -360.0, 360.0], + [140, 141, 0.01382, 0.09268, 0.1106, 0.0, 0.0, 747.0, 0.0, 0.0, 1, -360.0, 360.0], + [140, 145, 0.01668, 0.11381, 0.13608, 0.0, 0.0, 838.0, 0.0, 0.0, 1, -360.0, 360.0], + [140, 150, 0.01113, 0.06678, 0.07286, 0.0, 0.0, 752.0, 0.0, 0.0, 1, -360.0, 360.0], + [140, 150, 0.0105, 0.0654, 0.0686, 0.0, 0.0, 602.0, 0.0, 0.0, 1, -360.0, 360.0], + [140, 150, 0.01105, 0.06642, 0.0716, 0.0, 0.0, 752.0, 0.0, 0.0, 1, -360.0, 360.0], + [140, 153, 0.03903, 0.27403, 0.31072, 0.0, 0.0, 747.0, 0.0, 0.0, 1, -360.0, 360.0], + [140, 239, 0.01382, 0.09268, 0.1106, 0.0, 0.0, 747.0, 0.0, 0.0, 1, -360.0, 360.0], + [140, 239, 0.01382, 0.09268, 0.1106, 0.0, 0.0, 747.0, 0.0, 0.0, 1, -360.0, 360.0], + [141, 153, 0.03058, 0.2046, 0.24472, 0.0, 0.0, 747.0, 0.0, 0.0, 1, -360.0, 360.0], + [142, 149, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [142, 149, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [142, 152, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [142, 240, 0.01382, 0.09268, 0.1106, 0.0, 0.0, 747.0, 0.0, 0.0, 1, -360.0, 360.0], + [144, 153, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [145, 153, 0.02235, 0.16106, 0.18342, 0.0, 0.0, 838.0, 0.0, 0.0, 1, -360.0, 360.0], + [148, 151, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [149, 151, 0.00312, 0.02886, 0.15252, 0.0, 986.0, 888.0, 0.0, 0.0, 1, -360.0, 360.0], + [152, 241, 0.01382, 0.09268, 0.1106, 0.0, 0.0, 747.0, 0.0, 0.0, 1, -360.0, 360.0], + [152, 241, 0.01382, 0.09268, 0.1106, 0.0, 0.0, 747.0, 0.0, 0.0, 1, -360.0, 360.0], + [159, 172, 0.00072, 0.01382, 1.27572, 0.0, 0.0, 3600.0, 0.0, 0.0, 1, -360.0, 360.0], + [159, 176, 0.00078, 0.01502, 1.1381, 0.0, 0.0, 3020.0, 0.0, 0.0, 1, -360.0, 360.0], + [159, 179, 0.00074, 0.01413, 1.06634, 0.0, 0.0, 3020.0, 0.0, 0.0, 1, -360.0, 360.0], + [159, 189, 0.00078, 0.00239, 1.1381, 0.0, 0.0, 2400.0, 0.0, 0.0, 1, -360.0, 360.0], + [159, 237, 0.00106, 0.01293, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [160, 161, 0.00122, 0.02373, 2.2071, 0.0, 0.0, 1732.0, 0.0, 0.0, 1, -360.0, 360.0], + [160, 172, 0.00012, 0.00238, 0.21926, 0.0, 0.0, 2000.0, 0.0, 0.0, 1, -360.0, 360.0], + [160, 173, 0.0006, 0.01036, 1.01456, 0.0, 0.0, 2000.0, 0.0, 0.0, 1, -360.0, 360.0], + [161, 198, 0.00264, 0.02689, 5.29066, 0.0, 0.0, 1732.0, 0.0, 0.0, 1, -360.0, 360.0], + [162, 163, 0.00063, 0.01412, 1.09756, 0.0, 0.0, 3450.0, 0.0, 0.0, 1, -360.0, 360.0], + [162, 163, 0.00109, 0.02408, 1.55542, 0.0, 0.0, 3020.0, 0.0, 0.0, 1, -360.0, 360.0], + [162, 163, 0.00108, 0.02409, 1.55348, 0.0, 0.0, 3020.0, 0.0, 0.0, 1, -360.0, 360.0], + [162, 173, 0.00041, 0.00737, 0.72694, 0.0, 0.0, 3450.0, 0.0, 0.0, 1, -360.0, 360.0], + [162, 174, 0.00066, 0.01266, 0.95976, 0.0, 0.0, 3020.0, 0.0, 0.0, 1, -360.0, 360.0], + [162, 177, 0.00066, 0.01266, 0.95976, 0.0, 0.0, 3020.0, 0.0, 0.0, 1, -360.0, 360.0], + [163, 164, 0.00023, 0.00451, 0.3332, 0.0, 0.0, 2175.0, 0.0, 0.0, 1, -360.0, 360.0], + [163, 164, 0.0002, 0.00446, 0.305, 0.0, 0.0, 2175.0, 0.0, 0.0, 1, -360.0, 360.0], + [163, 181, 0.0012, 0.02316, 1.7152, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [163, 181, 0.0003, 0.02, 3.6, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [163, 187, 0.0002, 0.0082, 1.3, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [163, 204, 0.00196, 0.03304, 1.88, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [164, 165, 1e-05, 0.0003, 0.01434, 0.0, 0.0, 3450.0, 0.0, 0.0, 1, -360.0, 360.0], + [164, 165, 1e-05, 0.0003, 0.01844, 0.0, 0.0, 3450.0, 0.0, 0.0, 1, -360.0, 360.0], + [164, 187, 0.0002, 0.0082, 1.3, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [166, 217, 0.0062, 0.0673, 1.1156, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [167, 168, 6e-05, 0.00131, 0.00378, 0.0, 0.0, 3020.0, 0.0, 0.0, 1, -360.0, 360.0], + [167, 168, 6e-05, 0.00116, 0.00332, 0.0, 0.0, 3020.0, 0.0, 0.0, 1, -360.0, 360.0], + [167, 183, 0.002, 0.02, 0.8, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [174, 175, 0.0, 0.00165, 0.0, 0.0, 0.0, 2400.0, 0.0, 0.0, 1, -360.0, 360.0], + [175, 176, 0.0, -0.01263, 0.0, 0.0, 0.0, 2400.0, 0.0, 0.0, 1, -360.0, 360.0], + [177, 178, 0.0, 0.00165, 0.0, 0.0, 0.0, 2000.0, 0.0, 0.0, 1, -360.0, 360.0], + [178, 179, 0.0, -0.01263, 0.0, 0.0, 0.0, 2000.0, 0.0, 0.0, 1, -360.0, 360.0], + [180, 181, 0.00113, 0.02069, 1.85526, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [180, 181, 0.00113, 0.02069, 1.85526, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [180, 182, 0.0007, 0.074, 4.87, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [180, 182, 0.002, 0.02, 0.8, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [180, 186, 0.0002, 0.0082, 1.3, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [180, 186, 0.0002, 0.0082, 1.3, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [181, 186, 0.0002, 0.0082, 1.3, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [181, 186, 0.0002, 0.0082, 1.3, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [181, 187, 0.0002, 0.0082, 1.3, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [181, 187, 0.0002, 0.0082, 1.3, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [181, 204, 0.00142, 0.02258, 1.88, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [182, 204, 0.0007, 0.074, 4.87, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [183, 195, 0.002, 0.08, 0.8, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [186, 187, 0.00109, 0.02408, 1.55542, 0.0, 0.0, 3020.0, 0.0, 0.0, 1, -360.0, 360.0], + [186, 192, 0.00083, 0.02, 3.3, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [187, 188, 0.00066, 0.00165, 0.95976, 0.0, 0.0, 3020.0, 0.0, 0.0, 1, -360.0, 360.0], + [188, 189, 0.00074, 0.01266, 1.0822, 0.0, 0.0, 2400.0, 0.0, 0.0, 1, -360.0, 360.0], + [192, 193, 0.0035, 0.007, 4.606, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [194, 195, 0.002, 0.08, 0.8, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [199, 200, 0.0012, 0.002316, 1.7152, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [199, 210, 0.0, 0.0046, 0.3, 0.0, 0.0, 2000.0, 0.0, 0.0, 1, -360.0, 360.0], + [199, 219, 0.0062, 0.0673, 1.1156, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [200, 210, 0.0, 0.0046, 0.0, 0.0, 0.0, 2000.0, 0.0, 0.0, 1, -360.0, 360.0], + [200, 210, 0.0, 0.0046, 0.0, 0.0, 0.0, 2000.0, 0.0, 0.0, 1, -360.0, 360.0], + [200, 222, 0.0062, 0.0673, 1.1156, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [200, 222, 0.0062, 0.0673, 1.1156, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [201, 206, 0.0108, 0.0965, 0.3296, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [201, 214, 0.0108, 0.0965, 0.3296, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [203, 204, 0.00179, 0.01405, 3.68, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [205, 207, 0.0007, 0.074, 0.4877, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [205, 212, 0.0108, 0.0965, 0.3296, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [205, 212, 0.0108, 0.0965, 0.3296, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [205, 213, 0.0108, 0.0965, 0.3296, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [206, 207, 0.0007, 0.025, 0.487, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [211, 233, 0.0, 0.0046, 0.0, 0.0, 0.0, 2000.0, 0.0, 0.0, 1, -360.0, 360.0], + [212, 213, 0.0108, 0.0965, 0.3296, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [212, 214, 0.0108, 0.0965, 0.3296, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [212, 214, 0.0108, 0.0965, 0.3296, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [214, 231, 0.00548, 0.04825, 0.3296, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [214, 231, 0.0054, 0.04825, 0.3296, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [217, 219, 0.0062, 0.0673, 1.1156, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [217, 219, 0.0062, 0.0673, 1.1156, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [217, 220, 0.0108, 0.0965, 0.3296, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [219, 220, 0.0062, 0.0673, 1.1156, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [220, 228, 0.0108, 0.0965, 0.3296, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [222, 223, 0.0024, 0.00332, 0.5849, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [222, 225, 0.0021, 0.00238, 0.3845, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [222, 230, 0.0016, 0.0226, 0.381, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [222, 230, 0.0016, 0.0226, 0.381, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [223, 224, 0.0052, 0.0602, 1.01, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [223, 224, 0.0049, 0.0537, 0.8843, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [223, 225, 0.0017, 0.00225, 0.3992, 0.0, 0.0, 0.0, 0.0, 0.0, 0, -360.0, 360.0], + [223, 225, 0.0021, 0.00238, 0.3845, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [223, 225, 0.0017, 0.00225, 0.3992, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [223, 225, 0.0021, 0.00238, 0.3845, 0.0, 0.0, 0.0, 0.0, 0.0, 0, -360.0, 360.0], + [223, 229, 0.0012, 0.0172, 0.2987, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [223, 230, 0.0008, 0.00106, 0.2039, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [223, 230, 0.0008, 0.00106, 0.2039, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [224, 225, 0.0032, 0.0349, 0.5722, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [224, 226, 0.0096, 0.0878, 1.4265, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [224, 228, 0.0034, 0.0374, 0.6208, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [224, 228, 0.0034, 0.0372, 0.6182, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [224, 229, 0.0034, 0.0392, 0.6524, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [225, 228, 0.0038, 0.034, 0.5824, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [225, 228, 0.0032, 0.0349, 0.5722, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [225, 234, 0.00811, 0.1369, 2.4348, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [233, 234, 0.0, 0.0046, 0.0, 0.0, 0.0, 2000.0, 0.0, 0.0, 1, -360.0, 360.0], + [237, 238, 0.00159, 0.0111, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1, -360.0, 360.0], + [239, 240, 0.01952, 0.13702, 0.15536, 0.0, 0.0, 747.0, 0.0, 0.0, 1, -360.0, 360.0], + [239, 241, 0.03903, 0.27403, 0.31072, 0.0, 0.0, 747.0, 0.0, 0.0, 1, -360.0, 360.0], + [239, 241, 0.03903, 0.27403, 0.31072, 0.0, 0.0, 747.0, 0.0, 0.0, 1, -360.0, 360.0], + [240, 241, 0.01952, 0.13702, 0.15536, 0.0, 0.0, 747.0, 0.0, 0.0, 1, -360.0, 360.0], + [1, 2, 4e-06, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [2, 3, 1.2e-05, 0.084016, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [2, 5, 0.0, 0.084016, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [7, 8, 6e-06, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [7, 9, 0.0, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [13, 16, 0.0, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [15, 17, 0.0, 0.084016, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [18, 21, 0.0, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [24, 25, 1e-06, 0.189036, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [26, 27, 2e-06, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [28, 29, 1e-06, 0.189036, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [30, 31, 2e-06, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [34, 45, 0.0, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [37, 44, 5e-06, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [37, 44, 5e-06, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [41, 47, 1e-06, 0.189036, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [44, 46, 0.0, 0.189036, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [49, 50, 2e-06, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [51, 52, 1e-06, 0.189036, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [55, 68, 6e-06, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [56, 60, 9e-06, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [58, 74, 1.8e-05, 0.121405, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [61, 79, 1e-06, 0.189036, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [64, 76, 1e-06, 0.189036, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [67, 74, 2.5e-05, 0.189036, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [83, 85, 5.7e-05, 0.189036, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [86, 88, 4e-06, 0.756144, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [95, 97, 7e-06, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [95, 97, 7e-06, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [102, 106, 1e-06, 0.189036, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [108, 109, 1e-06, 0.189036, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [112, 113, 4e-06, 0.756144, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [112, 218, 0.000226, 0.756144, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [115, 117, 7e-06, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [116, 118, 5e-06, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [119, 122, 1e-06, 0.189036, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [131, 147, 7e-06, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [132, 152, 7e-06, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [134, 151, 7e-06, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [140, 154, 5.7e-05, 0.189036, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [149, 155, 5.7e-05, 0.189036, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [152, 158, 1e-06, 0.189036, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [159, 169, 0.0, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [164, 167, 5e-06, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [165, 168, 1e-06, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [180, 184, 0.0, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [182, 183, 4e-06, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [187, 191, 0.0, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [193, 194, 4e-06, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [198, 199, 3e-06, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [200, 201, 1.5e-05, 0.084016, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [203, 208, 0.0, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [207, 209, 1e-06, 0.189036, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [211, 213, 1.5e-05, 0.084016, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [214, 216, 1e-06, 0.189036, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [217, 218, 2.5e-05, 0.084016, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [222, 231, 1.5e-05, 0.084016, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [224, 232, 0.0, 0.084016, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [233, 235, 0.0, 0.084016, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [237, 239, 7e-06, 0.04, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + [239, 242, 1e-06, 0.189036, 0.15536, 0.0, 0.0, 0.0, 1.0, 0.0, 1, -360.0, 360.0], + ]), + "gencost": array([ + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + [2, 0, 0, 3, 0.0, 0.0, 0.0], + ]), +} diff --git a/dc-opf/network_flow_example_v4.py b/dc-opf/network_flow_example_v4.py index e0fa765a..3cfe8fc7 100644 --- a/dc-opf/network_flow_example_v4.py +++ b/dc-opf/network_flow_example_v4.py @@ -1,9 +1,129 @@ import marimo -__generated_with = "0.14.12" +__generated_with = "0.14.17" app = marimo.App(width="medium") +@app.cell +def _(cp, np): + def make_problem(incidence_mat, generator_dict, load_dict, flow_dict): + def indices_not_in_list(array_length, given_indices): + all_indices = set(range(array_length)) + given_indices_set = set(given_indices) + not_in_list_indices = all_indices - given_indices_set + return list(not_in_list_indices) + _B = incidence_mat + num_buses = _B.shape[0] + num_edges = _B.shape[1] + gen_ixs = np.array(list(generator_dict.keys())) - 1 + nogen_ixs = indices_not_in_list(num_buses, gen_ixs) + p_flows = cp.Variable((num_edges), name='line flows') + p_gen = cp.Variable((num_buses), nonneg=True, name='p_gen') + p_load = cp.Variable((num_buses), nonneg=True, name='p_load') + l_min = cp.Parameter( + shape=num_buses, + value=[_v['l_min'] for _k, _v in load_dict.items()], + name='l_min' + ) + l_upper = cp.Parameter( + shape=num_buses, + value=[_v['l_upper'] for _k, _v in load_dict.items()], + name='l_upper' + ) + # l_cost = cp.Parameter( + # shape=num_buses, + # value=[_v['cost'] for _k, _v in load_dict.items()], + # name='l_cost' + # ) + l_cost = [_v['cost'] for _k, _v in load_dict.items()] + g_min = cp.Parameter( + shape=len(gen_ixs), + value=np.array([_v['p_min'] for _k, _v in generator_dict.items()]), + name='g_min' + ) + g_max = cp.Parameter( + shape=len(gen_ixs), + value=np.array([_v['p_max'] for _k, _v in generator_dict.items()]), + name='g_max' + ) + c0 = cp.Parameter( + shape=len(gen_ixs), + value=np.array([_v['c0'] for _k, _v in generator_dict.items()]), + name='c0' + ) + c1 = cp.Parameter( + shape=len(gen_ixs), + value=np.array([_v['c1'] for _k, _v in generator_dict.items()]), + name='c1' + ) + # c2 = cp.Parameter( + # shape=len(gen_ixs), + # value=np.array([_v['c2'] for _k, _v in generator_dict.items()]), + # name='c2' + # ) + c2 = np.array([_v['c2'] for _k, _v in generator_dict.items()]) + r = cp.Parameter( + shape=num_edges, + value=np.array([_v['f_resistance'] for _k, _v in flow_dict.items()]), + name='line resistance' + ) + f_max = cp.Parameter( + shape=num_edges, + value=np.array([_v['f_max'] for _k, _v in flow_dict.items()]), + name='line capacities' + ) + # generator costs + cost = cp.sum(c0 + cp.multiply(c1, p_gen[gen_ixs]) + cp.multiply(c2, cp.square(p_gen[gen_ixs]))) + # load curtailment costs + cost += cp.sum( + cp.multiply( + cp.neg(p_load - l_upper), + l_cost + ) + ) + # line penalties + cost += cp.sum_squares(cp.multiply(r, p_flows)) + constraints = [ + _B @ p_flows + p_gen - p_load == 0, + p_load >= l_min, + cp.abs(p_flows) <= f_max, + p_gen[nogen_ixs] == 0, + p_gen[gen_ixs] <= g_max, + p_gen[gen_ixs] >= g_min + ] + problem = cp.Problem(cp.Minimize(cost), constraints) + return problem + return (make_problem,) + + +@app.cell +def _(mo): + mo.md( + """ + # DC Optimal Power Flow + + This notebook demonstrates the optimal flow problem, over 6 test networks provided by [pypower](https://github.com/rwl/PYPOWER). + + - network with $n$ nodes, $m$ edges, given by $n \\times m$ incidence + matrix $A$ + - edge power vector $p \\in \\mathbf{R}^m$, + with capacity limits $|p_j| \\leq C_j$ + - node generator power $g_i$, load $l_i$, + each with lower and upper limits + - flow conservation $Af + g = l$ + - generator cost function is + $\\phi_i(g_i) = a_i g_i + b_i g_i^2$, total $G= \\sum_i \\phi_i (g_i)$ + - load shortfall cost is $\\psi_i(l_i) = c_i(l^\\text{tar}_i-l_i)_+$, + total is $S = \\sum_i \\psi_i(l_i)$ + - total line loss is $L = \\sum_j r_j p_j^2$ + - objective is $G + \\lambda L + \\mu S$ + + The model automatically populates parameters for the generators, loads, and lines, with the sliders set to the default values for the test case. Users may try adjusting these values with the sliders to see how it changes the optimal flow. + """ + ) + return + + @app.cell(hide_code=True) def _(mo, os, re): # model loading widget @@ -69,7 +189,7 @@ def _(lines, np, num_buses, sns): for _ix, _l in enumerate(lines): B[_l[0]-1, _ix] = -1 B[_l[1]-1, _ix] = 1 - fig_heatmap = sns.heatmap(B, cmap='seismic', center=0) + fig_heatmap = sns.heatmap(B, cmap='bwr', center=0) return B, fig_heatmap @@ -116,7 +236,7 @@ def _(B, flow_dict, generator_dict, load_dict, make_problem): @app.cell(hide_code=True) -def _(flow_limits, gen_limits, load_limits, mo, problem): +def _(flow_limits, gen_limits, load_limits, mo, np, problem): # solve with updated parameters am_solving = True problem.param_dict['g_min'].value = [_v[0] for _v in gen_limits.value] @@ -125,8 +245,9 @@ def _(flow_limits, gen_limits, load_limits, mo, problem): problem.param_dict['l_upper'].value = [_v[1] for _v in load_limits.value] problem.param_dict['line capacities'].value = flow_limits.value obj_val = problem.solve(verbose=False, solver='CLARABEL') + constrained_lines = np.where(~np.isclose(problem.constraints[2].dual_value, 0, atol=1e-2))[0] mo.md(f'objective value: {obj_val:.2f}') - return (am_solving,) + return am_solving, constrained_lines @app.cell @@ -147,7 +268,8 @@ def _(generator_dict, mo, np): stop=_max, label=f'gen {_ix}', value=[_gen['p_min'], _gen['p_max']], - debounce=True) + debounce=True, + show_value=True) for _ix, _gen in generator_dict.items()], label='generator limits') return (gen_limits,) @@ -160,7 +282,8 @@ def _(load_dict, mo, np): stop=_max, label=f'load {_ix}', value=[_load['l_min'], _load['l_upper']], - debounce=True) + debounce=True, + show_value=True,) for _ix, _load in load_dict.items()], label='load limits') return (load_limits,) @@ -173,7 +296,8 @@ def _(flow_dict, mo, np): stop=_max, label=f'line {_ix+1}', value=_line['f_max'], - debounce=True) + debounce=True, + show_value=True,) for _ix, _line in flow_dict.items()], label='flow limits') return (flow_limits,) @@ -218,7 +342,7 @@ def _( @app.cell(hide_code=True) -def _(model_data, model_ui): +def _(model_data, model_ui, np): # construct dictionaries for problem formulation def merge_nested_dicts(dict1, dict2): result = {} @@ -233,12 +357,22 @@ def merge_nested_dicts(dict1, dict2): result[key] = merged_inner_dict return result - generator_dict1 = {int(_g[0]): {'p_min': _g[9], 'p_max': _g[8]} for _g in model_data['gen']} + # minimum generation value occaisonally negative + generator_dict1 = {int(_g[0]): {'p_min': np.clip(_g[9], 0, np.inf), 'p_max': _g[8]*2} for _g in model_data['gen']} generator_dict2 = {int(model_data['gen'][_ix, 0]): {'c0': _g[-1], 'c1': _g[-2], 'c2': _g[-3]} for _ix, _g in enumerate(model_data['gencost'])} generator_dict = merge_nested_dicts(generator_dict1, generator_dict2) - load_dict = {int(_l[0]): {'l_min': _l[2]*0.5, 'l_upper': _l[2], 'cost': 250} for _l in model_data['bus']} + # power demand is occaisonally negative + # load_dict = {int(_l[0]): {'l_min': 0, 'l_upper': np.abs(_l[2]), 'cost': 250} for _l in model_data['bus']} + load_dict = {int(_l[0]): {'l_min': np.abs(_l[2]*0.5), 'l_upper': np.abs(_l[2]), 'cost': 1e4} for _l in model_data['bus']} + _fmax = 10 * np.max([np.max(_b[5:7]) for _b in model_data['branch']]) if model_ui.value != 'case14.py': - flow_dict = {int(_ix): {'f_max': _b[5], 'f_resistance': _b[2]} for _ix, _b in enumerate(model_data['branch'])} + flow_dict = {} + for _ix, _b in enumerate(model_data['branch']): + _fx = np.max(_b[5:7]) + if _fx > 0: + flow_dict[_ix] = {'f_max': _fx, 'f_resistance': _b[2]} + else: + flow_dict[_ix] = {'f_max': _fmax, 'f_resistance': _b[2]} else: flow_dict = {int(_ix): {'f_max': 175, 'f_resistance': _b[2]} for _ix, _b in enumerate(model_data['branch'])} line_resistance = model_data['branch'][:, 2] @@ -246,99 +380,15 @@ def merge_nested_dicts(dict1, dict2): @app.cell(hide_code=True) -def _(cp, np): - def make_problem(incidence_mat, generator_dict, load_dict, flow_dict): - def indices_not_in_list(array_length, given_indices): - all_indices = set(range(array_length)) - given_indices_set = set(given_indices) - not_in_list_indices = all_indices - given_indices_set - return list(not_in_list_indices) - _B = incidence_mat - num_buses = _B.shape[0] - num_edges = _B.shape[1] - gen_ixs = np.array(list(generator_dict.keys())) - 1 - nogen_ixs = indices_not_in_list(num_buses, gen_ixs) - p_flows = cp.Variable((num_edges), name='line flows') - p_gen = cp.Variable((num_buses), nonneg=True, name='p_gen') - p_load = cp.Variable((num_buses), nonneg=True, name='p_load') - l_min = cp.Parameter( - shape=num_buses, - value=[_v['l_min'] for _k, _v in load_dict.items()], - name='l_min' - ) - l_upper = cp.Parameter( - shape=num_buses, - value=[_v['l_upper'] for _k, _v in load_dict.items()], - name='l_upper' - ) - # l_cost = cp.Parameter( - # shape=num_buses, - # value=[_v['cost'] for _k, _v in load_dict.items()], - # name='l_cost' - # ) - l_cost = [_v['cost'] for _k, _v in load_dict.items()] - g_min = cp.Parameter( - shape=len(gen_ixs), - value=np.array([_v['p_min'] for _k, _v in generator_dict.items()]), - name='g_min' - ) - g_max = cp.Parameter( - shape=len(gen_ixs), - value=np.array([_v['p_max'] for _k, _v in generator_dict.items()]), - name='g_max' - ) - c0 = cp.Parameter( - shape=len(gen_ixs), - value=np.array([_v['c0'] for _k, _v in generator_dict.items()]), - name='c0' - ) - c1 = cp.Parameter( - shape=len(gen_ixs), - value=np.array([_v['c1'] for _k, _v in generator_dict.items()]), - name='c1' - ) - # c2 = cp.Parameter( - # shape=len(gen_ixs), - # value=np.array([_v['c2'] for _k, _v in generator_dict.items()]), - # name='c2' - # ) - c2 = np.array([_v['c2'] for _k, _v in generator_dict.items()]) - r = cp.Parameter( - shape=num_edges, - value=np.array([_v['f_resistance'] for _k, _v in flow_dict.items()]), - name='line resistance' - ) - f_max = cp.Parameter( - shape=num_edges, - value=np.array([_v['f_max'] for _k, _v in flow_dict.items()]), - name='line capacities' - ) - # generator costs - cost = cp.sum(c0 + c1 @ p_gen[gen_ixs] + c2 @ cp.square(p_gen[gen_ixs])) - # load curtailment costs - cost += cp.sum( - cp.multiply( - cp.neg(p_load - l_upper), - l_cost - ) - ) - # line penalties - cost += cp.sum_squares(cp.multiply(r, p_flows)) - constraints = [ - _B @ p_flows + p_gen - p_load == 0, - p_load >= l_min, - cp.abs(p_flows) <= f_max, - p_gen[nogen_ixs] == 0, - p_gen[gen_ixs] <= g_max, - p_gen[gen_ixs] >= g_min - ] - problem = cp.Problem(cp.Minimize(cost), constraints) - return problem - return (make_problem,) - - -@app.cell(hide_code=True) -def _(am_solving, both, gen_only, lines, load_only, problem): +def _( + am_solving, + both, + constrained_lines, + gen_only, + lines, + load_only, + problem, +): # power flow graph view 1 am_solving solution2 = ["flowchart LR"] @@ -365,11 +415,28 @@ def _(am_solving, both, gen_only, lines, load_only, problem): if len(both) > 0: _str = ",".join([str(int(_i)) for _i in both]) solution2 += "\n class "+_str+" genload;" + if len(constrained_lines) > 0: + _str = ",".join([str(int(_i)) for _i in constrained_lines]) + solution2 += "\n linkStyle "+_str+" color:red;" return (solution2,) +@app.cell +def _(solution): + solution + return + + @app.cell(hide_code=True) -def _(am_solving, both, gen_only, lines, load_only, problem): +def _( + am_solving, + both, + constrained_lines, + gen_only, + lines, + load_only, + problem, +): # power flow graph view 2 am_solving solution = ["flowchart LR"] @@ -383,9 +450,9 @@ def _(am_solving, both, gen_only, lines, load_only, problem): # else: # solution.append(f" {_t:.0f}(({_t})) == {-_lf:.2f} ==> {_f:.0f}(({_f}))") solution = "\n".join(solution) - solution += '''\n - classDef gen stroke-dasharray: 5 5;\n - classDef load fill:#f9f;\n + solution += ''' + classDef gen stroke-dasharray: 5 5; + classDef load fill:#f9f; classDef genload stroke-dasharray: 5 5,fill:#f9f;''' if len(load_only) > 0: _str = ",".join([str(int(_i)) for _i in load_only]) @@ -396,6 +463,9 @@ def _(am_solving, both, gen_only, lines, load_only, problem): if len(both) > 0: _str = ",".join([str(int(_i)) for _i in both]) solution += "\n class "+_str+" genload;" + if len(constrained_lines) > 0: + _str = ",".join([str(int(_i)) for _i in constrained_lines]) + solution += "\n linkStyle "+_str+" color:red;" return (solution,) @@ -407,7 +477,6 @@ def _(): import cvxpy as cp import matplotlib.pyplot as plt import seaborn as sns - from model import Model return cp, mo, np, os, plt, re, sns diff --git a/mpc_dev/__marimo__/session/real_battery_objs.py.json b/mpc_dev/__marimo__/session/real_battery_objs.py.json new file mode 100644 index 00000000..80f5658e --- /dev/null +++ b/mpc_dev/__marimo__/session/real_battery_objs.py.json @@ -0,0 +1,338 @@ +{ + "version": "1", + "metadata": { + "marimo_version": "0.14.12" + }, + "cells": [ + { + "id": "Hbol", + "code_hash": "985eb4ae6b57610cda018732c773b3cb", + "outputs": [ + { + "type": "data", + "data": { + "text/plain": "" + } + } + ], + "console": [] + }, + { + "id": "MJUe", + "code_hash": "8c4454f089e54aa670666cfb5e32a152", + "outputs": [ + { + "type": "data", + "data": { + "text/plain": "" + } + } + ], + "console": [] + }, + { + "id": "vblA", + "code_hash": "b2b1689778d0daba3a993c48612efe08", + "outputs": [ + { + "type": "data", + "data": { + "text/plain": "" + } + } + ], + "console": [] + }, + { + "id": "bkHC", + "code_hash": "c0554ae4dd6d948e2c9c595d3221f61f", + "outputs": [ + { + "type": "data", + "data": { + "text/plain": "" + } + } + ], + "console": [] + }, + { + "id": "lEQa", + "code_hash": "f480a78c0b1277a05b3e84c6088a9dfe", + "outputs": [ + { + "type": "data", + "data": { + "text/plain": "" + } + } + ], + "console": [] + }, + { + "id": "PKri", + "code_hash": "1606bd8ba28ae2020c4930c302337b85", + "outputs": [ + { + "type": "data", + "data": { + "text/plain": "" + } + } + ], + "console": [] + }, + { + "id": "Xref", + "code_hash": "660c6b8c46489beb17940f7a42872a90", + "outputs": [ + { + "type": "data", + "data": { + "text/plain": "" + } + } + ], + "console": [ + { + "type": "stream", + "name": "stdout", + "text": "percentage of shortfall times = 21.70 %\naverage load = 1.02 GW\naverage renewable generation = 0.74 GW\naverage shortfall = 0.03 GW\nmaximum fossil generation = 1.00 GW\n" + } + ] + }, + { + "id": "SFPL", + "code_hash": "b0a263bb0f6378b3a00c7aa8714f5b0c", + "outputs": [ + { + "type": "data", + "data": { + "text/html": "" + } + } + ], + "console": [] + }, + { + "id": "BYtC", + "code_hash": "c44b3c51a62619f59f9bfe172194b849", + "outputs": [ + { + "type": "data", + "data": { + "image/png": "data:image/png;base64,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" + } + } + ], + "console": [] + }, + { + "id": "RGSE", + "code_hash": "40cc469ceb51c61872dd4221964257e5", + "outputs": [ + { + "type": "data", + "data": { + "text/html": "
Problem(Minimize(Expression(CONVEX, NONNEGATIVE, ())), [Equality(Variable((26304,), c, nonneg=True), Expression(AFFINE, UNKNOWN, (26304,))), Inequality(Variable((26304,), r, nonneg=True)), Inequality(Variable((26305,), q, nonneg=True)), Inequality(Variable((26304,), u, nonneg=True)), Inequality(Variable((26304,), b_charge, nonneg=True)), Inequality(Variable((26304,), b_discharge, nonneg=True)), Equality(Expression(AFFINE, NONNEGATIVE, (26304,)), Expression(AFFINE, UNKNOWN, (26304,))), Inequality(Variable((26304,), s, nonneg=True)), Equality(Expression(AFFINE, UNKNOWN, (26304,)), Expression(AFFINE, UNKNOWN, (26304,))), Equality(Variable((), B, nonneg=True), Expression(CONSTANT, NONNEGATIVE, ())), Equality(Variable((26304,), b), Expression(AFFINE, UNKNOWN, (26304,))), Equality(Expression(AFFINE, NONNEGATIVE, ()), Expression(CONSTANT, NONNEGATIVE, ()))])" + } + } + ], + "console": [] + }, + { + "id": "Hstk", + "code_hash": "abfc01746af5b489ba46d1eca37a76b0", + "outputs": [ + { + "type": "data", + "data": { + "text/plain": "" + } + } + ], + "console": [] + }, + { + "id": "nWHF", + "code_hash": "1b6a0e620b656f5eca0f04675a4f5546", + "outputs": [ + { + "type": "data", + "data": { + "text/plain": "" + } + } + ], + "console": [] + }, + { + "id": "iLit", + "code_hash": "647077437b316e93456ef2d04b5c646f", + "outputs": [ + { + "type": "data", + "data": { + "image/png": "data:image/png;base64,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S0pK6Pe//73L477//vtUVVVFv/3tb0WwfNVVV4kJgOnTp4vPXXjhheLrxo0bJ4LzDz/8kL788kt6/fXXKTExkYYMGSL+noNy/vO0adPE+yVLlojvUVZWRs8995zlzycAAEBLFuFwOByhPggAAAA74XLtG2+8kV599VWPf8+B9LJly0TQe9NNN4nP1dTUULdu3ej8888XATjjtdacMf/oo4/ohhtuEJ+rra2l8ePH07Zt28R67Xbt2olMNwfkSUlJIkDnzLW0fv16ke3mgJyDdSPObPN67xMnTlBKSor+eQ7227Rp02gigTudFxUViYCe8ffjdeH8+BJnzDmDjg7mAABgFygvBwAACEHQvWbNGhEUm+EMMgfmUmxsLI0ePZoOHjyof27+/PnUpUsXmjp1qv453trr/vvvp/LychG4G11zzTUuAXdTGQNuzpSfPHlSZMkrKytFx3MAAABogKAbAADAYrw2e/v27ZSdnS0Cac76GoNplpWVJbLCRh06dBBl59KRI0eoT58+FBnpejvv37+//vdGnO0Ohh07dojS9OTkZJE950BeThCUlpYG5TEAAADCBYJuAAAAi/EabQ6yX3nlFdGMjNdBDxw4kL799lv9a6Kiojz+2+asCnMvCW8KXivO5etbtmyhJ554gr7++mtauHAh/eMf/xB/76sjOgAAgN2gkRoAAEAIpKen0z333CPeuAM5N1B76qmn9CZp/uA13lu3bhWBrjHbLUu8+e99cc+m+8JrtLnx25w5c+iiiy7SP3/o0KGAvg8AAIBdINMNAABgId5Wy70Em7cM44x3dXV1QN/r8ssvp4KCAvrss89c9t/mDDqvCeeMtC9t27bVM9j+kBl4Y8adm7zx9mMAAADQGDLdAAAAFuLGY7xe+9prrxV7anNwvGjRIlq3bh3NmDEjoO/F23y9+eabokv4hg0bxN7a3Nl8xYoVYssv7lzuC++xzY3d3njjDfH1HISPGTPGdP03byfGa8tvueUW0bCNM+XctRyboQAAAHiGoBsAAMBCCQkJoqT8+++/FyXaXBreu3dvkSm+++67A16jzeXef/7zn+mDDz4Q+2T37dvX4/ZfZrjbOf/bhx9+WGz7xZly/vdmQXenTp3om2++oQcffJAeeeQREYBzE7VLLrmEJk2aFNDxAwAA2AH26QYAAAAAAABQBGu6AQAAAAAAABRB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" + } + } + ], + "console": [] + }, + { + "id": "ZHCJ", + "code_hash": "0af19b12a5750d94b9c3815de83b1b9f", + "outputs": [ + { + "type": "data", + "data": { + "text/html": "
x[i], while X[i,j]. Scalars will be coded as x_<tag> to indicate that they are not arrays. In cases where variables are denoted xY[i] and XY[i,j], respectively. \nAdditional variable encodings include the following:\nxmin, xmax, xhat, xvee, xtilde, xdot,xddot, ...alpha, beta, gamma, ...pypower cases, the line limit is nominally rateA, with rateB and rateC reserved for emergency line ratings only."
+ }
+ }
+ ],
+ "console": []
+ },
+ {
+ "id": "SFPL",
+ "code_hash": "e81e3995a9999460b87384dda4c8ec63",
+ "outputs": [
+ {
+ "type": "data",
+ "data": {
+ "text/html": "Traceback (most recent call last):\n File "/Users/bmeyers/miniconda3/envs/sdt/lib/python3.12/site-packages/marimo/_runtime/reload/autoreload.py", line 442, in superreload\n module = reload(module)\n ^^^^^^^^^^^^^^\n File "/Users/bmeyers/miniconda3/envs/sdt/lib/python3.12/importlib/__init__.py", line 131, in reload\n _bootstrap._exec(spec, module)\n File "<frozen importlib._bootstrap>", line 866, in _exec\n File "<frozen importlib._bootstrap_external>", line 999, in exec_module\n File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed\n File "/Users/bmeyers/miniconda3/envs/sdt/lib/python3.12/site-packages/marimo/_output/formatters/formatters.py", line 19, in <module>\n from marimo._output.formatters.df_formatters import (\nImportError: cannot import name 'IbisFormatter' from 'marimo._output.formatters.df_formatters' (/Users/bmeyers/miniconda3/envs/sdt/lib/python3.12/site-packages/marimo/_output/formatters/df_formatters.py)\nTraceback (most recent call last):\n File "/Users/bmeyers/miniconda3/envs/sdt/lib/python3.12/site-packages/marimo/_runtime/reload/autoreload.py", line 442, in superreload\n module = reload(module)\n ^^^^^^^^^^^^^^\n File "/Users/bmeyers/miniconda3/envs/sdt/lib/python3.12/importlib/__init__.py", line 131, in reload\n _bootstrap._exec(spec, module)\n File "<frozen importlib._bootstrap>", line 866, in _exec\n File "<frozen importlib._bootstrap_external>", line 999, in exec_module\n File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed\n File "/Users/bmeyers/miniconda3/envs/sdt/lib/python3.12/site-packages/marimo/_plugins/ui/_impl/table.py", line 21, in <module>\n from marimo._data.models import BinValue, ColumnStats, ValueCount\nImportError: cannot import name 'ValueCount' from 'marimo._data.models' (/Users/bmeyers/miniconda3/envs/sdt/lib/python3.12/site-packages/marimo/_data/models.py)\nTraceback (most recent call last):\n File "/Users/bmeyers/miniconda3/envs/sdt/lib/python3.12/site-packages/marimo/_runtime/reload/autoreload.py", line 442, in superreload\n module = reload(module)\n ^^^^^^^^^^^^^^\n File "/Users/bmeyers/miniconda3/envs/sdt/lib/python3.12/importlib/__init__.py", line 131, in reload\n _bootstrap._exec(spec, module)\n File "<frozen importlib._bootstrap>", line 866, in _exec\n File "<frozen importlib._bootstrap_external>", line 999, in exec_module\n File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed\n File "/Users/bmeyers/miniconda3/envs/sdt/lib/python3.12/site-packages/marimo/_server/sessions.py", line 48, in <module>\n from marimo._output.formatters.formatters import register_formatters\nImportError: cannot import name 'register_formatters' from 'marimo._output.formatters.formatters' (/Users/bmeyers/miniconda3/envs/sdt/lib/python3.12/site-packages/marimo/_output/formatters/formatters.py)\nTraceback (most recent call last):\n File "/Users/bmeyers/miniconda3/envs/sdt/lib/python3.12/site-packages/marimo/_runtime/reload/autoreload.py", line 442, in superreload\n module = reload(module)\n ^^^^^^^^^^^^^^\n File "/Users/bmeyers/miniconda3/envs/sdt/lib/python3.12/importlib/__init__.py", line 131, in reload\n _bootstrap._exec(spec, module)\n File "<frozen importlib._bootstrap>", line 866, in _exec\n File "<frozen importlib._bootstrap_external>", line 999, in exec_module\n File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed\n File "/Users/bmeyers/miniconda3/envs/sdt/lib/python3.12/site-packages/marimo/_output/formatters/df_formatters.py", line 21, in <module>\n from marimo._plugins.ui._impl.table import get_default_table_page_size, table\nImportError: cannot import name 'get_default_table_page_size' from 'marimo._plugins.ui._impl.table' (/Users/bmeyers/miniconda3/envs/sdt/lib/python3.12/site-packages/marimo/_plugins/ui/_impl/table.py)\nTraceback (most recent call last):\n File "/Users/bmeyers/miniconda3/envs/sdt/lib/python3.12/site-packages/marimo/_runtime/reload/autoreload.py", line 442, in superreload\n module = reload(module)\n ^^^^^^^^^^^^^^\n File "/Users/bmeyers/miniconda3/envs/sdt/lib/python3.12/importlib/__init__.py", line 131, in reload\n _bootstrap._exec(spec, module)\n File "<frozen importlib._bootstrap>", line 866, in _exec\n File "<frozen importlib._bootstrap_external>", line 999, in exec_module\n File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed\n File "/Users/bmeyers/miniconda3/envs/sdt/lib/python3.12/site-packages/marimo/_cli/cli.py", line 17, in <module>\n from marimo._ast.load import get_notebook_status\nImportError: cannot import name 'get_notebook_status' from 'marimo._ast.load' (/Users/bmeyers/miniconda3/envs/sdt/lib/python3.12/site-packages/marimo/_ast/load.py)\n