From 70a5644173212173e49aa90dabfb3fce117d75b8 Mon Sep 17 00:00:00 2001 From: Krzysztof Domino Date: Mon, 9 Oct 2023 09:47:45 +0200 Subject: [PATCH] tidy run and check solutions --- AGV_quantum/check_sol.py | 39 ---------- README.md | 17 ++++- annealing_results/2_tiny_AGV/real_1000_250_4 | Bin 24087 -> 0 bytes annealing_results/tiny_2_AGV/new_bqm.pkl | Bin 0 -> 781 bytes annealing_results/tiny_2_AGV/new_bqm_info.pkl | Bin 0 -> 126 bytes check_sol.py | 72 ++++++++++++++++++ lp_files/lp_large.pkl | Bin 2863608 -> 5725787 bytes lp_files/lp_largest.pkl | Bin 3853433 -> 7705332 bytes lp_files/lp_medium.pkl | Bin 90905 -> 177556 bytes lp_files/lp_medium_small.pkl | Bin 38483 -> 73903 bytes lp_files/lp_small.pkl | Bin 7477 -> 14816 bytes lp_files/lp_smallest.pkl | Bin 2011 -> 3888 bytes lp_files/lp_tiny.pkl | Bin 954 -> 1764 bytes run_examples.py | 66 +++++++++------- 14 files changed, 125 insertions(+), 69 deletions(-) delete mode 100644 AGV_quantum/check_sol.py delete mode 100644 annealing_results/2_tiny_AGV/real_1000_250_4 create mode 100644 annealing_results/tiny_2_AGV/new_bqm.pkl create mode 100644 annealing_results/tiny_2_AGV/new_bqm_info.pkl create mode 100644 check_sol.py diff --git a/AGV_quantum/check_sol.py b/AGV_quantum/check_sol.py deleted file mode 100644 index 472f73f..0000000 --- a/AGV_quantum/check_sol.py +++ /dev/null @@ -1,39 +0,0 @@ -import pickle -import os -import dimod -from AGV_quantum import get_results - - -from pathlib import Path - -cwd = os.getcwd() -sol_folder = Path("annealing_results/15_AGV") -lp_folder = Path("lp_files") - -hybrid = "bqm" - -with open(os.path.join(cwd, "..", sol_folder, f"new_{hybrid}.pkl"), "rb") as f: - sampleset = pickle.load(f) - -with open(os.path.join(cwd, "..", lp_folder, "lp_largest.pkl"), "rb") as f: - lp = pickle.load(f) - -sampleset = dimod.SampleSet.from_serializable(sampleset) - -if __name__ == '__main__': - - if hybrid == "bqm": - print(sampleset.info) - p=5 - lp._to_bqm_qubo_ising(p) - sampleset = lp.interpreter(sampleset) - solutions = get_results(sampleset, lp) - print(solutions) - - - elif hybrid == "cqm": - print(sampleset.info) - solutions = get_results(sampleset, lp) - for sol in solutions: - if sol["feasible"]: - print(sol) diff --git a/README.md b/README.md index 0e03157..57cf776 100644 --- a/README.md +++ b/README.md @@ -17,21 +17,32 @@ In directory ```examples``` there are AGVs scheduling problems. In order of incr To run this project in terminal use path/to/project> python -m run_examples -There are optional boolean parameters (```1``` yes, ```0``` no): ```--solve_linear``` - solve on CPLEX , ```--train_diagram``` - plot "train diagram" for given problem ```--solve_quadratic``` - solve on hybrid quantum classical (the particular solver and penalty parameter can be set in the script). +There are optional boolean parameters (```1``` yes, ```0``` no): -Example: +- ```--solve_linear``` - if ```1``` solve ILP on CPLEX, if ```0``` solve on hybrid quantum classical +- ```--hyb_solver``` chose particular hybrid solver ```"bqm"``` or ```"cqm"``` are supported, for ```"bqm"``` penalty parameter can be set in the script (works if ```--solve_linear = 0```), +- ```--train_diagram``` - plot "train diagram" for given problem (works if ```--solve_linear = 1```). + +Examples: ```python -m run_examples --solve_linear 1 --train_diagram 1 --example "small"``` +```python -m run_examples --solve_linear 0 --example "small" --hyb_solver "bqm"``` + following examples are supported: ```"tiny", "smallest", "small", "medium_small", "medium", "large", "largest"``` +Tho check solutions use: + +```python -m check_sol.py --example "small" --hyb_solver "cqm"``` + + To run tests use path/to/project> python3 -m unittest ## Computational results In folder ```annealing_results``` there are results on quantum and hybrid devices. -In folder ```lp_files``` there are results of classical solver on the ILP. +In folder ```lp_files``` there are saved linear models for checkout of quantum solver. ### Citing this work diff --git a/annealing_results/2_tiny_AGV/real_1000_250_4 b/annealing_results/2_tiny_AGV/real_1000_250_4 deleted file mode 100644 index b57a4ac44660700e2f86dcaa6a41d272984ef562..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24087 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 diff --git a/annealing_results/tiny_2_AGV/new_bqm.pkl b/annealing_results/tiny_2_AGV/new_bqm.pkl new file mode 100644 index 0000000000000000000000000000000000000000..6556bbfce5ef6c527f209a9b2ff28f12298a627e GIT binary patch literal 781 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 delta 23746 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 A!T3{X4zAMiJcbMd6Zj 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 delta 1862 zcmds%O=uHA6vs2V;<_7Q3w!7xUP{1V6AZc#g+c<&A=rQ(Dg+FE7JE?AVuOc8Fe0d^ zU}U0!Hef-aAi<(5^eEm0As0Og9z6CC5D%gy@x3>1!j@LC)RTc>-}}w~y*F=WGRtp` z5A7XJ&3IIJ9HHNRckarChr^yR1mBmX)!o9Ad2__9om2BtbX-}tJ?Y!ueq(>%A`j;Y z$A;~&CTy?Q__o8flcFP^q*q~;ns`LM0Ex5a1dwiO$>_sRR_p=^y4o$0+m{DM<8oKW zfu3uqw`MrnflMmoGn1%%o@vOhR+9Y$C{&FFCIuj4R5b``N<>zexS%;pmF|V2a-?~~ zBo3NM(%fcJ29hSt5|bj3BSfAu!S&1%X)=icxkf}X!RmK_Ec?^kHLjUzrF5R;AkPDi z!u3!d>kN}gAh?6wl+K(7qB_;Pkp@yljdhBnunXMNZc1myE>v|*azNDnTn|-mQJy&_ zuDn}l!%0-xHz4LUDKbnjuUfIrl92PKTM#qLieXSZqnN`?aCNkQ)+HvmH=AeCci=K8 zrYOra$CUn%Md!uZ>(^VNyY2__ow{uABmpANrA%eb{70p{Q;RM#6q<|))fp2>QUEu z@najN{w|8wv&rY6pm#LrnMt-P@ER#rfqLqd?U{=v90C3Cbb>mpvUzMs#PFJfM;+?_ z(nn|{I*?&k?34u`tqE`q2EFhQ4*T-L6bYkIZJci&kBO0q@fz0qCqwql%*xe$;^@v_ DT^Iz^ diff --git a/lp_files/lp_small.pkl b/lp_files/lp_small.pkl index 7ca53383c086a880bba7fd52e576b214bad5c4fc..121b58cd838f03f705e0253391144be03248ca3a 100644 GIT binary patch literal 14816 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 literal 2011 zcmeHI&2G~`5MDQK3u%F?>ZxYw>Tz**{uHo{_@_5YYaV}ryzSDFZzQ%p09+oh3cstR#N@1>I zEKH-evL9h8pTfI9c+cW}iw`WWTimet(BdPDk1aj{<0A{nWROh;>12>k1_j7$fHIYM arwxHwXr-CbU9AvtT1jlwdjmlp*Z%Vkv7?q+_DP7eDI@i z-*)}u{4ab~P|vx^?bfn^%tsUW{m#AToZq?U=H?z0zJ4p^a7Rejv;o*W*?3SwKyiYpJQhlAO}eyN**HuO?Q=FkdC-afI1$0pl9T z6yGq@JmO_aDjg+29WKHpxC~d|Dy+aYbWUb!v^-KUwNwe6@0635_LbRO6oKn-!{bYS z;3vL4wA?TlpcMu&Z5nk%%R{VX@@2*gW84FBlk*cgsUmWPLXgX}cH|o4#WA&fELP8A zt68j(#nu@wIUx%MvD#}XXh^vViJ4SNH}i;9^BkgKRuStamBi*1dc4rFm?QXdz(%{1 zmK#Q1Ys7}wUKH6AJRer%VViLhF*m{U!HY6b@NzInLk>~!quA6O{A|y$O$}SaTJVGy z2gzjDqa@vLi|LotpXb_r(eL+rzwwb^<`UsdA06oFktHM_Jx4RCr7cdJah$6EyZ%{q zerAbk`KRe9zv9LI7j+i>Do^p>)=}|_{})|>Cy^H%`X!(XJv!O2H9OZhcro34_#@jz z#cGoj|H}NQaayEfd3z@m(d5sAWu7Xzv$FbTidAnXmrZ-C%mr(1cE8}IMQ``P_jECH zrkV4Y0|A8a82YdcF1&)*umf+Q4I6l0jO{4KYls_YSb;tA4BKBIrG|n5c0?iVF)6n zgdj40J(diCl1Hc+EX%IR=!N5 zIDQv2mIt+!cg$LLo#-ddCwqKI)n?r(hZyQ{@tBf!|7n!>mtE&H{kS-%xvtSn~D|1EyZoc9mQS6Jz&CgyDhLpq3MT=cQ`|$X?kkaI0q|o%ikqI B1xo+` diff --git a/run_examples.py b/run_examples.py index 880666b..561bd89 100644 --- a/run_examples.py +++ b/run_examples.py @@ -15,57 +15,56 @@ parser.add_argument( "--solve_linear", type=int, - help="Solve the problem on CPLEX", + help="1 if solve the linear problem on CPLEX, 0 is solve the problem on hybrid quantum approach", default=1, ) parser.add_argument( "--train_diagram", type=int, - help="Make train diagram for CPLEX solution", - default=0, -) -parser.add_argument( - "--solve_quadratic", - type=int, - help="Solve using hybrid quantum-classical approach", + help="Make train diagram for linear solution", default=0, ) parser.add_argument( "--example", type=str, - help="chose example []", + help="chose example out of [tiny, smallest, small, medium_small, medium, large, largest]", default="smallest", ) +parser.add_argument( + "--hyb_solver", + type=str, + help="chose bqm or cqm", + default="bqm", +) args = parser.parse_args() cwd = os.getcwd() if args.example == "tiny": from examples.example_tiny import M, tracks, tracks_len, agv_routes, d_max, tau_pass, tau_headway, tau_operation, weights, initial_conditions - save_path = os.path.join(cwd, "..", "annealing_results", "tiny_2_AGV") + save_path = os.path.join(cwd, "annealing_results", "tiny_2_AGV") if args.example == "smallest": from examples.example_smallest import M, tracks, tracks_len, agv_routes, d_max, tau_pass, tau_headway, tau_operation, weights, initial_conditions - save_path = os.path.join(cwd, "..", "annealing_results", "2_AGV") + save_path = os.path.join(cwd, "annealing_results", "2_AGV") if args.example == "small": from examples.example_small import M, tracks, tracks_len, agv_routes, d_max, tau_pass, tau_headway, tau_operation, weights, initial_conditions - save_path = os.path.join(cwd, "..", "annealing_results", "4_AGV") + save_path = os.path.join(cwd, "annealing_results", "4_AGV") if args.example == "medium_small": from examples.example_medium_small import M, tracks, tracks_len, agv_routes, d_max, tau_pass, tau_headway, tau_operation, weights, initial_conditions - save_path = os.path.join(cwd, "..", "annealing_results", "6_AGV") + save_path = os.path.join(cwd, "annealing_results", "6_AGV") if args.example == "medium": from examples.example_medium import M, tracks, tracks_len, agv_routes, d_max, tau_pass, tau_headway, tau_operation, weights, initial_conditions - save_path = os.path.join(cwd, "..", "annealing_results", "7_AGV") + save_path = os.path.join(cwd, "annealing_results", "7_AGV") if args.example == "large": from examples.example_large import M, tracks, tracks_len, agv_routes, d_max, tau_pass, tau_headway, tau_operation, weights, initial_conditions - save_path = os.path.join(cwd, "..", "annealing_results", "12_AGV") + save_path = os.path.join(cwd, "annealing_results", "12_AGV") if args.example == "largest": from examples.example_largest import M, tracks, tracks_len, agv_routes, d_max, tau_pass, tau_headway, tau_operation, weights, initial_conditions - save_path = os.path.join(cwd, "..", "annealing_results", "15_AGV") + save_path = os.path.join(cwd, "annealing_results", "15_AGV") else: print(f"example {args.example} not suported") solve_linear = args.solve_linear -solve_quadratic = args.solve_quadratic if __name__ == "__main__": @@ -82,21 +81,34 @@ end = time.time() print("time: ", end-begin) model.print_solution(print_zeros=True) - # AGV.nice_print(model, sol) <- WIP + #AGV.nice_print(model, sol) <- WIP if args.train_diagram: plot_train_diagram(sol, agv_routes, tracks_len) - if solve_quadratic: - ising_size = True - hybrid = "bqm" # select hybrid solver bqm or cqm - p = 5 # penalty for QUBO creation + else: + + assert args.hyb_solver in ["bqm", "cqm"] + hybrid = args.hyb_solver + p = 5 # penalty for QUBO creation model = QuadraticAGV(AGV) + + # saves model for checks + lp_file = os.path.join(cwd, f"lp_files/lp_{args.example}.pkl") + if not os.path.isfile(lp_file): + with open(lp_file, "wb") as f: + pickle.dump(model, f) + model.to_bqm_qubo_ising(p) - if ising_size: - print("n.o. qubits", model._count_qubits()) - print("n.o. quandratic couplings", model._count_quadratic_couplings()) - print("n.o. linear fields", model._count_linear_fields()) + + # check if results are saved + is_file = os.path.isfile(os.path.join(save_path, f"new_{hybrid}_info.pkl")) + if is_file: + print(".......... files exist ............") + if hybrid == "bqm": + print("n.o. qubits", model._count_qubits()) + print("n.o. quandratic couplings", model._count_quadratic_couplings()) + print("n.o. linear fields", model._count_linear_fields()) else: model.to_cqm() cwd = os.getcwd() @@ -111,7 +123,7 @@ info = sampleset.info print(sampleset) print(info) - + with open(os.path.join(save_path, f"new_{hybrid}_info.pkl"), "wb") as f: pickle.dump(info, f)