├── .gitignore ├── README.md ├── env.yml ├── learning ├── data_type.py ├── model.py ├── policy_FCMCNF.pkl ├── policy_FCMCNF_svm.pkl ├── policy_GISP.pkl ├── policy_GISP_ranknet.pkl ├── policy_GISP_svm.pkl ├── policy_WPMS.pkl ├── policy_WPMS_ranknet.pkl ├── policy_WPMS_svm.pkl ├── train.ipynb ├── train.py ├── train_ranknet.py ├── train_svm.py └── utils.py ├── main.ipynb ├── main.py ├── node_selection ├── behaviour_gen.ipynb ├── behaviour_gen.py ├── node_selectors.py └── recorders.py ├── problem_generation ├── data │ ├── FCMCNF │ │ ├── test │ │ │ ├── n_nodes=15_n_commodities=22_id_0.13.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_0.13.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_0.88.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_0.88.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_1.90.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_1.90.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_10.17.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_10.17.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_11.72.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_11.72.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_12.01.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_12.01.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_15.48.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_15.48.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_17.08.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_17.08.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_20.91.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_20.91.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_24.35.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_24.35.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_24.79.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_24.79.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_25.55.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_25.55.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_26.67.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_26.67.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_27.47.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_27.47.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_28.40.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_28.40.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_32.23.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_32.23.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_34.37.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_34.37.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_36.75.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_36.75.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_39.76.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_39.76.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_4.18.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_4.18.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_42.20.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_42.20.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_45.04.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_45.04.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_46.14.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_46.14.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_50.38.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_50.38.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_50.83.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_50.83.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_51.47.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_51.47.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_52.04.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_52.04.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_53.51.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_53.51.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_55.76.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_55.76.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_55.86.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_55.86.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_58.26.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_58.26.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_61.40.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_61.40.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_63.32.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_63.32.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_64.65.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_64.65.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_67.01.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_67.01.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_71.03.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_71.03.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_75.03.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_75.03.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_77.30.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_77.30.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_8.41.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_8.41.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_80.02.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_80.02.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_80.60.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_80.60.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_81.63.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_81.63.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_82.31.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_82.31.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_83.24.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_83.24.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_85.23.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_85.23.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_88.74.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_88.74.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_9.43.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_9.43.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_91.06.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_91.06.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_94.45.lp │ │ │ ├── n_nodes=15_n_commodities=22_id_94.45.sol │ │ │ ├── n_nodes=15_n_commodities=22_id_99.73.lp │ │ │ └── n_nodes=15_n_commodities=22_id_99.73.sol │ │ └── transfer │ │ │ ├── n_nodes=20_n_commodities=30_id_10.61.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_10.61.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_11.13.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_11.13.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_14.79.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_14.79.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_15.16.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_15.16.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_15.32.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_15.32.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_15.43.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_15.43.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_18.56.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_18.56.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_20.10.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_20.10.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_20.26.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_20.26.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_21.47.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_21.47.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_21.86.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_21.86.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_22.88.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_22.88.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_23.36.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_23.36.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_25.70.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_25.70.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_25.94.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_25.94.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_30.09.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_30.09.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_30.10.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_30.10.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_31.08.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_31.08.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_35.54.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_35.54.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_36.51.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_36.51.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_37.51.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_37.51.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_37.52.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_37.52.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_37.91.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_37.91.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_42.02.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_42.02.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_45.14.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_45.14.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_49.97.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_49.97.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_50.67.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_50.67.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_51.64.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_51.64.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_52.19.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_52.19.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_52.38.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_52.38.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_54.34.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_54.34.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_55.39.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_55.39.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_56.89.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_56.89.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_57.05.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_57.05.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_62.04.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_62.04.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_67.23.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_67.23.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_73.23.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_73.23.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_74.93.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_74.93.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_78.38.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_78.38.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_8.73.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_8.73.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_81.14.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_81.14.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_82.45.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_82.45.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_83.48.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_83.48.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_83.69.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_83.69.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_84.67.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_84.67.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_86.66.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_86.66.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_88.59.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_88.59.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_92.40.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_92.40.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_92.75.lp │ │ │ ├── n_nodes=20_n_commodities=30_id_92.75.sol │ │ │ ├── n_nodes=20_n_commodities=30_id_98.42.lp │ │ │ └── n_nodes=20_n_commodities=30_id_98.42.sol │ ├── GISP │ │ ├── test │ │ │ ├── er_n=60_m=1039_p=0.60_SET2_setparam=100.00_alpha=0.50_552.lp │ │ │ ├── er_n=60_m=1039_p=0.60_SET2_setparam=100.00_alpha=0.50_552.sol │ │ │ ├── er_n=60_m=1060_p=0.60_SET2_setparam=100.00_alpha=0.50_557.lp │ │ │ ├── er_n=60_m=1060_p=0.60_SET2_setparam=100.00_alpha=0.50_557.sol │ │ │ ├── er_n=60_m=1060_p=0.60_SET2_setparam=100.00_alpha=0.50_606.lp │ │ │ ├── er_n=60_m=1060_p=0.60_SET2_setparam=100.00_alpha=0.50_606.sol │ │ │ ├── er_n=60_m=1070_p=0.60_SET2_setparam=100.00_alpha=0.50_590.lp │ │ │ ├── er_n=60_m=1070_p=0.60_SET2_setparam=100.00_alpha=0.50_590.sol │ │ │ ├── er_n=60_m=1078_p=0.60_SET2_setparam=100.00_alpha=0.50_585.lp │ │ │ ├── er_n=60_m=1078_p=0.60_SET2_setparam=100.00_alpha=0.50_585.sol │ │ │ ├── er_n=60_m=1094_p=0.60_SET2_setparam=100.00_alpha=0.50_512.lp │ │ │ ├── er_n=60_m=1094_p=0.60_SET2_setparam=100.00_alpha=0.50_512.sol │ │ │ ├── er_n=60_m=1114_p=0.60_SET2_setparam=100.00_alpha=0.50_581.lp │ │ │ ├── er_n=60_m=1114_p=0.60_SET2_setparam=100.00_alpha=0.50_581.sol │ │ │ ├── er_n=61_m=1087_p=0.60_SET2_setparam=100.00_alpha=0.50_521.lp │ │ │ ├── er_n=61_m=1087_p=0.60_SET2_setparam=100.00_alpha=0.50_521.sol │ │ │ ├── er_n=61_m=1094_p=0.60_SET2_setparam=100.00_alpha=0.50_607.lp │ │ │ ├── er_n=61_m=1094_p=0.60_SET2_setparam=100.00_alpha=0.50_607.sol │ │ │ ├── er_n=61_m=1097_p=0.60_SET2_setparam=100.00_alpha=0.50_598.lp │ │ │ ├── er_n=61_m=1097_p=0.60_SET2_setparam=100.00_alpha=0.50_598.sol │ │ │ ├── er_n=61_m=1104_p=0.60_SET2_setparam=100.00_alpha=0.50_511.lp │ │ │ ├── er_n=61_m=1104_p=0.60_SET2_setparam=100.00_alpha=0.50_511.sol │ │ │ ├── er_n=61_m=1105_p=0.60_SET2_setparam=100.00_alpha=0.50_597.lp │ │ │ ├── er_n=61_m=1105_p=0.60_SET2_setparam=100.00_alpha=0.50_597.sol │ │ │ ├── er_n=61_m=1112_p=0.60_SET2_setparam=100.00_alpha=0.50_568.lp │ │ │ ├── er_n=61_m=1112_p=0.60_SET2_setparam=100.00_alpha=0.50_568.sol │ │ │ ├── er_n=61_m=1127_p=0.60_SET2_setparam=100.00_alpha=0.50_592.lp │ │ │ ├── er_n=61_m=1127_p=0.60_SET2_setparam=100.00_alpha=0.50_592.sol │ │ │ ├── er_n=62_m=1100_p=0.60_SET2_setparam=100.00_alpha=0.50_567.lp │ │ │ ├── er_n=62_m=1100_p=0.60_SET2_setparam=100.00_alpha=0.50_567.sol │ │ │ ├── er_n=62_m=1122_p=0.60_SET2_setparam=100.00_alpha=0.50_526.lp │ │ │ ├── er_n=62_m=1122_p=0.60_SET2_setparam=100.00_alpha=0.50_526.sol │ │ │ ├── er_n=62_m=1129_p=0.60_SET2_setparam=100.00_alpha=0.50_515.lp │ │ │ ├── er_n=62_m=1129_p=0.60_SET2_setparam=100.00_alpha=0.50_515.sol │ │ │ ├── er_n=62_m=1151_p=0.60_SET2_setparam=100.00_alpha=0.50_535.lp │ │ │ ├── er_n=62_m=1151_p=0.60_SET2_setparam=100.00_alpha=0.50_535.sol │ │ │ ├── er_n=63_m=1183_p=0.60_SET2_setparam=100.00_alpha=0.50_532.lp │ │ │ ├── er_n=63_m=1183_p=0.60_SET2_setparam=100.00_alpha=0.50_532.sol │ │ │ ├── er_n=63_m=1222_p=0.60_SET2_setparam=100.00_alpha=0.50_536.lp │ │ │ ├── er_n=63_m=1222_p=0.60_SET2_setparam=100.00_alpha=0.50_536.sol │ │ │ ├── er_n=64_m=1192_p=0.60_SET2_setparam=100.00_alpha=0.50_575.lp │ │ │ ├── er_n=64_m=1192_p=0.60_SET2_setparam=100.00_alpha=0.50_575.sol │ │ │ ├── er_n=64_m=1195_p=0.60_SET2_setparam=100.00_alpha=0.50_578.lp │ │ │ ├── er_n=64_m=1195_p=0.60_SET2_setparam=100.00_alpha=0.50_578.sol │ │ │ ├── er_n=64_m=1237_p=0.60_SET2_setparam=100.00_alpha=0.50_586.lp │ │ │ ├── er_n=64_m=1237_p=0.60_SET2_setparam=100.00_alpha=0.50_586.sol │ │ │ ├── er_n=65_m=1215_p=0.60_SET2_setparam=100.00_alpha=0.50_587.lp │ │ │ ├── er_n=65_m=1215_p=0.60_SET2_setparam=100.00_alpha=0.50_587.sol │ │ │ ├── er_n=65_m=1228_p=0.60_SET2_setparam=100.00_alpha=0.50_579.lp │ │ │ ├── er_n=65_m=1228_p=0.60_SET2_setparam=100.00_alpha=0.50_579.sol │ │ │ ├── er_n=65_m=1236_p=0.60_SET2_setparam=100.00_alpha=0.50_541.lp │ │ │ ├── er_n=65_m=1236_p=0.60_SET2_setparam=100.00_alpha=0.50_541.sol │ │ │ ├── er_n=65_m=1253_p=0.60_SET2_setparam=100.00_alpha=0.50_562.lp │ │ │ ├── er_n=65_m=1253_p=0.60_SET2_setparam=100.00_alpha=0.50_562.sol │ │ │ ├── er_n=65_m=1258_p=0.60_SET2_setparam=100.00_alpha=0.50_514.lp │ │ │ ├── er_n=65_m=1258_p=0.60_SET2_setparam=100.00_alpha=0.50_514.sol │ │ │ ├── er_n=65_m=1294_p=0.60_SET2_setparam=100.00_alpha=0.50_530.lp │ │ │ ├── er_n=65_m=1294_p=0.60_SET2_setparam=100.00_alpha=0.50_530.sol │ │ │ ├── er_n=66_m=1280_p=0.60_SET2_setparam=100.00_alpha=0.50_517.lp │ │ │ ├── er_n=66_m=1280_p=0.60_SET2_setparam=100.00_alpha=0.50_517.sol │ │ │ ├── er_n=66_m=1282_p=0.60_SET2_setparam=100.00_alpha=0.50_596.lp │ │ │ ├── er_n=66_m=1282_p=0.60_SET2_setparam=100.00_alpha=0.50_596.sol │ │ │ ├── er_n=66_m=1296_p=0.60_SET2_setparam=100.00_alpha=0.50_602.lp │ │ │ ├── er_n=66_m=1296_p=0.60_SET2_setparam=100.00_alpha=0.50_602.sol │ │ │ ├── er_n=67_m=1330_p=0.60_SET2_setparam=100.00_alpha=0.50_556.lp │ │ │ ├── er_n=67_m=1330_p=0.60_SET2_setparam=100.00_alpha=0.50_556.sol │ │ │ ├── er_n=67_m=1336_p=0.60_SET2_setparam=100.00_alpha=0.50_542.lp │ │ │ ├── er_n=67_m=1336_p=0.60_SET2_setparam=100.00_alpha=0.50_542.sol │ │ │ ├── er_n=67_m=1360_p=0.60_SET2_setparam=100.00_alpha=0.50_537.lp │ │ │ ├── er_n=67_m=1360_p=0.60_SET2_setparam=100.00_alpha=0.50_537.sol │ │ │ ├── er_n=67_m=1364_p=0.60_SET2_setparam=100.00_alpha=0.50_550.lp │ │ │ ├── er_n=67_m=1364_p=0.60_SET2_setparam=100.00_alpha=0.50_550.sol │ │ │ ├── er_n=68_m=1337_p=0.60_SET2_setparam=100.00_alpha=0.50_563.lp │ │ │ ├── er_n=68_m=1337_p=0.60_SET2_setparam=100.00_alpha=0.50_563.sol │ │ │ ├── er_n=68_m=1351_p=0.60_SET2_setparam=100.00_alpha=0.50_580.lp │ │ │ ├── er_n=68_m=1351_p=0.60_SET2_setparam=100.00_alpha=0.50_580.sol │ │ │ ├── er_n=68_m=1414_p=0.60_SET2_setparam=100.00_alpha=0.50_583.lp │ │ │ ├── er_n=68_m=1414_p=0.60_SET2_setparam=100.00_alpha=0.50_583.sol │ │ │ ├── er_n=69_m=1400_p=0.60_SET2_setparam=100.00_alpha=0.50_561.lp │ │ │ ├── er_n=69_m=1400_p=0.60_SET2_setparam=100.00_alpha=0.50_561.sol │ │ │ ├── er_n=69_m=1409_p=0.60_SET2_setparam=100.00_alpha=0.50_519.lp │ │ │ ├── er_n=69_m=1409_p=0.60_SET2_setparam=100.00_alpha=0.50_519.sol │ │ │ ├── er_n=69_m=1431_p=0.60_SET2_setparam=100.00_alpha=0.50_540.lp │ │ │ ├── er_n=69_m=1431_p=0.60_SET2_setparam=100.00_alpha=0.50_540.sol │ │ │ ├── er_n=70_m=1408_p=0.60_SET2_setparam=100.00_alpha=0.50_529.lp │ │ │ ├── er_n=70_m=1408_p=0.60_SET2_setparam=100.00_alpha=0.50_529.sol │ │ │ ├── er_n=70_m=1419_p=0.60_SET2_setparam=100.00_alpha=0.50_560.lp │ │ │ ├── er_n=70_m=1419_p=0.60_SET2_setparam=100.00_alpha=0.50_560.sol │ │ │ ├── er_n=70_m=1431_p=0.60_SET2_setparam=100.00_alpha=0.50_543.lp │ │ │ ├── er_n=70_m=1431_p=0.60_SET2_setparam=100.00_alpha=0.50_543.sol │ │ │ ├── er_n=70_m=1449_p=0.60_SET2_setparam=100.00_alpha=0.50_544.lp │ │ │ ├── er_n=70_m=1449_p=0.60_SET2_setparam=100.00_alpha=0.50_544.sol │ │ │ ├── er_n=70_m=1455_p=0.60_SET2_setparam=100.00_alpha=0.50_576.lp │ │ │ ├── er_n=70_m=1455_p=0.60_SET2_setparam=100.00_alpha=0.50_576.sol │ │ │ ├── er_n=70_m=1456_p=0.60_SET2_setparam=100.00_alpha=0.50_565.lp │ │ │ ├── er_n=70_m=1456_p=0.60_SET2_setparam=100.00_alpha=0.50_565.sol │ │ │ ├── er_n=70_m=1458_p=0.60_SET2_setparam=100.00_alpha=0.50_573.lp │ │ │ ├── er_n=70_m=1458_p=0.60_SET2_setparam=100.00_alpha=0.50_573.sol │ │ │ ├── er_n=70_m=1461_p=0.60_SET2_setparam=100.00_alpha=0.50_609.lp │ │ │ └── er_n=70_m=1461_p=0.60_SET2_setparam=100.00_alpha=0.50_609.sol │ │ └── transfer │ │ │ ├── er_n=100_m=2997_p=0.60_SET2_setparam=100.00_alpha=0.50_4333.lp │ │ │ ├── er_n=100_m=2997_p=0.60_SET2_setparam=100.00_alpha=0.50_4333.sol │ │ │ ├── er_n=100_m=3009_p=0.60_SET2_setparam=100.00_alpha=0.50_4367.lp │ │ │ ├── er_n=100_m=3009_p=0.60_SET2_setparam=100.00_alpha=0.50_4367.sol │ │ │ ├── er_n=80_m=1895_p=0.60_SET2_setparam=100.00_alpha=0.50_4395.lp │ │ │ ├── er_n=80_m=1895_p=0.60_SET2_setparam=100.00_alpha=0.50_4395.sol │ │ │ ├── er_n=80_m=1902_p=0.60_SET2_setparam=100.00_alpha=0.50_4326.lp │ │ │ ├── er_n=80_m=1902_p=0.60_SET2_setparam=100.00_alpha=0.50_4326.sol │ │ │ ├── er_n=80_m=1903_p=0.60_SET2_setparam=100.00_alpha=0.50_4400.lp │ │ │ ├── er_n=80_m=1903_p=0.60_SET2_setparam=100.00_alpha=0.50_4400.sol │ │ │ ├── er_n=80_m=1909_p=0.60_SET2_setparam=100.00_alpha=0.50_4327.lp │ │ │ ├── er_n=80_m=1909_p=0.60_SET2_setparam=100.00_alpha=0.50_4327.sol │ │ │ ├── er_n=81_m=1944_p=0.60_SET2_setparam=100.00_alpha=0.50_4346.lp │ │ │ ├── er_n=81_m=1944_p=0.60_SET2_setparam=100.00_alpha=0.50_4346.sol │ │ │ ├── er_n=82_m=1981_p=0.60_SET2_setparam=100.00_alpha=0.50_4337.lp │ │ │ ├── er_n=82_m=1981_p=0.60_SET2_setparam=100.00_alpha=0.50_4337.sol │ │ │ ├── er_n=82_m=1992_p=0.60_SET2_setparam=100.00_alpha=0.50_4314.lp │ │ │ ├── er_n=82_m=1992_p=0.60_SET2_setparam=100.00_alpha=0.50_4314.sol │ │ │ ├── er_n=82_m=2004_p=0.60_SET2_setparam=100.00_alpha=0.50_4363.lp │ │ │ ├── er_n=82_m=2004_p=0.60_SET2_setparam=100.00_alpha=0.50_4363.sol │ │ │ ├── er_n=83_m=2024_p=0.60_SET2_setparam=100.00_alpha=0.50_4388.lp │ │ │ ├── er_n=83_m=2024_p=0.60_SET2_setparam=100.00_alpha=0.50_4388.sol │ │ │ ├── er_n=83_m=2027_p=0.60_SET2_setparam=100.00_alpha=0.50_4391.lp │ │ │ ├── er_n=83_m=2027_p=0.60_SET2_setparam=100.00_alpha=0.50_4391.sol │ │ │ ├── er_n=85_m=2181_p=0.60_SET2_setparam=100.00_alpha=0.50_4374.lp │ │ │ ├── er_n=85_m=2181_p=0.60_SET2_setparam=100.00_alpha=0.50_4374.sol │ │ │ ├── er_n=86_m=2162_p=0.60_SET2_setparam=100.00_alpha=0.50_4392.lp │ │ │ ├── er_n=86_m=2162_p=0.60_SET2_setparam=100.00_alpha=0.50_4392.sol │ │ │ ├── er_n=86_m=2201_p=0.60_SET2_setparam=100.00_alpha=0.50_4319.lp │ │ │ ├── er_n=86_m=2201_p=0.60_SET2_setparam=100.00_alpha=0.50_4319.sol │ │ │ ├── er_n=86_m=2201_p=0.60_SET2_setparam=100.00_alpha=0.50_4393.lp │ │ │ ├── er_n=86_m=2201_p=0.60_SET2_setparam=100.00_alpha=0.50_4393.sol │ │ │ ├── er_n=87_m=2279_p=0.60_SET2_setparam=100.00_alpha=0.50_4313.lp │ │ │ ├── er_n=87_m=2279_p=0.60_SET2_setparam=100.00_alpha=0.50_4313.sol │ │ │ ├── er_n=88_m=2262_p=0.60_SET2_setparam=100.00_alpha=0.50_4365.lp │ │ │ ├── er_n=88_m=2262_p=0.60_SET2_setparam=100.00_alpha=0.50_4365.sol │ │ │ ├── er_n=88_m=2314_p=0.60_SET2_setparam=100.00_alpha=0.50_4373.lp │ │ │ ├── er_n=88_m=2314_p=0.60_SET2_setparam=100.00_alpha=0.50_4373.sol │ │ │ ├── er_n=88_m=2314_p=0.60_SET2_setparam=100.00_alpha=0.50_4376.lp │ │ │ ├── er_n=88_m=2314_p=0.60_SET2_setparam=100.00_alpha=0.50_4376.sol │ │ │ ├── er_n=88_m=2332_p=0.60_SET2_setparam=100.00_alpha=0.50_4378.lp │ │ │ ├── er_n=88_m=2332_p=0.60_SET2_setparam=100.00_alpha=0.50_4378.sol │ │ │ ├── er_n=88_m=2339_p=0.60_SET2_setparam=100.00_alpha=0.50_4321.lp │ │ │ ├── er_n=88_m=2339_p=0.60_SET2_setparam=100.00_alpha=0.50_4321.sol │ │ │ ├── er_n=89_m=2386_p=0.60_SET2_setparam=100.00_alpha=0.50_4366.lp │ │ │ ├── er_n=89_m=2386_p=0.60_SET2_setparam=100.00_alpha=0.50_4366.sol │ │ │ ├── er_n=90_m=2389_p=0.60_SET2_setparam=100.00_alpha=0.50_4361.lp │ │ │ ├── er_n=90_m=2389_p=0.60_SET2_setparam=100.00_alpha=0.50_4361.sol │ │ │ ├── er_n=90_m=2437_p=0.60_SET2_setparam=100.00_alpha=0.50_4318.lp │ │ │ ├── er_n=90_m=2437_p=0.60_SET2_setparam=100.00_alpha=0.50_4318.sol │ │ │ ├── er_n=91_m=2461_p=0.60_SET2_setparam=100.00_alpha=0.50_4351.lp │ │ │ ├── er_n=91_m=2461_p=0.60_SET2_setparam=100.00_alpha=0.50_4351.sol │ │ │ ├── er_n=92_m=2482_p=0.60_SET2_setparam=100.00_alpha=0.50_4398.lp │ │ │ ├── er_n=92_m=2482_p=0.60_SET2_setparam=100.00_alpha=0.50_4398.sol │ │ │ ├── er_n=92_m=2487_p=0.60_SET2_setparam=100.00_alpha=0.50_4359.lp │ │ │ ├── er_n=92_m=2487_p=0.60_SET2_setparam=100.00_alpha=0.50_4359.sol │ │ │ ├── er_n=92_m=2519_p=0.60_SET2_setparam=100.00_alpha=0.50_4389.lp │ │ │ ├── er_n=92_m=2519_p=0.60_SET2_setparam=100.00_alpha=0.50_4389.sol │ │ │ ├── er_n=93_m=2577_p=0.60_SET2_setparam=100.00_alpha=0.50_4354.lp │ │ │ ├── er_n=93_m=2577_p=0.60_SET2_setparam=100.00_alpha=0.50_4354.sol │ │ │ ├── er_n=93_m=2593_p=0.60_SET2_setparam=100.00_alpha=0.50_4381.lp │ │ │ ├── er_n=93_m=2593_p=0.60_SET2_setparam=100.00_alpha=0.50_4381.sol │ │ │ ├── er_n=94_m=2611_p=0.60_SET2_setparam=100.00_alpha=0.50_4340.lp │ │ │ ├── er_n=94_m=2611_p=0.60_SET2_setparam=100.00_alpha=0.50_4340.sol │ │ │ ├── er_n=94_m=2615_p=0.60_SET2_setparam=100.00_alpha=0.50_4372.lp │ │ │ ├── er_n=94_m=2615_p=0.60_SET2_setparam=100.00_alpha=0.50_4372.sol │ │ │ ├── er_n=94_m=2634_p=0.60_SET2_setparam=100.00_alpha=0.50_4328.lp │ │ │ ├── er_n=94_m=2634_p=0.60_SET2_setparam=100.00_alpha=0.50_4328.sol │ │ │ ├── er_n=95_m=2654_p=0.60_SET2_setparam=100.00_alpha=0.50_4341.lp │ │ │ ├── er_n=95_m=2654_p=0.60_SET2_setparam=100.00_alpha=0.50_4341.sol │ │ │ ├── er_n=95_m=2664_p=0.60_SET2_setparam=100.00_alpha=0.50_4401.lp │ │ │ ├── er_n=95_m=2664_p=0.60_SET2_setparam=100.00_alpha=0.50_4401.sol │ │ │ ├── er_n=95_m=2709_p=0.60_SET2_setparam=100.00_alpha=0.50_4369.lp │ │ │ ├── er_n=95_m=2709_p=0.60_SET2_setparam=100.00_alpha=0.50_4369.sol │ │ │ ├── er_n=96_m=2718_p=0.60_SET2_setparam=100.00_alpha=0.50_4380.lp │ │ │ ├── er_n=96_m=2718_p=0.60_SET2_setparam=100.00_alpha=0.50_4380.sol │ │ │ ├── er_n=96_m=2728_p=0.60_SET2_setparam=100.00_alpha=0.50_4316.lp │ │ │ ├── er_n=96_m=2728_p=0.60_SET2_setparam=100.00_alpha=0.50_4316.sol │ │ │ ├── er_n=96_m=2733_p=0.60_SET2_setparam=100.00_alpha=0.50_4370.lp │ │ │ ├── er_n=96_m=2733_p=0.60_SET2_setparam=100.00_alpha=0.50_4370.sol │ │ │ ├── er_n=96_m=2745_p=0.60_SET2_setparam=100.00_alpha=0.50_4399.lp │ │ │ ├── er_n=96_m=2745_p=0.60_SET2_setparam=100.00_alpha=0.50_4399.sol │ │ │ ├── er_n=97_m=2765_p=0.60_SET2_setparam=100.00_alpha=0.50_4397.lp │ │ │ ├── er_n=97_m=2765_p=0.60_SET2_setparam=100.00_alpha=0.50_4397.sol │ │ │ ├── er_n=98_m=2798_p=0.60_SET2_setparam=100.00_alpha=0.50_4352.lp │ │ │ ├── er_n=98_m=2798_p=0.60_SET2_setparam=100.00_alpha=0.50_4352.sol │ │ │ ├── er_n=98_m=2813_p=0.60_SET2_setparam=100.00_alpha=0.50_4320.lp │ │ │ ├── er_n=98_m=2813_p=0.60_SET2_setparam=100.00_alpha=0.50_4320.sol │ │ │ ├── er_n=98_m=2822_p=0.60_SET2_setparam=100.00_alpha=0.50_4382.lp │ │ │ ├── er_n=98_m=2822_p=0.60_SET2_setparam=100.00_alpha=0.50_4382.sol │ │ │ ├── er_n=98_m=2825_p=0.60_SET2_setparam=100.00_alpha=0.50_4322.lp │ │ │ ├── er_n=98_m=2825_p=0.60_SET2_setparam=100.00_alpha=0.50_4322.sol │ │ │ ├── er_n=98_m=2871_p=0.60_SET2_setparam=100.00_alpha=0.50_4387.lp │ │ │ ├── er_n=98_m=2871_p=0.60_SET2_setparam=100.00_alpha=0.50_4387.sol │ │ │ ├── er_n=98_m=2881_p=0.60_SET2_setparam=100.00_alpha=0.50_4312.sol │ │ │ ├── er_n=99_m=2894_p=0.60_SET2_setparam=100.00_alpha=0.50_4385.lp │ │ │ ├── er_n=99_m=2894_p=0.60_SET2_setparam=100.00_alpha=0.50_4385.sol │ │ │ ├── er_n=99_m=2914_p=0.60_SET2_setparam=100.00_alpha=0.50_4336.lp │ │ │ ├── er_n=99_m=2914_p=0.60_SET2_setparam=100.00_alpha=0.50_4336.sol │ │ │ ├── er_n=99_m=2919_p=0.60_SET2_setparam=100.00_alpha=0.50_4350.lp │ │ │ └── er_n=99_m=2919_p=0.60_SET2_setparam=100.00_alpha=0.50_4350.sol │ └── WPMS │ │ ├── test │ │ ├── n=60_m=541_id_47.50.lp │ │ ├── n=60_m=541_id_47.50.sol │ │ ├── n=60_m=591_id_39.80.lp │ │ ├── n=60_m=591_id_39.80.sol │ │ ├── n=60_m=609_id_11.14.lp │ │ ├── n=60_m=609_id_11.14.sol │ │ ├── n=61_m=445_id_99.73.lp │ │ ├── n=61_m=445_id_99.73.sol │ │ ├── n=61_m=541_id_40.88.lp │ │ ├── n=61_m=541_id_40.88.sol │ │ ├── n=61_m=554_id_74.45.lp │ │ ├── n=61_m=554_id_74.45.sol │ │ ├── n=61_m=615_id_58.13.lp │ │ ├── n=61_m=615_id_58.13.sol │ │ ├── n=61_m=662_id_18.47.lp │ │ ├── n=61_m=662_id_18.47.sol │ │ ├── n=61_m=749_id_28.40.lp │ │ ├── n=61_m=749_id_28.40.sol │ │ ├── n=62_m=488_id_78.57.lp │ │ ├── n=62_m=488_id_78.57.sol │ │ ├── n=62_m=546_id_30.35.lp │ │ ├── n=62_m=546_id_30.35.sol │ │ ├── n=62_m=695_id_14.35.lp │ │ ├── n=62_m=695_id_14.35.sol │ │ ├── n=63_m=492_id_66.23.lp │ │ ├── n=63_m=492_id_66.23.sol │ │ ├── n=63_m=546_id_2.61.lp │ │ ├── n=63_m=546_id_2.61.sol │ │ ├── n=63_m=657_id_35.28.lp │ │ ├── n=63_m=657_id_35.28.sol │ │ ├── n=63_m=715_id_19.80.lp │ │ ├── n=63_m=715_id_19.80.sol │ │ ├── n=63_m=774_id_21.22.lp │ │ ├── n=63_m=774_id_21.22.sol │ │ ├── n=64_m=489_id_13.54.lp │ │ ├── n=64_m=489_id_13.54.sol │ │ ├── n=64_m=579_id_45.82.lp │ │ ├── n=64_m=579_id_45.82.sol │ │ ├── n=64_m=610_id_47.62.lp │ │ ├── n=64_m=610_id_47.62.sol │ │ ├── n=64_m=697_id_58.13.lp │ │ ├── n=64_m=697_id_58.13.sol │ │ ├── n=64_m=738_id_22.55.lp │ │ ├── n=64_m=738_id_22.55.sol │ │ ├── n=64_m=751_id_95.84.lp │ │ ├── n=64_m=751_id_95.84.sol │ │ ├── n=64_m=793_id_7.68.lp │ │ ├── n=64_m=793_id_7.68.sol │ │ ├── n=64_m=825_id_43.71.lp │ │ ├── n=64_m=825_id_43.71.sol │ │ ├── n=65_m=532_id_66.87.lp │ │ ├── n=65_m=532_id_66.87.sol │ │ ├── n=65_m=552_id_61.85.lp │ │ ├── n=65_m=552_id_61.85.sol │ │ ├── n=65_m=691_id_66.07.lp │ │ ├── n=65_m=691_id_66.07.sol │ │ ├── n=65_m=741_id_8.40.lp │ │ ├── n=65_m=741_id_8.40.sol │ │ ├── n=65_m=821_id_41.74.lp │ │ ├── n=65_m=821_id_41.74.sol │ │ ├── n=66_m=621_id_5.93.lp │ │ ├── n=66_m=621_id_5.93.sol │ │ ├── n=66_m=778_id_33.84.lp │ │ ├── n=66_m=778_id_33.84.sol │ │ ├── n=66_m=843_id_94.72.lp │ │ ├── n=66_m=843_id_94.72.sol │ │ ├── n=66_m=857_id_95.88.lp │ │ ├── n=66_m=857_id_95.88.sol │ │ ├── n=66_m=858_id_61.38.lp │ │ ├── n=66_m=858_id_61.38.sol │ │ ├── n=67_m=636_id_42.23.lp │ │ ├── n=67_m=636_id_42.23.sol │ │ ├── n=67_m=783_id_9.40.lp │ │ ├── n=67_m=783_id_9.40.sol │ │ ├── n=67_m=784_id_29.15.lp │ │ ├── n=67_m=784_id_29.15.sol │ │ ├── n=68_m=563_id_10.53.lp │ │ ├── n=68_m=563_id_10.53.sol │ │ ├── n=68_m=688_id_64.13.lp │ │ ├── n=68_m=688_id_64.13.sol │ │ ├── n=68_m=709_id_37.29.lp │ │ ├── n=68_m=709_id_37.29.sol │ │ ├── n=68_m=767_id_13.25.lp │ │ ├── n=68_m=767_id_13.25.sol │ │ ├── n=69_m=572_id_73.87.lp │ │ ├── n=69_m=572_id_73.87.sol │ │ ├── n=69_m=813_id_16.89.lp │ │ ├── n=69_m=813_id_16.89.sol │ │ ├── n=69_m=835_id_24.35.lp │ │ ├── n=69_m=835_id_24.35.sol │ │ ├── n=69_m=901_id_99.45.lp │ │ ├── n=69_m=901_id_99.45.sol │ │ ├── n=69_m=923_id_33.87.lp │ │ ├── n=69_m=923_id_33.87.sol │ │ ├── n=70_m=572_id_89.28.lp │ │ ├── n=70_m=572_id_89.28.sol │ │ ├── n=70_m=606_id_51.75.lp │ │ ├── n=70_m=606_id_51.75.sol │ │ ├── n=70_m=881_id_17.33.lp │ │ └── n=70_m=881_id_17.33.sol │ │ └── transfer │ │ ├── n=70_m=639_id_20.85.lp │ │ ├── n=70_m=639_id_20.85.sol │ │ ├── n=70_m=701_id_18.03.lp │ │ ├── n=70_m=701_id_18.03.sol │ │ ├── n=70_m=736_id_71.94.lp │ │ ├── n=70_m=736_id_71.94.sol │ │ ├── n=70_m=851_id_28.61.lp │ │ ├── n=70_m=851_id_28.61.sol │ │ ├── n=70_m=875_id_98.42.lp │ │ ├── n=70_m=875_id_98.42.sol │ │ ├── n=70_m=927_id_96.00.lp │ │ ├── n=70_m=927_id_96.00.sol │ │ ├── n=71_m=640_id_49.46.lp │ │ ├── n=71_m=640_id_49.46.sol │ │ ├── n=71_m=702_id_83.48.lp │ │ ├── n=71_m=702_id_83.48.sol │ │ ├── n=71_m=866_id_11.51.lp │ │ ├── n=71_m=866_id_11.51.sol │ │ ├── n=71_m=892_id_64.76.lp │ │ ├── n=71_m=892_id_64.76.sol │ │ ├── n=71_m=994_id_3.38.lp │ │ ├── n=71_m=994_id_3.38.sol │ │ ├── n=72_m=747_id_15.31.lp │ │ ├── n=72_m=747_id_15.31.sol │ │ ├── n=73_m=632_id_89.29.lp │ │ ├── n=73_m=632_id_89.29.sol │ │ ├── n=73_m=634_id_98.90.lp │ │ ├── n=73_m=634_id_98.90.sol │ │ ├── n=73_m=771_id_27.52.lp │ │ ├── n=73_m=771_id_27.52.sol │ │ ├── n=73_m=926_id_22.88.lp │ │ ├── n=73_m=926_id_22.88.sol │ │ ├── n=74_m=639_id_64.41.lp │ │ ├── n=74_m=639_id_64.41.sol │ │ ├── n=74_m=658_id_91.91.lp │ │ ├── n=74_m=658_id_91.91.sol │ │ ├── n=74_m=757_id_62.04.lp │ │ ├── n=74_m=757_id_62.04.sol │ │ ├── n=74_m=780_id_73.23.lp │ │ ├── n=74_m=780_id_73.23.sol │ │ ├── n=74_m=791_id_49.97.lp │ │ ├── n=74_m=791_id_49.97.sol │ │ ├── n=75_m=687_id_72.90.lp │ │ ├── n=75_m=687_id_72.90.sol │ │ ├── n=75_m=717_id_85.89.lp │ │ ├── n=75_m=717_id_85.89.sol │ │ ├── n=75_m=808_id_84.67.lp │ │ ├── n=75_m=808_id_84.67.sol │ │ ├── n=75_m=821_id_38.48.lp │ │ ├── n=75_m=821_id_38.48.sol │ │ ├── n=75_m=968_id_94.45.lp │ │ ├── n=75_m=968_id_94.45.sol │ │ ├── n=75_m=972_id_9.75.lp │ │ ├── n=75_m=972_id_9.75.sol │ │ ├── n=76_m=1098_id_29.47.lp │ │ ├── n=76_m=1098_id_29.47.sol │ │ ├── n=76_m=715_id_21.47.lp │ │ ├── n=76_m=715_id_21.47.sol │ │ ├── n=76_m=839_id_52.19.lp │ │ ├── n=76_m=839_id_52.19.sol │ │ ├── n=76_m=883_id_65.63.lp │ │ ├── n=76_m=883_id_65.63.sol │ │ ├── n=76_m=994_id_30.09.lp │ │ ├── n=76_m=994_id_30.09.sol │ │ ├── n=77_m=1033_id_55.39.lp │ │ ├── n=77_m=1033_id_55.39.sol │ │ ├── n=77_m=736_id_82.31.lp │ │ ├── n=77_m=736_id_82.31.sol │ │ ├── n=77_m=764_id_25.94.lp │ │ ├── n=77_m=764_id_25.94.sol │ │ ├── n=77_m=825_id_92.40.lp │ │ ├── n=77_m=825_id_92.40.sol │ │ ├── n=77_m=847_id_15.43.lp │ │ ├── n=77_m=847_id_15.43.sol │ │ ├── n=78_m=1039_id_24.85.lp │ │ ├── n=78_m=1039_id_24.85.sol │ │ ├── n=78_m=725_id_78.38.lp │ │ ├── n=78_m=725_id_78.38.sol │ │ ├── n=78_m=730_id_4.87.lp │ │ ├── n=78_m=730_id_4.87.sol │ │ ├── n=78_m=865_id_35.54.lp │ │ ├── n=78_m=865_id_35.54.sol │ │ ├── n=78_m=903_id_43.60.lp │ │ ├── n=78_m=903_id_43.60.sol │ │ ├── n=79_m=858_id_29.62.lp │ │ ├── n=79_m=858_id_29.62.sol │ │ ├── n=79_m=879_id_55.08.lp │ │ ├── n=79_m=879_id_55.08.sol │ │ ├── n=79_m=888_id_7.63.lp │ │ ├── n=79_m=888_id_7.63.sol │ │ ├── n=79_m=936_id_83.69.lp │ │ ├── n=79_m=936_id_83.69.sol │ │ ├── n=80_m=1027_id_10.67.lp │ │ ├── n=80_m=1027_id_10.67.sol │ │ ├── n=80_m=774_id_37.45.lp │ │ ├── n=80_m=774_id_37.45.sol │ │ ├── n=80_m=793_id_87.01.lp │ │ ├── n=80_m=793_id_87.01.sol │ │ ├── n=80_m=916_id_50.07.lp │ │ └── n=80_m=916_id_50.07.sol ├── fcmcnf.py ├── gisp.py ├── problem_gen.ipynb ├── problem_gen.py └── wpms.py ├── pyscipopt ├── .gitignore ├── CHANGELOG.md ├── CONTRIBUTING.md ├── INSTALL.md ├── LICENSE ├── README.md ├── appveyor.yml ├── docs │ ├── DoxygenLayout.xml │ ├── customdoxygen.css │ ├── doxy │ ├── footer.html │ ├── header.html │ └── maindoc.py ├── examples │ ├── finished │ │ ├── atsp.py │ │ ├── bpp.py │ │ ├── diet.py │ │ ├── eoq_en.py │ │ ├── even.py │ │ ├── flp-benders.py │ │ ├── flp.py │ │ ├── gcp.py │ │ ├── gcp_fixed_k.py │ │ ├── kmedian.py │ │ ├── lo_wines.py │ │ ├── logical.py │ │ ├── lotsizing_lazy.py │ │ ├── markowitz_soco.py │ │ ├── mctransp.py │ │ ├── mkp.py │ │ ├── pfs.py │ │ ├── piecewise.py │ │ ├── prodmix_soco.py │ │ ├── rcs.py │ │ ├── read_tsplib.py │ │ ├── ssa.py │ │ ├── ssp.py │ │ ├── sudoku.py │ │ ├── transp.py │ │ ├── transp_nofn.py │ │ ├── tsp.py │ │ └── weber_soco.py │ ├── tutorial │ │ ├── even.py │ │ ├── logical.py │ │ └── puzzle.py │ └── unfinished │ │ ├── cutstock.py │ │ ├── diet_std.py │ │ ├── eld.py │ │ ├── eoq_soco.py │ │ ├── flp_nonlinear.py │ │ ├── flp_nonlinear_soco.py │ │ ├── gpp.py │ │ ├── kcenter.py │ │ ├── kcenter_binary_search.py │ │ ├── lotsizing.py │ │ ├── lotsizing_cut.py │ │ ├── lotsizing_echelon.py │ │ ├── mctransp_tuplelist.py │ │ ├── pareto_front.py │ │ ├── portfolio_soco.py │ │ ├── read_tsplib.py │ │ ├── scheduling.py │ │ ├── staff_sched.py │ │ ├── staff_sched_mo.py │ │ ├── tsp_flow.py │ │ ├── tsp_lazy.py │ │ ├── tsp_mo.py │ │ ├── tsptw.py │ │ ├── vrp.py │ │ └── vrp_lazy.py ├── generate-docs.sh ├── setup.cfg ├── setup.py ├── src │ └── pyscipopt │ │ ├── Multidict.py │ │ ├── __init__.py │ │ ├── benders.pxi │ │ ├── benderscut.pxi │ │ ├── branchrule.pxi │ │ ├── conshdlr.pxi │ │ ├── event.pxi │ │ ├── expr.pxi │ │ ├── heuristic.pxi │ │ ├── lp.pxi │ │ ├── nodesel.pxi │ │ ├── presol.pxi │ │ ├── pricer.pxi │ │ ├── propagator.pxi │ │ ├── relax.pxi │ │ ├── scip.pxd │ │ ├── scip.pyx │ │ └── sepa.pxi ├── tests │ ├── test_alldiff.py │ ├── test_benders.py │ ├── test_branch_probing_lp.py │ ├── test_conshdlr.py │ ├── test_copy.py │ ├── test_customizedbenders.py │ ├── test_event.py │ ├── test_expr.py │ ├── test_gomory.py │ ├── test_heur.py │ ├── test_knapsack.py │ ├── test_linexpr.py │ ├── test_logical.py │ ├── test_lp.py │ ├── test_memory.py │ ├── test_model.py │ ├── test_nlrow.py │ ├── test_nodesel.py │ ├── test_nonlinear.py │ ├── test_pricer.py │ ├── test_quadcons.py │ ├── test_quickprod.py │ ├── test_quicksum.py │ ├── test_relax.py │ ├── test_reopt.py │ ├── test_short.py │ ├── test_solution.py │ ├── test_tree.py │ ├── test_tsp.py │ ├── test_vars.py │ └── util.py └── travis.enc ├── setup_env.sh └── utils.py /.gitignore: -------------------------------------------------------------------------------- 1 | # These are some examples of commonly ignored file patterns. 2 | # You should customize this list as applicable to your project. 3 | # Learn more about .gitignore: 4 | # https://www.atlassian.com/git/tutorials/saving-changes/gitignore 5 | 6 | # Node artifact files 7 | node_modules/ 8 | dist/ 9 | 10 | # Compiled Java class files 11 | *.class 12 | 13 | # Compiled Python bytecode 14 | *.py[cod] 15 | 16 | # Log files 17 | *.log 18 | 19 | # Package files 20 | *.jar 21 | 22 | # Maven 23 | target/ 24 | dist/ 25 | 26 | # JetBrains IDE 27 | .idea/ 28 | 29 | # Unit test reports 30 | TEST*.xml 31 | 32 | # Generated by MacOS 33 | .DS_Store 34 | 35 | # Generated by Windows 36 | Thumbs.db 37 | 38 | # Applications 39 | *.app 40 | *.exe 41 | *.war 42 | 43 | # Large media files 44 | *.mp4 45 | *.tiff 46 | *.avi 47 | *.flv 48 | *.mov 49 | *.wmv 50 | *.pickle 51 | *.DS_* 52 | *.lp 53 | *.sol 54 | *.pt 55 | *.pkl 56 | 57 | # Data 58 | *.csv 59 | *.pt 60 | *.pkl 61 | 62 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Learning to Compare Nodes in Branch and Bound with Graph Neural Networks 2 | 3 | Abdel Ghani Labassi, Didier Chételat and Andrea Lodi 4 | 5 | This is the official implementation of our [NeurIPS 2022 paper](https://arxiv.org/abs/2210.16934). 6 | 7 | ## Citation 8 | Please cite our paper if you use this code in your work. 9 | ``` 10 | @inproceedings{conf/nips/labassi22, 11 | title={Learning to Compare Nodes in Branch and Bound with Graph Neural Networks}, 12 | author={Abdel Ghani Labassi and Didier Chételat and Andrea Lodi}, 13 | booktitle={Advances in Neural Information Processing Systems 35}, 14 | year={2022} 15 | } 16 | ``` 17 | 18 | ## Questions / Bugs 19 | Please feel free to submit a Github issue if you have any questions or find any bugs. We do not guarantee any support, but will do our best if we can help. 20 | 21 | -------------------------------------------------------------------------------- /env.yml: -------------------------------------------------------------------------------- 1 | name: l2sn 2 | channels: 3 | - conda-forge 4 | - defaults 5 | - spyder-ide 6 | 7 | 8 | dependencies: 9 | - python=3.9 10 | - cudatoolkit=11.3 11 | - cython 12 | - pip 13 | 14 | 15 | # Core scientific python 16 | - numpy 17 | - scipy 18 | - matplotlib 19 | - networkx 20 | 21 | 22 | # OR 23 | - scip 24 | 25 | 26 | # IDE 27 | - spyder 28 | - spyder-terminal 29 | -------------------------------------------------------------------------------- /learning/data_type.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Fri Feb 4 10:08:53 2022 5 | 6 | @author: aglabassi 7 | """ 8 | 9 | import torch 10 | import torch_geometric 11 | 12 | class BipartiteGraphPairData(torch_geometric.data.Data): 13 | """ 14 | This class encode a pair of node bipartite graphs observation, s is graph0, t is graph1 15 | """ 16 | def __init__(self, constraint_features_s=None, edge_indices_s=None, edge_features_s=None, variable_features_s=None, bounds_s=None, depth_s=None, 17 | constraint_features_t=None, edge_indices_t=None, edge_features_t=None, variable_features_t=None, bounds_t=None, depth_t=None, 18 | y=None): 19 | 20 | super().__init__() 21 | 22 | self.variable_features_s, self.constraint_features_s, self.edge_index_s, self.edge_attr_s, self.bounds_s, self.depth_s = ( 23 | variable_features_s, constraint_features_s, edge_indices_s, edge_features_s, bounds_s, depth_s) 24 | 25 | self.variable_features_t, self.constraint_features_t, self.edge_index_t, self.edge_attr_t, self.bounds_t, self.depth_t = ( 26 | variable_features_t, constraint_features_t, edge_indices_t, edge_features_t, bounds_t, depth_t) 27 | 28 | self.y = y 29 | 30 | 31 | 32 | def __inc__(self, key, value, *args, **kwargs): 33 | """ 34 | We overload the pytorch geometric method that tells how to increment indices when concatenating graphs 35 | for those entries (edge index, candidates) for which this is not obvious. 36 | """ 37 | if key == 'edge_index_s': 38 | return torch.tensor([[self.variable_features_s.size(0)], [self.constraint_features_s.size(0)]]) 39 | elif key == 'edge_index_t': 40 | return torch.tensor([[self.variable_features_t.size(0)], [self.constraint_features_t.size(0)]]) 41 | else: 42 | return super().__inc__(key, value, *args, **kwargs) 43 | 44 | 45 | class GraphDataset(torch_geometric.data.Dataset): 46 | """ 47 | This class encodes a collection of graphs, as well as a method to load such graphs from the disk. 48 | It can be used in turn by the data loaders provided by pytorch geometric. 49 | """ 50 | def __init__(self, sample_files): 51 | super().__init__(root=None, transform=None, pre_transform=None) 52 | self.sample_files = sample_files 53 | 54 | def len(self): 55 | return len(self.sample_files) 56 | 57 | def get(self, idx): 58 | data = torch.load(self.sample_files[idx]) 59 | return data 60 | -------------------------------------------------------------------------------- /learning/policy_FCMCNF.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ds4dm/learn2comparenodes/da802e8d1e6687ca7b5593e3e0cad42eb4499942/learning/policy_FCMCNF.pkl -------------------------------------------------------------------------------- /learning/policy_FCMCNF_svm.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ds4dm/learn2comparenodes/da802e8d1e6687ca7b5593e3e0cad42eb4499942/learning/policy_FCMCNF_svm.pkl -------------------------------------------------------------------------------- /learning/policy_GISP.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ds4dm/learn2comparenodes/da802e8d1e6687ca7b5593e3e0cad42eb4499942/learning/policy_GISP.pkl -------------------------------------------------------------------------------- /learning/policy_GISP_ranknet.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ds4dm/learn2comparenodes/da802e8d1e6687ca7b5593e3e0cad42eb4499942/learning/policy_GISP_ranknet.pkl -------------------------------------------------------------------------------- /learning/policy_GISP_svm.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ds4dm/learn2comparenodes/da802e8d1e6687ca7b5593e3e0cad42eb4499942/learning/policy_GISP_svm.pkl -------------------------------------------------------------------------------- /learning/policy_WPMS.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ds4dm/learn2comparenodes/da802e8d1e6687ca7b5593e3e0cad42eb4499942/learning/policy_WPMS.pkl -------------------------------------------------------------------------------- /learning/policy_WPMS_ranknet.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ds4dm/learn2comparenodes/da802e8d1e6687ca7b5593e3e0cad42eb4499942/learning/policy_WPMS_ranknet.pkl -------------------------------------------------------------------------------- /learning/policy_WPMS_svm.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ds4dm/learn2comparenodes/da802e8d1e6687ca7b5593e3e0cad42eb4499942/learning/policy_WPMS_svm.pkl -------------------------------------------------------------------------------- /learning/train_svm.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | #!/usr/bin/env python3 3 | # -*- coding: utf-8 -*- 4 | """ 5 | Created on Fri Feb 18 12:23:29 2022 6 | 7 | @author: aglabassi 8 | """ 9 | 10 | import os 11 | import sys 12 | import numpy as np 13 | from pathlib import Path 14 | import sklearn as sk 15 | from sklearn import svm, datasets 16 | from joblib import dump, load 17 | 18 | 19 | 20 | def get_data(files): 21 | 22 | X = [] 23 | y = [] 24 | depths = [] 25 | 26 | for file in files: 27 | 28 | f_array = np.loadtxt(file) 29 | features = f_array[:-1] 30 | comp_res = f_array[-1] 31 | X.append(features) 32 | y.append(comp_res) 33 | depths.append(np.array([f_array[18], f_array[-3]])) 34 | 35 | return np.array(X),np.array(y), np.array(depths) 36 | 37 | 38 | 39 | 40 | 41 | 42 | if __name__ == '__main__': 43 | 44 | problem = 'FCMCNF' 45 | n_sample = -1 46 | n_epoch = 10 47 | 48 | for i in range(1, len(sys.argv), 2): 49 | if sys.argv[i] == '-problem': 50 | problem = str(sys.argv[i + 1]) 51 | if sys.argv[i] == '-n_epoch': 52 | n_epoch = int(sys.argv[i + 1]) 53 | if sys.argv[i] == '-n_sample': 54 | n_sample = int(sys.argv[i + 1]) 55 | 56 | 57 | 58 | 59 | train_files = [ str(path) for path in Path(os.path.join(os.path.dirname(__file__), 60 | f"../node_selection/data_svm/{problem}/train")).glob("*.csv") ][:n_sample] 61 | 62 | valid_files = [ str(path) for path in Path(os.path.join(os.path.dirname(__file__), 63 | f"../node_selection/data_svm/{problem}/valid")).glob("*.csv") ][:int(0.2*n_sample if n_sample != -1 else -1)] 64 | print(train_files) 65 | X,y,depths = get_data(train_files) 66 | X_valid, y_valid, depths_valid = get_data(valid_files) 67 | 68 | print(f"X shape {X.shape}") 69 | 70 | model = svm.LinearSVC() 71 | 72 | model.fit(X,y, np.exp(2.67/np.min(depths, axis=1))) 73 | 74 | 75 | try: 76 | 77 | valid_acc = model.score(X_valid,y_valid, np.min(depths_valid, axis=1)) 78 | except : 79 | valid_acc = model.score(X,y, np.min(depths, axis=1)) 80 | 81 | 82 | print(f"Accuracy on validation set : {valid_acc}") 83 | 84 | dump(model, f'policy_{problem}_svm.pkl') 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=60_m=1039_p=0.60_SET2_setparam=100.00_alpha=0.50_552.sol: -------------------------------------------------------------------------------- 1 | objective value: 1277 2 | x9 1 (obj:100) 3 | x12 1 (obj:100) 4 | x15 1 (obj:100) 5 | x17 1 (obj:100) 6 | x18 1 (obj:100) 7 | x30 1 (obj:100) 8 | x31 1 (obj:100) 9 | x32 1 (obj:100) 10 | x35 1 (obj:100) 11 | x51 1 (obj:100) 12 | x56 1 (obj:100) 13 | x57 1 (obj:100) 14 | x58 1 (obj:100) 15 | y18_30 1 (obj:-1) 16 | y31_56 1 (obj:-1) 17 | y31_51 1 (obj:-1) 18 | y15_57 1 (obj:-1) 19 | y56_57 1 (obj:-1) 20 | y30_58 1 (obj:-1) 21 | y15_32 1 (obj:-1) 22 | y17_51 1 (obj:-1) 23 | y15_18 1 (obj:-1) 24 | y35_57 1 (obj:-1) 25 | y12_51 1 (obj:-1) 26 | y32_56 1 (obj:-1) 27 | y9_18 1 (obj:-1) 28 | y32_51 1 (obj:-1) 29 | y17_35 1 (obj:-1) 30 | y12_32 1 (obj:-1) 31 | y9_35 1 (obj:-1) 32 | y18_32 1 (obj:-1) 33 | y30_51 1 (obj:-1) 34 | y12_30 1 (obj:-1) 35 | y15_35 1 (obj:-1) 36 | y18_31 1 (obj:-1) 37 | y30_32 1 (obj:-1) 38 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=60_m=1060_p=0.60_SET2_setparam=100.00_alpha=0.50_557.sol: -------------------------------------------------------------------------------- 1 | objective value: 1088 2 | x0 1 (obj:100) 3 | x11 1 (obj:100) 4 | x15 1 (obj:100) 5 | x17 1 (obj:100) 6 | x25 1 (obj:100) 7 | x28 1 (obj:100) 8 | x31 1 (obj:100) 9 | x42 1 (obj:100) 10 | x44 1 (obj:100) 11 | x50 1 (obj:100) 12 | x59 1 (obj:100) 13 | y25_42 1 (obj:-1) 14 | y11_50 1 (obj:-1) 15 | y0_59 1 (obj:-1) 16 | y11_31 1 (obj:-1) 17 | y17_59 1 (obj:-1) 18 | y28_44 1 (obj:-1) 19 | y11_44 1 (obj:-1) 20 | y42_59 1 (obj:-1) 21 | y31_44 1 (obj:-1) 22 | y11_25 1 (obj:-1) 23 | y15_31 1 (obj:-1) 24 | y11_15 1 (obj:-1) 25 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=60_m=1060_p=0.60_SET2_setparam=100.00_alpha=0.50_606.sol: -------------------------------------------------------------------------------- 1 | objective value: 1082 2 | x1 1 (obj:100) 3 | x10 1 (obj:100) 4 | x21 1 (obj:100) 5 | x22 1 (obj:100) 6 | x27 1 (obj:100) 7 | x33 1 (obj:100) 8 | x38 1 (obj:100) 9 | x42 1 (obj:100) 10 | x49 1 (obj:100) 11 | x57 1 (obj:100) 12 | x58 1 (obj:100) 13 | y10_27 1 (obj:-1) 14 | y33_38 1 (obj:-1) 15 | y10_22 1 (obj:-1) 16 | y21_27 1 (obj:-1) 17 | y1_57 1 (obj:-1) 18 | y1_42 1 (obj:-1) 19 | y1_10 1 (obj:-1) 20 | y22_58 1 (obj:-1) 21 | y33_49 1 (obj:-1) 22 | y21_38 1 (obj:-1) 23 | y21_33 1 (obj:-1) 24 | y38_58 1 (obj:-1) 25 | y49_58 1 (obj:-1) 26 | y1_58 1 (obj:-1) 27 | y38_57 1 (obj:-1) 28 | y1_21 1 (obj:-1) 29 | y27_42 1 (obj:-1) 30 | y42_49 1 (obj:-1) 31 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=60_m=1094_p=0.60_SET2_setparam=100.00_alpha=0.50_512.sol: -------------------------------------------------------------------------------- 1 | objective value: 1174 2 | x9 1 (obj:100) 3 | x10 1 (obj:100) 4 | x14 1 (obj:100) 5 | x17 1 (obj:100) 6 | x21 1 (obj:100) 7 | x25 1 (obj:100) 8 | x26 1 (obj:100) 9 | x29 1 (obj:100) 10 | x30 1 (obj:100) 11 | x39 1 (obj:100) 12 | x42 1 (obj:100) 13 | x49 1 (obj:100) 14 | y26_39 1 (obj:-1) 15 | y17_39 1 (obj:-1) 16 | y29_49 1 (obj:-1) 17 | y25_42 1 (obj:-1) 18 | y17_25 1 (obj:-1) 19 | y9_39 1 (obj:-1) 20 | y21_49 1 (obj:-1) 21 | y10_30 1 (obj:-1) 22 | y9_29 1 (obj:-1) 23 | y9_10 1 (obj:-1) 24 | y30_49 1 (obj:-1) 25 | y29_39 1 (obj:-1) 26 | y14_49 1 (obj:-1) 27 | y21_39 1 (obj:-1) 28 | y10_29 1 (obj:-1) 29 | y14_17 1 (obj:-1) 30 | y14_26 1 (obj:-1) 31 | y21_25 1 (obj:-1) 32 | y21_29 1 (obj:-1) 33 | y29_42 1 (obj:-1) 34 | y14_25 1 (obj:-1) 35 | y17_26 1 (obj:-1) 36 | y9_17 1 (obj:-1) 37 | y42_49 1 (obj:-1) 38 | y25_49 1 (obj:-1) 39 | y26_49 1 (obj:-1) 40 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=60_m=1114_p=0.60_SET2_setparam=100.00_alpha=0.50_581.sol: -------------------------------------------------------------------------------- 1 | objective value: 1175 2 | x1 1 (obj:100) 3 | x3 1 (obj:100) 4 | x6 1 (obj:100) 5 | x12 1 (obj:100) 6 | x14 1 (obj:100) 7 | x15 1 (obj:100) 8 | x19 1 (obj:100) 9 | x27 1 (obj:100) 10 | x30 1 (obj:100) 11 | x34 1 (obj:100) 12 | x40 1 (obj:100) 13 | x47 1 (obj:100) 14 | y3_6 1 (obj:-1) 15 | y3_19 1 (obj:-1) 16 | y6_15 1 (obj:-1) 17 | y6_19 1 (obj:-1) 18 | y1_34 1 (obj:-1) 19 | y12_34 1 (obj:-1) 20 | y12_47 1 (obj:-1) 21 | y19_27 1 (obj:-1) 22 | y1_14 1 (obj:-1) 23 | y15_34 1 (obj:-1) 24 | y30_40 1 (obj:-1) 25 | y12_19 1 (obj:-1) 26 | y34_47 1 (obj:-1) 27 | y3_27 1 (obj:-1) 28 | y3_12 1 (obj:-1) 29 | y6_40 1 (obj:-1) 30 | y6_12 1 (obj:-1) 31 | y12_27 1 (obj:-1) 32 | y19_34 1 (obj:-1) 33 | y30_34 1 (obj:-1) 34 | y27_47 1 (obj:-1) 35 | y12_40 1 (obj:-1) 36 | y34_40 1 (obj:-1) 37 | y14_34 1 (obj:-1) 38 | y14_47 1 (obj:-1) 39 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=61_m=1087_p=0.60_SET2_setparam=100.00_alpha=0.50_521.sol: -------------------------------------------------------------------------------- 1 | objective value: 1180 2 | x0 1 (obj:100) 3 | x2 1 (obj:100) 4 | x3 1 (obj:100) 5 | x6 1 (obj:100) 6 | x7 1 (obj:100) 7 | x10 1 (obj:100) 8 | x20 1 (obj:100) 9 | x28 1 (obj:100) 10 | x35 1 (obj:100) 11 | x37 1 (obj:100) 12 | x55 1 (obj:100) 13 | x58 1 (obj:100) 14 | y7_35 1 (obj:-1) 15 | y3_28 1 (obj:-1) 16 | y10_35 1 (obj:-1) 17 | y35_55 1 (obj:-1) 18 | y2_35 1 (obj:-1) 19 | y37_58 1 (obj:-1) 20 | y20_28 1 (obj:-1) 21 | y0_35 1 (obj:-1) 22 | y0_3 1 (obj:-1) 23 | y6_55 1 (obj:-1) 24 | y7_28 1 (obj:-1) 25 | y10_20 1 (obj:-1) 26 | y6_58 1 (obj:-1) 27 | y2_6 1 (obj:-1) 28 | y6_35 1 (obj:-1) 29 | y2_37 1 (obj:-1) 30 | y28_35 1 (obj:-1) 31 | y20_35 1 (obj:-1) 32 | y3_58 1 (obj:-1) 33 | y2_55 1 (obj:-1) 34 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=61_m=1094_p=0.60_SET2_setparam=100.00_alpha=0.50_607.sol: -------------------------------------------------------------------------------- 1 | objective value: 1178 2 | x5 1 (obj:100) 3 | x6 1 (obj:100) 4 | x7 1 (obj:100) 5 | x11 1 (obj:100) 6 | x25 1 (obj:100) 7 | x26 1 (obj:100) 8 | x27 1 (obj:100) 9 | x35 1 (obj:100) 10 | x36 1 (obj:100) 11 | x40 1 (obj:100) 12 | x47 1 (obj:100) 13 | x59 1 (obj:100) 14 | y7_35 1 (obj:-1) 15 | y40_59 1 (obj:-1) 16 | y36_47 1 (obj:-1) 17 | y35_59 1 (obj:-1) 18 | y5_36 1 (obj:-1) 19 | y35_36 1 (obj:-1) 20 | y5_26 1 (obj:-1) 21 | y5_25 1 (obj:-1) 22 | y5_11 1 (obj:-1) 23 | y5_6 1 (obj:-1) 24 | y11_40 1 (obj:-1) 25 | y25_59 1 (obj:-1) 26 | y25_40 1 (obj:-1) 27 | y6_40 1 (obj:-1) 28 | y25_26 1 (obj:-1) 29 | y6_26 1 (obj:-1) 30 | y35_47 1 (obj:-1) 31 | y27_47 1 (obj:-1) 32 | y26_36 1 (obj:-1) 33 | y7_59 1 (obj:-1) 34 | y7_27 1 (obj:-1) 35 | y26_40 1 (obj:-1) 36 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=61_m=1097_p=0.60_SET2_setparam=100.00_alpha=0.50_598.sol: -------------------------------------------------------------------------------- 1 | objective value: 1085 2 | x4 1 (obj:100) 3 | x6 1 (obj:100) 4 | x13 1 (obj:100) 5 | x18 1 (obj:100) 6 | x25 1 (obj:100) 7 | x39 1 (obj:100) 8 | x43 1 (obj:100) 9 | x44 1 (obj:100) 10 | x47 1 (obj:100) 11 | x49 1 (obj:100) 12 | x57 1 (obj:100) 13 | y18_44 1 (obj:-1) 14 | y25_47 1 (obj:-1) 15 | y39_57 1 (obj:-1) 16 | y39_43 1 (obj:-1) 17 | y13_49 1 (obj:-1) 18 | y6_18 1 (obj:-1) 19 | y4_25 1 (obj:-1) 20 | y43_57 1 (obj:-1) 21 | y13_57 1 (obj:-1) 22 | y13_43 1 (obj:-1) 23 | y6_39 1 (obj:-1) 24 | y13_47 1 (obj:-1) 25 | y49_57 1 (obj:-1) 26 | y18_49 1 (obj:-1) 27 | y25_39 1 (obj:-1) 28 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=61_m=1104_p=0.60_SET2_setparam=100.00_alpha=0.50_511.sol: -------------------------------------------------------------------------------- 1 | objective value: 1175 2 | x5 1 (obj:100) 3 | x11 1 (obj:100) 4 | x13 1 (obj:100) 5 | x16 1 (obj:100) 6 | x21 1 (obj:100) 7 | x27 1 (obj:100) 8 | x34 1 (obj:100) 9 | x40 1 (obj:100) 10 | x41 1 (obj:100) 11 | x48 1 (obj:100) 12 | x52 1 (obj:100) 13 | x57 1 (obj:100) 14 | y40_41 1 (obj:-1) 15 | y21_27 1 (obj:-1) 16 | y5_41 1 (obj:-1) 17 | y13_41 1 (obj:-1) 18 | y13_27 1 (obj:-1) 19 | y16_40 1 (obj:-1) 20 | y5_16 1 (obj:-1) 21 | y27_40 1 (obj:-1) 22 | y16_21 1 (obj:-1) 23 | y34_57 1 (obj:-1) 24 | y11_27 1 (obj:-1) 25 | y11_13 1 (obj:-1) 26 | y48_52 1 (obj:-1) 27 | y40_57 1 (obj:-1) 28 | y21_48 1 (obj:-1) 29 | y21_57 1 (obj:-1) 30 | y21_34 1 (obj:-1) 31 | y21_52 1 (obj:-1) 32 | y13_52 1 (obj:-1) 33 | y16_48 1 (obj:-1) 34 | y27_57 1 (obj:-1) 35 | y27_34 1 (obj:-1) 36 | y11_57 1 (obj:-1) 37 | y11_34 1 (obj:-1) 38 | y52_57 1 (obj:-1) 39 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=61_m=1105_p=0.60_SET2_setparam=100.00_alpha=0.50_597.sol: -------------------------------------------------------------------------------- 1 | objective value: 1171 2 | x0 1 (obj:100) 3 | x4 1 (obj:100) 4 | x5 1 (obj:100) 5 | x9 1 (obj:100) 6 | x11 1 (obj:100) 7 | x14 1 (obj:100) 8 | x26 1 (obj:100) 9 | x30 1 (obj:100) 10 | x41 1 (obj:100) 11 | x52 1 (obj:100) 12 | x54 1 (obj:100) 13 | x60 1 (obj:100) 14 | y26_30 1 (obj:-1) 15 | y0_5 1 (obj:-1) 16 | y11_14 1 (obj:-1) 17 | y9_52 1 (obj:-1) 18 | y9_11 1 (obj:-1) 19 | y5_26 1 (obj:-1) 20 | y0_60 1 (obj:-1) 21 | y11_60 1 (obj:-1) 22 | y4_30 1 (obj:-1) 23 | y5_30 1 (obj:-1) 24 | y0_41 1 (obj:-1) 25 | y30_54 1 (obj:-1) 26 | y41_60 1 (obj:-1) 27 | y41_54 1 (obj:-1) 28 | y52_54 1 (obj:-1) 29 | y4_14 1 (obj:-1) 30 | y9_54 1 (obj:-1) 31 | y4_60 1 (obj:-1) 32 | y9_26 1 (obj:-1) 33 | y26_60 1 (obj:-1) 34 | y5_14 1 (obj:-1) 35 | y0_30 1 (obj:-1) 36 | y30_52 1 (obj:-1) 37 | y5_9 1 (obj:-1) 38 | y0_52 1 (obj:-1) 39 | y11_52 1 (obj:-1) 40 | y26_54 1 (obj:-1) 41 | y4_26 1 (obj:-1) 42 | y14_52 1 (obj:-1) 43 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=61_m=1112_p=0.60_SET2_setparam=100.00_alpha=0.50_568.sol: -------------------------------------------------------------------------------- 1 | objective value: 1173 2 | x7 1 (obj:100) 3 | x10 1 (obj:100) 4 | x14 1 (obj:100) 5 | x20 1 (obj:100) 6 | x22 1 (obj:100) 7 | x27 1 (obj:100) 8 | x29 1 (obj:100) 9 | x42 1 (obj:100) 10 | x52 1 (obj:100) 11 | x54 1 (obj:100) 12 | x56 1 (obj:100) 13 | x57 1 (obj:100) 14 | y10_54 1 (obj:-1) 15 | y14_42 1 (obj:-1) 16 | y10_22 1 (obj:-1) 17 | y20_56 1 (obj:-1) 18 | y42_56 1 (obj:-1) 19 | y7_20 1 (obj:-1) 20 | y7_29 1 (obj:-1) 21 | y7_56 1 (obj:-1) 22 | y10_57 1 (obj:-1) 23 | y14_27 1 (obj:-1) 24 | y14_54 1 (obj:-1) 25 | y10_52 1 (obj:-1) 26 | y29_52 1 (obj:-1) 27 | y10_20 1 (obj:-1) 28 | y7_14 1 (obj:-1) 29 | y29_42 1 (obj:-1) 30 | y27_57 1 (obj:-1) 31 | y20_54 1 (obj:-1) 32 | y54_56 1 (obj:-1) 33 | y27_29 1 (obj:-1) 34 | y27_56 1 (obj:-1) 35 | y14_57 1 (obj:-1) 36 | y7_27 1 (obj:-1) 37 | y14_52 1 (obj:-1) 38 | y7_22 1 (obj:-1) 39 | y14_29 1 (obj:-1) 40 | y14_56 1 (obj:-1) 41 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=61_m=1127_p=0.60_SET2_setparam=100.00_alpha=0.50_592.sol: -------------------------------------------------------------------------------- 1 | objective value: 1175 2 | x5 1 (obj:100) 3 | x13 1 (obj:100) 4 | x14 1 (obj:100) 5 | x25 1 (obj:100) 6 | x26 1 (obj:100) 7 | x28 1 (obj:100) 8 | x31 1 (obj:100) 9 | x35 1 (obj:100) 10 | x38 1 (obj:100) 11 | x40 1 (obj:100) 12 | x43 1 (obj:100) 13 | x49 1 (obj:100) 14 | y25_43 1 (obj:-1) 15 | y25_38 1 (obj:-1) 16 | y14_28 1 (obj:-1) 17 | y28_43 1 (obj:-1) 18 | y25_28 1 (obj:-1) 19 | y5_31 1 (obj:-1) 20 | y5_40 1 (obj:-1) 21 | y13_31 1 (obj:-1) 22 | y35_40 1 (obj:-1) 23 | y26_43 1 (obj:-1) 24 | y26_38 1 (obj:-1) 25 | y38_40 1 (obj:-1) 26 | y14_49 1 (obj:-1) 27 | y40_43 1 (obj:-1) 28 | y14_26 1 (obj:-1) 29 | y14_35 1 (obj:-1) 30 | y25_31 1 (obj:-1) 31 | y25_26 1 (obj:-1) 32 | y14_25 1 (obj:-1) 33 | y13_25 1 (obj:-1) 34 | y13_43 1 (obj:-1) 35 | y28_49 1 (obj:-1) 36 | y13_28 1 (obj:-1) 37 | y38_43 1 (obj:-1) 38 | y5_13 1 (obj:-1) 39 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=62_m=1100_p=0.60_SET2_setparam=100.00_alpha=0.50_567.sol: -------------------------------------------------------------------------------- 1 | objective value: 1181 2 | x2 1 (obj:100) 3 | x7 1 (obj:100) 4 | x11 1 (obj:100) 5 | x12 1 (obj:100) 6 | x14 1 (obj:100) 7 | x27 1 (obj:100) 8 | x31 1 (obj:100) 9 | x36 1 (obj:100) 10 | x38 1 (obj:100) 11 | x39 1 (obj:100) 12 | x44 1 (obj:100) 13 | x45 1 (obj:100) 14 | y11_14 1 (obj:-1) 15 | y12_39 1 (obj:-1) 16 | y2_11 1 (obj:-1) 17 | y7_44 1 (obj:-1) 18 | y7_39 1 (obj:-1) 19 | y11_36 1 (obj:-1) 20 | y11_45 1 (obj:-1) 21 | y2_44 1 (obj:-1) 22 | y44_45 1 (obj:-1) 23 | y2_39 1 (obj:-1) 24 | y14_44 1 (obj:-1) 25 | y2_38 1 (obj:-1) 26 | y2_14 1 (obj:-1) 27 | y36_39 1 (obj:-1) 28 | y11_44 1 (obj:-1) 29 | y39_44 1 (obj:-1) 30 | y31_44 1 (obj:-1) 31 | y11_38 1 (obj:-1) 32 | y14_39 1 (obj:-1) 33 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=62_m=1122_p=0.60_SET2_setparam=100.00_alpha=0.50_526.sol: -------------------------------------------------------------------------------- 1 | objective value: 1085 2 | x11 1 (obj:100) 3 | x18 1 (obj:100) 4 | x26 1 (obj:100) 5 | x37 1 (obj:100) 6 | x39 1 (obj:100) 7 | x41 1 (obj:100) 8 | x43 1 (obj:100) 9 | x47 1 (obj:100) 10 | x57 1 (obj:100) 11 | x60 1 (obj:100) 12 | x61 1 (obj:100) 13 | y11_60 1 (obj:-1) 14 | y11_41 1 (obj:-1) 15 | y26_43 1 (obj:-1) 16 | y26_61 1 (obj:-1) 17 | y37_39 1 (obj:-1) 18 | y26_47 1 (obj:-1) 19 | y18_61 1 (obj:-1) 20 | y47_60 1 (obj:-1) 21 | y43_57 1 (obj:-1) 22 | y43_61 1 (obj:-1) 23 | y18_60 1 (obj:-1) 24 | y11_39 1 (obj:-1) 25 | y11_43 1 (obj:-1) 26 | y37_41 1 (obj:-1) 27 | y41_43 1 (obj:-1) 28 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=62_m=1129_p=0.60_SET2_setparam=100.00_alpha=0.50_515.sol: -------------------------------------------------------------------------------- 1 | objective value: 1180 2 | x0 1 (obj:100) 3 | x4 1 (obj:100) 4 | x15 1 (obj:100) 5 | x24 1 (obj:100) 6 | x37 1 (obj:100) 7 | x39 1 (obj:100) 8 | x41 1 (obj:100) 9 | x49 1 (obj:100) 10 | x55 1 (obj:100) 11 | x57 1 (obj:100) 12 | x59 1 (obj:100) 13 | x61 1 (obj:100) 14 | y55_57 1 (obj:-1) 15 | y24_55 1 (obj:-1) 16 | y39_61 1 (obj:-1) 17 | y4_39 1 (obj:-1) 18 | y49_55 1 (obj:-1) 19 | y0_55 1 (obj:-1) 20 | y4_61 1 (obj:-1) 21 | y49_59 1 (obj:-1) 22 | y41_55 1 (obj:-1) 23 | y0_4 1 (obj:-1) 24 | y37_61 1 (obj:-1) 25 | y15_37 1 (obj:-1) 26 | y55_59 1 (obj:-1) 27 | y39_55 1 (obj:-1) 28 | y24_39 1 (obj:-1) 29 | y4_41 1 (obj:-1) 30 | y4_59 1 (obj:-1) 31 | y15_55 1 (obj:-1) 32 | y49_61 1 (obj:-1) 33 | y15_49 1 (obj:-1) 34 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=62_m=1151_p=0.60_SET2_setparam=100.00_alpha=0.50_535.sol: -------------------------------------------------------------------------------- 1 | objective value: 1085 2 | x6 1 (obj:100) 3 | x8 1 (obj:100) 4 | x10 1 (obj:100) 5 | x28 1 (obj:100) 6 | x32 1 (obj:100) 7 | x37 1 (obj:100) 8 | x41 1 (obj:100) 9 | x44 1 (obj:100) 10 | x47 1 (obj:100) 11 | x52 1 (obj:100) 12 | x56 1 (obj:100) 13 | y47_52 1 (obj:-1) 14 | y6_10 1 (obj:-1) 15 | y28_37 1 (obj:-1) 16 | y8_41 1 (obj:-1) 17 | y8_44 1 (obj:-1) 18 | y10_52 1 (obj:-1) 19 | y6_41 1 (obj:-1) 20 | y28_32 1 (obj:-1) 21 | y10_28 1 (obj:-1) 22 | y6_44 1 (obj:-1) 23 | y8_52 1 (obj:-1) 24 | y8_56 1 (obj:-1) 25 | y8_37 1 (obj:-1) 26 | y41_52 1 (obj:-1) 27 | y41_56 1 (obj:-1) 28 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=63_m=1183_p=0.60_SET2_setparam=100.00_alpha=0.50_532.sol: -------------------------------------------------------------------------------- 1 | objective value: 1179 2 | x4 1 (obj:100) 3 | x6 1 (obj:100) 4 | x7 1 (obj:100) 5 | x8 1 (obj:100) 6 | x21 1 (obj:100) 7 | x30 1 (obj:100) 8 | x31 1 (obj:100) 9 | x33 1 (obj:100) 10 | x38 1 (obj:100) 11 | x50 1 (obj:100) 12 | x52 1 (obj:100) 13 | x55 1 (obj:100) 14 | y21_55 1 (obj:-1) 15 | y6_38 1 (obj:-1) 16 | y6_33 1 (obj:-1) 17 | y50_52 1 (obj:-1) 18 | y8_55 1 (obj:-1) 19 | y30_55 1 (obj:-1) 20 | y31_38 1 (obj:-1) 21 | y30_50 1 (obj:-1) 22 | y4_52 1 (obj:-1) 23 | y38_50 1 (obj:-1) 24 | y33_55 1 (obj:-1) 25 | y7_38 1 (obj:-1) 26 | y7_33 1 (obj:-1) 27 | y21_38 1 (obj:-1) 28 | y21_33 1 (obj:-1) 29 | y50_55 1 (obj:-1) 30 | y8_52 1 (obj:-1) 31 | y30_52 1 (obj:-1) 32 | y38_52 1 (obj:-1) 33 | y30_38 1 (obj:-1) 34 | y8_33 1 (obj:-1) 35 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=63_m=1222_p=0.60_SET2_setparam=100.00_alpha=0.50_536.sol: -------------------------------------------------------------------------------- 1 | objective value: 1176 2 | x2 1 (obj:100) 3 | x9 1 (obj:100) 4 | x11 1 (obj:100) 5 | x14 1 (obj:100) 6 | x18 1 (obj:100) 7 | x26 1 (obj:100) 8 | x36 1 (obj:100) 9 | x45 1 (obj:100) 10 | x53 1 (obj:100) 11 | x54 1 (obj:100) 12 | x56 1 (obj:100) 13 | x58 1 (obj:100) 14 | y18_26 1 (obj:-1) 15 | y11_14 1 (obj:-1) 16 | y2_11 1 (obj:-1) 17 | y26_53 1 (obj:-1) 18 | y18_58 1 (obj:-1) 19 | y45_53 1 (obj:-1) 20 | y11_36 1 (obj:-1) 21 | y45_56 1 (obj:-1) 22 | y14_36 1 (obj:-1) 23 | y14_45 1 (obj:-1) 24 | y2_56 1 (obj:-1) 25 | y36_45 1 (obj:-1) 26 | y36_58 1 (obj:-1) 27 | y9_18 1 (obj:-1) 28 | y9_36 1 (obj:-1) 29 | y9_54 1 (obj:-1) 30 | y2_9 1 (obj:-1) 31 | y2_18 1 (obj:-1) 32 | y54_56 1 (obj:-1) 33 | y53_54 1 (obj:-1) 34 | y26_54 1 (obj:-1) 35 | y45_54 1 (obj:-1) 36 | y18_36 1 (obj:-1) 37 | y45_58 1 (obj:-1) 38 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=64_m=1192_p=0.60_SET2_setparam=100.00_alpha=0.50_575.sol: -------------------------------------------------------------------------------- 1 | objective value: 1085 2 | x13 1 (obj:100) 3 | x24 1 (obj:100) 4 | x27 1 (obj:100) 5 | x31 1 (obj:100) 6 | x34 1 (obj:100) 7 | x40 1 (obj:100) 8 | x42 1 (obj:100) 9 | x44 1 (obj:100) 10 | x52 1 (obj:100) 11 | x53 1 (obj:100) 12 | x59 1 (obj:100) 13 | y24_27 1 (obj:-1) 14 | y31_34 1 (obj:-1) 15 | y31_52 1 (obj:-1) 16 | y13_31 1 (obj:-1) 17 | y24_31 1 (obj:-1) 18 | y13_44 1 (obj:-1) 19 | y27_44 1 (obj:-1) 20 | y27_53 1 (obj:-1) 21 | y40_53 1 (obj:-1) 22 | y44_59 1 (obj:-1) 23 | y24_34 1 (obj:-1) 24 | y24_52 1 (obj:-1) 25 | y13_42 1 (obj:-1) 26 | y52_53 1 (obj:-1) 27 | y34_44 1 (obj:-1) 28 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=64_m=1195_p=0.60_SET2_setparam=100.00_alpha=0.50_578.sol: -------------------------------------------------------------------------------- 1 | objective value: 1179 2 | x2 1 (obj:100) 3 | x9 1 (obj:100) 4 | x11 1 (obj:100) 5 | x14 1 (obj:100) 6 | x16 1 (obj:100) 7 | x17 1 (obj:100) 8 | x19 1 (obj:100) 9 | x41 1 (obj:100) 10 | x45 1 (obj:100) 11 | x51 1 (obj:100) 12 | x54 1 (obj:100) 13 | x63 1 (obj:100) 14 | y41_51 1 (obj:-1) 15 | y2_41 1 (obj:-1) 16 | y2_54 1 (obj:-1) 17 | y51_63 1 (obj:-1) 18 | y2_17 1 (obj:-1) 19 | y17_19 1 (obj:-1) 20 | y11_51 1 (obj:-1) 21 | y2_11 1 (obj:-1) 22 | y9_19 1 (obj:-1) 23 | y16_17 1 (obj:-1) 24 | y9_14 1 (obj:-1) 25 | y19_45 1 (obj:-1) 26 | y19_54 1 (obj:-1) 27 | y11_45 1 (obj:-1) 28 | y11_17 1 (obj:-1) 29 | y41_54 1 (obj:-1) 30 | y41_63 1 (obj:-1) 31 | y11_16 1 (obj:-1) 32 | y17_54 1 (obj:-1) 33 | y2_19 1 (obj:-1) 34 | y11_19 1 (obj:-1) 35 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=64_m=1237_p=0.60_SET2_setparam=100.00_alpha=0.50_586.sol: -------------------------------------------------------------------------------- 1 | objective value: 1173 2 | x16 1 (obj:100) 3 | x20 1 (obj:100) 4 | x22 1 (obj:100) 5 | x28 1 (obj:100) 6 | x30 1 (obj:100) 7 | x31 1 (obj:100) 8 | x39 1 (obj:100) 9 | x44 1 (obj:100) 10 | x45 1 (obj:100) 11 | x53 1 (obj:100) 12 | x54 1 (obj:100) 13 | x57 1 (obj:100) 14 | y22_28 1 (obj:-1) 15 | y39_57 1 (obj:-1) 16 | y31_57 1 (obj:-1) 17 | y16_45 1 (obj:-1) 18 | y16_54 1 (obj:-1) 19 | y16_22 1 (obj:-1) 20 | y16_31 1 (obj:-1) 21 | y30_45 1 (obj:-1) 22 | y45_57 1 (obj:-1) 23 | y16_30 1 (obj:-1) 24 | y30_31 1 (obj:-1) 25 | y30_44 1 (obj:-1) 26 | y44_54 1 (obj:-1) 27 | y22_53 1 (obj:-1) 28 | y22_39 1 (obj:-1) 29 | y16_53 1 (obj:-1) 30 | y28_45 1 (obj:-1) 31 | y16_39 1 (obj:-1) 32 | y28_44 1 (obj:-1) 33 | y20_54 1 (obj:-1) 34 | y30_39 1 (obj:-1) 35 | y30_57 1 (obj:-1) 36 | y39_53 1 (obj:-1) 37 | y20_44 1 (obj:-1) 38 | y53_54 1 (obj:-1) 39 | y44_53 1 (obj:-1) 40 | y45_54 1 (obj:-1) 41 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=65_m=1215_p=0.60_SET2_setparam=100.00_alpha=0.50_587.sol: -------------------------------------------------------------------------------- 1 | objective value: 1177 2 | x5 1 (obj:100) 3 | x8 1 (obj:100) 4 | x15 1 (obj:100) 5 | x18 1 (obj:100) 6 | x21 1 (obj:100) 7 | x25 1 (obj:100) 8 | x26 1 (obj:100) 9 | x35 1 (obj:100) 10 | x43 1 (obj:100) 11 | x52 1 (obj:100) 12 | x58 1 (obj:100) 13 | x60 1 (obj:100) 14 | y15_21 1 (obj:-1) 15 | y18_26 1 (obj:-1) 16 | y18_35 1 (obj:-1) 17 | y8_18 1 (obj:-1) 18 | y25_52 1 (obj:-1) 19 | y21_26 1 (obj:-1) 20 | y21_35 1 (obj:-1) 21 | y5_8 1 (obj:-1) 22 | y5_35 1 (obj:-1) 23 | y15_43 1 (obj:-1) 24 | y26_43 1 (obj:-1) 25 | y26_52 1 (obj:-1) 26 | y18_25 1 (obj:-1) 27 | y8_21 1 (obj:-1) 28 | y25_35 1 (obj:-1) 29 | y43_52 1 (obj:-1) 30 | y5_52 1 (obj:-1) 31 | y26_60 1 (obj:-1) 32 | y8_43 1 (obj:-1) 33 | y8_52 1 (obj:-1) 34 | y8_15 1 (obj:-1) 35 | y25_58 1 (obj:-1) 36 | y21_60 1 (obj:-1) 37 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=65_m=1228_p=0.60_SET2_setparam=100.00_alpha=0.50_579.sol: -------------------------------------------------------------------------------- 1 | objective value: 1272 2 | x3 1 (obj:100) 3 | x11 1 (obj:100) 4 | x12 1 (obj:100) 5 | x13 1 (obj:100) 6 | x14 1 (obj:100) 7 | x23 1 (obj:100) 8 | x31 1 (obj:100) 9 | x37 1 (obj:100) 10 | x38 1 (obj:100) 11 | x42 1 (obj:100) 12 | x48 1 (obj:100) 13 | x56 1 (obj:100) 14 | x64 1 (obj:100) 15 | y11_23 1 (obj:-1) 16 | y14_42 1 (obj:-1) 17 | y3_37 1 (obj:-1) 18 | y14_23 1 (obj:-1) 19 | y13_64 1 (obj:-1) 20 | y31_42 1 (obj:-1) 21 | y23_38 1 (obj:-1) 22 | y23_56 1 (obj:-1) 23 | y42_56 1 (obj:-1) 24 | y31_37 1 (obj:-1) 25 | y23_42 1 (obj:-1) 26 | y12_37 1 (obj:-1) 27 | y3_31 1 (obj:-1) 28 | y48_56 1 (obj:-1) 29 | y3_12 1 (obj:-1) 30 | y13_48 1 (obj:-1) 31 | y12_64 1 (obj:-1) 32 | y23_64 1 (obj:-1) 33 | y13_56 1 (obj:-1) 34 | y42_64 1 (obj:-1) 35 | y38_48 1 (obj:-1) 36 | y12_13 1 (obj:-1) 37 | y23_31 1 (obj:-1) 38 | y13_14 1 (obj:-1) 39 | y37_64 1 (obj:-1) 40 | y11_38 1 (obj:-1) 41 | y3_48 1 (obj:-1) 42 | y48_64 1 (obj:-1) 43 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=65_m=1236_p=0.60_SET2_setparam=100.00_alpha=0.50_541.sol: -------------------------------------------------------------------------------- 1 | objective value: 1177 2 | x5 1 (obj:100) 3 | x7 1 (obj:100) 4 | x9 1 (obj:100) 5 | x16 1 (obj:100) 6 | x17 1 (obj:100) 7 | x20 1 (obj:100) 8 | x21 1 (obj:100) 9 | x34 1 (obj:100) 10 | x35 1 (obj:100) 11 | x38 1 (obj:100) 12 | x54 1 (obj:100) 13 | x61 1 (obj:100) 14 | y7_17 1 (obj:-1) 15 | y7_16 1 (obj:-1) 16 | y17_38 1 (obj:-1) 17 | y9_34 1 (obj:-1) 18 | y5_54 1 (obj:-1) 19 | y21_35 1 (obj:-1) 20 | y5_17 1 (obj:-1) 21 | y5_35 1 (obj:-1) 22 | y20_38 1 (obj:-1) 23 | y16_17 1 (obj:-1) 24 | y38_54 1 (obj:-1) 25 | y7_34 1 (obj:-1) 26 | y34_38 1 (obj:-1) 27 | y7_38 1 (obj:-1) 28 | y21_34 1 (obj:-1) 29 | y21_61 1 (obj:-1) 30 | y5_61 1 (obj:-1) 31 | y20_54 1 (obj:-1) 32 | y9_21 1 (obj:-1) 33 | y20_35 1 (obj:-1) 34 | y9_16 1 (obj:-1) 35 | y34_54 1 (obj:-1) 36 | y7_54 1 (obj:-1) 37 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=65_m=1253_p=0.60_SET2_setparam=100.00_alpha=0.50_562.sol: -------------------------------------------------------------------------------- 1 | objective value: 1181 2 | x0 1 (obj:100) 3 | x4 1 (obj:100) 4 | x10 1 (obj:100) 5 | x12 1 (obj:100) 6 | x20 1 (obj:100) 7 | x28 1 (obj:100) 8 | x42 1 (obj:100) 9 | x47 1 (obj:100) 10 | x51 1 (obj:100) 11 | x53 1 (obj:100) 12 | x54 1 (obj:100) 13 | x58 1 (obj:100) 14 | y28_58 1 (obj:-1) 15 | y28_42 1 (obj:-1) 16 | y0_51 1 (obj:-1) 17 | y12_20 1 (obj:-1) 18 | y20_51 1 (obj:-1) 19 | y12_47 1 (obj:-1) 20 | y4_20 1 (obj:-1) 21 | y12_42 1 (obj:-1) 22 | y4_10 1 (obj:-1) 23 | y4_28 1 (obj:-1) 24 | y10_20 1 (obj:-1) 25 | y10_47 1 (obj:-1) 26 | y54_58 1 (obj:-1) 27 | y10_51 1 (obj:-1) 28 | y28_54 1 (obj:-1) 29 | y42_51 1 (obj:-1) 30 | y0_47 1 (obj:-1) 31 | y53_58 1 (obj:-1) 32 | y0_42 1 (obj:-1) 33 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=65_m=1258_p=0.60_SET2_setparam=100.00_alpha=0.50_514.sol: -------------------------------------------------------------------------------- 1 | objective value: 1178 2 | x1 1 (obj:100) 3 | x4 1 (obj:100) 4 | x10 1 (obj:100) 5 | x17 1 (obj:100) 6 | x26 1 (obj:100) 7 | x36 1 (obj:100) 8 | x39 1 (obj:100) 9 | x42 1 (obj:100) 10 | x47 1 (obj:100) 11 | x50 1 (obj:100) 12 | x53 1 (obj:100) 13 | x61 1 (obj:100) 14 | y10_36 1 (obj:-1) 15 | y17_53 1 (obj:-1) 16 | y17_39 1 (obj:-1) 17 | y47_61 1 (obj:-1) 18 | y10_39 1 (obj:-1) 19 | y42_53 1 (obj:-1) 20 | y50_61 1 (obj:-1) 21 | y4_39 1 (obj:-1) 22 | y42_61 1 (obj:-1) 23 | y1_10 1 (obj:-1) 24 | y4_47 1 (obj:-1) 25 | y53_61 1 (obj:-1) 26 | y26_61 1 (obj:-1) 27 | y4_10 1 (obj:-1) 28 | y10_61 1 (obj:-1) 29 | y42_50 1 (obj:-1) 30 | y1_17 1 (obj:-1) 31 | y1_26 1 (obj:-1) 32 | y1_39 1 (obj:-1) 33 | y26_50 1 (obj:-1) 34 | y4_17 1 (obj:-1) 35 | y10_50 1 (obj:-1) 36 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=66_m=1282_p=0.60_SET2_setparam=100.00_alpha=0.50_596.sol: -------------------------------------------------------------------------------- 1 | objective value: 1271 2 | x2 1 (obj:100) 3 | x7 1 (obj:100) 4 | x23 1 (obj:100) 5 | x27 1 (obj:100) 6 | x28 1 (obj:100) 7 | x34 1 (obj:100) 8 | x39 1 (obj:100) 9 | x42 1 (obj:100) 10 | x53 1 (obj:100) 11 | x57 1 (obj:100) 12 | x58 1 (obj:100) 13 | x60 1 (obj:100) 14 | x64 1 (obj:100) 15 | y2_27 1 (obj:-1) 16 | y28_57 1 (obj:-1) 17 | y28_34 1 (obj:-1) 18 | y42_58 1 (obj:-1) 19 | y23_53 1 (obj:-1) 20 | y28_42 1 (obj:-1) 21 | y2_7 1 (obj:-1) 22 | y23_39 1 (obj:-1) 23 | y23_57 1 (obj:-1) 24 | y23_34 1 (obj:-1) 25 | y34_53 1 (obj:-1) 26 | y60_64 1 (obj:-1) 27 | y23_42 1 (obj:-1) 28 | y27_39 1 (obj:-1) 29 | y2_58 1 (obj:-1) 30 | y2_53 1 (obj:-1) 31 | y34_42 1 (obj:-1) 32 | y7_42 1 (obj:-1) 33 | y2_39 1 (obj:-1) 34 | y2_57 1 (obj:-1) 35 | y28_60 1 (obj:-1) 36 | y42_60 1 (obj:-1) 37 | y2_23 1 (obj:-1) 38 | y23_64 1 (obj:-1) 39 | y23_27 1 (obj:-1) 40 | y39_53 1 (obj:-1) 41 | y53_64 1 (obj:-1) 42 | y7_60 1 (obj:-1) 43 | y27_42 1 (obj:-1) 44 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=66_m=1296_p=0.60_SET2_setparam=100.00_alpha=0.50_602.sol: -------------------------------------------------------------------------------- 1 | objective value: 1180 2 | x4 1 (obj:100) 3 | x9 1 (obj:100) 4 | x18 1 (obj:100) 5 | x21 1 (obj:100) 6 | x24 1 (obj:100) 7 | x29 1 (obj:100) 8 | x32 1 (obj:100) 9 | x33 1 (obj:100) 10 | x39 1 (obj:100) 11 | x43 1 (obj:100) 12 | x58 1 (obj:100) 13 | x62 1 (obj:100) 14 | y9_58 1 (obj:-1) 15 | y9_62 1 (obj:-1) 16 | y39_43 1 (obj:-1) 17 | y4_58 1 (obj:-1) 18 | y32_58 1 (obj:-1) 19 | y43_58 1 (obj:-1) 20 | y4_62 1 (obj:-1) 21 | y9_24 1 (obj:-1) 22 | y18_58 1 (obj:-1) 23 | y29_62 1 (obj:-1) 24 | y18_33 1 (obj:-1) 25 | y4_9 1 (obj:-1) 26 | y24_58 1 (obj:-1) 27 | y24_39 1 (obj:-1) 28 | y9_18 1 (obj:-1) 29 | y24_29 1 (obj:-1) 30 | y39_58 1 (obj:-1) 31 | y9_21 1 (obj:-1) 32 | y33_62 1 (obj:-1) 33 | y33_39 1 (obj:-1) 34 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=67_m=1330_p=0.60_SET2_setparam=100.00_alpha=0.50_556.sol: -------------------------------------------------------------------------------- 1 | objective value: 1269 2 | x2 1 (obj:100) 3 | x3 1 (obj:100) 4 | x4 1 (obj:100) 5 | x10 1 (obj:100) 6 | x18 1 (obj:100) 7 | x25 1 (obj:100) 8 | x29 1 (obj:100) 9 | x30 1 (obj:100) 10 | x31 1 (obj:100) 11 | x32 1 (obj:100) 12 | x44 1 (obj:100) 13 | x52 1 (obj:100) 14 | x62 1 (obj:100) 15 | y29_32 1 (obj:-1) 16 | y18_44 1 (obj:-1) 17 | y2_32 1 (obj:-1) 18 | y18_30 1 (obj:-1) 19 | y25_29 1 (obj:-1) 20 | y29_31 1 (obj:-1) 21 | y10_44 1 (obj:-1) 22 | y3_18 1 (obj:-1) 23 | y29_30 1 (obj:-1) 24 | y2_3 1 (obj:-1) 25 | y10_25 1 (obj:-1) 26 | y4_44 1 (obj:-1) 27 | y4_30 1 (obj:-1) 28 | y4_29 1 (obj:-1) 29 | y3_32 1 (obj:-1) 30 | y3_31 1 (obj:-1) 31 | y29_52 1 (obj:-1) 32 | y32_62 1 (obj:-1) 33 | y2_29 1 (obj:-1) 34 | y10_18 1 (obj:-1) 35 | y30_62 1 (obj:-1) 36 | y2_18 1 (obj:-1) 37 | y2_4 1 (obj:-1) 38 | y4_32 1 (obj:-1) 39 | y3_62 1 (obj:-1) 40 | y18_32 1 (obj:-1) 41 | y25_44 1 (obj:-1) 42 | y3_52 1 (obj:-1) 43 | y18_31 1 (obj:-1) 44 | y25_30 1 (obj:-1) 45 | y3_29 1 (obj:-1) 46 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=67_m=1360_p=0.60_SET2_setparam=100.00_alpha=0.50_537.sol: -------------------------------------------------------------------------------- 1 | objective value: 1178 2 | x4 1 (obj:100) 3 | x15 1 (obj:100) 4 | x17 1 (obj:100) 5 | x28 1 (obj:100) 6 | x29 1 (obj:100) 7 | x30 1 (obj:100) 8 | x35 1 (obj:100) 9 | x36 1 (obj:100) 10 | x40 1 (obj:100) 11 | x41 1 (obj:100) 12 | x44 1 (obj:100) 13 | x59 1 (obj:100) 14 | y29_41 1 (obj:-1) 15 | y29_36 1 (obj:-1) 16 | y35_41 1 (obj:-1) 17 | y35_59 1 (obj:-1) 18 | y17_29 1 (obj:-1) 19 | y29_30 1 (obj:-1) 20 | y4_44 1 (obj:-1) 21 | y30_36 1 (obj:-1) 22 | y4_15 1 (obj:-1) 23 | y36_41 1 (obj:-1) 24 | y17_41 1 (obj:-1) 25 | y17_59 1 (obj:-1) 26 | y36_40 1 (obj:-1) 27 | y28_36 1 (obj:-1) 28 | y17_30 1 (obj:-1) 29 | y4_41 1 (obj:-1) 30 | y4_36 1 (obj:-1) 31 | y4_40 1 (obj:-1) 32 | y4_35 1 (obj:-1) 33 | y15_17 1 (obj:-1) 34 | y15_35 1 (obj:-1) 35 | y15_44 1 (obj:-1) 36 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=67_m=1364_p=0.60_SET2_setparam=100.00_alpha=0.50_550.sol: -------------------------------------------------------------------------------- 1 | objective value: 1272 2 | x8 1 (obj:100) 3 | x11 1 (obj:100) 4 | x12 1 (obj:100) 5 | x16 1 (obj:100) 6 | x33 1 (obj:100) 7 | x38 1 (obj:100) 8 | x39 1 (obj:100) 9 | x45 1 (obj:100) 10 | x51 1 (obj:100) 11 | x55 1 (obj:100) 12 | x62 1 (obj:100) 13 | x64 1 (obj:100) 14 | x66 1 (obj:100) 15 | y62_64 1 (obj:-1) 16 | y16_51 1 (obj:-1) 17 | y39_66 1 (obj:-1) 18 | y16_64 1 (obj:-1) 19 | y12_66 1 (obj:-1) 20 | y38_51 1 (obj:-1) 21 | y8_55 1 (obj:-1) 22 | y39_51 1 (obj:-1) 23 | y38_55 1 (obj:-1) 24 | y12_38 1 (obj:-1) 25 | y45_62 1 (obj:-1) 26 | y45_66 1 (obj:-1) 27 | y38_45 1 (obj:-1) 28 | y45_51 1 (obj:-1) 29 | y8_16 1 (obj:-1) 30 | y51_62 1 (obj:-1) 31 | y8_11 1 (obj:-1) 32 | y39_64 1 (obj:-1) 33 | y62_66 1 (obj:-1) 34 | y16_39 1 (obj:-1) 35 | y16_66 1 (obj:-1) 36 | y12_55 1 (obj:-1) 37 | y51_55 1 (obj:-1) 38 | y38_62 1 (obj:-1) 39 | y16_33 1 (obj:-1) 40 | y38_39 1 (obj:-1) 41 | y11_38 1 (obj:-1) 42 | y55_62 1 (obj:-1) 43 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=68_m=1337_p=0.60_SET2_setparam=100.00_alpha=0.50_563.sol: -------------------------------------------------------------------------------- 1 | objective value: 1279 2 | x0 1 (obj:100) 3 | x2 1 (obj:100) 4 | x5 1 (obj:100) 5 | x6 1 (obj:100) 6 | x12 1 (obj:100) 7 | x14 1 (obj:100) 8 | x18 1 (obj:100) 9 | x21 1 (obj:100) 10 | x26 1 (obj:100) 11 | x34 1 (obj:100) 12 | x44 1 (obj:100) 13 | x48 1 (obj:100) 14 | x49 1 (obj:100) 15 | y6_48 1 (obj:-1) 16 | y18_21 1 (obj:-1) 17 | y2_49 1 (obj:-1) 18 | y2_12 1 (obj:-1) 19 | y12_44 1 (obj:-1) 20 | y26_48 1 (obj:-1) 21 | y34_48 1 (obj:-1) 22 | y26_34 1 (obj:-1) 23 | y18_48 1 (obj:-1) 24 | y18_34 1 (obj:-1) 25 | y14_26 1 (obj:-1) 26 | y6_26 1 (obj:-1) 27 | y2_5 1 (obj:-1) 28 | y2_14 1 (obj:-1) 29 | y0_44 1 (obj:-1) 30 | y5_14 1 (obj:-1) 31 | y0_48 1 (obj:-1) 32 | y12_49 1 (obj:-1) 33 | y5_18 1 (obj:-1) 34 | y12_26 1 (obj:-1) 35 | y44_48 1 (obj:-1) 36 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=68_m=1351_p=0.60_SET2_setparam=100.00_alpha=0.50_580.sol: -------------------------------------------------------------------------------- 1 | objective value: 1181 2 | x1 1 (obj:100) 3 | x8 1 (obj:100) 4 | x13 1 (obj:100) 5 | x18 1 (obj:100) 6 | x22 1 (obj:100) 7 | x24 1 (obj:100) 8 | x27 1 (obj:100) 9 | x28 1 (obj:100) 10 | x30 1 (obj:100) 11 | x32 1 (obj:100) 12 | x48 1 (obj:100) 13 | x49 1 (obj:100) 14 | y18_30 1 (obj:-1) 15 | y22_27 1 (obj:-1) 16 | y8_32 1 (obj:-1) 17 | y1_28 1 (obj:-1) 18 | y24_30 1 (obj:-1) 19 | y27_49 1 (obj:-1) 20 | y8_22 1 (obj:-1) 21 | y30_49 1 (obj:-1) 22 | y18_28 1 (obj:-1) 23 | y28_49 1 (obj:-1) 24 | y8_48 1 (obj:-1) 25 | y30_48 1 (obj:-1) 26 | y13_28 1 (obj:-1) 27 | y24_28 1 (obj:-1) 28 | y1_30 1 (obj:-1) 29 | y27_32 1 (obj:-1) 30 | y8_28 1 (obj:-1) 31 | y18_22 1 (obj:-1) 32 | y30_32 1 (obj:-1) 33 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=68_m=1414_p=0.60_SET2_setparam=100.00_alpha=0.50_583.sol: -------------------------------------------------------------------------------- 1 | objective value: 1180 2 | x2 1 (obj:100) 3 | x4 1 (obj:100) 4 | x22 1 (obj:100) 5 | x24 1 (obj:100) 6 | x27 1 (obj:100) 7 | x28 1 (obj:100) 8 | x32 1 (obj:100) 9 | x41 1 (obj:100) 10 | x47 1 (obj:100) 11 | x51 1 (obj:100) 12 | x59 1 (obj:100) 13 | x62 1 (obj:100) 14 | y2_32 1 (obj:-1) 15 | y2_41 1 (obj:-1) 16 | y2_27 1 (obj:-1) 17 | y2_22 1 (obj:-1) 18 | y4_62 1 (obj:-1) 19 | y27_41 1 (obj:-1) 20 | y27_59 1 (obj:-1) 21 | y41_59 1 (obj:-1) 22 | y4_28 1 (obj:-1) 23 | y51_62 1 (obj:-1) 24 | y2_47 1 (obj:-1) 25 | y28_32 1 (obj:-1) 26 | y28_59 1 (obj:-1) 27 | y2_24 1 (obj:-1) 28 | y32_47 1 (obj:-1) 29 | y4_51 1 (obj:-1) 30 | y32_51 1 (obj:-1) 31 | y4_32 1 (obj:-1) 32 | y24_28 1 (obj:-1) 33 | y41_47 1 (obj:-1) 34 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=69_m=1431_p=0.60_SET2_setparam=100.00_alpha=0.50_540.sol: -------------------------------------------------------------------------------- 1 | objective value: 1269 2 | x3 1 (obj:100) 3 | x7 1 (obj:100) 4 | x13 1 (obj:100) 5 | x24 1 (obj:100) 6 | x32 1 (obj:100) 7 | x33 1 (obj:100) 8 | x34 1 (obj:100) 9 | x35 1 (obj:100) 10 | x36 1 (obj:100) 11 | x48 1 (obj:100) 12 | x62 1 (obj:100) 13 | x63 1 (obj:100) 14 | x65 1 (obj:100) 15 | y3_24 1 (obj:-1) 16 | y3_33 1 (obj:-1) 17 | y13_65 1 (obj:-1) 18 | y36_48 1 (obj:-1) 19 | y13_32 1 (obj:-1) 20 | y24_32 1 (obj:-1) 21 | y32_63 1 (obj:-1) 22 | y35_36 1 (obj:-1) 23 | y13_63 1 (obj:-1) 24 | y24_63 1 (obj:-1) 25 | y34_62 1 (obj:-1) 26 | y7_62 1 (obj:-1) 27 | y33_65 1 (obj:-1) 28 | y34_48 1 (obj:-1) 29 | y7_34 1 (obj:-1) 30 | y3_32 1 (obj:-1) 31 | y3_36 1 (obj:-1) 32 | y7_24 1 (obj:-1) 33 | y3_13 1 (obj:-1) 34 | y13_48 1 (obj:-1) 35 | y24_34 1 (obj:-1) 36 | y32_65 1 (obj:-1) 37 | y62_65 1 (obj:-1) 38 | y34_65 1 (obj:-1) 39 | y3_62 1 (obj:-1) 40 | y33_62 1 (obj:-1) 41 | y34_63 1 (obj:-1) 42 | y7_36 1 (obj:-1) 43 | y3_34 1 (obj:-1) 44 | y33_34 1 (obj:-1) 45 | y34_35 1 (obj:-1) 46 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=70_m=1408_p=0.60_SET2_setparam=100.00_alpha=0.50_529.sol: -------------------------------------------------------------------------------- 1 | objective value: 1272 2 | x1 1 (obj:100) 3 | x3 1 (obj:100) 4 | x6 1 (obj:100) 5 | x13 1 (obj:100) 6 | x22 1 (obj:100) 7 | x27 1 (obj:100) 8 | x30 1 (obj:100) 9 | x32 1 (obj:100) 10 | x35 1 (obj:100) 11 | x37 1 (obj:100) 12 | x51 1 (obj:100) 13 | x52 1 (obj:100) 14 | x64 1 (obj:100) 15 | y22_32 1 (obj:-1) 16 | y32_64 1 (obj:-1) 17 | y3_37 1 (obj:-1) 18 | y6_51 1 (obj:-1) 19 | y13_32 1 (obj:-1) 20 | y1_51 1 (obj:-1) 21 | y6_13 1 (obj:-1) 22 | y13_30 1 (obj:-1) 23 | y1_37 1 (obj:-1) 24 | y3_51 1 (obj:-1) 25 | y30_35 1 (obj:-1) 26 | y6_64 1 (obj:-1) 27 | y3_13 1 (obj:-1) 28 | y22_30 1 (obj:-1) 29 | y1_64 1 (obj:-1) 30 | y13_52 1 (obj:-1) 31 | y35_52 1 (obj:-1) 32 | y1_27 1 (obj:-1) 33 | y32_51 1 (obj:-1) 34 | y32_37 1 (obj:-1) 35 | y1_35 1 (obj:-1) 36 | y13_37 1 (obj:-1) 37 | y1_3 1 (obj:-1) 38 | y37_51 1 (obj:-1) 39 | y37_64 1 (obj:-1) 40 | y30_51 1 (obj:-1) 41 | y30_37 1 (obj:-1) 42 | y30_32 1 (obj:-1) 43 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=70_m=1431_p=0.60_SET2_setparam=100.00_alpha=0.50_543.sol: -------------------------------------------------------------------------------- 1 | objective value: 1270 2 | x3 1 (obj:100) 3 | x6 1 (obj:100) 4 | x15 1 (obj:100) 5 | x28 1 (obj:100) 6 | x32 1 (obj:100) 7 | x36 1 (obj:100) 8 | x46 1 (obj:100) 9 | x48 1 (obj:100) 10 | x51 1 (obj:100) 11 | x54 1 (obj:100) 12 | x55 1 (obj:100) 13 | x58 1 (obj:100) 14 | x60 1 (obj:100) 15 | y48_54 1 (obj:-1) 16 | y3_6 1 (obj:-1) 17 | y3_15 1 (obj:-1) 18 | y3_28 1 (obj:-1) 19 | y6_51 1 (obj:-1) 20 | y32_36 1 (obj:-1) 21 | y6_28 1 (obj:-1) 22 | y6_46 1 (obj:-1) 23 | y46_55 1 (obj:-1) 24 | y3_51 1 (obj:-1) 25 | y46_58 1 (obj:-1) 26 | y3_46 1 (obj:-1) 27 | y3_55 1 (obj:-1) 28 | y3_32 1 (obj:-1) 29 | y3_36 1 (obj:-1) 30 | y15_28 1 (obj:-1) 31 | y6_55 1 (obj:-1) 32 | y36_55 1 (obj:-1) 33 | y15_32 1 (obj:-1) 34 | y28_51 1 (obj:-1) 35 | y6_36 1 (obj:-1) 36 | y6_54 1 (obj:-1) 37 | y54_58 1 (obj:-1) 38 | y32_48 1 (obj:-1) 39 | y28_32 1 (obj:-1) 40 | y6_58 1 (obj:-1) 41 | y28_54 1 (obj:-1) 42 | y15_55 1 (obj:-1) 43 | y48_60 1 (obj:-1) 44 | y48_55 1 (obj:-1) 45 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/test/er_n=70_m=1458_p=0.60_SET2_setparam=100.00_alpha=0.50_573.sol: -------------------------------------------------------------------------------- 1 | objective value: 1179 2 | x3 1 (obj:100) 3 | x9 1 (obj:100) 4 | x11 1 (obj:100) 5 | x12 1 (obj:100) 6 | x14 1 (obj:100) 7 | x43 1 (obj:100) 8 | x54 1 (obj:100) 9 | x55 1 (obj:100) 10 | x58 1 (obj:100) 11 | x62 1 (obj:100) 12 | x66 1 (obj:100) 13 | x68 1 (obj:100) 14 | y9_58 1 (obj:-1) 15 | y3_14 1 (obj:-1) 16 | y9_66 1 (obj:-1) 17 | y54_55 1 (obj:-1) 18 | y62_68 1 (obj:-1) 19 | y3_9 1 (obj:-1) 20 | y54_68 1 (obj:-1) 21 | y9_11 1 (obj:-1) 22 | y12_66 1 (obj:-1) 23 | y11_55 1 (obj:-1) 24 | y11_68 1 (obj:-1) 25 | y3_55 1 (obj:-1) 26 | y12_14 1 (obj:-1) 27 | y11_12 1 (obj:-1) 28 | y43_66 1 (obj:-1) 29 | y54_62 1 (obj:-1) 30 | y9_54 1 (obj:-1) 31 | y58_68 1 (obj:-1) 32 | y11_66 1 (obj:-1) 33 | y14_58 1 (obj:-1) 34 | y9_68 1 (obj:-1) 35 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/transfer/er_n=100_m=2997_p=0.60_SET2_setparam=100.00_alpha=0.50_4333.sol: -------------------------------------------------------------------------------- 1 | objective value: 1472 2 | x0 1 (obj:100) 3 | x19 1 (obj:100) 4 | x24 1 (obj:100) 5 | x41 1 (obj:100) 6 | x48 1 (obj:100) 7 | x58 1 (obj:100) 8 | x61 1 (obj:100) 9 | x67 1 (obj:100) 10 | x68 1 (obj:100) 11 | x77 1 (obj:100) 12 | x78 1 (obj:100) 13 | x79 1 (obj:100) 14 | x85 1 (obj:100) 15 | x90 1 (obj:100) 16 | x92 1 (obj:100) 17 | y48_67 1 (obj:-1) 18 | y41_77 1 (obj:-1) 19 | y61_79 1 (obj:-1) 20 | y68_85 1 (obj:-1) 21 | y58_77 1 (obj:-1) 22 | y19_85 1 (obj:-1) 23 | y78_79 1 (obj:-1) 24 | y0_19 1 (obj:-1) 25 | y24_78 1 (obj:-1) 26 | y68_77 1 (obj:-1) 27 | y67_85 1 (obj:-1) 28 | y41_68 1 (obj:-1) 29 | y41_90 1 (obj:-1) 30 | y61_85 1 (obj:-1) 31 | y77_92 1 (obj:-1) 32 | y24_58 1 (obj:-1) 33 | y0_77 1 (obj:-1) 34 | y0_67 1 (obj:-1) 35 | y41_61 1 (obj:-1) 36 | y48_77 1 (obj:-1) 37 | y67_68 1 (obj:-1) 38 | y68_92 1 (obj:-1) 39 | y58_61 1 (obj:-1) 40 | y0_92 1 (obj:-1) 41 | y67_90 1 (obj:-1) 42 | y41_85 1 (obj:-1) 43 | y67_79 1 (obj:-1) 44 | y0_61 1 (obj:-1) 45 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/transfer/er_n=80_m=1895_p=0.60_SET2_setparam=100.00_alpha=0.50_4395.sol: -------------------------------------------------------------------------------- 1 | objective value: 1273 2 | x0 1 (obj:100) 3 | x4 1 (obj:100) 4 | x8 1 (obj:100) 5 | x13 1 (obj:100) 6 | x31 1 (obj:100) 7 | x33 1 (obj:100) 8 | x41 1 (obj:100) 9 | x43 1 (obj:100) 10 | x58 1 (obj:100) 11 | x59 1 (obj:100) 12 | x61 1 (obj:100) 13 | x76 1 (obj:100) 14 | x78 1 (obj:100) 15 | y31_76 1 (obj:-1) 16 | y43_59 1 (obj:-1) 17 | y4_76 1 (obj:-1) 18 | y58_61 1 (obj:-1) 19 | y31_61 1 (obj:-1) 20 | y8_59 1 (obj:-1) 21 | y0_59 1 (obj:-1) 22 | y41_78 1 (obj:-1) 23 | y8_13 1 (obj:-1) 24 | y4_33 1 (obj:-1) 25 | y33_78 1 (obj:-1) 26 | y0_13 1 (obj:-1) 27 | y0_31 1 (obj:-1) 28 | y43_76 1 (obj:-1) 29 | y13_58 1 (obj:-1) 30 | y31_78 1 (obj:-1) 31 | y43_61 1 (obj:-1) 32 | y61_78 1 (obj:-1) 33 | y58_59 1 (obj:-1) 34 | y31_41 1 (obj:-1) 35 | y31_59 1 (obj:-1) 36 | y31_58 1 (obj:-1) 37 | y41_76 1 (obj:-1) 38 | y0_43 1 (obj:-1) 39 | y33_76 1 (obj:-1) 40 | y0_33 1 (obj:-1) 41 | y33_61 1 (obj:-1) 42 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/transfer/er_n=80_m=1909_p=0.60_SET2_setparam=100.00_alpha=0.50_4327.sol: -------------------------------------------------------------------------------- 1 | objective value: 1275 2 | x0 1 (obj:100) 3 | x3 1 (obj:100) 4 | x16 1 (obj:100) 5 | x24 1 (obj:100) 6 | x25 1 (obj:100) 7 | x26 1 (obj:100) 8 | x29 1 (obj:100) 9 | x38 1 (obj:100) 10 | x57 1 (obj:100) 11 | x61 1 (obj:100) 12 | x62 1 (obj:100) 13 | x63 1 (obj:100) 14 | x66 1 (obj:100) 15 | y29_63 1 (obj:-1) 16 | y25_38 1 (obj:-1) 17 | y61_62 1 (obj:-1) 18 | y62_63 1 (obj:-1) 19 | y57_63 1 (obj:-1) 20 | y26_29 1 (obj:-1) 21 | y26_38 1 (obj:-1) 22 | y0_26 1 (obj:-1) 23 | y29_57 1 (obj:-1) 24 | y29_38 1 (obj:-1) 25 | y24_62 1 (obj:-1) 26 | y3_16 1 (obj:-1) 27 | y24_66 1 (obj:-1) 28 | y16_62 1 (obj:-1) 29 | y16_66 1 (obj:-1) 30 | y24_38 1 (obj:-1) 31 | y16_61 1 (obj:-1) 32 | y0_62 1 (obj:-1) 33 | y38_66 1 (obj:-1) 34 | y0_66 1 (obj:-1) 35 | y38_61 1 (obj:-1) 36 | y0_61 1 (obj:-1) 37 | y3_62 1 (obj:-1) 38 | y0_24 1 (obj:-1) 39 | y25_62 1 (obj:-1) 40 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/transfer/er_n=81_m=1944_p=0.60_SET2_setparam=100.00_alpha=0.50_4346.sol: -------------------------------------------------------------------------------- 1 | objective value: 1278 2 | x7 1 (obj:100) 3 | x12 1 (obj:100) 4 | x15 1 (obj:100) 5 | x25 1 (obj:100) 6 | x34 1 (obj:100) 7 | x40 1 (obj:100) 8 | x47 1 (obj:100) 9 | x50 1 (obj:100) 10 | x54 1 (obj:100) 11 | x65 1 (obj:100) 12 | x68 1 (obj:100) 13 | x70 1 (obj:100) 14 | x71 1 (obj:100) 15 | y15_25 1 (obj:-1) 16 | y40_54 1 (obj:-1) 17 | y25_47 1 (obj:-1) 18 | y12_71 1 (obj:-1) 19 | y15_34 1 (obj:-1) 20 | y15_70 1 (obj:-1) 21 | y7_34 1 (obj:-1) 22 | y7_47 1 (obj:-1) 23 | y7_15 1 (obj:-1) 24 | y47_50 1 (obj:-1) 25 | y47_68 1 (obj:-1) 26 | y47_54 1 (obj:-1) 27 | y12_65 1 (obj:-1) 28 | y65_71 1 (obj:-1) 29 | y54_70 1 (obj:-1) 30 | y7_70 1 (obj:-1) 31 | y15_50 1 (obj:-1) 32 | y34_50 1 (obj:-1) 33 | y15_54 1 (obj:-1) 34 | y15_40 1 (obj:-1) 35 | y34_40 1 (obj:-1) 36 | y25_71 1 (obj:-1) 37 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/transfer/er_n=82_m=1992_p=0.60_SET2_setparam=100.00_alpha=0.50_4314.sol: -------------------------------------------------------------------------------- 1 | objective value: 1275 2 | x2 1 (obj:100) 3 | x22 1 (obj:100) 4 | x25 1 (obj:100) 5 | x30 1 (obj:100) 6 | x34 1 (obj:100) 7 | x41 1 (obj:100) 8 | x48 1 (obj:100) 9 | x49 1 (obj:100) 10 | x59 1 (obj:100) 11 | x62 1 (obj:100) 12 | x67 1 (obj:100) 13 | x69 1 (obj:100) 14 | x72 1 (obj:100) 15 | y2_41 1 (obj:-1) 16 | y2_59 1 (obj:-1) 17 | y34_72 1 (obj:-1) 18 | y34_67 1 (obj:-1) 19 | y22_69 1 (obj:-1) 20 | y49_59 1 (obj:-1) 21 | y22_59 1 (obj:-1) 22 | y2_67 1 (obj:-1) 23 | y22_49 1 (obj:-1) 24 | y59_62 1 (obj:-1) 25 | y2_25 1 (obj:-1) 26 | y22_30 1 (obj:-1) 27 | y22_25 1 (obj:-1) 28 | y30_72 1 (obj:-1) 29 | y49_67 1 (obj:-1) 30 | y30_62 1 (obj:-1) 31 | y22_67 1 (obj:-1) 32 | y34_69 1 (obj:-1) 33 | y22_62 1 (obj:-1) 34 | y41_62 1 (obj:-1) 35 | y22_48 1 (obj:-1) 36 | y22_34 1 (obj:-1) 37 | y25_67 1 (obj:-1) 38 | y25_62 1 (obj:-1) 39 | y48_59 1 (obj:-1) 40 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/transfer/er_n=82_m=2004_p=0.60_SET2_setparam=100.00_alpha=0.50_4363.sol: -------------------------------------------------------------------------------- 1 | objective value: 1273 2 | x1 1 (obj:100) 3 | x2 1 (obj:100) 4 | x4 1 (obj:100) 5 | x8 1 (obj:100) 6 | x19 1 (obj:100) 7 | x21 1 (obj:100) 8 | x22 1 (obj:100) 9 | x34 1 (obj:100) 10 | x39 1 (obj:100) 11 | x53 1 (obj:100) 12 | x58 1 (obj:100) 13 | x64 1 (obj:100) 14 | x80 1 (obj:100) 15 | y2_22 1 (obj:-1) 16 | y1_80 1 (obj:-1) 17 | y2_21 1 (obj:-1) 18 | y4_58 1 (obj:-1) 19 | y1_34 1 (obj:-1) 20 | y4_39 1 (obj:-1) 21 | y4_34 1 (obj:-1) 22 | y1_19 1 (obj:-1) 23 | y34_53 1 (obj:-1) 24 | y34_80 1 (obj:-1) 25 | y19_22 1 (obj:-1) 26 | y1_4 1 (obj:-1) 27 | y2_80 1 (obj:-1) 28 | y22_58 1 (obj:-1) 29 | y21_80 1 (obj:-1) 30 | y1_64 1 (obj:-1) 31 | y19_53 1 (obj:-1) 32 | y19_80 1 (obj:-1) 33 | y39_58 1 (obj:-1) 34 | y4_64 1 (obj:-1) 35 | y1_58 1 (obj:-1) 36 | y53_64 1 (obj:-1) 37 | y34_64 1 (obj:-1) 38 | y4_22 1 (obj:-1) 39 | y22_34 1 (obj:-1) 40 | y8_19 1 (obj:-1) 41 | y4_21 1 (obj:-1) 42 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/transfer/er_n=85_m=2181_p=0.60_SET2_setparam=100.00_alpha=0.50_4374.sol: -------------------------------------------------------------------------------- 1 | objective value: 1273 2 | x0 1 (obj:100) 3 | x1 1 (obj:100) 4 | x4 1 (obj:100) 5 | x14 1 (obj:100) 6 | x16 1 (obj:100) 7 | x24 1 (obj:100) 8 | x38 1 (obj:100) 9 | x50 1 (obj:100) 10 | x60 1 (obj:100) 11 | x64 1 (obj:100) 12 | x68 1 (obj:100) 13 | x71 1 (obj:100) 14 | x78 1 (obj:100) 15 | y14_24 1 (obj:-1) 16 | y24_78 1 (obj:-1) 17 | y24_64 1 (obj:-1) 18 | y1_71 1 (obj:-1) 19 | y16_78 1 (obj:-1) 20 | y50_71 1 (obj:-1) 21 | y68_78 1 (obj:-1) 22 | y38_60 1 (obj:-1) 23 | y0_50 1 (obj:-1) 24 | y0_68 1 (obj:-1) 25 | y1_14 1 (obj:-1) 26 | y0_4 1 (obj:-1) 27 | y4_14 1 (obj:-1) 28 | y1_60 1 (obj:-1) 29 | y24_71 1 (obj:-1) 30 | y1_78 1 (obj:-1) 31 | y14_16 1 (obj:-1) 32 | y16_71 1 (obj:-1) 33 | y50_60 1 (obj:-1) 34 | y50_78 1 (obj:-1) 35 | y1_50 1 (obj:-1) 36 | y4_78 1 (obj:-1) 37 | y16_38 1 (obj:-1) 38 | y14_71 1 (obj:-1) 39 | y0_38 1 (obj:-1) 40 | y0_24 1 (obj:-1) 41 | y0_1 1 (obj:-1) 42 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/transfer/er_n=86_m=2201_p=0.60_SET2_setparam=100.00_alpha=0.50_4319.sol: -------------------------------------------------------------------------------- 1 | objective value: 1275 2 | x0 1 (obj:100) 3 | x8 1 (obj:100) 4 | x17 1 (obj:100) 5 | x18 1 (obj:100) 6 | x36 1 (obj:100) 7 | x44 1 (obj:100) 8 | x52 1 (obj:100) 9 | x54 1 (obj:100) 10 | x61 1 (obj:100) 11 | x64 1 (obj:100) 12 | x65 1 (obj:100) 13 | x71 1 (obj:100) 14 | x78 1 (obj:100) 15 | y17_44 1 (obj:-1) 16 | y54_65 1 (obj:-1) 17 | y36_52 1 (obj:-1) 18 | y54_78 1 (obj:-1) 19 | y36_65 1 (obj:-1) 20 | y65_78 1 (obj:-1) 21 | y8_65 1 (obj:-1) 22 | y8_36 1 (obj:-1) 23 | y8_54 1 (obj:-1) 24 | y44_65 1 (obj:-1) 25 | y52_64 1 (obj:-1) 26 | y44_78 1 (obj:-1) 27 | y8_17 1 (obj:-1) 28 | y18_61 1 (obj:-1) 29 | y8_44 1 (obj:-1) 30 | y0_8 1 (obj:-1) 31 | y52_54 1 (obj:-1) 32 | y17_65 1 (obj:-1) 33 | y44_54 1 (obj:-1) 34 | y36_64 1 (obj:-1) 35 | y17_78 1 (obj:-1) 36 | y8_71 1 (obj:-1) 37 | y18_65 1 (obj:-1) 38 | y0_71 1 (obj:-1) 39 | y52_61 1 (obj:-1) 40 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/transfer/er_n=88_m=2332_p=0.60_SET2_setparam=100.00_alpha=0.50_4378.sol: -------------------------------------------------------------------------------- 1 | objective value: 1274 2 | x1 1 (obj:100) 3 | x7 1 (obj:100) 4 | x26 1 (obj:100) 5 | x44 1 (obj:100) 6 | x46 1 (obj:100) 7 | x56 1 (obj:100) 8 | x57 1 (obj:100) 9 | x58 1 (obj:100) 10 | x67 1 (obj:100) 11 | x70 1 (obj:100) 12 | x71 1 (obj:100) 13 | x74 1 (obj:100) 14 | x78 1 (obj:100) 15 | y7_26 1 (obj:-1) 16 | y58_67 1 (obj:-1) 17 | y58_71 1 (obj:-1) 18 | y57_74 1 (obj:-1) 19 | y7_58 1 (obj:-1) 20 | y7_67 1 (obj:-1) 21 | y71_74 1 (obj:-1) 22 | y57_58 1 (obj:-1) 23 | y7_57 1 (obj:-1) 24 | y56_70 1 (obj:-1) 25 | y67_70 1 (obj:-1) 26 | y58_74 1 (obj:-1) 27 | y1_78 1 (obj:-1) 28 | y58_78 1 (obj:-1) 29 | y46_71 1 (obj:-1) 30 | y26_74 1 (obj:-1) 31 | y7_74 1 (obj:-1) 32 | y1_44 1 (obj:-1) 33 | y46_70 1 (obj:-1) 34 | y7_78 1 (obj:-1) 35 | y46_56 1 (obj:-1) 36 | y44_67 1 (obj:-1) 37 | y67_74 1 (obj:-1) 38 | y44_71 1 (obj:-1) 39 | y56_58 1 (obj:-1) 40 | y70_78 1 (obj:-1) 41 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/transfer/er_n=98_m=2798_p=0.60_SET2_setparam=100.00_alpha=0.50_4352.sol: -------------------------------------------------------------------------------- 1 | objective value: 1373 2 | x6 1 (obj:100) 3 | x7 1 (obj:100) 4 | x15 1 (obj:100) 5 | x34 1 (obj:100) 6 | x37 1 (obj:100) 7 | x40 1 (obj:100) 8 | x49 1 (obj:100) 9 | x51 1 (obj:100) 10 | x57 1 (obj:100) 11 | x60 1 (obj:100) 12 | x62 1 (obj:100) 13 | x74 1 (obj:100) 14 | x83 1 (obj:100) 15 | x85 1 (obj:100) 16 | y6_51 1 (obj:-1) 17 | y49_60 1 (obj:-1) 18 | y6_83 1 (obj:-1) 19 | y6_7 1 (obj:-1) 20 | y49_62 1 (obj:-1) 21 | y15_49 1 (obj:-1) 22 | y34_40 1 (obj:-1) 23 | y6_62 1 (obj:-1) 24 | y34_62 1 (obj:-1) 25 | y37_57 1 (obj:-1) 26 | y15_51 1 (obj:-1) 27 | y7_37 1 (obj:-1) 28 | y51_74 1 (obj:-1) 29 | y37_83 1 (obj:-1) 30 | y49_57 1 (obj:-1) 31 | y7_60 1 (obj:-1) 32 | y37_60 1 (obj:-1) 33 | y37_40 1 (obj:-1) 34 | y57_83 1 (obj:-1) 35 | y34_57 1 (obj:-1) 36 | y37_62 1 (obj:-1) 37 | y40_62 1 (obj:-1) 38 | y34_37 1 (obj:-1) 39 | y6_49 1 (obj:-1) 40 | y57_62 1 (obj:-1) 41 | y7_74 1 (obj:-1) 42 | y34_49 1 (obj:-1) 43 | -------------------------------------------------------------------------------- /problem_generation/data/GISP/transfer/er_n=98_m=2822_p=0.60_SET2_setparam=100.00_alpha=0.50_4382.sol: -------------------------------------------------------------------------------- 1 | objective value: 1371 2 | x1 1 (obj:100) 3 | x8 1 (obj:100) 4 | x9 1 (obj:100) 5 | x19 1 (obj:100) 6 | x22 1 (obj:100) 7 | x44 1 (obj:100) 8 | x47 1 (obj:100) 9 | x50 1 (obj:100) 10 | x54 1 (obj:100) 11 | x55 1 (obj:100) 12 | x61 1 (obj:100) 13 | x62 1 (obj:100) 14 | x68 1 (obj:100) 15 | x97 1 (obj:100) 16 | y54_97 1 (obj:-1) 17 | y55_61 1 (obj:-1) 18 | y9_47 1 (obj:-1) 19 | y19_50 1 (obj:-1) 20 | y22_50 1 (obj:-1) 21 | y44_61 1 (obj:-1) 22 | y68_97 1 (obj:-1) 23 | y8_68 1 (obj:-1) 24 | y55_97 1 (obj:-1) 25 | y44_62 1 (obj:-1) 26 | y47_62 1 (obj:-1) 27 | y1_62 1 (obj:-1) 28 | y61_62 1 (obj:-1) 29 | y19_55 1 (obj:-1) 30 | y44_54 1 (obj:-1) 31 | y9_54 1 (obj:-1) 32 | y50_55 1 (obj:-1) 33 | y50_68 1 (obj:-1) 34 | y1_44 1 (obj:-1) 35 | y44_55 1 (obj:-1) 36 | y44_68 1 (obj:-1) 37 | y47_55 1 (obj:-1) 38 | y47_68 1 (obj:-1) 39 | y9_55 1 (obj:-1) 40 | y54_62 1 (obj:-1) 41 | y1_55 1 (obj:-1) 42 | y61_68 1 (obj:-1) 43 | y1_22 1 (obj:-1) 44 | y8_19 1 (obj:-1) 45 | -------------------------------------------------------------------------------- /pyscipopt/.gitignore: -------------------------------------------------------------------------------- 1 | # project specific 2 | *~ 3 | *.swp 4 | *.swo 5 | build/ 6 | dist/ 7 | include 8 | lib 9 | src/pyscipopt/scip.c 10 | __pycache__ 11 | .cache 12 | 13 | # Byte-compiled / optimized / DLL files 14 | __pycache__/ 15 | *.py[cod] 16 | *$py.class 17 | 18 | # C extensions 19 | *.so 20 | 21 | # Distribution / packaging 22 | .Python 23 | build/ 24 | develop-eggs/ 25 | dist/ 26 | downloads/ 27 | eggs/ 28 | .eggs/ 29 | lib/ 30 | lib64/ 31 | parts/ 32 | sdist/ 33 | var/ 34 | wheels/ 35 | *.egg-info/ 36 | .installed.cfg 37 | *.egg 38 | MANIFEST 39 | 40 | # PyInstaller 41 | # Usually these files are written by a python script from a template 42 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 43 | *.manifest 44 | *.spec 45 | 46 | # Installer logs 47 | pip-log.txt 48 | pip-delete-this-directory.txt 49 | 50 | # Unit test / coverage reports 51 | htmlcov/ 52 | .tox/ 53 | .coverage 54 | .coverage.* 55 | .cache 56 | nosetests.xml 57 | coverage.xml 58 | *.cover 59 | .hypothesis/ 60 | 61 | # Translations 62 | *.mo 63 | *.pot 64 | 65 | # Django stuff: 66 | *.log 67 | .static_storage/ 68 | .media/ 69 | local_settings.py 70 | 71 | # Flask stuff: 72 | instance/ 73 | .webassets-cache 74 | 75 | # Scrapy stuff: 76 | .scrapy 77 | 78 | # Sphinx documentation 79 | docs/_build/ 80 | 81 | # PyBuilder 82 | target/ 83 | 84 | # Jupyter Notebook 85 | .ipynb_checkpoints 86 | 87 | # pyenv 88 | .python-version 89 | 90 | # celery beat schedule file 91 | celerybeat-schedule 92 | 93 | # SageMath parsed files 94 | *.sage.py 95 | 96 | # Environments 97 | .env 98 | .venv 99 | env/ 100 | venv/ 101 | venv3/ 102 | ENV/ 103 | env.bak/ 104 | venv.bak/ 105 | 106 | # Spyder project settings 107 | .spyderproject 108 | .spyproject 109 | 110 | # Rope project settings 111 | .ropeproject 112 | 113 | # mkdocs documentation 114 | /site 115 | 116 | # mypy 117 | .mypy_cache/ 118 | 119 | # pytest 120 | .pytest_cache/ 121 | 122 | # model (for tests) 123 | model 124 | model.cip 125 | model.lp 126 | 127 | # VSCode 128 | .vscode/ 129 | -------------------------------------------------------------------------------- /pyscipopt/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Zuse Institute Berlin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /pyscipopt/appveyor.yml: -------------------------------------------------------------------------------- 1 | version: '{build}' 2 | 3 | environment: 4 | SCIPOPTDIR: C:\scipoptdir 5 | pypipw: 6 | secure: HEa8MAJyyfSv33snyK3Gleflk9SIfZBxbnTiS39hlWM= 7 | optipw: 8 | secure: mi/mkS8vYK1Yza0A1FB4/Q== 9 | 10 | matrix: 11 | - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 12 | PYTHON: C:\Python36-x64 13 | PIP: C:\Python36-x64\Scripts\pip 14 | PYTEST: C:\Python36-x64\Scripts\pytest 15 | TWINE: C:\Python36-x64\Scripts\twine 16 | - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 17 | PYTHON: C:\Python37-x64 18 | PIP: C:\Python37-x64\Scripts\pip 19 | PYTEST: C:\Python37-x64\Scripts\pytest 20 | TWINE: C:\Python37-x64\Scripts\twine 21 | - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 22 | PYTHON: C:\Python38-x64 23 | PIP: C:\Python38-x64\Scripts\pip 24 | PYTEST: C:\Python38-x64\Scripts\pytest 25 | TWINE: C:\Python38-x64\Scripts\twine 26 | 27 | 28 | install: 29 | # - ps: $uri = 'http://opti-test.zib.de/v600-rc06/scip/download/release/SCIPOptSuite-6.0.0-win64-VS15.exe' 30 | # - ps: $user = 'opti-test' 31 | # - ps: $pass = $env:optipw | ConvertTo-SecureString -AsPlainText -Force 32 | # - ps: $cred = New-Object Management.Automation.PSCredential ($user, ($pass)) 33 | # - ps: Invoke-WebRequest -Uri $uri -Credential $cred -OutFile 'scipopt-installer.exe' 34 | - ps: wget http://scip.zib.de/download/release/SCIPOptSuite-7.0.1-win64-VS15.exe -outfile scipopt-installer.exe 35 | - scipopt-installer.exe /S /D=%SCIPOPTDIR% 36 | - set PATH=%SCIPOPTDIR%\bin;%PYTHON%;%PATH% 37 | - cmd: "%PIP% install cython networkx pytest wheel twine" 38 | 39 | build_script: 40 | - cmd: "%PIP% install ." 41 | 42 | test_script: 43 | - cmd: "%PYTEST% tests" 44 | 45 | artifacts: 46 | - path: dist\* 47 | 48 | after_test: 49 | - cmd: "echo [pypi] > %USERPROFILE%\\.pypirc" 50 | - cmd: "echo username: pyscipopt >> %USERPROFILE%\\.pypirc" 51 | - cmd: "echo password: %pypipw% >> %USERPROFILE%\\.pypirc" 52 | - python setup.py bdist_wheel 53 | 54 | on_success: 55 | - cmd: "if [%APPVEYOR_REPO_TAG%]==[true] %TWINE% upload dist\\*.whl" 56 | -------------------------------------------------------------------------------- /pyscipopt/docs/footer.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 12 | 13 | 14 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /pyscipopt/docs/header.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | $projectname: $title 9 | $title 10 | 11 | 12 | 13 | $treeview 14 | $search 15 | $mathjax 16 | 17 | $extrastylesheet 18 | 19 | 20 |
21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 37 | 38 | 39 | 40 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 |
32 |
$projectname 33 |  $projectnumber 34 |
35 |
$projectbrief
36 |
41 |
$projectbrief
42 |
$searchbox
53 |
54 | 55 | 56 | -------------------------------------------------------------------------------- /pyscipopt/docs/maindoc.py: -------------------------------------------------------------------------------- 1 | ##@file maindoc.py 2 | #@brief Main documentation page 3 | 4 | ## @mainpage Overview 5 | # 6 | # This project provides an interface from Python to the [SCIP Optimization Suite](http://scip.zib.de).
7 | # 8 | # See the [web site] (https://github.com/SCIP-Interfaces/PySCIPOpt) to download PySCIPOpt. 9 | # 10 | # @section Changelog 11 | # See [CHANGELOG.md](CHANGELOG.md) for added, removed or fixed functionality. 12 | # 13 | # @section Installation 14 | # See [INSTALL.md](INSTALL.md) for instructions. 15 | # 16 | # @section TABLEOFCONTENTS Structure of this manual 17 | # 18 | # This documentation gives an introduction to the functionality of the Python interface of the SCIP code in the following chapters 19 | # 20 | # - \ref pyscipopt::scip::Model "Model" Class with the most fundamental functions to create and solve a problem 21 | # - \ref examples/tutorial "Tutorials" and \ref examples/finished "Examples" to display some functionality of the interface 22 | # - @subpage EXTEND Explanations on extending the PySCIPOpt interface 23 | # 24 | # For a more detailed description on how to create a model and how to extend the interface, please have a look at the [README.md] (README.md). 25 | # 26 | 27 | ##@page EXTEND Extending the interface 28 | # PySCIPOpt already covers many of the SCIP callable library methods. You 29 | #may also extend it to increase the functionality of this interface. The 30 | #following will provide some directions on how this can be achieved: 31 | # 32 | #The two most important files in PySCIPOpt are the `scip.pxd` and 33 | #`scip.pyx`. These two files specify the public functions of SCIP that 34 | #can be accessed from your python code. 35 | # 36 | #To make PySCIPOpt aware of the public functions you would like to 37 | #access, you must add them to `scip.pxd`. There are two things that must 38 | #be done in order to properly add the functions: 39 | # 40 | # -# Ensure any `enum`s, `struct`s or SCIP variable types are included in 41 | # `scip.pxd` 42 | # -# Add the prototype of the public function you wish to access to 43 | # `scip.pxd` 44 | # 45 | #After following the previous two steps, it is then possible to create 46 | #functions in python that reference the SCIP public functions included in 47 | #`scip.pxd`. This is achieved by modifying the `scip.pyx` file to add the 48 | #functionality you require. 49 | # 50 | #We are always happy to accept pull request containing patches or 51 | #extensions! 52 | # 53 | #Please have a look at our [contribution guidelines](CONTRIBUTING.md). 54 | -------------------------------------------------------------------------------- /pyscipopt/examples/finished/eoq_en.py: -------------------------------------------------------------------------------- 1 | ##@file eoq_en.py 2 | #@brief piecewise linear model to the multi-item economic ordering quantity problem. 3 | """ 4 | Approach: use a convex combination formulation. 5 | 6 | Copyright (c) by Joao Pedro PEDROSO and Mikio KUBO, 2012 7 | """ 8 | from pyscipopt import Model, quicksum, multidict 9 | 10 | def eoq(I,F,h,d,w,W,a0,aK,K): 11 | """eoq -- multi-item capacitated economic ordering quantity model 12 | Parameters: 13 | - I: set of items 14 | - F[i]: ordering cost for item i 15 | - h[i]: holding cost for item i 16 | - d[i]: demand for item i 17 | - w[i]: unit weight for item i 18 | - W: capacity (limit on order quantity) 19 | - a0: lower bound on the cycle time (x axis) 20 | - aK: upper bound on the cycle time (x axis) 21 | - K: number of linear pieces to use in the approximation 22 | Returns a model, ready to be solved. 23 | """ 24 | 25 | # construct points for piecewise-linear relation, store in a,b 26 | a,b = {},{} 27 | delta = float(aK-a0)/K 28 | for i in I: 29 | for k in range(K): 30 | T = a0 + delta*k 31 | a[i,k] = T # abscissa: cycle time 32 | b[i,k] = F[i]/T + h[i]*d[i]*T/2. # ordinate: (convex) cost for this cycle time 33 | 34 | model = Model("multi-item, capacitated EOQ") 35 | 36 | x,c,w_ = {},{},{} 37 | for i in I: 38 | x[i] = model.addVar(vtype="C", name="x(%s)"%i) # cycle time for item i 39 | c[i] = model.addVar(vtype="C", name="c(%s)"%i) # total cost for item i 40 | for k in range(K): 41 | w_[i,k] = model.addVar(ub=1, vtype="C", name="w(%s,%s)"%(i,k)) #todo ?? 42 | 43 | for i in I: 44 | model.addCons(quicksum(w_[i,k] for k in range(K)) == 1) 45 | model.addCons(quicksum(a[i,k]*w_[i,k] for k in range(K)) == x[i]) 46 | model.addCons(quicksum(b[i,k]*w_[i,k] for k in range(K)) == c[i]) 47 | 48 | model.addCons(quicksum(w[i]*d[i]*x[i] for i in I) <= W) 49 | 50 | model.setObjective(quicksum(c[i] for i in I), "minimize") 51 | 52 | model.data = x,w 53 | return model 54 | 55 | 56 | 57 | if __name__ == "__main__": 58 | # multiple item EOQ 59 | I,F,h,d,w = multidict( 60 | {1:[300,10,10,20], 61 | 2:[300,10,30,40], 62 | 3:[300,10,50,10]} 63 | ) 64 | W = 2000 65 | K = 1000 66 | a0,aK = 0.1,10 67 | model = eoq(I,F,h,d,w,W,a0,aK,K) 68 | model.optimize() 69 | 70 | x,w = model.data 71 | EPS = 1.e-6 72 | for v in x: 73 | if model.getVal(x[v]) >= EPS: 74 | print(x[v].name,"=",model.getVal(x[v])) 75 | 76 | print("Optimal value:", model.getObjVal()) 77 | -------------------------------------------------------------------------------- /pyscipopt/examples/finished/even.py: -------------------------------------------------------------------------------- 1 | ##@file finished/even.py 2 | #@brief model to decide whether argument is even or odd 3 | 4 | 5 | 6 | ################################################################################ 7 | # 8 | # EVEN OR ODD? 9 | # 10 | # If a positional argument is given: 11 | # prints if the argument is even/odd/neither 12 | # else: 13 | # prints if a value is even/odd/neither per each value in a example list 14 | # 15 | # This example is made for newcomers and motivated by: 16 | # - modulus is unsupported for pyscipopt.scip.Variable and int 17 | # - variables are non-integer by default 18 | # Based on this: 19 | # https://github.com/SCIP-Interfaces/PySCIPOpt/issues/172#issuecomment-394644046 20 | # 21 | ################################################################################ 22 | 23 | from pyscipopt import Model 24 | 25 | verbose = False 26 | sdic = {0:"even",1:"odd"} 27 | 28 | def parity(number): 29 | try: 30 | assert number == int(round(number)) 31 | m = Model() 32 | m.hideOutput() 33 | 34 | ### variables are non-negative by default since 0 is the default lb. 35 | ### To allow for negative values, give None as lower bound 36 | ### (None means -infinity as lower bound and +infinity as upper bound) 37 | x = m.addVar("x", vtype="I", lb=None, ub=None) #ub=None is default 38 | n = m.addVar("n", vtype="I", lb=None) 39 | s = m.addVar("s", vtype="B") 40 | 41 | ### CAVEAT: if number is negative, x's lb must be None 42 | ### if x is set by default as non-negative and number is negative: 43 | ### there is no feasible solution (trivial) but the program 44 | ### does not highlight which constraints conflict. 45 | m.addCons(x==number) 46 | 47 | m.addCons(s == x-2*n) 48 | m.setObjective(s) 49 | m.optimize() 50 | 51 | assert m.getStatus() == "optimal" 52 | if verbose: 53 | for v in m.getVars(): 54 | print("%s %d" % (v,m.getVal(v))) 55 | print("%d%%2 == %d?" % (m.getVal(x), m.getVal(s))) 56 | print(m.getVal(s) == m.getVal(x)%2) 57 | 58 | xval = m.getVal(x) 59 | sval = m.getVal(s) 60 | sstr = sdic[sval] 61 | print("%d is %s" % (xval, sstr)) 62 | except (AssertionError, TypeError): 63 | print("%s is neither even nor odd!" % number.__repr__()) 64 | 65 | if __name__ == "__main__": 66 | import sys 67 | from ast import literal_eval as leval 68 | example_values = [0, 1, 1.5, "hallo welt", 20, 25, -101, -15., -10, -int(2**31), int(2**31-1), int(2**63)-1] 69 | try: 70 | try: 71 | n = leval(sys.argv[1]) 72 | except ValueError: 73 | n = sys.argv[1] 74 | parity(n) 75 | except IndexError: 76 | for n in example_values: 77 | parity(n) 78 | -------------------------------------------------------------------------------- /pyscipopt/examples/finished/gcp_fixed_k.py: -------------------------------------------------------------------------------- 1 | ##@file gcp_fixed_k.py 2 | #@brief solve the graph coloring problem with fixed-k model 3 | """ 4 | Copyright (c) by Joao Pedro PEDROSO and Mikio KUBO, 2012 5 | """ 6 | 7 | from pyscipopt import Model, quicksum, multidict 8 | 9 | def gcp_fixed_k(V,E,K): 10 | """gcp_fixed_k -- model for minimizing number of bad edges in coloring a graph 11 | Parameters: 12 | - V: set/list of nodes in the graph 13 | - E: set/list of edges in the graph 14 | - K: number of colors to be used 15 | Returns a model, ready to be solved. 16 | """ 17 | model = Model("gcp - fixed k") 18 | 19 | x,z = {},{} 20 | for i in V: 21 | for k in range(K): 22 | x[i,k] = model.addVar(vtype="B", name="x(%s,%s)"%(i,k)) 23 | for (i,j) in E: 24 | z[i,j] = model.addVar(vtype="B", name="z(%s,%s)"%(i,j)) 25 | 26 | for i in V: 27 | model.addCons(quicksum(x[i,k] for k in range(K)) == 1, "AssignColor(%s)" % i) 28 | 29 | for (i,j) in E: 30 | for k in range(K): 31 | model.addCons(x[i,k] + x[j,k] <= 1 + z[i,j], "BadEdge(%s,%s,%s)"%(i,j,k)) 32 | 33 | model.setObjective(quicksum(z[i,j] for (i,j) in E), "minimize") 34 | 35 | model.data = x,z 36 | return model 37 | 38 | 39 | def solve_gcp(V,E): 40 | """solve_gcp -- solve the graph coloring problem with bisection and fixed-k model 41 | Parameters: 42 | - V: set/list of nodes in the graph 43 | - E: set/list of edges in the graph 44 | Returns tuple with number of colors used, and dictionary mapping colors to vertices 45 | """ 46 | LB = 0 47 | UB = len(V) 48 | color = {} 49 | while UB-LB > 1: 50 | K = int((UB+LB) / 2) 51 | gcp = gcp_fixed_k(V,E,K) 52 | # gcp.Params.OutputFlag = 0 # silent mode 53 | #gcp.Params.Cutoff = .1 54 | gcp.setObjlimit(0.1) 55 | gcp.optimize() 56 | status = gcp.getStatus() 57 | if status == "optimal": 58 | x,z = gcp.data 59 | for i in V: 60 | for k in range(K): 61 | if gcp.getVal(x[i,k]) > 0.5: 62 | color[i] = k 63 | break 64 | # else: 65 | # raise "undefined color for", i 66 | UB = K 67 | else: 68 | LB = K 69 | 70 | return UB,color 71 | 72 | 73 | import random 74 | def make_data(n,prob): 75 | """make_data: prepare data for a random graph 76 | Parameters: 77 | - n: number of vertices 78 | - prob: probability of existence of an edge, for each pair of vertices 79 | Returns a tuple with a list of vertices and a list edges. 80 | """ 81 | V = range(1,n+1) 82 | E = [(i,j) for i in V for j in V if i < j and random.random() < prob] 83 | return V,E 84 | 85 | 86 | if __name__ == "__main__": 87 | random.seed(1) 88 | V,E = make_data(75,.25) 89 | 90 | K,color = solve_gcp(V,E) 91 | print("minimum number of colors:",K) 92 | print("solution:",color) 93 | -------------------------------------------------------------------------------- /pyscipopt/examples/finished/lo_wines.py: -------------------------------------------------------------------------------- 1 | ##@file lo_wines.py 2 | #@brief Simple SCIP example of linear programming. 3 | """ 4 | It solves the same instance as lo_wines_simple.py: 5 | 6 | maximize 15x + 18y + 30z 7 | subject to 2x + y + z <= 60 8 | x + 2y + z <= 60 9 | z <= 30 10 | x,y,z >= 0 11 | Variables correspond to the production of three types of wine blends, 12 | made from pure-grape wines. 13 | Constraints correspond to the inventory of pure-grape wines. 14 | 15 | Copyright (c) by Joao Pedro PEDROSO and Mikio KUBO, 2012 16 | """ 17 | from pyscipopt import Model, quicksum, SCIP_PARAMSETTING 18 | 19 | #Initialize model 20 | model = Model("Wine blending") 21 | model.setPresolve(SCIP_PARAMSETTING.OFF) 22 | 23 | Inventory = {"Alfrocheiro":60, "Baga":60, "Castelao":30} 24 | Grapes = Inventory.keys() 25 | 26 | Profit = {"Dry":15, "Medium":18, "Sweet":30} 27 | Blends = Profit.keys() 28 | 29 | Use = { 30 | ("Alfrocheiro","Dry"):2, 31 | ("Alfrocheiro","Medium"):1, 32 | ("Alfrocheiro","Sweet"):1, 33 | ("Baga","Dry"):1, 34 | ("Baga","Medium"):2, 35 | ("Baga","Sweet"):1, 36 | ("Castelao","Dry"):0, 37 | ("Castelao","Medium"):0, 38 | ("Castelao","Sweet"):1 39 | } 40 | 41 | # Create variables 42 | x = {} 43 | for j in Blends: 44 | x[j] = model.addVar(vtype="C", name="x(%s)"%j) 45 | 46 | # Create constraints 47 | c = {} 48 | for i in Grapes: 49 | c[i] = model.addCons(quicksum(Use[i,j]*x[j] for j in Blends) <= Inventory[i], name="Use(%s)"%i) 50 | 51 | # Objective 52 | model.setObjective(quicksum(Profit[j]*x[j] for j in Blends), "maximize") 53 | 54 | model.optimize() 55 | 56 | if model.getStatus() == "optimal": 57 | print("Optimal value:", model.getObjVal()) 58 | 59 | for j in x: 60 | print(x[j].name, "=", model.getVal(x[j]), " (red. cost: ", model.getVarRedcost(x[j]), ")") 61 | for i in c: 62 | try: 63 | dual = model.getDualsolLinear(c[i]) 64 | except: 65 | dual = None 66 | print("dual of", c[i].name, ":", dual) 67 | else: 68 | print("Problem could not be solved to optimality") 69 | -------------------------------------------------------------------------------- /pyscipopt/examples/finished/logical.py: -------------------------------------------------------------------------------- 1 | ##@file finished/logical.py 2 | #@brief Tutorial example on how to use AND/OR/XOR constraints 3 | 4 | from pyscipopt import Model 5 | from pyscipopt import quicksum 6 | 7 | """ 8 | 9 | AND/OR/XOR CONSTRAINTS 10 | 11 | Tutorial example on how to use AND/OR/XOR constraints. 12 | 13 | N.B.: standard SCIP XOR constraint works differently from AND/OR by design. 14 | The constraint is set with a boolean rhs instead of an integer resultant. 15 | cf. http://listserv.zib.de/pipermail/scip/2018-May/003392.html 16 | A workaround to get the resultant as variable is here proposed. 17 | 18 | """ 19 | 20 | def printFunc(name,m): 21 | """prints results""" 22 | print("* %s *" % name) 23 | objSet = bool(m.getObjective().terms.keys()) 24 | print("* Is objective set? %s" % objSet) 25 | if objSet: 26 | print("* Sense: %s" % m.getObjectiveSense()) 27 | for v in m.getVars(): 28 | if v.name != "n": 29 | print("%s: %d" % (v, round(m.getVal(v)))) 30 | print("\n") 31 | 32 | # AND 33 | model = Model() 34 | model.hideOutput() 35 | x = model.addVar("x","B") 36 | y = model.addVar("y","B") 37 | z = model.addVar("z","B") 38 | r = model.addVar("r","B") 39 | model.addConsAnd([x,y,z],r) 40 | model.addCons(x==1) 41 | model.setObjective(r,sense="minimize") 42 | model.optimize() 43 | printFunc("AND",model) 44 | 45 | # OR 46 | model = Model() 47 | model.hideOutput() 48 | x = model.addVar("x","B") 49 | y = model.addVar("y","B") 50 | z = model.addVar("z","B") 51 | r = model.addVar("r","B") 52 | model.addConsOr([x,y,z],r) 53 | model.addCons(x==0) 54 | model.setObjective(r,sense="maximize") 55 | model.optimize() 56 | printFunc("OR",model) 57 | 58 | # XOR (r as boolean, standard) 59 | model = Model() 60 | model.hideOutput() 61 | x = model.addVar("x","B") 62 | y = model.addVar("y","B") 63 | z = model.addVar("z","B") 64 | r = True 65 | model.addConsXor([x,y,z],r) 66 | model.addCons(x==1) 67 | model.optimize() 68 | printFunc("Standard XOR (as boolean)",model) 69 | 70 | # XOR (r as variable, custom) 71 | model = Model() 72 | model.hideOutput() 73 | x = model.addVar("x","B") 74 | y = model.addVar("y","B") 75 | z = model.addVar("z","B") 76 | r = model.addVar("r","B") 77 | n = model.addVar("n","I") #auxiliary 78 | model.addCons(r+quicksum([x,y,z]) == 2*n) 79 | model.addCons(x==0) 80 | model.setObjective(r,sense="maximize") 81 | model.optimize() 82 | printFunc("Custom XOR (as variable)",model) 83 | -------------------------------------------------------------------------------- /pyscipopt/examples/finished/markowitz_soco.py: -------------------------------------------------------------------------------- 1 | ##@file markowitz_soco.py 2 | #@brief simple markowitz model for portfolio optimization. 3 | """ 4 | Approach: use second-order cone optimization. 5 | 6 | Copyright (c) by Joao Pedro PEDROSO, Masahiro MURAMATSU and Mikio KUBO, 2012 7 | """ 8 | from pyscipopt import Model, quicksum, multidict 9 | 10 | def markowitz(I,sigma,r,alpha): 11 | """markowitz -- simple markowitz model for portfolio optimization. 12 | Parameters: 13 | - I: set of items 14 | - sigma[i]: standard deviation of item i 15 | - r[i]: revenue of item i 16 | - alpha: acceptance threshold 17 | Returns a model, ready to be solved. 18 | """ 19 | model = Model("markowitz") 20 | 21 | x = {} 22 | for i in I: 23 | x[i] = model.addVar(vtype="C", name="x(%s)"%i) # quantity of i to buy 24 | 25 | model.addCons(quicksum(r[i]*x[i] for i in I) >= alpha) 26 | model.addCons(quicksum(x[i] for i in I) == 1) 27 | 28 | # set nonlinear objective: SCIP only allow for linear objectives hence the following 29 | obj = model.addVar(vtype="C", name="objective", lb = None, ub = None) # auxiliary variable to represent objective 30 | model.addCons(quicksum(sigma[i]**2 * x[i] * x[i] for i in I) <= obj) 31 | model.setObjective(obj, "minimize") 32 | 33 | model.data = x 34 | return model 35 | 36 | 37 | 38 | if __name__ == "__main__": 39 | # portfolio 40 | import math 41 | I,sigma,r = multidict( 42 | {1:[0.07,1.01], 43 | 2:[0.09,1.05], 44 | 3:[0.1,1.08], 45 | 4:[0.2,1.10], 46 | 5:[0.3,1.20]} 47 | ) 48 | alpha = 1.05 49 | 50 | model = markowitz(I,sigma,r,alpha) 51 | model.optimize() 52 | 53 | x = model.data 54 | EPS = 1.e-6 55 | print("%5s\t%8s" % ("i","x[i]")) 56 | for i in I: 57 | print("%5s\t%8g" % (i,model.getVal(x[i]))) 58 | print("sum:",sum(model.getVal(x[i]) for i in I)) 59 | print 60 | print("Optimal value:", model.getObjVal()) 61 | -------------------------------------------------------------------------------- /pyscipopt/examples/finished/mkp.py: -------------------------------------------------------------------------------- 1 | ##@file mkp.py 2 | #@brief model for the multi-constrained knapsack problem 3 | """ 4 | Copyright (c) by Joao Pedro PEDROSO and Mikio KUBO, 2012 5 | """ 6 | from pyscipopt import Model, quicksum, multidict 7 | 8 | def mkp(I,J,v,a,b): 9 | """mkp -- model for solving the multi-constrained knapsack 10 | Parameters: 11 | - I: set of dimensions 12 | - J: set of items 13 | - v[j]: value of item j 14 | - a[i,j]: weight of item j on dimension i 15 | - b[i]: capacity of knapsack on dimension i 16 | Returns a model, ready to be solved. 17 | """ 18 | model = Model("mkp") 19 | 20 | # Create Variables 21 | x = {} 22 | for j in J: 23 | x[j] = model.addVar(vtype="B", name="x(%s)"%j) 24 | 25 | # Create constraints 26 | for i in I: 27 | model.addCons(quicksum(a[i,j]*x[j] for j in J) <= b[i], "Capacity(%s)"%i) 28 | 29 | # Objective 30 | model.setObjective(quicksum(v[j]*x[j] for j in J), "maximize") 31 | model.data = x 32 | 33 | return model 34 | 35 | 36 | def example(): 37 | """creates example data set""" 38 | J,v = multidict({1:16, 2:19, 3:23, 4:28}) 39 | a = {(1,1):2, (1,2):3, (1,3):4, (1,4):5, 40 | (2,1):3000, (2,2):3500, (2,3):5100, (2,4):7200, 41 | } 42 | I,b = multidict({1:7, 2:10000}) 43 | return I,J,v,a,b 44 | 45 | 46 | if __name__ == "__main__": 47 | I,J,v,a,b = example() 48 | model = mkp(I,J,v,a,b) 49 | x = model.data 50 | model.optimize() 51 | 52 | print("Optimal value:", model.getObjVal()) 53 | 54 | EPS = 1.e-6 55 | 56 | for i in x: 57 | v = x[i] 58 | if model.getVal(v) > EPS: 59 | print(v.name, "=", model.getVal(v)) 60 | -------------------------------------------------------------------------------- /pyscipopt/examples/finished/prodmix_soco.py: -------------------------------------------------------------------------------- 1 | ##@file prodmix_soco.py 2 | #@brief product mix model using soco. 3 | """ 4 | Copyright (c) by Joao Pedro PEDROSO, Masahiro MURAMATSU and Mikio KUBO, 2012 5 | """ 6 | from pyscipopt import Model, quicksum, multidict 7 | 8 | def prodmix(I,K,a,p,epsilon,LB): 9 | """prodmix: robust production planning using soco 10 | Parameters: 11 | I - set of materials 12 | K - set of components 13 | a[i][k] - coef. matrix 14 | p[i] - price of material i 15 | LB[k] - amount needed for k 16 | Returns a model, ready to be solved. 17 | """ 18 | 19 | model = Model("robust product mix") 20 | 21 | x,rhs = {},{} 22 | for i in I: 23 | x[i] = model.addVar(vtype="C", name="x(%s)"%i) 24 | for k in K: 25 | rhs[k] = model.addVar(vtype="C", name="rhs(%s)"%k) 26 | 27 | model.addCons(quicksum(x[i] for i in I) == 1) 28 | for k in K: 29 | model.addCons(rhs[k] == -LB[k]+ quicksum(a[i,k]*x[i] for i in I) ) 30 | model.addCons(quicksum(epsilon*epsilon*x[i]*x[i] for i in I) <= rhs[k]*rhs[k]) 31 | 32 | model.setObjective(quicksum(p[i]*x[i] for i in I), "minimize") 33 | 34 | model.data = x,rhs 35 | return model 36 | 37 | 38 | def make_data(): 39 | """creates example data set""" 40 | a = { (1,1):.25, (1,2):.15, (1,3):.2, 41 | (2,1):.3, (2,2):.3, (2,3):.1, 42 | (3,1):.15, (3,2):.65, (3,3):.05, 43 | (4,1):.1, (4,2):.05, (4,3):.8 44 | } 45 | epsilon = 0.01 46 | I,p = multidict({1:5, 2:6, 3:8, 4:20}) 47 | K,LB = multidict({1:.2, 2:.3, 3:.2}) 48 | return I,K,a,p,epsilon,LB 49 | 50 | 51 | if __name__ == "__main__": 52 | I,K,a,p,epsilon,LB = make_data() 53 | model = prodmix(I,K,a,p,epsilon,LB) 54 | model.optimize() 55 | print("Objective value:",model.getObjVal()) 56 | x,rhs = model.data 57 | for i in I: 58 | print(i,": ",model.getVal(x[i])) 59 | -------------------------------------------------------------------------------- /pyscipopt/examples/finished/ssp.py: -------------------------------------------------------------------------------- 1 | ##@file ssp.py 2 | #@brief model for the stable set problem 3 | """ 4 | Copyright (c) by Joao Pedro PEDROSO and Mikio KUBO, 2012 5 | """ 6 | 7 | from pyscipopt import Model, quicksum, multidict 8 | 9 | def ssp(V,E): 10 | """ssp -- model for the stable set problem 11 | Parameters: 12 | - V: set/list of nodes in the graph 13 | - E: set/list of edges in the graph 14 | Returns a model, ready to be solved. 15 | """ 16 | model = Model("ssp") 17 | 18 | x = {} 19 | for i in V: 20 | x[i] = model.addVar(vtype="B", name="x(%s)"%i) 21 | 22 | for (i,j) in E: 23 | model.addCons(x[i] + x[j] <= 1, "Edge(%s,%s)"%(i,j)) 24 | 25 | model.setObjective(quicksum(x[i] for i in V), "maximize") 26 | 27 | model.data = x 28 | return model 29 | 30 | 31 | import random 32 | def make_data(n,prob): 33 | """make_data: prepare data for a random graph 34 | Parameters: 35 | - n: number of vertices 36 | - prob: probability of existence of an edge, for each pair of vertices 37 | Returns a tuple with a list of vertices and a list edges. 38 | """ 39 | V = range(1,n+1) 40 | E = [(i,j) for i in V for j in V if i < j and random.random() < prob] 41 | return V,E 42 | 43 | 44 | if __name__ == "__main__": 45 | random.seed(1) 46 | V,E = make_data(100,.5) 47 | 48 | model = ssp(V,E) 49 | model.optimize() 50 | print("Optimal value:", model.getObjVal()) 51 | 52 | x = model.data 53 | print("Maximum stable set:") 54 | print([i for i in V if model.getVal(x[i]) > 0.5]) 55 | -------------------------------------------------------------------------------- /pyscipopt/examples/finished/sudoku.py: -------------------------------------------------------------------------------- 1 | ##@file sudoku.py 2 | #@brief Simple example of modeling a Sudoku as a binary program 3 | 4 | #!/usr/bin/env python 5 | 6 | from pyscipopt import Model, quicksum 7 | 8 | # initial Sudoku values 9 | init = [5, 3, 0, 0, 7, 0, 0, 0, 0, 10 | 6, 0, 0, 1, 9, 5, 0, 0, 0, 11 | 0, 9, 8, 0, 0, 0, 0, 6, 0, 12 | 8, 0, 0, 0, 6, 0, 0, 0, 3, 13 | 4, 0, 0, 8, 0, 3, 0, 0, 1, 14 | 7, 0, 0, 0, 2, 0, 0, 0, 6, 15 | 0, 6, 0, 0, 0, 0, 2, 8, 0, 16 | 0, 0, 0, 4, 1, 9, 0, 0, 5, 17 | 0, 0, 0, 0, 8, 0, 0, 7, 9] 18 | 19 | m = Model() 20 | 21 | # create a binary variable for every field and value 22 | x = {} 23 | for i in range(9): 24 | for j in range(9): 25 | for k in range(9): 26 | name = str(i)+','+str(j)+','+str(k) 27 | x[i,j,k] = m.addVar(name, vtype='B') 28 | 29 | # fill in initial values 30 | for i in range(9): 31 | for j in range(9): 32 | if init[j + 9*i] != 0: 33 | m.addCons(x[i,j,init[j + 9*i]-1] == 1) 34 | 35 | # only one digit in every field 36 | for i in range(9): 37 | for j in range(9): 38 | m.addCons(quicksum(x[i,j,k] for k in range(9)) == 1) 39 | 40 | # set up row and column constraints 41 | for ind in range(9): 42 | for k in range(9): 43 | m.addCons(quicksum(x[ind,j,k] for j in range(9)) == 1) 44 | m.addCons(quicksum(x[i,ind,k] for i in range(9)) == 1) 45 | 46 | # set up square constraints 47 | for row in range(3): 48 | for col in range(3): 49 | for k in range(9): 50 | m.addCons(quicksum(x[i+3*row, j+3*col, k] for i in range(3) for j in range(3)) == 1) 51 | 52 | m.hideOutput() 53 | m.optimize() 54 | 55 | if m.getStatus() != 'optimal': 56 | print('Sudoku is not feasible!') 57 | else: 58 | print('\nSudoku solution:\n') 59 | sol = {} 60 | for i in range(9): 61 | out = '' 62 | for j in range(9): 63 | for k in range(9): 64 | if m.getVal(x[i,j,k]) == 1: 65 | sol[i,j] = k+1 66 | out += str(sol[i,j]) + ' ' 67 | print(out) 68 | -------------------------------------------------------------------------------- /pyscipopt/examples/finished/transp.py: -------------------------------------------------------------------------------- 1 | ##@file transp.py 2 | #@brief a model for the transportation problem 3 | """ 4 | Model for solving a transportation problem: 5 | minimize the total transportation cost for satisfying demand at 6 | customers, from capacitated facilities. 7 | 8 | Copyright (c) by Joao Pedro PEDROSO and Mikio KUBO, 2012 9 | """ 10 | from pyscipopt import Model, quicksum, multidict 11 | 12 | def transp(I,J,c,d,M): 13 | """transp -- model for solving the transportation problem 14 | Parameters: 15 | I - set of customers 16 | J - set of facilities 17 | c[i,j] - unit transportation cost on arc (i,j) 18 | d[i] - demand at node i 19 | M[j] - capacity 20 | Returns a model, ready to be solved. 21 | """ 22 | 23 | model = Model("transportation") 24 | 25 | # Create variables 26 | x = {} 27 | 28 | for i in I: 29 | for j in J: 30 | x[i,j] = model.addVar(vtype="C", name="x(%s,%s)" % (i, j)) 31 | 32 | # Demand constraints 33 | for i in I: 34 | model.addCons(quicksum(x[i,j] for j in J if (i,j) in x) == d[i], name="Demand(%s)" % i) 35 | 36 | # Capacity constraints 37 | for j in J: 38 | model.addCons(quicksum(x[i,j] for i in I if (i,j) in x) <= M[j], name="Capacity(%s)" % j) 39 | 40 | # Objective 41 | model.setObjective(quicksum(c[i,j]*x[i,j] for (i,j) in x), "minimize") 42 | 43 | model.optimize() 44 | 45 | model.data = x 46 | return model 47 | 48 | 49 | def make_inst1(): 50 | """creates example data set 1""" 51 | I,d = multidict({1:80, 2:270, 3:250 , 4:160, 5:180}) # demand 52 | J,M = multidict({1:500, 2:500, 3:500}) # capacity 53 | c = {(1,1):4, (1,2):6, (1,3):9, # cost 54 | (2,1):5, (2,2):4, (2,3):7, 55 | (3,1):6, (3,2):3, (3,3):4, 56 | (4,1):8, (4,2):5, (4,3):3, 57 | (5,1):10, (5,2):8, (5,3):4, 58 | } 59 | return I,J,c,d,M 60 | 61 | 62 | def make_inst2(): 63 | """creates example data set 2""" 64 | I,d = multidict({1:45, 2:20, 3:30 , 4:30}) # demand 65 | J,M = multidict({1:35, 2:50, 3:40}) # capacity 66 | c = {(1,1):8, (1,2):9, (1,3):14 , # {(customer,factory) : cost} 67 | (2,1):6, (2,2):12, (2,3):9 , 68 | (3,1):10, (3,2):13, (3,3):16 , 69 | (4,1):9, (4,2):7, (4,3):5 , 70 | } 71 | return I,J,c,d,M 72 | 73 | 74 | if __name__ == "__main__": 75 | I,J,c,d,M = make_inst1(); 76 | # I,J,c,d,M = make_inst2(); 77 | model = transp(I,J,c,d,M) 78 | model.optimize() 79 | 80 | print("Optimal value:", model.getObjVal()) 81 | 82 | EPS = 1.e-6 83 | x = model.data 84 | 85 | for (i,j) in x: 86 | if model.getVal(x[i,j]) > EPS: 87 | print("sending quantity %10s from factory %3s to customer %3s" % (model.getVal(x[i,j]),j,i)) 88 | -------------------------------------------------------------------------------- /pyscipopt/examples/finished/transp_nofn.py: -------------------------------------------------------------------------------- 1 | ##@file transp_nofn.py 2 | #@brief a model for the transportation problem 3 | """ 4 | Model for solving a transportation problem: 5 | minimize the total transportation cost for satisfying demand at 6 | customers, from capacitated facilities. 7 | 8 | Data: 9 | I - set of customers 10 | J - set of facilities 11 | c[i,j] - unit transportation cost on arc (i,j) 12 | d[i] - demand at node i 13 | M[j] - capacity 14 | 15 | Copyright (c) by Joao Pedro PEDROSO and Mikio KUBO, 2012 16 | """ 17 | 18 | from pyscipopt import Model, quicksum, multidict 19 | 20 | d = {1:80, 2:270, 3:250 , 4:160, 5:180} # demand 21 | I = d.keys() 22 | 23 | M = {1:500, 2:500, 3:500} # capacity 24 | J = M.keys() 25 | 26 | c = {(1,1):4, (1,2):6, (1,3):9, # cost 27 | (2,1):5, (2,2):4, (2,3):7, 28 | (3,1):6, (3,2):3, (3,3):4, 29 | (4,1):8, (4,2):5, (4,3):3, 30 | (5,1):10, (5,2):8, (5,3):4, 31 | } 32 | 33 | model = Model("transportation") 34 | 35 | # Create variables 36 | x = {} 37 | 38 | for i in I: 39 | for j in J: 40 | x[i,j] = model.addVar(vtype="C", name="x(%s,%s)" % (i,j)) 41 | 42 | # Demand constraints 43 | for i in I: 44 | model.addCons(sum(x[i,j] for j in J if (i,j) in x) == d[i], name="Demand(%s)" % i) 45 | 46 | # Capacity constraints 47 | for j in J: 48 | model.addCons(sum(x[i,j] for i in I if (i,j) in x) <= M[j], name="Capacity(%s)" % j) 49 | 50 | # Objective 51 | model.setObjective(quicksum(c[i,j]*x[i,j] for (i,j) in x), "minimize") 52 | 53 | model.optimize() 54 | 55 | print("Optimal value:", model.getObjVal()) 56 | 57 | EPS = 1.e-6 58 | 59 | for (i,j) in x: 60 | if model.getVal(x[i,j]) > EPS: 61 | print("sending quantity %10s from factory %3s to customer %3s" % (model.getVal(x[i,j]),j,i)) 62 | -------------------------------------------------------------------------------- /pyscipopt/examples/tutorial/logical.py: -------------------------------------------------------------------------------- 1 | ##@file tutorial/logical.py 2 | #@brief Tutorial example on how to use AND/OR/XOR constraints. 3 | """ 4 | N.B.: standard SCIP XOR constraint works differently from AND/OR by design. 5 | The constraint is set with a boolean rhs instead of an integer resultant. 6 | cf. http://listserv.zib.de/pipermail/scip/2018-May/003392.html 7 | A workaround to get the resultant as variable is here proposed. 8 | 9 | Public Domain, WTFNMFPL Public Licence 10 | """ 11 | from pyscipopt import Model 12 | from pyscipopt import quicksum 13 | 14 | def _init(): 15 | model = Model() 16 | model.hideOutput() 17 | x = model.addVar("x","B") 18 | y = model.addVar("y","B") 19 | z = model.addVar("z","B") 20 | return model, x, y, z 21 | 22 | def _optimize(name, m): 23 | m.optimize() 24 | print("* %s constraint *" % name) 25 | objSet = bool(m.getObjective().terms.keys()) 26 | print("* Is objective set? %s" % objSet) 27 | if objSet: 28 | print("* Sense: %s" % m.getObjectiveSense()) 29 | status = m.getStatus() 30 | print("* Model status: %s" % status) 31 | if status == 'optimal': 32 | for v in m.getVars(): 33 | if v.name != "n": 34 | print("%s: %d" % (v, round(m.getVal(v)))) 35 | else: 36 | print("* No variable is printed if model status is not optimal") 37 | print("") 38 | 39 | def and_constraint(v=1, sense="minimize"): 40 | """ AND constraint """ 41 | assert v in [0,1], "v must be 0 or 1 instead of %s" % v.__repr__() 42 | model, x, y, z = _init() 43 | r = model.addVar("r", "B") 44 | model.addConsAnd([x,y,z], r) 45 | model.addCons(x==v) 46 | model.setObjective(r, sense=sense) 47 | _optimize("AND", model) 48 | 49 | 50 | def or_constraint(v=0, sense="maximize"): 51 | """ OR constraint""" 52 | assert v in [0,1], "v must be 0 or 1 instead of %s" % v.__repr__() 53 | model, x, y, z = _init() 54 | r = model.addVar("r", "B") 55 | model.addConsOr([x,y,z], r) 56 | model.addCons(x==v) 57 | model.setObjective(r, sense=sense) 58 | _optimize("OR", model) 59 | 60 | def xors_constraint(v=1): 61 | """ XOR (r as boolean) standard constraint""" 62 | assert v in [0,1], "v must be 0 or 1 instead of %s" % v.__repr__() 63 | model, x, y, z = _init() 64 | r = True 65 | model.addConsXor([x,y,z], r) 66 | model.addCons(x==v) 67 | _optimize("Standard XOR (as boolean)", model) 68 | 69 | def xorc_constraint(v=0, sense="maximize"): 70 | """ XOR (r as variable) custom constraint""" 71 | assert v in [0,1], "v must be 0 or 1 instead of %s" % v.__repr__() 72 | model, x, y, z = _init() 73 | r = model.addVar("r", "B") 74 | n = model.addVar("n", "I") # auxiliary 75 | model.addCons(r+quicksum([x,y,z]) == 2*n) 76 | model.addCons(x==v) 77 | model.setObjective(r, sense=sense) 78 | _optimize("Custom XOR (as variable)", model) 79 | 80 | if __name__ == "__main__": 81 | and_constraint() 82 | or_constraint() 83 | xors_constraint() 84 | xorc_constraint() 85 | 86 | -------------------------------------------------------------------------------- /pyscipopt/examples/tutorial/puzzle.py: -------------------------------------------------------------------------------- 1 | ##@file tutorial/puzzle.py 2 | #@brief solve a simple puzzle using SCIP 3 | """ 4 | On a beach there are octopuses, turtles and cranes. 5 | The total number of legs of all animals is 80, while the number of heads is 32. 6 | What are the minimum numbers of turtles and octopuses, respectively? 7 | 8 | Copyright (c) by Joao Pedro PEDROSO and Mikio KUBO, 2012 9 | """ 10 | from pyscipopt import Model 11 | 12 | model = Model("puzzle") 13 | x = model.addVar(vtype="I", name="octopusses") 14 | y = model.addVar(vtype="I", name="turtles") 15 | z = model.addVar(vtype="I", name="cranes") 16 | 17 | # Set up constraint for number of heads 18 | model.addCons(x + y + z == 32, name="Heads") 19 | 20 | # Set up constraint for number of legs 21 | model.addCons(8*x + 4*y + 2*z == 80, name="Legs") 22 | 23 | # Set objective function 24 | model.setObjective(x + y, "minimize") 25 | 26 | model.hideOutput() 27 | model.optimize() 28 | 29 | #solution = model.getBestSol() 30 | 31 | print("Optimal value:", model.getObjVal()) 32 | print((x.name, y.name, z.name), " = ", (model.getVal(x), model.getVal(y), model.getVal(z))) 33 | -------------------------------------------------------------------------------- /pyscipopt/examples/unfinished/eoq_soco.py: -------------------------------------------------------------------------------- 1 | """ 2 | eoq_soco.py: model to the multi-item economic ordering quantity problem. 3 | 4 | Approach: use second-order cone optimization. 5 | 6 | Copyright (c) by Joao Pedro PEDROSO, Masahiro MURAMATSU and Mikio KUBO, 2012 7 | """ 8 | from pyscipopt import Model, quicksum, multidict 9 | 10 | def eoq_soco(I,F,h,d,w,W): 11 | """eoq_soco -- multi-item capacitated economic ordering quantity model using soco 12 | Parameters: 13 | - I: set of items 14 | - F[i]: ordering cost for item i 15 | - h[i]: holding cost for item i 16 | - d[i]: demand for item i 17 | - w[i]: unit weight for item i 18 | - W: capacity (limit on order quantity) 19 | Returns a model, ready to be solved. 20 | """ 21 | model = Model("EOQ model using SOCO") 22 | 23 | T,c = {},{} 24 | for i in I: 25 | T[i] = model.addVar(vtype="C", name="T(%s)"%i) # cycle time for item i 26 | c[i] = model.addVar(vtype="C", name="c(%s)"%i) # total cost for item i 27 | 28 | for i in I: 29 | model.addCons(F[i] <= c[i]*T[i]) 30 | 31 | model.addCons(quicksum(w[i]*d[i]*T[i] for i in I) <= W) 32 | 33 | model.setObjective(quicksum(c[i] + h[i]*d[i]*T[i]*0.5 for i in I), "minimize") 34 | 35 | model.data = T,c 36 | return model 37 | 38 | 39 | 40 | if __name__ == "__main__": 41 | # multiple item EOQ 42 | I,F,h,d,w = multidict( 43 | {1:[300,10,10,20], 44 | 2:[300,10,30,40], 45 | 3:[300,10,50,10]} 46 | ) 47 | W = 2000 48 | model = eoq_soco(I,F,h,d,w,W) 49 | model.optimize() 50 | 51 | T,c = model.data 52 | EPS = 1.e-6 53 | print("%5s\t%8s\t%8s" % ("i","T[i]","c[i]")) 54 | for i in I: 55 | print("%5s\t%8g\t%8g" % (i,model.getVal(T[i]),model.getVal(c[i]))) 56 | print 57 | print("Optimal value:", model.getObjVal()) 58 | -------------------------------------------------------------------------------- /pyscipopt/examples/unfinished/pareto_front.py: -------------------------------------------------------------------------------- 1 | """ 2 | pareto_front.py: tools for building a pareto front in multi-objective optimization 3 | 4 | Copyright (c) by Joao Pedro PEDROSO and Mikio KUBO, 2012 5 | """ 6 | 7 | def dominates(a,b): 8 | dominating = False 9 | for i in range(len(a)): 10 | if a[i] > b[i]: 11 | return False 12 | if a[i] < b[i]: 13 | dominating = True 14 | return dominating 15 | 16 | 17 | def is_dominated(a,front): 18 | for b in front: 19 | if dominates(b,a): 20 | return True 21 | return False 22 | 23 | def pareto_front(cand): 24 | front = set([]) 25 | for i in cand: 26 | add_i = True 27 | for j in list(front): 28 | if dominates(i,j): 29 | front.remove(j) 30 | if dominates(j,i): 31 | add_i = False 32 | if add_i: 33 | front.add(i) 34 | front = list(front) 35 | front.sort() 36 | return front 37 | 38 | 39 | if __name__ == "__main__": 40 | import random 41 | # random.seed(1) 42 | cand = [(random.random()**.25,random.random()**.25) for i in range(100)] 43 | import matplotlib.pyplot as plt 44 | for (x,y) in cand: 45 | plt.plot(x,y,"bo") 46 | 47 | front = pareto_front(cand) 48 | plt.plot([x for (x,y) in front], [y for (x,y) in front]) 49 | plt.show() 50 | -------------------------------------------------------------------------------- /pyscipopt/examples/unfinished/portfolio_soco.py: -------------------------------------------------------------------------------- 1 | """ 2 | portfolio_soco.py: modified markowitz model for portfolio optimization. 3 | 4 | Approach: use second-order cone optimization. 5 | 6 | Copyright (c) by Joao Pedro PEDROSO, Masahiro MURAMATSU and Mikio KUBO, 2012 7 | """ 8 | from pyscipopt import Model, quicksum, multidict 9 | 10 | import math 11 | def phi_inv(p): 12 | """phi_inv: inverse of gaussian (normal) CDF 13 | Source: 14 | Handbook of Mathematical Functions 15 | Dover Books on Mathematics 16 | Milton Abramowitz and Irene A. Stegun (Editors) 17 | Formula 26.2.23. 18 | """ 19 | if p < 0.5: 20 | t = math.sqrt(-2.0*math.log(p)) 21 | return ((0.010328*t + 0.802853)*t + 2.515517)/(((0.001308*t + 0.189269)*t + 1.432788)*t + 1.0) - t 22 | else: 23 | t = math.sqrt(-2.0*math.log(1.0-p)) 24 | return t - ((0.010328*t + 0.802853)*t + 2.515517)/(((0.001308*t + 0.189269)*t + 1.432788)*t + 1.0) 25 | 26 | 27 | def p_portfolio(I,sigma,r,alpha,beta): 28 | """p_portfolio -- modified markowitz model for portfolio optimization. 29 | Parameters: 30 | - I: set of items 31 | - sigma[i]: standard deviation of item i 32 | - r[i]: revenue of item i 33 | - alpha: acceptance threshold 34 | - beta: desired confidence level 35 | Returns a model, ready to be solved. 36 | """ 37 | 38 | model = Model("p_portfolio") 39 | 40 | x = {} 41 | for i in I: 42 | x[i] = model.addVar(vtype="C", name="x(%s)"%i) # quantity of i to buy 43 | rho = model.addVar(vtype="C", name="rho") 44 | rhoaux = model.addVar(vtype="C", name="rhoaux") 45 | 46 | model.addCons(rho == quicksum(r[i]*x[i] for i in I)) 47 | model.addCons(quicksum(x[i] for i in I) == 1) 48 | 49 | model.addCons(rhoaux == (alpha - rho)*(1/phi_inv(beta))) #todo 50 | model.addCons(quicksum(sigma[i]**2 * x[i] * x[i] for i in I) <= rhoaux * rhoaux) 51 | 52 | model.setObjective(rho, "maximize") 53 | 54 | model.data = x 55 | return model 56 | 57 | 58 | 59 | if __name__ == "__main__": 60 | # portfolio 61 | I,sigma,r = multidict( 62 | {1:[0.07,1.01], 63 | 2:[0.09,1.05], 64 | 3:[0.1,1.08], 65 | 4:[0.2,1.10], 66 | 5:[0.3,1.20]} 67 | ) 68 | alpha = 0.95 69 | # beta = 0.1 70 | 71 | for beta in [0.1, 0.05, 0.02, 0.01]: 72 | print("\n\n\nbeta:",beta,"phi inv:",phi_inv(beta)) 73 | model = p_portfolio(I,sigma,r,alpha,beta) 74 | model.optimize() 75 | 76 | x = model.data 77 | EPS = 1.e-6 78 | print("Investment:") 79 | print("%5s\t%8s" % ("i","x[i]")) 80 | for i in I: 81 | print("%5s\t%8g" % (i,model.getVal(x[i]))) 82 | 83 | print("Objective:",model.getObjVal()) 84 | -------------------------------------------------------------------------------- /pyscipopt/generate-docs.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # get repo info 4 | GH_REPO_ORG=`echo $TRAVIS_REPO_SLUG | cut -d "/" -f 1` 5 | GH_REPO_NAME=`echo $TRAVIS_REPO_SLUG | cut -d "/" -f 2` 6 | GH_REPO_REF="github.com/$GH_REPO_ORG/$GH_REPO_NAME.git" 7 | 8 | #get SCIP TAGFILE 9 | echo "Downloading SCIP tagfile to create links to SCIP docu" 10 | wget -q -O docs/scip.tag https://scip.zib.de/doc/scip.tag 11 | 12 | #get version number for doxygen 13 | export VERSION_NUMBER=$(grep "__version__" src/pyscipopt/__init__.py | cut -d ' ' -f 3 | tr --delete \') 14 | 15 | # generate html documentation in docs/html 16 | echo "Generating documentation" 17 | doxygen docs/doxy 18 | 19 | # fix broken links to SCIP online documentation 20 | # If you set `HTML_FILE_EXTENSION = .php` in doc/doxy you don't need the following sed commands 21 | sed -i "s@\.php\.html@.php@g" docs/html/*.* docs/html/search/*.* 22 | sed -i -E "s@(scip.zib.de.*)\.html@\1.php@g" docs/html/*.* docs/html/search/*.* 23 | 24 | # clone the docu branch 25 | git clone -b gh-pages git@github.com:${GH_REPO_ORG}/${GH_REPO_NAME} code_docs 26 | cd code_docs 27 | 28 | ##### Configure git. 29 | # Set the push default to simple i.e. push only the current branch. 30 | git config --global push.default simple 31 | # Pretend to be an user called Travis CI. 32 | git config user.name "Travis Deployment Bot" 33 | git config user.email "deploy@travis-ci.org" 34 | 35 | # go back to first commit 36 | git reset --hard `git rev-list --max-parents=0 --abbrev-commit HEAD` 37 | 38 | # copy new docu files to gh-pages 39 | mkdir -p docs/html 40 | mv ../docs/html/* docs/html/ 41 | git add --all 42 | git commit -m "Deploy docs to GitHub Pages, Travis build: ${TRAVIS_BUILD_NUMBER}" -m "Commit: ${TRAVIS_COMMIT}" 43 | 44 | # Force push to the remote gh-pages branch. 45 | # The ouput is redirected to /dev/null to hide any sensitive credential data 46 | # that might otherwise be exposed. 47 | git push --force git@github.com:${GH_REPO_ORG}/${GH_REPO_NAME} > /dev/null 2>&1 48 | -------------------------------------------------------------------------------- /pyscipopt/setup.cfg: -------------------------------------------------------------------------------- 1 | [tool:pytest] 2 | norecursedirs = check 3 | testpaths = tests 4 | 5 | [bdist_wheel] 6 | universal = 1 7 | -------------------------------------------------------------------------------- /pyscipopt/src/pyscipopt/Multidict.py: -------------------------------------------------------------------------------- 1 | ##@file Multidict.py 2 | #@brief Implementation of Multidictionaries 3 | def multidict(D): 4 | '''creates a multidictionary''' 5 | keys = list(D.keys()) 6 | if len(keys) == 0: 7 | return [[]] 8 | try: 9 | N = len(D[keys[0]]) 10 | islist = True 11 | except: 12 | N = 1 13 | islist = False 14 | dlist = [dict() for d in range(N)] 15 | for k in keys: 16 | if islist: 17 | for i in range(N): 18 | dlist[i][k] = D[k][i] 19 | else: 20 | dlist[0][k] = D[k] 21 | return [keys]+dlist 22 | -------------------------------------------------------------------------------- /pyscipopt/src/pyscipopt/__init__.py: -------------------------------------------------------------------------------- 1 | __version__ = '3.0.2' 2 | 3 | # required for Python 3.8 on Windows 4 | import os 5 | if hasattr(os, 'add_dll_directory'): 6 | os.add_dll_directory(os.path.join(os.getenv('SCIPOPTDIR'), 'bin')) 7 | 8 | # export user-relevant objects: 9 | from pyscipopt.Multidict import multidict 10 | from pyscipopt.scip import Model 11 | from pyscipopt.scip import Benders 12 | from pyscipopt.scip import Benderscut 13 | from pyscipopt.scip import Branchrule 14 | from pyscipopt.scip import Nodesel 15 | from pyscipopt.scip import Conshdlr 16 | from pyscipopt.scip import Eventhdlr 17 | from pyscipopt.scip import Heur 18 | from pyscipopt.scip import Presol 19 | from pyscipopt.scip import Pricer 20 | from pyscipopt.scip import Prop 21 | from pyscipopt.scip import Sepa 22 | from pyscipopt.scip import LP 23 | from pyscipopt.scip import Expr 24 | from pyscipopt.scip import quicksum 25 | from pyscipopt.scip import quickprod 26 | from pyscipopt.scip import exp 27 | from pyscipopt.scip import log 28 | from pyscipopt.scip import sqrt 29 | from pyscipopt.scip import PY_SCIP_RESULT as SCIP_RESULT 30 | from pyscipopt.scip import PY_SCIP_PARAMSETTING as SCIP_PARAMSETTING 31 | from pyscipopt.scip import PY_SCIP_PARAMEMPHASIS as SCIP_PARAMEMPHASIS 32 | from pyscipopt.scip import PY_SCIP_STATUS as SCIP_STATUS 33 | from pyscipopt.scip import PY_SCIP_STAGE as SCIP_STAGE 34 | from pyscipopt.scip import PY_SCIP_PROPTIMING as SCIP_PROPTIMING 35 | from pyscipopt.scip import PY_SCIP_PRESOLTIMING as SCIP_PRESOLTIMING 36 | from pyscipopt.scip import PY_SCIP_HEURTIMING as SCIP_HEURTIMING 37 | from pyscipopt.scip import PY_SCIP_EVENTTYPE as SCIP_EVENTTYPE 38 | from pyscipopt.scip import PY_SCIP_LPSOLSTAT as SCIP_LPSOLSTAT 39 | from pyscipopt.scip import PY_SCIP_BRANCHDIR as SCIP_BRANCHDIR 40 | from pyscipopt.scip import PY_SCIP_BENDERSENFOTYPE as SCIP_BENDERSENFOTYPE 41 | from pyscipopt.scip import PY_SCIP_ROWORIGINTYPE as SCIP_ROWORIGINTYPE 42 | -------------------------------------------------------------------------------- /pyscipopt/src/pyscipopt/benderscut.pxi: -------------------------------------------------------------------------------- 1 | ##@file benderscut.pxi 2 | #@brief Base class of the Benderscut Plugin 3 | cdef class Benderscut: 4 | cdef public Model model 5 | cdef public Benders benders 6 | cdef public str name 7 | 8 | def benderscutfree(self): 9 | pass 10 | 11 | def benderscutinit(self): 12 | pass 13 | 14 | def benderscutexit(self): 15 | pass 16 | 17 | def benderscutinitsol(self): 18 | pass 19 | 20 | def benderscutexitsol(self): 21 | pass 22 | 23 | def benderscutexec(self, solution, probnumber, enfotype): 24 | print("python error in benderscutexec: this method needs to be implemented") 25 | return {} 26 | 27 | cdef SCIP_RETCODE PyBenderscutCopy (SCIP* scip, SCIP_BENDERS* benders, SCIP_BENDERSCUT* benderscut): 28 | return SCIP_OKAY 29 | 30 | cdef SCIP_RETCODE PyBenderscutFree (SCIP* scip, SCIP_BENDERSCUT* benderscut): 31 | cdef SCIP_BENDERSCUTDATA* benderscutdata 32 | benderscutdata = SCIPbenderscutGetData(benderscut) 33 | PyBenderscut = benderscutdata 34 | PyBenderscut.benderscutfree() 35 | Py_DECREF(PyBenderscut) 36 | return SCIP_OKAY 37 | 38 | cdef SCIP_RETCODE PyBenderscutInit (SCIP* scip, SCIP_BENDERSCUT* benderscut): 39 | cdef SCIP_BENDERSCUTDATA* benderscutdata 40 | benderscutdata = SCIPbenderscutGetData(benderscut) 41 | PyBenderscut = benderscutdata 42 | PyBenderscut.benderscutinit() 43 | return SCIP_OKAY 44 | 45 | cdef SCIP_RETCODE PyBenderscutExit (SCIP* scip, SCIP_BENDERSCUT* benderscut): 46 | cdef SCIP_BENDERSCUTDATA* benderscutdata 47 | benderscutdata = SCIPbenderscutGetData(benderscut) 48 | PyBenderscut = benderscutdata 49 | PyBenderscut.benderscutexit() 50 | return SCIP_OKAY 51 | 52 | cdef SCIP_RETCODE PyBenderscutInitsol (SCIP* scip, SCIP_BENDERSCUT* benderscut): 53 | cdef SCIP_BENDERSCUTDATA* benderscutdata 54 | benderscutdata = SCIPbenderscutGetData(benderscut) 55 | PyBenderscut = benderscutdata 56 | PyBenderscut.benderscutinitsol() 57 | return SCIP_OKAY 58 | 59 | cdef SCIP_RETCODE PyBenderscutExitsol (SCIP* scip, SCIP_BENDERSCUT* benderscut): 60 | cdef SCIP_BENDERSCUTDATA* benderscutdata 61 | benderscutdata = SCIPbenderscutGetData(benderscut) 62 | PyBenderscut = benderscutdata 63 | PyBenderscut.benderscutexitsol() 64 | return SCIP_OKAY 65 | 66 | cdef SCIP_RETCODE PyBenderscutExec (SCIP* scip, SCIP_BENDERS* benders, SCIP_BENDERSCUT* benderscut, SCIP_SOL* sol, int probnumber, SCIP_BENDERSENFOTYPE type, SCIP_RESULT* result): 67 | cdef SCIP_BENDERSCUTDATA* benderscutdata 68 | benderscutdata = SCIPbenderscutGetData(benderscut) 69 | PyBenderscut = benderscutdata 70 | if sol == NULL: 71 | solution = None 72 | else: 73 | solution = Solution.create(scip, sol) 74 | enfotype = type 75 | result_dict = PyBenderscut.benderscutexec(solution, probnumber, enfotype) 76 | result[0] = result_dict.get("result", result[0]) 77 | return SCIP_OKAY 78 | -------------------------------------------------------------------------------- /pyscipopt/src/pyscipopt/heuristic.pxi: -------------------------------------------------------------------------------- 1 | ##@file heuristic.pxi 2 | #@brief Base class of the Heuristics Plugin 3 | cdef class Heur: 4 | cdef public Model model 5 | cdef public str name 6 | 7 | def heurfree(self): 8 | '''calls destructor and frees memory of primal heuristic''' 9 | pass 10 | 11 | def heurinit(self): 12 | '''initializes primal heuristic''' 13 | pass 14 | 15 | def heurexit(self): 16 | '''calls exit method of primal heuristic''' 17 | pass 18 | 19 | def heurinitsol(self): 20 | '''informs primal heuristic that the branch and bound process is being started''' 21 | pass 22 | 23 | def heurexitsol(self): 24 | '''informs primal heuristic that the branch and bound process data is being freed''' 25 | pass 26 | 27 | def heurexec(self, heurtiming, nodeinfeasible): 28 | '''should the heuristic the executed at the given depth, frequency, timing,...''' 29 | print("python error in heurexec: this method needs to be implemented") 30 | return {} 31 | 32 | 33 | 34 | cdef SCIP_RETCODE PyHeurCopy (SCIP* scip, SCIP_HEUR* heur): 35 | return SCIP_OKAY 36 | 37 | cdef SCIP_RETCODE PyHeurFree (SCIP* scip, SCIP_HEUR* heur): 38 | cdef SCIP_HEURDATA* heurdata 39 | heurdata = SCIPheurGetData(heur) 40 | PyHeur = heurdata 41 | PyHeur.heurfree() 42 | Py_DECREF(PyHeur) 43 | return SCIP_OKAY 44 | 45 | cdef SCIP_RETCODE PyHeurInit (SCIP* scip, SCIP_HEUR* heur): 46 | cdef SCIP_HEURDATA* heurdata 47 | heurdata = SCIPheurGetData(heur) 48 | PyHeur = heurdata 49 | PyHeur.heurinit() 50 | return SCIP_OKAY 51 | 52 | cdef SCIP_RETCODE PyHeurExit (SCIP* scip, SCIP_HEUR* heur): 53 | cdef SCIP_HEURDATA* heurdata 54 | heurdata = SCIPheurGetData(heur) 55 | PyHeur = heurdata 56 | PyHeur.heurexit() 57 | return SCIP_OKAY 58 | 59 | cdef SCIP_RETCODE PyHeurInitsol (SCIP* scip, SCIP_HEUR* heur): 60 | cdef SCIP_HEURDATA* heurdata 61 | heurdata = SCIPheurGetData(heur) 62 | PyHeur = heurdata 63 | PyHeur.heurinitsol() 64 | return SCIP_OKAY 65 | 66 | cdef SCIP_RETCODE PyHeurExitsol (SCIP* scip, SCIP_HEUR* heur): 67 | cdef SCIP_HEURDATA* heurdata 68 | heurdata = SCIPheurGetData(heur) 69 | PyHeur = heurdata 70 | PyHeur.heurexitsol() 71 | return SCIP_OKAY 72 | 73 | cdef SCIP_RETCODE PyHeurExec (SCIP* scip, SCIP_HEUR* heur, SCIP_HEURTIMING heurtiming, SCIP_Bool nodeinfeasible, SCIP_RESULT* result): 74 | cdef SCIP_HEURDATA* heurdata 75 | heurdata = SCIPheurGetData(heur) 76 | PyHeur = heurdata 77 | result_dict = PyHeur.heurexec(heurtiming, nodeinfeasible) 78 | result[0] = result_dict.get("result", result[0]) 79 | return SCIP_OKAY 80 | -------------------------------------------------------------------------------- /pyscipopt/src/pyscipopt/relax.pxi: -------------------------------------------------------------------------------- 1 | ##@file relax.pxi 2 | #@brief Base class of the Relaxator Plugin 3 | cdef class Relax: 4 | cdef public Model model 5 | cdef public str name 6 | 7 | def relaxfree(self): 8 | '''calls destructor and frees memory of relaxation handler''' 9 | pass 10 | 11 | def relaxinit(self): 12 | '''initializes relaxation handler''' 13 | pass 14 | 15 | def relaxexit(self): 16 | '''calls exit method of relaxation handler''' 17 | pass 18 | 19 | def relaxinitsol(self): 20 | '''informs relaxaton handler that the branch and bound process is being started''' 21 | pass 22 | 23 | def relaxexitsol(self): 24 | '''informs relaxation handler that the branch and bound process data is being freed''' 25 | pass 26 | 27 | def relaxexec(self): 28 | '''callls execution method of relaxation handler''' 29 | print("python error in relaxexec: this method needs to be implemented") 30 | return{} 31 | 32 | 33 | cdef SCIP_RETCODE PyRelaxCopy (SCIP* scip, SCIP_RELAX* relax): 34 | return SCIP_OKAY 35 | 36 | cdef SCIP_RETCODE PyRelaxFree (SCIP* scip, SCIP_RELAX* relax): 37 | cdef SCIP_RELAXDATA* relaxdata 38 | relaxdata = SCIPrelaxGetData(relax) 39 | PyRelax = relaxdata 40 | PyRelax.relaxfree() 41 | Py_DECREF(PyRelax) 42 | return SCIP_OKAY 43 | 44 | cdef SCIP_RETCODE PyRelaxInit (SCIP* scip, SCIP_RELAX* relax): 45 | cdef SCIP_RELAXDATA* relaxdata 46 | relaxdata = SCIPrelaxGetData(relax) 47 | PyRelax = relaxdata 48 | PyRelax.relaxinit() 49 | return SCIP_OKAY 50 | 51 | cdef SCIP_RETCODE PyRelaxExit (SCIP* scip, SCIP_RELAX* relax): 52 | cdef SCIP_RELAXDATA* relaxdata 53 | relaxdata = SCIPrelaxGetData(relax) 54 | PyRelax = relaxdata 55 | PyRelax.relaxexit() 56 | return SCIP_OKAY 57 | 58 | cdef SCIP_RETCODE PyRelaxInitsol (SCIP* scip, SCIP_RELAX* relax): 59 | cdef SCIP_RELAXDATA* relaxdata 60 | relaxdata = SCIPrelaxGetData(relax) 61 | PyRelax = relaxdata 62 | PyRelax.relaxinitsol() 63 | return SCIP_OKAY 64 | 65 | cdef SCIP_RETCODE PyRelaxExitsol (SCIP* scip, SCIP_RELAX* relax): 66 | cdef SCIP_RELAXDATA* relaxdata 67 | relaxdata = SCIPrelaxGetData(relax) 68 | PyRelax = relaxdata 69 | PyRelax.relaxexitsol() 70 | return SCIP_OKAY 71 | 72 | cdef SCIP_RETCODE PyRelaxExec (SCIP* scip, SCIP_RELAX* relax, SCIP_Real* lowerbound, SCIP_RESULT* result): 73 | cdef SCIP_RELAXDATA* relaxdata 74 | relaxdata = SCIPrelaxGetData(relax) 75 | PyRelax = relaxdata 76 | PyRelax.relaxexec() 77 | return SCIP_OKAY 78 | 79 | -------------------------------------------------------------------------------- /pyscipopt/tests/test_copy.py: -------------------------------------------------------------------------------- 1 | from pyscipopt import Model 2 | 3 | def test_copy(): 4 | # create solver instance 5 | s = Model() 6 | 7 | # add some variables 8 | x = s.addVar("x", vtype = 'C', obj = 1.0) 9 | y = s.addVar("y", vtype = 'C', obj = 2.0) 10 | s.setObjective(4.0 * y, clear = False) 11 | 12 | c = s.addCons(x + 2 * y >= 1.0) 13 | 14 | s2 = Model(sourceModel=s) 15 | 16 | # solve problems 17 | s.optimize() 18 | s2.optimize() 19 | 20 | assert s.getObjVal() == s2.getObjVal() 21 | 22 | if __name__ == "__main__": 23 | test_copy() 24 | -------------------------------------------------------------------------------- /pyscipopt/tests/test_event.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | from pyscipopt import Model, Eventhdlr, SCIP_RESULT, SCIP_EVENTTYPE, SCIP_PARAMSETTING 4 | 5 | calls = [] 6 | 7 | class MyEvent(Eventhdlr): 8 | 9 | def eventinit(self): 10 | calls.append('eventinit') 11 | self.model.catchEvent(SCIP_EVENTTYPE.FIRSTLPSOLVED, self) 12 | 13 | def eventexit(self): 14 | calls.append('eventexit') 15 | self.model.dropEvent(SCIP_EVENTTYPE.FIRSTLPSOLVED, self) 16 | 17 | def eventexec(self, event): 18 | calls.append('eventexec') 19 | assert event.getType() == SCIP_EVENTTYPE.FIRSTLPSOLVED 20 | assert event.getNode().getNumber() == 1 21 | assert event.getNode().getParent() is None 22 | 23 | 24 | def test_event(): 25 | # create solver instance 26 | s = Model() 27 | s.hideOutput() 28 | s.setPresolve(SCIP_PARAMSETTING.OFF) 29 | eventhdlr = MyEvent() 30 | s.includeEventhdlr(eventhdlr, "TestFirstLPevent", "python event handler to catch FIRSTLPEVENT") 31 | 32 | # add some variables 33 | x = s.addVar("x", obj=1.0) 34 | y = s.addVar("y", obj=2.0) 35 | 36 | # add some constraint 37 | s.addCons(x + 2*y >= 5) 38 | # solve problem 39 | s.optimize() 40 | 41 | # print solution 42 | assert round(s.getVal(x)) == 5.0 43 | assert round(s.getVal(y)) == 0.0 44 | 45 | del s 46 | 47 | assert 'eventinit' in calls 48 | assert 'eventexit' in calls 49 | assert 'eventexec' in calls 50 | assert len(calls) == 3 51 | 52 | if __name__ == "__main__": 53 | test_event() 54 | -------------------------------------------------------------------------------- /pyscipopt/tests/test_heur.py: -------------------------------------------------------------------------------- 1 | import gc 2 | import weakref 3 | 4 | import pytest 5 | 6 | from pyscipopt import Model, Heur, SCIP_RESULT, SCIP_PARAMSETTING, SCIP_HEURTIMING 7 | from pyscipopt.scip import is_memory_freed 8 | 9 | from util import is_optimized_mode 10 | 11 | class MyHeur(Heur): 12 | 13 | def heurexec(self, heurtiming, nodeinfeasible): 14 | 15 | sol = self.model.createSol(self) 16 | vars = self.model.getVars() 17 | 18 | sol[vars[0]] = 5.0 19 | sol[vars[1]] = 0.0 20 | 21 | accepted = self.model.trySol(sol) 22 | 23 | if accepted: 24 | return {"result": SCIP_RESULT.FOUNDSOL} 25 | else: 26 | return {"result": SCIP_RESULT.DIDNOTFIND} 27 | 28 | def test_heur(): 29 | # create solver instance 30 | s = Model() 31 | heuristic = MyHeur() 32 | s.includeHeur(heuristic, "PyHeur", "custom heuristic implemented in python", "Y", timingmask=SCIP_HEURTIMING.BEFORENODE) 33 | s.setPresolve(SCIP_PARAMSETTING.OFF) 34 | 35 | # add some variables 36 | x = s.addVar("x", obj=1.0) 37 | y = s.addVar("y", obj=2.0) 38 | 39 | # add some constraint 40 | s.addCons(x + 2*y >= 5) 41 | 42 | # solve problem 43 | s.optimize() 44 | 45 | # print solution 46 | sol = s.getBestSol() 47 | assert sol != None 48 | assert round(sol[x]) == 5.0 49 | assert round(sol[y]) == 0.0 50 | 51 | def test_heur_memory(): 52 | if is_optimized_mode(): 53 | pytest.skip() 54 | 55 | def inner(): 56 | s = Model() 57 | heuristic = MyHeur() 58 | s.includeHeur(heuristic, "PyHeur", "custom heuristic implemented in python", "Y", timingmask=SCIP_HEURTIMING.BEFORENODE) 59 | return weakref.proxy(heuristic) 60 | 61 | heur_prox = inner() 62 | gc.collect() # necessary? 63 | with pytest.raises(ReferenceError): 64 | heur_prox.name 65 | 66 | assert is_memory_freed() 67 | 68 | if __name__ == "__main__": 69 | test_heur() 70 | -------------------------------------------------------------------------------- /pyscipopt/tests/test_knapsack.py: -------------------------------------------------------------------------------- 1 | from pyscipopt import Model, quicksum 2 | 3 | def test_knapsack(): 4 | # create solver instance 5 | s = Model("Knapsack") 6 | s.hideOutput() 7 | 8 | # setting the objective sense to maximise 9 | s.setMaximize() 10 | 11 | # item weights 12 | weights = [4, 2, 6, 3, 7, 5] 13 | # item costs 14 | costs = [7, 2, 5, 4, 3, 4] 15 | 16 | assert len(weights) == len(costs) 17 | 18 | # knapsack size 19 | knapsackSize = 15 20 | 21 | # adding the knapsack variables 22 | knapsackVars = [] 23 | varNames = [] 24 | varBaseName = "Item" 25 | for i in range(len(weights)): 26 | varNames.append(varBaseName + "_" + str(i)) 27 | knapsackVars.append(s.addVar(varNames[i], vtype='I', obj=costs[i], ub=1.0)) 28 | 29 | 30 | # adding a linear constraint for the knapsack constraint 31 | s.addCons(quicksum(w*v for (w, v) in zip(weights, knapsackVars)) <= knapsackSize) 32 | 33 | # solve problem 34 | s.optimize() 35 | 36 | s.printStatistics() 37 | 38 | # print solution 39 | varSolutions = [] 40 | for i in range(len(weights)): 41 | solValue = round(s.getVal(knapsackVars[i])) 42 | varSolutions.append(solValue) 43 | if solValue > 0: 44 | print (varNames[i], "Times Selected:", solValue) 45 | print ("\tIncluded Weight:", weights[i]*solValue, "\tItem Cost:", costs[i]*solValue) 46 | 47 | includedWeight = sum([weights[i]*varSolutions[i] for i in range(len(weights))]) 48 | assert includedWeight > 0 and includedWeight <= knapsackSize 49 | 50 | if __name__ == "__main__": 51 | test_knapsack() 52 | -------------------------------------------------------------------------------- /pyscipopt/tests/test_lp.py: -------------------------------------------------------------------------------- 1 | from pyscipopt import LP 2 | 3 | def test_lp(): 4 | # create LP instance, minimizing by default 5 | myLP = LP() 6 | 7 | # create cols w/o coefficients, 0 objective coefficient and 0,\infty bounds 8 | myLP.addCols(2 * [[]]) 9 | 10 | # create rows 11 | myLP.addRow(entries = [(0,1),(1,2)] ,lhs = 5) 12 | lhs, rhs = myLP.getSides() 13 | assert lhs[0] == 5.0 14 | assert rhs[0] == myLP.infinity() 15 | 16 | assert(myLP.ncols() == 2) 17 | myLP.chgObj(0, 1.0) 18 | myLP.chgObj(1, 4.0) 19 | 20 | solval = myLP.solve() 21 | 22 | assert round(5.0 == solval) 23 | 24 | if __name__ == "__main__": 25 | test_lp() 26 | -------------------------------------------------------------------------------- /pyscipopt/tests/test_memory.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | from pyscipopt.scip import Model, is_memory_freed 3 | from util import is_optimized_mode 4 | 5 | def test_not_freed(): 6 | if is_optimized_mode(): 7 | pytest.skip() 8 | m = Model() 9 | assert not is_memory_freed() 10 | 11 | def test_freed(): 12 | if is_optimized_mode(): 13 | pytest.skip() 14 | m = Model() 15 | del m 16 | assert is_memory_freed() 17 | 18 | if __name__ == "__main__": 19 | test_not_freed() 20 | test_freed() 21 | -------------------------------------------------------------------------------- /pyscipopt/tests/test_model.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | from pyscipopt import Model 4 | 5 | def test_model(): 6 | # create solver instance 7 | s = Model() 8 | 9 | # test parameter methods 10 | pric = s.getParam('lp/pricing') 11 | s.setParam('lp/pricing', 'q') 12 | assert 'q' == s.getParam('lp/pricing') 13 | s.setParam('lp/pricing', pric) 14 | s.setParam('visual/vbcfilename', 'vbcfile') 15 | assert 'vbcfile' == s.getParam('visual/vbcfilename') 16 | 17 | assert 'lp/pricing' in s.getParams() 18 | s.setParams({'visual/vbcfilename': '-'}) 19 | assert '-' == s.getParam('visual/vbcfilename') 20 | 21 | # add some variables 22 | x = s.addVar("x", vtype = 'C', obj = 1.0) 23 | y = s.addVar("y", vtype = 'C', obj = 2.0) 24 | 25 | assert x.getObj() == 1.0 26 | assert y.getObj() == 2.0 27 | 28 | s.setObjective(4.0 * y + 10.5, clear = False) 29 | assert x.getObj() == 1.0 30 | assert y.getObj() == 4.0 31 | assert s.getObjoffset() == 10.5 32 | 33 | # add some constraint 34 | c = s.addCons(x + 2 * y >= 1.0) 35 | assert c.isLinear() 36 | s.chgLhs(c, 5.0) 37 | s.chgRhs(c, 6.0) 38 | 39 | assert s.getLhs(c) == 5.0 40 | assert s.getRhs(c) == 6.0 41 | 42 | # solve problem 43 | s.optimize() 44 | 45 | solution = s.getBestSol() 46 | 47 | # print solution 48 | assert (s.getVal(x) == s.getSolVal(solution, x)) 49 | assert (s.getVal(y) == s.getSolVal(solution, y)) 50 | assert round(s.getVal(x)) == 5.0 51 | assert round(s.getVal(y)) == 0.0 52 | assert s.getSlack(c, solution) == 0.0 53 | assert s.getSlack(c, solution, 'lhs') == 0.0 54 | assert s.getSlack(c, solution, 'rhs') == 1.0 55 | assert s.getActivity(c, solution) == 5.0 56 | 57 | # check expression evaluations 58 | expr = x*x + 2*x*y + y*y 59 | expr2 = x + 1 60 | assert s.getVal(expr) == s.getSolVal(solution, expr) 61 | assert s.getVal(expr2) == s.getSolVal(solution, expr2) 62 | assert round(s.getVal(expr)) == 25.0 63 | assert round(s.getVal(expr2)) == 6.0 64 | 65 | s.writeProblem('model') 66 | s.writeProblem('model.lp') 67 | 68 | s.freeProb() 69 | s = Model() 70 | x = s.addVar("x", vtype = 'C', obj = 1.0) 71 | y = s.addVar("y", vtype = 'C', obj = 2.0) 72 | c = s.addCons(x + 2 * y <= 1.0) 73 | s.setMaximize() 74 | 75 | s.delCons(c) 76 | 77 | s.optimize() 78 | 79 | assert s.getStatus() == 'unbounded' 80 | 81 | 82 | def test_model_ptr(): 83 | model1 = Model() 84 | ptr1 = model1.to_ptr(give_ownership=True) 85 | assert not model1._freescip 86 | 87 | model2 = Model.from_ptr(ptr1, take_ownership=True) 88 | assert model2._freescip 89 | assert model2 == model1 90 | 91 | with pytest.raises(ValueError): 92 | Model.from_ptr("some gibberish", take_ownership=False) 93 | 94 | 95 | if __name__ == "__main__": 96 | test_model() 97 | test_model_ptr() 98 | -------------------------------------------------------------------------------- /pyscipopt/tests/test_nodesel.py: -------------------------------------------------------------------------------- 1 | from pyscipopt import Model 2 | from pyscipopt.scip import Nodesel 3 | 4 | class FiFo(Nodesel): 5 | 6 | def nodeselect(self): 7 | '''first method called in each iteration in the main solving loop. ''' 8 | 9 | leaves, children, siblings = self.model.getOpenNodes() 10 | nodes = leaves + children + siblings 11 | 12 | return {"selnode" : nodes[0]} if len(nodes) > 0 else {} 13 | 14 | def nodecomp(self, node1, node2): 15 | ''' 16 | compare two leaves of the current branching tree 17 | 18 | It should return the following values: 19 | 20 | value < 0, if node 1 comes before (is better than) node 2 21 | value = 0, if both nodes are equally good 22 | value > 0, if node 1 comes after (is worse than) node 2. 23 | ''' 24 | return 0 25 | 26 | def test_nodesel(): 27 | m = Model() 28 | m.hideOutput() 29 | 30 | # include node selector 31 | m.includeNodesel(FiFo(), "testnodeselector", "Testing a node selector.", 1073741823, 536870911) 32 | 33 | # add Variables 34 | x0 = m.addVar(vtype = "C", name = "x0", obj=-1) 35 | x1 = m.addVar(vtype = "C", name = "x1", obj=-1) 36 | x2 = m.addVar(vtype = "C", name = "x2", obj=-1) 37 | 38 | # add constraints 39 | m.addCons(x0 >= 2) 40 | m.addCons(x0**2 <= x1) 41 | m.addCons(x1 * x2 >= x0) 42 | 43 | m.setObjective(x1 + x0) 44 | m.optimize() 45 | 46 | 47 | if __name__ == "__main__": 48 | test_nodesel() 49 | -------------------------------------------------------------------------------- /pyscipopt/tests/test_quadcons.py: -------------------------------------------------------------------------------- 1 | from pyscipopt import Model 2 | 3 | def test_niceqp(): 4 | s = Model() 5 | 6 | x = s.addVar("x") 7 | y = s.addVar("y") 8 | s.addCons(x >= 2) 9 | s.addCons(x*x <= y) 10 | s.setObjective(y, sense='minimize') 11 | 12 | s.optimize() 13 | 14 | assert round(s.getVal(x)) == 2.0 15 | assert round(s.getVal(y)) == 4.0 16 | 17 | def test_niceqcqp(): 18 | s = Model() 19 | 20 | x = s.addVar("x") 21 | y = s.addVar("y") 22 | s.addCons(x*x + y*y <= 2) 23 | s.setObjective(x + y, sense='maximize') 24 | 25 | s.optimize() 26 | 27 | assert round(s.getVal(x)) == 1.0 28 | assert round(s.getVal(y)) == 1.0 29 | 30 | if __name__ == "__main__": 31 | test_niceqp() 32 | test_niceqcqp() 33 | -------------------------------------------------------------------------------- /pyscipopt/tests/test_quickprod.py: -------------------------------------------------------------------------------- 1 | from pyscipopt import Model, quickprod 2 | from pyscipopt.scip import CONST 3 | from operator import mul 4 | import functools 5 | 6 | def test_quickprod_model(): 7 | m = Model("quickprod") 8 | x = m.addVar("x") 9 | y = m.addVar("y") 10 | z = m.addVar("z") 11 | c = 2.3 12 | 13 | q = quickprod([x,y,z,c]) == 0.0 14 | s = functools.reduce(mul,[x,y,z,c],1) == 0.0 15 | 16 | assert(q.expr.terms == s.expr.terms) 17 | 18 | def test_quickprod(): 19 | empty = quickprod(1 for i in []) 20 | assert len(empty.terms) == 1 21 | assert CONST in empty.terms 22 | 23 | def test_largequadratic(): 24 | # inspired from performance issue on 25 | # http://stackoverflow.com/questions/38434300 26 | 27 | m = Model("dense_quadratic") 28 | dim = 20 29 | x = [m.addVar("x_%d" % i) for i in range(dim)] 30 | expr = quickprod((i+j+1)*x[i]*x[j] 31 | for i in range(dim) 32 | for j in range(dim)) 33 | cons = expr <= 1.0 34 | # upper triangle, diagonal 35 | assert cons.expr.degree() == 2*dim*dim 36 | m.addCons(cons) 37 | # TODO: what can we test beyond the lack of crashes? 38 | 39 | if __name__ == "__main__": 40 | test_quickprod() 41 | test_quickprod_model() 42 | test_largequadratic() 43 | -------------------------------------------------------------------------------- /pyscipopt/tests/test_quicksum.py: -------------------------------------------------------------------------------- 1 | from pyscipopt import Model, quicksum 2 | from pyscipopt.scip import CONST 3 | 4 | def test_quicksum_model(): 5 | m = Model("quicksum") 6 | x = m.addVar("x") 7 | y = m.addVar("y") 8 | z = m.addVar("z") 9 | c = 2.3 10 | 11 | q = quicksum([x,y,z,c]) == 0.0 12 | s = sum([x,y,z,c]) == 0.0 13 | 14 | assert(q.expr.terms == s.expr.terms) 15 | 16 | def test_quicksum(): 17 | empty = quicksum(1 for i in []) 18 | assert len(empty.terms) == 1 19 | assert CONST in empty.terms 20 | 21 | def test_largequadratic(): 22 | # inspired from performance issue on 23 | # http://stackoverflow.com/questions/38434300 24 | 25 | m = Model("dense_quadratic") 26 | dim = 200 27 | x = [m.addVar("x_%d" % i) for i in range(dim)] 28 | expr = quicksum((i+j+1)*x[i]*x[j] 29 | for i in range(dim) 30 | for j in range(dim)) 31 | cons = expr <= 1.0 32 | # upper triangle, diagonal 33 | assert len(cons.expr.terms) == dim * (dim-1) / 2 + dim 34 | m.addCons(cons) 35 | # TODO: what can we test beyond the lack of crashes? 36 | 37 | if __name__ == "__main__": 38 | test_quicksum() 39 | test_quicksum_model() 40 | test_largequadratic() 41 | -------------------------------------------------------------------------------- /pyscipopt/tests/test_relax.py: -------------------------------------------------------------------------------- 1 | from pyscipopt import Model 2 | from pyscipopt.scip import Relax 3 | 4 | calls = [] 5 | 6 | class SoncRelax(Relax): 7 | def relaxexec(self): 8 | calls.append('relaxexec') 9 | 10 | 11 | def test_relax(): 12 | m = Model() 13 | m.hideOutput() 14 | #include relaxator 15 | m.includeRelax(SoncRelax(),'testrelaxator','Test that relaxator gets included') 16 | 17 | #add Variables 18 | x0 = m.addVar(vtype = "C", name = "x0") 19 | x1 = m.addVar(vtype = "C", name = "x1") 20 | x2 = m.addVar(vtype = "C", name = "x2") 21 | 22 | #addCons 23 | m.addCons(x0 >= 2) 24 | m.addCons(x0**2 <= x1) 25 | m.addCons(x1 * x2 >= x0) 26 | 27 | m.setObjective(x1 + x0) 28 | m.optimize() 29 | print(m.getVal(x0)) 30 | assert 'relaxexec' in calls 31 | assert len(calls) == 1 32 | 33 | 34 | if __name__ == "__main__": 35 | test_relax() 36 | -------------------------------------------------------------------------------- /pyscipopt/tests/test_reopt.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | from pyscipopt import Model 3 | 4 | class ReoptimizationTest(unittest.TestCase): 5 | 6 | def test_reopt(self): 7 | 8 | m = Model() 9 | m.enableReoptimization() 10 | 11 | x = m.addVar(name="x", ub=5) 12 | y = m.addVar(name="y", lb=-2, ub=10) 13 | 14 | 15 | m.addCons(2 * x + y >= 8) 16 | m.setObjective(x + y) 17 | m.optimize() 18 | print("x", m.getVal(x)) 19 | print("y", m.getVal(y)) 20 | self.assertEqual(m.getVal(x), 5.0) 21 | self.assertEqual(m.getVal(y), -2.0) 22 | 23 | m.freeReoptSolve() 24 | m.addCons(y <= 3) 25 | m.addCons(y + x <= 6) 26 | m.chgReoptObjective(- x - 2 * y) 27 | 28 | m.optimize() 29 | print("x", m.getVal(x)) 30 | print("y", m.getVal(y)) 31 | self.assertEqual(m.getVal(x), 3.0) 32 | self.assertEqual(m.getVal(y), 3.0) 33 | 34 | 35 | if __name__ == '__main__': 36 | unittest.main() 37 | -------------------------------------------------------------------------------- /pyscipopt/tests/test_short.py: -------------------------------------------------------------------------------- 1 | from pyscipopt import Model 2 | import pytest 3 | import os 4 | 5 | # This test requires a directory link in tests/ to check/ in the main SCIP directory. 6 | 7 | testset = [] 8 | primalsolutions = {} 9 | dualsolutions = {} 10 | tolerance = 1e-5 11 | infinity = 1e20 12 | 13 | testsetpath = 'check/testset/short.test' 14 | solufilepath = 'check/testset/short.solu' 15 | 16 | if not all(os.path.isfile(fn) for fn in [testsetpath, solufilepath]): 17 | if pytest.__version__ < "3.0.0": 18 | pytest.skip("Files for testset `short` not found (symlink missing?)") 19 | else: 20 | pytestmark = pytest.mark.skip 21 | 22 | else: 23 | with open(testsetpath, 'r') as f: 24 | for line in f.readlines(): 25 | testset.append('check/' + line.rstrip('\n')) 26 | 27 | with open(solufilepath, 'r') as f: 28 | for line in f.readlines(): 29 | 30 | if len(line.split()) == 2: 31 | [s, name] = line.split() 32 | else: 33 | [s, name, value] = line.split() 34 | 35 | if s == '=opt=': 36 | primalsolutions[name] = float(value) 37 | dualsolutions[name] = float(value) 38 | elif s == '=inf=': 39 | primalsolutions[name] = infinity 40 | dualsolutions[name] = infinity 41 | elif s == '=best=': 42 | primalsolutions[name] = float(value) 43 | elif s == '=best dual=': 44 | dualsolutions[name] = float(value) 45 | # status =unkn= needs no data 46 | 47 | def relGE(v1, v2, tol = tolerance): 48 | if v1 is None or v2 is None: 49 | return True 50 | else: 51 | reltol = tol * max(abs(v1), abs(v2), 1.0) 52 | return (v1 - v2) >= -reltol 53 | 54 | def relLE(v1, v2, tol = tolerance): 55 | if v1 is None or v2 is None: 56 | return True 57 | else: 58 | reltol = tol * max(abs(v1), abs(v2), 1.0) 59 | return (v1 - v2) <= reltol 60 | 61 | 62 | @pytest.mark.parametrize('instance', testset) 63 | def test_instance(instance): 64 | s = Model() 65 | s.hideOutput() 66 | s.readProblem(instance) 67 | s.optimize() 68 | name = os.path.split(instance)[1] 69 | if name.rsplit('.',1)[1].lower() == 'gz': 70 | name = name.rsplit('.',2)[0] 71 | else: 72 | name = name.rsplit('.',1)[0] 73 | 74 | # we do not need the solution status 75 | primalbound = s.getObjVal() 76 | dualbound = s.getDualbound() 77 | 78 | # get solution data from solu file 79 | primalsolu = primalsolutions.get(name, None) 80 | dualsolu = dualsolutions.get(name, None) 81 | 82 | if s.getObjectiveSense() == 'minimize': 83 | assert relGE(primalbound, dualsolu) 84 | assert relLE(dualbound, primalsolu) 85 | else: 86 | if( primalsolu == infinity ): primalsolu = -infinity 87 | if( dualsolu == infinity ): dualsolu = -infinity 88 | assert relLE(primalbound, dualsolu) 89 | assert relGE(dualbound, primalsolu) 90 | -------------------------------------------------------------------------------- /pyscipopt/tests/test_solution.py: -------------------------------------------------------------------------------- 1 | from pyscipopt import Model 2 | 3 | def test_solution_getbest(): 4 | m = Model() 5 | 6 | x = m.addVar("x", lb=0, ub=2, obj=-1) 7 | y = m.addVar("y", lb=0, ub=4, obj=0) 8 | m.addCons(x*x <= y) 9 | 10 | m.optimize() 11 | 12 | sol = m.getBestSol() 13 | assert round(sol[x]) == 2.0 14 | assert round(sol[y]) == 4.0 15 | print(sol) # prints the solution in the transformed space 16 | 17 | m.freeTransform() 18 | sol = m.getBestSol() 19 | assert round(sol[x]) == 2.0 20 | assert round(sol[y]) == 4.0 21 | print(sol) # prints the solution in the original space 22 | 23 | def test_solution_create(): 24 | m = Model() 25 | 26 | x = m.addVar("x", lb=0, ub=2, obj=-1) 27 | y = m.addVar("y", lb=0, ub=4, obj=0) 28 | m.addCons(x*x <= y) 29 | 30 | s = m.createSol() 31 | s[x] = 2.0 32 | s[y] = 4.0 33 | assert m.addSol(s, free=True) 34 | 35 | if __name__ == "__main__": 36 | test_solution_getbest() 37 | test_solution_create() 38 | -------------------------------------------------------------------------------- /pyscipopt/tests/test_tree.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | from pyscipopt import Model, Eventhdlr, SCIP_RESULT, SCIP_EVENTTYPE, SCIP_PARAMSETTING 4 | 5 | 6 | class NodeEventHandler(Eventhdlr): 7 | 8 | def __init__(self): 9 | self.calls = [] 10 | 11 | def eventinit(self): 12 | self.model.catchEvent(SCIP_EVENTTYPE.NODEFOCUSED, self) 13 | 14 | def eventexit(self): 15 | self.model.dropEvent(SCIP_EVENTTYPE.NODEFOCUSED, self) 16 | 17 | def eventexec(self, event): 18 | self.calls.append('eventexec') 19 | assert event.getType() == SCIP_EVENTTYPE.NODEFOCUSED 20 | node = event.getNode() 21 | 22 | if node.getDepth() == 0: 23 | assert node.getParent() is None 24 | assert node.getParentBranchings() is None 25 | return 26 | 27 | variables, branchbounds, boundtypes = node.getParentBranchings() 28 | assert len(variables) == 1 29 | assert len(branchbounds) == 1 30 | assert len(boundtypes) == 1 31 | domain_changes = node.getDomchg() 32 | bound_changes = domain_changes.getBoundchgs() 33 | assert len(bound_changes) == 1 34 | 35 | 36 | def test_tree(): 37 | # create solver instance 38 | s = Model() 39 | s.setMaximize() 40 | s.hideOutput() 41 | s.setPresolve(SCIP_PARAMSETTING.OFF) 42 | node_eventhdlr = NodeEventHandler() 43 | s.includeEventhdlr(node_eventhdlr, "NodeEventHandler", "python event handler to catch NODEFOCUSED") 44 | 45 | # add some variables 46 | n = 121 47 | x = [s.addVar("x{}".format(i), obj=1.0, vtype="INTEGER") for i in range(n)] 48 | 49 | # add some constraints 50 | for i in range(n): 51 | for j in range(i): 52 | dist = min(abs(i - j), abs(n - i - j)) 53 | if dist in (1, 3, 4): 54 | s.addCons(x[i] + x[j] <= 1) 55 | # solve problem 56 | s.optimize() 57 | 58 | # print solution 59 | assert round(s.getObjVal()) == 36.0 60 | 61 | del s 62 | 63 | assert len(node_eventhdlr.calls) > 3 64 | 65 | if __name__ == "__main__": 66 | test_tree() 67 | -------------------------------------------------------------------------------- /pyscipopt/tests/test_vars.py: -------------------------------------------------------------------------------- 1 | from pyscipopt import Model 2 | 3 | def test_variablebounds(): 4 | 5 | m = Model() 6 | 7 | x0 = m.addVar(lb=-5, ub=8) 8 | r1 = m.addVar() 9 | r2 = m.addVar() 10 | y0 = m.addVar(lb=3) 11 | t = m.addVar(lb=None) 12 | z = m.addVar() 13 | 14 | m.chgVarLbGlobal(x0, -2) 15 | m.chgVarUbGlobal(x0, 4) 16 | 17 | infeas, tightened = m.tightenVarLb(x0, -5) 18 | assert not infeas 19 | assert not tightened 20 | infeas, tightened = m.tightenVarLbGlobal(x0, -1) 21 | assert not infeas 22 | assert tightened 23 | infeas, tightened = m.tightenVarUb(x0, 3) 24 | assert not infeas 25 | assert tightened 26 | infeas, tightened = m.tightenVarUbGlobal(x0, 9) 27 | assert not infeas 28 | assert not tightened 29 | infeas, fixed = m.fixVar(z, 7) 30 | assert not infeas 31 | assert fixed 32 | assert m.delVar(z) 33 | 34 | m.addCons(r1 >= x0) 35 | m.addCons(r2 >= -x0) 36 | m.addCons(y0 == r1 +r2) 37 | 38 | m.setObjective(t) 39 | m.addCons(t >= r1 * (r1 - x0) + r2 * (r2 + x0)) 40 | 41 | 42 | m.optimize() 43 | 44 | print("x0", m.getVal(x0)) 45 | print("r1", m.getVal(r1)) 46 | print("r2", m.getVal(r2)) 47 | print("y0", m.getVal(y0)) 48 | print("t", m.getVal(t)) 49 | 50 | def test_vtype(): 51 | m = Model() 52 | 53 | x = m.addVar(vtype= 'C', lb=-5.5, ub=8) 54 | y = m.addVar(vtype= 'I', lb=-5.2, ub=8) 55 | z = m.addVar(vtype= 'B', lb=-5.2, ub=8) 56 | w = m.addVar(vtype= 'M', lb=-5.2, ub=8) 57 | 58 | assert x.vtype() == "CONTINUOUS" 59 | assert y.vtype() == "INTEGER" 60 | assert z.vtype() == "BINARY" 61 | assert w.vtype() == "IMPLINT" 62 | 63 | m.chgVarType(x, 'I') 64 | assert x.vtype() == "INTEGER" 65 | 66 | m.chgVarType(y, 'M') 67 | assert y.vtype() == "IMPLINT" 68 | 69 | if __name__ == "__main__": 70 | test_variablebounds() 71 | test_vtype() 72 | -------------------------------------------------------------------------------- /pyscipopt/tests/util.py: -------------------------------------------------------------------------------- 1 | from pyscipopt.scip import Model, is_memory_freed 2 | 3 | def is_optimized_mode(): 4 | s = Model() 5 | return is_memory_freed() 6 | 7 | 8 | -------------------------------------------------------------------------------- /pyscipopt/travis.enc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ds4dm/learn2comparenodes/da802e8d1e6687ca7b5593e3e0cad42eb4499942/pyscipopt/travis.enc -------------------------------------------------------------------------------- /setup_env.sh: -------------------------------------------------------------------------------- 1 | 2 | conda deactivate 3 | 4 | conda env remove -n l2sn 5 | 6 | conda env create -f env.yml 7 | 8 | conda activate l2sn 9 | 10 | pip install ./pyscipopt 11 | pip install torch==1.9.0+cu111 -f https://download.pytorch.org/whl/cu111/torch_stable.html 12 | 13 | #CPU 14 | 15 | #pip install torch-scatter torch-sparse torch-cluster torch-spline-conv torch-geometric -f https://data.pyg.org/whl/torch-1.10.0+cpu.html 16 | 17 | #GPU 18 | pip install --no-index torch-scatter -f https://data.pyg.org/whl/torch-1.9.0+cu111.html 19 | pip install --no-index torch-sparse -f https://data.pyg.org/whl/torch-1.9.0+cu111.html 20 | pip install --no-index torch-cluster -f https://data.pyg.org/whl/torch-1.9.0+cu111.html 21 | pip install --no-index torch-spline-conv -f https://data.pyg.org/whl/torch-1.9.0+cu111.html 22 | pip install torch-geometric 23 | 24 | 25 | #cuda=10.2 26 | 27 | --------------------------------------------------------------------------------