discrete-optimization 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (416) hide show
  1. discrete_optimization-0.3.0/.github/workflows/build-doc.yml +129 -0
  2. discrete_optimization-0.3.0/.github/workflows/build.yml +399 -0
  3. discrete_optimization-0.3.0/.github/workflows/deploy-doc.yml +90 -0
  4. discrete_optimization-0.3.0/.gitignore +24 -0
  5. discrete_optimization-0.3.0/.pre-commit-config.yaml +54 -0
  6. discrete_optimization-0.3.0/LICENSE +21 -0
  7. discrete_optimization-0.3.0/PKG-INFO +116 -0
  8. discrete_optimization-0.3.0/README.md +60 -0
  9. discrete_optimization-0.3.0/binder/apt.txt +1 -0
  10. discrete_optimization-0.3.0/binder/environment.yml +11 -0
  11. discrete_optimization-0.3.0/binder/postBuild +17 -0
  12. discrete_optimization-0.3.0/binder/start +20 -0
  13. discrete_optimization-0.3.0/credits.md +13 -0
  14. discrete_optimization-0.3.0/discrete_optimization/__init__.py +39 -0
  15. discrete_optimization-0.3.0/discrete_optimization/coloring/__init__.py +3 -0
  16. discrete_optimization-0.3.0/discrete_optimization/coloring/coloring_model.py +442 -0
  17. discrete_optimization-0.3.0/discrete_optimization/coloring/coloring_parser.py +74 -0
  18. discrete_optimization-0.3.0/discrete_optimization/coloring/coloring_plot.py +28 -0
  19. discrete_optimization-0.3.0/discrete_optimization/coloring/coloring_solvers.py +171 -0
  20. discrete_optimization-0.3.0/discrete_optimization/coloring/coloring_toolbox.py +35 -0
  21. discrete_optimization-0.3.0/discrete_optimization/coloring/minizinc/coloring.mzn +22 -0
  22. discrete_optimization-0.3.0/discrete_optimization/coloring/minizinc/coloring_clique.mzn +31 -0
  23. discrete_optimization-0.3.0/discrete_optimization/coloring/minizinc/coloring_for_lns.mzn +18 -0
  24. discrete_optimization-0.3.0/discrete_optimization/coloring/minizinc/coloring_subset_nodes.mzn +23 -0
  25. discrete_optimization-0.3.0/discrete_optimization/coloring/solvers/__init__.py +3 -0
  26. discrete_optimization-0.3.0/discrete_optimization/coloring/solvers/coloring_asp_solver.py +164 -0
  27. discrete_optimization-0.3.0/discrete_optimization/coloring/solvers/coloring_cp_lns.py +227 -0
  28. discrete_optimization-0.3.0/discrete_optimization/coloring/solvers/coloring_cp_lns_solvers.py +240 -0
  29. discrete_optimization-0.3.0/discrete_optimization/coloring/solvers/coloring_cp_solvers.py +263 -0
  30. discrete_optimization-0.3.0/discrete_optimization/coloring/solvers/coloring_cpsat_solver.py +221 -0
  31. discrete_optimization-0.3.0/discrete_optimization/coloring/solvers/coloring_lp_lns_solvers.py +259 -0
  32. discrete_optimization-0.3.0/discrete_optimization/coloring/solvers/coloring_lp_solvers.py +468 -0
  33. discrete_optimization-0.3.0/discrete_optimization/coloring/solvers/coloring_solver.py +10 -0
  34. discrete_optimization-0.3.0/discrete_optimization/coloring/solvers/coloring_solver_with_starting_solution.py +69 -0
  35. discrete_optimization-0.3.0/discrete_optimization/coloring/solvers/coloring_toulbar_solver.py +261 -0
  36. discrete_optimization-0.3.0/discrete_optimization/coloring/solvers/greedy_coloring.py +123 -0
  37. discrete_optimization-0.3.0/discrete_optimization/datasets.py +280 -0
  38. discrete_optimization-0.3.0/discrete_optimization/facility/__init__.py +3 -0
  39. discrete_optimization-0.3.0/discrete_optimization/facility/facility_model.py +297 -0
  40. discrete_optimization-0.3.0/discrete_optimization/facility/facility_parser.py +82 -0
  41. discrete_optimization-0.3.0/discrete_optimization/facility/facility_solvers.py +123 -0
  42. discrete_optimization-0.3.0/discrete_optimization/facility/minizinc/facility_int.mzn +28 -0
  43. discrete_optimization-0.3.0/discrete_optimization/facility/minizinc/facility_int_lns.mzn +26 -0
  44. discrete_optimization-0.3.0/discrete_optimization/facility/solvers/__init__.py +3 -0
  45. discrete_optimization-0.3.0/discrete_optimization/facility/solvers/facility_cp_solvers.py +179 -0
  46. discrete_optimization-0.3.0/discrete_optimization/facility/solvers/facility_lp_lns_solver.py +186 -0
  47. discrete_optimization-0.3.0/discrete_optimization/facility/solvers/facility_lp_solver.py +534 -0
  48. discrete_optimization-0.3.0/discrete_optimization/facility/solvers/facility_solver.py +11 -0
  49. discrete_optimization-0.3.0/discrete_optimization/facility/solvers/gphh_facility.py +367 -0
  50. discrete_optimization-0.3.0/discrete_optimization/facility/solvers/greedy_solvers.py +100 -0
  51. discrete_optimization-0.3.0/discrete_optimization/generic_rcpsp_tools/__init__.py +3 -0
  52. discrete_optimization-0.3.0/discrete_optimization/generic_rcpsp_tools/generic_rcpsp_solver.py +12 -0
  53. discrete_optimization-0.3.0/discrete_optimization/generic_rcpsp_tools/gphh_solver.py +678 -0
  54. discrete_optimization-0.3.0/discrete_optimization/generic_rcpsp_tools/graph_tools_rcpsp.py +169 -0
  55. discrete_optimization-0.3.0/discrete_optimization/generic_rcpsp_tools/large_neighborhood_search_scheduling.py +520 -0
  56. discrete_optimization-0.3.0/discrete_optimization/generic_rcpsp_tools/ls_solver.py +114 -0
  57. discrete_optimization-0.3.0/discrete_optimization/generic_rcpsp_tools/neighbor_builder.py +741 -0
  58. discrete_optimization-0.3.0/discrete_optimization/generic_rcpsp_tools/neighbor_tools_rcpsp.py +1752 -0
  59. discrete_optimization-0.3.0/discrete_optimization/generic_rcpsp_tools/postpro_local_search.py +58 -0
  60. discrete_optimization-0.3.0/discrete_optimization/generic_rcpsp_tools/solution_repair.py +554 -0
  61. discrete_optimization-0.3.0/discrete_optimization/generic_rcpsp_tools/typing.py +101 -0
  62. discrete_optimization-0.3.0/discrete_optimization/generic_tools/__init__.py +3 -0
  63. discrete_optimization-0.3.0/discrete_optimization/generic_tools/asp_tools.py +144 -0
  64. discrete_optimization-0.3.0/discrete_optimization/generic_tools/callbacks/__init__.py +3 -0
  65. discrete_optimization-0.3.0/discrete_optimization/generic_tools/callbacks/backup.py +29 -0
  66. discrete_optimization-0.3.0/discrete_optimization/generic_tools/callbacks/callback.py +117 -0
  67. discrete_optimization-0.3.0/discrete_optimization/generic_tools/callbacks/early_stoppers.py +71 -0
  68. discrete_optimization-0.3.0/discrete_optimization/generic_tools/callbacks/loggers.py +86 -0
  69. discrete_optimization-0.3.0/discrete_optimization/generic_tools/callbacks/optuna.py +104 -0
  70. discrete_optimization-0.3.0/discrete_optimization/generic_tools/cp_tools.py +414 -0
  71. discrete_optimization-0.3.0/discrete_optimization/generic_tools/do_mutation.py +53 -0
  72. discrete_optimization-0.3.0/discrete_optimization/generic_tools/do_problem.py +705 -0
  73. discrete_optimization-0.3.0/discrete_optimization/generic_tools/do_solver.py +70 -0
  74. discrete_optimization-0.3.0/discrete_optimization/generic_tools/ea/__init__.py +3 -0
  75. discrete_optimization-0.3.0/discrete_optimization/generic_tools/ea/alternating_ga.py +133 -0
  76. discrete_optimization-0.3.0/discrete_optimization/generic_tools/ea/deap_wrappers.py +28 -0
  77. discrete_optimization-0.3.0/discrete_optimization/generic_tools/ea/ga.py +475 -0
  78. discrete_optimization-0.3.0/discrete_optimization/generic_tools/ea/ga_tools.py +154 -0
  79. discrete_optimization-0.3.0/discrete_optimization/generic_tools/ea/nsga.py +406 -0
  80. discrete_optimization-0.3.0/discrete_optimization/generic_tools/exceptions.py +13 -0
  81. discrete_optimization-0.3.0/discrete_optimization/generic_tools/ghh_tools.py +94 -0
  82. discrete_optimization-0.3.0/discrete_optimization/generic_tools/graph_api.py +161 -0
  83. discrete_optimization-0.3.0/discrete_optimization/generic_tools/hyperparameters/__init__.py +3 -0
  84. discrete_optimization-0.3.0/discrete_optimization/generic_tools/hyperparameters/hyperparameter.py +356 -0
  85. discrete_optimization-0.3.0/discrete_optimization/generic_tools/hyperparameters/hyperparametrizable.py +209 -0
  86. discrete_optimization-0.3.0/discrete_optimization/generic_tools/lns_cp.py +559 -0
  87. discrete_optimization-0.3.0/discrete_optimization/generic_tools/lns_mip.py +229 -0
  88. discrete_optimization-0.3.0/discrete_optimization/generic_tools/lp_tools.py +478 -0
  89. discrete_optimization-0.3.0/discrete_optimization/generic_tools/ls/__init__.py +3 -0
  90. discrete_optimization-0.3.0/discrete_optimization/generic_tools/ls/hill_climber.py +267 -0
  91. discrete_optimization-0.3.0/discrete_optimization/generic_tools/ls/local_search.py +94 -0
  92. discrete_optimization-0.3.0/discrete_optimization/generic_tools/ls/simulated_annealing.py +200 -0
  93. discrete_optimization-0.3.0/discrete_optimization/generic_tools/mip/__init__.py +3 -0
  94. discrete_optimization-0.3.0/discrete_optimization/generic_tools/mip/pymip_tools.py +76 -0
  95. discrete_optimization-0.3.0/discrete_optimization/generic_tools/mutations/__init__.py +3 -0
  96. discrete_optimization-0.3.0/discrete_optimization/generic_tools/mutations/mixed_mutation.py +58 -0
  97. discrete_optimization-0.3.0/discrete_optimization/generic_tools/mutations/mutation_bool.py +67 -0
  98. discrete_optimization-0.3.0/discrete_optimization/generic_tools/mutations/mutation_catalog.py +116 -0
  99. discrete_optimization-0.3.0/discrete_optimization/generic_tools/mutations/mutation_integer.py +84 -0
  100. discrete_optimization-0.3.0/discrete_optimization/generic_tools/mutations/mutation_util.py +25 -0
  101. discrete_optimization-0.3.0/discrete_optimization/generic_tools/mutations/permutation_mutations.py +242 -0
  102. discrete_optimization-0.3.0/discrete_optimization/generic_tools/optuna/timed_percentile_pruner.py +214 -0
  103. discrete_optimization-0.3.0/discrete_optimization/generic_tools/ortools_cpsat_tools.py +154 -0
  104. discrete_optimization-0.3.0/discrete_optimization/generic_tools/path_tools.py +13 -0
  105. discrete_optimization-0.3.0/discrete_optimization/generic_tools/pytools/__init__.py +4 -0
  106. discrete_optimization-0.3.0/discrete_optimization/generic_tools/pytools/timeout_decorator.py +50 -0
  107. discrete_optimization-0.3.0/discrete_optimization/generic_tools/result_storage/__init__.py +3 -0
  108. discrete_optimization-0.3.0/discrete_optimization/generic_tools/result_storage/multiobj_utils.py +49 -0
  109. discrete_optimization-0.3.0/discrete_optimization/generic_tools/result_storage/result_storage.py +358 -0
  110. discrete_optimization-0.3.0/discrete_optimization/generic_tools/result_storage/resultcomparator.py +215 -0
  111. discrete_optimization-0.3.0/discrete_optimization/generic_tools/robustness/__init__.py +3 -0
  112. discrete_optimization-0.3.0/discrete_optimization/generic_tools/robustness/robustness_tool.py +235 -0
  113. discrete_optimization-0.3.0/discrete_optimization/knapsack/__init__.py +3 -0
  114. discrete_optimization-0.3.0/discrete_optimization/knapsack/knapsack_model.py +524 -0
  115. discrete_optimization-0.3.0/discrete_optimization/knapsack/knapsack_parser.py +70 -0
  116. discrete_optimization-0.3.0/discrete_optimization/knapsack/knapsack_solvers.py +93 -0
  117. discrete_optimization-0.3.0/discrete_optimization/knapsack/minizinc/knapsack_global.mzn +15 -0
  118. discrete_optimization-0.3.0/discrete_optimization/knapsack/minizinc/knapsack_mzn.mzn +19 -0
  119. discrete_optimization-0.3.0/discrete_optimization/knapsack/minizinc/multidim_multiscenario_knapsack.mzn +82 -0
  120. discrete_optimization-0.3.0/discrete_optimization/knapsack/minizinc/multidimension_knapsack.mzn +71 -0
  121. discrete_optimization-0.3.0/discrete_optimization/knapsack/mutation/__init__.py +3 -0
  122. discrete_optimization-0.3.0/discrete_optimization/knapsack/mutation/mutation_knapsack.py +241 -0
  123. discrete_optimization-0.3.0/discrete_optimization/knapsack/solvers/__init__.py +3 -0
  124. discrete_optimization-0.3.0/discrete_optimization/knapsack/solvers/cp_solvers.py +361 -0
  125. discrete_optimization-0.3.0/discrete_optimization/knapsack/solvers/dyn_prog_knapsack.py +127 -0
  126. discrete_optimization-0.3.0/discrete_optimization/knapsack/solvers/gphh_knapsack.py +393 -0
  127. discrete_optimization-0.3.0/discrete_optimization/knapsack/solvers/greedy_solvers.py +98 -0
  128. discrete_optimization-0.3.0/discrete_optimization/knapsack/solvers/knapsack_asp_solver.py +79 -0
  129. discrete_optimization-0.3.0/discrete_optimization/knapsack/solvers/knapsack_cpmpy.py +65 -0
  130. discrete_optimization-0.3.0/discrete_optimization/knapsack/solvers/knapsack_cpsat_solver.py +73 -0
  131. discrete_optimization-0.3.0/discrete_optimization/knapsack/solvers/knapsack_decomposition.py +183 -0
  132. discrete_optimization-0.3.0/discrete_optimization/knapsack/solvers/knapsack_lns_cp_solver.py +70 -0
  133. discrete_optimization-0.3.0/discrete_optimization/knapsack/solvers/knapsack_lns_solver.py +132 -0
  134. discrete_optimization-0.3.0/discrete_optimization/knapsack/solvers/knapsack_solver.py +11 -0
  135. discrete_optimization-0.3.0/discrete_optimization/knapsack/solvers/lp_solvers.py +329 -0
  136. discrete_optimization-0.3.0/discrete_optimization/pickup_vrp/__init__.py +3 -0
  137. discrete_optimization-0.3.0/discrete_optimization/pickup_vrp/builders/__init__.py +3 -0
  138. discrete_optimization-0.3.0/discrete_optimization/pickup_vrp/builders/instance_builders.py +753 -0
  139. discrete_optimization-0.3.0/discrete_optimization/pickup_vrp/gpdp.py +758 -0
  140. discrete_optimization-0.3.0/discrete_optimization/pickup_vrp/minizinc/gpdp.mzn +79 -0
  141. discrete_optimization-0.3.0/discrete_optimization/pickup_vrp/minizinc/gpdp_example.dzn +3 -0
  142. discrete_optimization-0.3.0/discrete_optimization/pickup_vrp/minizinc/gpdp_flow.mzn +91 -0
  143. discrete_optimization-0.3.0/discrete_optimization/pickup_vrp/minizinc/gpdp_resources.mzn +166 -0
  144. discrete_optimization-0.3.0/discrete_optimization/pickup_vrp/plots/__init__.py +0 -0
  145. discrete_optimization-0.3.0/discrete_optimization/pickup_vrp/plots/gpdp_plot_utils.py +50 -0
  146. discrete_optimization-0.3.0/discrete_optimization/pickup_vrp/solver/__init__.py +3 -0
  147. discrete_optimization-0.3.0/discrete_optimization/pickup_vrp/solver/lp_solver.py +2472 -0
  148. discrete_optimization-0.3.0/discrete_optimization/pickup_vrp/solver/lp_solver_pymip.py +1447 -0
  149. discrete_optimization-0.3.0/discrete_optimization/pickup_vrp/solver/ortools_solver.py +1024 -0
  150. discrete_optimization-0.3.0/discrete_optimization/pickup_vrp/solver/pickup_vrp_solver.py +10 -0
  151. discrete_optimization-0.3.0/discrete_optimization/rcpsp/__init__.py +17 -0
  152. discrete_optimization-0.3.0/discrete_optimization/rcpsp/fast_function_rcpsp.py +1360 -0
  153. discrete_optimization-0.3.0/discrete_optimization/rcpsp/minizinc/fzn_my_cumulative.mzn +57 -0
  154. discrete_optimization-0.3.0/discrete_optimization/rcpsp/minizinc/fzn_my_cumulative_reif.mzn +42 -0
  155. discrete_optimization-0.3.0/discrete_optimization/rcpsp/minizinc/mrcpsp_mode_satisfy.mzn +87 -0
  156. discrete_optimization-0.3.0/discrete_optimization/rcpsp/minizinc/my_cumulative.mzn +20 -0
  157. discrete_optimization-0.3.0/discrete_optimization/rcpsp/minizinc/rcpsp_multi_mode_mzn.mzn +288 -0
  158. discrete_optimization-0.3.0/discrete_optimization/rcpsp/minizinc/rcpsp_multi_mode_mzn_calendar.mzn +280 -0
  159. discrete_optimization-0.3.0/discrete_optimization/rcpsp/minizinc/rcpsp_multi_mode_mzn_no_bool.mzn +265 -0
  160. discrete_optimization-0.3.0/discrete_optimization/rcpsp/minizinc/rcpsp_multi_mode_mzn_preemptive.mzn +232 -0
  161. discrete_optimization-0.3.0/discrete_optimization/rcpsp/minizinc/rcpsp_multi_mode_mzn_preemptive_calendar.mzn +205 -0
  162. discrete_optimization-0.3.0/discrete_optimization/rcpsp/minizinc/rcpsp_multi_mode_mzn_with_faketasks.mzn +278 -0
  163. discrete_optimization-0.3.0/discrete_optimization/rcpsp/minizinc/rcpsp_multi_mode_resource_feasibility_mzn.mzn +264 -0
  164. discrete_optimization-0.3.0/discrete_optimization/rcpsp/minizinc/rcpsp_multiscenario.mzn +199 -0
  165. discrete_optimization-0.3.0/discrete_optimization/rcpsp/minizinc/rcpsp_mzn_calendar_boxes.mzn +291 -0
  166. discrete_optimization-0.3.0/discrete_optimization/rcpsp/minizinc/rcpsp_single_mode_mzn.mzn +174 -0
  167. discrete_optimization-0.3.0/discrete_optimization/rcpsp/minizinc/rcpsp_single_mode_mzn_no_search.mzn +177 -0
  168. discrete_optimization-0.3.0/discrete_optimization/rcpsp/minizinc/rcpsp_single_mode_mzn_preemptive.mzn +226 -0
  169. discrete_optimization-0.3.0/discrete_optimization/rcpsp/minizinc/rcpsp_single_mode_mzn_preemptive_calendar.mzn +232 -0
  170. discrete_optimization-0.3.0/discrete_optimization/rcpsp/minizinc/rcpsp_single_mode_mzn_with_second_optim.mzn +142 -0
  171. discrete_optimization-0.3.0/discrete_optimization/rcpsp/minizinc/rcpsp_single_mode_resource.mzn +214 -0
  172. discrete_optimization-0.3.0/discrete_optimization/rcpsp/minizinc/resumee_rcpsp.mzn +53 -0
  173. discrete_optimization-0.3.0/discrete_optimization/rcpsp/mutations/__init__.py +3 -0
  174. discrete_optimization-0.3.0/discrete_optimization/rcpsp/mutations/mutation_rcpsp.py +157 -0
  175. discrete_optimization-0.3.0/discrete_optimization/rcpsp/plots/__init__.py +3 -0
  176. discrete_optimization-0.3.0/discrete_optimization/rcpsp/plots/rcpsp_utils_preemptive.py +524 -0
  177. discrete_optimization-0.3.0/discrete_optimization/rcpsp/rcpsp_model.py +990 -0
  178. discrete_optimization-0.3.0/discrete_optimization/rcpsp/rcpsp_model_preemptive.py +1372 -0
  179. discrete_optimization-0.3.0/discrete_optimization/rcpsp/rcpsp_parser.py +192 -0
  180. discrete_optimization-0.3.0/discrete_optimization/rcpsp/rcpsp_solution.py +1212 -0
  181. discrete_optimization-0.3.0/discrete_optimization/rcpsp/rcpsp_solvers.py +291 -0
  182. discrete_optimization-0.3.0/discrete_optimization/rcpsp/rcpsp_utils.py +688 -0
  183. discrete_optimization-0.3.0/discrete_optimization/rcpsp/robust_rcpsp.py +308 -0
  184. discrete_optimization-0.3.0/discrete_optimization/rcpsp/sgs_without_array.py +248 -0
  185. discrete_optimization-0.3.0/discrete_optimization/rcpsp/solver/__init__.py +7 -0
  186. discrete_optimization-0.3.0/discrete_optimization/rcpsp/solver/cp_lns_methods_clean.py +167 -0
  187. discrete_optimization-0.3.0/discrete_optimization/rcpsp/solver/cp_lns_methods_preemptive.py +1291 -0
  188. discrete_optimization-0.3.0/discrete_optimization/rcpsp/solver/cp_lns_solver.py +266 -0
  189. discrete_optimization-0.3.0/discrete_optimization/rcpsp/solver/cp_model_input.py +55 -0
  190. discrete_optimization-0.3.0/discrete_optimization/rcpsp/solver/cp_solvers.py +3007 -0
  191. discrete_optimization-0.3.0/discrete_optimization/rcpsp/solver/cp_solvers_multiscenario.py +204 -0
  192. discrete_optimization-0.3.0/discrete_optimization/rcpsp/solver/cpm.py +651 -0
  193. discrete_optimization-0.3.0/discrete_optimization/rcpsp/solver/cpsat_solver.py +594 -0
  194. discrete_optimization-0.3.0/discrete_optimization/rcpsp/solver/rcpsp_cp_lns_solver.py +652 -0
  195. discrete_optimization-0.3.0/discrete_optimization/rcpsp/solver/rcpsp_ga_solver.py +61 -0
  196. discrete_optimization-0.3.0/discrete_optimization/rcpsp/solver/rcpsp_lp_lns_solver.py +494 -0
  197. discrete_optimization-0.3.0/discrete_optimization/rcpsp/solver/rcpsp_lp_solver.py +1014 -0
  198. discrete_optimization-0.3.0/discrete_optimization/rcpsp/solver/rcpsp_lp_solver_gantt.py +438 -0
  199. discrete_optimization-0.3.0/discrete_optimization/rcpsp/solver/rcpsp_pile.py +590 -0
  200. discrete_optimization-0.3.0/discrete_optimization/rcpsp/solver/rcpsp_solver.py +13 -0
  201. discrete_optimization-0.3.0/discrete_optimization/rcpsp/special_constraints.py +148 -0
  202. discrete_optimization-0.3.0/discrete_optimization/rcpsp/specialized_rcpsp/__init__.py +3 -0
  203. discrete_optimization-0.3.0/discrete_optimization/rcpsp/specialized_rcpsp/rcpsp_specialized_constraints.py +1415 -0
  204. discrete_optimization-0.3.0/discrete_optimization/rcpsp/transform_model.py +42 -0
  205. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/__init__.py +3 -0
  206. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/fast_function_ms_rcpsp.py +1400 -0
  207. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/minizinc/fzn_my_cumulative.mzn +57 -0
  208. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/minizinc/fzn_my_cumulative_reif.mzn +42 -0
  209. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/minizinc/ms_rcpsp_compute_workers_for_tasks.mzn +210 -0
  210. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/minizinc/ms_rcpsp_multi_mode_mzn_calendar.mzn +428 -0
  211. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/minizinc/ms_rcpsp_multi_mode_mzn_calendar_no_ressource.mzn +231 -0
  212. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/minizinc/ms_rcpsp_multi_mode_mzn_calendar_no_ressource_nomultitasking.mzn +334 -0
  213. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/minizinc/ms_rcpsp_preemptive.mzn +408 -0
  214. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/minizinc/ms_rcpsp_preemptive_partially_preemptive.mzn +444 -0
  215. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/minizinc/mspsp.mzn +257 -0
  216. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/minizinc/mspsp_compatible_all_solvers.mzn +202 -0
  217. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/minizinc/my_cumulative.mzn +20 -0
  218. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/minizinc/ressource_allocation_mspsp.mzn +157 -0
  219. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/multiskill_to_rcpsp.py +171 -0
  220. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/plots/__init__.py +3 -0
  221. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/plots/plot_solution.py +386 -0
  222. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/rcpsp_multiskill.py +3679 -0
  223. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/rcpsp_multiskill_mslib_parser.py +198 -0
  224. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/rcpsp_multiskill_mspsp_parser.py +114 -0
  225. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/rcpsp_multiskill_parser.py +215 -0
  226. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/rcpsp_multiskill_solvers.py +186 -0
  227. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/solvers/__init__.py +3 -0
  228. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/solvers/calendar_solver_iterative.py +683 -0
  229. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/solvers/cp_lns_solver.py +250 -0
  230. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/solvers/cp_solver_mspsp_instlib.py +446 -0
  231. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/solvers/cp_solvers.py +2225 -0
  232. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/solvers/lns_post_process_rcpsp.py +643 -0
  233. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/solvers/lp_model.py +375 -0
  234. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/solvers/ms_rcpsp_cp_lns_solver.py +670 -0
  235. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/solvers/ms_rcpsp_ga_solver.py +34 -0
  236. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/solvers/ms_rcpsp_lp_lns_solver.py +213 -0
  237. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/solvers/multimode_transposition.py +248 -0
  238. discrete_optimization-0.3.0/discrete_optimization/rcpsp_multiskill/solvers/solver_rcpsp_based.py +65 -0
  239. discrete_optimization-0.3.0/discrete_optimization/tsp/__init__.py +3 -0
  240. discrete_optimization-0.3.0/discrete_optimization/tsp/common_tools_tsp.py +92 -0
  241. discrete_optimization-0.3.0/discrete_optimization/tsp/minizinc/tsp_float.mzn +75 -0
  242. discrete_optimization-0.3.0/discrete_optimization/tsp/minizinc/tsp_int.mzn +75 -0
  243. discrete_optimization-0.3.0/discrete_optimization/tsp/mutation/__init__.py +3 -0
  244. discrete_optimization-0.3.0/discrete_optimization/tsp/mutation/mutation_tsp.py +381 -0
  245. discrete_optimization-0.3.0/discrete_optimization/tsp/plots/plot_tsp.py +31 -0
  246. discrete_optimization-0.3.0/discrete_optimization/tsp/solver/__init__.py +3 -0
  247. discrete_optimization-0.3.0/discrete_optimization/tsp/solver/solver_lp_iterative.py +795 -0
  248. discrete_optimization-0.3.0/discrete_optimization/tsp/solver/solver_ortools.py +120 -0
  249. discrete_optimization-0.3.0/discrete_optimization/tsp/solver/tsp_cp_solver.py +110 -0
  250. discrete_optimization-0.3.0/discrete_optimization/tsp/solver/tsp_solver.py +10 -0
  251. discrete_optimization-0.3.0/discrete_optimization/tsp/tsp_model.py +481 -0
  252. discrete_optimization-0.3.0/discrete_optimization/tsp/tsp_parser.py +64 -0
  253. discrete_optimization-0.3.0/discrete_optimization/tsp/tsp_solvers.py +85 -0
  254. discrete_optimization-0.3.0/discrete_optimization/vrp/__init__.py +3 -0
  255. discrete_optimization-0.3.0/discrete_optimization/vrp/mutation/__init__.py +3 -0
  256. discrete_optimization-0.3.0/discrete_optimization/vrp/mutation/mutation_vrp.py +495 -0
  257. discrete_optimization-0.3.0/discrete_optimization/vrp/solver/__init__.py +3 -0
  258. discrete_optimization-0.3.0/discrete_optimization/vrp/solver/greedy_vrp.py +19 -0
  259. discrete_optimization-0.3.0/discrete_optimization/vrp/solver/lp_vrp_iterative.py +1137 -0
  260. discrete_optimization-0.3.0/discrete_optimization/vrp/solver/lp_vrp_iterative_pymip.py +544 -0
  261. discrete_optimization-0.3.0/discrete_optimization/vrp/solver/solver_ortools.py +205 -0
  262. discrete_optimization-0.3.0/discrete_optimization/vrp/solver/vrp_solver.py +11 -0
  263. discrete_optimization-0.3.0/discrete_optimization/vrp/vrp_model.py +408 -0
  264. discrete_optimization-0.3.0/discrete_optimization/vrp/vrp_parser.py +85 -0
  265. discrete_optimization-0.3.0/discrete_optimization/vrp/vrp_solvers.py +62 -0
  266. discrete_optimization-0.3.0/discrete_optimization/vrp/vrp_toolbox.py +51 -0
  267. discrete_optimization-0.3.0/discrete_optimization.egg-info/PKG-INFO +116 -0
  268. discrete_optimization-0.3.0/discrete_optimization.egg-info/SOURCES.txt +414 -0
  269. discrete_optimization-0.3.0/discrete_optimization.egg-info/dependency_links.txt +1 -0
  270. discrete_optimization-0.3.0/discrete_optimization.egg-info/requires.txt +26 -0
  271. discrete_optimization-0.3.0/discrete_optimization.egg-info/top_level.txt +1 -0
  272. discrete_optimization-0.3.0/docs/Makefile +20 -0
  273. discrete_optimization-0.3.0/docs/README.md +11 -0
  274. discrete_optimization-0.3.0/docs/generate_nb_index.py +285 -0
  275. discrete_optimization-0.3.0/docs/make.bat +35 -0
  276. discrete_optimization-0.3.0/docs/requirements.txt +3 -0
  277. discrete_optimization-0.3.0/docs/source/_static/versions.js +17 -0
  278. discrete_optimization-0.3.0/docs/source/_templates/versions.html +13 -0
  279. discrete_optimization-0.3.0/docs/source/api/modules.md +8 -0
  280. discrete_optimization-0.3.0/docs/source/conf.py +92 -0
  281. discrete_optimization-0.3.0/docs/source/contribute.md +345 -0
  282. discrete_optimization-0.3.0/docs/source/getting_started.md +4 -0
  283. discrete_optimization-0.3.0/docs/source/index.md +39 -0
  284. discrete_optimization-0.3.0/docs/source/install.md +122 -0
  285. discrete_optimization-0.3.0/docs/source/notebooks.template.md +13 -0
  286. discrete_optimization-0.3.0/examples/coloring/coloring_asp_solver.py +59 -0
  287. discrete_optimization-0.3.0/examples/coloring/coloring_cpspat_solver_example.py +84 -0
  288. discrete_optimization-0.3.0/examples/coloring/coloring_gurobi_solver.py +40 -0
  289. discrete_optimization-0.3.0/examples/coloring/coloring_run_all_solvers.py +41 -0
  290. discrete_optimization-0.3.0/examples/coloring/optuna_all_solvers_coloring_with_pruning_based_on_time.py +204 -0
  291. discrete_optimization-0.3.0/examples/coloring/optuna_all_solvers_coloring_without_pruning.py +201 -0
  292. discrete_optimization-0.3.0/examples/coloring/optuna_full_example_all_solvers_timed_pruning.py +249 -0
  293. discrete_optimization-0.3.0/examples/coloring/optuna_full_example_coloring.py +143 -0
  294. discrete_optimization-0.3.0/examples/coloring/toulbar_coloring_example.py +69 -0
  295. discrete_optimization-0.3.0/examples/facility/gphh_facility_example.py +32 -0
  296. discrete_optimization-0.3.0/examples/knapsack/knapsack_asp_solver.py +28 -0
  297. discrete_optimization-0.3.0/examples/knapsack/knapsack_cpmpy.py +34 -0
  298. discrete_optimization-0.3.0/examples/knapsack/knapsack_cpsat_solver.py +29 -0
  299. discrete_optimization-0.3.0/examples/knapsack/knapsack_decomposition_solver.py +102 -0
  300. discrete_optimization-0.3.0/examples/knapsack/knapsack_multidimensional.py +134 -0
  301. discrete_optimization-0.3.0/examples/knapsack/multiscenario_knap.py +78 -0
  302. discrete_optimization-0.3.0/examples/knapsack/optuna_example.py +182 -0
  303. discrete_optimization-0.3.0/examples/knapsack/solvers_run.py +59 -0
  304. discrete_optimization-0.3.0/examples/pickup_vrp/classic_ortools_example.py +509 -0
  305. discrete_optimization-0.3.0/examples/pickup_vrp/cp_solver_gpdp_example.py +1697 -0
  306. discrete_optimization-0.3.0/examples/pickup_vrp/linear_flow_solver_examples.py +50 -0
  307. discrete_optimization-0.3.0/examples/pickup_vrp/loading_example.py +310 -0
  308. discrete_optimization-0.3.0/examples/pickup_vrp/optuna_full_example.py +153 -0
  309. discrete_optimization-0.3.0/examples/pickup_vrp/pickup_vrp_ortools_with_optuna.py +129 -0
  310. discrete_optimization-0.3.0/examples/pickup_vrp/pickup_vrp_ortools_with_optuna_auto.py +139 -0
  311. discrete_optimization-0.3.0/examples/pickup_vrp/pickup_vrp_ortools_with_optuna_with_pruning.py +131 -0
  312. discrete_optimization-0.3.0/examples/pickup_vrp/pickup_vrp_ortools_with_optuna_with_pruning_v4.py +131 -0
  313. discrete_optimization-0.3.0/examples/pickup_vrp/pickup_vrp_ortools_with_optuna_with_pruning_v4_auto.py +148 -0
  314. discrete_optimization-0.3.0/examples/pickup_vrp/plots_wip/animated_plot.py +651 -0
  315. discrete_optimization-0.3.0/examples/pickup_vrp/time_windows_example.py +113 -0
  316. discrete_optimization-0.3.0/examples/rcpsp/rcpsp_cpsat_solver_example.py +116 -0
  317. discrete_optimization-0.3.0/examples/rcpsp/rcpsp_lns_example.py +38 -0
  318. discrete_optimization-0.3.0/examples/rcpsp/rcpsp_local_search_with_optuna.py +150 -0
  319. discrete_optimization-0.3.0/examples/rcpsp/rcpsp_local_search_with_optuna_multiobj.py +147 -0
  320. discrete_optimization-0.3.0/examples/rcpsp/rcpsp_local_search_with_optuna_with_pruning.py +151 -0
  321. discrete_optimization-0.3.0/examples/rcpsp/rcpsp_lp_cplex_solver.py +40 -0
  322. discrete_optimization-0.3.0/examples/rcpsp/rcpsp_pareto_example.py +229 -0
  323. discrete_optimization-0.3.0/examples/rcpsp/rcpsp_solvers_script.py +80 -0
  324. discrete_optimization-0.3.0/examples/rcpsp/robustness_experiments.py +414 -0
  325. discrete_optimization-0.3.0/examples/rcpsp_multiskill/mslib/mslib_parse_and_solve.py +36 -0
  326. discrete_optimization-0.3.0/examples/rcpsp_multiskill/mspsp/mspsp_parse_and_solve.py +61 -0
  327. discrete_optimization-0.3.0/examples/rcpsp_multiskill/sgs_runs.py +241 -0
  328. discrete_optimization-0.3.0/examples/rcpsp_multiskill/solvers/rcpsp_multiskills_runs.py +532 -0
  329. discrete_optimization-0.3.0/examples/vrp/vrp_solver_example.py +65 -0
  330. discrete_optimization-0.3.0/notebooks/Knapsack tutorial.ipynb +783 -0
  331. discrete_optimization-0.3.0/notebooks/RCPSP tutorials/RCPSP-1 Introduction.ipynb +553 -0
  332. discrete_optimization-0.3.0/notebooks/RCPSP tutorials/RCPSP-2 Heuristics Solving.ipynb +322 -0
  333. discrete_optimization-0.3.0/notebooks/RCPSP tutorials/RCPSP-3 Local search.ipynb +611 -0
  334. discrete_optimization-0.3.0/notebooks/RCPSP tutorials/RCPSP-4 Linear programming.ipynb +295 -0
  335. discrete_optimization-0.3.0/notebooks/RCPSP tutorials/RCPSP-5 Constraint Programming.ipynb +293 -0
  336. discrete_optimization-0.3.0/notebooks/RCPSP tutorials/RCPSP-6 Large Neighbourhood Search .ipynb +428 -0
  337. discrete_optimization-0.3.0/notebooks/img/sgs.png +0 -0
  338. discrete_optimization-0.3.0/notebooks/z_Advanced/callbacks.ipynb +458 -0
  339. discrete_optimization-0.3.0/notebooks/z_Advanced/optuna.ipynb +798 -0
  340. discrete_optimization-0.3.0/pyproject.toml +78 -0
  341. discrete_optimization-0.3.0/scripts/trigger_binder.sh +28 -0
  342. discrete_optimization-0.3.0/setup.cfg +4 -0
  343. discrete_optimization-0.3.0/tests/coloring/test_coloring.py +451 -0
  344. discrete_optimization-0.3.0/tests/facility/test_facility_cp.py +34 -0
  345. discrete_optimization-0.3.0/tests/facility/test_facility_ga.py +35 -0
  346. discrete_optimization-0.3.0/tests/facility/test_facility_greedy.py +21 -0
  347. discrete_optimization-0.3.0/tests/facility/test_facility_lp.py +79 -0
  348. discrete_optimization-0.3.0/tests/facility/test_facility_lp_lns.py +81 -0
  349. discrete_optimization-0.3.0/tests/facility/test_facility_parser.py +21 -0
  350. discrete_optimization-0.3.0/tests/facility/test_facility_problem.py +21 -0
  351. discrete_optimization-0.3.0/tests/generic_rcpsp_tools/test_graph_tools_rcpsp.py +37 -0
  352. discrete_optimization-0.3.0/tests/generic_tools/callbacks/test_ortools_with_callbacks.py +102 -0
  353. discrete_optimization-0.3.0/tests/generic_tools/callbacks/test_sa_with_callbacks.py +317 -0
  354. discrete_optimization-0.3.0/tests/generic_tools/ea/test_ga.py +201 -0
  355. discrete_optimization-0.3.0/tests/generic_tools/hyperparameters/test_hyperparameter.py +304 -0
  356. discrete_optimization-0.3.0/tests/generic_tools/mutations/test_bool.py +27 -0
  357. discrete_optimization-0.3.0/tests/generic_tools/test_graph_api.py +20 -0
  358. discrete_optimization-0.3.0/tests/generic_tools/test_multiobj_utils.py +30 -0
  359. discrete_optimization-0.3.0/tests/knapsack/test_knapsack_cp_solver.py +45 -0
  360. discrete_optimization-0.3.0/tests/knapsack/test_knapsack_cpmyp.py +24 -0
  361. discrete_optimization-0.3.0/tests/knapsack/test_knapsack_cpsat_solver.py +24 -0
  362. discrete_optimization-0.3.0/tests/knapsack/test_knapsack_decomposition_solver.py +91 -0
  363. discrete_optimization-0.3.0/tests/knapsack/test_knapsack_ga.py +58 -0
  364. discrete_optimization-0.3.0/tests/knapsack/test_knapsack_gphh.py +48 -0
  365. discrete_optimization-0.3.0/tests/knapsack/test_knapsack_greedy_solvers.py +19 -0
  366. discrete_optimization-0.3.0/tests/knapsack/test_knapsack_lns_cp_solver.py +184 -0
  367. discrete_optimization-0.3.0/tests/knapsack/test_knapsack_lp_lns_solver.py +64 -0
  368. discrete_optimization-0.3.0/tests/knapsack/test_knapsack_ls_solver.py +94 -0
  369. discrete_optimization-0.3.0/tests/knapsack/test_knapsack_nsga.py +63 -0
  370. discrete_optimization-0.3.0/tests/knapsack/test_knapsack_solvers.py +53 -0
  371. discrete_optimization-0.3.0/tests/knapsack/test_parser.py +19 -0
  372. discrete_optimization-0.3.0/tests/pickup_vrp/builders/test_instance_builders.py +163 -0
  373. discrete_optimization-0.3.0/tests/pickup_vrp/builders/test_linear_flow_solver.py +299 -0
  374. discrete_optimization-0.3.0/tests/pickup_vrp/builders/test_linear_flow_solver_pymip.py +251 -0
  375. discrete_optimization-0.3.0/tests/pickup_vrp/solvers/test_ortools_solver.py +108 -0
  376. discrete_optimization-0.3.0/tests/rcpsp/solver/test_large_neighborhood_search_solver.py +36 -0
  377. discrete_optimization-0.3.0/tests/rcpsp/solver/test_rcpsp_cp.py +382 -0
  378. discrete_optimization-0.3.0/tests/rcpsp/solver/test_rcpsp_cp_lns.py +144 -0
  379. discrete_optimization-0.3.0/tests/rcpsp/solver/test_rcpsp_cpm.py +259 -0
  380. discrete_optimization-0.3.0/tests/rcpsp/solver/test_rcpsp_find_modes.py +23 -0
  381. discrete_optimization-0.3.0/tests/rcpsp/solver/test_rcpsp_local_search.py +354 -0
  382. discrete_optimization-0.3.0/tests/rcpsp/solver/test_rcpsp_lp.py +91 -0
  383. discrete_optimization-0.3.0/tests/rcpsp/solver/test_rcpsp_lp_lns.py +131 -0
  384. discrete_optimization-0.3.0/tests/rcpsp/solver/test_rcpsp_pile.py +115 -0
  385. discrete_optimization-0.3.0/tests/rcpsp/solver/test_rcpsp_resource_optim.py +64 -0
  386. discrete_optimization-0.3.0/tests/rcpsp/test_rcpsp_distance_between_solutions.py +101 -0
  387. discrete_optimization-0.3.0/tests/rcpsp/test_rcpsp_ga.py +266 -0
  388. discrete_optimization-0.3.0/tests/rcpsp/test_rcpsp_model.py +179 -0
  389. discrete_optimization-0.3.0/tests/rcpsp/test_rcpsp_model_preemptive.py +143 -0
  390. discrete_optimization-0.3.0/tests/rcpsp/test_rcpsp_nsga.py +35 -0
  391. discrete_optimization-0.3.0/tests/rcpsp/test_rcpsp_parser.py +206 -0
  392. discrete_optimization-0.3.0/tests/rcpsp/test_rcpsp_preemptive.py +269 -0
  393. discrete_optimization-0.3.0/tests/rcpsp/test_rcpsp_uncertain_model.py +715 -0
  394. discrete_optimization-0.3.0/tests/rcpsp/test_rcpsp_utils.py +54 -0
  395. discrete_optimization-0.3.0/tests/rcpsp/test_sgs_without_array.py +92 -0
  396. discrete_optimization-0.3.0/tests/rcpsp_multiskill/test_mspsp_cp.py +58 -0
  397. discrete_optimization-0.3.0/tests/rcpsp_multiskill/test_rcpsp_ms_cp.py +321 -0
  398. discrete_optimization-0.3.0/tests/rcpsp_multiskill/test_rcpsp_ms_ga.py +282 -0
  399. discrete_optimization-0.3.0/tests/rcpsp_multiskill/test_rcpsp_ms_lp.py +139 -0
  400. discrete_optimization-0.3.0/tests/rcpsp_multiskill/test_rcpsp_ms_lp_lns.py +96 -0
  401. discrete_optimization-0.3.0/tests/rcpsp_multiskill/test_rcpsp_ms_ls.py +120 -0
  402. discrete_optimization-0.3.0/tests/rcpsp_multiskill/test_rcpsp_ms_model.py +197 -0
  403. discrete_optimization-0.3.0/tests/rcpsp_multiskill/test_rcpsp_ms_partially_preemptive.py +138 -0
  404. discrete_optimization-0.3.0/tests/rcpsp_multiskill/test_rcpsp_ms_rcpsp_based_solver.py +110 -0
  405. discrete_optimization-0.3.0/tests/rcpsp_multiskill/test_rcpsp_ms_to_rcpsp.py +94 -0
  406. discrete_optimization-0.3.0/tests/show_do_path.py +9 -0
  407. discrete_optimization-0.3.0/tests/test_import_all_submodules.py +39 -0
  408. discrete_optimization-0.3.0/tests/tsp/test_tsp_common_tools.py +13 -0
  409. discrete_optimization-0.3.0/tests/tsp/test_tsp_cp.py +46 -0
  410. discrete_optimization-0.3.0/tests/tsp/test_tsp_ga.py +63 -0
  411. discrete_optimization-0.3.0/tests/tsp/test_tsp_lp_iterative.py +29 -0
  412. discrete_optimization-0.3.0/tests/tsp/test_tsp_ls.py +183 -0
  413. discrete_optimization-0.3.0/tests/tsp/test_tsp_model.py +27 -0
  414. discrete_optimization-0.3.0/tests/tsp/test_tsp_mutation.py +28 -0
  415. discrete_optimization-0.3.0/tests/tsp/test_tsp_ortools.py +23 -0
  416. discrete_optimization-0.3.0/tests/vrp/test_vrp_solver.py +33 -0
@@ -0,0 +1,129 @@
1
+ name: Build doc
2
+
3
+ on:
4
+ workflow_call:
5
+ inputs:
6
+ doc-artifact-name:
7
+ description: "Name of the artifact containing the built doc"
8
+ required: false
9
+ default: "doc"
10
+ type: string
11
+ doc-path:
12
+ description: "Path where to extract the built doc"
13
+ required: false
14
+ default: "docs/build/html"
15
+ type: string
16
+ notebooks-repo-url:
17
+ description: |
18
+ Url of the repository containing the notebooks, used to generate github and colab links.
19
+ By default, the current repository url.
20
+ required: false
21
+ default: ""
22
+ type: string
23
+ notebooks-branch:
24
+ description: |
25
+ Branch containing the notebooks, used to generate github and colab links.
26
+ By default, the current branch.
27
+ required: false
28
+ default: ""
29
+ type: string
30
+ doc-prerequisites-cmdline:
31
+ description: |
32
+ Command line to run before building doc.
33
+ required: false
34
+ default: ""
35
+ type: string
36
+
37
+ outputs:
38
+ doc-version:
39
+ description: "Version name of the generated doc. Correspond to the version name used by Sphinx."
40
+ value: ${{ jobs.build-doc.outputs.doc_version }}
41
+
42
+ jobs:
43
+ build-doc:
44
+ outputs:
45
+ doc_version: ${{ steps.sphinx-build.outputs.doc_version }}
46
+ runs-on: ubuntu-latest
47
+ env:
48
+ python-version: "3.9"
49
+ steps:
50
+ - name: Set env variables for github links in doc
51
+ run: |
52
+ # notebooks source repo and branch. First try to use workflow inputs
53
+ AUTODOC_NOTEBOOKS_REPO_URL=${{ inputs.notebooks-repo-url }}
54
+ AUTODOC_NOTEBOOKS_BRANCH=${{ inputs.notebooks-branch }}
55
+ # use github context if not defined in inputs
56
+ if [[ $GITHUB_REF == refs/pull* ]];
57
+ then
58
+ if [ -z "${AUTODOC_NOTEBOOKS_REPO_URL}" ]; then
59
+ AUTODOC_NOTEBOOKS_REPO_URL="${GITHUB_SERVER_URL}/${{ github.event.pull_request.head.repo.full_name }}"
60
+ fi
61
+ if [ -z "${AUTODOC_NOTEBOOKS_BRANCH}" ]; then
62
+ AUTODOC_NOTEBOOKS_BRANCH=${GITHUB_HEAD_REF}
63
+ fi
64
+ elif [[ $GITHUB_REF == refs/heads* ]];
65
+ then
66
+ if [ -z "${AUTODOC_NOTEBOOKS_REPO_URL}" ]; then
67
+ AUTODOC_NOTEBOOKS_REPO_URL=${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}
68
+ fi
69
+ if [ -z "${AUTODOC_NOTEBOOKS_BRANCH}" ]; then
70
+ AUTODOC_NOTEBOOKS_BRANCH=${GITHUB_REF/refs\/heads\//}
71
+ fi
72
+ elif [[ $GITHUB_REF == refs/tags* ]];
73
+ then
74
+ if [ -z "${AUTODOC_NOTEBOOKS_REPO_URL}" ]; then
75
+ AUTODOC_NOTEBOOKS_REPO_URL=${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}
76
+ fi
77
+ if [ -z "${AUTODOC_NOTEBOOKS_BRANCH}" ]; then
78
+ AUTODOC_NOTEBOOKS_BRANCH=${GITHUB_REF/refs\/tags\//}
79
+ fi
80
+ fi
81
+ # export in GITHUB_ENV for next steps
82
+ echo "AUTODOC_NOTEBOOKS_REPO_URL=${AUTODOC_NOTEBOOKS_REPO_URL}" >> $GITHUB_ENV
83
+ echo "AUTODOC_NOTEBOOKS_BRANCH=${AUTODOC_NOTEBOOKS_BRANCH}" >> $GITHUB_ENV
84
+ # check computed variables
85
+ echo "Notebooks source: ${AUTODOC_NOTEBOOKS_REPO_URL}/tree/${AUTODOC_NOTEBOOKS_BRANCH}"
86
+ - uses: actions/checkout@v4
87
+ - name: Setup python
88
+ uses: actions/setup-python@v5
89
+ with:
90
+ python-version: ${{ env.python-version }}
91
+ cache: "pip"
92
+ cache-dependency-path: |
93
+ pyproject.toml
94
+ docs/requirements.txt
95
+ - name: Install doc dependencies
96
+ run: |
97
+ python -m pip install -U pip setuptools
98
+ pip install .
99
+ pip install -r docs/requirements.txt
100
+ - name: generate documentation
101
+ id: sphinx-build
102
+ run: |
103
+ # prerequisites
104
+ ${{ inputs.doc-prerequisites-cmdline }}
105
+ # move to documentation directory
106
+ cd docs
107
+ # generate api doc source files
108
+ sphinx-apidoc -o source/api -f -T ../discrete_optimization
109
+ # generate available notebooks list
110
+ python generate_nb_index.py
111
+ # build doc html pages
112
+ sphinx-build -M html source build
113
+ # specify it is a nojekyll site
114
+ touch build/html/.nojekyll
115
+ # store version name found by sphinx
116
+ doc_version=$(python -c '
117
+ import os
118
+ import sphinx.config
119
+
120
+ config = sphinx.config.Config.read(os.path.abspath("source"))
121
+ config.init_values()
122
+ print(config.version)
123
+ ')
124
+ echo doc_version=${doc_version} >> $GITHUB_OUTPUT
125
+ - name: upload as artifact
126
+ uses: actions/upload-artifact@v4
127
+ with:
128
+ name: ${{ inputs.doc-artifact-name }}
129
+ path: ${{ inputs.doc-path }}
@@ -0,0 +1,399 @@
1
+ name: Build discrete-optimization
2
+
3
+ env:
4
+ MAIN_REPO_NAME: 'airbus/discrete-optimization'
5
+
6
+ on:
7
+ push:
8
+ branches:
9
+ - "**"
10
+ tags:
11
+ - 'v[0-9]+.[0-9]+.[0-9]+'
12
+ pull_request:
13
+ workflow_dispatch:
14
+
15
+ concurrency:
16
+ group: ${{ github.workflow }}-${{ github.ref }}
17
+ cancel-in-progress: true
18
+
19
+ jobs:
20
+
21
+ linters:
22
+ runs-on: ubuntu-latest
23
+ steps:
24
+ - uses: actions/checkout@v4
25
+ - name: create requirements.txt so that pip cache with setup-python works
26
+ run: echo "pre-commit" > requirements_precommit.txt
27
+ - uses: actions/setup-python@v5
28
+ with:
29
+ python-version: "3.8"
30
+ cache: "pip"
31
+ cache-dependency-path: requirements_precommit.txt
32
+ - name: install pre-commit
33
+ run: python -m pip install pre-commit
34
+ - name: get cached pre-commit hooks
35
+ uses: actions/cache@v4
36
+ with:
37
+ path: ~/.cache/pre-commit
38
+ key: pre-commit|${{ env.pythonLocation }}|${{ hashFiles('.pre-commit-config.yaml') }}
39
+ - name: pre-commit checks
40
+ run: pre-commit run --show-diff-on-failure --color=always --all-files
41
+
42
+ trigger:
43
+ # store trigger reason
44
+ runs-on: ubuntu-latest
45
+ outputs:
46
+ is_release: ${{ steps.reason.outputs.is_release }}
47
+ is_push_on_default_branch: ${{ steps.reason.outputs.is_push_on_default_branch }}
48
+ steps:
49
+ - id: reason
50
+ run: |
51
+ echo "is_release=${{ startsWith(github.ref, 'refs/tags/v') }}" >> $GITHUB_OUTPUT
52
+ echo "is_push_on_default_branch=${{ github.ref == format('refs/heads/{0}', github.event.repository.default_branch) }}" >> $GITHUB_OUTPUT
53
+
54
+ build:
55
+ runs-on: ubuntu-latest
56
+ needs: trigger
57
+ outputs:
58
+ do_version: ${{ steps.get_library_version.outputs.version }}
59
+ steps:
60
+ - name: Checkout source code
61
+ uses: actions/checkout@v4
62
+ - name: create requirements.txt so that pip cache with setup-python works
63
+ run:
64
+ echo "build" > requirements_build.txt
65
+ - uses: actions/setup-python@v5
66
+ with:
67
+ python-version: "3.8"
68
+ cache: "pip"
69
+ cache-dependency-path: requirements_build.txt
70
+ - name: Install build dependencies
71
+ run: pip install -U build
72
+ - name: Build discrete-optimization (wheel + source code)
73
+ run: python -m build
74
+ - name: Upload as build artifacts
75
+ uses: actions/upload-artifact@v4
76
+ with:
77
+ name: dist
78
+ path: dist
79
+ - name: get library version and save it
80
+ id: get_library_version
81
+ run: |
82
+ wheelfile=$(ls ./dist/discrete_optimization*.whl)
83
+ version=$(python -c "print('$wheelfile'.split('-')[1])")
84
+ echo "version=$version"
85
+ echo "version=$version" >> $GITHUB_OUTPUT
86
+
87
+ test:
88
+ needs: build
89
+ strategy:
90
+ fail-fast: false
91
+ matrix:
92
+ os: ["ubuntu-latest", "macos-12", "macos-latest", "windows-latest"]
93
+ python-version: ["3.8", "3.11"]
94
+ wo_gurobi: ["", "without gurobi"]
95
+ include:
96
+ - os: "ubuntu-latest"
97
+ minizinc_config_cmdline: export PATH=$PATH:$(pwd)/bin/squashfs-root/usr/bin; export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd)/bin/squashfs-root/usr/lib
98
+ minizinc_cache_path: $(pwd)/bin/squashfs-root
99
+ minizinc_url: https://github.com/MiniZinc/MiniZincIDE/releases/download/2.8.3/MiniZincIDE-2.8.3-x86_64.AppImage
100
+ minizinc_downloaded_filepath: bin/minizinc.AppImage
101
+ minizinc_install_cmdline: cd bin; sudo chmod +x minizinc.AppImage; sudo ./minizinc.AppImage --appimage-extract; cd ..
102
+ minizinc_prerequisites_cmdline: sudo apt update && sudo apt install libegl1 -y
103
+ - os: "macos-12"
104
+ minizinc_config_cmdline: export PATH=$PATH:$(pwd)/bin/MiniZincIDE.app/Contents/Resources
105
+ minizinc_cache_path: $(pwd)/bin/MiniZincIDE.app
106
+ minizinc_url: https://github.com/MiniZinc/MiniZincIDE/releases/download/2.8.3/MiniZincIDE-2.8.3-bundled.dmg
107
+ minizinc_downloaded_filepath: bin/minizinc.dmg
108
+ minizinc_install_cmdline: sudo hdiutil attach bin/minizinc.dmg; sudo cp -R /Volumes/MiniZinc*/MiniZincIDE.app bin/.
109
+ minizinc_prerequisites_cmdline: ""
110
+ - os: "macos-latest"
111
+ minizinc_config_cmdline: export PATH=$PATH:$(pwd)/bin/MiniZincIDE.app/Contents/Resources
112
+ minizinc_cache_path: $(pwd)/bin/MiniZincIDE.app
113
+ minizinc_url: https://github.com/MiniZinc/MiniZincIDE/releases/download/2.8.3/MiniZincIDE-2.8.3-bundled.dmg
114
+ minizinc_downloaded_filepath: bin/minizinc.dmg
115
+ minizinc_install_cmdline: sudo hdiutil attach bin/minizinc.dmg; sudo cp -R /Volumes/MiniZinc*/MiniZincIDE.app bin/.
116
+ minizinc_prerequisites_cmdline: ""
117
+ - os: "windows-latest"
118
+ minizinc_config_cmdline: export PATH=$PATH:~/AppData/Local/Programs/MiniZinc
119
+ minizinc_cache_path: ~/AppData/Local/Programs/MiniZinc
120
+ minizinc_url: https://github.com/MiniZinc/MiniZincIDE/releases/download/2.8.3/MiniZincIDE-2.8.3-bundled-setup-win64.exe
121
+ minizinc_downloaded_filepath: minizinc_setup.exe
122
+ minizinc_install_cmdline: cmd //c "minizinc_setup.exe /verysilent /currentuser /norestart /suppressmsgboxes /sp"
123
+ minizinc_prerequisites_cmdline: ""
124
+ - coverage: false # generally no coverage to avoid multiple reports
125
+ - coverage: true # coverage only for one entry of the matrix
126
+ os: "ubuntu-latest"
127
+ python-version: "3.11"
128
+ wo_gurobi: ""
129
+ exclude:
130
+ - os: "windows-latest"
131
+ wo_gurobi: "without gurobi"
132
+ - os: "macos-12"
133
+ wo_gurobi: "without gurobi"
134
+ - os: "macos-latest"
135
+ wo_gurobi: "without gurobi"
136
+ - os: "ubuntu-latest"
137
+ wo_gurobi: "without gurobi"
138
+ python-version: "3.8"
139
+ - os: "macos-latest"
140
+ python-version: "3.8"
141
+ - os: "macos-12"
142
+ python-version: "3.11"
143
+ runs-on: ${{ matrix.os }}
144
+ defaults:
145
+ run:
146
+ shell: bash
147
+ steps:
148
+ - name: Checkout discrete-optimization source code
149
+ uses: actions/checkout@v4
150
+ - name: Set up Python ${{ matrix.python-version }}
151
+ uses: actions/setup-python@v5
152
+ with:
153
+ python-version: ${{ matrix.python-version }}
154
+ cache: "pip"
155
+ cache-dependency-path: pyproject.toml
156
+ - name: Download artifacts
157
+ uses: actions/download-artifact@v4
158
+ with:
159
+ name: dist
160
+ path: dist
161
+ - name: Install prerelease version of pymip (only for macos arm64)
162
+ if: matrix.os == 'macos-latest'
163
+ run: |
164
+ python -m pip install -U pip
165
+ pip install mip==1.16rc0
166
+ - name: Install only discrete-optimization
167
+ run: |
168
+ python -m pip install -U pip
169
+ wheelfile=$(ls ./dist/discrete_optimization*.whl)
170
+ pip install ${wheelfile}
171
+ - name: Check import work without minizinc if DO_SKIP_MZN_CHECK set
172
+ run: |
173
+ export DO_SKIP_MZN_CHECK=1
174
+ python -c "import discrete_optimization"
175
+ - name: Check import fails without minizinc if DO_SKIP_MZN_CHECK unset
176
+ run: |
177
+ python -c "
178
+ try:
179
+ import discrete_optimization
180
+ except RuntimeError:
181
+ pass
182
+ else:
183
+ raise AssertionError('We should not be able to import discrete_optimization without minizinc being installed.')
184
+ "
185
+ - name: Create bin/
186
+ run: mkdir -p bin
187
+ - name: Minizinc prerequisites
188
+ run: |
189
+ ${{ matrix.minizinc_prerequisites_cmdline }}
190
+ - name: get MiniZinc path to cache
191
+ id: get-mzn-cache-path
192
+ run: |
193
+ echo "path=${{ matrix.minizinc_cache_path }}" >> $GITHUB_OUTPUT # expands variables
194
+ - name: Restore MiniZinc cache
195
+ id: cache-minizinc
196
+ uses: actions/cache@v4
197
+ with:
198
+ path: ${{ steps.get-mzn-cache-path.outputs.path }}
199
+ key: ${{ matrix.minizinc_url }}
200
+ - name: Download MiniZinc
201
+ if: steps.cache-minizinc.outputs.cache-hit != 'true'
202
+ run: |
203
+ curl -o "${{ matrix.minizinc_downloaded_filepath }}" -L ${{ matrix.minizinc_url }}
204
+ - name: Install MiniZinc
205
+ if: steps.cache-minizinc.outputs.cache-hit != 'true'
206
+ run: |
207
+ ${{ matrix.minizinc_install_cmdline }}
208
+ - name: Test minizinc install
209
+ run: |
210
+ ${{ matrix.minizinc_config_cmdline }}
211
+ minizinc --version
212
+ - name: Check imports are working
213
+ run: |
214
+ # configure minizinc
215
+ ${{ matrix.minizinc_config_cmdline }}
216
+ # check imports
217
+ python tests/test_import_all_submodules.py
218
+ - name: Install test dependencies
219
+ run: |
220
+ wheelfile=$(ls ./dist/discrete_optimization*.whl)
221
+ pip install ${wheelfile}[test]
222
+ if [ "${{ matrix.wo_gurobi }}" != "without gurobi" ]; then
223
+ echo "install gurobi"
224
+ pip install gurobipy
225
+ python -c "import gurobipy"
226
+ fi
227
+ - name: Restore tests data cache
228
+ id: cache-data
229
+ uses: actions/cache@v4
230
+ with:
231
+ path: ~/discrete_optimization_data
232
+ key: data-${{ hashFiles('discrete_optimization/datasets.py') }}
233
+ - name: Fetch data for tests
234
+ if: steps.cache-data.outputs.cache-hit != 'true'
235
+ run: |
236
+ ${{ matrix.minizinc_config_cmdline }}
237
+ python -m discrete_optimization.datasets
238
+ - name: Test with pytest (no coverage)
239
+ if: ${{ !matrix.coverage }}
240
+ run: |
241
+ # configure minizinc
242
+ ${{ matrix.minizinc_config_cmdline }}
243
+ # show library path used
244
+ pytest -s tests/show_do_path.py
245
+ # run test suite
246
+ MPLBACKEND="agg" NUMBA_BOUNDSCHECK=1 pytest \
247
+ -v --durations=0 --durations-min=10 \
248
+ tests
249
+ - name: Test with pytest (with coverage)
250
+ if: ${{ matrix.coverage }}
251
+ run: |
252
+ # configure minizinc
253
+ ${{ matrix.minizinc_config_cmdline }}
254
+ # create a tmp directory from which running the tests
255
+ # so that "--cov discrete_optimization" look for package installed via the wheel
256
+ # instead of the source directory in the repository (which would lead to a coverage of 0%)
257
+ mkdir -p tmp && cd tmp
258
+ # show library path used
259
+ pytest -s ../tests/show_do_path.py
260
+ # run test suite
261
+ MPLBACKEND="agg" NUMBA_BOUNDSCHECK=1 pytest \
262
+ --cov discrete_optimization \
263
+ --cov-report xml:coverage.xml \
264
+ --cov-report html:coverage_html \
265
+ --cov-report term \
266
+ -v --durations=0 --durations-min=10 \
267
+ ../tests
268
+ cd ..
269
+ - name: Upload coverage report as artifact
270
+ if: ${{ matrix.coverage }}
271
+ uses: actions/upload-artifact@v4
272
+ with:
273
+ name: coverage
274
+ path: |
275
+ tmp/coverage.xml
276
+ tmp/coverage_html
277
+
278
+ update-notebooks-for-colab-and-binder:
279
+ runs-on: ubuntu-latest
280
+ needs: [trigger, build]
281
+ outputs:
282
+ notebooks-branch: ${{ steps.write-output.outputs.notebooks_branch }}
283
+ binder-full-ref: ${{ steps.write-output.outputs.binder_full_ref }}
284
+ steps:
285
+ - name: Set default notebooks branch and binder env full ref
286
+ run: |
287
+ # default value: current branch
288
+ echo 'notebooks_branch="${{ github.ref_name}}"' >> $GITHUB_ENV
289
+ echo 'binder_full_ref="${{ github.repository }}/${{ github.ref_name}}"' >> $GITHUB_ENV
290
+ - uses: actions/checkout@v4
291
+ if: needs.trigger.outputs.is_release == 'true'
292
+ - name: replace d-o version to install in colab notebooks
293
+ if: needs.trigger.outputs.is_release == 'true'
294
+ run: |
295
+ version=${{ needs.build.outputs.do_version }}
296
+ old_pip_spec_pattern="\(pip.*install.*\)git+https.*egg=discrete-optimization"
297
+ new_pip_spec_pattern="\1discrete-optimization==$version"
298
+ if ${{ github.repository != env.MAIN_REPO_NAME && secrets.TEST_PYPI_API_TOKEN != '' }} == 'true'; then
299
+ # install from TestPypi if on a fork
300
+ new_pip_spec_pattern="${new_pip_spec_pattern} --extra-index-url https://test.pypi.org/simple/"
301
+ fi
302
+ shopt -s globstar # enable **
303
+ sed -i -e "s|${old_pip_spec_pattern}|${new_pip_spec_pattern}|" notebooks/**/*.ipynb
304
+ - name: replace d-o version to install in binder environment
305
+ if: needs.trigger.outputs.is_release == 'true'
306
+ run: |
307
+ version=${{ needs.build.outputs.do_version }}
308
+ linefilter="/^name/!"
309
+ old_pip_spec_pattern="\(\s*\)-.*discrete-optimization.*$"
310
+ new_pip_spec_pattern="\1- discrete-optimization==$version"
311
+ if ${{ github.repository != env.MAIN_REPO_NAME && secrets.TEST_PYPI_API_TOKEN != '' }} == 'true'; then
312
+ # install from TestPypi if on a fork
313
+ new_pip_spec_pattern="${new_pip_spec_pattern}\n\1- --extra-index-url https://test.pypi.org/simple/"
314
+ fi
315
+ sed_command="${linefilter}s|${old_pip_spec_pattern}|${new_pip_spec_pattern}|"
316
+ echo sed -i -e ${sed_command} binder/environment.yml
317
+ sed -i -e "${sed_command}" binder/environment.yml
318
+ - name: push modifications on a dedicated tag
319
+ if: needs.trigger.outputs.is_release == 'true'
320
+ id: push-tuto-release-tag
321
+ run: |
322
+ current_tag_name=${GITHUB_REF/refs\/tags\//} # stripping refs/tags/
323
+ new_tag_name="notebooks-${current_tag_name}"
324
+ echo ${new_tag_name}
325
+ git config user.name "Actions"
326
+ git config user.email "actions@github.com"
327
+ git commit binder/environment.yml notebooks -m "Install appropriate version of discrete-optimization"
328
+ git tag ${new_tag_name} -m "Use release ${current_tag_name} in binder and colab"
329
+ git push origin ${new_tag_name}
330
+ # store new tag name as notebooks branch
331
+ echo "notebooks_branch=${new_tag_name}" >> $GITHUB_ENV
332
+ echo "binder_full_ref=${{ github.repository }}/${new_tag_name}" >> $GITHUB_ENV
333
+ - name: write new notebooks branch in job outputs
334
+ id: write-output
335
+ run: |
336
+ echo "notebooks_branch=${notebooks_branch}" >> $GITHUB_OUTPUT
337
+ echo "binder_full_ref=${binder_full_ref}" >> $GITHUB_OUTPUT
338
+
339
+ build-doc:
340
+ needs: [update-notebooks-for-colab-and-binder]
341
+ uses: ./.github/workflows/build-doc.yml
342
+ with:
343
+ notebooks-branch: ${{ needs.update-notebooks-for-colab-and-binder.outputs.notebooks-branch }}
344
+ doc-prerequisites-cmdline: export DO_SKIP_MZN_CHECK=1
345
+
346
+ deploy:
347
+ # for release tags
348
+ runs-on: ubuntu-latest
349
+ needs: [trigger, test]
350
+ if: needs.trigger.outputs.is_release == 'true'
351
+ steps:
352
+ - name: Download wheels artifact
353
+ uses: actions/download-artifact@v4
354
+ with:
355
+ name: dist
356
+ path: dist
357
+ - name: Create the github release
358
+ uses: ncipollo/release-action@v1
359
+ with:
360
+ artifacts: dist
361
+ generateReleaseNotes: true
362
+ - name: Publish package to TestPyPI (only for forks)
363
+ env:
364
+ TEST_PYPI_API_TOKEN: ${{ secrets.TEST_PYPI_API_TOKEN }}
365
+ if: github.repository != env.MAIN_REPO_NAME && env.TEST_PYPI_API_TOKEN != ''
366
+ uses: pypa/gh-action-pypi-publish@release/v1
367
+ with:
368
+ password: ${{ secrets.TEST_PYPI_API_TOKEN }}
369
+ repository_url: https://test.pypi.org/legacy/
370
+ - name: Publish package to PyPI (main repo)
371
+ env:
372
+ PYPI_API_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
373
+ if: github.repository == env.MAIN_REPO_NAME && env.PYPI_API_TOKEN != ''
374
+ uses: pypa/gh-action-pypi-publish@release/v1
375
+ with:
376
+ password: ${{ secrets.PYPI_API_TOKEN }}
377
+
378
+ deploy-doc:
379
+ needs: [trigger, update-notebooks-for-colab-and-binder, build-doc, test, deploy]
380
+ # if: always()
381
+ # -> trigger even if one needed job was skipped (namely deploy)
382
+ # -> needed jobs successes must be checked explicitely
383
+ if: |
384
+ always()
385
+ && (needs.build-doc.result == 'success')
386
+ && (
387
+ (
388
+ (needs.trigger.outputs.is_push_on_default_branch == 'true')
389
+ && (needs.test.result == 'success')
390
+ )
391
+ || (
392
+ (needs.trigger.outputs.is_release == 'true')
393
+ && (needs.deploy.result == 'success')
394
+ )
395
+ )
396
+ uses: ./.github/workflows/deploy-doc.yml
397
+ with:
398
+ doc-version: ${{ needs.build-doc.outputs.doc-version }}
399
+ binder-env-fullref: ${{ needs.update-notebooks-for-colab-and-binder.outputs.binder-full-ref }}
@@ -0,0 +1,90 @@
1
+ name: Deploy doc
2
+
3
+ on:
4
+ workflow_call:
5
+ inputs:
6
+ doc-version:
7
+ description: "Name of the doc version. The doc will be deployed to a subfolder with that name."
8
+ required: true
9
+ type: string
10
+ doc-artifact-name:
11
+ description: "Name of the artifact containing the built doc"
12
+ required: false
13
+ default: "doc"
14
+ type: string
15
+ doc-path:
16
+ description: "Path where to extract the built doc"
17
+ required: false
18
+ default: "docs/build/html"
19
+ type: string
20
+ binder-env-fullref:
21
+ description: "Full ref of the binder env to build. The build is triggered only if not empty."
22
+ required: false
23
+ default: ""
24
+ type: string
25
+ jobs:
26
+ trigger-binder-build:
27
+ runs-on: ubuntu-latest
28
+ if: inputs.binder-env-fullref != ''
29
+ steps:
30
+ - uses: actions/checkout@v4 # checkout triggering branch to get scripts/trigger_binder.sh
31
+ - name: Trigger a build for default binder env ref on each BinderHub deployments in the mybinder.org federation
32
+ continue-on-error: true
33
+ run: |
34
+ binder_env_full_ref=${{ inputs.binder-env-fullref }}
35
+ echo Triggering binder environment build for ${binder_env_full_ref}
36
+ bash scripts/trigger_binder.sh https://ovh.mybinder.org/build/gh/${binder_env_full_ref}
37
+ bash scripts/trigger_binder.sh https://ovh2.mybinder.org/build/gh/${binder_env_full_ref}
38
+ bash scripts/trigger_binder.sh https://notebooks.gesis.org/binder/build/gh/${binder_env_full_ref}
39
+
40
+ deploy-doc:
41
+ runs-on: ubuntu-latest
42
+ steps:
43
+ - uses: actions/checkout@v4
44
+ - name: Download artifacts
45
+ uses: actions/download-artifact@v4
46
+ with:
47
+ name: ${{ inputs.doc-artifact-name }}
48
+ path: ${{ inputs.doc-path }}
49
+ - name: Deploy documentation in a version subfolder on GH pages
50
+ uses: JamesIves/github-pages-deploy-action@v4
51
+ with:
52
+ branch: gh-pages # The branch the action should deploy to.
53
+ folder: ${{ inputs.doc-path }} # The folder the action should deploy.
54
+ target-folder: /${{ inputs.doc-version }} # The folder the action should deploy to.
55
+ commit-message: publish documentation
56
+ single-commit: true
57
+
58
+ update-doc-versions:
59
+ # update doc versions index if the doc has been deployed
60
+ needs: [deploy-doc]
61
+ runs-on: ubuntu-latest
62
+ steps:
63
+ - uses: actions/checkout@v4
64
+ with:
65
+ ref: gh-pages
66
+ - uses: actions/setup-python@v5
67
+ with:
68
+ python-version: "3.10"
69
+ - name: Generate versions.json
70
+ shell: python3 {0}
71
+ run: |
72
+ import json
73
+ from pathlib import Path
74
+
75
+ cwd = Path.cwd()
76
+ versions = sorted((item.name for item in cwd.iterdir()
77
+ if item.is_dir() and not item.name.startswith('.')),
78
+ reverse=True)
79
+ target_file = Path('versions.json')
80
+ with target_file.open('w') as f:
81
+ json.dump(versions, f)
82
+ - name: Commit versions.json
83
+ shell: bash
84
+ run: |
85
+ # Commit versions.json and squash it with previous commit
86
+ git config user.name "Actions"
87
+ git config user.email "actions@github.com"
88
+ git add versions.json
89
+ git commit --amend --no-edit
90
+ git push -f origin gh-pages
@@ -0,0 +1,24 @@
1
+ # Mac
2
+ .DS_Store
3
+
4
+ # IDE
5
+ .*/
6
+
7
+ # Python
8
+ __pycache__/
9
+ .python-version
10
+
11
+ # Temp files
12
+ *.tmp
13
+
14
+ # Build files
15
+ build/
16
+ dist/
17
+
18
+ # Docs built/generated files
19
+ docs/build
20
+ docs/source/api/*
21
+ !docs/source/api/modules.md
22
+
23
+ # coverage
24
+ .coverage