From 19ff7689837f958378595f1b591dea0ee8d23277 Mon Sep 17 00:00:00 2001 From: "Documenter.jl" Date: Thu, 3 Oct 2024 03:12:08 +0000 Subject: [PATCH] build based on e2fb285 --- dev/404.html | 8 +- dev/api/00_public.html | 26 +- dev/api/10_full.html | 130 +++++---- dev/assets/api_00_public.md.4BMbBTbQ.js | 14 - dev/assets/api_00_public.md.4BMbBTbQ.lean.js | 1 - dev/assets/api_00_public.md.DIEIz3-7.js | 14 + dev/assets/api_00_public.md.DIEIz3-7.lean.js | 14 + ...hyJT-s4-.js => api_10_full.md.CIhTEgrP.js} | 114 ++++---- dev/assets/api_10_full.md.CIhTEgrP.lean.js | 251 ++++++++++++++++++ dev/assets/api_10_full.md.hyJT-s4-.lean.js | 1 - dev/assets/app.B30tbP6z.js | 1 - dev/assets/app.BTJUqBJh.js | 1 + .../chunks/@localSearchIndexroot.D5JLvZ7R.js | 1 - .../chunks/@localSearchIndexroot.Dv38fV8G.js | 1 + .../chunks/VPLocalSearchBox.B4ckM-ik.js | 7 + .../chunks/VPLocalSearchBox.DJfC04nF.js | 7 - dev/assets/chunks/framework.CBLuZwrP.js | 17 -- dev/assets/chunks/framework.CJakPlgM.js | 18 ++ dev/assets/chunks/theme.BIQLsjK8.js | 2 + dev/assets/chunks/theme.CtZIydQx.js | 2 - .../constraints_00_intro.md.BK4czCKw.js | 1 - .../constraints_00_intro.md.BK4czCKw.lean.js | 1 - .../constraints_00_intro.md.wE3p7Yn4.js | 1 + .../constraints_00_intro.md.wE3p7Yn4.lean.js | 1 + ..._variables_and_domains.md.BQBZY0dG.lean.js | 1 - ...s_10_variables_and_domains.md.DZUAY6r3.js} | 8 +- ..._variables_and_domains.md.DZUAY6r3.lean.js | 52 ++++ .../constraints_20_constraints.md.CtnoiJ3Z.js | 10 - ...traints_20_constraints.md.CtnoiJ3Z.lean.js | 1 - .../constraints_20_constraints.md.D3n0An0S.js | 10 + ...traints_20_constraints.md.D3n0An0S.lean.js | 10 + ...ints_21_generic_constraints.md.BrP43zj-.js | 90 ------- ...21_generic_constraints.md.BrP43zj-.lean.js | 1 - ...ints_21_generic_constraints.md.nEZ1rbmN.js | 90 +++++++ ...21_generic_constraints.md.nEZ1rbmN.lean.js | 90 +++++++ ...2_language_constraints.md.CUmApMGU.lean.js | 1 - ...ts_22_language_constraints.md.DjiODENs.js} | 8 +- ...2_language_constraints.md.DjiODENs.lean.js | 46 ++++ ..._23_comparison_constraints.md.D9f4GIqO.js} | 14 +- ...comparison_constraints.md.D9f4GIqO.lean.js | 82 ++++++ ...comparison_constraints.md.ZkJcXQIT.lean.js | 1 - ...ng_summing_constraints.md.CMf8YC_O.lean.js | 1 - ...unting_summing_constraints.md.NT49jSaK.js} | 22 +- ...ng_summing_constraints.md.NT49jSaK.lean.js | 146 ++++++++++ ...connection_constraints.md.B7lGKa5q.lean.js | 1 - ..._25_connection_constraints.md.BT5VQBAx.js} | 18 +- ...connection_constraints.md.BT5VQBAx.lean.js | 109 ++++++++ ...scheduling_constraints.md.3lrce7Bz.lean.js | 1 - ...ing_scheduling_constraints.md.DcwNvTzZ.js} | 14 +- ...scheduling_constraints.md.DcwNvTzZ.lean.js | 71 +++++ ...aints_27_graph_constraints.md.BA3dAj1n.js} | 4 +- ...s_27_graph_constraints.md.BA3dAj1n.lean.js | 7 + ...s_27_graph_constraints.md.pFqKPWqH.lean.js | 1 - ..._28_elementary_constraints.md.D420JMw0.js} | 4 +- ...elementary_constraints.md.D420JMw0.lean.js | 5 + ...elementary_constraints.md.DWoH9ubp.lean.js | 1 - ...raints_40_constraint_models.md.Dv2qEx3_.js | 30 +++ ...s_40_constraint_models.md.Dv2qEx3_.lean.js | 30 +++ ...raints_40_constraint_models.md.qY8cIswx.js | 30 --- ...s_40_constraint_models.md.qY8cIswx.lean.js | 1 - ...aints_60_constraint_commons.md.CTOeYxK8.js | 10 + ..._60_constraint_commons.md.CTOeYxK8.lean.js | 10 + ...aints_60_constraint_commons.md.CeqfEZxo.js | 10 - ..._60_constraint_commons.md.CeqfEZxo.lean.js | 1 - ...aints_61_constraint_domains.md.BIH3fSw6.js | 31 +++ ..._61_constraint_domains.md.BIH3fSw6.lean.js | 31 +++ ...aints_61_constraint_domains.md.RArUieSY.js | 34 --- ..._61_constraint_domains.md.RArUieSY.lean.js | 1 - ...nstraints_62_constraints_jl.md.D9UaSr-v.js | 10 - ...ints_62_constraints_jl.md.D9UaSr-v.lean.js | 1 - ...nstraints_62_constraints_jl.md.DDHT3MAz.js | 10 + ...ints_62_constraints_jl.md.DDHT3MAz.lean.js | 10 + dev/assets/cp_00_intro.md.CsgSXI99.js | 1 + dev/assets/cp_00_intro.md.CsgSXI99.lean.js | 1 + dev/assets/cp_00_intro.md.Mkmho_dM.js | 1 - dev/assets/cp_00_intro.md.Mkmho_dM.lean.js | 1 - dev/assets/cp_10_cp101.md.B-tHlXuM.js | 1 + dev/assets/cp_10_cp101.md.B-tHlXuM.lean.js | 1 + dev/assets/cp_10_cp101.md.BgtkSTPx.js | 1 - dev/assets/cp_10_cp101.md.BgtkSTPx.lean.js | 1 - dev/assets/cp_20_opt.md.C0pIlKYp.js | 1 + dev/assets/cp_20_opt.md.C0pIlKYp.lean.js | 1 + dev/assets/cp_20_opt.md.Dt2oxPiG.js | 1 - dev/assets/cp_20_opt.md.Dt2oxPiG.lean.js | 1 - .../cp_30_getting_started.md.2ReSYTYy.js | 9 + .../cp_30_getting_started.md.2ReSYTYy.lean.js | 9 + .../cp_30_getting_started.md.C5h4OWH5.js | 9 - .../cp_30_getting_started.md.C5h4OWH5.lean.js | 1 - dev/assets/cp_40_ecosystem.md.B2yVE7ha.js | 1 - .../cp_40_ecosystem.md.B2yVE7ha.lean.js | 1 - dev/assets/cp_40_ecosystem.md.YmIJU8G_.js | 1 + .../cp_40_ecosystem.md.YmIJU8G_.lean.js | 1 + dev/assets/cp_50_advanced.md.CJxpgFIM.js | 1 + dev/assets/cp_50_advanced.md.CJxpgFIM.lean.js | 1 + dev/assets/cp_50_advanced.md.DQAz-Dcd.js | 1 - dev/assets/cp_50_advanced.md.DQAz-Dcd.lean.js | 1 - dev/assets/cp_60_applications.md.BUP9L55l.js | 1 - .../cp_60_applications.md.BUP9L55l.lean.js | 1 - dev/assets/cp_60_applications.md.CA8-f1fu.js | 1 + .../cp_60_applications.md.CA8-f1fu.lean.js | 1 + dev/assets/cp_70_models.md.1-J7V95h.js | 1 + dev/assets/cp_70_models.md.1-J7V95h.lean.js | 1 + dev/assets/cp_70_models.md.Cn6kXaBH.js | 1 - dev/assets/cp_70_models.md.Cn6kXaBH.lean.js | 1 - dev/assets/cp_80_tuto_xp.md.BBnKLYxi.js | 1 + dev/assets/cp_80_tuto_xp.md.BBnKLYxi.lean.js | 1 + dev/assets/cp_80_tuto_xp.md.D7vyaVlC.js | 1 - dev/assets/cp_80_tuto_xp.md.D7vyaVlC.lean.js | 1 - dev/assets/cp_90_contribution.md.CM5gXEgm.js | 1 - .../cp_90_contribution.md.CM5gXEgm.lean.js | 1 - dev/assets/cp_90_contribution.md.DOrkQHq1.js | 1 + .../cp_90_contribution.md.DOrkQHq1.lean.js | 1 + dev/assets/index.md.BKeG-gxU.js | 1 + dev/assets/index.md.BKeG-gxU.lean.js | 1 + dev/assets/index.md.CtETS-xm.js | 1 - dev/assets/index.md.CtETS-xm.lean.js | 1 - dev/assets/learning_00_intro.md.D4p7HvQP.js | 2 - .../learning_00_intro.md.D4p7HvQP.lean.js | 1 - dev/assets/learning_00_intro.md.zyAZ0vEH.js | 2 + .../learning_00_intro.md.zyAZ0vEH.lean.js | 2 + ...g_10_compositional_networks.md.C1bHiEgr.js | 1 - ...compositional_networks.md.C1bHiEgr.lean.js | 1 - ...g_10_compositional_networks.md.DeAhp3_R.js | 1 + ...compositional_networks.md.DeAhp3_R.lean.js | 1 + dev/assets/learning_11_layers.md.09f2Jdhx.js | 4 + .../learning_11_layers.md.09f2Jdhx.lean.js | 4 + dev/assets/learning_11_layers.md.BQudKiAI.js | 4 - .../learning_11_layers.md.BQudKiAI.lean.js | 1 - .../learning_12_transformation.md.D3UmWQzI.js | 29 -- ...ning_12_transformation.md.D3UmWQzI.lean.js | 1 - .../learning_12_transformation.md.M1sCl03X.js | 29 ++ ...ning_12_transformation.md.M1sCl03X.lean.js | 29 ++ .../learning_13_arithmetic.md.42vK0uzX.js | 1 + ...learning_13_arithmetic.md.42vK0uzX.lean.js | 1 + .../learning_13_arithmetic.md.CK9BAsnj.js | 1 - ...learning_13_arithmetic.md.CK9BAsnj.lean.js | 1 - .../learning_14_aggregation.md.V0-R09TM.js | 1 + ...earning_14_aggregation.md.V0-R09TM.lean.js | 1 + .../learning_14_aggregation.md.uncWDDl4.js | 1 - ...earning_14_aggregation.md.uncWDDl4.lean.js | 1 - .../learning_15_comparison.md.Cizy95BA.js | 1 - ...learning_15_comparison.md.Cizy95BA.lean.js | 1 - .../learning_15_comparison.md.f9lWeNIO.js | 1 + ...learning_15_comparison.md.f9lWeNIO.lean.js | 1 + ...earning_20_qubo_constraints.md.D_0jKThG.js | 1 - ...ng_20_qubo_constraints.md.D_0jKThG.lean.js | 1 - ...earning_20_qubo_constraints.md.DfeUpk7q.js | 1 + ...ng_20_qubo_constraints.md.DfeUpk7q.lean.js | 1 + .../learning_21_qubo_encoding.md.BJsv_NTS.js | 1 - ...rning_21_qubo_encoding.md.BJsv_NTS.lean.js | 1 - .../learning_21_qubo_encoding.md.U06_V_uV.js | 1 + ...rning_21_qubo_encoding.md.U06_V_uV.lean.js | 1 + ...rning_22_qubo_learning.md.B6T5AI0c.lean.js | 1 - ... learning_22_qubo_learning.md.CzSOBa1N.js} | 4 +- ...rning_22_qubo_learning.md.CzSOBa1N.lean.js | 119 +++++++++ ...g_30_constraints_translator.md.Ci6ltlI6.js | 1 - ...constraints_translator.md.Ci6ltlI6.lean.js | 1 - ...g_30_constraints_translator.md.Cp55uYEB.js | 1 + ...constraints_translator.md.Cp55uYEB.lean.js | 1 + ...ning_90_constraint_learning.md.BK3d3pi7.js | 1 - ...90_constraint_learning.md.BK3d3pi7.lean.js | 1 - ...ning_90_constraint_learning.md.YM6S0n3n.js | 1 + ...90_constraint_learning.md.YM6S0n3n.lean.js | 1 + .../meta_00_meta_strategist.md.BI9Jm8Hx.js | 1 - ...eta_00_meta_strategist.md.BI9Jm8Hx.lean.js | 1 - .../meta_00_meta_strategist.md.W36V92NX.js | 1 + ...eta_00_meta_strategist.md.W36V92NX.lean.js | 1 + ...js => perf_00_perf_checker.md.BMTPCZnU.js} | 4 +- .../perf_00_perf_checker.md.BMTPCZnU.lean.js | 13 + .../perf_00_perf_checker.md.BZ7n51Lw.lean.js | 1 - ...QIS.js => perf_10_tutorial.md.C4bm3h6K.js} | 4 +- .../perf_10_tutorial.md.C4bm3h6K.lean.js | 40 +++ .../perf_10_tutorial.md.CBaJmQIS.lean.js | 1 - ... => perf_20_perf_interface.md.Cfce352q.js} | 4 +- ...perf_20_perf_interface.md.Cfce352q.lean.js | 27 ++ ...perf_20_perf_interface.md.DuuQq97C.lean.js | 1 - ...s => perf_30_benchmark_ext.md.CzInbrh4.js} | 4 +- .../perf_30_benchmark_ext.md.CzInbrh4.lean.js | 18 ++ .../perf_30_benchmark_ext.md.hCIaUaBY.lean.js | 1 - ...perf_40_chairmarks_ext.md.B-RX5T8u.lean.js | 1 - ... => perf_40_chairmarks_ext.md.h8pfB9sA.js} | 4 +- ...perf_40_chairmarks_ext.md.h8pfB9sA.lean.js | 14 + dev/assets/perf_90_api.md.0OTlDWyk.js | 9 + dev/assets/perf_90_api.md.0OTlDWyk.lean.js | 9 + dev/assets/perf_90_api.md.CYT8Uuo0.js | 9 - dev/assets/perf_90_api.md.CYT8Uuo0.lean.js | 1 - dev/assets/solvers_00_intro.md.3TPMgJCO.js | 1 - .../solvers_00_intro.md.3TPMgJCO.lean.js | 1 - dev/assets/solvers_00_intro.md.s1tbOTQV.js | 1 + .../solvers_00_intro.md.s1tbOTQV.lean.js | 1 + dev/assets/solvers_10_cbls.md.BCa7hnj8.js | 8 + .../solvers_10_cbls.md.BCa7hnj8.lean.js | 8 + dev/assets/solvers_10_cbls.md.C5zl8XeS.js | 8 - .../solvers_10_cbls.md.C5zl8XeS.lean.js | 1 - ...ers_60_local_search_solvers.md.CmZAwKiI.js | 36 +++ ...0_local_search_solvers.md.CmZAwKiI.lean.js | 36 +++ ...ers_60_local_search_solvers.md.DbQ6-9eL.js | 36 --- ...0_local_search_solvers.md.DbQ6-9eL.lean.js | 1 - dev/assets/style.Bb0J_nSp.css | 1 - dev/assets/style.DQ4GYGrf.css | 1 + dev/constraints/00_intro.html | 18 +- dev/constraints/10_variables_and_domains.html | 24 +- dev/constraints/20_constraints.html | 20 +- dev/constraints/21_generic_constraints.html | 24 +- dev/constraints/22_language_constraints.html | 24 +- .../23_comparison_constraints.html | 30 +-- .../24_counting_summing_constraints.html | 38 +-- .../25_connection_constraints.html | 34 +-- .../26_packing_scheduling_constraints.html | 30 +-- dev/constraints/27_graph_constraints.html | 20 +- .../28_elementary_constraints.html | 20 +- dev/constraints/40_constraint_models.html | 24 +- dev/constraints/60_constraint_commons.html | 20 +- dev/constraints/61_constraint_domains.html | 48 ++-- dev/constraints/62_constraints_jl.html | 20 +- dev/cp/00_intro.html | 18 +- dev/cp/10_cp101.html | 18 +- dev/cp/20_opt.html | 18 +- dev/cp/30_getting_started.html | 22 +- dev/cp/40_ecosystem.html | 18 +- dev/cp/50_advanced.html | 18 +- dev/cp/60_applications.html | 18 +- dev/cp/70_models.html | 18 +- dev/cp/80_tuto_xp.html | 18 +- dev/cp/90_contribution.html | 18 +- dev/hashmap.json | 2 +- dev/index.html | 18 +- dev/learning/00_intro.html | 20 +- dev/learning/10_compositional_networks.html | 18 +- dev/learning/11_layers.html | 22 +- dev/learning/12_transformation.html | 38 +-- dev/learning/13_arithmetic.html | 18 +- dev/learning/14_aggregation.html | 18 +- dev/learning/15_comparison.html | 18 +- dev/learning/20_qubo_constraints.html | 18 +- dev/learning/21_qubo_encoding.html | 18 +- dev/learning/22_qubo_learning.html | 20 +- dev/learning/30_constraints_translator.html | 18 +- dev/learning/90_constraint_learning.html | 18 +- dev/meta/00_meta_strategist.html | 18 +- dev/perf/00_perf_checker.html | 20 +- dev/perf/10_tutorial.html | 20 +- dev/perf/20_perf_interface.html | 20 +- dev/perf/30_benchmark_ext.html | 20 +- dev/perf/40_chairmarks_ext.html | 20 +- dev/perf/90_api.html | 20 +- dev/solvers/00_intro.html | 18 +- dev/solvers/10_cbls.html | 22 +- dev/solvers/60_local_search_solvers.html | 36 +-- 249 files changed, 2377 insertions(+), 1124 deletions(-) delete mode 100644 dev/assets/api_00_public.md.4BMbBTbQ.js delete mode 100644 dev/assets/api_00_public.md.4BMbBTbQ.lean.js create mode 100644 dev/assets/api_00_public.md.DIEIz3-7.js create mode 100644 dev/assets/api_00_public.md.DIEIz3-7.lean.js rename dev/assets/{api_10_full.md.hyJT-s4-.js => api_10_full.md.CIhTEgrP.js} (52%) create mode 100644 dev/assets/api_10_full.md.CIhTEgrP.lean.js delete mode 100644 dev/assets/api_10_full.md.hyJT-s4-.lean.js delete mode 100644 dev/assets/app.B30tbP6z.js create mode 100644 dev/assets/app.BTJUqBJh.js delete mode 100644 dev/assets/chunks/@localSearchIndexroot.D5JLvZ7R.js create mode 100644 dev/assets/chunks/@localSearchIndexroot.Dv38fV8G.js create mode 100644 dev/assets/chunks/VPLocalSearchBox.B4ckM-ik.js delete mode 100644 dev/assets/chunks/VPLocalSearchBox.DJfC04nF.js delete mode 100644 dev/assets/chunks/framework.CBLuZwrP.js create mode 100644 dev/assets/chunks/framework.CJakPlgM.js create mode 100644 dev/assets/chunks/theme.BIQLsjK8.js delete mode 100644 dev/assets/chunks/theme.CtZIydQx.js delete mode 100644 dev/assets/constraints_00_intro.md.BK4czCKw.js delete mode 100644 dev/assets/constraints_00_intro.md.BK4czCKw.lean.js create mode 100644 dev/assets/constraints_00_intro.md.wE3p7Yn4.js create mode 100644 dev/assets/constraints_00_intro.md.wE3p7Yn4.lean.js delete mode 100644 dev/assets/constraints_10_variables_and_domains.md.BQBZY0dG.lean.js rename dev/assets/{constraints_10_variables_and_domains.md.BQBZY0dG.js => constraints_10_variables_and_domains.md.DZUAY6r3.js} (74%) create mode 100644 dev/assets/constraints_10_variables_and_domains.md.DZUAY6r3.lean.js delete mode 100644 dev/assets/constraints_20_constraints.md.CtnoiJ3Z.js delete mode 100644 dev/assets/constraints_20_constraints.md.CtnoiJ3Z.lean.js create mode 100644 dev/assets/constraints_20_constraints.md.D3n0An0S.js create mode 100644 dev/assets/constraints_20_constraints.md.D3n0An0S.lean.js delete mode 100644 dev/assets/constraints_21_generic_constraints.md.BrP43zj-.js delete mode 100644 dev/assets/constraints_21_generic_constraints.md.BrP43zj-.lean.js create mode 100644 dev/assets/constraints_21_generic_constraints.md.nEZ1rbmN.js create mode 100644 dev/assets/constraints_21_generic_constraints.md.nEZ1rbmN.lean.js delete mode 100644 dev/assets/constraints_22_language_constraints.md.CUmApMGU.lean.js rename dev/assets/{constraints_22_language_constraints.md.CUmApMGU.js => constraints_22_language_constraints.md.DjiODENs.js} (77%) create mode 100644 dev/assets/constraints_22_language_constraints.md.DjiODENs.lean.js rename dev/assets/{constraints_23_comparison_constraints.md.ZkJcXQIT.js => constraints_23_comparison_constraints.md.D9f4GIqO.js} (85%) create mode 100644 dev/assets/constraints_23_comparison_constraints.md.D9f4GIqO.lean.js delete mode 100644 dev/assets/constraints_23_comparison_constraints.md.ZkJcXQIT.lean.js delete mode 100644 dev/assets/constraints_24_counting_summing_constraints.md.CMf8YC_O.lean.js rename dev/assets/{constraints_24_counting_summing_constraints.md.CMf8YC_O.js => constraints_24_counting_summing_constraints.md.NT49jSaK.js} (91%) create mode 100644 dev/assets/constraints_24_counting_summing_constraints.md.NT49jSaK.lean.js delete mode 100644 dev/assets/constraints_25_connection_constraints.md.B7lGKa5q.lean.js rename dev/assets/{constraints_25_connection_constraints.md.B7lGKa5q.js => constraints_25_connection_constraints.md.BT5VQBAx.js} (86%) create mode 100644 dev/assets/constraints_25_connection_constraints.md.BT5VQBAx.lean.js delete mode 100644 dev/assets/constraints_26_packing_scheduling_constraints.md.3lrce7Bz.lean.js rename dev/assets/{constraints_26_packing_scheduling_constraints.md.3lrce7Bz.js => constraints_26_packing_scheduling_constraints.md.DcwNvTzZ.js} (87%) create mode 100644 dev/assets/constraints_26_packing_scheduling_constraints.md.DcwNvTzZ.lean.js rename dev/assets/{constraints_27_graph_constraints.md.pFqKPWqH.js => constraints_27_graph_constraints.md.BA3dAj1n.js} (56%) create mode 100644 dev/assets/constraints_27_graph_constraints.md.BA3dAj1n.lean.js delete mode 100644 dev/assets/constraints_27_graph_constraints.md.pFqKPWqH.lean.js rename dev/assets/{constraints_28_elementary_constraints.md.DWoH9ubp.js => constraints_28_elementary_constraints.md.D420JMw0.js} (56%) create mode 100644 dev/assets/constraints_28_elementary_constraints.md.D420JMw0.lean.js delete mode 100644 dev/assets/constraints_28_elementary_constraints.md.DWoH9ubp.lean.js create mode 100644 dev/assets/constraints_40_constraint_models.md.Dv2qEx3_.js create mode 100644 dev/assets/constraints_40_constraint_models.md.Dv2qEx3_.lean.js delete mode 100644 dev/assets/constraints_40_constraint_models.md.qY8cIswx.js delete mode 100644 dev/assets/constraints_40_constraint_models.md.qY8cIswx.lean.js create mode 100644 dev/assets/constraints_60_constraint_commons.md.CTOeYxK8.js create mode 100644 dev/assets/constraints_60_constraint_commons.md.CTOeYxK8.lean.js delete mode 100644 dev/assets/constraints_60_constraint_commons.md.CeqfEZxo.js delete mode 100644 dev/assets/constraints_60_constraint_commons.md.CeqfEZxo.lean.js create mode 100644 dev/assets/constraints_61_constraint_domains.md.BIH3fSw6.js create mode 100644 dev/assets/constraints_61_constraint_domains.md.BIH3fSw6.lean.js delete mode 100644 dev/assets/constraints_61_constraint_domains.md.RArUieSY.js delete mode 100644 dev/assets/constraints_61_constraint_domains.md.RArUieSY.lean.js delete mode 100644 dev/assets/constraints_62_constraints_jl.md.D9UaSr-v.js delete mode 100644 dev/assets/constraints_62_constraints_jl.md.D9UaSr-v.lean.js create mode 100644 dev/assets/constraints_62_constraints_jl.md.DDHT3MAz.js create mode 100644 dev/assets/constraints_62_constraints_jl.md.DDHT3MAz.lean.js create mode 100644 dev/assets/cp_00_intro.md.CsgSXI99.js create mode 100644 dev/assets/cp_00_intro.md.CsgSXI99.lean.js delete mode 100644 dev/assets/cp_00_intro.md.Mkmho_dM.js delete mode 100644 dev/assets/cp_00_intro.md.Mkmho_dM.lean.js create mode 100644 dev/assets/cp_10_cp101.md.B-tHlXuM.js create mode 100644 dev/assets/cp_10_cp101.md.B-tHlXuM.lean.js delete mode 100644 dev/assets/cp_10_cp101.md.BgtkSTPx.js delete mode 100644 dev/assets/cp_10_cp101.md.BgtkSTPx.lean.js create mode 100644 dev/assets/cp_20_opt.md.C0pIlKYp.js create mode 100644 dev/assets/cp_20_opt.md.C0pIlKYp.lean.js delete mode 100644 dev/assets/cp_20_opt.md.Dt2oxPiG.js delete mode 100644 dev/assets/cp_20_opt.md.Dt2oxPiG.lean.js create mode 100644 dev/assets/cp_30_getting_started.md.2ReSYTYy.js create mode 100644 dev/assets/cp_30_getting_started.md.2ReSYTYy.lean.js delete mode 100644 dev/assets/cp_30_getting_started.md.C5h4OWH5.js delete mode 100644 dev/assets/cp_30_getting_started.md.C5h4OWH5.lean.js delete mode 100644 dev/assets/cp_40_ecosystem.md.B2yVE7ha.js delete mode 100644 dev/assets/cp_40_ecosystem.md.B2yVE7ha.lean.js create mode 100644 dev/assets/cp_40_ecosystem.md.YmIJU8G_.js create mode 100644 dev/assets/cp_40_ecosystem.md.YmIJU8G_.lean.js create mode 100644 dev/assets/cp_50_advanced.md.CJxpgFIM.js create mode 100644 dev/assets/cp_50_advanced.md.CJxpgFIM.lean.js delete mode 100644 dev/assets/cp_50_advanced.md.DQAz-Dcd.js delete mode 100644 dev/assets/cp_50_advanced.md.DQAz-Dcd.lean.js delete mode 100644 dev/assets/cp_60_applications.md.BUP9L55l.js delete mode 100644 dev/assets/cp_60_applications.md.BUP9L55l.lean.js create mode 100644 dev/assets/cp_60_applications.md.CA8-f1fu.js create mode 100644 dev/assets/cp_60_applications.md.CA8-f1fu.lean.js create mode 100644 dev/assets/cp_70_models.md.1-J7V95h.js create mode 100644 dev/assets/cp_70_models.md.1-J7V95h.lean.js delete mode 100644 dev/assets/cp_70_models.md.Cn6kXaBH.js delete mode 100644 dev/assets/cp_70_models.md.Cn6kXaBH.lean.js create mode 100644 dev/assets/cp_80_tuto_xp.md.BBnKLYxi.js create mode 100644 dev/assets/cp_80_tuto_xp.md.BBnKLYxi.lean.js delete mode 100644 dev/assets/cp_80_tuto_xp.md.D7vyaVlC.js delete mode 100644 dev/assets/cp_80_tuto_xp.md.D7vyaVlC.lean.js delete mode 100644 dev/assets/cp_90_contribution.md.CM5gXEgm.js delete mode 100644 dev/assets/cp_90_contribution.md.CM5gXEgm.lean.js create mode 100644 dev/assets/cp_90_contribution.md.DOrkQHq1.js create mode 100644 dev/assets/cp_90_contribution.md.DOrkQHq1.lean.js create mode 100644 dev/assets/index.md.BKeG-gxU.js create mode 100644 dev/assets/index.md.BKeG-gxU.lean.js delete mode 100644 dev/assets/index.md.CtETS-xm.js delete mode 100644 dev/assets/index.md.CtETS-xm.lean.js delete mode 100644 dev/assets/learning_00_intro.md.D4p7HvQP.js delete mode 100644 dev/assets/learning_00_intro.md.D4p7HvQP.lean.js create mode 100644 dev/assets/learning_00_intro.md.zyAZ0vEH.js create mode 100644 dev/assets/learning_00_intro.md.zyAZ0vEH.lean.js delete mode 100644 dev/assets/learning_10_compositional_networks.md.C1bHiEgr.js delete mode 100644 dev/assets/learning_10_compositional_networks.md.C1bHiEgr.lean.js create mode 100644 dev/assets/learning_10_compositional_networks.md.DeAhp3_R.js create mode 100644 dev/assets/learning_10_compositional_networks.md.DeAhp3_R.lean.js create mode 100644 dev/assets/learning_11_layers.md.09f2Jdhx.js create mode 100644 dev/assets/learning_11_layers.md.09f2Jdhx.lean.js delete mode 100644 dev/assets/learning_11_layers.md.BQudKiAI.js delete mode 100644 dev/assets/learning_11_layers.md.BQudKiAI.lean.js delete mode 100644 dev/assets/learning_12_transformation.md.D3UmWQzI.js delete mode 100644 dev/assets/learning_12_transformation.md.D3UmWQzI.lean.js create mode 100644 dev/assets/learning_12_transformation.md.M1sCl03X.js create mode 100644 dev/assets/learning_12_transformation.md.M1sCl03X.lean.js create mode 100644 dev/assets/learning_13_arithmetic.md.42vK0uzX.js create mode 100644 dev/assets/learning_13_arithmetic.md.42vK0uzX.lean.js delete mode 100644 dev/assets/learning_13_arithmetic.md.CK9BAsnj.js delete mode 100644 dev/assets/learning_13_arithmetic.md.CK9BAsnj.lean.js create mode 100644 dev/assets/learning_14_aggregation.md.V0-R09TM.js create mode 100644 dev/assets/learning_14_aggregation.md.V0-R09TM.lean.js delete mode 100644 dev/assets/learning_14_aggregation.md.uncWDDl4.js delete mode 100644 dev/assets/learning_14_aggregation.md.uncWDDl4.lean.js delete mode 100644 dev/assets/learning_15_comparison.md.Cizy95BA.js delete mode 100644 dev/assets/learning_15_comparison.md.Cizy95BA.lean.js create mode 100644 dev/assets/learning_15_comparison.md.f9lWeNIO.js create mode 100644 dev/assets/learning_15_comparison.md.f9lWeNIO.lean.js delete mode 100644 dev/assets/learning_20_qubo_constraints.md.D_0jKThG.js delete mode 100644 dev/assets/learning_20_qubo_constraints.md.D_0jKThG.lean.js create mode 100644 dev/assets/learning_20_qubo_constraints.md.DfeUpk7q.js create mode 100644 dev/assets/learning_20_qubo_constraints.md.DfeUpk7q.lean.js delete mode 100644 dev/assets/learning_21_qubo_encoding.md.BJsv_NTS.js delete mode 100644 dev/assets/learning_21_qubo_encoding.md.BJsv_NTS.lean.js create mode 100644 dev/assets/learning_21_qubo_encoding.md.U06_V_uV.js create mode 100644 dev/assets/learning_21_qubo_encoding.md.U06_V_uV.lean.js delete mode 100644 dev/assets/learning_22_qubo_learning.md.B6T5AI0c.lean.js rename dev/assets/{learning_22_qubo_learning.md.B6T5AI0c.js => learning_22_qubo_learning.md.CzSOBa1N.js} (89%) create mode 100644 dev/assets/learning_22_qubo_learning.md.CzSOBa1N.lean.js delete mode 100644 dev/assets/learning_30_constraints_translator.md.Ci6ltlI6.js delete mode 100644 dev/assets/learning_30_constraints_translator.md.Ci6ltlI6.lean.js create mode 100644 dev/assets/learning_30_constraints_translator.md.Cp55uYEB.js create mode 100644 dev/assets/learning_30_constraints_translator.md.Cp55uYEB.lean.js delete mode 100644 dev/assets/learning_90_constraint_learning.md.BK3d3pi7.js delete mode 100644 dev/assets/learning_90_constraint_learning.md.BK3d3pi7.lean.js create mode 100644 dev/assets/learning_90_constraint_learning.md.YM6S0n3n.js create mode 100644 dev/assets/learning_90_constraint_learning.md.YM6S0n3n.lean.js delete mode 100644 dev/assets/meta_00_meta_strategist.md.BI9Jm8Hx.js delete mode 100644 dev/assets/meta_00_meta_strategist.md.BI9Jm8Hx.lean.js create mode 100644 dev/assets/meta_00_meta_strategist.md.W36V92NX.js create mode 100644 dev/assets/meta_00_meta_strategist.md.W36V92NX.lean.js rename dev/assets/{perf_00_perf_checker.md.BZ7n51Lw.js => perf_00_perf_checker.md.BMTPCZnU.js} (74%) create mode 100644 dev/assets/perf_00_perf_checker.md.BMTPCZnU.lean.js delete mode 100644 dev/assets/perf_00_perf_checker.md.BZ7n51Lw.lean.js rename dev/assets/{perf_10_tutorial.md.CBaJmQIS.js => perf_10_tutorial.md.C4bm3h6K.js} (92%) create mode 100644 dev/assets/perf_10_tutorial.md.C4bm3h6K.lean.js delete mode 100644 dev/assets/perf_10_tutorial.md.CBaJmQIS.lean.js rename dev/assets/{perf_20_perf_interface.md.DuuQq97C.js => perf_20_perf_interface.md.Cfce352q.js} (88%) create mode 100644 dev/assets/perf_20_perf_interface.md.Cfce352q.lean.js delete mode 100644 dev/assets/perf_20_perf_interface.md.DuuQq97C.lean.js rename dev/assets/{perf_30_benchmark_ext.md.hCIaUaBY.js => perf_30_benchmark_ext.md.CzInbrh4.js} (83%) create mode 100644 dev/assets/perf_30_benchmark_ext.md.CzInbrh4.lean.js delete mode 100644 dev/assets/perf_30_benchmark_ext.md.hCIaUaBY.lean.js delete mode 100644 dev/assets/perf_40_chairmarks_ext.md.B-RX5T8u.lean.js rename dev/assets/{perf_40_chairmarks_ext.md.B-RX5T8u.js => perf_40_chairmarks_ext.md.h8pfB9sA.js} (75%) create mode 100644 dev/assets/perf_40_chairmarks_ext.md.h8pfB9sA.lean.js create mode 100644 dev/assets/perf_90_api.md.0OTlDWyk.js create mode 100644 dev/assets/perf_90_api.md.0OTlDWyk.lean.js delete mode 100644 dev/assets/perf_90_api.md.CYT8Uuo0.js delete mode 100644 dev/assets/perf_90_api.md.CYT8Uuo0.lean.js delete mode 100644 dev/assets/solvers_00_intro.md.3TPMgJCO.js delete mode 100644 dev/assets/solvers_00_intro.md.3TPMgJCO.lean.js create mode 100644 dev/assets/solvers_00_intro.md.s1tbOTQV.js create mode 100644 dev/assets/solvers_00_intro.md.s1tbOTQV.lean.js create mode 100644 dev/assets/solvers_10_cbls.md.BCa7hnj8.js create mode 100644 dev/assets/solvers_10_cbls.md.BCa7hnj8.lean.js delete mode 100644 dev/assets/solvers_10_cbls.md.C5zl8XeS.js delete mode 100644 dev/assets/solvers_10_cbls.md.C5zl8XeS.lean.js create mode 100644 dev/assets/solvers_60_local_search_solvers.md.CmZAwKiI.js create mode 100644 dev/assets/solvers_60_local_search_solvers.md.CmZAwKiI.lean.js delete mode 100644 dev/assets/solvers_60_local_search_solvers.md.DbQ6-9eL.js delete mode 100644 dev/assets/solvers_60_local_search_solvers.md.DbQ6-9eL.lean.js delete mode 100644 dev/assets/style.Bb0J_nSp.css create mode 100644 dev/assets/style.DQ4GYGrf.css diff --git a/dev/404.html b/dev/404.html index c2f743e..2f1cb01 100644 --- a/dev/404.html +++ b/dev/404.html @@ -5,17 +5,17 @@ 404 | Julia Constraints - - + + - +
- + \ No newline at end of file diff --git a/dev/api/00_public.html b/dev/api/00_public.html index 7503e5d..d3488f6 100644 --- a/dev/api/00_public.html +++ b/dev/api/00_public.html @@ -4,34 +4,34 @@ Public API | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Public API

# ConstraintCommons.AutomatonType.
julia
Automaton{S, T, F <: Union{S, Vector{S}, Set{S}}} <: AbstractAutomaton

A minimal implementation of a deterministic automaton structure.

source


# ConstraintCommons.MDDType.
julia
MDD{S,T} <: AbstractMultivaluedDecisionDiagram

A minimal implementation of a multivalued decision diagram structure.

source


# ConstraintCommons.acceptMethod.
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source


# ConstraintCommons.consinMethod.
julia
consin(::Any, ::Nothing)

Extends Base.in (or ) when the set is nothing. Returns false.

source


# ConstraintCommons.consisemptyMethod.
julia
consisempty(::Nothing)

Extends Base.isempty when the set is nothing. Returns true.

source


# ConstraintCommons.extract_parametersMethod.
julia
extract_parameters(m::Union{Method, Function}; parameters)

Extracts the intersection between the kargs of m and parameters (defaults to USUAL_CONSTRAINT_PARAMETERS).

source


# ConstraintCommons.incsert!Function.
julia
incsert!(d::Union{AbstractDict, AbstractDictionary}, ind, val = 1)

Increase or insert a counter in a dictionary-based collection. The counter insertion defaults to val = 1.

source


# ConstraintCommons.oversampleMethod.
julia
oversample(X, f)

Oversample elements of X until the boolean function f has as many true and false configurations.

source


# ConstraintCommons.symconFunction.
julia
symcon(s1::Symbol, s2::Symbol, connector::AbstractString="_")

Extends * to Symbols multiplication by connecting the symbols by an _.

source


# ConstraintCommons.δ_extremaMethod.
julia
δ_extrema(X...)

Compute both the difference between the maximum and the minimum of over all the collections of X.

source


# ConstraintDomains.AbstractDomainType.
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

  • Base.∈(val, ::D)

  • Base.rand(::D)

  • Base.length(::D) that is the number of elements in a discrete domain, and the distance between bounds or similar for a continuous domain

Additionally, if the domain is used in a dynamic context, it can extend

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source


# ConstraintDomains.ContinuousDomainType.
julia
ContinuousDomain{T <: Real} <: AbstractDomain

An abstract supertype for all continuous domains.

source


# ConstraintDomains.DiscreteDomainType.
julia
DiscreteDomain{T <: Number} <: AbstractDomain

An abstract supertype for discrete domains (set, range).

source


# ConstraintDomains.ExploreSettingsMethod.
julia
ExploreSettings(domains; 
+    
Skip to content

Public API

ConstraintCommons.Automaton Type
julia
Automaton{S, T, F <: Union{S, Vector{S}, Set{S}}} <: AbstractAutomaton

A minimal implementation of a deterministic automaton structure.

source

ConstraintCommons.MDD Type
julia
MDD{S,T} <: AbstractMultivaluedDecisionDiagram

A minimal implementation of a multivalued decision diagram structure.

source

ConstraintCommons.accept Method
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

ConstraintCommons.consin Method
julia
consin(::Any, ::Nothing)

Extends Base.in (or ) when the set is nothing. Returns false.

source

ConstraintCommons.consisempty Method
julia
consisempty(::Nothing)

Extends Base.isempty when the set is nothing. Returns true.

source

ConstraintCommons.extract_parameters Method
julia
extract_parameters(m::Union{Method, Function}; parameters)

Extracts the intersection between the kargs of m and parameters (defaults to USUAL_CONSTRAINT_PARAMETERS).

source

ConstraintCommons.incsert! Function
julia
incsert!(d::Union{AbstractDict, AbstractDictionary}, ind, val = 1)

Increase or insert a counter in a dictionary-based collection. The counter insertion defaults to val = 1.

source

ConstraintCommons.oversample Method
julia
oversample(X, f)

Oversample elements of X until the boolean function f has as many true and false configurations.

source

ConstraintCommons.symcon Function
julia
symcon(s1::Symbol, s2::Symbol, connector::AbstractString="_")

Extends * to Symbols multiplication by connecting the symbols by an _.

source

ConstraintCommons.δ_extrema Method
julia
δ_extrema(X...)

Compute both the difference between the maximum and the minimum of over all the collections of X.

source

ConstraintDomains.AbstractDomain Type
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

  • Base.∈(val, ::D)

  • Base.rand(::D)

  • Base.length(::D) that is the number of elements in a discrete domain, and the distance between bounds or similar for a continuous domain

Additionally, if the domain is used in a dynamic context, it can extend

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source

ConstraintDomains.ContinuousDomain Type
julia
ContinuousDomain{T <: Real} <: AbstractDomain

An abstract supertype for all continuous domains.

source

ConstraintDomains.DiscreteDomain Type
julia
DiscreteDomain{T <: Number} <: AbstractDomain

An abstract supertype for discrete domains (set, range).

source

ConstraintDomains.ExploreSettings Method
julia
ExploreSettings(domains; 
                 complete_search_limit = 10^6, 
                 max_samplings = sum(domain_size, domains), 
                 search = :flexible, 
-                solutions_limit = floor(Int, sqrt(max_samplings)))

Create an ExploreSettings object to configure the exploration of a search space composed of a collection of domains.

Arguments

  • domains: A collection of domains to be explored.

  • complete_search_limit: An integer specifying the maximum limit for complete search iterations. Default is 10^6.

  • max_samplings: An integer specifying the maximum number of samplings. Default is the sum of domain sizes.

  • search: A symbol indicating the type of search to perform. Default is :flexible.

  • solutions_limit: An integer specifying the limit on the number of solutions. Default is the floor of the square root of max_samplings.

Returns

  • ExploreSettings object with the specified settings.

source


# ConstraintDomains.RangeDomainType.
julia
RangeDomain

A discrete domain defined by a range <: AbstractRange{Real}. As ranges are immutable in Julia, changes in RangeDomain must use set_domain!.

source


# ConstraintDomains.SetDomainType.
julia
SetDomain{T <: Number} <: DiscreteDomain{T}

Domain that stores discrete values as a set of (unordered) points.

source


# Base.delete!Method.
julia
Base.delete!(d::SetDomain, value)(d::SetDomain, value)

Delete value from the list of points in d.

source


# ConstraintDomains.add!Method.
julia
add!(d::SetDomain, value)

Add value to the list of points in d.

source


# ConstraintDomains.domainMethod.
julia
domain(values)
+                solutions_limit = floor(Int, sqrt(max_samplings)))

Create an ExploreSettings object to configure the exploration of a search space composed of a collection of domains.

Arguments

  • domains: A collection of domains to be explored.

  • complete_search_limit: An integer specifying the maximum limit for complete search iterations. Default is 10^6.

  • max_samplings: An integer specifying the maximum number of samplings. Default is the sum of domain sizes.

  • search: A symbol indicating the type of search to perform. Default is :flexible.

  • solutions_limit: An integer specifying the limit on the number of solutions. Default is the floor of the square root of max_samplings.

Returns

  • ExploreSettings object with the specified settings.

source

ConstraintDomains.RangeDomain Type
julia
RangeDomain

A discrete domain defined by a range <: AbstractRange{Real}. As ranges are immutable in Julia, changes in RangeDomain must use set_domain!.

source

ConstraintDomains.SetDomain Type
julia
SetDomain{T <: Number} <: DiscreteDomain{T}

Domain that stores discrete values as a set of (unordered) points.

source

Base.delete! Method
julia
Base.delete!(d::SetDomain, value)(d::SetDomain, value)

Delete value from the list of points in d.

source

ConstraintDomains.add! Method
julia
add!(d::SetDomain, value)

Add value to the list of points in d.

source

ConstraintDomains.domain Method
julia
domain(values)
 domain(range::R) where {T <: Real, R <: AbstractRange{T}}

Construct either a SetDomain or a RangeDomain.

julia
d1 = domain(1:5)
 d2 = domain([53.69, 89.2, 0.12])
 d3 = domain([2//3, 89//123])
 d4 = domain(4.3)
-d5 = domain(1,42,86.9)

source


# ConstraintDomains.domainMethod.
julia
domain()

Construct an EmptyDomain.

source


# ConstraintDomains.domainMethod.
julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
-domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source


# ConstraintDomains.domain_sizeMethod.
julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source


# ConstraintDomains.domain_sizeMethod.
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source


# ConstraintDomains.domain_sizeMethod.
julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source


# ConstraintDomains.exploreMethod.
julia
explore(domains, concept; settings = ExploreSettings(domains), parameters...)

Search (a part of) a search space and return a pair of vectors of configurations: (solutions, non_solutions). The exploration behavior is determined based on the settings.

Arguments

  • domains: A collection of domains to be explored.

  • concept: The concept representing the constraint to be targeted.

  • settings: An optional ExploreSettings object to configure the exploration. Default is ExploreSettings(domains).

  • parameters...: Additional parameters for the concept.

Returns

  • A tuple of sets: (solutions, non_solutions).

source


# ConstraintDomains.generate_parametersMethod.
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source


# ConstraintDomains.get_domainMethod.
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source


# ConstraintDomains.intersect_domainsMethod.
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source


# ConstraintDomains.merge_domainsMethod.
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source


# ConstraintDomains.to_domainsMethod.
julia
to_domains(args...)

Convert various arguments into valid domains format.

source


# Constraints.USUAL_CONSTRAINTSConstant.
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source


# Constraints.USUAL_SYMMETRIESConstant.
julia
USUAL_SYMMETRIES

A Dictionary that contains the function to apply for each symmetry to avoid searching a whole space.

source


# Constraints.ConstraintType.
julia
Constraint

Parametric structure with the following fields.

  • concept: a Boolean function that, given an assignment x, outputs true if x satisfies the constraint, and false otherwise.

  • error: a positive function that works as preferences over invalid assignments. Return 0.0 if the constraint is satisfied, and a strictly positive real otherwise.

source


# ConstraintCommons.extract_parametersFunction.
julia
extract_parameters(s::Symbol, constraints_dict=USUAL_CONSTRAINTS; parameters=ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS)

Return the parameters of the constraint s in constraints_dict.

Arguments

  • s::Symbol: the constraint name.

  • constraints_dict::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

  • parameters::Vector{Symbol}: vector of parameters. Default is ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS.

Example

julia
extract_parameters(:all_different)

source


# Constraints.argsMethod.
julia
args(c::Constraint)

Return the expected length restriction of the arguments in a constraint c. The value nothing indicates that any strictly positive number of value is accepted.

source


# Constraints.conceptMethod.
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source


# Constraints.conceptMethod.
julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

  • s::Symbol: the constraint name.

  • args...: the arguments to apply the concept to.

  • kargs...: the keyword arguments to apply the concept to.

Example

julia
concept(:all_different, [1, 2, 3])

source


# Constraints.constraints_descriptionsFunction.
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_descriptions()

source


# Constraints.constraints_parametersFunction.
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_parameters()

source


# Constraints.describeFunction.
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

  • constraints::Dict{Symbol,Constraint}: dictionary of constraints to describe. Default is USUAL_CONSTRAINTS.

  • width::Int: width of the table.

Example

julia
describe()

source


# Constraints.error_fMethod.
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source


# Constraints.params_lengthMethod.
julia
params_length(c::Constraint)

Return the expected length restriction of the arguments in a constraint c. The value nothing indicates that any strictly positive number of parameters is accepted.

source


# Constraints.symmetriesMethod.
julia
symmetries(c::Constraint)

Return the list of symmetries of c.

source


# CompositionalNetworks.CompositionMethod.
julia
Composition(f::F, symbols) where {F<:Function}

Construct a Composition.

source


# CompositionalNetworks.CompositionType.
julia
struct Composition{F<:Function}

Store the all the information of a composition learned by an ICN.

source


# CompositionalNetworks.ICNType.
julia
ICN(; nvars, dom_size, param, transformation, arithmetic, aggregation, comparison)

Construct an Interpretable Compositional Network, with the following arguments:

  • nvars: number of variable in the constraint

  • dom_size: maximum domain size of any variable in the constraint

  • param: optional parameter (default to nothing)

  • transformation: a transformation layer (optional)

  • arithmetic: a arithmetic layer (optional)

  • aggregation: a aggregation layer (optional)

  • comparison: a comparison layer (optional)

source


# CompositionalNetworks.aggregation_layerMethod.
julia
aggregation_layer()

Generate the layer of aggregations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source


# CompositionalNetworks.arithmetic_layerMethod.
julia
arithmetic_layer()

Generate the layer of arithmetic operations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source


# CompositionalNetworks.codeFunction.
julia
code(c::Composition, lang=:maths; name="composition")

Access the code of a composition c in a given language lang. The name of the generated method is optional.

source


# CompositionalNetworks.comparison_layerFunction.
julia
comparison_layer(param = false)

Generate the layer of transformations functions of the ICN. Iff param value is set, also includes all the parametric comparison with that value. The operations are mutually exclusive, that is only one will be selected.

source


# CompositionalNetworks.composeFunction.
julia
compose(icn, weights=nothing)

Return a function composed by some of the operations of a given ICN. Can be applied to any vector of variables. If weights are given, will assign to icn.

source


# CompositionalNetworks.compose_to_file!Method.
julia
compose_to_file!(concept, name, path; domains, param = nothing, language = :Julia, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200)

Explore, learn and compose a function and write it to a file.

Arguments:

  • concept: the concept to learn

  • name: the name to give to the constraint

  • path: path of the output file

Keywords arguments:

  • domains: domains that defines the search space

  • param: an optional parameter of the constraint

  • language: the language to export to, default to :julia

  • search: either :partial or :complete search

  • global_iter: number of learning iteration

  • local_iter: number of generation in the genetic algorithm

  • metric: the metric to measure the distance between a configuration and known solutions

  • popSize: size of the population in the genetic algorithm

source


# CompositionalNetworks.compositionMethod.
julia
composition(c::Composition)

Access the actual method of an ICN composition c.

source


# CompositionalNetworks.composition_to_file!Function.
julia
composition_to_file!(c::Composition, path, name, language=:Julia)

Write the composition code in a given language into a file at path.

source


# CompositionalNetworks.explore_learn_composeMethod.
julia
explore_learn_compose(concept; domains, param = nothing, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200, action = :composition)

Explore a search space, learn a composition from an ICN, and compose an error function.

Arguments:

  • concept: the concept of the targeted constraint

  • domains: domains of the variables that define the training space

  • param: an optional parameter of the constraint

  • search: either flexible,:partial or :complete search. Flexible search will use search_limit and solutions_limit to determine if the search space needs to be partially or completely explored

  • global_iter: number of learning iteration

  • local_iter: number of generation in the genetic algorithm

  • metric: the metric to measure the distance between a configuration and known solutions

  • popSize: size of the population in the genetic algorithm

  • action: either :symbols to have a description of the composition or :composition to have the composed function itself

source


# CompositionalNetworks.hammingMethod.
julia
hamming(x, X)

Compute the hamming distance of x over a collection of solutions X, i.e. the minimal number of variables to switch in xto reach a solution.

source


# CompositionalNetworks.lazyMethod.
julia
lazy(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V).

source


# CompositionalNetworks.lazy_paramMethod.
julia
lazy_param(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V; param).

source


# CompositionalNetworks.learn_composeMethod.
julia
learn_compose(;
+d5 = domain(1,42,86.9)

source

ConstraintDomains.domain Method
julia
domain()

Construct an EmptyDomain.

source

ConstraintDomains.domain Method
julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

ConstraintDomains.domain_size Method
julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

ConstraintDomains.domain_size Method
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

ConstraintDomains.domain_size Method
julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

ConstraintDomains.explore Method
julia
explore(domains, concept; settings = ExploreSettings(domains), parameters...)

Search (a part of) a search space and return a pair of vectors of configurations: (solutions, non_solutions). The exploration behavior is determined based on the settings.

Arguments

  • domains: A collection of domains to be explored.

  • concept: The concept representing the constraint to be targeted.

  • settings: An optional ExploreSettings object to configure the exploration. Default is ExploreSettings(domains).

  • parameters...: Additional parameters for the concept.

Returns

  • A tuple of sets: (solutions, non_solutions).

source

ConstraintDomains.generate_parameters Method
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source

ConstraintDomains.get_domain Method
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

ConstraintDomains.intersect_domains Method
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

ConstraintDomains.merge_domains Method
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source

ConstraintDomains.to_domains Method
julia
to_domains(args...)

Convert various arguments into valid domains format.

source

Constraints.USUAL_CONSTRAINTS Constant
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source

Constraints.USUAL_SYMMETRIES Constant
julia
USUAL_SYMMETRIES

A Dictionary that contains the function to apply for each symmetry to avoid searching a whole space.

source

Constraints.Constraint Type
julia
Constraint

Parametric structure with the following fields.

  • concept: a Boolean function that, given an assignment x, outputs true if x satisfies the constraint, and false otherwise.

  • error: a positive function that works as preferences over invalid assignments. Return 0.0 if the constraint is satisfied, and a strictly positive real otherwise.

source

ConstraintCommons.extract_parameters Function
julia
extract_parameters(s::Symbol, constraints_dict=USUAL_CONSTRAINTS; parameters=ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS)

Return the parameters of the constraint s in constraints_dict.

Arguments

  • s::Symbol: the constraint name.

  • constraints_dict::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

  • parameters::Vector{Symbol}: vector of parameters. Default is ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS.

Example

julia
extract_parameters(:all_different)

source

Constraints.args Method
julia
args(c::Constraint)

Return the expected length restriction of the arguments in a constraint c. The value nothing indicates that any strictly positive number of value is accepted.

source

Constraints.concept Method
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source

Constraints.concept Method
julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

  • s::Symbol: the constraint name.

  • args...: the arguments to apply the concept to.

  • kargs...: the keyword arguments to apply the concept to.

Example

julia
concept(:all_different, [1, 2, 3])

source

Constraints.constraints_descriptions Function
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_descriptions()

source

Constraints.constraints_parameters Function
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_parameters()

source

Constraints.describe Function
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

  • constraints::Dict{Symbol,Constraint}: dictionary of constraints to describe. Default is USUAL_CONSTRAINTS.

  • width::Int: width of the table.

Example

julia
describe()

source

Constraints.error_f Method
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source

Constraints.params_length Method
julia
params_length(c::Constraint)

Return the expected length restriction of the arguments in a constraint c. The value nothing indicates that any strictly positive number of parameters is accepted.

source

Constraints.symmetries Method
julia
symmetries(c::Constraint)

Return the list of symmetries of c.

source

CompositionalNetworks.Composition Method
julia
Composition(f::F, symbols) where {F<:Function}

Construct a Composition.

source

CompositionalNetworks.Composition Type
julia
struct Composition{F<:Function}

Store the all the information of a composition learned by an ICN.

source

CompositionalNetworks.ICN Type
julia
ICN(; nvars, dom_size, param, transformation, arithmetic, aggregation, comparison)

Construct an Interpretable Compositional Network, with the following arguments:

  • nvars: number of variable in the constraint

  • dom_size: maximum domain size of any variable in the constraint

  • param: optional parameter (default to nothing)

  • transformation: a transformation layer (optional)

  • arithmetic: a arithmetic layer (optional)

  • aggregation: a aggregation layer (optional)

  • comparison: a comparison layer (optional)

source

CompositionalNetworks.aggregation_layer Method
julia
aggregation_layer()

Generate the layer of aggregations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source

CompositionalNetworks.arithmetic_layer Method
julia
arithmetic_layer()

Generate the layer of arithmetic operations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source

CompositionalNetworks.code Function
julia
code(c::Composition, lang=:maths; name="composition")

Access the code of a composition c in a given language lang. The name of the generated method is optional.

source

CompositionalNetworks.comparison_layer Function
julia
comparison_layer(param = false)

Generate the layer of transformations functions of the ICN. Iff param value is set, also includes all the parametric comparison with that value. The operations are mutually exclusive, that is only one will be selected.

source

CompositionalNetworks.compose Function
julia
compose(icn, weights=nothing)

Return a function composed by some of the operations of a given ICN. Can be applied to any vector of variables. If weights are given, will assign to icn.

source

CompositionalNetworks.compose_to_file! Method
julia
compose_to_file!(concept, name, path; domains, param = nothing, language = :Julia, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200)

Explore, learn and compose a function and write it to a file.

Arguments:

  • concept: the concept to learn

  • name: the name to give to the constraint

  • path: path of the output file

Keywords arguments:

  • domains: domains that defines the search space

  • param: an optional parameter of the constraint

  • language: the language to export to, default to :julia

  • search: either :partial or :complete search

  • global_iter: number of learning iteration

  • local_iter: number of generation in the genetic algorithm

  • metric: the metric to measure the distance between a configuration and known solutions

  • popSize: size of the population in the genetic algorithm

source

CompositionalNetworks.composition Method
julia
composition(c::Composition)

Access the actual method of an ICN composition c.

source

CompositionalNetworks.composition_to_file! Function
julia
composition_to_file!(c::Composition, path, name, language=:Julia)

Write the composition code in a given language into a file at path.

source

CompositionalNetworks.explore_learn_compose Method
julia
explore_learn_compose(concept; domains, param = nothing, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200, action = :composition)

Explore a search space, learn a composition from an ICN, and compose an error function.

Arguments:

  • concept: the concept of the targeted constraint

  • domains: domains of the variables that define the training space

  • param: an optional parameter of the constraint

  • search: either flexible,:partial or :complete search. Flexible search will use search_limit and solutions_limit to determine if the search space needs to be partially or completely explored

  • global_iter: number of learning iteration

  • local_iter: number of generation in the genetic algorithm

  • metric: the metric to measure the distance between a configuration and known solutions

  • popSize: size of the population in the genetic algorithm

  • action: either :symbols to have a description of the composition or :composition to have the composed function itself

source

CompositionalNetworks.hamming Method
julia
hamming(x, X)

Compute the hamming distance of x over a collection of solutions X, i.e. the minimal number of variables to switch in xto reach a solution.

source

CompositionalNetworks.lazy Method
julia
lazy(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V).

source

CompositionalNetworks.lazy_param Method
julia
lazy_param(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V; param).

source

CompositionalNetworks.learn_compose Method
julia
learn_compose(;
     nvars, dom_size, param=nothing, icn=ICN(nvars, dom_size, param),
     X, X_sols, global_iter=100, local_iter=100, metric=hamming, popSize=200
-)

Create an ICN, optimize it, and return its composition.

source


# CompositionalNetworks.manhattanMethod.
julia
manhattan(x, X)

source


# CompositionalNetworks.minkowskiMethod.
julia
minkowski(x, X, p)

source


# CompositionalNetworks.nbitsMethod.
julia
nbits(icn)

Return the expected number of bits of a viable weight of an ICN.

source


# CompositionalNetworks.regularizationMethod.
julia
regularization(icn)

Return the regularization value of an ICN weights, which is proportional to the normalized number of operations selected in the icn layers.

source


# CompositionalNetworks.show_layersMethod.
julia
show_layers(icn)

Return a formatted string with each layers in the icn.

source


# CompositionalNetworks.symbolsMethod.
julia
symbols(c::Composition)

Output the composition as a layered collection of Symbols.

source


# CompositionalNetworks.transformation_layerFunction.
julia
transformation_layer(param = Vector{Symbol}())

Generate the layer of transformations functions of the ICN. Iff param value is non empty, also includes all the related parametric transformations.

source


# CompositionalNetworks.weights!Method.
julia
weights!(icn, weights)

Set the weights of an ICN with a BitVector.

source


# CompositionalNetworks.weightsMethod.
julia
weights(icn)

Access the current set of weights of an ICN.

source


# CompositionalNetworks.weights_biasMethod.
julia
weights_bias(x)

A metric that bias x towards operations with a lower bit. Do not affect the main metric.

source


# QUBOConstraints.QUBO_linear_sumMethod.
julia
QUBO_linear_sum(n, σ)

One valid QUBO matrix given n variables and parameter σ for the linear sum constraint.

source


# QUBOConstraints.binarizeMethod.
julia
binarize(x[, domain]; binarization = :one_hot)

Binarize x following the binarization encoding. If x is a vector (instead of a number per say), domain is optional.

source


# QUBOConstraints.debinarizeMethod.
julia
debinarize(x[, domain]; binarization = :one_hot)

Transform a binary vector into a number or a set of number. If domain is not given, it will compute a default value based on binarization and x.

source


# QUBOConstraints.is_validFunction.
julia
is_valid(x, encoding::Symbol = :none)

Check if x has a valid format for encoding.

For instance, if encoding == :one_hot, at most one bit of x can be set to 1.

source


# QUBOConstraints.trainMethod.
julia
train(args...)

Default train method for any AbstractOptimizer.

source


- +)

Create an ICN, optimize it, and return its composition.

source

CompositionalNetworks.manhattan Method
julia
manhattan(x, X)

source

CompositionalNetworks.minkowski Method
julia
minkowski(x, X, p)

source

CompositionalNetworks.nbits Method
julia
nbits(icn)

Return the expected number of bits of a viable weight of an ICN.

source

CompositionalNetworks.regularization Method
julia
regularization(icn)

Return the regularization value of an ICN weights, which is proportional to the normalized number of operations selected in the icn layers.

source

CompositionalNetworks.show_layers Method
julia
show_layers(icn)

Return a formatted string with each layers in the icn.

source

CompositionalNetworks.symbols Method
julia
symbols(c::Composition)

Output the composition as a layered collection of Symbols.

source

CompositionalNetworks.transformation_layer Function
julia
transformation_layer(param = Vector{Symbol}())

Generate the layer of transformations functions of the ICN. Iff param value is non empty, also includes all the related parametric transformations.

source

CompositionalNetworks.weights! Method
julia
weights!(icn, weights)

Set the weights of an ICN with a BitVector.

source

CompositionalNetworks.weights Method
julia
weights(icn)

Access the current set of weights of an ICN.

source

CompositionalNetworks.weights_bias Method
julia
weights_bias(x)

A metric that bias x towards operations with a lower bit. Do not affect the main metric.

source

QUBOConstraints.QUBO_linear_sum Method
julia
QUBO_linear_sum(n, σ)

One valid QUBO matrix given n variables and parameter σ for the linear sum constraint.

source

QUBOConstraints.binarize Method
julia
binarize(x[, domain]; binarization = :one_hot)

Binarize x following the binarization encoding. If x is a vector (instead of a number per say), domain is optional.

source

QUBOConstraints.debinarize Method
julia
debinarize(x[, domain]; binarization = :one_hot)

Transform a binary vector into a number or a set of number. If domain is not given, it will compute a default value based on binarization and x.

source

QUBOConstraints.is_valid Function
julia
is_valid(x, encoding::Symbol = :none)

Check if x has a valid format for encoding.

For instance, if encoding == :one_hot, at most one bit of x can be set to 1.

source

QUBOConstraints.train Method
julia
train(args...)

Default train method for any AbstractOptimizer.

source

+ \ No newline at end of file diff --git a/dev/api/10_full.html b/dev/api/10_full.html index 1da4607..e0af1db 100644 --- a/dev/api/10_full.html +++ b/dev/api/10_full.html @@ -4,20 +4,20 @@ Full API | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Full API

# ConstraintCommons.USUAL_CONSTRAINT_PARAMETERSConstant.
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
+    
Skip to content

Full API

ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS Constant
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
     :bool, # boolean parameter
     :dim, # dimension, an integer parameter used along the pair_vars or vals parameters
     :id, # index to target one variable in the input vector
@@ -26,27 +26,27 @@
     :pair_vars, # a list of parameters that are paired with each variable in the input vector
     :val, # one scalar value
     :vals, # a list of scalar values (independent of the input vector size)
-]

source


# ConstraintCommons.AbstractAutomatonType.
julia
AbstractAutomaton

An abstract interface for automata used in Julia Constraints packages. Requirements:

  • accept(a<:AbstractAutomaton, word): return true if a accepts word.

source


# ConstraintCommons.AbstractMultivaluedDecisionDiagramType.
julia
AbstractMultivaluedDecisionDiagram

An abstract interface for Multivalued Decision Diagrams (MDD) used in Julia Constraints packages. Requirements:

  • accept(a<:AbstractMultivaluedDecisionDiagram, word): return true if a accepts word.

source


# ConstraintCommons.AutomatonType.
julia
Automaton{S, T, F <: Union{S, Vector{S}, Set{S}}} <: AbstractAutomaton

A minimal implementation of a deterministic automaton structure.

source


# ConstraintCommons.MDDType.
julia
MDD{S,T} <: AbstractMultivaluedDecisionDiagram

A minimal implementation of a multivalued decision diagram structure.

source


# ConstraintCommons.acceptMethod.
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source


# ConstraintCommons.at_endMethod.
julia
at_end(a::Automaton, s)

Internal method used by accept with Automaton.

source


# ConstraintCommons.consinMethod.
julia
consin(::Any, ::Nothing)

Extends Base.in (or ) when the set is nothing. Returns false.

source


# ConstraintCommons.consisemptyMethod.
julia
consisempty(::Nothing)

Extends Base.isempty when the set is nothing. Returns true.

source


# ConstraintCommons.extract_parametersMethod.
julia
extract_parameters(m::Union{Method, Function}; parameters)

Extracts the intersection between the kargs of m and parameters (defaults to USUAL_CONSTRAINT_PARAMETERS).

source


# ConstraintCommons.incsert!Function.
julia
incsert!(d::Union{AbstractDict, AbstractDictionary}, ind, val = 1)

Increase or insert a counter in a dictionary-based collection. The counter insertion defaults to val = 1.

source


# ConstraintCommons.oversampleMethod.
julia
oversample(X, f)

Oversample elements of X until the boolean function f has as many true and false configurations.

source


# ConstraintCommons.symconFunction.
julia
symcon(s1::Symbol, s2::Symbol, connector::AbstractString="_")

Extends * to Symbols multiplication by connecting the symbols by an _.

source


# ConstraintCommons.δ_extremaMethod.
julia
δ_extrema(X...)

Compute both the difference between the maximum and the minimum of over all the collections of X.

source


# ConstraintDomains.AbstractDomainType.
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

  • Base.∈(val, ::D)

  • Base.rand(::D)

  • Base.length(::D) that is the number of elements in a discrete domain, and the distance between bounds or similar for a continuous domain

Additionally, if the domain is used in a dynamic context, it can extend

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source


# ConstraintDomains.BoolParameterDomainType.
julia
BoolParameterDomain <: AbstractDomain

A domain to store boolean values. It is used to generate random parameters.

source


# ConstraintDomains.ContinuousDomainType.
julia
ContinuousDomain{T <: Real} <: AbstractDomain

An abstract supertype for all continuous domains.

source


# ConstraintDomains.DimParameterDomainType.
julia
DimParameterDomain <: AbstractDomain

A domain to store dimensions. It is used to generate random parameters.

source


# ConstraintDomains.DiscreteDomainType.
julia
DiscreteDomain{T <: Number} <: AbstractDomain

An abstract supertype for discrete domains (set, range).

source


# ConstraintDomains.EmptyDomainType.
julia
EmptyDomain

A struct to handle yet to be defined domains.

source


# ConstraintDomains.ExploreSettingsMethod.
julia
ExploreSettings(domains; 
+]

source

ConstraintCommons.AbstractAutomaton Type
julia
AbstractAutomaton

An abstract interface for automata used in Julia Constraints packages. Requirements:

  • accept(a<:AbstractAutomaton, word): return true if a accepts word.

source

ConstraintCommons.AbstractMultivaluedDecisionDiagram Type
julia
AbstractMultivaluedDecisionDiagram

An abstract interface for Multivalued Decision Diagrams (MDD) used in Julia Constraints packages. Requirements:

  • accept(a<:AbstractMultivaluedDecisionDiagram, word): return true if a accepts word.

source

ConstraintCommons.Automaton Type
julia
Automaton{S, T, F <: Union{S, Vector{S}, Set{S}}} <: AbstractAutomaton

A minimal implementation of a deterministic automaton structure.

source

ConstraintCommons.MDD Type
julia
MDD{S,T} <: AbstractMultivaluedDecisionDiagram

A minimal implementation of a multivalued decision diagram structure.

source

ConstraintCommons.accept Method
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

ConstraintCommons.at_end Method
julia
at_end(a::Automaton, s)

Internal method used by accept with Automaton.

source

ConstraintCommons.consin Method
julia
consin(::Any, ::Nothing)

Extends Base.in (or ) when the set is nothing. Returns false.

source

ConstraintCommons.consisempty Method
julia
consisempty(::Nothing)

Extends Base.isempty when the set is nothing. Returns true.

source

ConstraintCommons.extract_parameters Method
julia
extract_parameters(m::Union{Method, Function}; parameters)

Extracts the intersection between the kargs of m and parameters (defaults to USUAL_CONSTRAINT_PARAMETERS).

source

ConstraintCommons.incsert! Function
julia
incsert!(d::Union{AbstractDict, AbstractDictionary}, ind, val = 1)

Increase or insert a counter in a dictionary-based collection. The counter insertion defaults to val = 1.

source

ConstraintCommons.oversample Method
julia
oversample(X, f)

Oversample elements of X until the boolean function f has as many true and false configurations.

source

ConstraintCommons.symcon Function
julia
symcon(s1::Symbol, s2::Symbol, connector::AbstractString="_")

Extends * to Symbols multiplication by connecting the symbols by an _.

source

ConstraintCommons.δ_extrema Method
julia
δ_extrema(X...)

Compute both the difference between the maximum and the minimum of over all the collections of X.

source

ConstraintDomains.AbstractDomain Type
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

  • Base.∈(val, ::D)

  • Base.rand(::D)

  • Base.length(::D) that is the number of elements in a discrete domain, and the distance between bounds or similar for a continuous domain

Additionally, if the domain is used in a dynamic context, it can extend

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source

ConstraintDomains.BoolParameterDomain Type
julia
BoolParameterDomain <: AbstractDomain

A domain to store boolean values. It is used to generate random parameters.

source

ConstraintDomains.ContinuousDomain Type
julia
ContinuousDomain{T <: Real} <: AbstractDomain

An abstract supertype for all continuous domains.

source

ConstraintDomains.DimParameterDomain Type
julia
DimParameterDomain <: AbstractDomain

A domain to store dimensions. It is used to generate random parameters.

source

ConstraintDomains.DiscreteDomain Type
julia
DiscreteDomain{T <: Number} <: AbstractDomain

An abstract supertype for discrete domains (set, range).

source

ConstraintDomains.EmptyDomain Type
julia
EmptyDomain

A struct to handle yet to be defined domains.

source

ConstraintDomains.ExploreSettings Method
julia
ExploreSettings(domains; 
                 complete_search_limit = 10^6, 
                 max_samplings = sum(domain_size, domains), 
                 search = :flexible, 
-                solutions_limit = floor(Int, sqrt(max_samplings)))

Create an ExploreSettings object to configure the exploration of a search space composed of a collection of domains.

Arguments

  • domains: A collection of domains to be explored.

  • complete_search_limit: An integer specifying the maximum limit for complete search iterations. Default is 10^6.

  • max_samplings: An integer specifying the maximum number of samplings. Default is the sum of domain sizes.

  • search: A symbol indicating the type of search to perform. Default is :flexible.

  • solutions_limit: An integer specifying the limit on the number of solutions. Default is the floor of the square root of max_samplings.

Returns

  • ExploreSettings object with the specified settings.

source


# ConstraintDomains.FakeAutomatonType.
julia
FakeAutomaton{T} <: ConstraintCommons.AbstractAutomaton

A structure to generate pseudo automaton enough for parameter exploration.

source


# ConstraintDomains.IdParameterDomainType.
julia
IdParameterDomain <: AbstractDomain

A domain to store ids. It is used to generate random parameters.

source


# ConstraintDomains.IntervalsType.
julia
Intervals{T <: Real} <: ContinuousDomain{T}

An encapsuler to store a vector of PatternFolds.Interval. Dynamic changes to Intervals are not handled yet.

source


# ConstraintDomains.LanguageParameterDomainType.
julia
LanguageParameterDomain <: AbstractDomain

A domain to store languages. It is used to generate random parameters.

source


# ConstraintDomains.OpParameterDomainType.
julia
OpParameterDomain{T} <: AbstractDomain

A domain to store operators. It is used to generate random parameters.

source


# ConstraintDomains.PairVarsParameterDomainType.
julia
PairVarsParameterDomain{T} <: AbstractDomain

A domain to store values paired with variables. It is used to generate random parameters.

source


# ConstraintDomains.RangeDomainType.
julia
RangeDomain

A discrete domain defined by a range <: AbstractRange{Real}. As ranges are immutable in Julia, changes in RangeDomain must use set_domain!.

source


# ConstraintDomains.SetDomainType.
julia
SetDomain{T <: Number} <: DiscreteDomain{T}

Domain that stores discrete values as a set of (unordered) points.

source


# ConstraintDomains.ValParameterDomainType.
julia
ValParameterDomain{T} <: AbstractDomain

A domain to store one value. It is used to generate random parameters.

source


# ConstraintDomains.ValsParameterDomainType.
julia
ValsParameterDomain{T} <: AbstractDomain

A domain to store values. It is used to generate random parameters.

source


# Base.convertMethod.
julia
Base.convert(::Type{Union{Intervals, RangeDomain}}, d::Union{Intervals, RangeDomain})

Extends Base.convert for domains.

source


# Base.delete!Method.
julia
Base.delete!(d::SetDomain, value)(d::SetDomain, value)

Delete value from the list of points in d.

source


# Base.eltypeMethod.
julia
Base.eltype(::AbstractDomain)

Extend eltype for domains.

source


# Base.inMethod.
julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source


# Base.inMethod.
julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source


# Base.inMethod.
julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source


# Base.isemptyMethod.
julia
Base.isempty(d <: AbstractDomain)

Fallback method for isempty(d) that return length(d) == 0 which default to 0.

source


# Base.lengthMethod.
julia
Base.length(itv::Intervals)

Return the sum of the length of each interval in itv.

source


# Base.lengthMethod.
julia
Base.rand(d <: AbstractDomain)

Fallback method for length(d) that return 0.

source


# Base.lengthMethod.
julia
Base.length(d::D) where D <: DiscreteDomain

Return the number of points in d.

source


# Base.randMethod.
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source


# Base.randMethod.
julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source


# Base.randMethod.
julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source


# Base.randMethod.
julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source


# Base.stringMethod.
julia
Base.string(D::Vector{<:AbstractDomain})
-Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source


# ConstraintCommons.acceptMethod.
julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source


# ConstraintDomains.ArbitraryDomainMethod.
julia
ArbitraryDomain{T} <: DiscreteDomain{T}

A domain type that stores arbitrary values, possibly non numeric, of type T.

source


# ConstraintDomains._exploreMethod.
julia
_explore(args...)

Internals of the explore function. Behavior is automatically adjusted on the kind of exploration: :flexible, :complete, :partial.

source


# ConstraintDomains.add!Method.
julia
add!(d::SetDomain, value)

Add value to the list of points in d.

source


# ConstraintDomains.domainMethod.
julia
domain(values)
+                solutions_limit = floor(Int, sqrt(max_samplings)))

Create an ExploreSettings object to configure the exploration of a search space composed of a collection of domains.

Arguments

  • domains: A collection of domains to be explored.

  • complete_search_limit: An integer specifying the maximum limit for complete search iterations. Default is 10^6.

  • max_samplings: An integer specifying the maximum number of samplings. Default is the sum of domain sizes.

  • search: A symbol indicating the type of search to perform. Default is :flexible.

  • solutions_limit: An integer specifying the limit on the number of solutions. Default is the floor of the square root of max_samplings.

Returns

  • ExploreSettings object with the specified settings.

source

ConstraintDomains.FakeAutomaton Type
julia
FakeAutomaton{T} <: ConstraintCommons.AbstractAutomaton

A structure to generate pseudo automaton enough for parameter exploration.

source

ConstraintDomains.IdParameterDomain Type
julia
IdParameterDomain <: AbstractDomain

A domain to store ids. It is used to generate random parameters.

source

ConstraintDomains.Intervals Type
julia
Intervals{T <: Real} <: ContinuousDomain{T}

An encapsuler to store a vector of PatternFolds.Interval. Dynamic changes to Intervals are not handled yet.

source

ConstraintDomains.LanguageParameterDomain Type
julia
LanguageParameterDomain <: AbstractDomain

A domain to store languages. It is used to generate random parameters.

source

ConstraintDomains.OpParameterDomain Type
julia
OpParameterDomain{T} <: AbstractDomain

A domain to store operators. It is used to generate random parameters.

source

ConstraintDomains.PairVarsParameterDomain Type
julia
PairVarsParameterDomain{T} <: AbstractDomain

A domain to store values paired with variables. It is used to generate random parameters.

source

ConstraintDomains.RangeDomain Type
julia
RangeDomain

A discrete domain defined by a range <: AbstractRange{Real}. As ranges are immutable in Julia, changes in RangeDomain must use set_domain!.

source

ConstraintDomains.SetDomain Type
julia
SetDomain{T <: Number} <: DiscreteDomain{T}

Domain that stores discrete values as a set of (unordered) points.

source

ConstraintDomains.ValParameterDomain Type
julia
ValParameterDomain{T} <: AbstractDomain

A domain to store one value. It is used to generate random parameters.

source

ConstraintDomains.ValsParameterDomain Type
julia
ValsParameterDomain{T} <: AbstractDomain

A domain to store values. It is used to generate random parameters.

source

Base.convert Method
julia
Base.convert(::Type{Union{Intervals, RangeDomain}}, d::Union{Intervals, RangeDomain})

Extends Base.convert for domains.

source

Base.delete! Method
julia
Base.delete!(d::SetDomain, value)(d::SetDomain, value)

Delete value from the list of points in d.

source

Base.eltype Method
julia
Base.eltype(::AbstractDomain)

Extend eltype for domains.

source

Base.in Method
julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

Base.in Method
julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

Base.in Method
julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source

Base.isempty Method
julia
Base.isempty(d <: AbstractDomain)

Fallback method for isempty(d) that return length(d) == 0 which default to 0.

source

Base.length Method
julia
Base.length(itv::Intervals)

Return the sum of the length of each interval in itv.

source

Base.length Method
julia
Base.rand(d <: AbstractDomain)

Fallback method for length(d) that return 0.

source

Base.length Method
julia
Base.length(d::D) where D <: DiscreteDomain

Return the number of points in d.

source

Base.rand Method
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

Base.rand Method
julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

Base.rand Method
julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

Base.rand Method
julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

Base.string Method
julia
Base.string(D::Vector{<:AbstractDomain})
+Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source

ConstraintCommons.accept Method
julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

ConstraintDomains.ArbitraryDomain Method
julia
ArbitraryDomain{T} <: DiscreteDomain{T}

A domain type that stores arbitrary values, possibly non numeric, of type T.

source

ConstraintDomains._explore Method
julia
_explore(args...)

Internals of the explore function. Behavior is automatically adjusted on the kind of exploration: :flexible, :complete, :partial.

source

ConstraintDomains.add! Method
julia
add!(d::SetDomain, value)

Add value to the list of points in d.

source

ConstraintDomains.domain Method
julia
domain(values)
 domain(range::R) where {T <: Real, R <: AbstractRange{T}}

Construct either a SetDomain or a RangeDomain.

julia
d1 = domain(1:5)
 d2 = domain([53.69, 89.2, 0.12])
 d3 = domain([2//3, 89//123])
 d4 = domain(4.3)
-d5 = domain(1,42,86.9)

source


# ConstraintDomains.domainMethod.
julia
domain()

Construct an EmptyDomain.

source


# ConstraintDomains.domainMethod.
julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
-domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source


# ConstraintDomains.domain_sizeMethod.
julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source


# ConstraintDomains.domain_sizeMethod.
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source


# ConstraintDomains.domain_sizeMethod.
julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source


# ConstraintDomains.exploreMethod.
julia
explore(domains, concept; settings = ExploreSettings(domains), parameters...)

Search (a part of) a search space and return a pair of vectors of configurations: (solutions, non_solutions). The exploration behavior is determined based on the settings.

Arguments

  • domains: A collection of domains to be explored.

  • concept: The concept representing the constraint to be targeted.

  • settings: An optional ExploreSettings object to configure the exploration. Default is ExploreSettings(domains).

  • parameters...: Additional parameters for the concept.

Returns

  • A tuple of sets: (solutions, non_solutions).

source


# ConstraintDomains.fake_automatonMethod.
julia
fake_automaton(d)

Construct a FakeAutomaton.

source


# ConstraintDomains.generate_parametersMethod.
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source


# ConstraintDomains.get_domainMethod.
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source


# ConstraintDomains.intersect_domains!Method.
julia
intersect_domains!(is, i, new_itvls)

Compute the intersections of a domain with an interval and store the results in new_itvls.

Arguments

  • is::IS: a collection of intervals.

  • i::I: an interval.

  • new_itvls::Vector{I}: a vector to store the results.

source


# ConstraintDomains.intersect_domainsMethod.
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source


# ConstraintDomains.merge_domainsMethod.
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source


# ConstraintDomains.sizeMethod.
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source


# ConstraintDomains.to_domainsMethod.
julia
to_domains(args...)

Convert various arguments into valid domains format.

source


# Constraints.USUAL_CONSTRAINTSConstant.
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source


# Constraints.USUAL_SYMMETRIESConstant.
julia
USUAL_SYMMETRIES

A Dictionary that contains the function to apply for each symmetry to avoid searching a whole space.

source


# Constraints.ConstraintType.
julia
Constraint

Parametric structure with the following fields.

  • concept: a Boolean function that, given an assignment x, outputs true if x satisfies the constraint, and false otherwise.

  • error: a positive function that works as preferences over invalid assignments. Return 0.0 if the constraint is satisfied, and a strictly positive real otherwise.

source


# ConstraintCommons.extract_parametersFunction.
julia
extract_parameters(s::Symbol, constraints_dict=USUAL_CONSTRAINTS; parameters=ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS)

Return the parameters of the constraint s in constraints_dict.

Arguments

  • s::Symbol: the constraint name.

  • constraints_dict::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

  • parameters::Vector{Symbol}: vector of parameters. Default is ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS.

Example

julia
extract_parameters(:all_different)

source


# Constraints.argsMethod.
julia
args(c::Constraint)

Return the expected length restriction of the arguments in a constraint c. The value nothing indicates that any strictly positive number of value is accepted.

source


# Constraints.conceptMethod.
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source


# Constraints.conceptMethod.
julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

  • s::Symbol: the constraint name.

  • args...: the arguments to apply the concept to.

  • kargs...: the keyword arguments to apply the concept to.

Example

julia
concept(:all_different, [1, 2, 3])

source


# Constraints.concept_vs_errorMethod.
julia
concept_vs_error(c, e, args...; kargs...)

Compare the results of a concept function and an error function for the same inputs. It is mainly used for testing purposes.

Arguments

  • c: The concept function.

  • e: The error function.

  • args...: Positional arguments to be passed to both the concept and error functions.

  • kargs...: Keyword arguments to be passed to both the concept and error functions.

Returns

  • Boolean: Returns true if the result of the concept function is not equal to whether the result of the error function is greater than 0.0. Otherwise, it returns false.

Examples

julia
concept_vs_error(all_different, make_error(:all_different), [1, 2, 3]) # Returns false

source


# Constraints.constraints_descriptionsFunction.
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_descriptions()

source


# Constraints.constraints_parametersFunction.
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_parameters()

source


# Constraints.describeFunction.
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

  • constraints::Dict{Symbol,Constraint}: dictionary of constraints to describe. Default is USUAL_CONSTRAINTS.

  • width::Int: width of the table.

Example

julia
describe()

source


# Constraints.error_fMethod.
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source


# Constraints.make_errorMethod.
julia
make_error(symb::Symbol)

Create a function that returns an error based on the predicate of the constraint identified by the symbol provided.

Arguments

  • symb::Symbol: The symbol used to determine the error function to be returned. The function first checks if a predicate with the prefix "icn_" exists in the Constraints module. If it does, it returns that function. If it doesn't, it checks for a predicate with the prefix "error_". If that exists, it returns that function. If neither exists, it returns a function that evaluates the predicate with the prefix "concept_" and returns the negation of its result cast to Float64.

Returns

  • Function: A function that takes in a variable x and an arbitrary number of parameters params. The function returns a Float64.

Examples

julia
e = make_error(:all_different)
+d5 = domain(1,42,86.9)

source

ConstraintDomains.domain Method
julia
domain()

Construct an EmptyDomain.

source

ConstraintDomains.domain Method
julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

ConstraintDomains.domain_size Method
julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

ConstraintDomains.domain_size Method
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

ConstraintDomains.domain_size Method
julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

ConstraintDomains.explore Method
julia
explore(domains, concept; settings = ExploreSettings(domains), parameters...)

Search (a part of) a search space and return a pair of vectors of configurations: (solutions, non_solutions). The exploration behavior is determined based on the settings.

Arguments

  • domains: A collection of domains to be explored.

  • concept: The concept representing the constraint to be targeted.

  • settings: An optional ExploreSettings object to configure the exploration. Default is ExploreSettings(domains).

  • parameters...: Additional parameters for the concept.

Returns

  • A tuple of sets: (solutions, non_solutions).

source

ConstraintDomains.fake_automaton Method
julia
fake_automaton(d)

Construct a FakeAutomaton.

source

ConstraintDomains.generate_parameters Method
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source

ConstraintDomains.get_domain Method
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

ConstraintDomains.intersect_domains! Method
julia
intersect_domains!(is, i, new_itvls)

Compute the intersections of a domain with an interval and store the results in new_itvls.

Arguments

  • is::IS: a collection of intervals.

  • i::I: an interval.

  • new_itvls::Vector{I}: a vector to store the results.

source

ConstraintDomains.intersect_domains Method
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

ConstraintDomains.merge_domains Method
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source

ConstraintDomains.size Method
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source

ConstraintDomains.to_domains Method
julia
to_domains(args...)

Convert various arguments into valid domains format.

source

Constraints.USUAL_CONSTRAINTS Constant
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source

Constraints.USUAL_SYMMETRIES Constant
julia
USUAL_SYMMETRIES

A Dictionary that contains the function to apply for each symmetry to avoid searching a whole space.

source

Constraints.Constraint Type
julia
Constraint

Parametric structure with the following fields.

  • concept: a Boolean function that, given an assignment x, outputs true if x satisfies the constraint, and false otherwise.

  • error: a positive function that works as preferences over invalid assignments. Return 0.0 if the constraint is satisfied, and a strictly positive real otherwise.

source

ConstraintCommons.extract_parameters Function
julia
extract_parameters(s::Symbol, constraints_dict=USUAL_CONSTRAINTS; parameters=ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS)

Return the parameters of the constraint s in constraints_dict.

Arguments

  • s::Symbol: the constraint name.

  • constraints_dict::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

  • parameters::Vector{Symbol}: vector of parameters. Default is ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS.

Example

julia
extract_parameters(:all_different)

source

Constraints.args Method
julia
args(c::Constraint)

Return the expected length restriction of the arguments in a constraint c. The value nothing indicates that any strictly positive number of value is accepted.

source

Constraints.concept Method
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source

Constraints.concept Method
julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

  • s::Symbol: the constraint name.

  • args...: the arguments to apply the concept to.

  • kargs...: the keyword arguments to apply the concept to.

Example

julia
concept(:all_different, [1, 2, 3])

source

Constraints.concept_vs_error Method
julia
concept_vs_error(c, e, args...; kargs...)

Compare the results of a concept function and an error function for the same inputs. It is mainly used for testing purposes.

Arguments

  • c: The concept function.

  • e: The error function.

  • args...: Positional arguments to be passed to both the concept and error functions.

  • kargs...: Keyword arguments to be passed to both the concept and error functions.

Returns

  • Boolean: Returns true if the result of the concept function is not equal to whether the result of the error function is greater than 0.0. Otherwise, it returns false.

Examples

julia
concept_vs_error(all_different, make_error(:all_different), [1, 2, 3]) # Returns false

source

Constraints.constraints_descriptions Function
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_descriptions()

source

Constraints.constraints_parameters Function
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_parameters()

source

Constraints.describe Function
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

  • constraints::Dict{Symbol,Constraint}: dictionary of constraints to describe. Default is USUAL_CONSTRAINTS.

  • width::Int: width of the table.

Example

julia
describe()

source

Constraints.error_f Method
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source

Constraints.make_error Method
julia
make_error(symb::Symbol)

Create a function that returns an error based on the predicate of the constraint identified by the symbol provided.

Arguments

  • symb::Symbol: The symbol used to determine the error function to be returned. The function first checks if a predicate with the prefix "icn_" exists in the Constraints module. If it does, it returns that function. If it doesn't, it checks for a predicate with the prefix "error_". If that exists, it returns that function. If neither exists, it returns a function that evaluates the predicate with the prefix "concept_" and returns the negation of its result cast to Float64.

Returns

  • Function: A function that takes in a variable x and an arbitrary number of parameters params. The function returns a Float64.

Examples

julia
e = make_error(:all_different)
 e([1, 2, 3]) # Returns 0.0
-e([1, 1, 3]) # Returns 1.0

source


# Constraints.params_lengthMethod.
julia
params_length(c::Constraint)

Return the expected length restriction of the arguments in a constraint c. The value nothing indicates that any strictly positive number of parameters is accepted.

source


# Constraints.shrink_conceptMethod.
julia
shrink_concept(s)

Simply delete the concept_ part of symbol or string starting with it. TODO: add a check with a warning if s starts with something different.

source


# Constraints.symmetriesMethod.
julia
symmetries(c::Constraint)

Return the list of symmetries of c.

source


# Constraints.xcsp_all_differentMethod.
julia
xcsp_all_different(list::Vector{Int})

Return true if all the values of list are different, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

Variants

  • :all_different: Global constraint ensuring that all the values of x are all different.
julia
concept(:all_different, x; vals)
+e([1, 1, 3]) # Returns 1.0

source

Constraints.params_length Method
julia
params_length(c::Constraint)

Return the expected length restriction of the arguments in a constraint c. The value nothing indicates that any strictly positive number of parameters is accepted.

source

Constraints.shrink_concept Method
julia
shrink_concept(s)

Simply delete the concept_ part of symbol or string starting with it. TODO: add a check with a warning if s starts with something different.

source

Constraints.symmetries Method
julia
symmetries(c::Constraint)

Return the list of symmetries of c.

source

Constraints.xcsp_all_different Method
julia
xcsp_all_different(list::Vector{Int})

Return true if all the values of list are different, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

Variants

  • :all_different: Global constraint ensuring that the values in x are all different.
julia
concept(:all_different, x; vals)
 concept(:all_different)(x; vals)

Examples

julia
c = concept(:all_different)
 
 c([1, 2, 3, 4])
 c([1, 2, 3, 1])
 c([1, 0, 0, 4]; vals=[0])
-c([1, 0, 0, 1]; vals=[0])

source


# Constraints.xcsp_all_equalMethod.
julia
xcsp_all_equal(list::Vector{Int}, val::Int)

Return true if all the values of list are equal to val, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • val::Int: value to compare to.

Variants

  • :all_equal: Global constraint ensuring that all the values of x are all equal.
julia
concept(:all_equal, x; val=nothing, pair_vars=zeros(x), op=+)
+c([1, 0, 0, 1]; vals=[0])

source

Constraints.xcsp_all_equal Method
julia
xcsp_all_equal(list::Vector{Int}, val::Int)

Return true if all the values of list are equal to val, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • val::Int: value to compare to.

Variants

  • :all_equal: Global constraint ensuring that the values in x are all equal.
julia
concept(:all_equal, x; val=nothing, pair_vars=zeros(x), op=+)
 concept(:all_equal)(x; val=nothing, pair_vars=zeros(x), op=+)

Examples

julia
c = concept(:all_equal)
 
 c([0, 0, 0, 0])
@@ -54,9 +54,9 @@
 c([3, 2, 1, 0]; pair_vars=[0, 1, 2, 3])
 c([0, 1, 2, 3]; pair_vars=[0, 1, 2, 3])
 c([1, 2, 3, 4]; op=/, val=1, pair_vars=[1, 2, 3, 4])
-c([1, 2, 3, 4]; op=*, val=1, pair_vars=[1, 2, 3, 4])

source


# Constraints.xcsp_cardinalityMethod.
julia
xcsp_cardinality(list, values, occurs, closed)

Return true if the number of occurrences of the values in values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • values::Vector{Int}: list of values to check.

  • occurs::Vector{Int}: list of occurrences to check.

  • closed::Bool: whether the constraint is closed or not.

Variants

  • :cardinality: The cardinality constraint, also known as the global cardinality constraint (GCC), is a constraint in constraint programming that restricts the number of times a value can appear in a set of variables.
julia
concept(:cardinality, x; bool=false, vals)
-concept(:cardinality)(x; bool=false, vals)
  • :cardinality_closed: The closed cardinality constraint, also known as the global cardinality constraint (GCC), is a constraint in constraint programming that restricts the number of times a value can appear in a set of variables. It is closed, meaning that all values in the domain of the variables must be considered.
julia
concept(:cardinality_closed, x; vals)
-concept(:cardinality_closed)(x; vals)
  • :cardinality_open: The open cardinality constraint, also known as the global cardinality constraint (GCC), is a constraint in constraint programming that restricts the number of times a value can appear in a set of variables. It is open, meaning that only the values in the list of values must be considered.
julia
concept(:cardinality_open, x; vals)
+c([1, 2, 3, 4]; op=*, val=1, pair_vars=[1, 2, 3, 4])

source

Constraints.xcsp_cardinality Method
julia
xcsp_cardinality(list, values, occurs, closed)

Return true if the number of occurrences of the values in values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • values::Vector{Int}: list of values to check.

  • occurs::Vector{Int}: list of occurrences to check.

  • closed::Bool: whether the constraint is closed or not.

Variants

  • :cardinality: Global constraint that restricts the number of times specific values in a list values can appear in x.
julia
concept(:cardinality, x; bool=false, vals)
+concept(:cardinality)(x; bool=false, vals)
  • :cardinality_closed: Global constraint that restricts the number of times in a list values can appear in x. It is closed, meaning that the variables in x cannot have values outside the ones in list.
julia
concept(:cardinality_closed, x; vals)
+concept(:cardinality_closed)(x; vals)
  • :cardinality_open: Global constraint that restricts the number of times in a list values can appear in x. It is open, meaning that the variables in x can have values outside the ones in list.
julia
concept(:cardinality_open, x; vals)
 concept(:cardinality_open)(x; vals)

Examples

julia
c = concept(:cardinality)
 
 c([2, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])
@@ -72,7 +72,7 @@
 cc([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])
 
 co = concept(:cardinality_open)
-co([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])

source


# Constraints.xcsp_channelMethod.
julia
xcsp_channel(; list)

Return true if the channel constraint is satisfied, false otherwise. The channel constraint establishes a bijective correspondence between two sets of variables. This means that each value in the first set of variables corresponds to a unique value in the second set, and vice versa.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

Variants

  • :channel: The channel constraint establishes a bijective correspondence between two sets of variables. This means that each value in the first set of variables corresponds to a unique value in the second set, and vice versa.
julia
concept(:channel, x; dim=1, id=nothing)
+co([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])

source

Constraints.xcsp_channel Method
julia
xcsp_channel(; list)

Return true if the channel constraint is satisfied, false otherwise. The channel constraint ensures that if the i-th element of list is assigned the value j, then the j-th element of list must be assigned the value i.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

Variants

  • :channel: Ensures that if the i-th element of x is assigned the value j, then the j-th element of x must be assigned the value i.
julia
concept(:channel, x; dim=1, id=nothing)
 concept(:channel)(x; dim=1, id=nothing)

Examples

julia
c = concept(:channel)
 
 c([2, 1, 4, 3])
@@ -81,13 +81,13 @@
 c([2, 1, 5, 3, 4, 2, 1, 4, 5, 3]; dim=2)
 c([2, 1, 4, 3, 5, 2, 1, 4, 5, 3]; dim=2)
 c([false, false, true, false]; id=3)
-c([false, false, true, false]; id=1)

source


# Constraints.xcsp_circuitMethod.
julia
xcsp_circuit(; list, size)

Return true if the circuit constraint is satisfied, false otherwise. The circuit constraint is a global constraint used in constraint programming, often in routing problems. It ensures that the values of a list of variables form a circuit, i.e., a sequence where each value is the index of the next value in the sequence, and the sequence eventually loops back to the start.

Arguments

  • list::AbstractVector: list of values to check.

  • size::Int: size of the circuit.

Variants

  • :circuit: The circuit constraint is a global constraint used in constraint programming, often in routing problems. It ensures that the values of a list of variables form a circuit, i.e., a sequence where each value is the index of the next value in the sequence, and the sequence eventually loops back to the start.
julia
concept(:circuit, x; op, val)
+c([false, false, true, false]; id=1)

source

Constraints.xcsp_circuit Method
julia
xcsp_circuit(; list, size)

Return true if the circuit constraint is satisfied, false otherwise. The circuit constraint is a global constraint ensuring that the values of x form a circuit, i.e., a sequence where each value is the index of the next value in the sequence, and the sequence eventually loops back to the start.

Arguments

  • list::AbstractVector: list of values to check.

  • size::Int: size of the circuit.

Variants

  • :circuit: Global constraint ensuring that the values of x form a circuit, i.e., a sequence where each value is the index of the next value in the sequence, and the sequence eventually loops back to the start. Often used for routing problems.
julia
concept(:circuit, x; op, val)
 concept(:circuit)(x; op, val)

Examples

julia
c = concept(:circuit)
 
 c([1, 2, 3, 4])
 c([2, 3, 4, 1])
 c([2, 3, 1, 4]; op = ==, val = 3)
-c([4, 3, 1, 3]; op = >, val = 0)

source


# Constraints.xcsp_countMethod.
julia
xcsp_count(list, values, condition)

Return true if the number of occurrences of the values in values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • values::Vector{Int}: list of values to check.

  • condition: condition to satisfy.

Variants

  • :count: Constraint ensuring that the number of occurrences of the values in vals in x satisfies the given condition.
julia
concept(:count, x; vals, op, val)
+c([4, 3, 1, 3]; op = >, val = 0)

source

Constraints.xcsp_count Method
julia
xcsp_count(list, values, condition)

Return true if the number of occurrences of the values in values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • values::Vector{Int}: list of values to check.

  • condition: condition to satisfy.

Variants

  • :count: Constraint ensuring that the number of occurrences of the values in vals in x satisfies the given condition.
julia
concept(:count, x; vals, op, val)
 concept(:count)(x; vals, op, val)
  • :at_least: Constraint ensuring that the number of occurrences of the values in vals in x is at least val.
julia
concept(:at_least, x; vals, val)
 concept(:at_least)(x; vals, val)
  • :at_most: Constraint ensuring that the number of occurrences of the values in vals in x is at most val.
julia
concept(:at_most, x; vals, val)
 concept(:at_most)(x; vals, val)
  • :exactly: Constraint ensuring that the number of occurrences of the values in vals in x is exactly val.
julia
concept(:exactly, x; vals, val)
@@ -95,21 +95,21 @@
 
 c([2, 1, 4, 3]; vals=[1, 2, 3, 4], op=≥, val=2)
 c([1, 2, 3, 4]; vals=[1, 2], op==, val=2)
-c([2, 1, 4, 3]; vals=[1, 2], op=≤, val=1)

source


# Constraints.xcsp_cumulativeMethod.
julia
xcsp_cumulative(; origins, lengths, heights, condition)

Return true if the cumulative constraint is satisfied, false otherwise. The cumulative constraint is a global constraint used in constraint programming that is often used in scheduling problems. It ensures that for any point in time, the sum of the "heights" of tasks that are ongoing at that time does not exceed a certain limit.

Arguments

  • origins::AbstractVector: list of origins of the tasks.

  • lengths::AbstractVector: list of lengths of the tasks.

  • heights::AbstractVector: list of heights of the tasks.

  • condition::Tuple: condition to check.

Variants

  • :cumulative: The cumulative constraint is a global constraint used in constraint programming that is often used in scheduling problems. It ensures that for any point in time, the sum of the "heights" of tasks that are ongoing at that time does not exceed a certain limit.
julia
concept(:cumulative, x; pair_vars, op, val)
+c([2, 1, 4, 3]; vals=[1, 2], op=≤, val=1)

source

Constraints.xcsp_cumulative Method
julia
xcsp_cumulative(; origins, lengths, heights, condition)

Return true if the cumulative constraint is satisfied, false otherwise. The cumulative constraint is a global constraint operating on a set of tasks, defined by origin (starting times), length, and height. This constraint ensures that, at each point in time, the sum of the height of tasks that overlap that point, respects a numerical condition.

Arguments

  • origins::AbstractVector: list of origins of the tasks.

  • lengths::AbstractVector: list of lengths of the tasks.

  • heights::AbstractVector: list of heights of the tasks.

  • condition::Tuple: condition to check.

Variants

  • :cumulative: Global constraint operating on a set of tasks, defined by origin (starting times), length, and height. This constraint ensures that, at each point in time, the sum of the height of tasks that overlap that point, respects a numerical condition.
julia
concept(:cumulative, x; pair_vars, op, val)
 concept(:cumulative)(x; pair_vars, op, val)

Examples

julia
c = concept(:cumulative)
 
 c([1, 2, 3, 4, 5]; val = 1)
 c([1, 2, 2, 4, 5]; val = 1)
 c([1, 2, 3, 4, 5]; pair_vars = [3 2 5 4 2; 1 2 1 1 3], op =, val = 5)
-c([1, 2, 3, 4, 5]; pair_vars = [3 2 5 4 2; 1 2 1 1 3], op = <, val = 5)

source


# Constraints.xcsp_elementMethod.
julia
xcsp_element(; list, index, condition)

Return true if the element constraint is satisfied, false otherwise. The element constraint is a global constraint used in constraint programming that specifies that the value of a variable should be equal to the value of another variable indexed by a third variable.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • index::Int: index of the value to check.

  • condition::Tuple: condition to check.

Variants

  • :element: The element constraint is a global constraint used in constraint programming that specifies that the value of a variable should be equal to the value of another variable indexed by a third variable.
julia
concept(:element, x; id=nothing, op===, val=nothing)
+c([1, 2, 3, 4, 5]; pair_vars = [3 2 5 4 2; 1 2 1 1 3], op = <, val = 5)

source

Constraints.xcsp_element Method
julia
xcsp_element(; list, index, condition)

Return true if the element constraint is satisfied, false otherwise. The element constraint is a global constraint specifying that a variable in x indexed by id should be equal to a value.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • index::Int: index of the value to check.

  • condition::Tuple: condition to check.

Variants

  • :element: Global constraint specifying that a variable in x indexed by id should be equal to a value.
julia
concept(:element, x; id=nothing, op===, val=nothing)
 concept(:element)(x; id=nothing, op===, val=nothing)

Examples

julia
c = concept(:element)
 
 c([1, 2, 3, 4, 5]; id=1, val=1)
 c([1, 2, 3, 4, 5]; id=1, val=2)
 c([1, 2, 3, 4, 2])
-c([1, 2, 3, 4, 1])

source


# Constraints.xcsp_extensionMethod.
julia
xcsp_extension(; list, supports=nothing, conflicts=nothing)

Global constraint enforcing that the tuple x matches a configuration within the supports set pair_vars[1] or does not match any configuration within the conflicts set pair_vars[2]. It embodies the logic: x ∈ pair_vars[1] || x ∉ pair_vars[2], providing a comprehensive way to define valid (supported) and invalid (conflicted) tuples for constraint satisfaction problems. This constraint is versatile, allowing for the explicit delineation of both acceptable and unacceptable configurations.

Arguments

  • list::Vector{Int}: A list of variables

  • supports::Vector{Vector{Int}}: A set of supported tuples. Default to nothing.

  • conflicts::Vector{Vector{Int}}: A set of conflicted tuples. Default to nothing.

Variants

  • :extension: Global constraint enforcing that the tuple x matches a configuration within the supports set pair_vars[1] or does not match any configuration within the conflicts set pair_vars[2]. It embodies the logic: x ∈ pair_vars[1] || x ∉ pair_vars[2], providing a comprehensive way to define valid (supported) and invalid (conflicted) tuples for constraint satisfaction problems. This constraint is versatile, allowing for the explicit delineation of both acceptable and unacceptable configurations.
julia
concept(:extension, x; pair_vars)
-concept(:extension)(x; pair_vars)
  • :supports: Global constraint ensuring that the tuple x matches a configuration listed within the support set pair_vars. This constraint is derived from the extension model, specifying that x must be one of the explicitly defined supported configurations: x ∈ pair_vars. It is utilized to directly declare the tuples that are valid and should be included in the solution space.
julia
concept(:supports, x; pair_vars)
-concept(:supports)(x; pair_vars)
  • :conflicts: Global constraint ensuring that the tuple x does not match any configuration listed within the conflict set pair_vars. This constraint, originating from the extension model, stipulates that x must avoid all configurations defined as conflicts: x ∉ pair_vars. It is useful for specifying tuples that are explicitly forbidden and should be excluded from the solution space.
julia
concept(:conflicts, x; pair_vars)
+c([1, 2, 3, 4, 1])

source

Constraints.xcsp_extension Method
julia
xcsp_extension(; list, supports=nothing, conflicts=nothing)

Global constraint enforcing that x matches a configuration within the supports set pair_vars[1] or does not match any configuration within the conflicts set pair_vars[2]. It embodies the logic: x ∈ pair_vars[1] || x ∉ pair_vars[2], providing a comprehensive way to define valid (supported) and invalid (conflicted) configurations for constraint satisfaction problems.

Arguments

  • list::Vector{Int}: A list of variables

  • supports::Vector{Vector{Int}}: A set of supported tuples. Default to nothing.

  • conflicts::Vector{Vector{Int}}: A set of conflicted tuples. Default to nothing.

Variants

  • :extension: Global constraint enforcing that x matches a configuration within the supports set pair_vars[1] or does not match any configuration within the conflicts set pair_vars[2]. It embodies the logic: x ∈ pair_vars[1] || x ∉ pair_vars[2], providing a comprehensive way to define valid (supported) and invalid (conflicted) configurations for constraint satisfaction problems.
julia
concept(:extension, x; pair_vars)
+concept(:extension)(x; pair_vars)
  • :supports: Global constraint ensuring that x matches a configuration listed within the support set pair_vars. This constraint is derived from the extension model, specifying that x must be one of the explicitly defined supported configurations: x ∈ pair_vars. It is utilized to directly declare the configurations that are valid and should be included in the solution space.
julia
concept(:supports, x; pair_vars)
+concept(:supports)(x; pair_vars)
  • :conflicts: Global constraint ensuring that x does not match any configuration listed within the conflict set pair_vars. This constraint, originating from the extension model, stipulates that x must avoid all configurations defined as conflicts: x ∉ pair_vars. It is useful for specifying configurations that are explicitly forbidden and should be excluded from the solution space.
julia
concept(:conflicts, x; pair_vars)
 concept(:conflicts)(x; pair_vars)

Examples

julia
c = concept(:extension)
 c([1, 2, 3, 4, 5]; pair_vars=[[1, 2, 3, 4, 5]])
 c([1, 2, 3, 4, 5]; pair_vars=([[1, 2, 3, 4, 5]], [[1, 2, 1, 4, 5], [1, 2, 3, 5, 5]]))
@@ -119,20 +119,20 @@
 c([1, 2, 3, 4, 5]; pair_vars=[[1, 2, 3, 4, 5]])
 
 c = concept(:conflicts)
-c([1, 2, 3, 4, 5]; pair_vars=[[1, 2, 1, 4, 5], [1, 2, 3, 5, 5]])

source


# Constraints.xcsp_instantiationMethod.
julia
xcsp_instantiation(; list, values)

Return true if the instantiation constraint is satisfied, false otherwise. The instantiation constraint is a global constraint used in constraint programming that ensures that a list of variables takes on a specific set of values in a specific order.

Arguments

  • list::AbstractVector: list of values to check.

  • values::AbstractVector: list of values to check against.

Variants

  • :instantiation: The instantiation constraint is a global constraint used in constraint programming that ensures that a list of variables takes on a specific set of values in a specific order.
julia
concept(:instantiation, x; pair_vars)
+c([1, 2, 3, 4, 5]; pair_vars=[[1, 2, 1, 4, 5], [1, 2, 3, 5, 5]])

source

Constraints.xcsp_instantiation Method
julia
xcsp_instantiation(; list, values)

Return true if the instantiation constraint is satisfied, false otherwise. The instantiation constraint is a global constraint ensuring that x takes on a specific set of values in a specific order.

Arguments

  • list::AbstractVector: list of values to check.

  • values::AbstractVector: list of values to check against.

Variants

  • :instantiation: Global constraint ensuring that x takes on a specific set of values in a specific order.
julia
concept(:instantiation, x; pair_vars)
 concept(:instantiation)(x; pair_vars)

Examples

julia
c = concept(:instantiation)
 
 c([1, 2, 3, 4, 5]; pair_vars=[1, 2, 3, 4, 5])
-c([1, 2, 3, 4, 5]; pair_vars=[1, 2, 3, 4, 6])

source


# Constraints.xcsp_intensionMethod.
julia
xcsp_intension(list, predicate)

An intensional constraint is usually defined from a predicate over list. As such it encompass any generic constraint.

Arguments

  • list::Vector{Int}: A list of variables

  • predicate::Function: A predicate over list

Variants

  • :dist_different: A constraint ensuring that the distances between marks on the ruler are unique. Specifically, it checks that the distance between x[1] and x[2], and the distance between x[3] and x[4], are different. This constraint is fundamental in ensuring the validity of a Golomb ruler, where no two pairs of marks should have the same distance between them.
julia
concept(:dist_different, x)
+c([1, 2, 3, 4, 5]; pair_vars=[1, 2, 3, 4, 6])

source

Constraints.xcsp_intension Method
julia
xcsp_intension(list, predicate)

An intensional constraint is usually defined from a predicate over list. As such it encompass any generic constraint.

Arguments

  • list::Vector{Int}: A list of variables

  • predicate::Function: A predicate over list

Variants

  • :dist_different: Given a 4-dimensional vector x, ensures that the absolute difference between x[1] and x[2], and between x[3] and x[4], are different. This constraint is fundamental in ensuring the validity of a Golomb ruler, where no two pairs of marks should have the same distance between them.
julia
concept(:dist_different, x)
 concept(:dist_different)(x)

Examples

@example
2 + 2
@example
2 + 2
@example
using Constraints # hide
 c = concept(:dist_different)
 c([1, 2, 3, 3]) && !c([1, 2, 3, 4])
@example
using Constraints # hide
 c = concept(:dist_different)
-c([1, 2, 3, 3]) && !c([1, 2, 3, 4])

source


# Constraints.xcsp_maximumMethod.
julia
xcsp_maximum(; list, condition)

Return true if the maximum constraint is satisfied, false otherwise. The maximum constraint is a global constraint used in constraint programming that specifies that a certain condition should hold for the maximum value in a list of variables.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • condition::Tuple: condition to check.

Variants

  • :maximum: The maximum constraint is a global constraint used in constraint programming that specifies that a certain condition should hold for the maximum value in a list of variables.
julia
concept(:maximum, x; op, val)
+c([1, 2, 3, 3]) && !c([1, 2, 3, 4])

source

Constraints.xcsp_maximum Method
julia
xcsp_maximum(; list, condition)

Return true if the maximum constraint is satisfied, false otherwise. The maximum constraint is a global constraint specifying that a certain condition should hold for the maximum value in a list of variables.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • condition::Tuple: condition to check.

Variants

  • :maximum: Global constraint ensuring that a certain numerical condition holds for the maximum value in x.
julia
concept(:maximum, x; op, val)
 concept(:maximum)(x; op, val)

Examples

julia
c = concept(:maximum)
 
 c([1, 2, 3, 4, 5]; op = ==, val = 5)
-c([1, 2, 3, 4, 5]; op = ==, val = 6)

source


# Constraints.xcsp_mddMethod.
julia
xcsp_mdd(; list, diagram)

Return a function that checks if the list of values list satisfies the MDD diagram.

Arguments

  • list::Vector{Int}: list of values to check.

  • diagram::MDD: MDD to check.

Variants

  • :mdd: Multi-valued Decision Diagram (MDD) constraint. The MDD constraint is a constraint that can be used to model a wide range of problems. It is a directed graph where each node is labeled with a value and each edge is labeled with a value. The constraint is satisfied if there is a path from the first node to the last node such that the sequence of edge labels is a valid sequence of the value labels.
julia
concept(:mdd, x; language)
+c([1, 2, 3, 4, 5]; op = ==, val = 6)

source

Constraints.xcsp_mdd Method
julia
xcsp_mdd(; list, diagram)

Return a function that checks if the list of values list satisfies the MDD diagram.

Arguments

  • list::Vector{Int}: list of values to check.

  • diagram::MDD: MDD to check.

Variants

  • :mdd: Multi-valued Decision Diagram (MDD) constraint.

The MDD constraint is a constraint that can be used to model a wide range of problems. It is a directed graph where each node is labeled with a value and each edge is labeled with a value. The constraint is satisfied if there is a path from the first node to the last node such that the sequence of edge labels is a valid sequence of the value labels.

julia
concept(:mdd, x; language)
 concept(:mdd)(x; language)

Examples

julia
c = concept(:mdd)
 
 states = [
@@ -159,13 +159,13 @@
 c([2,0,0]; language = a)
 c([2,1,2]; language = a)
 c([1,0,2]; language = a)
-c([0,1,2]; language = a)

source


# Constraints.xcsp_minimumMethod.
julia
xcsp_minimum(; list, condition)

Return true if the minimum constraint is satisfied, false otherwise. The minimum constraint is a global constraint used in constraint programming that specifies that a certain condition should hold for the minimum value in a list of variables.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • condition::Tuple: condition to check.

Variants

  • :minimum: The minimum constraint is a global constraint used in constraint programming that specifies that a certain condition should hold for the minimum value in a list of variables.
julia
concept(:minimum, x; op, val)
+c([0,1,2]; language = a)

source

Constraints.xcsp_minimum Method
julia
xcsp_minimum(; list, condition)

Return true if the minimum constraint is satisfied, false otherwise. The minimum constraint is a global constraint specifying that a certain condition should hold for the minimum value in a list of variables.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • condition::Tuple: condition to check.

Variants

  • :minimum: Global constraint ensuring that a certain numerical condition holds for the minimum value in x.
julia
concept(:minimum, x; op, val)
 concept(:minimum)(x; op, val)

Examples

julia
c = concept(:minimum)
 
 c([1, 2, 3, 4, 5]; op = ==, val = 1)
-c([1, 2, 3, 4, 5]; op = ==, val = 0)

source


# Constraints.xcsp_no_overlapMethod.
julia
xcsp_no_overlap(; origins, lengths, zero_ignored)

Return true if the no_overlap constraint is satisfied, false otherwise. The no_overlap constraint is a global constraint used in constraint programming, often in scheduling problems. It ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts.

Arguments

  • origins::AbstractVector: list of origins of the tasks.

  • lengths::AbstractVector: list of lengths of the tasks.

  • zero_ignored::Bool: whether to ignore zero-length tasks.

Variants

  • :no_overlap: The no_overlap constraint is a global constraint used in constraint programming, often in scheduling problems. It ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts.
julia
concept(:no_overlap, x; pair_vars, bool)
-concept(:no_overlap)(x; pair_vars, bool)
  • :no_overlap_no_zero: The no_overlap constraint is a global constraint used in constraint programming, often in scheduling problems. It ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts. This variant ignores zero-length tasks.
julia
concept(:no_overlap_no_zero, x; pair_vars)
-concept(:no_overlap_no_zero)(x; pair_vars)
  • :no_overlap_with_zero: The no_overlap constraint is a global constraint used in constraint programming, often in scheduling problems. It ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts. This variant includes zero-length tasks.
julia
concept(:no_overlap_with_zero, x; pair_vars)
+c([1, 2, 3, 4, 5]; op = ==, val = 0)

source

Constraints.xcsp_no_overlap Method
julia
xcsp_no_overlap(; origins, lengths, zero_ignored)

Return true if the no_overlap constraint is satisfied, false otherwise. The no_overlap constraint is a global constraint used in constraint programming, often in scheduling problems. It ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts.

Arguments

  • origins::AbstractVector: list of origins of the tasks.

  • lengths::AbstractVector: list of lengths of the tasks.

  • zero_ignored::Bool: whether to ignore zero-length tasks.

Variants

  • :no_overlap: Global constraint operating on a set of tasks, defined by origin (starting times), and length. This constraint ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts. Often used in scheduling problems.
julia
concept(:no_overlap, x; pair_vars, bool)
+concept(:no_overlap)(x; pair_vars, bool)
  • :no_overlap_no_zero: Global constraint operating on a set of tasks, defined by origin (starting times), and length. This constraint ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts. This variant ignores zero-length tasks. Often used in scheduling problems.
julia
concept(:no_overlap_no_zero, x; pair_vars)
+concept(:no_overlap_no_zero)(x; pair_vars)
  • :no_overlap_with_zero: Global constraint operating on a set of tasks, defined by origin (starting times), and length. This constraint ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts. This variant includes zero-length tasks. Often used in scheduling problems.
julia
concept(:no_overlap_with_zero, x; pair_vars)
 concept(:no_overlap_with_zero)(x; pair_vars)

Examples

julia
c = concept(:no_overlap)
 
 c([1, 2, 3, 4, 5])
@@ -174,13 +174,13 @@
 c([1, 2, 4, 6, 3]; pair_vars = [1, 1, 1, 3, 1])
 c([1, 2, 4, 6, 3]; pair_vars = [1, 1, 3, 1, 1])
 c([1, 1, 1, 3, 5, 2, 7, 7, 5, 12, 8, 7]; pair_vars = [2, 4, 1, 4 ,2 ,3, 5, 1, 2, 3, 3, 2], dim = 3)
-c([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]; pair_vars = [2, 4, 1, 4 ,2 ,3, 5, 1, 2, 3, 3, 2], dim = 3)

source


# Constraints.xcsp_nvaluesMethod.
julia
xcsp_nvalues(list, condition, except)

Return true if the number of distinct values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • condition: condition to satisfy.

  • except::Union{Nothing, Vector{Int}}: list of values to exclude. Default is nothing.

Variants

  • :nvalues: The nValues constraint specifies that the number of distinct values in the list of variables x is equal to a given value. The constraint is defined by the following expression: nValues(x, op, val) where x is a list of variables, op is a comparison operator, and val is an integer value.
julia
concept(:nvalues, x; op, val)
+c([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]; pair_vars = [2, 4, 1, 4 ,2 ,3, 5, 1, 2, 3, 3, 2], dim = 3)

source

Constraints.xcsp_nvalues Method
julia
xcsp_nvalues(list, condition, except)

Return true if the number of distinct values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • condition: condition to satisfy.

  • except::Union{Nothing, Vector{Int}}: list of values to exclude. Default is nothing.

Variants

  • :nvalues: Ensures that the number of distinct values in x satisfies a given numerical condition.

The constraint is defined by the following expression: nValues(x, op, val) where x is a list of variables, op is a comparison operator, and val is an integer value.

julia
concept(:nvalues, x; op, val)
 concept(:nvalues)(x; op, val)

Examples

julia
c = concept(:nvalues)
 
 c([1, 2, 3, 4, 5]; op = ==, val = 5)
 c([1, 2, 3, 4, 5]; op = ==, val = 2)
 c([1, 2, 3, 4, 3]; op = <=, val = 5)
-c([1, 2, 3, 4, 3]; op = <=, val = 3)

source


# Constraints.xcsp_orderedMethod.
julia
xcsp_ordered(list::Vector{Int}, operator, lengths)

Return true if all the values of list are in an increasing order, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • operator: comparison operator to use.

  • lengths: list of lengths to use. Defaults to nothing.

Variants

  • :ordered: Global constraint ensuring that all the values of x are in an increasing order.
julia
concept(:ordered, x; op=≤, pair_vars=nothing)
+c([1, 2, 3, 4, 3]; op = <=, val = 3)

source

Constraints.xcsp_ordered Method
julia
xcsp_ordered(list::Vector{Int}, operator, lengths)

Return true if all the values of list are in an increasing order, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • operator: comparison operator to use.

  • lengths: list of lengths to use. Defaults to nothing.

Variants

  • :ordered: Global constraint ensuring that all the values of x are in a total order defined by a comparison operator.
julia
concept(:ordered, x; op=≤, pair_vars=nothing)
 concept(:ordered)(x; op=≤, pair_vars=nothing)
  • :increasing: Global constraint ensuring that all the values of x are in an increasing order.
julia
concept(:increasing, x; op=≤, pair_vars=nothing)
 concept(:increasing)(x; op=≤, pair_vars=nothing)
  • :decreasing: Global constraint ensuring that all the values of x are in a decreasing order.
julia
concept(:decreasing, x; op=≥, pair_vars=nothing)
 concept(:decreasing)(x; op=≥, pair_vars=nothing)
  • :strictly_increasing: Global constraint ensuring that all the values of x are in a strictly increasing order.
julia
concept(:strictly_increasing, x; op=<, pair_vars=nothing)
@@ -190,9 +190,7 @@
 c([1, 2, 3, 4, 4]; op=≤)
 c([1, 2, 3, 4, 5]; op=<)
 !c([1, 2, 3, 4, 3]; op=≤)
-!c([1, 2, 3, 4, 3]; op=<)

source


# Constraints.xcsp_regularMethod.
julia
xcsp_regular(; list, automaton)
-
-Ensures that a sequence `x` (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of `x` with the language rules encoded within the `automaton` parameter, which must be an instance of `<:AbstractAutomaton`.

Arguments

  • list::Vector{Int}: A list of variables

  • automaton<:AbstractAutomaton: An automaton representing the regular language

Variants

  • :regular: Ensures that a sequence x (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of x with the language rules encoded within the automaton parameter, which must be an instance of <:AbstractAutomaton.
julia
concept(:regular, x; language)
+!c([1, 2, 3, 4, 3]; op=<)

source

Constraints.xcsp_regular Method
julia
xcsp_regular(; list, automaton)

Ensures that a sequence x (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of x with the language rules encoded within the automaton parameter, which must be an instance of <:AbstractAutomaton.

Arguments

  • list::Vector{Int}: A list of variables

  • automaton<:AbstractAutomaton: An automaton representing the regular language

Variants

  • :regular: Ensures that a sequence x (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of x with the language rules encoded within the automaton parameter, which must be an instance of <:AbstractAutomaton.
julia
concept(:regular, x; language)
 concept(:regular)(x; language)

Examples

julia
c = concept(:regular)
 
 states = Dict(
@@ -210,20 +208,20 @@
 a = Automaton(states, start, finish)
 
 c([0,0,1,1,0,0,1,0,0]; language = a)
-c([1,1,1,0,1]; language = a)

source


# Constraints.xcsp_sumMethod.
julia
xcsp_sum(list, coeffs, condition)

Return true if the sum of the variables in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • coeffs::Vector{Int}: list of coefficients to use.

  • condition: condition to satisfy.

Variants

  • :sum: Global constraint ensuring that the sum of the variables in x satisfies a given condition.
julia
concept(:sum, x; op===, pair_vars=ones(x), val)
+c([1,1,1,0,1]; language = a)

source

Constraints.xcsp_sum Method
julia
xcsp_sum(list, coeffs, condition)

Return true if the sum of the variables in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • coeffs::Vector{Int}: list of coefficients to use.

  • condition: condition to satisfy.

Variants

  • :sum: Global constraint ensuring that the sum of the variables in x satisfies a given numerical condition.
julia
concept(:sum, x; op===, pair_vars=ones(x), val)
 concept(:sum)(x; op===, pair_vars=ones(x), val)

Examples

julia
c = concept(:sum)
 
 c([1, 2, 3, 4, 5]; op===, val=15)
 c([1, 2, 3, 4, 5]; op===, val=2)
 c([1, 2, 3, 4, 3]; op=≤, val=15)
-c([1, 2, 3, 4, 3]; op=≤, val=3)

source


# Constraints.@usualMacro.
julia
usual(ex::Expr)

This macro is used to define a new constraint or update an existing one in the USUAL_CONSTRAINTS dictionary. It takes an expression ex as input, which represents the definition of a constraint.

Here's a step-by-step explanation of what the macro does:

  1. It first extracts the symbol of the concept from the input expression. This symbol is expected to be the first argument of the first argument of the expression. For example, if the expression is @usual all_different(x; y=1), the symbol would be :all_different.

  2. It then calls the shrink_concept function on the symbol to get a simplified version of the concept symbol.

  3. It initializes a dictionary defaults to store whether each keyword argument of the concept has a default value or not.

  4. It checks if the expression has more than two arguments. If it does, it means that there are keyword arguments present. It then loops over these keyword arguments. If a keyword argument is a symbol, it means it doesn't have a default value, so it adds an entry to the defaults dictionary with the keyword argument as the key and false as the value. If a keyword argument is not a symbol, it means it has a default value, so it adds an entry to the defaults dictionary with the keyword argument as the key and true as the value.

  5. It calls the make_error function on the simplified concept symbol to generate an error function for the constraint.

  6. It evaluates the input expression to get the concept function.

  7. It checks if the USUAL_CONSTRAINTS dictionary already contains an entry for the simplified concept symbol. If it does, it adds the defaults dictionary to the parameters of the existing constraint. If it doesn't, it creates a new constraint with the concept function, a description, the error function, and the defaults dictionary as the parameters, and adds it to the USUAL_CONSTRAINTS dictionary.

This macro is used to make it easier to define and update constraints in a consistent and possibly automated way.

Arguments

  • ex::Expr: expression to parse.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source


# CompositionalNetworks.CompositionType.
julia
struct Composition{F<:Function}

Store the all the information of a composition learned by an ICN.

source


# CompositionalNetworks.CompositionMethod.
julia
Composition(f::F, symbols) where {F<:Function}

Construct a Composition.

source


# CompositionalNetworks.ICNType.
julia
ICN(; nvars, dom_size, param, transformation, arithmetic, aggregation, comparison)

Construct an Interpretable Compositional Network, with the following arguments:

  • nvars: number of variable in the constraint

  • dom_size: maximum domain size of any variable in the constraint

  • param: optional parameter (default to nothing)

  • transformation: a transformation layer (optional)

  • arithmetic: a arithmetic layer (optional)

  • aggregation: a aggregation layer (optional)

  • comparison: a comparison layer (optional)

source


# CompositionalNetworks.LayerType.
julia
Layer

A structure to store a LittleDict of operations that can be selected during the learning phase of an ICN. If the layer is exclusive, only one operation can be selected at a time.

source


# Base.lengthMethod.
julia
length(layer)

Return the number of operations in a layer.

source


# Base.lengthMethod.
julia
Base.length(icn)

Return the total number of operations of an ICN.

source


# CompositionalNetworks._composeMethod.
julia
_compose(icn)

Internal function called by compose and show_composition.

source


# CompositionalNetworks.ag_count_positiveMethod.
julia
ag_count_positive(x)

Count the number of strictly positive elements of x.

source


# CompositionalNetworks.ag_sumMethod.
julia
ag_sum(x)

Aggregate through + a vector into a single scalar.

source


# CompositionalNetworks.aggregation_layerMethod.
julia
aggregation_layer()

Generate the layer of aggregations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source


# CompositionalNetworks.ar_prodMethod.
julia
ar_prod(x)

Reduce k = length(x) vectors through product to a single vector.

source


# CompositionalNetworks.ar_sumMethod.
julia
ar_sum(x)

Reduce k = length(x) vectors through sum to a single vector.

source


# CompositionalNetworks.arithmetic_layerMethod.
julia
arithmetic_layer()

Generate the layer of arithmetic operations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source


# CompositionalNetworks.as_bitvectorFunction.
julia
as_bitvector(n::Int, max_n::Int = n)

Convert an Int to a BitVector of minimal size (relatively to max_n).

source


# CompositionalNetworks.as_intMethod.
julia
as_int(v::AbstractVector)

Convert a BitVector into an Int.

source


# CompositionalNetworks.co_abs_diff_var_valMethod.
julia
co_abs_diff_var_val(x; val)

Return the absolute difference between x and val.

source


# CompositionalNetworks.co_abs_diff_var_varsMethod.
julia
co_abs_diff_var_vars(x; nvars)

Return the absolute difference between x and the number of variables nvars.

source


# CompositionalNetworks.co_euclideanMethod.
julia
co_euclidean(x; dom_size)

Compute an euclidean norm with domain size dom_size of a scalar.

source


# CompositionalNetworks.co_euclidean_valMethod.
julia
co_euclidean_val(x; val, dom_size)

Compute an euclidean norm with domain size dom_size, weighted by val, of a scalar.

source


# CompositionalNetworks.co_identityMethod.
julia
co_identity(x)

Identity function. Already defined in Julia as identity, specialized for scalars in the comparison layer.

source


# CompositionalNetworks.co_val_minus_varMethod.
julia
co_val_minus_var(x; val)

Return the difference val - x if positive, 0.0 otherwise.

source


# CompositionalNetworks.co_var_minus_valMethod.
julia
co_var_minus_val(x; val)

Return the difference x - val if positive, 0.0 otherwise.

source


# CompositionalNetworks.co_var_minus_varsMethod.
julia
co_var_minus_vars(x; nvars)

Return the difference x - nvars if positive, 0.0 otherwise, where nvars denotes the numbers of variables.

source


# CompositionalNetworks.co_vars_minus_varMethod.
julia
co_vars_minus_var(x; nvars)

Return the difference nvars - x if positive, 0.0 otherwise, where nvars denotes the numbers of variables.

source


# CompositionalNetworks.codeFunction.
julia
code(c::Composition, lang=:maths; name="composition")

Access the code of a composition c in a given language lang. The name of the generated method is optional.

source


# CompositionalNetworks.comparison_layerFunction.
julia
comparison_layer(param = false)

Generate the layer of transformations functions of the ICN. Iff param value is set, also includes all the parametric comparison with that value. The operations are mutually exclusive, that is only one will be selected.

source


# CompositionalNetworks.composeFunction.
julia
compose(icn, weights=nothing)

Return a function composed by some of the operations of a given ICN. Can be applied to any vector of variables. If weights are given, will assign to icn.

source


# CompositionalNetworks.compose_to_file!Method.
julia
compose_to_file!(concept, name, path; domains, param = nothing, language = :Julia, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200)

Explore, learn and compose a function and write it to a file.

Arguments:

  • concept: the concept to learn

  • name: the name to give to the constraint

  • path: path of the output file

Keywords arguments:

  • domains: domains that defines the search space

  • param: an optional parameter of the constraint

  • language: the language to export to, default to :julia

  • search: either :partial or :complete search

  • global_iter: number of learning iteration

  • local_iter: number of generation in the genetic algorithm

  • metric: the metric to measure the distance between a configuration and known solutions

  • popSize: size of the population in the genetic algorithm

source


# CompositionalNetworks.compositionMethod.
julia
composition(c::Composition)

Access the actual method of an ICN composition c.

source


# CompositionalNetworks.composition_to_file!Function.
julia
composition_to_file!(c::Composition, path, name, language=:Julia)

Write the composition code in a given language into a file at path.

source


# CompositionalNetworks.excluMethod.
julia
exclu(layer)

Return true if the layer has mutually exclusive operations.

source


# CompositionalNetworks.explore_learn_composeMethod.
julia
explore_learn_compose(concept; domains, param = nothing, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200, action = :composition)

Explore a search space, learn a composition from an ICN, and compose an error function.

Arguments:

  • concept: the concept of the targeted constraint

  • domains: domains of the variables that define the training space

  • param: an optional parameter of the constraint

  • search: either flexible,:partial or :complete search. Flexible search will use search_limit and solutions_limit to determine if the search space needs to be partially or completely explored

  • global_iter: number of learning iteration

  • local_iter: number of generation in the genetic algorithm

  • metric: the metric to measure the distance between a configuration and known solutions

  • popSize: size of the population in the genetic algorithm

  • action: either :symbols to have a description of the composition or :composition to have the composed function itself

source


# CompositionalNetworks.functionsMethod.
julia
functions(layer)

Access the operations of a layer. The container is ordered.

source


# CompositionalNetworks.generateMethod.
julia
generate(c::Composition, name, lang)

Generates the code of c in a specific language lang.

source


# CompositionalNetworks.generate_exclusive_operationMethod.
julia
generate_exclusive_operation(max_op_number)

Generates the operations (weights) of a layer with exclusive operations.

source


# CompositionalNetworks.generate_inclusive_operationsMethod.
julia
generate_inclusive_operations(predicate, bits)
-generate_exclusive_operation(max_op_number)

Generates the operations (weights) of a layer with inclusive/exclusive operations.

source


# CompositionalNetworks.generate_weightsMethod.
julia
generate_weights(layers)
-generate_weights(icn)

Generate the weights of a collection of layers or of an ICN.

source


# CompositionalNetworks.hammingMethod.
julia
hamming(x, X)

Compute the hamming distance of x over a collection of solutions X, i.e. the minimal number of variables to switch in xto reach a solution.

source


# CompositionalNetworks.is_viableMethod.
julia
is_viable(layer, w)
+c([1, 2, 3, 4, 3]; op=≤, val=3)

source

Constraints.@usual Macro
julia
usual(ex::Expr)

This macro is used to define a new constraint or update an existing one in the USUAL_CONSTRAINTS dictionary. It takes an expression ex as input, which represents the definition of a constraint.

Here's a step-by-step explanation of what the macro does:

  1. It first extracts the symbol of the concept from the input expression. This symbol is expected to be the first argument of the first argument of the expression. For example, if the expression is @usual all_different(x; y=1), the symbol would be :all_different.

  2. It then calls the shrink_concept function on the symbol to get a simplified version of the concept symbol.

  3. It initializes a dictionary defaults to store whether each keyword argument of the concept has a default value or not.

  4. It checks if the expression has more than two arguments. If it does, it means that there are keyword arguments present. It then loops over these keyword arguments. If a keyword argument is a symbol, it means it doesn't have a default value, so it adds an entry to the defaults dictionary with the keyword argument as the key and false as the value. If a keyword argument is not a symbol, it means it has a default value, so it adds an entry to the defaults dictionary with the keyword argument as the key and true as the value.

  5. It calls the make_error function on the simplified concept symbol to generate an error function for the constraint.

  6. It evaluates the input expression to get the concept function.

  7. It checks if the USUAL_CONSTRAINTS dictionary already contains an entry for the simplified concept symbol. If it does, it adds the defaults dictionary to the parameters of the existing constraint. If it doesn't, it creates a new constraint with the concept function, a description, the error function, and the defaults dictionary as the parameters, and adds it to the USUAL_CONSTRAINTS dictionary.

This macro is used to make it easier to define and update constraints in a consistent and possibly automated way.

Arguments

  • ex::Expr: expression to parse.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source

CompositionalNetworks.Composition Type
julia
struct Composition{F<:Function}

Store the all the information of a composition learned by an ICN.

source

CompositionalNetworks.Composition Method
julia
Composition(f::F, symbols) where {F<:Function}

Construct a Composition.

source

CompositionalNetworks.ICN Type
julia
ICN(; nvars, dom_size, param, transformation, arithmetic, aggregation, comparison)

Construct an Interpretable Compositional Network, with the following arguments:

  • nvars: number of variable in the constraint

  • dom_size: maximum domain size of any variable in the constraint

  • param: optional parameter (default to nothing)

  • transformation: a transformation layer (optional)

  • arithmetic: a arithmetic layer (optional)

  • aggregation: a aggregation layer (optional)

  • comparison: a comparison layer (optional)

source

CompositionalNetworks.Layer Type
julia
Layer

A structure to store a LittleDict of operations that can be selected during the learning phase of an ICN. If the layer is exclusive, only one operation can be selected at a time.

source

Base.length Method
julia
length(layer)

Return the number of operations in a layer.

source

Base.length Method
julia
Base.length(icn)

Return the total number of operations of an ICN.

source

CompositionalNetworks._compose Method
julia
_compose(icn)

Internal function called by compose and show_composition.

source

CompositionalNetworks.ag_count_positive Method
julia
ag_count_positive(x)

Count the number of strictly positive elements of x.

source

CompositionalNetworks.ag_sum Method
julia
ag_sum(x)

Aggregate through + a vector into a single scalar.

source

CompositionalNetworks.aggregation_layer Method
julia
aggregation_layer()

Generate the layer of aggregations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source

CompositionalNetworks.ar_prod Method
julia
ar_prod(x)

Reduce k = length(x) vectors through product to a single vector.

source

CompositionalNetworks.ar_sum Method
julia
ar_sum(x)

Reduce k = length(x) vectors through sum to a single vector.

source

CompositionalNetworks.arithmetic_layer Method
julia
arithmetic_layer()

Generate the layer of arithmetic operations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source

CompositionalNetworks.as_bitvector Function
julia
as_bitvector(n::Int, max_n::Int = n)

Convert an Int to a BitVector of minimal size (relatively to max_n).

source

CompositionalNetworks.as_int Method
julia
as_int(v::AbstractVector)

Convert a BitVector into an Int.

source

CompositionalNetworks.co_abs_diff_var_val Method
julia
co_abs_diff_var_val(x; val)

Return the absolute difference between x and val.

source

CompositionalNetworks.co_abs_diff_var_vars Method
julia
co_abs_diff_var_vars(x; nvars)

Return the absolute difference between x and the number of variables nvars.

source

CompositionalNetworks.co_euclidean Method
julia
co_euclidean(x; dom_size)

Compute an euclidean norm with domain size dom_size of a scalar.

source

CompositionalNetworks.co_euclidean_val Method
julia
co_euclidean_val(x; val, dom_size)

Compute an euclidean norm with domain size dom_size, weighted by val, of a scalar.

source

CompositionalNetworks.co_identity Method
julia
co_identity(x)

Identity function. Already defined in Julia as identity, specialized for scalars in the comparison layer.

source

CompositionalNetworks.co_val_minus_var Method
julia
co_val_minus_var(x; val)

Return the difference val - x if positive, 0.0 otherwise.

source

CompositionalNetworks.co_var_minus_val Method
julia
co_var_minus_val(x; val)

Return the difference x - val if positive, 0.0 otherwise.

source

CompositionalNetworks.co_var_minus_vars Method
julia
co_var_minus_vars(x; nvars)

Return the difference x - nvars if positive, 0.0 otherwise, where nvars denotes the numbers of variables.

source

CompositionalNetworks.co_vars_minus_var Method
julia
co_vars_minus_var(x; nvars)

Return the difference nvars - x if positive, 0.0 otherwise, where nvars denotes the numbers of variables.

source

CompositionalNetworks.code Function
julia
code(c::Composition, lang=:maths; name="composition")

Access the code of a composition c in a given language lang. The name of the generated method is optional.

source

CompositionalNetworks.comparison_layer Function
julia
comparison_layer(param = false)

Generate the layer of transformations functions of the ICN. Iff param value is set, also includes all the parametric comparison with that value. The operations are mutually exclusive, that is only one will be selected.

source

CompositionalNetworks.compose Function
julia
compose(icn, weights=nothing)

Return a function composed by some of the operations of a given ICN. Can be applied to any vector of variables. If weights are given, will assign to icn.

source

CompositionalNetworks.compose_to_file! Method
julia
compose_to_file!(concept, name, path; domains, param = nothing, language = :Julia, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200)

Explore, learn and compose a function and write it to a file.

Arguments:

  • concept: the concept to learn

  • name: the name to give to the constraint

  • path: path of the output file

Keywords arguments:

  • domains: domains that defines the search space

  • param: an optional parameter of the constraint

  • language: the language to export to, default to :julia

  • search: either :partial or :complete search

  • global_iter: number of learning iteration

  • local_iter: number of generation in the genetic algorithm

  • metric: the metric to measure the distance between a configuration and known solutions

  • popSize: size of the population in the genetic algorithm

source

CompositionalNetworks.composition Method
julia
composition(c::Composition)

Access the actual method of an ICN composition c.

source

CompositionalNetworks.composition_to_file! Function
julia
composition_to_file!(c::Composition, path, name, language=:Julia)

Write the composition code in a given language into a file at path.

source

CompositionalNetworks.exclu Method
julia
exclu(layer)

Return true if the layer has mutually exclusive operations.

source

CompositionalNetworks.explore_learn_compose Method
julia
explore_learn_compose(concept; domains, param = nothing, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200, action = :composition)

Explore a search space, learn a composition from an ICN, and compose an error function.

Arguments:

  • concept: the concept of the targeted constraint

  • domains: domains of the variables that define the training space

  • param: an optional parameter of the constraint

  • search: either flexible,:partial or :complete search. Flexible search will use search_limit and solutions_limit to determine if the search space needs to be partially or completely explored

  • global_iter: number of learning iteration

  • local_iter: number of generation in the genetic algorithm

  • metric: the metric to measure the distance between a configuration and known solutions

  • popSize: size of the population in the genetic algorithm

  • action: either :symbols to have a description of the composition or :composition to have the composed function itself

source

CompositionalNetworks.functions Method
julia
functions(layer)

Access the operations of a layer. The container is ordered.

source

CompositionalNetworks.generate Method
julia
generate(c::Composition, name, lang)

Generates the code of c in a specific language lang.

source

CompositionalNetworks.generate_exclusive_operation Method
julia
generate_exclusive_operation(max_op_number)

Generates the operations (weights) of a layer with exclusive operations.

source

CompositionalNetworks.generate_inclusive_operations Method
julia
generate_inclusive_operations(predicate, bits)
+generate_exclusive_operation(max_op_number)

Generates the operations (weights) of a layer with inclusive/exclusive operations.

source

CompositionalNetworks.generate_weights Method
julia
generate_weights(layers)
+generate_weights(icn)

Generate the weights of a collection of layers or of an ICN.

source

CompositionalNetworks.hamming Method
julia
hamming(x, X)

Compute the hamming distance of x over a collection of solutions X, i.e. the minimal number of variables to switch in xto reach a solution.

source

CompositionalNetworks.is_viable Method
julia
is_viable(layer, w)
 is_viable(icn)
-is_viable(icn, w)

Assert if a pair of layer/icn and weights compose a viable pattern. If no weights are given with an icn, it will check the current internal value.

source


# CompositionalNetworks.layersMethod.
julia
layers(icn)

Return the ordered layers of an ICN.

source


# CompositionalNetworks.lazyMethod.
julia
lazy(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V).

source


# CompositionalNetworks.lazy_paramMethod.
julia
lazy_param(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V; param).

source


# CompositionalNetworks.learn_composeMethod.
julia
learn_compose(;
+is_viable(icn, w)

Assert if a pair of layer/icn and weights compose a viable pattern. If no weights are given with an icn, it will check the current internal value.

source

CompositionalNetworks.layers Method
julia
layers(icn)

Return the ordered layers of an ICN.

source

CompositionalNetworks.lazy Method
julia
lazy(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V).

source

CompositionalNetworks.lazy_param Method
julia
lazy_param(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V; param).

source

CompositionalNetworks.learn_compose Method
julia
learn_compose(;
     nvars, dom_size, param=nothing, icn=ICN(nvars, dom_size, param),
     X, X_sols, global_iter=100, local_iter=100, metric=hamming, popSize=200
-)

Create an ICN, optimize it, and return its composition.

source


# CompositionalNetworks.make_transformationsMethod.
julia
make_transformations(param::Symbol)

Generates a dictionary of transformation functions based on the specified parameterization. This function facilitates the creation of parametric layers for constraint transformations, allowing for flexible and dynamic constraint manipulation according to the needs of different constraint programming models.

Parameters

  • param::Symbol: Specifies the type of transformations to generate. It can be :none for basic transformations that do not depend on external parameters, or :val for transformations that operate with respect to a specific value parameter.

Returns

  • LittleDict{Symbol, Function}: A dictionary mapping transformation names (Symbol) to their corresponding functions (Function). The functions encapsulate various types of transformations, such as counting, comparison, and contiguous value processing.

Transformation Types

  • When param is :none, the following transformations are available:

    • :identity: No transformation is applied.

    • :count_eq, :count_eq_left, :count_eq_right: Count equalities under different conditions.

    • :count_greater, :count_lesser: Count values greater or lesser than a threshold.

    • :count_g_left, :count_l_left, :count_g_right, :count_l_right: Count values with greater or lesser comparisons from different directions.

    • :contiguous_vals_minus, :contiguous_vals_minus_rev: Process contiguous values with subtraction in normal and reverse order.

  • When param is :val, the transformations relate to operations involving a parameter value:

    • :count_eq_param, :count_l_param, :count_g_param: Count equalities or comparisons against a parameter value.

    • :count_bounding_param: Count values bounding a parameter value.

    • :val_minus_param, :param_minus_val: Subtract a parameter value from values or vice versa.

The function delegates to a version that uses Val(param) for dispatch, ensuring compile-time selection of the appropriate transformation set.

Examples

julia
# Get basic transformations
+)

Create an ICN, optimize it, and return its composition.

source

CompositionalNetworks.make_transformations Method
julia
make_transformations(param::Symbol)

Generates a dictionary of transformation functions based on the specified parameterization. This function facilitates the creation of parametric layers for constraint transformations, allowing for flexible and dynamic constraint manipulation according to the needs of different constraint programming models.

Parameters

  • param::Symbol: Specifies the type of transformations to generate. It can be :none for basic transformations that do not depend on external parameters, or :val for transformations that operate with respect to a specific value parameter.

Returns

  • LittleDict{Symbol, Function}: A dictionary mapping transformation names (Symbol) to their corresponding functions (Function). The functions encapsulate various types of transformations, such as counting, comparison, and contiguous value processing.

Transformation Types

  • When param is :none, the following transformations are available:

    • :identity: No transformation is applied.

    • :count_eq, :count_eq_left, :count_eq_right: Count equalities under different conditions.

    • :count_greater, :count_lesser: Count values greater or lesser than a threshold.

    • :count_g_left, :count_l_left, :count_g_right, :count_l_right: Count values with greater or lesser comparisons from different directions.

    • :contiguous_vals_minus, :contiguous_vals_minus_rev: Process contiguous values with subtraction in normal and reverse order.

  • When param is :val, the transformations relate to operations involving a parameter value:

    • :count_eq_param, :count_l_param, :count_g_param: Count equalities or comparisons against a parameter value.

    • :count_bounding_param: Count values bounding a parameter value.

    • :val_minus_param, :param_minus_val: Subtract a parameter value from values or vice versa.

The function delegates to a version that uses Val(param) for dispatch, ensuring compile-time selection of the appropriate transformation set.

Examples

julia
# Get basic transformations
 basic_transforms = make_transformations(:none)
 
 # Apply an identity transformation
@@ -233,44 +231,44 @@
 val_transforms = make_transformations(:val)
 
 # Apply a count equal to parameter transformation
-count_eq_param_result = val_transforms[:count_eq_param](data, param)

source


# CompositionalNetworks.manhattanMethod.
julia
manhattan(x, X)

source


# CompositionalNetworks.map_tr!Method.
julia
map_tr!(f, x, X, param)

Return an anonymous function that applies f to all elements of x and store the result in X, with a parameter param (which is set to nothing for function with no parameter).

source


# CompositionalNetworks.minkowskiMethod.
julia
minkowski(x, X, p)

source


# CompositionalNetworks.nbitsMethod.
julia
nbits(icn)

Return the expected number of bits of a viable weight of an ICN.

source


# CompositionalNetworks.nbits_excluMethod.
julia
nbits_exclu(layer)

Convert the length of an exclusive layer into a number of bits.

source


# CompositionalNetworks.reduce_symbolsFunction.
julia
reduce_symbols(symbols, sep)

Produce a formatted string that separates the symbols by sep. Used internally for show_composition.

source


# CompositionalNetworks.regularizationMethod.
julia
regularization(icn)

Return the regularization value of an ICN weights, which is proportional to the normalized number of operations selected in the icn layers.

source


# CompositionalNetworks.selected_sizeMethod.
julia
selected_size(layer, layer_weights)

Return the number of operations selected by layer_weights in layer.

source


# CompositionalNetworks.show_layerMethod.
julia
show_layer(layer)

Return a string that contains the elements in a layer.

source


# CompositionalNetworks.show_layersMethod.
julia
show_layers(icn)

Return a formatted string with each layers in the icn.

source


# CompositionalNetworks.symbolMethod.
julia
symbol(layer, i)

Return the i-th symbols of the operations in a given layer.

source


# CompositionalNetworks.symbolsMethod.
julia
symbols(c::Composition)

Output the composition as a layered collection of Symbols.

source


# CompositionalNetworks.tr_contiguous_vars_minusMethod.
julia
tr_contiguous_vars_minus(i, x)
+count_eq_param_result = val_transforms[:count_eq_param](data, param)

source

CompositionalNetworks.manhattan Method
julia
manhattan(x, X)

source

CompositionalNetworks.map_tr! Method
julia
map_tr!(f, x, X, param)

Return an anonymous function that applies f to all elements of x and store the result in X, with a parameter param (which is set to nothing for function with no parameter).

source

CompositionalNetworks.minkowski Method
julia
minkowski(x, X, p)

source

CompositionalNetworks.nbits Method
julia
nbits(icn)

Return the expected number of bits of a viable weight of an ICN.

source

CompositionalNetworks.nbits_exclu Method
julia
nbits_exclu(layer)

Convert the length of an exclusive layer into a number of bits.

source

CompositionalNetworks.reduce_symbols Function
julia
reduce_symbols(symbols, sep)

Produce a formatted string that separates the symbols by sep. Used internally for show_composition.

source

CompositionalNetworks.regularization Method
julia
regularization(icn)

Return the regularization value of an ICN weights, which is proportional to the normalized number of operations selected in the icn layers.

source

CompositionalNetworks.selected_size Method
julia
selected_size(layer, layer_weights)

Return the number of operations selected by layer_weights in layer.

source

CompositionalNetworks.show_layer Method
julia
show_layer(layer)

Return a string that contains the elements in a layer.

source

CompositionalNetworks.show_layers Method
julia
show_layers(icn)

Return a formatted string with each layers in the icn.

source

CompositionalNetworks.symbol Method
julia
symbol(layer, i)

Return the i-th symbols of the operations in a given layer.

source

CompositionalNetworks.symbols Method
julia
symbols(c::Composition)

Output the composition as a layered collection of Symbols.

source

CompositionalNetworks.tr_contiguous_vars_minus Method
julia
tr_contiguous_vars_minus(i, x)
 tr_contiguous_vars_minus(x)
-tr_contiguous_vars_minus(x, X::AbstractVector)

Return the difference x[i] - x[i + 1] if positive, 0.0 otherwise. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_contiguous_vars_minus_revMethod.
julia
tr_contiguous_vars_minus_rev(i, x)
+tr_contiguous_vars_minus(x, X::AbstractVector)

Return the difference x[i] - x[i + 1] if positive, 0.0 otherwise. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

CompositionalNetworks.tr_contiguous_vars_minus_rev Method
julia
tr_contiguous_vars_minus_rev(i, x)
 tr_contiguous_vars_minus_rev(x)
-tr_contiguous_vars_minus_rev(x, X::AbstractVector)

Return the difference x[i + 1] - x[i] if positive, 0.0 otherwise. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_bounding_valMethod.
julia
tr_count_bounding_val(i, x; val)
+tr_contiguous_vars_minus_rev(x, X::AbstractVector)

Return the difference x[i + 1] - x[i] if positive, 0.0 otherwise. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

CompositionalNetworks.tr_count_bounding_val Method
julia
tr_count_bounding_val(i, x; val)
 tr_count_bounding_val(x; val)
-tr_count_bounding_val(x, X::AbstractVector; val)

Count the number of elements bounded (not strictly) by x[i] and x[i] + val. An extended method to vector with sig (x, val) is generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_eqMethod.
julia
tr_count_eq(i, x)
+tr_count_bounding_val(x, X::AbstractVector; val)

Count the number of elements bounded (not strictly) by x[i] and x[i] + val. An extended method to vector with sig (x, val) is generated. When X is provided, the result is computed without allocations.

source

CompositionalNetworks.tr_count_eq Method
julia
tr_count_eq(i, x)
 tr_count_eq(x)
-tr_count_eq(x, X::AbstractVector)

Count the number of elements equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_eq_leftMethod.
julia
tr_count_eq_left(i, x)
+tr_count_eq(x, X::AbstractVector)

Count the number of elements equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

CompositionalNetworks.tr_count_eq_left Method
julia
tr_count_eq_left(i, x)
 tr_count_eq_left(x)
-tr_count_eq_left(x, X::AbstractVector)

Count the number of elements to the left of and equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_eq_rightMethod.
julia
tr_count_eq_right(i, x)
+tr_count_eq_left(x, X::AbstractVector)

Count the number of elements to the left of and equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

CompositionalNetworks.tr_count_eq_right Method
julia
tr_count_eq_right(i, x)
 tr_count_eq_right(x)
-tr_count_eq_right(x, X::AbstractVector)

Count the number of elements to the right of and equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_eq_valMethod.
julia
tr_count_eq_val(i, x; val)
+tr_count_eq_right(x, X::AbstractVector)

Count the number of elements to the right of and equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

CompositionalNetworks.tr_count_eq_val Method
julia
tr_count_eq_val(i, x; val)
 tr_count_eq_val(x; val)
-tr_count_eq_val(x, X::AbstractVector; val)

Count the number of elements equal to x[i] + val. Extended method to vector with sig (x, val) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_g_leftMethod.
julia
tr_count_g_left(i, x)
+tr_count_eq_val(x, X::AbstractVector; val)

Count the number of elements equal to x[i] + val. Extended method to vector with sig (x, val) are generated. When X is provided, the result is computed without allocations.

source

CompositionalNetworks.tr_count_g_left Method
julia
tr_count_g_left(i, x)
 tr_count_g_left(x)
-tr_count_g_left(x, X::AbstractVector)

Count the number of elements to the left of and greater than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_g_rightMethod.
julia
tr_count_g_right(i, x)
+tr_count_g_left(x, X::AbstractVector)

Count the number of elements to the left of and greater than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

CompositionalNetworks.tr_count_g_right Method
julia
tr_count_g_right(i, x)
 tr_count_g_right(x)
-tr_count_g_right(x, X::AbstractVector)

Count the number of elements to the right of and greater than x[i]. Extended method to vector with sig (x) are generated.

source


# CompositionalNetworks.tr_count_g_valMethod.
julia
tr_count_g_val(i, x; val)
+tr_count_g_right(x, X::AbstractVector)

Count the number of elements to the right of and greater than x[i]. Extended method to vector with sig (x) are generated.

source

CompositionalNetworks.tr_count_g_val Method
julia
tr_count_g_val(i, x; val)
 tr_count_g_val(x; val)
-tr_count_g_val(x, X::AbstractVector; val)

Count the number of elements greater than x[i] + val. Extended method to vector with sig (x, val) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_greaterMethod.
julia
tr_count_greater(i, x)
+tr_count_g_val(x, X::AbstractVector; val)

Count the number of elements greater than x[i] + val. Extended method to vector with sig (x, val) are generated. When X is provided, the result is computed without allocations.

source

CompositionalNetworks.tr_count_greater Method
julia
tr_count_greater(i, x)
 tr_count_greater(x)
-tr_count_greater(x, X::AbstractVector)

Count the number of elements greater than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_l_leftMethod.
julia
tr_count_l_left(i, x)
+tr_count_greater(x, X::AbstractVector)

Count the number of elements greater than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

CompositionalNetworks.tr_count_l_left Method
julia
tr_count_l_left(i, x)
 tr_count_l_left(x)
-tr_count_l_left(x, X::AbstractVector)

Count the number of elements to the left of and lesser than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_l_rightMethod.
julia
tr_count_l_right(i, x)
+tr_count_l_left(x, X::AbstractVector)

Count the number of elements to the left of and lesser than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

CompositionalNetworks.tr_count_l_right Method
julia
tr_count_l_right(i, x)
 tr_count_l_right(x)
-tr_count_l_right(x, X::AbstractVector)

Count the number of elements to the right of and lesser than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_l_valMethod.
julia
tr_count_l_val(i, x; val)
+tr_count_l_right(x, X::AbstractVector)

Count the number of elements to the right of and lesser than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

CompositionalNetworks.tr_count_l_val Method
julia
tr_count_l_val(i, x; val)
 tr_count_l_val(x; val)
-tr_count_l_val(x, X::AbstractVector; val)

Count the number of elements lesser than x[i] + val. Extended method to vector with sig (x, val) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_lesserMethod.
julia
tr_count_lesser(i, x)
+tr_count_l_val(x, X::AbstractVector; val)

Count the number of elements lesser than x[i] + val. Extended method to vector with sig (x, val) are generated. When X is provided, the result is computed without allocations.

source

CompositionalNetworks.tr_count_lesser Method
julia
tr_count_lesser(i, x)
 tr_count_lesser(x)
-tr_count_lesser(x, X::AbstractVector)

Count the number of elements lesser than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_identityMethod.
julia
tr_identity(i, x)
+tr_count_lesser(x, X::AbstractVector)

Count the number of elements lesser than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

CompositionalNetworks.tr_identity Method
julia
tr_identity(i, x)
 tr_identity(x)
-tr_identity(x, X::AbstractVector)

Identity function. Already defined in Julia as identity, specialized for vectors. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_in_unrolled_expansion_##225Method.
julia
tr_in(tr, X, x, param)

Application of an operation from the transformation layer. Used to generate more efficient code for all compositions.

source


# CompositionalNetworks.tr_val_minus_varMethod.
julia
tr_val_minus_var(i, x; val)
+tr_identity(x, X::AbstractVector)

Identity function. Already defined in Julia as identity, specialized for vectors. When X is provided, the result is computed without allocations.

source

CompositionalNetworks.tr_in_unrolled_expansion_##225 Method
julia
tr_in(tr, X, x, param)

Application of an operation from the transformation layer. Used to generate more efficient code for all compositions.

source

CompositionalNetworks.tr_val_minus_var Method
julia
tr_val_minus_var(i, x; val)
 tr_val_minus_var(x; val)
-tr_val_minus_var(x, X::AbstractVector; val)

Return the difference val - x[i] if positive, 0.0 otherwise. Extended method to vector with sig (x, val) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_var_minus_valMethod.
julia
tr_var_minus_val(i, x; val)
+tr_val_minus_var(x, X::AbstractVector; val)

Return the difference val - x[i] if positive, 0.0 otherwise. Extended method to vector with sig (x, val) are generated. When X is provided, the result is computed without allocations.

source

CompositionalNetworks.tr_var_minus_val Method
julia
tr_var_minus_val(i, x; val)
 tr_var_minus_val(x; val)
-tr_var_minus_val(x, X::AbstractVector; val)

Return the difference x[i] - val if positive, 0.0 otherwise. Extended method to vector with sig (x, val) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.transformation_layerFunction.
julia
transformation_layer(param = Vector{Symbol}())

Generate the layer of transformations functions of the ICN. Iff param value is non empty, also includes all the related parametric transformations.

source


# CompositionalNetworks.weights!Method.
julia
weights!(icn, weights)

Set the weights of an ICN with a BitVector.

source


# CompositionalNetworks.weightsMethod.
julia
weights(icn)

Access the current set of weights of an ICN.

source


# CompositionalNetworks.weights_biasMethod.
julia
weights_bias(x)

A metric that bias x towards operations with a lower bit. Do not affect the main metric.

source


# QUBOConstraints.AbstractOptimizerType.
julia
AbstractOptimizer

An abstract type (interface) used to learn QUBO matrices from constraints. Only a train method is required.

source


# QUBOConstraints.QUBO_baseFunction.
julia
QUBO_base(n, weight = 1)

A basic QUBO matrix to ensure that binarized variables keep a valid encoding.

source


# QUBOConstraints.QUBO_linear_sumMethod.
julia
QUBO_linear_sum(n, σ)

One valid QUBO matrix given n variables and parameter σ for the linear sum constraint.

source


# QUBOConstraints.binarizeMethod.
julia
binarize(x[, domain]; binarization = :one_hot)

Binarize x following the binarization encoding. If x is a vector (instead of a number per say), domain is optional.

source


# QUBOConstraints.debinarizeMethod.
julia
debinarize(x[, domain]; binarization = :one_hot)

Transform a binary vector into a number or a set of number. If domain is not given, it will compute a default value based on binarization and x.

source


# QUBOConstraints.is_validFunction.
julia
is_valid(x, encoding::Symbol = :none)

Check if x has a valid format for encoding.

For instance, if encoding == :one_hot, at most one bit of x can be set to 1.

source


# QUBOConstraints.trainMethod.
julia
train(args...)

Default train method for any AbstractOptimizer.

source


- +tr_var_minus_val(x, X::AbstractVector; val)

Return the difference x[i] - val if positive, 0.0 otherwise. Extended method to vector with sig (x, val) are generated. When X is provided, the result is computed without allocations.

source

CompositionalNetworks.transformation_layer Function
julia
transformation_layer(param = Vector{Symbol}())

Generate the layer of transformations functions of the ICN. Iff param value is non empty, also includes all the related parametric transformations.

source

CompositionalNetworks.weights! Method
julia
weights!(icn, weights)

Set the weights of an ICN with a BitVector.

source

CompositionalNetworks.weights Method
julia
weights(icn)

Access the current set of weights of an ICN.

source

CompositionalNetworks.weights_bias Method
julia
weights_bias(x)

A metric that bias x towards operations with a lower bit. Do not affect the main metric.

source

QUBOConstraints.AbstractOptimizer Type
julia
AbstractOptimizer

An abstract type (interface) used to learn QUBO matrices from constraints. Only a train method is required.

source

QUBOConstraints.QUBO_base Function
julia
QUBO_base(n, weight = 1)

A basic QUBO matrix to ensure that binarized variables keep a valid encoding.

source

QUBOConstraints.QUBO_linear_sum Method
julia
QUBO_linear_sum(n, σ)

One valid QUBO matrix given n variables and parameter σ for the linear sum constraint.

source

QUBOConstraints.binarize Method
julia
binarize(x[, domain]; binarization = :one_hot)

Binarize x following the binarization encoding. If x is a vector (instead of a number per say), domain is optional.

source

QUBOConstraints.debinarize Method
julia
debinarize(x[, domain]; binarization = :one_hot)

Transform a binary vector into a number or a set of number. If domain is not given, it will compute a default value based on binarization and x.

source

QUBOConstraints.is_valid Function
julia
is_valid(x, encoding::Symbol = :none)

Check if x has a valid format for encoding.

For instance, if encoding == :one_hot, at most one bit of x can be set to 1.

source

QUBOConstraints.train Method
julia
train(args...)

Default train method for any AbstractOptimizer.

source

+ \ No newline at end of file diff --git a/dev/assets/api_00_public.md.4BMbBTbQ.js b/dev/assets/api_00_public.md.4BMbBTbQ.js deleted file mode 100644 index 05769ab..0000000 --- a/dev/assets/api_00_public.md.4BMbBTbQ.js +++ /dev/null @@ -1,14 +0,0 @@ -import{_ as i,c as s,o as a,a7 as t}from"./chunks/framework.CBLuZwrP.js";const b=JSON.parse('{"title":"Public API","description":"","frontmatter":{},"headers":[],"relativePath":"api/00_public.md","filePath":"api/00_public.md","lastUpdated":null}'),e={name:"api/00_public.md"},n=t(`

Public API

# ConstraintCommons.AutomatonType.
julia
Automaton{S, T, F <: Union{S, Vector{S}, Set{S}}} <: AbstractAutomaton

A minimal implementation of a deterministic automaton structure.

source


# ConstraintCommons.MDDType.
julia
MDD{S,T} <: AbstractMultivaluedDecisionDiagram

A minimal implementation of a multivalued decision diagram structure.

source


# ConstraintCommons.acceptMethod.
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source


# ConstraintCommons.consinMethod.
julia
consin(::Any, ::Nothing)

Extends Base.in (or ) when the set is nothing. Returns false.

source


# ConstraintCommons.consisemptyMethod.
julia
consisempty(::Nothing)

Extends Base.isempty when the set is nothing. Returns true.

source


# ConstraintCommons.extract_parametersMethod.
julia
extract_parameters(m::Union{Method, Function}; parameters)

Extracts the intersection between the kargs of m and parameters (defaults to USUAL_CONSTRAINT_PARAMETERS).

source


# ConstraintCommons.incsert!Function.
julia
incsert!(d::Union{AbstractDict, AbstractDictionary}, ind, val = 1)

Increase or insert a counter in a dictionary-based collection. The counter insertion defaults to val = 1.

source


# ConstraintCommons.oversampleMethod.
julia
oversample(X, f)

Oversample elements of X until the boolean function f has as many true and false configurations.

source


# ConstraintCommons.symconFunction.
julia
symcon(s1::Symbol, s2::Symbol, connector::AbstractString="_")

Extends * to Symbols multiplication by connecting the symbols by an _.

source


# ConstraintCommons.δ_extremaMethod.
julia
δ_extrema(X...)

Compute both the difference between the maximum and the minimum of over all the collections of X.

source


# ConstraintDomains.AbstractDomainType.
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

Additionally, if the domain is used in a dynamic context, it can extend

where args depends on D's structure

source


# ConstraintDomains.ContinuousDomainType.
julia
ContinuousDomain{T <: Real} <: AbstractDomain

An abstract supertype for all continuous domains.

source


# ConstraintDomains.DiscreteDomainType.
julia
DiscreteDomain{T <: Number} <: AbstractDomain

An abstract supertype for discrete domains (set, range).

source


# ConstraintDomains.ExploreSettingsMethod.
julia
ExploreSettings(domains; 
-                complete_search_limit = 10^6, 
-                max_samplings = sum(domain_size, domains), 
-                search = :flexible, 
-                solutions_limit = floor(Int, sqrt(max_samplings)))

Create an ExploreSettings object to configure the exploration of a search space composed of a collection of domains.

Arguments

Returns

source


# ConstraintDomains.RangeDomainType.
julia
RangeDomain

A discrete domain defined by a range <: AbstractRange{Real}. As ranges are immutable in Julia, changes in RangeDomain must use set_domain!.

source


# ConstraintDomains.SetDomainType.
julia
SetDomain{T <: Number} <: DiscreteDomain{T}

Domain that stores discrete values as a set of (unordered) points.

source


# Base.delete!Method.
julia
Base.delete!(d::SetDomain, value)(d::SetDomain, value)

Delete value from the list of points in d.

source


# ConstraintDomains.add!Method.
julia
add!(d::SetDomain, value)

Add value to the list of points in d.

source


# ConstraintDomains.domainMethod.
julia
domain(values)
-domain(range::R) where {T <: Real, R <: AbstractRange{T}}

Construct either a SetDomain or a RangeDomain.

julia
d1 = domain(1:5)
-d2 = domain([53.69, 89.2, 0.12])
-d3 = domain([2//3, 89//123])
-d4 = domain(4.3)
-d5 = domain(1,42,86.9)

source


# ConstraintDomains.domainMethod.
julia
domain()

Construct an EmptyDomain.

source


# ConstraintDomains.domainMethod.
julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
-domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source


# ConstraintDomains.domain_sizeMethod.
julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source


# ConstraintDomains.domain_sizeMethod.
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source


# ConstraintDomains.domain_sizeMethod.
julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source


# ConstraintDomains.exploreMethod.
julia
explore(domains, concept; settings = ExploreSettings(domains), parameters...)

Search (a part of) a search space and return a pair of vectors of configurations: (solutions, non_solutions). The exploration behavior is determined based on the settings.

Arguments

Returns

source


# ConstraintDomains.generate_parametersMethod.
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source


# ConstraintDomains.get_domainMethod.
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source


# ConstraintDomains.intersect_domainsMethod.
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source


# ConstraintDomains.merge_domainsMethod.
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source


# ConstraintDomains.to_domainsMethod.
julia
to_domains(args...)

Convert various arguments into valid domains format.

source


# Constraints.USUAL_CONSTRAINTSConstant.
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source


# Constraints.USUAL_SYMMETRIESConstant.
julia
USUAL_SYMMETRIES

A Dictionary that contains the function to apply for each symmetry to avoid searching a whole space.

source


# Constraints.ConstraintType.
julia
Constraint

Parametric structure with the following fields.

source


# ConstraintCommons.extract_parametersFunction.
julia
extract_parameters(s::Symbol, constraints_dict=USUAL_CONSTRAINTS; parameters=ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS)

Return the parameters of the constraint s in constraints_dict.

Arguments

Example

julia
extract_parameters(:all_different)

source


# Constraints.argsMethod.
julia
args(c::Constraint)

Return the expected length restriction of the arguments in a constraint c. The value nothing indicates that any strictly positive number of value is accepted.

source


# Constraints.conceptMethod.
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source


# Constraints.conceptMethod.
julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

Example

julia
concept(:all_different, [1, 2, 3])

source


# Constraints.constraints_descriptionsFunction.
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

Example

julia
constraints_descriptions()

source


# Constraints.constraints_parametersFunction.
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

Example

julia
constraints_parameters()

source


# Constraints.describeFunction.
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

Example

julia
describe()

source


# Constraints.error_fMethod.
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source


# Constraints.params_lengthMethod.
julia
params_length(c::Constraint)

Return the expected length restriction of the arguments in a constraint c. The value nothing indicates that any strictly positive number of parameters is accepted.

source


# Constraints.symmetriesMethod.
julia
symmetries(c::Constraint)

Return the list of symmetries of c.

source


# CompositionalNetworks.CompositionMethod.
julia
Composition(f::F, symbols) where {F<:Function}

Construct a Composition.

source


# CompositionalNetworks.CompositionType.
julia
struct Composition{F<:Function}

Store the all the information of a composition learned by an ICN.

source


# CompositionalNetworks.ICNType.
julia
ICN(; nvars, dom_size, param, transformation, arithmetic, aggregation, comparison)

Construct an Interpretable Compositional Network, with the following arguments:

source


# CompositionalNetworks.aggregation_layerMethod.
julia
aggregation_layer()

Generate the layer of aggregations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source


# CompositionalNetworks.arithmetic_layerMethod.
julia
arithmetic_layer()

Generate the layer of arithmetic operations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source


# CompositionalNetworks.codeFunction.
julia
code(c::Composition, lang=:maths; name="composition")

Access the code of a composition c in a given language lang. The name of the generated method is optional.

source


# CompositionalNetworks.comparison_layerFunction.
julia
comparison_layer(param = false)

Generate the layer of transformations functions of the ICN. Iff param value is set, also includes all the parametric comparison with that value. The operations are mutually exclusive, that is only one will be selected.

source


# CompositionalNetworks.composeFunction.
julia
compose(icn, weights=nothing)

Return a function composed by some of the operations of a given ICN. Can be applied to any vector of variables. If weights are given, will assign to icn.

source


# CompositionalNetworks.compose_to_file!Method.
julia
compose_to_file!(concept, name, path; domains, param = nothing, language = :Julia, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200)

Explore, learn and compose a function and write it to a file.

Arguments:

Keywords arguments:

source


# CompositionalNetworks.compositionMethod.
julia
composition(c::Composition)

Access the actual method of an ICN composition c.

source


# CompositionalNetworks.composition_to_file!Function.
julia
composition_to_file!(c::Composition, path, name, language=:Julia)

Write the composition code in a given language into a file at path.

source


# CompositionalNetworks.explore_learn_composeMethod.
julia
explore_learn_compose(concept; domains, param = nothing, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200, action = :composition)

Explore a search space, learn a composition from an ICN, and compose an error function.

Arguments:

source


# CompositionalNetworks.hammingMethod.
julia
hamming(x, X)

Compute the hamming distance of x over a collection of solutions X, i.e. the minimal number of variables to switch in xto reach a solution.

source


# CompositionalNetworks.lazyMethod.
julia
lazy(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V).

source


# CompositionalNetworks.lazy_paramMethod.
julia
lazy_param(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V; param).

source


# CompositionalNetworks.learn_composeMethod.
julia
learn_compose(;
-    nvars, dom_size, param=nothing, icn=ICN(nvars, dom_size, param),
-    X, X_sols, global_iter=100, local_iter=100, metric=hamming, popSize=200
-)

Create an ICN, optimize it, and return its composition.

source


# CompositionalNetworks.manhattanMethod.
julia
manhattan(x, X)

source


# CompositionalNetworks.minkowskiMethod.
julia
minkowski(x, X, p)

source


# CompositionalNetworks.nbitsMethod.
julia
nbits(icn)

Return the expected number of bits of a viable weight of an ICN.

source


# CompositionalNetworks.regularizationMethod.
julia
regularization(icn)

Return the regularization value of an ICN weights, which is proportional to the normalized number of operations selected in the icn layers.

source


# CompositionalNetworks.show_layersMethod.
julia
show_layers(icn)

Return a formatted string with each layers in the icn.

source


# CompositionalNetworks.symbolsMethod.
julia
symbols(c::Composition)

Output the composition as a layered collection of Symbols.

source


# CompositionalNetworks.transformation_layerFunction.
julia
transformation_layer(param = Vector{Symbol}())

Generate the layer of transformations functions of the ICN. Iff param value is non empty, also includes all the related parametric transformations.

source


# CompositionalNetworks.weights!Method.
julia
weights!(icn, weights)

Set the weights of an ICN with a BitVector.

source


# CompositionalNetworks.weightsMethod.
julia
weights(icn)

Access the current set of weights of an ICN.

source


# CompositionalNetworks.weights_biasMethod.
julia
weights_bias(x)

A metric that bias x towards operations with a lower bit. Do not affect the main metric.

source


# QUBOConstraints.QUBO_linear_sumMethod.
julia
QUBO_linear_sum(n, σ)

One valid QUBO matrix given n variables and parameter σ for the linear sum constraint.

source


# QUBOConstraints.binarizeMethod.
julia
binarize(x[, domain]; binarization = :one_hot)

Binarize x following the binarization encoding. If x is a vector (instead of a number per say), domain is optional.

source


# QUBOConstraints.debinarizeMethod.
julia
debinarize(x[, domain]; binarization = :one_hot)

Transform a binary vector into a number or a set of number. If domain is not given, it will compute a default value based on binarization and x.

source


# QUBOConstraints.is_validFunction.
julia
is_valid(x, encoding::Symbol = :none)

Check if x has a valid format for encoding.

For instance, if encoding == :one_hot, at most one bit of x can be set to 1.

source


# QUBOConstraints.trainMethod.
julia
train(args...)

Default train method for any AbstractOptimizer.

source


`,149),o=[n];function l(r,p,h,d,c,k){return a(),s("div",null,o)}const g=i(e,[["render",l]]);export{b as __pageData,g as default}; diff --git a/dev/assets/api_00_public.md.4BMbBTbQ.lean.js b/dev/assets/api_00_public.md.4BMbBTbQ.lean.js deleted file mode 100644 index dbbd847..0000000 --- a/dev/assets/api_00_public.md.4BMbBTbQ.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as s,o as a,a7 as t}from"./chunks/framework.CBLuZwrP.js";const b=JSON.parse('{"title":"Public API","description":"","frontmatter":{},"headers":[],"relativePath":"api/00_public.md","filePath":"api/00_public.md","lastUpdated":null}'),e={name:"api/00_public.md"},n=t("",149),o=[n];function l(r,p,h,d,c,k){return a(),s("div",null,o)}const g=i(e,[["render",l]]);export{b as __pageData,g as default}; diff --git a/dev/assets/api_00_public.md.DIEIz3-7.js b/dev/assets/api_00_public.md.DIEIz3-7.js new file mode 100644 index 0000000..c606432 --- /dev/null +++ b/dev/assets/api_00_public.md.DIEIz3-7.js @@ -0,0 +1,14 @@ +import{_ as l,c as o,j as i,a as t,G as n,a5 as e,B as p,o as r}from"./chunks/framework.CJakPlgM.js";const Us=JSON.parse('{"title":"Public API","description":"","frontmatter":{},"headers":[],"relativePath":"api/00_public.md","filePath":"api/00_public.md","lastUpdated":null}'),h={name:"api/00_public.md"},d={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""},L={class:"jldocstring custom-block",open:""},N={class:"jldocstring custom-block",open:""},_={class:"jldocstring custom-block",open:""},S={class:"jldocstring custom-block",open:""},M={class:"jldocstring custom-block",open:""},O={class:"jldocstring custom-block",open:""},I={class:"jldocstring custom-block",open:""},U={class:"jldocstring custom-block",open:""},J={class:"jldocstring custom-block",open:""},R={class:"jldocstring custom-block",open:""},z={class:"jldocstring custom-block",open:""},Q={class:"jldocstring custom-block",open:""},V={class:"jldocstring custom-block",open:""},P={class:"jldocstring custom-block",open:""},X={class:"jldocstring custom-block",open:""},G={class:"jldocstring custom-block",open:""},q={class:"jldocstring custom-block",open:""},Y={class:"jldocstring custom-block",open:""},$={class:"jldocstring custom-block",open:""},K={class:"jldocstring custom-block",open:""},W={class:"jldocstring custom-block",open:""},H={class:"jldocstring custom-block",open:""},Z={class:"jldocstring custom-block",open:""},ss={class:"jldocstring custom-block",open:""},is={class:"jldocstring custom-block",open:""},ts={class:"jldocstring custom-block",open:""},as={class:"jldocstring custom-block",open:""},ns={class:"jldocstring custom-block",open:""},es={class:"jldocstring custom-block",open:""},ls={class:"jldocstring custom-block",open:""},os={class:"jldocstring custom-block",open:""},ps={class:"jldocstring custom-block",open:""},rs={class:"jldocstring custom-block",open:""},hs={class:"jldocstring custom-block",open:""},ds={class:"jldocstring custom-block",open:""},ks={class:"jldocstring custom-block",open:""},cs={class:"jldocstring custom-block",open:""},us={class:"jldocstring custom-block",open:""},gs={class:"jldocstring custom-block",open:""},ms={class:"jldocstring custom-block",open:""},bs={class:"jldocstring custom-block",open:""},ys={class:"jldocstring custom-block",open:""},Cs={class:"jldocstring custom-block",open:""},Es={class:"jldocstring custom-block",open:""},js={class:"jldocstring custom-block",open:""},vs={class:"jldocstring custom-block",open:""},fs={class:"jldocstring custom-block",open:""},Fs={class:"jldocstring custom-block",open:""},As={class:"jldocstring custom-block",open:""},Ds={class:"jldocstring custom-block",open:""},Ts={class:"jldocstring custom-block",open:""},xs={class:"jldocstring custom-block",open:""},Bs={class:"jldocstring custom-block",open:""},ws={class:"jldocstring custom-block",open:""};function Ls(Ns,s,_s,Ss,Ms,Os){const a=p("Badge");return r(),o("div",null,[s[222]||(s[222]=i("h1",{id:"Public-API",tabindex:"-1"},[t("Public API "),i("a",{class:"header-anchor",href:"#Public-API","aria-label":'Permalink to "Public API {#Public-API}"'},"​")],-1)),i("details",d,[i("summary",null,[s[0]||(s[0]=i("a",{id:"ConstraintCommons.Automaton-api-00_public",href:"#ConstraintCommons.Automaton-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.Automaton")],-1)),s[1]||(s[1]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=e('
julia
Automaton{S, T, F <: Union{S, Vector{S}, Set{S}}} <: AbstractAutomaton

A minimal implementation of a deterministic automaton structure.

source

',3))]),i("details",k,[i("summary",null,[s[3]||(s[3]=i("a",{id:"ConstraintCommons.MDD-api-00_public",href:"#ConstraintCommons.MDD-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.MDD")],-1)),s[4]||(s[4]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[5]||(s[5]=e('
julia
MDD{S,T} <: AbstractMultivaluedDecisionDiagram

A minimal implementation of a multivalued decision diagram structure.

source

',3))]),i("details",c,[i("summary",null,[s[6]||(s[6]=i("a",{id:"ConstraintCommons.accept-Tuple{Automaton, Any}-api-00_public",href:"#ConstraintCommons.accept-Tuple{Automaton, Any}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.accept")],-1)),s[7]||(s[7]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[8]||(s[8]=e('
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

',3))]),i("details",u,[i("summary",null,[s[9]||(s[9]=i("a",{id:"ConstraintCommons.consin-Tuple{Any, Nothing}-api-00_public",href:"#ConstraintCommons.consin-Tuple{Any, Nothing}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.consin")],-1)),s[10]||(s[10]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[11]||(s[11]=e('
julia
consin(::Any, ::Nothing)

Extends Base.in (or ) when the set is nothing. Returns false.

source

',3))]),i("details",g,[i("summary",null,[s[12]||(s[12]=i("a",{id:"ConstraintCommons.consisempty-Tuple{Nothing}-api-00_public",href:"#ConstraintCommons.consisempty-Tuple{Nothing}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.consisempty")],-1)),s[13]||(s[13]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[14]||(s[14]=e('
julia
consisempty(::Nothing)

Extends Base.isempty when the set is nothing. Returns true.

source

',3))]),i("details",m,[i("summary",null,[s[15]||(s[15]=i("a",{id:"ConstraintCommons.extract_parameters-Tuple{Method}-api-00_public",href:"#ConstraintCommons.extract_parameters-Tuple{Method}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.extract_parameters")],-1)),s[16]||(s[16]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[17]||(s[17]=e('
julia
extract_parameters(m::Union{Method, Function}; parameters)

Extracts the intersection between the kargs of m and parameters (defaults to USUAL_CONSTRAINT_PARAMETERS).

source

',3))]),i("details",b,[i("summary",null,[s[18]||(s[18]=i("a",{id:"ConstraintCommons.incsert!-api-00_public",href:"#ConstraintCommons.incsert!-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.incsert!")],-1)),s[19]||(s[19]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[20]||(s[20]=e('
julia
incsert!(d::Union{AbstractDict, AbstractDictionary}, ind, val = 1)

Increase or insert a counter in a dictionary-based collection. The counter insertion defaults to val = 1.

source

',3))]),i("details",y,[i("summary",null,[s[21]||(s[21]=i("a",{id:"ConstraintCommons.oversample-Tuple{Any, Any}-api-00_public",href:"#ConstraintCommons.oversample-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.oversample")],-1)),s[22]||(s[22]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[23]||(s[23]=e('
julia
oversample(X, f)

Oversample elements of X until the boolean function f has as many true and false configurations.

source

',3))]),i("details",C,[i("summary",null,[s[24]||(s[24]=i("a",{id:"ConstraintCommons.symcon-api-00_public",href:"#ConstraintCommons.symcon-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.symcon")],-1)),s[25]||(s[25]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=e('
julia
symcon(s1::Symbol, s2::Symbol, connector::AbstractString="_")

Extends * to Symbols multiplication by connecting the symbols by an _.

source

',3))]),i("details",E,[i("summary",null,[s[27]||(s[27]=i("a",{id:"ConstraintCommons.δ_extrema-Tuple{Any}-api-00_public",href:"#ConstraintCommons.δ_extrema-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.δ_extrema")],-1)),s[28]||(s[28]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[29]||(s[29]=e('
julia
δ_extrema(X...)

Compute both the difference between the maximum and the minimum of over all the collections of X.

source

',3))]),i("details",j,[i("summary",null,[s[30]||(s[30]=i("a",{id:"ConstraintDomains.AbstractDomain-api-00_public",href:"#ConstraintDomains.AbstractDomain-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.AbstractDomain")],-1)),s[31]||(s[31]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[32]||(s[32]=e('
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

Additionally, if the domain is used in a dynamic context, it can extend

where args depends on D's structure

source

',7))]),i("details",v,[i("summary",null,[s[33]||(s[33]=i("a",{id:"ConstraintDomains.ContinuousDomain-api-00_public",href:"#ConstraintDomains.ContinuousDomain-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.ContinuousDomain")],-1)),s[34]||(s[34]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[35]||(s[35]=e('
julia
ContinuousDomain{T <: Real} <: AbstractDomain

An abstract supertype for all continuous domains.

source

',3))]),i("details",f,[i("summary",null,[s[36]||(s[36]=i("a",{id:"ConstraintDomains.DiscreteDomain-api-00_public",href:"#ConstraintDomains.DiscreteDomain-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.DiscreteDomain")],-1)),s[37]||(s[37]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[38]||(s[38]=e('
julia
DiscreteDomain{T <: Number} <: AbstractDomain

An abstract supertype for discrete domains (set, range).

source

',3))]),i("details",F,[i("summary",null,[s[39]||(s[39]=i("a",{id:"ConstraintDomains.ExploreSettings-Tuple{Any}-api-00_public",href:"#ConstraintDomains.ExploreSettings-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.ExploreSettings")],-1)),s[40]||(s[40]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[41]||(s[41]=e(`
julia
ExploreSettings(domains; 
+                complete_search_limit = 10^6, 
+                max_samplings = sum(domain_size, domains), 
+                search = :flexible, 
+                solutions_limit = floor(Int, sqrt(max_samplings)))

Create an ExploreSettings object to configure the exploration of a search space composed of a collection of domains.

Arguments

Returns

source

`,7))]),i("details",A,[i("summary",null,[s[42]||(s[42]=i("a",{id:"ConstraintDomains.RangeDomain-api-00_public",href:"#ConstraintDomains.RangeDomain-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.RangeDomain")],-1)),s[43]||(s[43]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[44]||(s[44]=e('
julia
RangeDomain

A discrete domain defined by a range <: AbstractRange{Real}. As ranges are immutable in Julia, changes in RangeDomain must use set_domain!.

source

',3))]),i("details",D,[i("summary",null,[s[45]||(s[45]=i("a",{id:"ConstraintDomains.SetDomain-api-00_public",href:"#ConstraintDomains.SetDomain-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.SetDomain")],-1)),s[46]||(s[46]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[47]||(s[47]=e('
julia
SetDomain{T <: Number} <: DiscreteDomain{T}

Domain that stores discrete values as a set of (unordered) points.

source

',3))]),i("details",T,[i("summary",null,[s[48]||(s[48]=i("a",{id:"Base.delete!-Tuple{SetDomain, Any}-api-00_public",href:"#Base.delete!-Tuple{SetDomain, Any}-api-00_public"},[i("span",{class:"jlbinding"},"Base.delete!")],-1)),s[49]||(s[49]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[50]||(s[50]=e('
julia
Base.delete!(d::SetDomain, value)(d::SetDomain, value)

Delete value from the list of points in d.

source

',3))]),i("details",x,[i("summary",null,[s[51]||(s[51]=i("a",{id:"ConstraintDomains.add!-Tuple{SetDomain, Any}-api-00_public",href:"#ConstraintDomains.add!-Tuple{SetDomain, Any}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.add!")],-1)),s[52]||(s[52]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[53]||(s[53]=e('
julia
add!(d::SetDomain, value)

Add value to the list of points in d.

source

',3))]),i("details",B,[i("summary",null,[s[54]||(s[54]=i("a",{id:"ConstraintDomains.domain-Tuple{Any}-api-00_public",href:"#ConstraintDomains.domain-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[55]||(s[55]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[56]||(s[56]=e(`
julia
domain(values)
+domain(range::R) where {T <: Real, R <: AbstractRange{T}}

Construct either a SetDomain or a RangeDomain.

julia
d1 = domain(1:5)
+d2 = domain([53.69, 89.2, 0.12])
+d3 = domain([2//3, 89//123])
+d4 = domain(4.3)
+d5 = domain(1,42,86.9)

source

`,4))]),i("details",w,[i("summary",null,[s[57]||(s[57]=i("a",{id:"ConstraintDomains.domain-Tuple{}-api-00_public",href:"#ConstraintDomains.domain-Tuple{}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[58]||(s[58]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[59]||(s[59]=e('
julia
domain()

Construct an EmptyDomain.

source

',3))]),i("details",L,[i("summary",null,[s[60]||(s[60]=i("a",{id:"ConstraintDomains.domain-Union{Tuple{Array{Intervals.Interval{T, L, R}, 1}}, Tuple{R}, Tuple{L}, Tuple{T}} where {T<:Real, L, R}-api-00_public",href:"#ConstraintDomains.domain-Union{Tuple{Array{Intervals.Interval{T, L, R}, 1}}, Tuple{R}, Tuple{L}, Tuple{T}} where {T<:Real, L, R}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[61]||(s[61]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[62]||(s[62]=e(`
julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

`,3))]),i("details",N,[i("summary",null,[s[63]||(s[63]=i("a",{id:"ConstraintDomains.domain_size-Tuple{ConstraintDomains.Intervals}-api-00_public",href:"#ConstraintDomains.domain_size-Tuple{ConstraintDomains.Intervals}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[64]||(s[64]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[65]||(s[65]=e('
julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

',3))]),i("details",_,[i("summary",null,[s[66]||(s[66]=i("a",{id:"ConstraintDomains.domain_size-Tuple{D} where D<:AbstractDomain-api-00_public",href:"#ConstraintDomains.domain_size-Tuple{D} where D<:AbstractDomain-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[67]||(s[67]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[68]||(s[68]=e('
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

',3))]),i("details",S,[i("summary",null,[s[69]||(s[69]=i("a",{id:"ConstraintDomains.domain_size-Tuple{D} where D<:DiscreteDomain-api-00_public",href:"#ConstraintDomains.domain_size-Tuple{D} where D<:DiscreteDomain-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[70]||(s[70]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[71]||(s[71]=e('
julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',3))]),i("details",M,[i("summary",null,[s[72]||(s[72]=i("a",{id:"ConstraintDomains.explore-Tuple{Any, Any}-api-00_public",href:"#ConstraintDomains.explore-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.explore")],-1)),s[73]||(s[73]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[74]||(s[74]=e('
julia
explore(domains, concept; settings = ExploreSettings(domains), parameters...)

Search (a part of) a search space and return a pair of vectors of configurations: (solutions, non_solutions). The exploration behavior is determined based on the settings.

Arguments

Returns

source

',7))]),i("details",O,[i("summary",null,[s[75]||(s[75]=i("a",{id:"ConstraintDomains.generate_parameters-Tuple{AbstractDomain, Symbol}-api-00_public",href:"#ConstraintDomains.generate_parameters-Tuple{AbstractDomain, Symbol}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.generate_parameters")],-1)),s[76]||(s[76]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[77]||(s[77]=e('
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source

',3))]),i("details",I,[i("summary",null,[s[78]||(s[78]=i("a",{id:"ConstraintDomains.get_domain-Tuple{D} where D<:AbstractDomain-api-00_public",href:"#ConstraintDomains.get_domain-Tuple{D} where D<:AbstractDomain-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.get_domain")],-1)),s[79]||(s[79]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[80]||(s[80]=e('
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

',3))]),i("details",U,[i("summary",null,[s[81]||(s[81]=i("a",{id:"ConstraintDomains.intersect_domains-Union{Tuple{I2}, Tuple{I1}, Tuple{I1, I2}} where {I1<:Intervals.Interval, I2<:Intervals.Interval}-api-00_public",href:"#ConstraintDomains.intersect_domains-Union{Tuple{I2}, Tuple{I1}, Tuple{I1, I2}} where {I1<:Intervals.Interval, I2<:Intervals.Interval}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains")],-1)),s[82]||(s[82]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[83]||(s[83]=e('
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

',3))]),i("details",J,[i("summary",null,[s[84]||(s[84]=i("a",{id:"ConstraintDomains.merge_domains-Tuple{RangeDomain, RangeDomain}-api-00_public",href:"#ConstraintDomains.merge_domains-Tuple{RangeDomain, RangeDomain}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.merge_domains")],-1)),s[85]||(s[85]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[86]||(s[86]=e('
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source

',3))]),i("details",R,[i("summary",null,[s[87]||(s[87]=i("a",{id:"ConstraintDomains.to_domains-Tuple{Vector{Int64}}-api-00_public",href:"#ConstraintDomains.to_domains-Tuple{Vector{Int64}}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.to_domains")],-1)),s[88]||(s[88]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[89]||(s[89]=e('
julia
to_domains(args...)

Convert various arguments into valid domains format.

source

',3))]),i("details",z,[i("summary",null,[s[90]||(s[90]=i("a",{id:"Constraints.USUAL_CONSTRAINTS-api-00_public",href:"#Constraints.USUAL_CONSTRAINTS-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.USUAL_CONSTRAINTS")],-1)),s[91]||(s[91]=t()),n(a,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[92]||(s[92]=e('
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source

',6))]),i("details",Q,[i("summary",null,[s[93]||(s[93]=i("a",{id:"Constraints.USUAL_SYMMETRIES-api-00_public",href:"#Constraints.USUAL_SYMMETRIES-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.USUAL_SYMMETRIES")],-1)),s[94]||(s[94]=t()),n(a,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[95]||(s[95]=e('
julia
USUAL_SYMMETRIES

A Dictionary that contains the function to apply for each symmetry to avoid searching a whole space.

source

',3))]),i("details",V,[i("summary",null,[s[96]||(s[96]=i("a",{id:"Constraints.Constraint-api-00_public",href:"#Constraints.Constraint-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.Constraint")],-1)),s[97]||(s[97]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[98]||(s[98]=e('
julia
Constraint

Parametric structure with the following fields.

source

',4))]),i("details",P,[i("summary",null,[s[99]||(s[99]=i("a",{id:"ConstraintCommons.extract_parameters-api-00_public",href:"#ConstraintCommons.extract_parameters-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.extract_parameters")],-1)),s[100]||(s[100]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[101]||(s[101]=e('
julia
extract_parameters(s::Symbol, constraints_dict=USUAL_CONSTRAINTS; parameters=ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS)

Return the parameters of the constraint s in constraints_dict.

Arguments

Example

julia
extract_parameters(:all_different)

source

',7))]),i("details",X,[i("summary",null,[s[102]||(s[102]=i("a",{id:"Constraints.args-Tuple{Constraint}-api-00_public",href:"#Constraints.args-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.args")],-1)),s[103]||(s[103]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[104]||(s[104]=e('
julia
args(c::Constraint)

Return the expected length restriction of the arguments in a constraint c. The value nothing indicates that any strictly positive number of value is accepted.

source

',3))]),i("details",G,[i("summary",null,[s[105]||(s[105]=i("a",{id:"Constraints.concept-Tuple{Constraint}-api-00_public",href:"#Constraints.concept-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[106]||(s[106]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[107]||(s[107]=e('
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source

',3))]),i("details",q,[i("summary",null,[s[108]||(s[108]=i("a",{id:"Constraints.concept-Tuple{Symbol, Vararg{Any}}-api-00_public",href:"#Constraints.concept-Tuple{Symbol, Vararg{Any}}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[109]||(s[109]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[110]||(s[110]=e('
julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

Example

julia
concept(:all_different, [1, 2, 3])

source

',7))]),i("details",Y,[i("summary",null,[s[111]||(s[111]=i("a",{id:"Constraints.constraints_descriptions-api-00_public",href:"#Constraints.constraints_descriptions-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.constraints_descriptions")],-1)),s[112]||(s[112]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[113]||(s[113]=e('
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

Example

julia
constraints_descriptions()

source

',7))]),i("details",$,[i("summary",null,[s[114]||(s[114]=i("a",{id:"Constraints.constraints_parameters-api-00_public",href:"#Constraints.constraints_parameters-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.constraints_parameters")],-1)),s[115]||(s[115]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[116]||(s[116]=e('
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

Example

julia
constraints_parameters()

source

',7))]),i("details",K,[i("summary",null,[s[117]||(s[117]=i("a",{id:"Constraints.describe-api-00_public",href:"#Constraints.describe-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.describe")],-1)),s[118]||(s[118]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[119]||(s[119]=e('
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

Example

julia
describe()

source

',7))]),i("details",W,[i("summary",null,[s[120]||(s[120]=i("a",{id:"Constraints.error_f-Tuple{Constraint}-api-00_public",href:"#Constraints.error_f-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.error_f")],-1)),s[121]||(s[121]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[122]||(s[122]=e('
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source

',3))]),i("details",H,[i("summary",null,[s[123]||(s[123]=i("a",{id:"Constraints.params_length-Tuple{Constraint}-api-00_public",href:"#Constraints.params_length-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.params_length")],-1)),s[124]||(s[124]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[125]||(s[125]=e('
julia
params_length(c::Constraint)

Return the expected length restriction of the arguments in a constraint c. The value nothing indicates that any strictly positive number of parameters is accepted.

source

',3))]),i("details",Z,[i("summary",null,[s[126]||(s[126]=i("a",{id:"Constraints.symmetries-Tuple{Constraint}-api-00_public",href:"#Constraints.symmetries-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.symmetries")],-1)),s[127]||(s[127]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[128]||(s[128]=e('
julia
symmetries(c::Constraint)

Return the list of symmetries of c.

source

',3))]),i("details",ss,[i("summary",null,[s[129]||(s[129]=i("a",{id:"CompositionalNetworks.Composition-Union{Tuple{F}, Tuple{F, Any}} where F<:Function-api-00_public",href:"#CompositionalNetworks.Composition-Union{Tuple{F}, Tuple{F, Any}} where F<:Function-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.Composition")],-1)),s[130]||(s[130]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[131]||(s[131]=e('
julia
Composition(f::F, symbols) where {F<:Function}

Construct a Composition.

source

',3))]),i("details",is,[i("summary",null,[s[132]||(s[132]=i("a",{id:"CompositionalNetworks.Composition-api-00_public",href:"#CompositionalNetworks.Composition-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.Composition")],-1)),s[133]||(s[133]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[134]||(s[134]=e('
julia
struct Composition{F<:Function}

Store the all the information of a composition learned by an ICN.

source

',3))]),i("details",ts,[i("summary",null,[s[135]||(s[135]=i("a",{id:"CompositionalNetworks.ICN-api-00_public",href:"#CompositionalNetworks.ICN-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.ICN")],-1)),s[136]||(s[136]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[137]||(s[137]=e('
julia
ICN(; nvars, dom_size, param, transformation, arithmetic, aggregation, comparison)

Construct an Interpretable Compositional Network, with the following arguments:

source

',4))]),i("details",as,[i("summary",null,[s[138]||(s[138]=i("a",{id:"CompositionalNetworks.aggregation_layer-Tuple{}-api-00_public",href:"#CompositionalNetworks.aggregation_layer-Tuple{}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.aggregation_layer")],-1)),s[139]||(s[139]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[140]||(s[140]=e('
julia
aggregation_layer()

Generate the layer of aggregations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source

',3))]),i("details",ns,[i("summary",null,[s[141]||(s[141]=i("a",{id:"CompositionalNetworks.arithmetic_layer-Tuple{}-api-00_public",href:"#CompositionalNetworks.arithmetic_layer-Tuple{}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.arithmetic_layer")],-1)),s[142]||(s[142]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[143]||(s[143]=e('
julia
arithmetic_layer()

Generate the layer of arithmetic operations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source

',3))]),i("details",es,[i("summary",null,[s[144]||(s[144]=i("a",{id:"CompositionalNetworks.code-api-00_public",href:"#CompositionalNetworks.code-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.code")],-1)),s[145]||(s[145]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[146]||(s[146]=e('
julia
code(c::Composition, lang=:maths; name="composition")

Access the code of a composition c in a given language lang. The name of the generated method is optional.

source

',3))]),i("details",ls,[i("summary",null,[s[147]||(s[147]=i("a",{id:"CompositionalNetworks.comparison_layer-api-00_public",href:"#CompositionalNetworks.comparison_layer-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.comparison_layer")],-1)),s[148]||(s[148]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[149]||(s[149]=e('
julia
comparison_layer(param = false)

Generate the layer of transformations functions of the ICN. Iff param value is set, also includes all the parametric comparison with that value. The operations are mutually exclusive, that is only one will be selected.

source

',3))]),i("details",os,[i("summary",null,[s[150]||(s[150]=i("a",{id:"CompositionalNetworks.compose-api-00_public",href:"#CompositionalNetworks.compose-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.compose")],-1)),s[151]||(s[151]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[152]||(s[152]=e('
julia
compose(icn, weights=nothing)

Return a function composed by some of the operations of a given ICN. Can be applied to any vector of variables. If weights are given, will assign to icn.

source

',3))]),i("details",ps,[i("summary",null,[s[153]||(s[153]=i("a",{id:"CompositionalNetworks.compose_to_file!-Tuple{Any, Any, Any}-api-00_public",href:"#CompositionalNetworks.compose_to_file!-Tuple{Any, Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.compose_to_file!")],-1)),s[154]||(s[154]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[155]||(s[155]=e('
julia
compose_to_file!(concept, name, path; domains, param = nothing, language = :Julia, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200)

Explore, learn and compose a function and write it to a file.

Arguments:

Keywords arguments:

source

',7))]),i("details",rs,[i("summary",null,[s[156]||(s[156]=i("a",{id:"CompositionalNetworks.composition-Tuple{Composition}-api-00_public",href:"#CompositionalNetworks.composition-Tuple{Composition}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.composition")],-1)),s[157]||(s[157]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[158]||(s[158]=e('
julia
composition(c::Composition)

Access the actual method of an ICN composition c.

source

',3))]),i("details",hs,[i("summary",null,[s[159]||(s[159]=i("a",{id:"CompositionalNetworks.composition_to_file!-api-00_public",href:"#CompositionalNetworks.composition_to_file!-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.composition_to_file!")],-1)),s[160]||(s[160]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[161]||(s[161]=e('
julia
composition_to_file!(c::Composition, path, name, language=:Julia)

Write the composition code in a given language into a file at path.

source

',3))]),i("details",ds,[i("summary",null,[s[162]||(s[162]=i("a",{id:"CompositionalNetworks.explore_learn_compose-Tuple{Any, Any}-api-00_public",href:"#CompositionalNetworks.explore_learn_compose-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.explore_learn_compose")],-1)),s[163]||(s[163]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[164]||(s[164]=e('
julia
explore_learn_compose(concept; domains, param = nothing, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200, action = :composition)

Explore a search space, learn a composition from an ICN, and compose an error function.

Arguments:

source

',5))]),i("details",ks,[i("summary",null,[s[165]||(s[165]=i("a",{id:"CompositionalNetworks.hamming-Tuple{Any, Any}-api-00_public",href:"#CompositionalNetworks.hamming-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.hamming")],-1)),s[166]||(s[166]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[167]||(s[167]=e('
julia
hamming(x, X)

Compute the hamming distance of x over a collection of solutions X, i.e. the minimal number of variables to switch in xto reach a solution.

source

',3))]),i("details",cs,[i("summary",null,[s[168]||(s[168]=i("a",{id:"CompositionalNetworks.lazy-Tuple{Vararg{Function}}-api-00_public",href:"#CompositionalNetworks.lazy-Tuple{Vararg{Function}}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.lazy")],-1)),s[169]||(s[169]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[170]||(s[170]=e('
julia
lazy(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V).

source

',3))]),i("details",us,[i("summary",null,[s[171]||(s[171]=i("a",{id:"CompositionalNetworks.lazy_param-Tuple{Vararg{Function}}-api-00_public",href:"#CompositionalNetworks.lazy_param-Tuple{Vararg{Function}}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.lazy_param")],-1)),s[172]||(s[172]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[173]||(s[173]=e('
julia
lazy_param(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V; param).

source

',3))]),i("details",gs,[i("summary",null,[s[174]||(s[174]=i("a",{id:"CompositionalNetworks.learn_compose-Tuple{Any, Any, Any}-api-00_public",href:"#CompositionalNetworks.learn_compose-Tuple{Any, Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.learn_compose")],-1)),s[175]||(s[175]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[176]||(s[176]=e(`
julia
learn_compose(;
+    nvars, dom_size, param=nothing, icn=ICN(nvars, dom_size, param),
+    X, X_sols, global_iter=100, local_iter=100, metric=hamming, popSize=200
+)

Create an ICN, optimize it, and return its composition.

source

`,3))]),i("details",ms,[i("summary",null,[s[177]||(s[177]=i("a",{id:"CompositionalNetworks.manhattan-Tuple{Any, Any}-api-00_public",href:"#CompositionalNetworks.manhattan-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.manhattan")],-1)),s[178]||(s[178]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[179]||(s[179]=e('
julia
manhattan(x, X)

source

',2))]),i("details",bs,[i("summary",null,[s[180]||(s[180]=i("a",{id:"CompositionalNetworks.minkowski-Tuple{Any, Any, Any}-api-00_public",href:"#CompositionalNetworks.minkowski-Tuple{Any, Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.minkowski")],-1)),s[181]||(s[181]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[182]||(s[182]=e('
julia
minkowski(x, X, p)

source

',2))]),i("details",ys,[i("summary",null,[s[183]||(s[183]=i("a",{id:"CompositionalNetworks.nbits-Tuple{Any}-api-00_public",href:"#CompositionalNetworks.nbits-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.nbits")],-1)),s[184]||(s[184]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[185]||(s[185]=e('
julia
nbits(icn)

Return the expected number of bits of a viable weight of an ICN.

source

',3))]),i("details",Cs,[i("summary",null,[s[186]||(s[186]=i("a",{id:"CompositionalNetworks.regularization-Tuple{Any}-api-00_public",href:"#CompositionalNetworks.regularization-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.regularization")],-1)),s[187]||(s[187]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[188]||(s[188]=e('
julia
regularization(icn)

Return the regularization value of an ICN weights, which is proportional to the normalized number of operations selected in the icn layers.

source

',3))]),i("details",Es,[i("summary",null,[s[189]||(s[189]=i("a",{id:"CompositionalNetworks.show_layers-Tuple{Any}-api-00_public",href:"#CompositionalNetworks.show_layers-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.show_layers")],-1)),s[190]||(s[190]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[191]||(s[191]=e('
julia
show_layers(icn)

Return a formatted string with each layers in the icn.

source

',3))]),i("details",js,[i("summary",null,[s[192]||(s[192]=i("a",{id:"CompositionalNetworks.symbols-Tuple{Composition}-api-00_public",href:"#CompositionalNetworks.symbols-Tuple{Composition}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.symbols")],-1)),s[193]||(s[193]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[194]||(s[194]=e('
julia
symbols(c::Composition)

Output the composition as a layered collection of Symbols.

source

',3))]),i("details",vs,[i("summary",null,[s[195]||(s[195]=i("a",{id:"CompositionalNetworks.transformation_layer-api-00_public",href:"#CompositionalNetworks.transformation_layer-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.transformation_layer")],-1)),s[196]||(s[196]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[197]||(s[197]=e('
julia
transformation_layer(param = Vector{Symbol}())

Generate the layer of transformations functions of the ICN. Iff param value is non empty, also includes all the related parametric transformations.

source

',3))]),i("details",fs,[i("summary",null,[s[198]||(s[198]=i("a",{id:"CompositionalNetworks.weights!-Tuple{Any, Any}-api-00_public",href:"#CompositionalNetworks.weights!-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.weights!")],-1)),s[199]||(s[199]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[200]||(s[200]=e('
julia
weights!(icn, weights)

Set the weights of an ICN with a BitVector.

source

',3))]),i("details",Fs,[i("summary",null,[s[201]||(s[201]=i("a",{id:"CompositionalNetworks.weights-Tuple{Any}-api-00_public",href:"#CompositionalNetworks.weights-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.weights")],-1)),s[202]||(s[202]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[203]||(s[203]=e('
julia
weights(icn)

Access the current set of weights of an ICN.

source

',3))]),i("details",As,[i("summary",null,[s[204]||(s[204]=i("a",{id:"CompositionalNetworks.weights_bias-Tuple{Any}-api-00_public",href:"#CompositionalNetworks.weights_bias-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.weights_bias")],-1)),s[205]||(s[205]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[206]||(s[206]=e('
julia
weights_bias(x)

A metric that bias x towards operations with a lower bit. Do not affect the main metric.

source

',3))]),i("details",Ds,[i("summary",null,[s[207]||(s[207]=i("a",{id:"QUBOConstraints.QUBO_linear_sum-Tuple{Any, Any}-api-00_public",href:"#QUBOConstraints.QUBO_linear_sum-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"QUBOConstraints.QUBO_linear_sum")],-1)),s[208]||(s[208]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[209]||(s[209]=e('
julia
QUBO_linear_sum(n, σ)

One valid QUBO matrix given n variables and parameter σ for the linear sum constraint.

source

',3))]),i("details",Ts,[i("summary",null,[s[210]||(s[210]=i("a",{id:"QUBOConstraints.binarize-Union{Tuple{Vector{T}}, Tuple{T}, Tuple{Vector{T}, Any}} where T<:Number-api-00_public",href:"#QUBOConstraints.binarize-Union{Tuple{Vector{T}}, Tuple{T}, Tuple{Vector{T}, Any}} where T<:Number-api-00_public"},[i("span",{class:"jlbinding"},"QUBOConstraints.binarize")],-1)),s[211]||(s[211]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[212]||(s[212]=e('
julia
binarize(x[, domain]; binarization = :one_hot)

Binarize x following the binarization encoding. If x is a vector (instead of a number per say), domain is optional.

source

',3))]),i("details",xs,[i("summary",null,[s[213]||(s[213]=i("a",{id:"QUBOConstraints.debinarize-Tuple{Any}-api-00_public",href:"#QUBOConstraints.debinarize-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"QUBOConstraints.debinarize")],-1)),s[214]||(s[214]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[215]||(s[215]=e('
julia
debinarize(x[, domain]; binarization = :one_hot)

Transform a binary vector into a number or a set of number. If domain is not given, it will compute a default value based on binarization and x.

source

',3))]),i("details",Bs,[i("summary",null,[s[216]||(s[216]=i("a",{id:"QUBOConstraints.is_valid-api-00_public",href:"#QUBOConstraints.is_valid-api-00_public"},[i("span",{class:"jlbinding"},"QUBOConstraints.is_valid")],-1)),s[217]||(s[217]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[218]||(s[218]=e('
julia
is_valid(x, encoding::Symbol = :none)

Check if x has a valid format for encoding.

For instance, if encoding == :one_hot, at most one bit of x can be set to 1.

source

',4))]),i("details",ws,[i("summary",null,[s[219]||(s[219]=i("a",{id:"QUBOConstraints.train-Tuple-api-00_public",href:"#QUBOConstraints.train-Tuple-api-00_public"},[i("span",{class:"jlbinding"},"QUBOConstraints.train")],-1)),s[220]||(s[220]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[221]||(s[221]=e('
julia
train(args...)

Default train method for any AbstractOptimizer.

source

',3))])])}const Js=l(h,[["render",Ls]]);export{Us as __pageData,Js as default}; diff --git a/dev/assets/api_00_public.md.DIEIz3-7.lean.js b/dev/assets/api_00_public.md.DIEIz3-7.lean.js new file mode 100644 index 0000000..c606432 --- /dev/null +++ b/dev/assets/api_00_public.md.DIEIz3-7.lean.js @@ -0,0 +1,14 @@ +import{_ as l,c as o,j as i,a as t,G as n,a5 as e,B as p,o as r}from"./chunks/framework.CJakPlgM.js";const Us=JSON.parse('{"title":"Public API","description":"","frontmatter":{},"headers":[],"relativePath":"api/00_public.md","filePath":"api/00_public.md","lastUpdated":null}'),h={name:"api/00_public.md"},d={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""},L={class:"jldocstring custom-block",open:""},N={class:"jldocstring custom-block",open:""},_={class:"jldocstring custom-block",open:""},S={class:"jldocstring custom-block",open:""},M={class:"jldocstring custom-block",open:""},O={class:"jldocstring custom-block",open:""},I={class:"jldocstring custom-block",open:""},U={class:"jldocstring custom-block",open:""},J={class:"jldocstring custom-block",open:""},R={class:"jldocstring custom-block",open:""},z={class:"jldocstring custom-block",open:""},Q={class:"jldocstring custom-block",open:""},V={class:"jldocstring custom-block",open:""},P={class:"jldocstring custom-block",open:""},X={class:"jldocstring custom-block",open:""},G={class:"jldocstring custom-block",open:""},q={class:"jldocstring custom-block",open:""},Y={class:"jldocstring custom-block",open:""},$={class:"jldocstring custom-block",open:""},K={class:"jldocstring custom-block",open:""},W={class:"jldocstring custom-block",open:""},H={class:"jldocstring custom-block",open:""},Z={class:"jldocstring custom-block",open:""},ss={class:"jldocstring custom-block",open:""},is={class:"jldocstring custom-block",open:""},ts={class:"jldocstring custom-block",open:""},as={class:"jldocstring custom-block",open:""},ns={class:"jldocstring custom-block",open:""},es={class:"jldocstring custom-block",open:""},ls={class:"jldocstring custom-block",open:""},os={class:"jldocstring custom-block",open:""},ps={class:"jldocstring custom-block",open:""},rs={class:"jldocstring custom-block",open:""},hs={class:"jldocstring custom-block",open:""},ds={class:"jldocstring custom-block",open:""},ks={class:"jldocstring custom-block",open:""},cs={class:"jldocstring custom-block",open:""},us={class:"jldocstring custom-block",open:""},gs={class:"jldocstring custom-block",open:""},ms={class:"jldocstring custom-block",open:""},bs={class:"jldocstring custom-block",open:""},ys={class:"jldocstring custom-block",open:""},Cs={class:"jldocstring custom-block",open:""},Es={class:"jldocstring custom-block",open:""},js={class:"jldocstring custom-block",open:""},vs={class:"jldocstring custom-block",open:""},fs={class:"jldocstring custom-block",open:""},Fs={class:"jldocstring custom-block",open:""},As={class:"jldocstring custom-block",open:""},Ds={class:"jldocstring custom-block",open:""},Ts={class:"jldocstring custom-block",open:""},xs={class:"jldocstring custom-block",open:""},Bs={class:"jldocstring custom-block",open:""},ws={class:"jldocstring custom-block",open:""};function Ls(Ns,s,_s,Ss,Ms,Os){const a=p("Badge");return r(),o("div",null,[s[222]||(s[222]=i("h1",{id:"Public-API",tabindex:"-1"},[t("Public API "),i("a",{class:"header-anchor",href:"#Public-API","aria-label":'Permalink to "Public API {#Public-API}"'},"​")],-1)),i("details",d,[i("summary",null,[s[0]||(s[0]=i("a",{id:"ConstraintCommons.Automaton-api-00_public",href:"#ConstraintCommons.Automaton-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.Automaton")],-1)),s[1]||(s[1]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=e('
julia
Automaton{S, T, F <: Union{S, Vector{S}, Set{S}}} <: AbstractAutomaton

A minimal implementation of a deterministic automaton structure.

source

',3))]),i("details",k,[i("summary",null,[s[3]||(s[3]=i("a",{id:"ConstraintCommons.MDD-api-00_public",href:"#ConstraintCommons.MDD-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.MDD")],-1)),s[4]||(s[4]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[5]||(s[5]=e('
julia
MDD{S,T} <: AbstractMultivaluedDecisionDiagram

A minimal implementation of a multivalued decision diagram structure.

source

',3))]),i("details",c,[i("summary",null,[s[6]||(s[6]=i("a",{id:"ConstraintCommons.accept-Tuple{Automaton, Any}-api-00_public",href:"#ConstraintCommons.accept-Tuple{Automaton, Any}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.accept")],-1)),s[7]||(s[7]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[8]||(s[8]=e('
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

',3))]),i("details",u,[i("summary",null,[s[9]||(s[9]=i("a",{id:"ConstraintCommons.consin-Tuple{Any, Nothing}-api-00_public",href:"#ConstraintCommons.consin-Tuple{Any, Nothing}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.consin")],-1)),s[10]||(s[10]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[11]||(s[11]=e('
julia
consin(::Any, ::Nothing)

Extends Base.in (or ) when the set is nothing. Returns false.

source

',3))]),i("details",g,[i("summary",null,[s[12]||(s[12]=i("a",{id:"ConstraintCommons.consisempty-Tuple{Nothing}-api-00_public",href:"#ConstraintCommons.consisempty-Tuple{Nothing}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.consisempty")],-1)),s[13]||(s[13]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[14]||(s[14]=e('
julia
consisempty(::Nothing)

Extends Base.isempty when the set is nothing. Returns true.

source

',3))]),i("details",m,[i("summary",null,[s[15]||(s[15]=i("a",{id:"ConstraintCommons.extract_parameters-Tuple{Method}-api-00_public",href:"#ConstraintCommons.extract_parameters-Tuple{Method}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.extract_parameters")],-1)),s[16]||(s[16]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[17]||(s[17]=e('
julia
extract_parameters(m::Union{Method, Function}; parameters)

Extracts the intersection between the kargs of m and parameters (defaults to USUAL_CONSTRAINT_PARAMETERS).

source

',3))]),i("details",b,[i("summary",null,[s[18]||(s[18]=i("a",{id:"ConstraintCommons.incsert!-api-00_public",href:"#ConstraintCommons.incsert!-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.incsert!")],-1)),s[19]||(s[19]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[20]||(s[20]=e('
julia
incsert!(d::Union{AbstractDict, AbstractDictionary}, ind, val = 1)

Increase or insert a counter in a dictionary-based collection. The counter insertion defaults to val = 1.

source

',3))]),i("details",y,[i("summary",null,[s[21]||(s[21]=i("a",{id:"ConstraintCommons.oversample-Tuple{Any, Any}-api-00_public",href:"#ConstraintCommons.oversample-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.oversample")],-1)),s[22]||(s[22]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[23]||(s[23]=e('
julia
oversample(X, f)

Oversample elements of X until the boolean function f has as many true and false configurations.

source

',3))]),i("details",C,[i("summary",null,[s[24]||(s[24]=i("a",{id:"ConstraintCommons.symcon-api-00_public",href:"#ConstraintCommons.symcon-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.symcon")],-1)),s[25]||(s[25]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=e('
julia
symcon(s1::Symbol, s2::Symbol, connector::AbstractString="_")

Extends * to Symbols multiplication by connecting the symbols by an _.

source

',3))]),i("details",E,[i("summary",null,[s[27]||(s[27]=i("a",{id:"ConstraintCommons.δ_extrema-Tuple{Any}-api-00_public",href:"#ConstraintCommons.δ_extrema-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.δ_extrema")],-1)),s[28]||(s[28]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[29]||(s[29]=e('
julia
δ_extrema(X...)

Compute both the difference between the maximum and the minimum of over all the collections of X.

source

',3))]),i("details",j,[i("summary",null,[s[30]||(s[30]=i("a",{id:"ConstraintDomains.AbstractDomain-api-00_public",href:"#ConstraintDomains.AbstractDomain-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.AbstractDomain")],-1)),s[31]||(s[31]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[32]||(s[32]=e('
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

Additionally, if the domain is used in a dynamic context, it can extend

where args depends on D's structure

source

',7))]),i("details",v,[i("summary",null,[s[33]||(s[33]=i("a",{id:"ConstraintDomains.ContinuousDomain-api-00_public",href:"#ConstraintDomains.ContinuousDomain-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.ContinuousDomain")],-1)),s[34]||(s[34]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[35]||(s[35]=e('
julia
ContinuousDomain{T <: Real} <: AbstractDomain

An abstract supertype for all continuous domains.

source

',3))]),i("details",f,[i("summary",null,[s[36]||(s[36]=i("a",{id:"ConstraintDomains.DiscreteDomain-api-00_public",href:"#ConstraintDomains.DiscreteDomain-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.DiscreteDomain")],-1)),s[37]||(s[37]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[38]||(s[38]=e('
julia
DiscreteDomain{T <: Number} <: AbstractDomain

An abstract supertype for discrete domains (set, range).

source

',3))]),i("details",F,[i("summary",null,[s[39]||(s[39]=i("a",{id:"ConstraintDomains.ExploreSettings-Tuple{Any}-api-00_public",href:"#ConstraintDomains.ExploreSettings-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.ExploreSettings")],-1)),s[40]||(s[40]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[41]||(s[41]=e(`
julia
ExploreSettings(domains; 
+                complete_search_limit = 10^6, 
+                max_samplings = sum(domain_size, domains), 
+                search = :flexible, 
+                solutions_limit = floor(Int, sqrt(max_samplings)))

Create an ExploreSettings object to configure the exploration of a search space composed of a collection of domains.

Arguments

Returns

source

`,7))]),i("details",A,[i("summary",null,[s[42]||(s[42]=i("a",{id:"ConstraintDomains.RangeDomain-api-00_public",href:"#ConstraintDomains.RangeDomain-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.RangeDomain")],-1)),s[43]||(s[43]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[44]||(s[44]=e('
julia
RangeDomain

A discrete domain defined by a range <: AbstractRange{Real}. As ranges are immutable in Julia, changes in RangeDomain must use set_domain!.

source

',3))]),i("details",D,[i("summary",null,[s[45]||(s[45]=i("a",{id:"ConstraintDomains.SetDomain-api-00_public",href:"#ConstraintDomains.SetDomain-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.SetDomain")],-1)),s[46]||(s[46]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[47]||(s[47]=e('
julia
SetDomain{T <: Number} <: DiscreteDomain{T}

Domain that stores discrete values as a set of (unordered) points.

source

',3))]),i("details",T,[i("summary",null,[s[48]||(s[48]=i("a",{id:"Base.delete!-Tuple{SetDomain, Any}-api-00_public",href:"#Base.delete!-Tuple{SetDomain, Any}-api-00_public"},[i("span",{class:"jlbinding"},"Base.delete!")],-1)),s[49]||(s[49]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[50]||(s[50]=e('
julia
Base.delete!(d::SetDomain, value)(d::SetDomain, value)

Delete value from the list of points in d.

source

',3))]),i("details",x,[i("summary",null,[s[51]||(s[51]=i("a",{id:"ConstraintDomains.add!-Tuple{SetDomain, Any}-api-00_public",href:"#ConstraintDomains.add!-Tuple{SetDomain, Any}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.add!")],-1)),s[52]||(s[52]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[53]||(s[53]=e('
julia
add!(d::SetDomain, value)

Add value to the list of points in d.

source

',3))]),i("details",B,[i("summary",null,[s[54]||(s[54]=i("a",{id:"ConstraintDomains.domain-Tuple{Any}-api-00_public",href:"#ConstraintDomains.domain-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[55]||(s[55]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[56]||(s[56]=e(`
julia
domain(values)
+domain(range::R) where {T <: Real, R <: AbstractRange{T}}

Construct either a SetDomain or a RangeDomain.

julia
d1 = domain(1:5)
+d2 = domain([53.69, 89.2, 0.12])
+d3 = domain([2//3, 89//123])
+d4 = domain(4.3)
+d5 = domain(1,42,86.9)

source

`,4))]),i("details",w,[i("summary",null,[s[57]||(s[57]=i("a",{id:"ConstraintDomains.domain-Tuple{}-api-00_public",href:"#ConstraintDomains.domain-Tuple{}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[58]||(s[58]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[59]||(s[59]=e('
julia
domain()

Construct an EmptyDomain.

source

',3))]),i("details",L,[i("summary",null,[s[60]||(s[60]=i("a",{id:"ConstraintDomains.domain-Union{Tuple{Array{Intervals.Interval{T, L, R}, 1}}, Tuple{R}, Tuple{L}, Tuple{T}} where {T<:Real, L, R}-api-00_public",href:"#ConstraintDomains.domain-Union{Tuple{Array{Intervals.Interval{T, L, R}, 1}}, Tuple{R}, Tuple{L}, Tuple{T}} where {T<:Real, L, R}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[61]||(s[61]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[62]||(s[62]=e(`
julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

`,3))]),i("details",N,[i("summary",null,[s[63]||(s[63]=i("a",{id:"ConstraintDomains.domain_size-Tuple{ConstraintDomains.Intervals}-api-00_public",href:"#ConstraintDomains.domain_size-Tuple{ConstraintDomains.Intervals}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[64]||(s[64]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[65]||(s[65]=e('
julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

',3))]),i("details",_,[i("summary",null,[s[66]||(s[66]=i("a",{id:"ConstraintDomains.domain_size-Tuple{D} where D<:AbstractDomain-api-00_public",href:"#ConstraintDomains.domain_size-Tuple{D} where D<:AbstractDomain-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[67]||(s[67]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[68]||(s[68]=e('
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

',3))]),i("details",S,[i("summary",null,[s[69]||(s[69]=i("a",{id:"ConstraintDomains.domain_size-Tuple{D} where D<:DiscreteDomain-api-00_public",href:"#ConstraintDomains.domain_size-Tuple{D} where D<:DiscreteDomain-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[70]||(s[70]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[71]||(s[71]=e('
julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',3))]),i("details",M,[i("summary",null,[s[72]||(s[72]=i("a",{id:"ConstraintDomains.explore-Tuple{Any, Any}-api-00_public",href:"#ConstraintDomains.explore-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.explore")],-1)),s[73]||(s[73]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[74]||(s[74]=e('
julia
explore(domains, concept; settings = ExploreSettings(domains), parameters...)

Search (a part of) a search space and return a pair of vectors of configurations: (solutions, non_solutions). The exploration behavior is determined based on the settings.

Arguments

Returns

source

',7))]),i("details",O,[i("summary",null,[s[75]||(s[75]=i("a",{id:"ConstraintDomains.generate_parameters-Tuple{AbstractDomain, Symbol}-api-00_public",href:"#ConstraintDomains.generate_parameters-Tuple{AbstractDomain, Symbol}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.generate_parameters")],-1)),s[76]||(s[76]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[77]||(s[77]=e('
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source

',3))]),i("details",I,[i("summary",null,[s[78]||(s[78]=i("a",{id:"ConstraintDomains.get_domain-Tuple{D} where D<:AbstractDomain-api-00_public",href:"#ConstraintDomains.get_domain-Tuple{D} where D<:AbstractDomain-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.get_domain")],-1)),s[79]||(s[79]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[80]||(s[80]=e('
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

',3))]),i("details",U,[i("summary",null,[s[81]||(s[81]=i("a",{id:"ConstraintDomains.intersect_domains-Union{Tuple{I2}, Tuple{I1}, Tuple{I1, I2}} where {I1<:Intervals.Interval, I2<:Intervals.Interval}-api-00_public",href:"#ConstraintDomains.intersect_domains-Union{Tuple{I2}, Tuple{I1}, Tuple{I1, I2}} where {I1<:Intervals.Interval, I2<:Intervals.Interval}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains")],-1)),s[82]||(s[82]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[83]||(s[83]=e('
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

',3))]),i("details",J,[i("summary",null,[s[84]||(s[84]=i("a",{id:"ConstraintDomains.merge_domains-Tuple{RangeDomain, RangeDomain}-api-00_public",href:"#ConstraintDomains.merge_domains-Tuple{RangeDomain, RangeDomain}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.merge_domains")],-1)),s[85]||(s[85]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[86]||(s[86]=e('
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source

',3))]),i("details",R,[i("summary",null,[s[87]||(s[87]=i("a",{id:"ConstraintDomains.to_domains-Tuple{Vector{Int64}}-api-00_public",href:"#ConstraintDomains.to_domains-Tuple{Vector{Int64}}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.to_domains")],-1)),s[88]||(s[88]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[89]||(s[89]=e('
julia
to_domains(args...)

Convert various arguments into valid domains format.

source

',3))]),i("details",z,[i("summary",null,[s[90]||(s[90]=i("a",{id:"Constraints.USUAL_CONSTRAINTS-api-00_public",href:"#Constraints.USUAL_CONSTRAINTS-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.USUAL_CONSTRAINTS")],-1)),s[91]||(s[91]=t()),n(a,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[92]||(s[92]=e('
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source

',6))]),i("details",Q,[i("summary",null,[s[93]||(s[93]=i("a",{id:"Constraints.USUAL_SYMMETRIES-api-00_public",href:"#Constraints.USUAL_SYMMETRIES-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.USUAL_SYMMETRIES")],-1)),s[94]||(s[94]=t()),n(a,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[95]||(s[95]=e('
julia
USUAL_SYMMETRIES

A Dictionary that contains the function to apply for each symmetry to avoid searching a whole space.

source

',3))]),i("details",V,[i("summary",null,[s[96]||(s[96]=i("a",{id:"Constraints.Constraint-api-00_public",href:"#Constraints.Constraint-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.Constraint")],-1)),s[97]||(s[97]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[98]||(s[98]=e('
julia
Constraint

Parametric structure with the following fields.

source

',4))]),i("details",P,[i("summary",null,[s[99]||(s[99]=i("a",{id:"ConstraintCommons.extract_parameters-api-00_public",href:"#ConstraintCommons.extract_parameters-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.extract_parameters")],-1)),s[100]||(s[100]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[101]||(s[101]=e('
julia
extract_parameters(s::Symbol, constraints_dict=USUAL_CONSTRAINTS; parameters=ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS)

Return the parameters of the constraint s in constraints_dict.

Arguments

Example

julia
extract_parameters(:all_different)

source

',7))]),i("details",X,[i("summary",null,[s[102]||(s[102]=i("a",{id:"Constraints.args-Tuple{Constraint}-api-00_public",href:"#Constraints.args-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.args")],-1)),s[103]||(s[103]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[104]||(s[104]=e('
julia
args(c::Constraint)

Return the expected length restriction of the arguments in a constraint c. The value nothing indicates that any strictly positive number of value is accepted.

source

',3))]),i("details",G,[i("summary",null,[s[105]||(s[105]=i("a",{id:"Constraints.concept-Tuple{Constraint}-api-00_public",href:"#Constraints.concept-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[106]||(s[106]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[107]||(s[107]=e('
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source

',3))]),i("details",q,[i("summary",null,[s[108]||(s[108]=i("a",{id:"Constraints.concept-Tuple{Symbol, Vararg{Any}}-api-00_public",href:"#Constraints.concept-Tuple{Symbol, Vararg{Any}}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[109]||(s[109]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[110]||(s[110]=e('
julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

Example

julia
concept(:all_different, [1, 2, 3])

source

',7))]),i("details",Y,[i("summary",null,[s[111]||(s[111]=i("a",{id:"Constraints.constraints_descriptions-api-00_public",href:"#Constraints.constraints_descriptions-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.constraints_descriptions")],-1)),s[112]||(s[112]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[113]||(s[113]=e('
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

Example

julia
constraints_descriptions()

source

',7))]),i("details",$,[i("summary",null,[s[114]||(s[114]=i("a",{id:"Constraints.constraints_parameters-api-00_public",href:"#Constraints.constraints_parameters-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.constraints_parameters")],-1)),s[115]||(s[115]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[116]||(s[116]=e('
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

Example

julia
constraints_parameters()

source

',7))]),i("details",K,[i("summary",null,[s[117]||(s[117]=i("a",{id:"Constraints.describe-api-00_public",href:"#Constraints.describe-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.describe")],-1)),s[118]||(s[118]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[119]||(s[119]=e('
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

Example

julia
describe()

source

',7))]),i("details",W,[i("summary",null,[s[120]||(s[120]=i("a",{id:"Constraints.error_f-Tuple{Constraint}-api-00_public",href:"#Constraints.error_f-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.error_f")],-1)),s[121]||(s[121]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[122]||(s[122]=e('
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source

',3))]),i("details",H,[i("summary",null,[s[123]||(s[123]=i("a",{id:"Constraints.params_length-Tuple{Constraint}-api-00_public",href:"#Constraints.params_length-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.params_length")],-1)),s[124]||(s[124]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[125]||(s[125]=e('
julia
params_length(c::Constraint)

Return the expected length restriction of the arguments in a constraint c. The value nothing indicates that any strictly positive number of parameters is accepted.

source

',3))]),i("details",Z,[i("summary",null,[s[126]||(s[126]=i("a",{id:"Constraints.symmetries-Tuple{Constraint}-api-00_public",href:"#Constraints.symmetries-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.symmetries")],-1)),s[127]||(s[127]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[128]||(s[128]=e('
julia
symmetries(c::Constraint)

Return the list of symmetries of c.

source

',3))]),i("details",ss,[i("summary",null,[s[129]||(s[129]=i("a",{id:"CompositionalNetworks.Composition-Union{Tuple{F}, Tuple{F, Any}} where F<:Function-api-00_public",href:"#CompositionalNetworks.Composition-Union{Tuple{F}, Tuple{F, Any}} where F<:Function-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.Composition")],-1)),s[130]||(s[130]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[131]||(s[131]=e('
julia
Composition(f::F, symbols) where {F<:Function}

Construct a Composition.

source

',3))]),i("details",is,[i("summary",null,[s[132]||(s[132]=i("a",{id:"CompositionalNetworks.Composition-api-00_public",href:"#CompositionalNetworks.Composition-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.Composition")],-1)),s[133]||(s[133]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[134]||(s[134]=e('
julia
struct Composition{F<:Function}

Store the all the information of a composition learned by an ICN.

source

',3))]),i("details",ts,[i("summary",null,[s[135]||(s[135]=i("a",{id:"CompositionalNetworks.ICN-api-00_public",href:"#CompositionalNetworks.ICN-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.ICN")],-1)),s[136]||(s[136]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[137]||(s[137]=e('
julia
ICN(; nvars, dom_size, param, transformation, arithmetic, aggregation, comparison)

Construct an Interpretable Compositional Network, with the following arguments:

source

',4))]),i("details",as,[i("summary",null,[s[138]||(s[138]=i("a",{id:"CompositionalNetworks.aggregation_layer-Tuple{}-api-00_public",href:"#CompositionalNetworks.aggregation_layer-Tuple{}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.aggregation_layer")],-1)),s[139]||(s[139]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[140]||(s[140]=e('
julia
aggregation_layer()

Generate the layer of aggregations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source

',3))]),i("details",ns,[i("summary",null,[s[141]||(s[141]=i("a",{id:"CompositionalNetworks.arithmetic_layer-Tuple{}-api-00_public",href:"#CompositionalNetworks.arithmetic_layer-Tuple{}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.arithmetic_layer")],-1)),s[142]||(s[142]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[143]||(s[143]=e('
julia
arithmetic_layer()

Generate the layer of arithmetic operations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source

',3))]),i("details",es,[i("summary",null,[s[144]||(s[144]=i("a",{id:"CompositionalNetworks.code-api-00_public",href:"#CompositionalNetworks.code-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.code")],-1)),s[145]||(s[145]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[146]||(s[146]=e('
julia
code(c::Composition, lang=:maths; name="composition")

Access the code of a composition c in a given language lang. The name of the generated method is optional.

source

',3))]),i("details",ls,[i("summary",null,[s[147]||(s[147]=i("a",{id:"CompositionalNetworks.comparison_layer-api-00_public",href:"#CompositionalNetworks.comparison_layer-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.comparison_layer")],-1)),s[148]||(s[148]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[149]||(s[149]=e('
julia
comparison_layer(param = false)

Generate the layer of transformations functions of the ICN. Iff param value is set, also includes all the parametric comparison with that value. The operations are mutually exclusive, that is only one will be selected.

source

',3))]),i("details",os,[i("summary",null,[s[150]||(s[150]=i("a",{id:"CompositionalNetworks.compose-api-00_public",href:"#CompositionalNetworks.compose-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.compose")],-1)),s[151]||(s[151]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[152]||(s[152]=e('
julia
compose(icn, weights=nothing)

Return a function composed by some of the operations of a given ICN. Can be applied to any vector of variables. If weights are given, will assign to icn.

source

',3))]),i("details",ps,[i("summary",null,[s[153]||(s[153]=i("a",{id:"CompositionalNetworks.compose_to_file!-Tuple{Any, Any, Any}-api-00_public",href:"#CompositionalNetworks.compose_to_file!-Tuple{Any, Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.compose_to_file!")],-1)),s[154]||(s[154]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[155]||(s[155]=e('
julia
compose_to_file!(concept, name, path; domains, param = nothing, language = :Julia, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200)

Explore, learn and compose a function and write it to a file.

Arguments:

Keywords arguments:

source

',7))]),i("details",rs,[i("summary",null,[s[156]||(s[156]=i("a",{id:"CompositionalNetworks.composition-Tuple{Composition}-api-00_public",href:"#CompositionalNetworks.composition-Tuple{Composition}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.composition")],-1)),s[157]||(s[157]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[158]||(s[158]=e('
julia
composition(c::Composition)

Access the actual method of an ICN composition c.

source

',3))]),i("details",hs,[i("summary",null,[s[159]||(s[159]=i("a",{id:"CompositionalNetworks.composition_to_file!-api-00_public",href:"#CompositionalNetworks.composition_to_file!-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.composition_to_file!")],-1)),s[160]||(s[160]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[161]||(s[161]=e('
julia
composition_to_file!(c::Composition, path, name, language=:Julia)

Write the composition code in a given language into a file at path.

source

',3))]),i("details",ds,[i("summary",null,[s[162]||(s[162]=i("a",{id:"CompositionalNetworks.explore_learn_compose-Tuple{Any, Any}-api-00_public",href:"#CompositionalNetworks.explore_learn_compose-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.explore_learn_compose")],-1)),s[163]||(s[163]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[164]||(s[164]=e('
julia
explore_learn_compose(concept; domains, param = nothing, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200, action = :composition)

Explore a search space, learn a composition from an ICN, and compose an error function.

Arguments:

source

',5))]),i("details",ks,[i("summary",null,[s[165]||(s[165]=i("a",{id:"CompositionalNetworks.hamming-Tuple{Any, Any}-api-00_public",href:"#CompositionalNetworks.hamming-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.hamming")],-1)),s[166]||(s[166]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[167]||(s[167]=e('
julia
hamming(x, X)

Compute the hamming distance of x over a collection of solutions X, i.e. the minimal number of variables to switch in xto reach a solution.

source

',3))]),i("details",cs,[i("summary",null,[s[168]||(s[168]=i("a",{id:"CompositionalNetworks.lazy-Tuple{Vararg{Function}}-api-00_public",href:"#CompositionalNetworks.lazy-Tuple{Vararg{Function}}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.lazy")],-1)),s[169]||(s[169]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[170]||(s[170]=e('
julia
lazy(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V).

source

',3))]),i("details",us,[i("summary",null,[s[171]||(s[171]=i("a",{id:"CompositionalNetworks.lazy_param-Tuple{Vararg{Function}}-api-00_public",href:"#CompositionalNetworks.lazy_param-Tuple{Vararg{Function}}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.lazy_param")],-1)),s[172]||(s[172]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[173]||(s[173]=e('
julia
lazy_param(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V; param).

source

',3))]),i("details",gs,[i("summary",null,[s[174]||(s[174]=i("a",{id:"CompositionalNetworks.learn_compose-Tuple{Any, Any, Any}-api-00_public",href:"#CompositionalNetworks.learn_compose-Tuple{Any, Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.learn_compose")],-1)),s[175]||(s[175]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[176]||(s[176]=e(`
julia
learn_compose(;
+    nvars, dom_size, param=nothing, icn=ICN(nvars, dom_size, param),
+    X, X_sols, global_iter=100, local_iter=100, metric=hamming, popSize=200
+)

Create an ICN, optimize it, and return its composition.

source

`,3))]),i("details",ms,[i("summary",null,[s[177]||(s[177]=i("a",{id:"CompositionalNetworks.manhattan-Tuple{Any, Any}-api-00_public",href:"#CompositionalNetworks.manhattan-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.manhattan")],-1)),s[178]||(s[178]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[179]||(s[179]=e('
julia
manhattan(x, X)

source

',2))]),i("details",bs,[i("summary",null,[s[180]||(s[180]=i("a",{id:"CompositionalNetworks.minkowski-Tuple{Any, Any, Any}-api-00_public",href:"#CompositionalNetworks.minkowski-Tuple{Any, Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.minkowski")],-1)),s[181]||(s[181]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[182]||(s[182]=e('
julia
minkowski(x, X, p)

source

',2))]),i("details",ys,[i("summary",null,[s[183]||(s[183]=i("a",{id:"CompositionalNetworks.nbits-Tuple{Any}-api-00_public",href:"#CompositionalNetworks.nbits-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.nbits")],-1)),s[184]||(s[184]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[185]||(s[185]=e('
julia
nbits(icn)

Return the expected number of bits of a viable weight of an ICN.

source

',3))]),i("details",Cs,[i("summary",null,[s[186]||(s[186]=i("a",{id:"CompositionalNetworks.regularization-Tuple{Any}-api-00_public",href:"#CompositionalNetworks.regularization-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.regularization")],-1)),s[187]||(s[187]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[188]||(s[188]=e('
julia
regularization(icn)

Return the regularization value of an ICN weights, which is proportional to the normalized number of operations selected in the icn layers.

source

',3))]),i("details",Es,[i("summary",null,[s[189]||(s[189]=i("a",{id:"CompositionalNetworks.show_layers-Tuple{Any}-api-00_public",href:"#CompositionalNetworks.show_layers-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.show_layers")],-1)),s[190]||(s[190]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[191]||(s[191]=e('
julia
show_layers(icn)

Return a formatted string with each layers in the icn.

source

',3))]),i("details",js,[i("summary",null,[s[192]||(s[192]=i("a",{id:"CompositionalNetworks.symbols-Tuple{Composition}-api-00_public",href:"#CompositionalNetworks.symbols-Tuple{Composition}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.symbols")],-1)),s[193]||(s[193]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[194]||(s[194]=e('
julia
symbols(c::Composition)

Output the composition as a layered collection of Symbols.

source

',3))]),i("details",vs,[i("summary",null,[s[195]||(s[195]=i("a",{id:"CompositionalNetworks.transformation_layer-api-00_public",href:"#CompositionalNetworks.transformation_layer-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.transformation_layer")],-1)),s[196]||(s[196]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[197]||(s[197]=e('
julia
transformation_layer(param = Vector{Symbol}())

Generate the layer of transformations functions of the ICN. Iff param value is non empty, also includes all the related parametric transformations.

source

',3))]),i("details",fs,[i("summary",null,[s[198]||(s[198]=i("a",{id:"CompositionalNetworks.weights!-Tuple{Any, Any}-api-00_public",href:"#CompositionalNetworks.weights!-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.weights!")],-1)),s[199]||(s[199]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[200]||(s[200]=e('
julia
weights!(icn, weights)

Set the weights of an ICN with a BitVector.

source

',3))]),i("details",Fs,[i("summary",null,[s[201]||(s[201]=i("a",{id:"CompositionalNetworks.weights-Tuple{Any}-api-00_public",href:"#CompositionalNetworks.weights-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.weights")],-1)),s[202]||(s[202]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[203]||(s[203]=e('
julia
weights(icn)

Access the current set of weights of an ICN.

source

',3))]),i("details",As,[i("summary",null,[s[204]||(s[204]=i("a",{id:"CompositionalNetworks.weights_bias-Tuple{Any}-api-00_public",href:"#CompositionalNetworks.weights_bias-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.weights_bias")],-1)),s[205]||(s[205]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[206]||(s[206]=e('
julia
weights_bias(x)

A metric that bias x towards operations with a lower bit. Do not affect the main metric.

source

',3))]),i("details",Ds,[i("summary",null,[s[207]||(s[207]=i("a",{id:"QUBOConstraints.QUBO_linear_sum-Tuple{Any, Any}-api-00_public",href:"#QUBOConstraints.QUBO_linear_sum-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"QUBOConstraints.QUBO_linear_sum")],-1)),s[208]||(s[208]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[209]||(s[209]=e('
julia
QUBO_linear_sum(n, σ)

One valid QUBO matrix given n variables and parameter σ for the linear sum constraint.

source

',3))]),i("details",Ts,[i("summary",null,[s[210]||(s[210]=i("a",{id:"QUBOConstraints.binarize-Union{Tuple{Vector{T}}, Tuple{T}, Tuple{Vector{T}, Any}} where T<:Number-api-00_public",href:"#QUBOConstraints.binarize-Union{Tuple{Vector{T}}, Tuple{T}, Tuple{Vector{T}, Any}} where T<:Number-api-00_public"},[i("span",{class:"jlbinding"},"QUBOConstraints.binarize")],-1)),s[211]||(s[211]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[212]||(s[212]=e('
julia
binarize(x[, domain]; binarization = :one_hot)

Binarize x following the binarization encoding. If x is a vector (instead of a number per say), domain is optional.

source

',3))]),i("details",xs,[i("summary",null,[s[213]||(s[213]=i("a",{id:"QUBOConstraints.debinarize-Tuple{Any}-api-00_public",href:"#QUBOConstraints.debinarize-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"QUBOConstraints.debinarize")],-1)),s[214]||(s[214]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[215]||(s[215]=e('
julia
debinarize(x[, domain]; binarization = :one_hot)

Transform a binary vector into a number or a set of number. If domain is not given, it will compute a default value based on binarization and x.

source

',3))]),i("details",Bs,[i("summary",null,[s[216]||(s[216]=i("a",{id:"QUBOConstraints.is_valid-api-00_public",href:"#QUBOConstraints.is_valid-api-00_public"},[i("span",{class:"jlbinding"},"QUBOConstraints.is_valid")],-1)),s[217]||(s[217]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[218]||(s[218]=e('
julia
is_valid(x, encoding::Symbol = :none)

Check if x has a valid format for encoding.

For instance, if encoding == :one_hot, at most one bit of x can be set to 1.

source

',4))]),i("details",ws,[i("summary",null,[s[219]||(s[219]=i("a",{id:"QUBOConstraints.train-Tuple-api-00_public",href:"#QUBOConstraints.train-Tuple-api-00_public"},[i("span",{class:"jlbinding"},"QUBOConstraints.train")],-1)),s[220]||(s[220]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[221]||(s[221]=e('
julia
train(args...)

Default train method for any AbstractOptimizer.

source

',3))])])}const Js=l(h,[["render",Ls]]);export{Us as __pageData,Js as default}; diff --git a/dev/assets/api_10_full.md.hyJT-s4-.js b/dev/assets/api_10_full.md.CIhTEgrP.js similarity index 52% rename from dev/assets/api_10_full.md.hyJT-s4-.js rename to dev/assets/api_10_full.md.CIhTEgrP.js index 9ff538c..94979ef 100644 --- a/dev/assets/api_10_full.md.hyJT-s4-.js +++ b/dev/assets/api_10_full.md.CIhTEgrP.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.CBLuZwrP.js";const E=JSON.parse('{"title":"Full API","description":"","frontmatter":{},"headers":[],"relativePath":"api/10_full.md","filePath":"api/10_full.md","lastUpdated":null}'),e={name:"api/10_full.md"},n=t(`

Full API

# ConstraintCommons.USUAL_CONSTRAINT_PARAMETERSConstant.
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
+import{_ as e,c as p,j as i,a,G as n,a5 as l,B as h,o as k}from"./chunks/framework.CJakPlgM.js";const qa=JSON.parse('{"title":"Full API","description":"","frontmatter":{},"headers":[],"relativePath":"api/10_full.md","filePath":"api/10_full.md","lastUpdated":null}'),o={name:"api/10_full.md"},r={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""},_={class:"jldocstring custom-block",open:""},L={class:"jldocstring custom-block",open:""},N={class:"jldocstring custom-block",open:""},M={class:"jldocstring custom-block",open:""},O={class:"jldocstring custom-block",open:""},I={class:"jldocstring custom-block",open:""},J={class:"jldocstring custom-block",open:""},S={class:"jldocstring custom-block",open:""},R={class:"jldocstring custom-block",open:""},U={class:"jldocstring custom-block",open:""},V={class:"jldocstring custom-block",open:""},z={class:"jldocstring custom-block",open:""},q={class:"jldocstring custom-block",open:""},P={class:"jldocstring custom-block",open:""},X={class:"jldocstring custom-block",open:""},G={class:"jldocstring custom-block",open:""},Q={class:"jldocstring custom-block",open:""},W={class:"jldocstring custom-block",open:""},Y={class:"jldocstring custom-block",open:""},$={class:"jldocstring custom-block",open:""},K={class:"jldocstring custom-block",open:""},H={class:"jldocstring custom-block",open:""},Z={class:"jldocstring custom-block",open:""},ss={class:"jldocstring custom-block",open:""},is={class:"jldocstring custom-block",open:""},as={class:"jldocstring custom-block",open:""},ts={class:"jldocstring custom-block",open:""},ns={class:"jldocstring custom-block",open:""},ls={class:"jldocstring custom-block",open:""},es={class:"jldocstring custom-block",open:""},ps={class:"jldocstring custom-block",open:""},hs={class:"jldocstring custom-block",open:""},ks={class:"jldocstring custom-block",open:""},os={class:"jldocstring custom-block",open:""},rs={class:"jldocstring custom-block",open:""},ds={class:"jldocstring custom-block",open:""},gs={class:"jldocstring custom-block",open:""},Es={class:"jldocstring custom-block",open:""},cs={class:"jldocstring custom-block",open:""},ys={class:"jldocstring custom-block",open:""},us={class:"jldocstring custom-block",open:""},Cs={class:"jldocstring custom-block",open:""},ms={class:"jldocstring custom-block",open:""},Fs={class:"jldocstring custom-block",open:""},bs={class:"jldocstring custom-block",open:""},vs={class:"jldocstring custom-block",open:""},js={class:"jldocstring custom-block",open:""},fs={class:"jldocstring custom-block",open:""},Bs={class:"jldocstring custom-block",open:""},As={class:"jldocstring custom-block",open:""},xs={class:"jldocstring custom-block",open:""},Ds={class:"jldocstring custom-block",open:""},Ts={class:"jldocstring custom-block",open:""},ws={class:"jldocstring custom-block",open:""},_s={class:"jldocstring custom-block",open:""},Ls={class:"jldocstring custom-block",open:""},Ns={class:"jldocstring custom-block",open:""},Ms={class:"jldocstring custom-block",open:""},Os={class:"jldocstring custom-block",open:""},Is={class:"jldocstring custom-block",open:""},Js={class:"jldocstring custom-block",open:""},Ss={class:"jldocstring custom-block",open:""},Rs={class:"jldocstring custom-block",open:""},Us={class:"jldocstring custom-block",open:""},Vs={class:"jldocstring custom-block",open:""},zs={class:"jldocstring custom-block",open:""},qs={class:"jldocstring custom-block",open:""},Ps={class:"jldocstring custom-block",open:""},Xs={class:"jldocstring custom-block",open:""},Gs={class:"jldocstring custom-block",open:""},Qs={class:"jldocstring custom-block",open:""},Ws={class:"jldocstring custom-block",open:""},Ys={class:"jldocstring custom-block",open:""},$s={class:"jldocstring custom-block",open:""},Ks={class:"jldocstring custom-block",open:""},Hs={class:"jldocstring custom-block",open:""},Zs={class:"jldocstring custom-block",open:""},si={class:"jldocstring custom-block",open:""},ii={class:"jldocstring custom-block",open:""},ai={class:"jldocstring custom-block",open:""},ti={class:"jldocstring custom-block",open:""},ni={class:"jldocstring custom-block",open:""},li={class:"jldocstring custom-block",open:""},ei={class:"jldocstring custom-block",open:""},pi={class:"jldocstring custom-block",open:""},hi={class:"jldocstring custom-block",open:""},ki={class:"jldocstring custom-block",open:""},oi={class:"jldocstring custom-block",open:""},ri={class:"jldocstring custom-block",open:""},di={class:"jldocstring custom-block",open:""},gi={class:"jldocstring custom-block",open:""},Ei={class:"jldocstring custom-block",open:""},ci={class:"jldocstring custom-block",open:""},yi={class:"jldocstring custom-block",open:""},ui={class:"jldocstring custom-block",open:""},Ci={class:"jldocstring custom-block",open:""},mi={class:"jldocstring custom-block",open:""},Fi={class:"jldocstring custom-block",open:""},bi={class:"jldocstring custom-block",open:""},vi={class:"jldocstring custom-block",open:""},ji={class:"jldocstring custom-block",open:""},fi={class:"jldocstring custom-block",open:""},Bi={class:"jldocstring custom-block",open:""},Ai={class:"jldocstring custom-block",open:""},xi={class:"jldocstring custom-block",open:""},Di={class:"jldocstring custom-block",open:""},Ti={class:"jldocstring custom-block",open:""},wi={class:"jldocstring custom-block",open:""},_i={class:"jldocstring custom-block",open:""},Li={class:"jldocstring custom-block",open:""},Ni={class:"jldocstring custom-block",open:""},Mi={class:"jldocstring custom-block",open:""},Oi={class:"jldocstring custom-block",open:""},Ii={class:"jldocstring custom-block",open:""},Ji={class:"jldocstring custom-block",open:""},Si={class:"jldocstring custom-block",open:""},Ri={class:"jldocstring custom-block",open:""},Ui={class:"jldocstring custom-block",open:""},Vi={class:"jldocstring custom-block",open:""},zi={class:"jldocstring custom-block",open:""},qi={class:"jldocstring custom-block",open:""},Pi={class:"jldocstring custom-block",open:""},Xi={class:"jldocstring custom-block",open:""},Gi={class:"jldocstring custom-block",open:""},Qi={class:"jldocstring custom-block",open:""},Wi={class:"jldocstring custom-block",open:""},Yi={class:"jldocstring custom-block",open:""},$i={class:"jldocstring custom-block",open:""},Ki={class:"jldocstring custom-block",open:""},Hi={class:"jldocstring custom-block",open:""},Zi={class:"jldocstring custom-block",open:""},sa={class:"jldocstring custom-block",open:""},ia={class:"jldocstring custom-block",open:""},aa={class:"jldocstring custom-block",open:""},ta={class:"jldocstring custom-block",open:""},na={class:"jldocstring custom-block",open:""},la={class:"jldocstring custom-block",open:""},ea={class:"jldocstring custom-block",open:""},pa={class:"jldocstring custom-block",open:""},ha={class:"jldocstring custom-block",open:""},ka={class:"jldocstring custom-block",open:""},oa={class:"jldocstring custom-block",open:""},ra={class:"jldocstring custom-block",open:""},da={class:"jldocstring custom-block",open:""},ga={class:"jldocstring custom-block",open:""},Ea={class:"jldocstring custom-block",open:""},ca={class:"jldocstring custom-block",open:""},ya={class:"jldocstring custom-block",open:""},ua={class:"jldocstring custom-block",open:""},Ca={class:"jldocstring custom-block",open:""},ma={class:"jldocstring custom-block",open:""},Fa={class:"jldocstring custom-block",open:""},ba={class:"jldocstring custom-block",open:""},va={class:"jldocstring custom-block",open:""},ja={class:"jldocstring custom-block",open:""},fa={class:"jldocstring custom-block",open:""},Ba={class:"jldocstring custom-block",open:""},Aa={class:"jldocstring custom-block",open:""},xa={class:"jldocstring custom-block",open:""},Da={class:"jldocstring custom-block",open:""},Ta={class:"jldocstring custom-block",open:""},wa={class:"jldocstring custom-block",open:""},_a={class:"jldocstring custom-block",open:""},La={class:"jldocstring custom-block",open:""},Na={class:"jldocstring custom-block",open:""},Ma={class:"jldocstring custom-block",open:""},Oa={class:"jldocstring custom-block",open:""};function Ia(Ja,s,Sa,Ra,Ua,Va){const t=h("Badge");return k(),p("div",null,[s[561]||(s[561]=i("h1",{id:"Full-API",tabindex:"-1"},[a("Full API "),i("a",{class:"header-anchor",href:"#Full-API","aria-label":'Permalink to "Full API {#Full-API}"'},"​")],-1)),i("details",r,[i("summary",null,[s[0]||(s[0]=i("a",{id:"ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS",href:"#ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS"},[i("span",{class:"jlbinding"},"ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS")],-1)),s[1]||(s[1]=a()),n(t,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[2]||(s[2]=l(`
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
     :bool, # boolean parameter
     :dim, # dimension, an integer parameter used along the pair_vars or vals parameters
     :id, # index to target one variable in the input vector
@@ -7,27 +7,27 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.CBLuZwrP.js";const E
     :pair_vars, # a list of parameters that are paired with each variable in the input vector
     :val, # one scalar value
     :vals, # a list of scalar values (independent of the input vector size)
-]

source


# ConstraintCommons.AbstractAutomatonType.
julia
AbstractAutomaton

An abstract interface for automata used in Julia Constraints packages. Requirements:

  • accept(a<:AbstractAutomaton, word): return true if a accepts word.

source


# ConstraintCommons.AbstractMultivaluedDecisionDiagramType.
julia
AbstractMultivaluedDecisionDiagram

An abstract interface for Multivalued Decision Diagrams (MDD) used in Julia Constraints packages. Requirements:

  • accept(a<:AbstractMultivaluedDecisionDiagram, word): return true if a accepts word.

source


# ConstraintCommons.AutomatonType.
julia
Automaton{S, T, F <: Union{S, Vector{S}, Set{S}}} <: AbstractAutomaton

A minimal implementation of a deterministic automaton structure.

source


# ConstraintCommons.MDDType.
julia
MDD{S,T} <: AbstractMultivaluedDecisionDiagram

A minimal implementation of a multivalued decision diagram structure.

source


# ConstraintCommons.acceptMethod.
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source


# ConstraintCommons.at_endMethod.
julia
at_end(a::Automaton, s)

Internal method used by accept with Automaton.

source


# ConstraintCommons.consinMethod.
julia
consin(::Any, ::Nothing)

Extends Base.in (or ) when the set is nothing. Returns false.

source


# ConstraintCommons.consisemptyMethod.
julia
consisempty(::Nothing)

Extends Base.isempty when the set is nothing. Returns true.

source


# ConstraintCommons.extract_parametersMethod.
julia
extract_parameters(m::Union{Method, Function}; parameters)

Extracts the intersection between the kargs of m and parameters (defaults to USUAL_CONSTRAINT_PARAMETERS).

source


# ConstraintCommons.incsert!Function.
julia
incsert!(d::Union{AbstractDict, AbstractDictionary}, ind, val = 1)

Increase or insert a counter in a dictionary-based collection. The counter insertion defaults to val = 1.

source


# ConstraintCommons.oversampleMethod.
julia
oversample(X, f)

Oversample elements of X until the boolean function f has as many true and false configurations.

source


# ConstraintCommons.symconFunction.
julia
symcon(s1::Symbol, s2::Symbol, connector::AbstractString="_")

Extends * to Symbols multiplication by connecting the symbols by an _.

source


# ConstraintCommons.δ_extremaMethod.
julia
δ_extrema(X...)

Compute both the difference between the maximum and the minimum of over all the collections of X.

source


# ConstraintDomains.AbstractDomainType.
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

  • Base.∈(val, ::D)

  • Base.rand(::D)

  • Base.length(::D) that is the number of elements in a discrete domain, and the distance between bounds or similar for a continuous domain

Additionally, if the domain is used in a dynamic context, it can extend

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source


# ConstraintDomains.BoolParameterDomainType.
julia
BoolParameterDomain <: AbstractDomain

A domain to store boolean values. It is used to generate random parameters.

source


# ConstraintDomains.ContinuousDomainType.
julia
ContinuousDomain{T <: Real} <: AbstractDomain

An abstract supertype for all continuous domains.

source


# ConstraintDomains.DimParameterDomainType.
julia
DimParameterDomain <: AbstractDomain

A domain to store dimensions. It is used to generate random parameters.

source


# ConstraintDomains.DiscreteDomainType.
julia
DiscreteDomain{T <: Number} <: AbstractDomain

An abstract supertype for discrete domains (set, range).

source


# ConstraintDomains.EmptyDomainType.
julia
EmptyDomain

A struct to handle yet to be defined domains.

source


# ConstraintDomains.ExploreSettingsMethod.
julia
ExploreSettings(domains; 
+]

source

`,4))]),i("details",d,[i("summary",null,[s[3]||(s[3]=i("a",{id:"ConstraintCommons.AbstractAutomaton",href:"#ConstraintCommons.AbstractAutomaton"},[i("span",{class:"jlbinding"},"ConstraintCommons.AbstractAutomaton")],-1)),s[4]||(s[4]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[5]||(s[5]=l('
julia
AbstractAutomaton

An abstract interface for automata used in Julia Constraints packages. Requirements:

  • accept(a<:AbstractAutomaton, word): return true if a accepts word.

source

',4))]),i("details",g,[i("summary",null,[s[6]||(s[6]=i("a",{id:"ConstraintCommons.AbstractMultivaluedDecisionDiagram",href:"#ConstraintCommons.AbstractMultivaluedDecisionDiagram"},[i("span",{class:"jlbinding"},"ConstraintCommons.AbstractMultivaluedDecisionDiagram")],-1)),s[7]||(s[7]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[8]||(s[8]=l('
julia
AbstractMultivaluedDecisionDiagram

An abstract interface for Multivalued Decision Diagrams (MDD) used in Julia Constraints packages. Requirements:

  • accept(a<:AbstractMultivaluedDecisionDiagram, word): return true if a accepts word.

source

',4))]),i("details",E,[i("summary",null,[s[9]||(s[9]=i("a",{id:"ConstraintCommons.Automaton",href:"#ConstraintCommons.Automaton"},[i("span",{class:"jlbinding"},"ConstraintCommons.Automaton")],-1)),s[10]||(s[10]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[11]||(s[11]=l('
julia
Automaton{S, T, F <: Union{S, Vector{S}, Set{S}}} <: AbstractAutomaton

A minimal implementation of a deterministic automaton structure.

source

',3))]),i("details",c,[i("summary",null,[s[12]||(s[12]=i("a",{id:"ConstraintCommons.MDD",href:"#ConstraintCommons.MDD"},[i("span",{class:"jlbinding"},"ConstraintCommons.MDD")],-1)),s[13]||(s[13]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[14]||(s[14]=l('
julia
MDD{S,T} <: AbstractMultivaluedDecisionDiagram

A minimal implementation of a multivalued decision diagram structure.

source

',3))]),i("details",y,[i("summary",null,[s[15]||(s[15]=i("a",{id:"ConstraintCommons.accept-Tuple{Automaton, Any}",href:"#ConstraintCommons.accept-Tuple{Automaton, Any}"},[i("span",{class:"jlbinding"},"ConstraintCommons.accept")],-1)),s[16]||(s[16]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[17]||(s[17]=l('
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

',3))]),i("details",u,[i("summary",null,[s[18]||(s[18]=i("a",{id:"ConstraintCommons.at_end-Union{Tuple{T}, Tuple{S}, Tuple{Automaton{S, T, S}, Any}} where {S, T}",href:"#ConstraintCommons.at_end-Union{Tuple{T}, Tuple{S}, Tuple{Automaton{S, T, S}, Any}} where {S, T}"},[i("span",{class:"jlbinding"},"ConstraintCommons.at_end")],-1)),s[19]||(s[19]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[20]||(s[20]=l('
julia
at_end(a::Automaton, s)

Internal method used by accept with Automaton.

source

',3))]),i("details",C,[i("summary",null,[s[21]||(s[21]=i("a",{id:"ConstraintCommons.consin-Tuple{Any, Nothing}",href:"#ConstraintCommons.consin-Tuple{Any, Nothing}"},[i("span",{class:"jlbinding"},"ConstraintCommons.consin")],-1)),s[22]||(s[22]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[23]||(s[23]=l('
julia
consin(::Any, ::Nothing)

Extends Base.in (or ) when the set is nothing. Returns false.

source

',3))]),i("details",m,[i("summary",null,[s[24]||(s[24]=i("a",{id:"ConstraintCommons.consisempty-Tuple{Nothing}",href:"#ConstraintCommons.consisempty-Tuple{Nothing}"},[i("span",{class:"jlbinding"},"ConstraintCommons.consisempty")],-1)),s[25]||(s[25]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[26]||(s[26]=l('
julia
consisempty(::Nothing)

Extends Base.isempty when the set is nothing. Returns true.

source

',3))]),i("details",F,[i("summary",null,[s[27]||(s[27]=i("a",{id:"ConstraintCommons.extract_parameters-Tuple{Method}",href:"#ConstraintCommons.extract_parameters-Tuple{Method}"},[i("span",{class:"jlbinding"},"ConstraintCommons.extract_parameters")],-1)),s[28]||(s[28]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[29]||(s[29]=l('
julia
extract_parameters(m::Union{Method, Function}; parameters)

Extracts the intersection between the kargs of m and parameters (defaults to USUAL_CONSTRAINT_PARAMETERS).

source

',3))]),i("details",b,[i("summary",null,[s[30]||(s[30]=i("a",{id:"ConstraintCommons.incsert!",href:"#ConstraintCommons.incsert!"},[i("span",{class:"jlbinding"},"ConstraintCommons.incsert!")],-1)),s[31]||(s[31]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[32]||(s[32]=l('
julia
incsert!(d::Union{AbstractDict, AbstractDictionary}, ind, val = 1)

Increase or insert a counter in a dictionary-based collection. The counter insertion defaults to val = 1.

source

',3))]),i("details",v,[i("summary",null,[s[33]||(s[33]=i("a",{id:"ConstraintCommons.oversample-Tuple{Any, Any}",href:"#ConstraintCommons.oversample-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"ConstraintCommons.oversample")],-1)),s[34]||(s[34]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[35]||(s[35]=l('
julia
oversample(X, f)

Oversample elements of X until the boolean function f has as many true and false configurations.

source

',3))]),i("details",j,[i("summary",null,[s[36]||(s[36]=i("a",{id:"ConstraintCommons.symcon",href:"#ConstraintCommons.symcon"},[i("span",{class:"jlbinding"},"ConstraintCommons.symcon")],-1)),s[37]||(s[37]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[38]||(s[38]=l('
julia
symcon(s1::Symbol, s2::Symbol, connector::AbstractString="_")

Extends * to Symbols multiplication by connecting the symbols by an _.

source

',3))]),i("details",f,[i("summary",null,[s[39]||(s[39]=i("a",{id:"ConstraintCommons.δ_extrema-Tuple{Any}",href:"#ConstraintCommons.δ_extrema-Tuple{Any}"},[i("span",{class:"jlbinding"},"ConstraintCommons.δ_extrema")],-1)),s[40]||(s[40]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[41]||(s[41]=l('
julia
δ_extrema(X...)

Compute both the difference between the maximum and the minimum of over all the collections of X.

source

',3))]),i("details",B,[i("summary",null,[s[42]||(s[42]=i("a",{id:"ConstraintDomains.AbstractDomain",href:"#ConstraintDomains.AbstractDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.AbstractDomain")],-1)),s[43]||(s[43]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[44]||(s[44]=l('
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

  • Base.∈(val, ::D)

  • Base.rand(::D)

  • Base.length(::D) that is the number of elements in a discrete domain, and the distance between bounds or similar for a continuous domain

Additionally, if the domain is used in a dynamic context, it can extend

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source

',7))]),i("details",A,[i("summary",null,[s[45]||(s[45]=i("a",{id:"ConstraintDomains.BoolParameterDomain",href:"#ConstraintDomains.BoolParameterDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.BoolParameterDomain")],-1)),s[46]||(s[46]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[47]||(s[47]=l('
julia
BoolParameterDomain <: AbstractDomain

A domain to store boolean values. It is used to generate random parameters.

source

',3))]),i("details",x,[i("summary",null,[s[48]||(s[48]=i("a",{id:"ConstraintDomains.ContinuousDomain",href:"#ConstraintDomains.ContinuousDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.ContinuousDomain")],-1)),s[49]||(s[49]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[50]||(s[50]=l('
julia
ContinuousDomain{T <: Real} <: AbstractDomain

An abstract supertype for all continuous domains.

source

',3))]),i("details",D,[i("summary",null,[s[51]||(s[51]=i("a",{id:"ConstraintDomains.DimParameterDomain",href:"#ConstraintDomains.DimParameterDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.DimParameterDomain")],-1)),s[52]||(s[52]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[53]||(s[53]=l('
julia
DimParameterDomain <: AbstractDomain

A domain to store dimensions. It is used to generate random parameters.

source

',3))]),i("details",T,[i("summary",null,[s[54]||(s[54]=i("a",{id:"ConstraintDomains.DiscreteDomain",href:"#ConstraintDomains.DiscreteDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.DiscreteDomain")],-1)),s[55]||(s[55]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[56]||(s[56]=l('
julia
DiscreteDomain{T <: Number} <: AbstractDomain

An abstract supertype for discrete domains (set, range).

source

',3))]),i("details",w,[i("summary",null,[s[57]||(s[57]=i("a",{id:"ConstraintDomains.EmptyDomain",href:"#ConstraintDomains.EmptyDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.EmptyDomain")],-1)),s[58]||(s[58]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[59]||(s[59]=l('
julia
EmptyDomain

A struct to handle yet to be defined domains.

source

',3))]),i("details",_,[i("summary",null,[s[60]||(s[60]=i("a",{id:"ConstraintDomains.ExploreSettings-Tuple{Any}",href:"#ConstraintDomains.ExploreSettings-Tuple{Any}"},[i("span",{class:"jlbinding"},"ConstraintDomains.ExploreSettings")],-1)),s[61]||(s[61]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[62]||(s[62]=l(`
julia
ExploreSettings(domains; 
                 complete_search_limit = 10^6, 
                 max_samplings = sum(domain_size, domains), 
                 search = :flexible, 
-                solutions_limit = floor(Int, sqrt(max_samplings)))

Create an ExploreSettings object to configure the exploration of a search space composed of a collection of domains.

Arguments

  • domains: A collection of domains to be explored.

  • complete_search_limit: An integer specifying the maximum limit for complete search iterations. Default is 10^6.

  • max_samplings: An integer specifying the maximum number of samplings. Default is the sum of domain sizes.

  • search: A symbol indicating the type of search to perform. Default is :flexible.

  • solutions_limit: An integer specifying the limit on the number of solutions. Default is the floor of the square root of max_samplings.

Returns

  • ExploreSettings object with the specified settings.

source


# ConstraintDomains.FakeAutomatonType.
julia
FakeAutomaton{T} <: ConstraintCommons.AbstractAutomaton

A structure to generate pseudo automaton enough for parameter exploration.

source


# ConstraintDomains.IdParameterDomainType.
julia
IdParameterDomain <: AbstractDomain

A domain to store ids. It is used to generate random parameters.

source


# ConstraintDomains.IntervalsType.
julia
Intervals{T <: Real} <: ContinuousDomain{T}

An encapsuler to store a vector of PatternFolds.Interval. Dynamic changes to Intervals are not handled yet.

source


# ConstraintDomains.LanguageParameterDomainType.
julia
LanguageParameterDomain <: AbstractDomain

A domain to store languages. It is used to generate random parameters.

source


# ConstraintDomains.OpParameterDomainType.
julia
OpParameterDomain{T} <: AbstractDomain

A domain to store operators. It is used to generate random parameters.

source


# ConstraintDomains.PairVarsParameterDomainType.
julia
PairVarsParameterDomain{T} <: AbstractDomain

A domain to store values paired with variables. It is used to generate random parameters.

source


# ConstraintDomains.RangeDomainType.
julia
RangeDomain

A discrete domain defined by a range <: AbstractRange{Real}. As ranges are immutable in Julia, changes in RangeDomain must use set_domain!.

source


# ConstraintDomains.SetDomainType.
julia
SetDomain{T <: Number} <: DiscreteDomain{T}

Domain that stores discrete values as a set of (unordered) points.

source


# ConstraintDomains.ValParameterDomainType.
julia
ValParameterDomain{T} <: AbstractDomain

A domain to store one value. It is used to generate random parameters.

source


# ConstraintDomains.ValsParameterDomainType.
julia
ValsParameterDomain{T} <: AbstractDomain

A domain to store values. It is used to generate random parameters.

source


# Base.convertMethod.
julia
Base.convert(::Type{Union{Intervals, RangeDomain}}, d::Union{Intervals, RangeDomain})

Extends Base.convert for domains.

source


# Base.delete!Method.
julia
Base.delete!(d::SetDomain, value)(d::SetDomain, value)

Delete value from the list of points in d.

source


# Base.eltypeMethod.
julia
Base.eltype(::AbstractDomain)

Extend eltype for domains.

source


# Base.inMethod.
julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I\` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source


# Base.inMethod.
julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source


# Base.inMethod.
julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source


# Base.isemptyMethod.
julia
Base.isempty(d <: AbstractDomain)

Fallback method for isempty(d) that return length(d) == 0 which default to 0.

source


# Base.lengthMethod.
julia
Base.length(itv::Intervals)

Return the sum of the length of each interval in itv.

source


# Base.lengthMethod.
julia
Base.rand(d <: AbstractDomain)

Fallback method for length(d) that return 0.

source


# Base.lengthMethod.
julia
Base.length(d::D) where D <: DiscreteDomain

Return the number of points in d.

source


# Base.randMethod.
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source


# Base.randMethod.
julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source


# Base.randMethod.
julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source


# Base.randMethod.
julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source


# Base.stringMethod.
julia
Base.string(D::Vector{<:AbstractDomain})
-Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source


# ConstraintCommons.acceptMethod.
julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source


# ConstraintDomains.ArbitraryDomainMethod.
julia
ArbitraryDomain{T} <: DiscreteDomain{T}

A domain type that stores arbitrary values, possibly non numeric, of type T.

source


# ConstraintDomains._exploreMethod.
julia
_explore(args...)

Internals of the explore function. Behavior is automatically adjusted on the kind of exploration: :flexible, :complete, :partial.

source


# ConstraintDomains.add!Method.
julia
add!(d::SetDomain, value)

Add value to the list of points in d.

source


# ConstraintDomains.domainMethod.
julia
domain(values)
+                solutions_limit = floor(Int, sqrt(max_samplings)))

Create an ExploreSettings object to configure the exploration of a search space composed of a collection of domains.

Arguments

  • domains: A collection of domains to be explored.

  • complete_search_limit: An integer specifying the maximum limit for complete search iterations. Default is 10^6.

  • max_samplings: An integer specifying the maximum number of samplings. Default is the sum of domain sizes.

  • search: A symbol indicating the type of search to perform. Default is :flexible.

  • solutions_limit: An integer specifying the limit on the number of solutions. Default is the floor of the square root of max_samplings.

Returns

  • ExploreSettings object with the specified settings.

source

`,7))]),i("details",L,[i("summary",null,[s[63]||(s[63]=i("a",{id:"ConstraintDomains.FakeAutomaton",href:"#ConstraintDomains.FakeAutomaton"},[i("span",{class:"jlbinding"},"ConstraintDomains.FakeAutomaton")],-1)),s[64]||(s[64]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[65]||(s[65]=l('
julia
FakeAutomaton{T} <: ConstraintCommons.AbstractAutomaton

A structure to generate pseudo automaton enough for parameter exploration.

source

',3))]),i("details",N,[i("summary",null,[s[66]||(s[66]=i("a",{id:"ConstraintDomains.IdParameterDomain",href:"#ConstraintDomains.IdParameterDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.IdParameterDomain")],-1)),s[67]||(s[67]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[68]||(s[68]=l('
julia
IdParameterDomain <: AbstractDomain

A domain to store ids. It is used to generate random parameters.

source

',3))]),i("details",M,[i("summary",null,[s[69]||(s[69]=i("a",{id:"ConstraintDomains.Intervals",href:"#ConstraintDomains.Intervals"},[i("span",{class:"jlbinding"},"ConstraintDomains.Intervals")],-1)),s[70]||(s[70]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[71]||(s[71]=l('
julia
Intervals{T <: Real} <: ContinuousDomain{T}

An encapsuler to store a vector of PatternFolds.Interval. Dynamic changes to Intervals are not handled yet.

source

',3))]),i("details",O,[i("summary",null,[s[72]||(s[72]=i("a",{id:"ConstraintDomains.LanguageParameterDomain",href:"#ConstraintDomains.LanguageParameterDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.LanguageParameterDomain")],-1)),s[73]||(s[73]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[74]||(s[74]=l('
julia
LanguageParameterDomain <: AbstractDomain

A domain to store languages. It is used to generate random parameters.

source

',3))]),i("details",I,[i("summary",null,[s[75]||(s[75]=i("a",{id:"ConstraintDomains.OpParameterDomain",href:"#ConstraintDomains.OpParameterDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.OpParameterDomain")],-1)),s[76]||(s[76]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[77]||(s[77]=l('
julia
OpParameterDomain{T} <: AbstractDomain

A domain to store operators. It is used to generate random parameters.

source

',3))]),i("details",J,[i("summary",null,[s[78]||(s[78]=i("a",{id:"ConstraintDomains.PairVarsParameterDomain",href:"#ConstraintDomains.PairVarsParameterDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.PairVarsParameterDomain")],-1)),s[79]||(s[79]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[80]||(s[80]=l('
julia
PairVarsParameterDomain{T} <: AbstractDomain

A domain to store values paired with variables. It is used to generate random parameters.

source

',3))]),i("details",S,[i("summary",null,[s[81]||(s[81]=i("a",{id:"ConstraintDomains.RangeDomain",href:"#ConstraintDomains.RangeDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.RangeDomain")],-1)),s[82]||(s[82]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[83]||(s[83]=l('
julia
RangeDomain

A discrete domain defined by a range <: AbstractRange{Real}. As ranges are immutable in Julia, changes in RangeDomain must use set_domain!.

source

',3))]),i("details",R,[i("summary",null,[s[84]||(s[84]=i("a",{id:"ConstraintDomains.SetDomain",href:"#ConstraintDomains.SetDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.SetDomain")],-1)),s[85]||(s[85]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[86]||(s[86]=l('
julia
SetDomain{T <: Number} <: DiscreteDomain{T}

Domain that stores discrete values as a set of (unordered) points.

source

',3))]),i("details",U,[i("summary",null,[s[87]||(s[87]=i("a",{id:"ConstraintDomains.ValParameterDomain",href:"#ConstraintDomains.ValParameterDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.ValParameterDomain")],-1)),s[88]||(s[88]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[89]||(s[89]=l('
julia
ValParameterDomain{T} <: AbstractDomain

A domain to store one value. It is used to generate random parameters.

source

',3))]),i("details",V,[i("summary",null,[s[90]||(s[90]=i("a",{id:"ConstraintDomains.ValsParameterDomain",href:"#ConstraintDomains.ValsParameterDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.ValsParameterDomain")],-1)),s[91]||(s[91]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[92]||(s[92]=l('
julia
ValsParameterDomain{T} <: AbstractDomain

A domain to store values. It is used to generate random parameters.

source

',3))]),i("details",z,[i("summary",null,[s[93]||(s[93]=i("a",{id:"Base.convert-Union{Tuple{T}, Tuple{Type{ConstraintDomains.Intervals}, RangeDomain{T, R} where R<:AbstractRange{T}}} where T<:Real",href:"#Base.convert-Union{Tuple{T}, Tuple{Type{ConstraintDomains.Intervals}, RangeDomain{T, R} where R<:AbstractRange{T}}} where T<:Real"},[i("span",{class:"jlbinding"},"Base.convert")],-1)),s[94]||(s[94]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[95]||(s[95]=l('
julia
Base.convert(::Type{Union{Intervals, RangeDomain}}, d::Union{Intervals, RangeDomain})

Extends Base.convert for domains.

source

',3))]),i("details",q,[i("summary",null,[s[96]||(s[96]=i("a",{id:"Base.delete!-Tuple{SetDomain, Any}",href:"#Base.delete!-Tuple{SetDomain, Any}"},[i("span",{class:"jlbinding"},"Base.delete!")],-1)),s[97]||(s[97]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[98]||(s[98]=l('
julia
Base.delete!(d::SetDomain, value)(d::SetDomain, value)

Delete value from the list of points in d.

source

',3))]),i("details",P,[i("summary",null,[s[99]||(s[99]=i("a",{id:"Base.eltype-Union{Tuple{D}, Tuple{T}} where {T, D<:Union{ContinuousDomain{T}, DiscreteDomain{T}}}",href:"#Base.eltype-Union{Tuple{D}, Tuple{T}} where {T, D<:Union{ContinuousDomain{T}, DiscreteDomain{T}}}"},[i("span",{class:"jlbinding"},"Base.eltype")],-1)),s[100]||(s[100]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[101]||(s[101]=l('
julia
Base.eltype(::AbstractDomain)

Extend eltype for domains.

source

',3))]),i("details",X,[i("summary",null,[s[102]||(s[102]=i("a",{id:"Base.in-Tuple{Any, ConstraintDomains.Intervals}",href:"#Base.in-Tuple{Any, ConstraintDomains.Intervals}"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[103]||(s[103]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[104]||(s[104]=l('
julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

',4))]),i("details",G,[i("summary",null,[s[105]||(s[105]=i("a",{id:"Base.in-Union{Tuple{D}, Tuple{Any, D}} where D<:AbstractDomain",href:"#Base.in-Union{Tuple{D}, Tuple{Any, D}} where D<:AbstractDomain"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[106]||(s[106]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[107]||(s[107]=l('
julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

',3))]),i("details",Q,[i("summary",null,[s[108]||(s[108]=i("a",{id:"Base.in-Union{Tuple{D}, Tuple{Any, D}} where D<:DiscreteDomain",href:"#Base.in-Union{Tuple{D}, Tuple{Any, D}} where D<:DiscreteDomain"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[109]||(s[109]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[110]||(s[110]=l('
julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source

',3))]),i("details",W,[i("summary",null,[s[111]||(s[111]=i("a",{id:"Base.isempty-Tuple{D} where D<:AbstractDomain",href:"#Base.isempty-Tuple{D} where D<:AbstractDomain"},[i("span",{class:"jlbinding"},"Base.isempty")],-1)),s[112]||(s[112]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[113]||(s[113]=l('
julia
Base.isempty(d <: AbstractDomain)

Fallback method for isempty(d) that return length(d) == 0 which default to 0.

source

',3))]),i("details",Y,[i("summary",null,[s[114]||(s[114]=i("a",{id:"Base.length-Tuple{ConstraintDomains.Intervals}",href:"#Base.length-Tuple{ConstraintDomains.Intervals}"},[i("span",{class:"jlbinding"},"Base.length")],-1)),s[115]||(s[115]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[116]||(s[116]=l('
julia
Base.length(itv::Intervals)

Return the sum of the length of each interval in itv.

source

',3))]),i("details",$,[i("summary",null,[s[117]||(s[117]=i("a",{id:"Base.length-Tuple{D} where D<:AbstractDomain",href:"#Base.length-Tuple{D} where D<:AbstractDomain"},[i("span",{class:"jlbinding"},"Base.length")],-1)),s[118]||(s[118]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[119]||(s[119]=l('
julia
Base.rand(d <: AbstractDomain)

Fallback method for length(d) that return 0.

source

',3))]),i("details",K,[i("summary",null,[s[120]||(s[120]=i("a",{id:"Base.length-Tuple{D} where D<:DiscreteDomain",href:"#Base.length-Tuple{D} where D<:DiscreteDomain"},[i("span",{class:"jlbinding"},"Base.length")],-1)),s[121]||(s[121]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[122]||(s[122]=l('
julia
Base.length(d::D) where D <: DiscreteDomain

Return the number of points in d.

source

',3))]),i("details",H,[i("summary",null,[s[123]||(s[123]=i("a",{id:"Base.rand-Tuple{AbstractDomain}",href:"#Base.rand-Tuple{AbstractDomain}"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[124]||(s[124]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[125]||(s[125]=l('
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

',3))]),i("details",Z,[i("summary",null,[s[126]||(s[126]=i("a",{id:"Base.rand-Tuple{ConstraintDomains.FakeAutomaton}",href:"#Base.rand-Tuple{ConstraintDomains.FakeAutomaton}"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[127]||(s[127]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[128]||(s[128]=l('
julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

',3))]),i("details",ss,[i("summary",null,[s[129]||(s[129]=i("a",{id:"Base.rand-Tuple{ConstraintDomains.Intervals, Int64}",href:"#Base.rand-Tuple{ConstraintDomains.Intervals, Int64}"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[130]||(s[130]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[131]||(s[131]=l(`
julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

`,3))]),i("details",is,[i("summary",null,[s[132]||(s[132]=i("a",{id:"Base.rand-Tuple{D} where D<:DiscreteDomain",href:"#Base.rand-Tuple{D} where D<:DiscreteDomain"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[133]||(s[133]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[134]||(s[134]=l('
julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

',3))]),i("details",as,[i("summary",null,[s[135]||(s[135]=i("a",{id:"Base.string-Tuple{Vector{<:AbstractDomain}}",href:"#Base.string-Tuple{Vector{<:AbstractDomain}}"},[i("span",{class:"jlbinding"},"Base.string")],-1)),s[136]||(s[136]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[137]||(s[137]=l(`
julia
Base.string(D::Vector{<:AbstractDomain})
+Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source

`,3))]),i("details",ts,[i("summary",null,[s[138]||(s[138]=i("a",{id:"ConstraintCommons.accept-Tuple{ConstraintDomains.FakeAutomaton, Any}",href:"#ConstraintCommons.accept-Tuple{ConstraintDomains.FakeAutomaton, Any}"},[i("span",{class:"jlbinding"},"ConstraintCommons.accept")],-1)),s[139]||(s[139]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[140]||(s[140]=l('
julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

',3))]),i("details",ns,[i("summary",null,[s[141]||(s[141]=i("a",{id:"ConstraintDomains.ArbitraryDomain-Tuple{Any}",href:"#ConstraintDomains.ArbitraryDomain-Tuple{Any}"},[i("span",{class:"jlbinding"},"ConstraintDomains.ArbitraryDomain")],-1)),s[142]||(s[142]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[143]||(s[143]=l('
julia
ArbitraryDomain{T} <: DiscreteDomain{T}

A domain type that stores arbitrary values, possibly non numeric, of type T.

source

',3))]),i("details",ls,[i("summary",null,[s[144]||(s[144]=i("a",{id:"ConstraintDomains._explore-Tuple{Any, Any, Any, Val{:partial}}",href:"#ConstraintDomains._explore-Tuple{Any, Any, Any, Val{:partial}}"},[i("span",{class:"jlbinding"},"ConstraintDomains._explore")],-1)),s[145]||(s[145]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[146]||(s[146]=l('
julia
_explore(args...)

Internals of the explore function. Behavior is automatically adjusted on the kind of exploration: :flexible, :complete, :partial.

source

',3))]),i("details",es,[i("summary",null,[s[147]||(s[147]=i("a",{id:"ConstraintDomains.add!-Tuple{SetDomain, Any}",href:"#ConstraintDomains.add!-Tuple{SetDomain, Any}"},[i("span",{class:"jlbinding"},"ConstraintDomains.add!")],-1)),s[148]||(s[148]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[149]||(s[149]=l('
julia
add!(d::SetDomain, value)

Add value to the list of points in d.

source

',3))]),i("details",ps,[i("summary",null,[s[150]||(s[150]=i("a",{id:"ConstraintDomains.domain-Tuple{Any}",href:"#ConstraintDomains.domain-Tuple{Any}"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[151]||(s[151]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[152]||(s[152]=l(`
julia
domain(values)
 domain(range::R) where {T <: Real, R <: AbstractRange{T}}

Construct either a SetDomain or a RangeDomain.

julia
d1 = domain(1:5)
 d2 = domain([53.69, 89.2, 0.12])
 d3 = domain([2//3, 89//123])
 d4 = domain(4.3)
-d5 = domain(1,42,86.9)

source


# ConstraintDomains.domainMethod.
julia
domain()

Construct an EmptyDomain.

source


# ConstraintDomains.domainMethod.
julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
-domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source


# ConstraintDomains.domain_sizeMethod.
julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source


# ConstraintDomains.domain_sizeMethod.
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source


# ConstraintDomains.domain_sizeMethod.
julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source


# ConstraintDomains.exploreMethod.
julia
explore(domains, concept; settings = ExploreSettings(domains), parameters...)

Search (a part of) a search space and return a pair of vectors of configurations: (solutions, non_solutions). The exploration behavior is determined based on the settings.

Arguments

  • domains: A collection of domains to be explored.

  • concept: The concept representing the constraint to be targeted.

  • settings: An optional ExploreSettings object to configure the exploration. Default is ExploreSettings(domains).

  • parameters...: Additional parameters for the concept.

Returns

  • A tuple of sets: (solutions, non_solutions).

source


# ConstraintDomains.fake_automatonMethod.
julia
fake_automaton(d)

Construct a FakeAutomaton.

source


# ConstraintDomains.generate_parametersMethod.
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source


# ConstraintDomains.get_domainMethod.
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source


# ConstraintDomains.intersect_domains!Method.
julia
intersect_domains!(is, i, new_itvls)

Compute the intersections of a domain with an interval and store the results in new_itvls.

Arguments

  • is::IS: a collection of intervals.

  • i::I: an interval.

  • new_itvls::Vector{I}: a vector to store the results.

source


# ConstraintDomains.intersect_domainsMethod.
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source


# ConstraintDomains.merge_domainsMethod.
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source


# ConstraintDomains.sizeMethod.
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source


# ConstraintDomains.to_domainsMethod.
julia
to_domains(args...)

Convert various arguments into valid domains format.

source


# Constraints.USUAL_CONSTRAINTSConstant.
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source


# Constraints.USUAL_SYMMETRIESConstant.
julia
USUAL_SYMMETRIES

A Dictionary that contains the function to apply for each symmetry to avoid searching a whole space.

source


# Constraints.ConstraintType.
julia
Constraint

Parametric structure with the following fields.

  • concept: a Boolean function that, given an assignment x, outputs true if x satisfies the constraint, and false otherwise.

  • error: a positive function that works as preferences over invalid assignments. Return 0.0 if the constraint is satisfied, and a strictly positive real otherwise.

source


# ConstraintCommons.extract_parametersFunction.
julia
extract_parameters(s::Symbol, constraints_dict=USUAL_CONSTRAINTS; parameters=ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS)

Return the parameters of the constraint s in constraints_dict.

Arguments

  • s::Symbol: the constraint name.

  • constraints_dict::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

  • parameters::Vector{Symbol}: vector of parameters. Default is ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS.

Example

julia
extract_parameters(:all_different)

source


# Constraints.argsMethod.
julia
args(c::Constraint)

Return the expected length restriction of the arguments in a constraint c. The value nothing indicates that any strictly positive number of value is accepted.

source


# Constraints.conceptMethod.
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source


# Constraints.conceptMethod.
julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

  • s::Symbol: the constraint name.

  • args...: the arguments to apply the concept to.

  • kargs...: the keyword arguments to apply the concept to.

Example

julia
concept(:all_different, [1, 2, 3])

source


# Constraints.concept_vs_errorMethod.
julia
concept_vs_error(c, e, args...; kargs...)

Compare the results of a concept function and an error function for the same inputs. It is mainly used for testing purposes.

Arguments

  • c: The concept function.

  • e: The error function.

  • args...: Positional arguments to be passed to both the concept and error functions.

  • kargs...: Keyword arguments to be passed to both the concept and error functions.

Returns

  • Boolean: Returns true if the result of the concept function is not equal to whether the result of the error function is greater than 0.0. Otherwise, it returns false.

Examples

julia
concept_vs_error(all_different, make_error(:all_different), [1, 2, 3]) # Returns false

source


# Constraints.constraints_descriptionsFunction.
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_descriptions()

source


# Constraints.constraints_parametersFunction.
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_parameters()

source


# Constraints.describeFunction.
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

  • constraints::Dict{Symbol,Constraint}: dictionary of constraints to describe. Default is USUAL_CONSTRAINTS.

  • width::Int: width of the table.

Example

julia
describe()

source


# Constraints.error_fMethod.
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source


# Constraints.make_errorMethod.
julia
make_error(symb::Symbol)

Create a function that returns an error based on the predicate of the constraint identified by the symbol provided.

Arguments

  • symb::Symbol: The symbol used to determine the error function to be returned. The function first checks if a predicate with the prefix "icn_" exists in the Constraints module. If it does, it returns that function. If it doesn't, it checks for a predicate with the prefix "error_". If that exists, it returns that function. If neither exists, it returns a function that evaluates the predicate with the prefix "concept_" and returns the negation of its result cast to Float64.

Returns

  • Function: A function that takes in a variable x and an arbitrary number of parameters params. The function returns a Float64.

Examples

julia
e = make_error(:all_different)
+d5 = domain(1,42,86.9)

source

`,4))]),i("details",hs,[i("summary",null,[s[153]||(s[153]=i("a",{id:"ConstraintDomains.domain-Tuple{}",href:"#ConstraintDomains.domain-Tuple{}"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[154]||(s[154]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[155]||(s[155]=l('
julia
domain()

Construct an EmptyDomain.

source

',3))]),i("details",ks,[i("summary",null,[s[156]||(s[156]=i("a",{id:"ConstraintDomains.domain-Union{Tuple{Array{Intervals.Interval{T, L, R}, 1}}, Tuple{R}, Tuple{L}, Tuple{T}} where {T<:Real, L, R}",href:"#ConstraintDomains.domain-Union{Tuple{Array{Intervals.Interval{T, L, R}, 1}}, Tuple{R}, Tuple{L}, Tuple{T}} where {T<:Real, L, R}"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[157]||(s[157]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[158]||(s[158]=l(`
julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

`,3))]),i("details",os,[i("summary",null,[s[159]||(s[159]=i("a",{id:"ConstraintDomains.domain_size-Tuple{ConstraintDomains.Intervals}",href:"#ConstraintDomains.domain_size-Tuple{ConstraintDomains.Intervals}"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[160]||(s[160]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[161]||(s[161]=l('
julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

',3))]),i("details",rs,[i("summary",null,[s[162]||(s[162]=i("a",{id:"ConstraintDomains.domain_size-Tuple{D} where D<:AbstractDomain",href:"#ConstraintDomains.domain_size-Tuple{D} where D<:AbstractDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[163]||(s[163]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[164]||(s[164]=l('
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

',3))]),i("details",ds,[i("summary",null,[s[165]||(s[165]=i("a",{id:"ConstraintDomains.domain_size-Tuple{D} where D<:DiscreteDomain",href:"#ConstraintDomains.domain_size-Tuple{D} where D<:DiscreteDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[166]||(s[166]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[167]||(s[167]=l('
julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',3))]),i("details",gs,[i("summary",null,[s[168]||(s[168]=i("a",{id:"ConstraintDomains.explore-Tuple{Any, Any}",href:"#ConstraintDomains.explore-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"ConstraintDomains.explore")],-1)),s[169]||(s[169]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[170]||(s[170]=l('
julia
explore(domains, concept; settings = ExploreSettings(domains), parameters...)

Search (a part of) a search space and return a pair of vectors of configurations: (solutions, non_solutions). The exploration behavior is determined based on the settings.

Arguments

  • domains: A collection of domains to be explored.

  • concept: The concept representing the constraint to be targeted.

  • settings: An optional ExploreSettings object to configure the exploration. Default is ExploreSettings(domains).

  • parameters...: Additional parameters for the concept.

Returns

  • A tuple of sets: (solutions, non_solutions).

source

',7))]),i("details",Es,[i("summary",null,[s[171]||(s[171]=i("a",{id:"ConstraintDomains.fake_automaton-Tuple{Any}",href:"#ConstraintDomains.fake_automaton-Tuple{Any}"},[i("span",{class:"jlbinding"},"ConstraintDomains.fake_automaton")],-1)),s[172]||(s[172]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[173]||(s[173]=l('
julia
fake_automaton(d)

Construct a FakeAutomaton.

source

',3))]),i("details",cs,[i("summary",null,[s[174]||(s[174]=i("a",{id:"ConstraintDomains.generate_parameters-Tuple{AbstractDomain, Symbol}",href:"#ConstraintDomains.generate_parameters-Tuple{AbstractDomain, Symbol}"},[i("span",{class:"jlbinding"},"ConstraintDomains.generate_parameters")],-1)),s[175]||(s[175]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[176]||(s[176]=l('
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source

',3))]),i("details",ys,[i("summary",null,[s[177]||(s[177]=i("a",{id:"ConstraintDomains.get_domain-Tuple{D} where D<:AbstractDomain",href:"#ConstraintDomains.get_domain-Tuple{D} where D<:AbstractDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.get_domain")],-1)),s[178]||(s[178]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[179]||(s[179]=l('
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

',3))]),i("details",us,[i("summary",null,[s[180]||(s[180]=i("a",{id:"ConstraintDomains.intersect_domains!-Union{Tuple{I}, Tuple{IS}, Tuple{IS, I, Any}} where {IS<:ConstraintDomains.Intervals, I<:Intervals.Interval}",href:"#ConstraintDomains.intersect_domains!-Union{Tuple{I}, Tuple{IS}, Tuple{IS, I, Any}} where {IS<:ConstraintDomains.Intervals, I<:Intervals.Interval}"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains!")],-1)),s[181]||(s[181]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[182]||(s[182]=l('
julia
intersect_domains!(is, i, new_itvls)

Compute the intersections of a domain with an interval and store the results in new_itvls.

Arguments

  • is::IS: a collection of intervals.

  • i::I: an interval.

  • new_itvls::Vector{I}: a vector to store the results.

source

',5))]),i("details",Cs,[i("summary",null,[s[183]||(s[183]=i("a",{id:"ConstraintDomains.intersect_domains-Union{Tuple{I2}, Tuple{I1}, Tuple{I1, I2}} where {I1<:Intervals.Interval, I2<:Intervals.Interval}",href:"#ConstraintDomains.intersect_domains-Union{Tuple{I2}, Tuple{I1}, Tuple{I1, I2}} where {I1<:Intervals.Interval, I2<:Intervals.Interval}"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains")],-1)),s[184]||(s[184]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[185]||(s[185]=l('
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

',3))]),i("details",ms,[i("summary",null,[s[186]||(s[186]=i("a",{id:"ConstraintDomains.merge_domains-Tuple{RangeDomain, RangeDomain}",href:"#ConstraintDomains.merge_domains-Tuple{RangeDomain, RangeDomain}"},[i("span",{class:"jlbinding"},"ConstraintDomains.merge_domains")],-1)),s[187]||(s[187]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[188]||(s[188]=l('
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source

',3))]),i("details",Fs,[i("summary",null,[s[189]||(s[189]=i("a",{id:"ConstraintDomains.size-Tuple{I} where I<:Intervals.Interval",href:"#ConstraintDomains.size-Tuple{I} where I<:Intervals.Interval"},[i("span",{class:"jlbinding"},"ConstraintDomains.size")],-1)),s[190]||(s[190]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[191]||(s[191]=l('
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source

',3))]),i("details",bs,[i("summary",null,[s[192]||(s[192]=i("a",{id:"ConstraintDomains.to_domains-Tuple{Vector{Int64}}",href:"#ConstraintDomains.to_domains-Tuple{Vector{Int64}}"},[i("span",{class:"jlbinding"},"ConstraintDomains.to_domains")],-1)),s[193]||(s[193]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[194]||(s[194]=l('
julia
to_domains(args...)

Convert various arguments into valid domains format.

source

',3))]),i("details",vs,[i("summary",null,[s[195]||(s[195]=i("a",{id:"Constraints.USUAL_CONSTRAINTS",href:"#Constraints.USUAL_CONSTRAINTS"},[i("span",{class:"jlbinding"},"Constraints.USUAL_CONSTRAINTS")],-1)),s[196]||(s[196]=a()),n(t,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[197]||(s[197]=l('
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source

',6))]),i("details",js,[i("summary",null,[s[198]||(s[198]=i("a",{id:"Constraints.USUAL_SYMMETRIES",href:"#Constraints.USUAL_SYMMETRIES"},[i("span",{class:"jlbinding"},"Constraints.USUAL_SYMMETRIES")],-1)),s[199]||(s[199]=a()),n(t,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[200]||(s[200]=l('
julia
USUAL_SYMMETRIES

A Dictionary that contains the function to apply for each symmetry to avoid searching a whole space.

source

',3))]),i("details",fs,[i("summary",null,[s[201]||(s[201]=i("a",{id:"Constraints.Constraint",href:"#Constraints.Constraint"},[i("span",{class:"jlbinding"},"Constraints.Constraint")],-1)),s[202]||(s[202]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[203]||(s[203]=l('
julia
Constraint

Parametric structure with the following fields.

  • concept: a Boolean function that, given an assignment x, outputs true if x satisfies the constraint, and false otherwise.

  • error: a positive function that works as preferences over invalid assignments. Return 0.0 if the constraint is satisfied, and a strictly positive real otherwise.

source

',4))]),i("details",Bs,[i("summary",null,[s[204]||(s[204]=i("a",{id:"ConstraintCommons.extract_parameters",href:"#ConstraintCommons.extract_parameters"},[i("span",{class:"jlbinding"},"ConstraintCommons.extract_parameters")],-1)),s[205]||(s[205]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[206]||(s[206]=l('
julia
extract_parameters(s::Symbol, constraints_dict=USUAL_CONSTRAINTS; parameters=ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS)

Return the parameters of the constraint s in constraints_dict.

Arguments

  • s::Symbol: the constraint name.

  • constraints_dict::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

  • parameters::Vector{Symbol}: vector of parameters. Default is ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS.

Example

julia
extract_parameters(:all_different)

source

',7))]),i("details",As,[i("summary",null,[s[207]||(s[207]=i("a",{id:"Constraints.args-Tuple{Constraint}",href:"#Constraints.args-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.args")],-1)),s[208]||(s[208]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[209]||(s[209]=l('
julia
args(c::Constraint)

Return the expected length restriction of the arguments in a constraint c. The value nothing indicates that any strictly positive number of value is accepted.

source

',3))]),i("details",xs,[i("summary",null,[s[210]||(s[210]=i("a",{id:"Constraints.concept-Tuple{Constraint}",href:"#Constraints.concept-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[211]||(s[211]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[212]||(s[212]=l('
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source

',3))]),i("details",Ds,[i("summary",null,[s[213]||(s[213]=i("a",{id:"Constraints.concept-Tuple{Symbol, Vararg{Any}}",href:"#Constraints.concept-Tuple{Symbol, Vararg{Any}}"},[i("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[214]||(s[214]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[215]||(s[215]=l('
julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

  • s::Symbol: the constraint name.

  • args...: the arguments to apply the concept to.

  • kargs...: the keyword arguments to apply the concept to.

Example

julia
concept(:all_different, [1, 2, 3])

source

',7))]),i("details",Ts,[i("summary",null,[s[216]||(s[216]=i("a",{id:"Constraints.concept_vs_error-Tuple{Any, Any, Vararg{Any}}",href:"#Constraints.concept_vs_error-Tuple{Any, Any, Vararg{Any}}"},[i("span",{class:"jlbinding"},"Constraints.concept_vs_error")],-1)),s[217]||(s[217]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[218]||(s[218]=l('
julia
concept_vs_error(c, e, args...; kargs...)

Compare the results of a concept function and an error function for the same inputs. It is mainly used for testing purposes.

Arguments

  • c: The concept function.

  • e: The error function.

  • args...: Positional arguments to be passed to both the concept and error functions.

  • kargs...: Keyword arguments to be passed to both the concept and error functions.

Returns

  • Boolean: Returns true if the result of the concept function is not equal to whether the result of the error function is greater than 0.0. Otherwise, it returns false.

Examples

julia
concept_vs_error(all_different, make_error(:all_different), [1, 2, 3]) # Returns false

source

',9))]),i("details",ws,[i("summary",null,[s[219]||(s[219]=i("a",{id:"Constraints.constraints_descriptions",href:"#Constraints.constraints_descriptions"},[i("span",{class:"jlbinding"},"Constraints.constraints_descriptions")],-1)),s[220]||(s[220]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[221]||(s[221]=l('
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_descriptions()

source

',7))]),i("details",_s,[i("summary",null,[s[222]||(s[222]=i("a",{id:"Constraints.constraints_parameters",href:"#Constraints.constraints_parameters"},[i("span",{class:"jlbinding"},"Constraints.constraints_parameters")],-1)),s[223]||(s[223]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[224]||(s[224]=l('
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_parameters()

source

',7))]),i("details",Ls,[i("summary",null,[s[225]||(s[225]=i("a",{id:"Constraints.describe",href:"#Constraints.describe"},[i("span",{class:"jlbinding"},"Constraints.describe")],-1)),s[226]||(s[226]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[227]||(s[227]=l('
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

  • constraints::Dict{Symbol,Constraint}: dictionary of constraints to describe. Default is USUAL_CONSTRAINTS.

  • width::Int: width of the table.

Example

julia
describe()

source

',7))]),i("details",Ns,[i("summary",null,[s[228]||(s[228]=i("a",{id:"Constraints.error_f-Tuple{Constraint}",href:"#Constraints.error_f-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.error_f")],-1)),s[229]||(s[229]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[230]||(s[230]=l('
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source

',3))]),i("details",Ms,[i("summary",null,[s[231]||(s[231]=i("a",{id:"Constraints.make_error-Tuple{Symbol}",href:"#Constraints.make_error-Tuple{Symbol}"},[i("span",{class:"jlbinding"},"Constraints.make_error")],-1)),s[232]||(s[232]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[233]||(s[233]=l(`
julia
make_error(symb::Symbol)

Create a function that returns an error based on the predicate of the constraint identified by the symbol provided.

Arguments

  • symb::Symbol: The symbol used to determine the error function to be returned. The function first checks if a predicate with the prefix "icn_" exists in the Constraints module. If it does, it returns that function. If it doesn't, it checks for a predicate with the prefix "error_". If that exists, it returns that function. If neither exists, it returns a function that evaluates the predicate with the prefix "concept_" and returns the negation of its result cast to Float64.

Returns

  • Function: A function that takes in a variable x and an arbitrary number of parameters params. The function returns a Float64.

Examples

julia
e = make_error(:all_different)
 e([1, 2, 3]) # Returns 0.0
-e([1, 1, 3]) # Returns 1.0

source


# Constraints.params_lengthMethod.
julia
params_length(c::Constraint)

Return the expected length restriction of the arguments in a constraint c. The value nothing indicates that any strictly positive number of parameters is accepted.

source


# Constraints.shrink_conceptMethod.
julia
shrink_concept(s)

Simply delete the concept_ part of symbol or string starting with it. TODO: add a check with a warning if s starts with something different.

source


# Constraints.symmetriesMethod.
julia
symmetries(c::Constraint)

Return the list of symmetries of c.

source


# Constraints.xcsp_all_differentMethod.
julia
xcsp_all_different(list::Vector{Int})

Return true if all the values of list are different, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

Variants

  • :all_different: Global constraint ensuring that all the values of x are all different.
julia
concept(:all_different, x; vals)
+e([1, 1, 3]) # Returns 1.0

source

`,9))]),i("details",Os,[i("summary",null,[s[234]||(s[234]=i("a",{id:"Constraints.params_length-Tuple{Constraint}",href:"#Constraints.params_length-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.params_length")],-1)),s[235]||(s[235]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[236]||(s[236]=l('
julia
params_length(c::Constraint)

Return the expected length restriction of the arguments in a constraint c. The value nothing indicates that any strictly positive number of parameters is accepted.

source

',3))]),i("details",Is,[i("summary",null,[s[237]||(s[237]=i("a",{id:"Constraints.shrink_concept-Tuple{Any}",href:"#Constraints.shrink_concept-Tuple{Any}"},[i("span",{class:"jlbinding"},"Constraints.shrink_concept")],-1)),s[238]||(s[238]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[239]||(s[239]=l('
julia
shrink_concept(s)

Simply delete the concept_ part of symbol or string starting with it. TODO: add a check with a warning if s starts with something different.

source

',3))]),i("details",Js,[i("summary",null,[s[240]||(s[240]=i("a",{id:"Constraints.symmetries-Tuple{Constraint}",href:"#Constraints.symmetries-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.symmetries")],-1)),s[241]||(s[241]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[242]||(s[242]=l('
julia
symmetries(c::Constraint)

Return the list of symmetries of c.

source

',3))]),i("details",Ss,[i("summary",null,[s[243]||(s[243]=i("a",{id:"Constraints.xcsp_all_different-Tuple{Any, Nothing}",href:"#Constraints.xcsp_all_different-Tuple{Any, Nothing}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_all_different")],-1)),s[244]||(s[244]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[245]||(s[245]=l(`
julia
xcsp_all_different(list::Vector{Int})

Return true if all the values of list are different, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

Variants

  • :all_different: Global constraint ensuring that the values in x are all different.
julia
concept(:all_different, x; vals)
 concept(:all_different)(x; vals)

Examples

julia
c = concept(:all_different)
 
 c([1, 2, 3, 4])
 c([1, 2, 3, 1])
 c([1, 0, 0, 4]; vals=[0])
-c([1, 0, 0, 1]; vals=[0])

source


# Constraints.xcsp_all_equalMethod.
julia
xcsp_all_equal(list::Vector{Int}, val::Int)

Return true if all the values of list are equal to val, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • val::Int: value to compare to.

Variants

  • :all_equal: Global constraint ensuring that all the values of x are all equal.
julia
concept(:all_equal, x; val=nothing, pair_vars=zeros(x), op=+)
+c([1, 0, 0, 1]; vals=[0])

source

`,10))]),i("details",Rs,[i("summary",null,[s[246]||(s[246]=i("a",{id:"Constraints.xcsp_all_equal-Tuple{}",href:"#Constraints.xcsp_all_equal-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_all_equal")],-1)),s[247]||(s[247]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[248]||(s[248]=l(`
julia
xcsp_all_equal(list::Vector{Int}, val::Int)

Return true if all the values of list are equal to val, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • val::Int: value to compare to.

Variants

  • :all_equal: Global constraint ensuring that the values in x are all equal.
julia
concept(:all_equal, x; val=nothing, pair_vars=zeros(x), op=+)
 concept(:all_equal)(x; val=nothing, pair_vars=zeros(x), op=+)

Examples

julia
c = concept(:all_equal)
 
 c([0, 0, 0, 0])
@@ -35,9 +35,9 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.CBLuZwrP.js";const E
 c([3, 2, 1, 0]; pair_vars=[0, 1, 2, 3])
 c([0, 1, 2, 3]; pair_vars=[0, 1, 2, 3])
 c([1, 2, 3, 4]; op=/, val=1, pair_vars=[1, 2, 3, 4])
-c([1, 2, 3, 4]; op=*, val=1, pair_vars=[1, 2, 3, 4])

source


# Constraints.xcsp_cardinalityMethod.
julia
xcsp_cardinality(list, values, occurs, closed)

Return true if the number of occurrences of the values in values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • values::Vector{Int}: list of values to check.

  • occurs::Vector{Int}: list of occurrences to check.

  • closed::Bool: whether the constraint is closed or not.

Variants

  • :cardinality: The cardinality constraint, also known as the global cardinality constraint (GCC), is a constraint in constraint programming that restricts the number of times a value can appear in a set of variables.
julia
concept(:cardinality, x; bool=false, vals)
-concept(:cardinality)(x; bool=false, vals)
  • :cardinality_closed: The closed cardinality constraint, also known as the global cardinality constraint (GCC), is a constraint in constraint programming that restricts the number of times a value can appear in a set of variables. It is closed, meaning that all values in the domain of the variables must be considered.
julia
concept(:cardinality_closed, x; vals)
-concept(:cardinality_closed)(x; vals)
  • :cardinality_open: The open cardinality constraint, also known as the global cardinality constraint (GCC), is a constraint in constraint programming that restricts the number of times a value can appear in a set of variables. It is open, meaning that only the values in the list of values must be considered.
julia
concept(:cardinality_open, x; vals)
+c([1, 2, 3, 4]; op=*, val=1, pair_vars=[1, 2, 3, 4])

source

`,10))]),i("details",Us,[i("summary",null,[s[249]||(s[249]=i("a",{id:"Constraints.xcsp_cardinality-Tuple{}",href:"#Constraints.xcsp_cardinality-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_cardinality")],-1)),s[250]||(s[250]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[251]||(s[251]=l(`
julia
xcsp_cardinality(list, values, occurs, closed)

Return true if the number of occurrences of the values in values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • values::Vector{Int}: list of values to check.

  • occurs::Vector{Int}: list of occurrences to check.

  • closed::Bool: whether the constraint is closed or not.

Variants

  • :cardinality: Global constraint that restricts the number of times specific values in a list values can appear in x.
julia
concept(:cardinality, x; bool=false, vals)
+concept(:cardinality)(x; bool=false, vals)
  • :cardinality_closed: Global constraint that restricts the number of times in a list values can appear in x. It is closed, meaning that the variables in x cannot have values outside the ones in list.
julia
concept(:cardinality_closed, x; vals)
+concept(:cardinality_closed)(x; vals)
  • :cardinality_open: Global constraint that restricts the number of times in a list values can appear in x. It is open, meaning that the variables in x can have values outside the ones in list.
julia
concept(:cardinality_open, x; vals)
 concept(:cardinality_open)(x; vals)

Examples

julia
c = concept(:cardinality)
 
 c([2, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])
@@ -53,7 +53,7 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.CBLuZwrP.js";const E
 cc([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])
 
 co = concept(:cardinality_open)
-co([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])

source


# Constraints.xcsp_channelMethod.
julia
xcsp_channel(; list)

Return true if the channel constraint is satisfied, false otherwise. The channel constraint establishes a bijective correspondence between two sets of variables. This means that each value in the first set of variables corresponds to a unique value in the second set, and vice versa.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

Variants

  • :channel: The channel constraint establishes a bijective correspondence between two sets of variables. This means that each value in the first set of variables corresponds to a unique value in the second set, and vice versa.
julia
concept(:channel, x; dim=1, id=nothing)
+co([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])

source

`,14))]),i("details",Vs,[i("summary",null,[s[252]||(s[252]=i("a",{id:"Constraints.xcsp_channel-Tuple{AbstractVector}",href:"#Constraints.xcsp_channel-Tuple{AbstractVector}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_channel")],-1)),s[253]||(s[253]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[254]||(s[254]=l(`
julia
xcsp_channel(; list)

Return true if the channel constraint is satisfied, false otherwise. The channel constraint ensures that if the i-th element of list is assigned the value j, then the j-th element of list must be assigned the value i.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

Variants

  • :channel: Ensures that if the i-th element of x is assigned the value j, then the j-th element of x must be assigned the value i.
julia
concept(:channel, x; dim=1, id=nothing)
 concept(:channel)(x; dim=1, id=nothing)

Examples

julia
c = concept(:channel)
 
 c([2, 1, 4, 3])
@@ -62,13 +62,13 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.CBLuZwrP.js";const E
 c([2, 1, 5, 3, 4, 2, 1, 4, 5, 3]; dim=2)
 c([2, 1, 4, 3, 5, 2, 1, 4, 5, 3]; dim=2)
 c([false, false, true, false]; id=3)
-c([false, false, true, false]; id=1)

source


# Constraints.xcsp_circuitMethod.
julia
xcsp_circuit(; list, size)

Return true if the circuit constraint is satisfied, false otherwise. The circuit constraint is a global constraint used in constraint programming, often in routing problems. It ensures that the values of a list of variables form a circuit, i.e., a sequence where each value is the index of the next value in the sequence, and the sequence eventually loops back to the start.

Arguments

  • list::AbstractVector: list of values to check.

  • size::Int: size of the circuit.

Variants

  • :circuit: The circuit constraint is a global constraint used in constraint programming, often in routing problems. It ensures that the values of a list of variables form a circuit, i.e., a sequence where each value is the index of the next value in the sequence, and the sequence eventually loops back to the start.
julia
concept(:circuit, x; op, val)
+c([false, false, true, false]; id=1)

source

`,10))]),i("details",zs,[i("summary",null,[s[255]||(s[255]=i("a",{id:"Constraints.xcsp_circuit-Tuple{}",href:"#Constraints.xcsp_circuit-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_circuit")],-1)),s[256]||(s[256]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[257]||(s[257]=l(`
julia
xcsp_circuit(; list, size)

Return true if the circuit constraint is satisfied, false otherwise. The circuit constraint is a global constraint ensuring that the values of x form a circuit, i.e., a sequence where each value is the index of the next value in the sequence, and the sequence eventually loops back to the start.

Arguments

  • list::AbstractVector: list of values to check.

  • size::Int: size of the circuit.

Variants

  • :circuit: Global constraint ensuring that the values of x form a circuit, i.e., a sequence where each value is the index of the next value in the sequence, and the sequence eventually loops back to the start. Often used for routing problems.
julia
concept(:circuit, x; op, val)
 concept(:circuit)(x; op, val)

Examples

julia
c = concept(:circuit)
 
 c([1, 2, 3, 4])
 c([2, 3, 4, 1])
 c([2, 3, 1, 4]; op = ==, val = 3)
-c([4, 3, 1, 3]; op = >, val = 0)

source


# Constraints.xcsp_countMethod.
julia
xcsp_count(list, values, condition)

Return true if the number of occurrences of the values in values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • values::Vector{Int}: list of values to check.

  • condition: condition to satisfy.

Variants

  • :count: Constraint ensuring that the number of occurrences of the values in vals in x satisfies the given condition.
julia
concept(:count, x; vals, op, val)
+c([4, 3, 1, 3]; op = >, val = 0)

source

`,10))]),i("details",qs,[i("summary",null,[s[258]||(s[258]=i("a",{id:"Constraints.xcsp_count-Tuple{}",href:"#Constraints.xcsp_count-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_count")],-1)),s[259]||(s[259]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[260]||(s[260]=l(`
julia
xcsp_count(list, values, condition)

Return true if the number of occurrences of the values in values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • values::Vector{Int}: list of values to check.

  • condition: condition to satisfy.

Variants

  • :count: Constraint ensuring that the number of occurrences of the values in vals in x satisfies the given condition.
julia
concept(:count, x; vals, op, val)
 concept(:count)(x; vals, op, val)
  • :at_least: Constraint ensuring that the number of occurrences of the values in vals in x is at least val.
julia
concept(:at_least, x; vals, val)
 concept(:at_least)(x; vals, val)
  • :at_most: Constraint ensuring that the number of occurrences of the values in vals in x is at most val.
julia
concept(:at_most, x; vals, val)
 concept(:at_most)(x; vals, val)
  • :exactly: Constraint ensuring that the number of occurrences of the values in vals in x is exactly val.
julia
concept(:exactly, x; vals, val)
@@ -76,21 +76,21 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.CBLuZwrP.js";const E
 
 c([2, 1, 4, 3]; vals=[1, 2, 3, 4], op=≥, val=2)
 c([1, 2, 3, 4]; vals=[1, 2], op==, val=2)
-c([2, 1, 4, 3]; vals=[1, 2], op=≤, val=1)

source


# Constraints.xcsp_cumulativeMethod.
julia
xcsp_cumulative(; origins, lengths, heights, condition)

Return true if the cumulative constraint is satisfied, false otherwise. The cumulative constraint is a global constraint used in constraint programming that is often used in scheduling problems. It ensures that for any point in time, the sum of the "heights" of tasks that are ongoing at that time does not exceed a certain limit.

Arguments

  • origins::AbstractVector: list of origins of the tasks.

  • lengths::AbstractVector: list of lengths of the tasks.

  • heights::AbstractVector: list of heights of the tasks.

  • condition::Tuple: condition to check.

Variants

  • :cumulative: The cumulative constraint is a global constraint used in constraint programming that is often used in scheduling problems. It ensures that for any point in time, the sum of the "heights" of tasks that are ongoing at that time does not exceed a certain limit.
julia
concept(:cumulative, x; pair_vars, op, val)
+c([2, 1, 4, 3]; vals=[1, 2], op=≤, val=1)

source

`,16))]),i("details",Ps,[i("summary",null,[s[261]||(s[261]=i("a",{id:"Constraints.xcsp_cumulative-Tuple{}",href:"#Constraints.xcsp_cumulative-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_cumulative")],-1)),s[262]||(s[262]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[263]||(s[263]=l(`
julia
xcsp_cumulative(; origins, lengths, heights, condition)

Return true if the cumulative constraint is satisfied, false otherwise. The cumulative constraint is a global constraint operating on a set of tasks, defined by origin (starting times), length, and height. This constraint ensures that, at each point in time, the sum of the height of tasks that overlap that point, respects a numerical condition.

Arguments

  • origins::AbstractVector: list of origins of the tasks.

  • lengths::AbstractVector: list of lengths of the tasks.

  • heights::AbstractVector: list of heights of the tasks.

  • condition::Tuple: condition to check.

Variants

  • :cumulative: Global constraint operating on a set of tasks, defined by origin (starting times), length, and height. This constraint ensures that, at each point in time, the sum of the height of tasks that overlap that point, respects a numerical condition.
julia
concept(:cumulative, x; pair_vars, op, val)
 concept(:cumulative)(x; pair_vars, op, val)

Examples

julia
c = concept(:cumulative)
 
 c([1, 2, 3, 4, 5]; val = 1)
 c([1, 2, 2, 4, 5]; val = 1)
 c([1, 2, 3, 4, 5]; pair_vars = [3 2 5 4 2; 1 2 1 1 3], op =, val = 5)
-c([1, 2, 3, 4, 5]; pair_vars = [3 2 5 4 2; 1 2 1 1 3], op = <, val = 5)

source


# Constraints.xcsp_elementMethod.
julia
xcsp_element(; list, index, condition)

Return true if the element constraint is satisfied, false otherwise. The element constraint is a global constraint used in constraint programming that specifies that the value of a variable should be equal to the value of another variable indexed by a third variable.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • index::Int: index of the value to check.

  • condition::Tuple: condition to check.

Variants

  • :element: The element constraint is a global constraint used in constraint programming that specifies that the value of a variable should be equal to the value of another variable indexed by a third variable.
julia
concept(:element, x; id=nothing, op===, val=nothing)
+c([1, 2, 3, 4, 5]; pair_vars = [3 2 5 4 2; 1 2 1 1 3], op = <, val = 5)

source

`,10))]),i("details",Xs,[i("summary",null,[s[264]||(s[264]=i("a",{id:"Constraints.xcsp_element-Tuple{Any, Any, Tuple}",href:"#Constraints.xcsp_element-Tuple{Any, Any, Tuple}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_element")],-1)),s[265]||(s[265]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[266]||(s[266]=l(`
julia
xcsp_element(; list, index, condition)

Return true if the element constraint is satisfied, false otherwise. The element constraint is a global constraint specifying that a variable in x indexed by id should be equal to a value.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • index::Int: index of the value to check.

  • condition::Tuple: condition to check.

Variants

  • :element: Global constraint specifying that a variable in x indexed by id should be equal to a value.
julia
concept(:element, x; id=nothing, op===, val=nothing)
 concept(:element)(x; id=nothing, op===, val=nothing)

Examples

julia
c = concept(:element)
 
 c([1, 2, 3, 4, 5]; id=1, val=1)
 c([1, 2, 3, 4, 5]; id=1, val=2)
 c([1, 2, 3, 4, 2])
-c([1, 2, 3, 4, 1])

source


# Constraints.xcsp_extensionMethod.
julia
xcsp_extension(; list, supports=nothing, conflicts=nothing)

Global constraint enforcing that the tuple x matches a configuration within the supports set pair_vars[1] or does not match any configuration within the conflicts set pair_vars[2]. It embodies the logic: x ∈ pair_vars[1] || x ∉ pair_vars[2], providing a comprehensive way to define valid (supported) and invalid (conflicted) tuples for constraint satisfaction problems. This constraint is versatile, allowing for the explicit delineation of both acceptable and unacceptable configurations.

Arguments

  • list::Vector{Int}: A list of variables

  • supports::Vector{Vector{Int}}: A set of supported tuples. Default to nothing.

  • conflicts::Vector{Vector{Int}}: A set of conflicted tuples. Default to nothing.

Variants

  • :extension: Global constraint enforcing that the tuple x matches a configuration within the supports set pair_vars[1] or does not match any configuration within the conflicts set pair_vars[2]. It embodies the logic: x ∈ pair_vars[1] || x ∉ pair_vars[2], providing a comprehensive way to define valid (supported) and invalid (conflicted) tuples for constraint satisfaction problems. This constraint is versatile, allowing for the explicit delineation of both acceptable and unacceptable configurations.
julia
concept(:extension, x; pair_vars)
-concept(:extension)(x; pair_vars)
  • :supports: Global constraint ensuring that the tuple x matches a configuration listed within the support set pair_vars. This constraint is derived from the extension model, specifying that x must be one of the explicitly defined supported configurations: x ∈ pair_vars. It is utilized to directly declare the tuples that are valid and should be included in the solution space.
julia
concept(:supports, x; pair_vars)
-concept(:supports)(x; pair_vars)
  • :conflicts: Global constraint ensuring that the tuple x does not match any configuration listed within the conflict set pair_vars. This constraint, originating from the extension model, stipulates that x must avoid all configurations defined as conflicts: x ∉ pair_vars. It is useful for specifying tuples that are explicitly forbidden and should be excluded from the solution space.
julia
concept(:conflicts, x; pair_vars)
+c([1, 2, 3, 4, 1])

source

`,10))]),i("details",Gs,[i("summary",null,[s[267]||(s[267]=i("a",{id:"Constraints.xcsp_extension-Tuple{}",href:"#Constraints.xcsp_extension-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_extension")],-1)),s[268]||(s[268]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[269]||(s[269]=l(`
julia
xcsp_extension(; list, supports=nothing, conflicts=nothing)

Global constraint enforcing that x matches a configuration within the supports set pair_vars[1] or does not match any configuration within the conflicts set pair_vars[2]. It embodies the logic: x ∈ pair_vars[1] || x ∉ pair_vars[2], providing a comprehensive way to define valid (supported) and invalid (conflicted) configurations for constraint satisfaction problems.

Arguments

  • list::Vector{Int}: A list of variables

  • supports::Vector{Vector{Int}}: A set of supported tuples. Default to nothing.

  • conflicts::Vector{Vector{Int}}: A set of conflicted tuples. Default to nothing.

Variants

  • :extension: Global constraint enforcing that x matches a configuration within the supports set pair_vars[1] or does not match any configuration within the conflicts set pair_vars[2]. It embodies the logic: x ∈ pair_vars[1] || x ∉ pair_vars[2], providing a comprehensive way to define valid (supported) and invalid (conflicted) configurations for constraint satisfaction problems.
julia
concept(:extension, x; pair_vars)
+concept(:extension)(x; pair_vars)
  • :supports: Global constraint ensuring that x matches a configuration listed within the support set pair_vars. This constraint is derived from the extension model, specifying that x must be one of the explicitly defined supported configurations: x ∈ pair_vars. It is utilized to directly declare the configurations that are valid and should be included in the solution space.
julia
concept(:supports, x; pair_vars)
+concept(:supports)(x; pair_vars)
  • :conflicts: Global constraint ensuring that x does not match any configuration listed within the conflict set pair_vars. This constraint, originating from the extension model, stipulates that x must avoid all configurations defined as conflicts: x ∉ pair_vars. It is useful for specifying configurations that are explicitly forbidden and should be excluded from the solution space.
julia
concept(:conflicts, x; pair_vars)
 concept(:conflicts)(x; pair_vars)

Examples

julia
c = concept(:extension)
 c([1, 2, 3, 4, 5]; pair_vars=[[1, 2, 3, 4, 5]])
 c([1, 2, 3, 4, 5]; pair_vars=([[1, 2, 3, 4, 5]], [[1, 2, 1, 4, 5], [1, 2, 3, 5, 5]]))
@@ -100,20 +100,20 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.CBLuZwrP.js";const E
 c([1, 2, 3, 4, 5]; pair_vars=[[1, 2, 3, 4, 5]])
 
 c = concept(:conflicts)
-c([1, 2, 3, 4, 5]; pair_vars=[[1, 2, 1, 4, 5], [1, 2, 3, 5, 5]])

source


# Constraints.xcsp_instantiationMethod.
julia
xcsp_instantiation(; list, values)

Return true if the instantiation constraint is satisfied, false otherwise. The instantiation constraint is a global constraint used in constraint programming that ensures that a list of variables takes on a specific set of values in a specific order.

Arguments

  • list::AbstractVector: list of values to check.

  • values::AbstractVector: list of values to check against.

Variants

  • :instantiation: The instantiation constraint is a global constraint used in constraint programming that ensures that a list of variables takes on a specific set of values in a specific order.
julia
concept(:instantiation, x; pair_vars)
+c([1, 2, 3, 4, 5]; pair_vars=[[1, 2, 1, 4, 5], [1, 2, 3, 5, 5]])

source

`,14))]),i("details",Qs,[i("summary",null,[s[270]||(s[270]=i("a",{id:"Constraints.xcsp_instantiation-Tuple{}",href:"#Constraints.xcsp_instantiation-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_instantiation")],-1)),s[271]||(s[271]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[272]||(s[272]=l(`
julia
xcsp_instantiation(; list, values)

Return true if the instantiation constraint is satisfied, false otherwise. The instantiation constraint is a global constraint ensuring that x takes on a specific set of values in a specific order.

Arguments

  • list::AbstractVector: list of values to check.

  • values::AbstractVector: list of values to check against.

Variants

  • :instantiation: Global constraint ensuring that x takes on a specific set of values in a specific order.
julia
concept(:instantiation, x; pair_vars)
 concept(:instantiation)(x; pair_vars)

Examples

julia
c = concept(:instantiation)
 
 c([1, 2, 3, 4, 5]; pair_vars=[1, 2, 3, 4, 5])
-c([1, 2, 3, 4, 5]; pair_vars=[1, 2, 3, 4, 6])

source


# Constraints.xcsp_intensionMethod.
julia
xcsp_intension(list, predicate)

An intensional constraint is usually defined from a predicate over list. As such it encompass any generic constraint.

Arguments

  • list::Vector{Int}: A list of variables

  • predicate::Function: A predicate over list

Variants

  • :dist_different: A constraint ensuring that the distances between marks on the ruler are unique. Specifically, it checks that the distance between x[1] and x[2], and the distance between x[3] and x[4], are different. This constraint is fundamental in ensuring the validity of a Golomb ruler, where no two pairs of marks should have the same distance between them.
julia
concept(:dist_different, x)
+c([1, 2, 3, 4, 5]; pair_vars=[1, 2, 3, 4, 6])

source

`,10))]),i("details",Ws,[i("summary",null,[s[273]||(s[273]=i("a",{id:"Constraints.xcsp_intension-Tuple{}",href:"#Constraints.xcsp_intension-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_intension")],-1)),s[274]||(s[274]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[275]||(s[275]=l(`
julia
xcsp_intension(list, predicate)

An intensional constraint is usually defined from a predicate over list. As such it encompass any generic constraint.

Arguments

  • list::Vector{Int}: A list of variables

  • predicate::Function: A predicate over list

Variants

  • :dist_different: Given a 4-dimensional vector x, ensures that the absolute difference between x[1] and x[2], and between x[3] and x[4], are different. This constraint is fundamental in ensuring the validity of a Golomb ruler, where no two pairs of marks should have the same distance between them.
julia
concept(:dist_different, x)
 concept(:dist_different)(x)

Examples

@example
2 + 2
@example
2 + 2
@example
using Constraints # hide
 c = concept(:dist_different)
 c([1, 2, 3, 3]) && !c([1, 2, 3, 4])
@example
using Constraints # hide
 c = concept(:dist_different)
-c([1, 2, 3, 3]) && !c([1, 2, 3, 4])

source


# Constraints.xcsp_maximumMethod.
julia
xcsp_maximum(; list, condition)

Return true if the maximum constraint is satisfied, false otherwise. The maximum constraint is a global constraint used in constraint programming that specifies that a certain condition should hold for the maximum value in a list of variables.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • condition::Tuple: condition to check.

Variants

  • :maximum: The maximum constraint is a global constraint used in constraint programming that specifies that a certain condition should hold for the maximum value in a list of variables.
julia
concept(:maximum, x; op, val)
+c([1, 2, 3, 3]) && !c([1, 2, 3, 4])

source

`,13))]),i("details",Ys,[i("summary",null,[s[276]||(s[276]=i("a",{id:"Constraints.xcsp_maximum-Tuple{}",href:"#Constraints.xcsp_maximum-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_maximum")],-1)),s[277]||(s[277]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[278]||(s[278]=l(`
julia
xcsp_maximum(; list, condition)

Return true if the maximum constraint is satisfied, false otherwise. The maximum constraint is a global constraint specifying that a certain condition should hold for the maximum value in a list of variables.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • condition::Tuple: condition to check.

Variants

  • :maximum: Global constraint ensuring that a certain numerical condition holds for the maximum value in x.
julia
concept(:maximum, x; op, val)
 concept(:maximum)(x; op, val)

Examples

julia
c = concept(:maximum)
 
 c([1, 2, 3, 4, 5]; op = ==, val = 5)
-c([1, 2, 3, 4, 5]; op = ==, val = 6)

source


# Constraints.xcsp_mddMethod.
julia
xcsp_mdd(; list, diagram)

Return a function that checks if the list of values list satisfies the MDD diagram.

Arguments

  • list::Vector{Int}: list of values to check.

  • diagram::MDD: MDD to check.

Variants

  • :mdd: Multi-valued Decision Diagram (MDD) constraint. The MDD constraint is a constraint that can be used to model a wide range of problems. It is a directed graph where each node is labeled with a value and each edge is labeled with a value. The constraint is satisfied if there is a path from the first node to the last node such that the sequence of edge labels is a valid sequence of the value labels.
julia
concept(:mdd, x; language)
+c([1, 2, 3, 4, 5]; op = ==, val = 6)

source

`,10))]),i("details",$s,[i("summary",null,[s[279]||(s[279]=i("a",{id:"Constraints.xcsp_mdd-Tuple{}",href:"#Constraints.xcsp_mdd-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_mdd")],-1)),s[280]||(s[280]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[281]||(s[281]=l(`
julia
xcsp_mdd(; list, diagram)

Return a function that checks if the list of values list satisfies the MDD diagram.

Arguments

  • list::Vector{Int}: list of values to check.

  • diagram::MDD: MDD to check.

Variants

  • :mdd: Multi-valued Decision Diagram (MDD) constraint.

The MDD constraint is a constraint that can be used to model a wide range of problems. It is a directed graph where each node is labeled with a value and each edge is labeled with a value. The constraint is satisfied if there is a path from the first node to the last node such that the sequence of edge labels is a valid sequence of the value labels.

julia
concept(:mdd, x; language)
 concept(:mdd)(x; language)

Examples

julia
c = concept(:mdd)
 
 states = [
@@ -140,13 +140,13 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.CBLuZwrP.js";const E
 c([2,0,0]; language = a)
 c([2,1,2]; language = a)
 c([1,0,2]; language = a)
-c([0,1,2]; language = a)

source


# Constraints.xcsp_minimumMethod.
julia
xcsp_minimum(; list, condition)

Return true if the minimum constraint is satisfied, false otherwise. The minimum constraint is a global constraint used in constraint programming that specifies that a certain condition should hold for the minimum value in a list of variables.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • condition::Tuple: condition to check.

Variants

  • :minimum: The minimum constraint is a global constraint used in constraint programming that specifies that a certain condition should hold for the minimum value in a list of variables.
julia
concept(:minimum, x; op, val)
+c([0,1,2]; language = a)

source

`,11))]),i("details",Ks,[i("summary",null,[s[282]||(s[282]=i("a",{id:"Constraints.xcsp_minimum-Tuple{}",href:"#Constraints.xcsp_minimum-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_minimum")],-1)),s[283]||(s[283]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[284]||(s[284]=l(`
julia
xcsp_minimum(; list, condition)

Return true if the minimum constraint is satisfied, false otherwise. The minimum constraint is a global constraint specifying that a certain condition should hold for the minimum value in a list of variables.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • condition::Tuple: condition to check.

Variants

  • :minimum: Global constraint ensuring that a certain numerical condition holds for the minimum value in x.
julia
concept(:minimum, x; op, val)
 concept(:minimum)(x; op, val)

Examples

julia
c = concept(:minimum)
 
 c([1, 2, 3, 4, 5]; op = ==, val = 1)
-c([1, 2, 3, 4, 5]; op = ==, val = 0)

source


# Constraints.xcsp_no_overlapMethod.
julia
xcsp_no_overlap(; origins, lengths, zero_ignored)

Return true if the no_overlap constraint is satisfied, false otherwise. The no_overlap constraint is a global constraint used in constraint programming, often in scheduling problems. It ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts.

Arguments

  • origins::AbstractVector: list of origins of the tasks.

  • lengths::AbstractVector: list of lengths of the tasks.

  • zero_ignored::Bool: whether to ignore zero-length tasks.

Variants

  • :no_overlap: The no_overlap constraint is a global constraint used in constraint programming, often in scheduling problems. It ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts.
julia
concept(:no_overlap, x; pair_vars, bool)
-concept(:no_overlap)(x; pair_vars, bool)
  • :no_overlap_no_zero: The no_overlap constraint is a global constraint used in constraint programming, often in scheduling problems. It ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts. This variant ignores zero-length tasks.
julia
concept(:no_overlap_no_zero, x; pair_vars)
-concept(:no_overlap_no_zero)(x; pair_vars)
  • :no_overlap_with_zero: The no_overlap constraint is a global constraint used in constraint programming, often in scheduling problems. It ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts. This variant includes zero-length tasks.
julia
concept(:no_overlap_with_zero, x; pair_vars)
+c([1, 2, 3, 4, 5]; op = ==, val = 0)

source

`,10))]),i("details",Hs,[i("summary",null,[s[285]||(s[285]=i("a",{id:"Constraints.xcsp_no_overlap-Tuple{Any, Any, Any}",href:"#Constraints.xcsp_no_overlap-Tuple{Any, Any, Any}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_no_overlap")],-1)),s[286]||(s[286]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[287]||(s[287]=l(`
julia
xcsp_no_overlap(; origins, lengths, zero_ignored)

Return true if the no_overlap constraint is satisfied, false otherwise. The no_overlap constraint is a global constraint used in constraint programming, often in scheduling problems. It ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts.

Arguments

  • origins::AbstractVector: list of origins of the tasks.

  • lengths::AbstractVector: list of lengths of the tasks.

  • zero_ignored::Bool: whether to ignore zero-length tasks.

Variants

  • :no_overlap: Global constraint operating on a set of tasks, defined by origin (starting times), and length. This constraint ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts. Often used in scheduling problems.
julia
concept(:no_overlap, x; pair_vars, bool)
+concept(:no_overlap)(x; pair_vars, bool)
  • :no_overlap_no_zero: Global constraint operating on a set of tasks, defined by origin (starting times), and length. This constraint ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts. This variant ignores zero-length tasks. Often used in scheduling problems.
julia
concept(:no_overlap_no_zero, x; pair_vars)
+concept(:no_overlap_no_zero)(x; pair_vars)
  • :no_overlap_with_zero: Global constraint operating on a set of tasks, defined by origin (starting times), and length. This constraint ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts. This variant includes zero-length tasks. Often used in scheduling problems.
julia
concept(:no_overlap_with_zero, x; pair_vars)
 concept(:no_overlap_with_zero)(x; pair_vars)

Examples

julia
c = concept(:no_overlap)
 
 c([1, 2, 3, 4, 5])
@@ -155,13 +155,13 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.CBLuZwrP.js";const E
 c([1, 2, 4, 6, 3]; pair_vars = [1, 1, 1, 3, 1])
 c([1, 2, 4, 6, 3]; pair_vars = [1, 1, 3, 1, 1])
 c([1, 1, 1, 3, 5, 2, 7, 7, 5, 12, 8, 7]; pair_vars = [2, 4, 1, 4 ,2 ,3, 5, 1, 2, 3, 3, 2], dim = 3)
-c([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]; pair_vars = [2, 4, 1, 4 ,2 ,3, 5, 1, 2, 3, 3, 2], dim = 3)

source


# Constraints.xcsp_nvaluesMethod.
julia
xcsp_nvalues(list, condition, except)

Return true if the number of distinct values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • condition: condition to satisfy.

  • except::Union{Nothing, Vector{Int}}: list of values to exclude. Default is nothing.

Variants

  • :nvalues: The nValues constraint specifies that the number of distinct values in the list of variables x is equal to a given value. The constraint is defined by the following expression: nValues(x, op, val) where x is a list of variables, op is a comparison operator, and val is an integer value.
julia
concept(:nvalues, x; op, val)
+c([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]; pair_vars = [2, 4, 1, 4 ,2 ,3, 5, 1, 2, 3, 3, 2], dim = 3)

source

`,14))]),i("details",Zs,[i("summary",null,[s[288]||(s[288]=i("a",{id:"Constraints.xcsp_nvalues-Tuple{Any, Any, Nothing}",href:"#Constraints.xcsp_nvalues-Tuple{Any, Any, Nothing}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_nvalues")],-1)),s[289]||(s[289]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[290]||(s[290]=l(`
julia
xcsp_nvalues(list, condition, except)

Return true if the number of distinct values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • condition: condition to satisfy.

  • except::Union{Nothing, Vector{Int}}: list of values to exclude. Default is nothing.

Variants

  • :nvalues: Ensures that the number of distinct values in x satisfies a given numerical condition.

The constraint is defined by the following expression: nValues(x, op, val) where x is a list of variables, op is a comparison operator, and val is an integer value.

julia
concept(:nvalues, x; op, val)
 concept(:nvalues)(x; op, val)

Examples

julia
c = concept(:nvalues)
 
 c([1, 2, 3, 4, 5]; op = ==, val = 5)
 c([1, 2, 3, 4, 5]; op = ==, val = 2)
 c([1, 2, 3, 4, 3]; op = <=, val = 5)
-c([1, 2, 3, 4, 3]; op = <=, val = 3)

source


# Constraints.xcsp_orderedMethod.
julia
xcsp_ordered(list::Vector{Int}, operator, lengths)

Return true if all the values of list are in an increasing order, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • operator: comparison operator to use.

  • lengths: list of lengths to use. Defaults to nothing.

Variants

  • :ordered: Global constraint ensuring that all the values of x are in an increasing order.
julia
concept(:ordered, x; op=≤, pair_vars=nothing)
+c([1, 2, 3, 4, 3]; op = <=, val = 3)

source

`,11))]),i("details",si,[i("summary",null,[s[291]||(s[291]=i("a",{id:"Constraints.xcsp_ordered-Tuple{Any, Any, Nothing}",href:"#Constraints.xcsp_ordered-Tuple{Any, Any, Nothing}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_ordered")],-1)),s[292]||(s[292]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[293]||(s[293]=l(`
julia
xcsp_ordered(list::Vector{Int}, operator, lengths)

Return true if all the values of list are in an increasing order, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • operator: comparison operator to use.

  • lengths: list of lengths to use. Defaults to nothing.

Variants

  • :ordered: Global constraint ensuring that all the values of x are in a total order defined by a comparison operator.
julia
concept(:ordered, x; op=≤, pair_vars=nothing)
 concept(:ordered)(x; op=≤, pair_vars=nothing)
  • :increasing: Global constraint ensuring that all the values of x are in an increasing order.
julia
concept(:increasing, x; op=≤, pair_vars=nothing)
 concept(:increasing)(x; op=≤, pair_vars=nothing)
  • :decreasing: Global constraint ensuring that all the values of x are in a decreasing order.
julia
concept(:decreasing, x; op=≥, pair_vars=nothing)
 concept(:decreasing)(x; op=≥, pair_vars=nothing)
  • :strictly_increasing: Global constraint ensuring that all the values of x are in a strictly increasing order.
julia
concept(:strictly_increasing, x; op=<, pair_vars=nothing)
@@ -171,9 +171,7 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.CBLuZwrP.js";const E
 c([1, 2, 3, 4, 4]; op=≤)
 c([1, 2, 3, 4, 5]; op=<)
 !c([1, 2, 3, 4, 3]; op=≤)
-!c([1, 2, 3, 4, 3]; op=<)

source


# Constraints.xcsp_regularMethod.
julia
xcsp_regular(; list, automaton)
-
-Ensures that a sequence \`x\` (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of \`x\` with the language rules encoded within the \`automaton\` parameter, which must be an instance of \`<:AbstractAutomaton\`.

Arguments

  • list::Vector{Int}: A list of variables

  • automaton<:AbstractAutomaton: An automaton representing the regular language

Variants

  • :regular: Ensures that a sequence x (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of x with the language rules encoded within the automaton parameter, which must be an instance of <:AbstractAutomaton.
julia
concept(:regular, x; language)
+!c([1, 2, 3, 4, 3]; op=<)

source

`,18))]),i("details",ii,[i("summary",null,[s[294]||(s[294]=i("a",{id:"Constraints.xcsp_regular-Tuple{}",href:"#Constraints.xcsp_regular-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_regular")],-1)),s[295]||(s[295]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[296]||(s[296]=l(`
julia
xcsp_regular(; list, automaton)

Ensures that a sequence x (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of x with the language rules encoded within the automaton parameter, which must be an instance of <:AbstractAutomaton.

Arguments

  • list::Vector{Int}: A list of variables

  • automaton<:AbstractAutomaton: An automaton representing the regular language

Variants

  • :regular: Ensures that a sequence x (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of x with the language rules encoded within the automaton parameter, which must be an instance of <:AbstractAutomaton.
julia
concept(:regular, x; language)
 concept(:regular)(x; language)

Examples

julia
c = concept(:regular)
 
 states = Dict(
@@ -191,20 +189,20 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.CBLuZwrP.js";const E
 a = Automaton(states, start, finish)
 
 c([0,0,1,1,0,0,1,0,0]; language = a)
-c([1,1,1,0,1]; language = a)

source


# Constraints.xcsp_sumMethod.
julia
xcsp_sum(list, coeffs, condition)

Return true if the sum of the variables in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • coeffs::Vector{Int}: list of coefficients to use.

  • condition: condition to satisfy.

Variants

  • :sum: Global constraint ensuring that the sum of the variables in x satisfies a given condition.
julia
concept(:sum, x; op===, pair_vars=ones(x), val)
+c([1,1,1,0,1]; language = a)

source

`,10))]),i("details",ai,[i("summary",null,[s[297]||(s[297]=i("a",{id:"Constraints.xcsp_sum-Tuple{}",href:"#Constraints.xcsp_sum-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_sum")],-1)),s[298]||(s[298]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[299]||(s[299]=l(`
julia
xcsp_sum(list, coeffs, condition)

Return true if the sum of the variables in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • coeffs::Vector{Int}: list of coefficients to use.

  • condition: condition to satisfy.

Variants

  • :sum: Global constraint ensuring that the sum of the variables in x satisfies a given numerical condition.
julia
concept(:sum, x; op===, pair_vars=ones(x), val)
 concept(:sum)(x; op===, pair_vars=ones(x), val)

Examples

julia
c = concept(:sum)
 
 c([1, 2, 3, 4, 5]; op===, val=15)
 c([1, 2, 3, 4, 5]; op===, val=2)
 c([1, 2, 3, 4, 3]; op=≤, val=15)
-c([1, 2, 3, 4, 3]; op=≤, val=3)

source


# Constraints.@usualMacro.
julia
usual(ex::Expr)

This macro is used to define a new constraint or update an existing one in the USUAL_CONSTRAINTS dictionary. It takes an expression ex as input, which represents the definition of a constraint.

Here's a step-by-step explanation of what the macro does:

  1. It first extracts the symbol of the concept from the input expression. This symbol is expected to be the first argument of the first argument of the expression. For example, if the expression is @usual all_different(x; y=1), the symbol would be :all_different.

  2. It then calls the shrink_concept function on the symbol to get a simplified version of the concept symbol.

  3. It initializes a dictionary defaults to store whether each keyword argument of the concept has a default value or not.

  4. It checks if the expression has more than two arguments. If it does, it means that there are keyword arguments present. It then loops over these keyword arguments. If a keyword argument is a symbol, it means it doesn't have a default value, so it adds an entry to the defaults dictionary with the keyword argument as the key and false as the value. If a keyword argument is not a symbol, it means it has a default value, so it adds an entry to the defaults dictionary with the keyword argument as the key and true as the value.

  5. It calls the make_error function on the simplified concept symbol to generate an error function for the constraint.

  6. It evaluates the input expression to get the concept function.

  7. It checks if the USUAL_CONSTRAINTS dictionary already contains an entry for the simplified concept symbol. If it does, it adds the defaults dictionary to the parameters of the existing constraint. If it doesn't, it creates a new constraint with the concept function, a description, the error function, and the defaults dictionary as the parameters, and adds it to the USUAL_CONSTRAINTS dictionary.

This macro is used to make it easier to define and update constraints in a consistent and possibly automated way.

Arguments

  • ex::Expr: expression to parse.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source


# CompositionalNetworks.CompositionType.
julia
struct Composition{F<:Function}

Store the all the information of a composition learned by an ICN.

source


# CompositionalNetworks.CompositionMethod.
julia
Composition(f::F, symbols) where {F<:Function}

Construct a Composition.

source


# CompositionalNetworks.ICNType.
julia
ICN(; nvars, dom_size, param, transformation, arithmetic, aggregation, comparison)

Construct an Interpretable Compositional Network, with the following arguments:

  • nvars: number of variable in the constraint

  • dom_size: maximum domain size of any variable in the constraint

  • param: optional parameter (default to nothing)

  • transformation: a transformation layer (optional)

  • arithmetic: a arithmetic layer (optional)

  • aggregation: a aggregation layer (optional)

  • comparison: a comparison layer (optional)

source


# CompositionalNetworks.LayerType.
julia
Layer

A structure to store a LittleDict of operations that can be selected during the learning phase of an ICN. If the layer is exclusive, only one operation can be selected at a time.

source


# Base.lengthMethod.
julia
length(layer)

Return the number of operations in a layer.

source


# Base.lengthMethod.
julia
Base.length(icn)

Return the total number of operations of an ICN.

source


# CompositionalNetworks._composeMethod.
julia
_compose(icn)

Internal function called by compose and show_composition.

source


# CompositionalNetworks.ag_count_positiveMethod.
julia
ag_count_positive(x)

Count the number of strictly positive elements of x.

source


# CompositionalNetworks.ag_sumMethod.
julia
ag_sum(x)

Aggregate through + a vector into a single scalar.

source


# CompositionalNetworks.aggregation_layerMethod.
julia
aggregation_layer()

Generate the layer of aggregations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source


# CompositionalNetworks.ar_prodMethod.
julia
ar_prod(x)

Reduce k = length(x) vectors through product to a single vector.

source


# CompositionalNetworks.ar_sumMethod.
julia
ar_sum(x)

Reduce k = length(x) vectors through sum to a single vector.

source


# CompositionalNetworks.arithmetic_layerMethod.
julia
arithmetic_layer()

Generate the layer of arithmetic operations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source


# CompositionalNetworks.as_bitvectorFunction.
julia
as_bitvector(n::Int, max_n::Int = n)

Convert an Int to a BitVector of minimal size (relatively to max_n).

source


# CompositionalNetworks.as_intMethod.
julia
as_int(v::AbstractVector)

Convert a BitVector into an Int.

source


# CompositionalNetworks.co_abs_diff_var_valMethod.
julia
co_abs_diff_var_val(x; val)

Return the absolute difference between x and val.

source


# CompositionalNetworks.co_abs_diff_var_varsMethod.
julia
co_abs_diff_var_vars(x; nvars)

Return the absolute difference between x and the number of variables nvars.

source


# CompositionalNetworks.co_euclideanMethod.
julia
co_euclidean(x; dom_size)

Compute an euclidean norm with domain size dom_size of a scalar.

source


# CompositionalNetworks.co_euclidean_valMethod.
julia
co_euclidean_val(x; val, dom_size)

Compute an euclidean norm with domain size dom_size, weighted by val, of a scalar.

source


# CompositionalNetworks.co_identityMethod.
julia
co_identity(x)

Identity function. Already defined in Julia as identity, specialized for scalars in the comparison layer.

source


# CompositionalNetworks.co_val_minus_varMethod.
julia
co_val_minus_var(x; val)

Return the difference val - x if positive, 0.0 otherwise.

source


# CompositionalNetworks.co_var_minus_valMethod.
julia
co_var_minus_val(x; val)

Return the difference x - val if positive, 0.0 otherwise.

source


# CompositionalNetworks.co_var_minus_varsMethod.
julia
co_var_minus_vars(x; nvars)

Return the difference x - nvars if positive, 0.0 otherwise, where nvars denotes the numbers of variables.

source


# CompositionalNetworks.co_vars_minus_varMethod.
julia
co_vars_minus_var(x; nvars)

Return the difference nvars - x if positive, 0.0 otherwise, where nvars denotes the numbers of variables.

source


# CompositionalNetworks.codeFunction.
julia
code(c::Composition, lang=:maths; name="composition")

Access the code of a composition c in a given language lang. The name of the generated method is optional.

source


# CompositionalNetworks.comparison_layerFunction.
julia
comparison_layer(param = false)

Generate the layer of transformations functions of the ICN. Iff param value is set, also includes all the parametric comparison with that value. The operations are mutually exclusive, that is only one will be selected.

source


# CompositionalNetworks.composeFunction.
julia
compose(icn, weights=nothing)

Return a function composed by some of the operations of a given ICN. Can be applied to any vector of variables. If weights are given, will assign to icn.

source


# CompositionalNetworks.compose_to_file!Method.
julia
compose_to_file!(concept, name, path; domains, param = nothing, language = :Julia, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200)

Explore, learn and compose a function and write it to a file.

Arguments:

  • concept: the concept to learn

  • name: the name to give to the constraint

  • path: path of the output file

Keywords arguments:

  • domains: domains that defines the search space

  • param: an optional parameter of the constraint

  • language: the language to export to, default to :julia

  • search: either :partial or :complete search

  • global_iter: number of learning iteration

  • local_iter: number of generation in the genetic algorithm

  • metric: the metric to measure the distance between a configuration and known solutions

  • popSize: size of the population in the genetic algorithm

source


# CompositionalNetworks.compositionMethod.
julia
composition(c::Composition)

Access the actual method of an ICN composition c.

source


# CompositionalNetworks.composition_to_file!Function.
julia
composition_to_file!(c::Composition, path, name, language=:Julia)

Write the composition code in a given language into a file at path.

source


# CompositionalNetworks.excluMethod.
julia
exclu(layer)

Return true if the layer has mutually exclusive operations.

source


# CompositionalNetworks.explore_learn_composeMethod.
julia
explore_learn_compose(concept; domains, param = nothing, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200, action = :composition)

Explore a search space, learn a composition from an ICN, and compose an error function.

Arguments:

  • concept: the concept of the targeted constraint

  • domains: domains of the variables that define the training space

  • param: an optional parameter of the constraint

  • search: either flexible,:partial or :complete search. Flexible search will use search_limit and solutions_limit to determine if the search space needs to be partially or completely explored

  • global_iter: number of learning iteration

  • local_iter: number of generation in the genetic algorithm

  • metric: the metric to measure the distance between a configuration and known solutions

  • popSize: size of the population in the genetic algorithm

  • action: either :symbols to have a description of the composition or :composition to have the composed function itself

source


# CompositionalNetworks.functionsMethod.
julia
functions(layer)

Access the operations of a layer. The container is ordered.

source


# CompositionalNetworks.generateMethod.
julia
generate(c::Composition, name, lang)

Generates the code of c in a specific language lang.

source


# CompositionalNetworks.generate_exclusive_operationMethod.
julia
generate_exclusive_operation(max_op_number)

Generates the operations (weights) of a layer with exclusive operations.

source


# CompositionalNetworks.generate_inclusive_operationsMethod.
julia
generate_inclusive_operations(predicate, bits)
-generate_exclusive_operation(max_op_number)

Generates the operations (weights) of a layer with inclusive/exclusive operations.

source


# CompositionalNetworks.generate_weightsMethod.
julia
generate_weights(layers)
-generate_weights(icn)

Generate the weights of a collection of layers or of an ICN.

source


# CompositionalNetworks.hammingMethod.
julia
hamming(x, X)

Compute the hamming distance of x over a collection of solutions X, i.e. the minimal number of variables to switch in xto reach a solution.

source


# CompositionalNetworks.is_viableMethod.
julia
is_viable(layer, w)
+c([1, 2, 3, 4, 3]; op=≤, val=3)

source

`,10))]),i("details",ti,[i("summary",null,[s[300]||(s[300]=i("a",{id:"Constraints.@usual-Tuple{Expr}",href:"#Constraints.@usual-Tuple{Expr}"},[i("span",{class:"jlbinding"},"Constraints.@usual")],-1)),s[301]||(s[301]=a()),n(t,{type:"info",class:"jlObjectType jlMacro",text:"Macro"})]),s[302]||(s[302]=l('
julia
usual(ex::Expr)

This macro is used to define a new constraint or update an existing one in the USUAL_CONSTRAINTS dictionary. It takes an expression ex as input, which represents the definition of a constraint.

Here's a step-by-step explanation of what the macro does:

  1. It first extracts the symbol of the concept from the input expression. This symbol is expected to be the first argument of the first argument of the expression. For example, if the expression is @usual all_different(x; y=1), the symbol would be :all_different.

  2. It then calls the shrink_concept function on the symbol to get a simplified version of the concept symbol.

  3. It initializes a dictionary defaults to store whether each keyword argument of the concept has a default value or not.

  4. It checks if the expression has more than two arguments. If it does, it means that there are keyword arguments present. It then loops over these keyword arguments. If a keyword argument is a symbol, it means it doesn't have a default value, so it adds an entry to the defaults dictionary with the keyword argument as the key and false as the value. If a keyword argument is not a symbol, it means it has a default value, so it adds an entry to the defaults dictionary with the keyword argument as the key and true as the value.

  5. It calls the make_error function on the simplified concept symbol to generate an error function for the constraint.

  6. It evaluates the input expression to get the concept function.

  7. It checks if the USUAL_CONSTRAINTS dictionary already contains an entry for the simplified concept symbol. If it does, it adds the defaults dictionary to the parameters of the existing constraint. If it doesn't, it creates a new constraint with the concept function, a description, the error function, and the defaults dictionary as the parameters, and adds it to the USUAL_CONSTRAINTS dictionary.

This macro is used to make it easier to define and update constraints in a consistent and possibly automated way.

Arguments

  • ex::Expr: expression to parse.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source

',10))]),i("details",ni,[i("summary",null,[s[303]||(s[303]=i("a",{id:"CompositionalNetworks.Composition",href:"#CompositionalNetworks.Composition"},[i("span",{class:"jlbinding"},"CompositionalNetworks.Composition")],-1)),s[304]||(s[304]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[305]||(s[305]=l('
julia
struct Composition{F<:Function}

Store the all the information of a composition learned by an ICN.

source

',3))]),i("details",li,[i("summary",null,[s[306]||(s[306]=i("a",{id:"CompositionalNetworks.Composition-Union{Tuple{F}, Tuple{F, Any}} where F<:Function",href:"#CompositionalNetworks.Composition-Union{Tuple{F}, Tuple{F, Any}} where F<:Function"},[i("span",{class:"jlbinding"},"CompositionalNetworks.Composition")],-1)),s[307]||(s[307]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[308]||(s[308]=l('
julia
Composition(f::F, symbols) where {F<:Function}

Construct a Composition.

source

',3))]),i("details",ei,[i("summary",null,[s[309]||(s[309]=i("a",{id:"CompositionalNetworks.ICN",href:"#CompositionalNetworks.ICN"},[i("span",{class:"jlbinding"},"CompositionalNetworks.ICN")],-1)),s[310]||(s[310]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[311]||(s[311]=l('
julia
ICN(; nvars, dom_size, param, transformation, arithmetic, aggregation, comparison)

Construct an Interpretable Compositional Network, with the following arguments:

  • nvars: number of variable in the constraint

  • dom_size: maximum domain size of any variable in the constraint

  • param: optional parameter (default to nothing)

  • transformation: a transformation layer (optional)

  • arithmetic: a arithmetic layer (optional)

  • aggregation: a aggregation layer (optional)

  • comparison: a comparison layer (optional)

source

',4))]),i("details",pi,[i("summary",null,[s[312]||(s[312]=i("a",{id:"CompositionalNetworks.Layer",href:"#CompositionalNetworks.Layer"},[i("span",{class:"jlbinding"},"CompositionalNetworks.Layer")],-1)),s[313]||(s[313]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[314]||(s[314]=l('
julia
Layer

A structure to store a LittleDict of operations that can be selected during the learning phase of an ICN. If the layer is exclusive, only one operation can be selected at a time.

source

',3))]),i("details",hi,[i("summary",null,[s[315]||(s[315]=i("a",{id:"Base.length-Tuple{CompositionalNetworks.Layer}",href:"#Base.length-Tuple{CompositionalNetworks.Layer}"},[i("span",{class:"jlbinding"},"Base.length")],-1)),s[316]||(s[316]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[317]||(s[317]=l('
julia
length(layer)

Return the number of operations in a layer.

source

',3))]),i("details",ki,[i("summary",null,[s[318]||(s[318]=i("a",{id:"Base.length-Tuple{ICN}",href:"#Base.length-Tuple{ICN}"},[i("span",{class:"jlbinding"},"Base.length")],-1)),s[319]||(s[319]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[320]||(s[320]=l('
julia
Base.length(icn)

Return the total number of operations of an ICN.

source

',3))]),i("details",oi,[i("summary",null,[s[321]||(s[321]=i("a",{id:"CompositionalNetworks._compose-Tuple{ICN}",href:"#CompositionalNetworks._compose-Tuple{ICN}"},[i("span",{class:"jlbinding"},"CompositionalNetworks._compose")],-1)),s[322]||(s[322]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[323]||(s[323]=l('
julia
_compose(icn)

Internal function called by compose and show_composition.

source

',3))]),i("details",ri,[i("summary",null,[s[324]||(s[324]=i("a",{id:"CompositionalNetworks.ag_count_positive-Tuple{Any}",href:"#CompositionalNetworks.ag_count_positive-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.ag_count_positive")],-1)),s[325]||(s[325]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[326]||(s[326]=l('
julia
ag_count_positive(x)

Count the number of strictly positive elements of x.

source

',3))]),i("details",di,[i("summary",null,[s[327]||(s[327]=i("a",{id:"CompositionalNetworks.ag_sum-Tuple{Any}",href:"#CompositionalNetworks.ag_sum-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.ag_sum")],-1)),s[328]||(s[328]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[329]||(s[329]=l('
julia
ag_sum(x)

Aggregate through + a vector into a single scalar.

source

',3))]),i("details",gi,[i("summary",null,[s[330]||(s[330]=i("a",{id:"CompositionalNetworks.aggregation_layer-Tuple{}",href:"#CompositionalNetworks.aggregation_layer-Tuple{}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.aggregation_layer")],-1)),s[331]||(s[331]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[332]||(s[332]=l('
julia
aggregation_layer()

Generate the layer of aggregations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source

',3))]),i("details",Ei,[i("summary",null,[s[333]||(s[333]=i("a",{id:"CompositionalNetworks.ar_prod-Tuple{Any}",href:"#CompositionalNetworks.ar_prod-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.ar_prod")],-1)),s[334]||(s[334]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[335]||(s[335]=l('
julia
ar_prod(x)

Reduce k = length(x) vectors through product to a single vector.

source

',3))]),i("details",ci,[i("summary",null,[s[336]||(s[336]=i("a",{id:"CompositionalNetworks.ar_sum-Tuple{Any}",href:"#CompositionalNetworks.ar_sum-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.ar_sum")],-1)),s[337]||(s[337]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[338]||(s[338]=l('
julia
ar_sum(x)

Reduce k = length(x) vectors through sum to a single vector.

source

',3))]),i("details",yi,[i("summary",null,[s[339]||(s[339]=i("a",{id:"CompositionalNetworks.arithmetic_layer-Tuple{}",href:"#CompositionalNetworks.arithmetic_layer-Tuple{}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.arithmetic_layer")],-1)),s[340]||(s[340]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[341]||(s[341]=l('
julia
arithmetic_layer()

Generate the layer of arithmetic operations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source

',3))]),i("details",ui,[i("summary",null,[s[342]||(s[342]=i("a",{id:"CompositionalNetworks.as_bitvector",href:"#CompositionalNetworks.as_bitvector"},[i("span",{class:"jlbinding"},"CompositionalNetworks.as_bitvector")],-1)),s[343]||(s[343]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[344]||(s[344]=l('
julia
as_bitvector(n::Int, max_n::Int = n)

Convert an Int to a BitVector of minimal size (relatively to max_n).

source

',3))]),i("details",Ci,[i("summary",null,[s[345]||(s[345]=i("a",{id:"CompositionalNetworks.as_int-Tuple{AbstractVector}",href:"#CompositionalNetworks.as_int-Tuple{AbstractVector}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.as_int")],-1)),s[346]||(s[346]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[347]||(s[347]=l('
julia
as_int(v::AbstractVector)

Convert a BitVector into an Int.

source

',3))]),i("details",mi,[i("summary",null,[s[348]||(s[348]=i("a",{id:"CompositionalNetworks.co_abs_diff_var_val-Tuple{Any}",href:"#CompositionalNetworks.co_abs_diff_var_val-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.co_abs_diff_var_val")],-1)),s[349]||(s[349]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[350]||(s[350]=l('
julia
co_abs_diff_var_val(x; val)

Return the absolute difference between x and val.

source

',3))]),i("details",Fi,[i("summary",null,[s[351]||(s[351]=i("a",{id:"CompositionalNetworks.co_abs_diff_var_vars-Tuple{Any}",href:"#CompositionalNetworks.co_abs_diff_var_vars-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.co_abs_diff_var_vars")],-1)),s[352]||(s[352]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[353]||(s[353]=l('
julia
co_abs_diff_var_vars(x; nvars)

Return the absolute difference between x and the number of variables nvars.

source

',3))]),i("details",bi,[i("summary",null,[s[354]||(s[354]=i("a",{id:"CompositionalNetworks.co_euclidean-Tuple{Any}",href:"#CompositionalNetworks.co_euclidean-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.co_euclidean")],-1)),s[355]||(s[355]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[356]||(s[356]=l('
julia
co_euclidean(x; dom_size)

Compute an euclidean norm with domain size dom_size of a scalar.

source

',3))]),i("details",vi,[i("summary",null,[s[357]||(s[357]=i("a",{id:"CompositionalNetworks.co_euclidean_val-Tuple{Any}",href:"#CompositionalNetworks.co_euclidean_val-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.co_euclidean_val")],-1)),s[358]||(s[358]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[359]||(s[359]=l('
julia
co_euclidean_val(x; val, dom_size)

Compute an euclidean norm with domain size dom_size, weighted by val, of a scalar.

source

',3))]),i("details",ji,[i("summary",null,[s[360]||(s[360]=i("a",{id:"CompositionalNetworks.co_identity-Tuple{Any}",href:"#CompositionalNetworks.co_identity-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.co_identity")],-1)),s[361]||(s[361]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[362]||(s[362]=l('
julia
co_identity(x)

Identity function. Already defined in Julia as identity, specialized for scalars in the comparison layer.

source

',3))]),i("details",fi,[i("summary",null,[s[363]||(s[363]=i("a",{id:"CompositionalNetworks.co_val_minus_var-Tuple{Any}",href:"#CompositionalNetworks.co_val_minus_var-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.co_val_minus_var")],-1)),s[364]||(s[364]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[365]||(s[365]=l('
julia
co_val_minus_var(x; val)

Return the difference val - x if positive, 0.0 otherwise.

source

',3))]),i("details",Bi,[i("summary",null,[s[366]||(s[366]=i("a",{id:"CompositionalNetworks.co_var_minus_val-Tuple{Any}",href:"#CompositionalNetworks.co_var_minus_val-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.co_var_minus_val")],-1)),s[367]||(s[367]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[368]||(s[368]=l('
julia
co_var_minus_val(x; val)

Return the difference x - val if positive, 0.0 otherwise.

source

',3))]),i("details",Ai,[i("summary",null,[s[369]||(s[369]=i("a",{id:"CompositionalNetworks.co_var_minus_vars-Tuple{Any}",href:"#CompositionalNetworks.co_var_minus_vars-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.co_var_minus_vars")],-1)),s[370]||(s[370]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[371]||(s[371]=l('
julia
co_var_minus_vars(x; nvars)

Return the difference x - nvars if positive, 0.0 otherwise, where nvars denotes the numbers of variables.

source

',3))]),i("details",xi,[i("summary",null,[s[372]||(s[372]=i("a",{id:"CompositionalNetworks.co_vars_minus_var-Tuple{Any}",href:"#CompositionalNetworks.co_vars_minus_var-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.co_vars_minus_var")],-1)),s[373]||(s[373]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[374]||(s[374]=l('
julia
co_vars_minus_var(x; nvars)

Return the difference nvars - x if positive, 0.0 otherwise, where nvars denotes the numbers of variables.

source

',3))]),i("details",Di,[i("summary",null,[s[375]||(s[375]=i("a",{id:"CompositionalNetworks.code",href:"#CompositionalNetworks.code"},[i("span",{class:"jlbinding"},"CompositionalNetworks.code")],-1)),s[376]||(s[376]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[377]||(s[377]=l('
julia
code(c::Composition, lang=:maths; name="composition")

Access the code of a composition c in a given language lang. The name of the generated method is optional.

source

',3))]),i("details",Ti,[i("summary",null,[s[378]||(s[378]=i("a",{id:"CompositionalNetworks.comparison_layer",href:"#CompositionalNetworks.comparison_layer"},[i("span",{class:"jlbinding"},"CompositionalNetworks.comparison_layer")],-1)),s[379]||(s[379]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[380]||(s[380]=l('
julia
comparison_layer(param = false)

Generate the layer of transformations functions of the ICN. Iff param value is set, also includes all the parametric comparison with that value. The operations are mutually exclusive, that is only one will be selected.

source

',3))]),i("details",wi,[i("summary",null,[s[381]||(s[381]=i("a",{id:"CompositionalNetworks.compose",href:"#CompositionalNetworks.compose"},[i("span",{class:"jlbinding"},"CompositionalNetworks.compose")],-1)),s[382]||(s[382]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[383]||(s[383]=l('
julia
compose(icn, weights=nothing)

Return a function composed by some of the operations of a given ICN. Can be applied to any vector of variables. If weights are given, will assign to icn.

source

',3))]),i("details",_i,[i("summary",null,[s[384]||(s[384]=i("a",{id:"CompositionalNetworks.compose_to_file!-Tuple{Any, Any, Any}",href:"#CompositionalNetworks.compose_to_file!-Tuple{Any, Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.compose_to_file!")],-1)),s[385]||(s[385]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[386]||(s[386]=l('
julia
compose_to_file!(concept, name, path; domains, param = nothing, language = :Julia, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200)

Explore, learn and compose a function and write it to a file.

Arguments:

  • concept: the concept to learn

  • name: the name to give to the constraint

  • path: path of the output file

Keywords arguments:

  • domains: domains that defines the search space

  • param: an optional parameter of the constraint

  • language: the language to export to, default to :julia

  • search: either :partial or :complete search

  • global_iter: number of learning iteration

  • local_iter: number of generation in the genetic algorithm

  • metric: the metric to measure the distance between a configuration and known solutions

  • popSize: size of the population in the genetic algorithm

source

',7))]),i("details",Li,[i("summary",null,[s[387]||(s[387]=i("a",{id:"CompositionalNetworks.composition-Tuple{Composition}",href:"#CompositionalNetworks.composition-Tuple{Composition}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.composition")],-1)),s[388]||(s[388]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[389]||(s[389]=l('
julia
composition(c::Composition)

Access the actual method of an ICN composition c.

source

',3))]),i("details",Ni,[i("summary",null,[s[390]||(s[390]=i("a",{id:"CompositionalNetworks.composition_to_file!",href:"#CompositionalNetworks.composition_to_file!"},[i("span",{class:"jlbinding"},"CompositionalNetworks.composition_to_file!")],-1)),s[391]||(s[391]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[392]||(s[392]=l('
julia
composition_to_file!(c::Composition, path, name, language=:Julia)

Write the composition code in a given language into a file at path.

source

',3))]),i("details",Mi,[i("summary",null,[s[393]||(s[393]=i("a",{id:"CompositionalNetworks.exclu-Tuple{Any}",href:"#CompositionalNetworks.exclu-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.exclu")],-1)),s[394]||(s[394]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[395]||(s[395]=l('
julia
exclu(layer)

Return true if the layer has mutually exclusive operations.

source

',3))]),i("details",Oi,[i("summary",null,[s[396]||(s[396]=i("a",{id:"CompositionalNetworks.explore_learn_compose-Tuple{Any, Any}",href:"#CompositionalNetworks.explore_learn_compose-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.explore_learn_compose")],-1)),s[397]||(s[397]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[398]||(s[398]=l('
julia
explore_learn_compose(concept; domains, param = nothing, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200, action = :composition)

Explore a search space, learn a composition from an ICN, and compose an error function.

Arguments:

  • concept: the concept of the targeted constraint

  • domains: domains of the variables that define the training space

  • param: an optional parameter of the constraint

  • search: either flexible,:partial or :complete search. Flexible search will use search_limit and solutions_limit to determine if the search space needs to be partially or completely explored

  • global_iter: number of learning iteration

  • local_iter: number of generation in the genetic algorithm

  • metric: the metric to measure the distance between a configuration and known solutions

  • popSize: size of the population in the genetic algorithm

  • action: either :symbols to have a description of the composition or :composition to have the composed function itself

source

',5))]),i("details",Ii,[i("summary",null,[s[399]||(s[399]=i("a",{id:"CompositionalNetworks.functions-Tuple{Any}",href:"#CompositionalNetworks.functions-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.functions")],-1)),s[400]||(s[400]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[401]||(s[401]=l('
julia
functions(layer)

Access the operations of a layer. The container is ordered.

source

',3))]),i("details",Ji,[i("summary",null,[s[402]||(s[402]=i("a",{id:"CompositionalNetworks.generate-Tuple{Composition, Any, Val{:maths}}",href:"#CompositionalNetworks.generate-Tuple{Composition, Any, Val{:maths}}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.generate")],-1)),s[403]||(s[403]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[404]||(s[404]=l('
julia
generate(c::Composition, name, lang)

Generates the code of c in a specific language lang.

source

',3))]),i("details",Si,[i("summary",null,[s[405]||(s[405]=i("a",{id:"CompositionalNetworks.generate_exclusive_operation-Tuple{Any}",href:"#CompositionalNetworks.generate_exclusive_operation-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.generate_exclusive_operation")],-1)),s[406]||(s[406]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[407]||(s[407]=l('
julia
generate_exclusive_operation(max_op_number)

Generates the operations (weights) of a layer with exclusive operations.

source

',3))]),i("details",Ri,[i("summary",null,[s[408]||(s[408]=i("a",{id:"CompositionalNetworks.generate_inclusive_operations-Tuple{Any, Any}",href:"#CompositionalNetworks.generate_inclusive_operations-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.generate_inclusive_operations")],-1)),s[409]||(s[409]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[410]||(s[410]=l(`
julia
generate_inclusive_operations(predicate, bits)
+generate_exclusive_operation(max_op_number)

Generates the operations (weights) of a layer with inclusive/exclusive operations.

source

`,3))]),i("details",Ui,[i("summary",null,[s[411]||(s[411]=i("a",{id:"CompositionalNetworks.generate_weights-Tuple{Any}",href:"#CompositionalNetworks.generate_weights-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.generate_weights")],-1)),s[412]||(s[412]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[413]||(s[413]=l(`
julia
generate_weights(layers)
+generate_weights(icn)

Generate the weights of a collection of layers or of an ICN.

source

`,3))]),i("details",Vi,[i("summary",null,[s[414]||(s[414]=i("a",{id:"CompositionalNetworks.hamming-Tuple{Any, Any}",href:"#CompositionalNetworks.hamming-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.hamming")],-1)),s[415]||(s[415]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[416]||(s[416]=l('
julia
hamming(x, X)

Compute the hamming distance of x over a collection of solutions X, i.e. the minimal number of variables to switch in xto reach a solution.

source

',3))]),i("details",zi,[i("summary",null,[s[417]||(s[417]=i("a",{id:"CompositionalNetworks.is_viable-Tuple{CompositionalNetworks.Layer, Any}",href:"#CompositionalNetworks.is_viable-Tuple{CompositionalNetworks.Layer, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.is_viable")],-1)),s[418]||(s[418]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[419]||(s[419]=l(`
julia
is_viable(layer, w)
 is_viable(icn)
-is_viable(icn, w)

Assert if a pair of layer/icn and weights compose a viable pattern. If no weights are given with an icn, it will check the current internal value.

source


# CompositionalNetworks.layersMethod.
julia
layers(icn)

Return the ordered layers of an ICN.

source


# CompositionalNetworks.lazyMethod.
julia
lazy(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V).

source


# CompositionalNetworks.lazy_paramMethod.
julia
lazy_param(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V; param).

source


# CompositionalNetworks.learn_composeMethod.
julia
learn_compose(;
+is_viable(icn, w)

Assert if a pair of layer/icn and weights compose a viable pattern. If no weights are given with an icn, it will check the current internal value.

source

`,3))]),i("details",qi,[i("summary",null,[s[420]||(s[420]=i("a",{id:"CompositionalNetworks.layers-Tuple{Any}",href:"#CompositionalNetworks.layers-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.layers")],-1)),s[421]||(s[421]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[422]||(s[422]=l('
julia
layers(icn)

Return the ordered layers of an ICN.

source

',3))]),i("details",Pi,[i("summary",null,[s[423]||(s[423]=i("a",{id:"CompositionalNetworks.lazy-Tuple{Vararg{Function}}",href:"#CompositionalNetworks.lazy-Tuple{Vararg{Function}}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.lazy")],-1)),s[424]||(s[424]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[425]||(s[425]=l('
julia
lazy(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V).

source

',3))]),i("details",Xi,[i("summary",null,[s[426]||(s[426]=i("a",{id:"CompositionalNetworks.lazy_param-Tuple{Vararg{Function}}",href:"#CompositionalNetworks.lazy_param-Tuple{Vararg{Function}}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.lazy_param")],-1)),s[427]||(s[427]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[428]||(s[428]=l('
julia
lazy_param(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V; param).

source

',3))]),i("details",Gi,[i("summary",null,[s[429]||(s[429]=i("a",{id:"CompositionalNetworks.learn_compose-Tuple{Any, Any, Any}",href:"#CompositionalNetworks.learn_compose-Tuple{Any, Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.learn_compose")],-1)),s[430]||(s[430]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[431]||(s[431]=l(`
julia
learn_compose(;
     nvars, dom_size, param=nothing, icn=ICN(nvars, dom_size, param),
     X, X_sols, global_iter=100, local_iter=100, metric=hamming, popSize=200
-)

Create an ICN, optimize it, and return its composition.

source


# CompositionalNetworks.make_transformationsMethod.
julia
make_transformations(param::Symbol)

Generates a dictionary of transformation functions based on the specified parameterization. This function facilitates the creation of parametric layers for constraint transformations, allowing for flexible and dynamic constraint manipulation according to the needs of different constraint programming models.

Parameters

  • param::Symbol: Specifies the type of transformations to generate. It can be :none for basic transformations that do not depend on external parameters, or :val for transformations that operate with respect to a specific value parameter.

Returns

  • LittleDict{Symbol, Function}: A dictionary mapping transformation names (Symbol) to their corresponding functions (Function). The functions encapsulate various types of transformations, such as counting, comparison, and contiguous value processing.

Transformation Types

  • When param is :none, the following transformations are available:

    • :identity: No transformation is applied.

    • :count_eq, :count_eq_left, :count_eq_right: Count equalities under different conditions.

    • :count_greater, :count_lesser: Count values greater or lesser than a threshold.

    • :count_g_left, :count_l_left, :count_g_right, :count_l_right: Count values with greater or lesser comparisons from different directions.

    • :contiguous_vals_minus, :contiguous_vals_minus_rev: Process contiguous values with subtraction in normal and reverse order.

  • When param is :val, the transformations relate to operations involving a parameter value:

    • :count_eq_param, :count_l_param, :count_g_param: Count equalities or comparisons against a parameter value.

    • :count_bounding_param: Count values bounding a parameter value.

    • :val_minus_param, :param_minus_val: Subtract a parameter value from values or vice versa.

The function delegates to a version that uses Val(param) for dispatch, ensuring compile-time selection of the appropriate transformation set.

Examples

julia
# Get basic transformations
+)

Create an ICN, optimize it, and return its composition.

source

`,3))]),i("details",Qi,[i("summary",null,[s[432]||(s[432]=i("a",{id:"CompositionalNetworks.make_transformations-Tuple{Symbol}",href:"#CompositionalNetworks.make_transformations-Tuple{Symbol}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.make_transformations")],-1)),s[433]||(s[433]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[434]||(s[434]=l(`
julia
make_transformations(param::Symbol)

Generates a dictionary of transformation functions based on the specified parameterization. This function facilitates the creation of parametric layers for constraint transformations, allowing for flexible and dynamic constraint manipulation according to the needs of different constraint programming models.

Parameters

  • param::Symbol: Specifies the type of transformations to generate. It can be :none for basic transformations that do not depend on external parameters, or :val for transformations that operate with respect to a specific value parameter.

Returns

  • LittleDict{Symbol, Function}: A dictionary mapping transformation names (Symbol) to their corresponding functions (Function). The functions encapsulate various types of transformations, such as counting, comparison, and contiguous value processing.

Transformation Types

  • When param is :none, the following transformations are available:

    • :identity: No transformation is applied.

    • :count_eq, :count_eq_left, :count_eq_right: Count equalities under different conditions.

    • :count_greater, :count_lesser: Count values greater or lesser than a threshold.

    • :count_g_left, :count_l_left, :count_g_right, :count_l_right: Count values with greater or lesser comparisons from different directions.

    • :contiguous_vals_minus, :contiguous_vals_minus_rev: Process contiguous values with subtraction in normal and reverse order.

  • When param is :val, the transformations relate to operations involving a parameter value:

    • :count_eq_param, :count_l_param, :count_g_param: Count equalities or comparisons against a parameter value.

    • :count_bounding_param: Count values bounding a parameter value.

    • :val_minus_param, :param_minus_val: Subtract a parameter value from values or vice versa.

The function delegates to a version that uses Val(param) for dispatch, ensuring compile-time selection of the appropriate transformation set.

Examples

julia
# Get basic transformations
 basic_transforms = make_transformations(:none)
 
 # Apply an identity transformation
@@ -214,40 +212,40 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.CBLuZwrP.js";const E
 val_transforms = make_transformations(:val)
 
 # Apply a count equal to parameter transformation
-count_eq_param_result = val_transforms[:count_eq_param](data, param)

source


# CompositionalNetworks.manhattanMethod.
julia
manhattan(x, X)

source


# CompositionalNetworks.map_tr!Method.
julia
map_tr!(f, x, X, param)

Return an anonymous function that applies f to all elements of x and store the result in X, with a parameter param (which is set to nothing for function with no parameter).

source


# CompositionalNetworks.minkowskiMethod.
julia
minkowski(x, X, p)

source


# CompositionalNetworks.nbitsMethod.
julia
nbits(icn)

Return the expected number of bits of a viable weight of an ICN.

source


# CompositionalNetworks.nbits_excluMethod.
julia
nbits_exclu(layer)

Convert the length of an exclusive layer into a number of bits.

source


# CompositionalNetworks.reduce_symbolsFunction.
julia
reduce_symbols(symbols, sep)

Produce a formatted string that separates the symbols by sep. Used internally for show_composition.

source


# CompositionalNetworks.regularizationMethod.
julia
regularization(icn)

Return the regularization value of an ICN weights, which is proportional to the normalized number of operations selected in the icn layers.

source


# CompositionalNetworks.selected_sizeMethod.
julia
selected_size(layer, layer_weights)

Return the number of operations selected by layer_weights in layer.

source


# CompositionalNetworks.show_layerMethod.
julia
show_layer(layer)

Return a string that contains the elements in a layer.

source


# CompositionalNetworks.show_layersMethod.
julia
show_layers(icn)

Return a formatted string with each layers in the icn.

source


# CompositionalNetworks.symbolMethod.
julia
symbol(layer, i)

Return the i-th symbols of the operations in a given layer.

source


# CompositionalNetworks.symbolsMethod.
julia
symbols(c::Composition)

Output the composition as a layered collection of Symbols.

source


# CompositionalNetworks.tr_contiguous_vars_minusMethod.
julia
tr_contiguous_vars_minus(i, x)
+count_eq_param_result = val_transforms[:count_eq_param](data, param)

source

`,12))]),i("details",Wi,[i("summary",null,[s[435]||(s[435]=i("a",{id:"CompositionalNetworks.manhattan-Tuple{Any, Any}",href:"#CompositionalNetworks.manhattan-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.manhattan")],-1)),s[436]||(s[436]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[437]||(s[437]=l('
julia
manhattan(x, X)

source

',2))]),i("details",Yi,[i("summary",null,[s[438]||(s[438]=i("a",{id:"CompositionalNetworks.map_tr!-Tuple{Any, Any, Any}",href:"#CompositionalNetworks.map_tr!-Tuple{Any, Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.map_tr!")],-1)),s[439]||(s[439]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[440]||(s[440]=l('
julia
map_tr!(f, x, X, param)

Return an anonymous function that applies f to all elements of x and store the result in X, with a parameter param (which is set to nothing for function with no parameter).

source

',3))]),i("details",$i,[i("summary",null,[s[441]||(s[441]=i("a",{id:"CompositionalNetworks.minkowski-Tuple{Any, Any, Any}",href:"#CompositionalNetworks.minkowski-Tuple{Any, Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.minkowski")],-1)),s[442]||(s[442]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[443]||(s[443]=l('
julia
minkowski(x, X, p)

source

',2))]),i("details",Ki,[i("summary",null,[s[444]||(s[444]=i("a",{id:"CompositionalNetworks.nbits-Tuple{Any}",href:"#CompositionalNetworks.nbits-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.nbits")],-1)),s[445]||(s[445]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[446]||(s[446]=l('
julia
nbits(icn)

Return the expected number of bits of a viable weight of an ICN.

source

',3))]),i("details",Hi,[i("summary",null,[s[447]||(s[447]=i("a",{id:"CompositionalNetworks.nbits_exclu-Tuple{Any}",href:"#CompositionalNetworks.nbits_exclu-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.nbits_exclu")],-1)),s[448]||(s[448]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[449]||(s[449]=l('
julia
nbits_exclu(layer)

Convert the length of an exclusive layer into a number of bits.

source

',3))]),i("details",Zi,[i("summary",null,[s[450]||(s[450]=i("a",{id:"CompositionalNetworks.reduce_symbols",href:"#CompositionalNetworks.reduce_symbols"},[i("span",{class:"jlbinding"},"CompositionalNetworks.reduce_symbols")],-1)),s[451]||(s[451]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[452]||(s[452]=l('
julia
reduce_symbols(symbols, sep)

Produce a formatted string that separates the symbols by sep. Used internally for show_composition.

source

',3))]),i("details",sa,[i("summary",null,[s[453]||(s[453]=i("a",{id:"CompositionalNetworks.regularization-Tuple{Any}",href:"#CompositionalNetworks.regularization-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.regularization")],-1)),s[454]||(s[454]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[455]||(s[455]=l('
julia
regularization(icn)

Return the regularization value of an ICN weights, which is proportional to the normalized number of operations selected in the icn layers.

source

',3))]),i("details",ia,[i("summary",null,[s[456]||(s[456]=i("a",{id:"CompositionalNetworks.selected_size-Tuple{Any, Any}",href:"#CompositionalNetworks.selected_size-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.selected_size")],-1)),s[457]||(s[457]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[458]||(s[458]=l('
julia
selected_size(layer, layer_weights)

Return the number of operations selected by layer_weights in layer.

source

',3))]),i("details",aa,[i("summary",null,[s[459]||(s[459]=i("a",{id:"CompositionalNetworks.show_layer-Tuple{Any}",href:"#CompositionalNetworks.show_layer-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.show_layer")],-1)),s[460]||(s[460]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[461]||(s[461]=l('
julia
show_layer(layer)

Return a string that contains the elements in a layer.

source

',3))]),i("details",ta,[i("summary",null,[s[462]||(s[462]=i("a",{id:"CompositionalNetworks.show_layers-Tuple{Any}",href:"#CompositionalNetworks.show_layers-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.show_layers")],-1)),s[463]||(s[463]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[464]||(s[464]=l('
julia
show_layers(icn)

Return a formatted string with each layers in the icn.

source

',3))]),i("details",na,[i("summary",null,[s[465]||(s[465]=i("a",{id:"CompositionalNetworks.symbol-Tuple{Any, Any}",href:"#CompositionalNetworks.symbol-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.symbol")],-1)),s[466]||(s[466]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[467]||(s[467]=l('
julia
symbol(layer, i)

Return the i-th symbols of the operations in a given layer.

source

',3))]),i("details",la,[i("summary",null,[s[468]||(s[468]=i("a",{id:"CompositionalNetworks.symbols-Tuple{Composition}",href:"#CompositionalNetworks.symbols-Tuple{Composition}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.symbols")],-1)),s[469]||(s[469]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[470]||(s[470]=l('
julia
symbols(c::Composition)

Output the composition as a layered collection of Symbols.

source

',3))]),i("details",ea,[i("summary",null,[s[471]||(s[471]=i("a",{id:"CompositionalNetworks.tr_contiguous_vars_minus-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_contiguous_vars_minus-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_contiguous_vars_minus")],-1)),s[472]||(s[472]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[473]||(s[473]=l(`
julia
tr_contiguous_vars_minus(i, x)
 tr_contiguous_vars_minus(x)
-tr_contiguous_vars_minus(x, X::AbstractVector)

Return the difference x[i] - x[i + 1] if positive, 0.0 otherwise. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_contiguous_vars_minus_revMethod.
julia
tr_contiguous_vars_minus_rev(i, x)
+tr_contiguous_vars_minus(x, X::AbstractVector)

Return the difference x[i] - x[i + 1] if positive, 0.0 otherwise. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",pa,[i("summary",null,[s[474]||(s[474]=i("a",{id:"CompositionalNetworks.tr_contiguous_vars_minus_rev-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_contiguous_vars_minus_rev-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_contiguous_vars_minus_rev")],-1)),s[475]||(s[475]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[476]||(s[476]=l(`
julia
tr_contiguous_vars_minus_rev(i, x)
 tr_contiguous_vars_minus_rev(x)
-tr_contiguous_vars_minus_rev(x, X::AbstractVector)

Return the difference x[i + 1] - x[i] if positive, 0.0 otherwise. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_bounding_valMethod.
julia
tr_count_bounding_val(i, x; val)
+tr_contiguous_vars_minus_rev(x, X::AbstractVector)

Return the difference x[i + 1] - x[i] if positive, 0.0 otherwise. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",ha,[i("summary",null,[s[477]||(s[477]=i("a",{id:"CompositionalNetworks.tr_count_bounding_val-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_bounding_val-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_bounding_val")],-1)),s[478]||(s[478]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[479]||(s[479]=l(`
julia
tr_count_bounding_val(i, x; val)
 tr_count_bounding_val(x; val)
-tr_count_bounding_val(x, X::AbstractVector; val)

Count the number of elements bounded (not strictly) by x[i] and x[i] + val. An extended method to vector with sig (x, val) is generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_eqMethod.
julia
tr_count_eq(i, x)
+tr_count_bounding_val(x, X::AbstractVector; val)

Count the number of elements bounded (not strictly) by x[i] and x[i] + val. An extended method to vector with sig (x, val) is generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",ka,[i("summary",null,[s[480]||(s[480]=i("a",{id:"CompositionalNetworks.tr_count_eq-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_eq-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_eq")],-1)),s[481]||(s[481]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[482]||(s[482]=l(`
julia
tr_count_eq(i, x)
 tr_count_eq(x)
-tr_count_eq(x, X::AbstractVector)

Count the number of elements equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_eq_leftMethod.
julia
tr_count_eq_left(i, x)
+tr_count_eq(x, X::AbstractVector)

Count the number of elements equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",oa,[i("summary",null,[s[483]||(s[483]=i("a",{id:"CompositionalNetworks.tr_count_eq_left-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_eq_left-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_eq_left")],-1)),s[484]||(s[484]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[485]||(s[485]=l(`
julia
tr_count_eq_left(i, x)
 tr_count_eq_left(x)
-tr_count_eq_left(x, X::AbstractVector)

Count the number of elements to the left of and equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_eq_rightMethod.
julia
tr_count_eq_right(i, x)
+tr_count_eq_left(x, X::AbstractVector)

Count the number of elements to the left of and equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",ra,[i("summary",null,[s[486]||(s[486]=i("a",{id:"CompositionalNetworks.tr_count_eq_right-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_eq_right-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_eq_right")],-1)),s[487]||(s[487]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[488]||(s[488]=l(`
julia
tr_count_eq_right(i, x)
 tr_count_eq_right(x)
-tr_count_eq_right(x, X::AbstractVector)

Count the number of elements to the right of and equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_eq_valMethod.
julia
tr_count_eq_val(i, x; val)
+tr_count_eq_right(x, X::AbstractVector)

Count the number of elements to the right of and equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",da,[i("summary",null,[s[489]||(s[489]=i("a",{id:"CompositionalNetworks.tr_count_eq_val-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_eq_val-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_eq_val")],-1)),s[490]||(s[490]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[491]||(s[491]=l(`
julia
tr_count_eq_val(i, x; val)
 tr_count_eq_val(x; val)
-tr_count_eq_val(x, X::AbstractVector; val)

Count the number of elements equal to x[i] + val. Extended method to vector with sig (x, val) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_g_leftMethod.
julia
tr_count_g_left(i, x)
+tr_count_eq_val(x, X::AbstractVector; val)

Count the number of elements equal to x[i] + val. Extended method to vector with sig (x, val) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",ga,[i("summary",null,[s[492]||(s[492]=i("a",{id:"CompositionalNetworks.tr_count_g_left-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_g_left-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_g_left")],-1)),s[493]||(s[493]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[494]||(s[494]=l(`
julia
tr_count_g_left(i, x)
 tr_count_g_left(x)
-tr_count_g_left(x, X::AbstractVector)

Count the number of elements to the left of and greater than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_g_rightMethod.
julia
tr_count_g_right(i, x)
+tr_count_g_left(x, X::AbstractVector)

Count the number of elements to the left of and greater than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",Ea,[i("summary",null,[s[495]||(s[495]=i("a",{id:"CompositionalNetworks.tr_count_g_right-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_g_right-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_g_right")],-1)),s[496]||(s[496]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[497]||(s[497]=l(`
julia
tr_count_g_right(i, x)
 tr_count_g_right(x)
-tr_count_g_right(x, X::AbstractVector)

Count the number of elements to the right of and greater than x[i]. Extended method to vector with sig (x) are generated.

source


# CompositionalNetworks.tr_count_g_valMethod.
julia
tr_count_g_val(i, x; val)
+tr_count_g_right(x, X::AbstractVector)

Count the number of elements to the right of and greater than x[i]. Extended method to vector with sig (x) are generated.

source

`,3))]),i("details",ca,[i("summary",null,[s[498]||(s[498]=i("a",{id:"CompositionalNetworks.tr_count_g_val-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_g_val-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_g_val")],-1)),s[499]||(s[499]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[500]||(s[500]=l(`
julia
tr_count_g_val(i, x; val)
 tr_count_g_val(x; val)
-tr_count_g_val(x, X::AbstractVector; val)

Count the number of elements greater than x[i] + val. Extended method to vector with sig (x, val) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_greaterMethod.
julia
tr_count_greater(i, x)
+tr_count_g_val(x, X::AbstractVector; val)

Count the number of elements greater than x[i] + val. Extended method to vector with sig (x, val) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",ya,[i("summary",null,[s[501]||(s[501]=i("a",{id:"CompositionalNetworks.tr_count_greater-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_greater-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_greater")],-1)),s[502]||(s[502]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[503]||(s[503]=l(`
julia
tr_count_greater(i, x)
 tr_count_greater(x)
-tr_count_greater(x, X::AbstractVector)

Count the number of elements greater than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_l_leftMethod.
julia
tr_count_l_left(i, x)
+tr_count_greater(x, X::AbstractVector)

Count the number of elements greater than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",ua,[i("summary",null,[s[504]||(s[504]=i("a",{id:"CompositionalNetworks.tr_count_l_left-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_l_left-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_l_left")],-1)),s[505]||(s[505]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[506]||(s[506]=l(`
julia
tr_count_l_left(i, x)
 tr_count_l_left(x)
-tr_count_l_left(x, X::AbstractVector)

Count the number of elements to the left of and lesser than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_l_rightMethod.
julia
tr_count_l_right(i, x)
+tr_count_l_left(x, X::AbstractVector)

Count the number of elements to the left of and lesser than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",Ca,[i("summary",null,[s[507]||(s[507]=i("a",{id:"CompositionalNetworks.tr_count_l_right-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_l_right-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_l_right")],-1)),s[508]||(s[508]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[509]||(s[509]=l(`
julia
tr_count_l_right(i, x)
 tr_count_l_right(x)
-tr_count_l_right(x, X::AbstractVector)

Count the number of elements to the right of and lesser than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_l_valMethod.
julia
tr_count_l_val(i, x; val)
+tr_count_l_right(x, X::AbstractVector)

Count the number of elements to the right of and lesser than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",ma,[i("summary",null,[s[510]||(s[510]=i("a",{id:"CompositionalNetworks.tr_count_l_val-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_l_val-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_l_val")],-1)),s[511]||(s[511]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[512]||(s[512]=l(`
julia
tr_count_l_val(i, x; val)
 tr_count_l_val(x; val)
-tr_count_l_val(x, X::AbstractVector; val)

Count the number of elements lesser than x[i] + val. Extended method to vector with sig (x, val) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_lesserMethod.
julia
tr_count_lesser(i, x)
+tr_count_l_val(x, X::AbstractVector; val)

Count the number of elements lesser than x[i] + val. Extended method to vector with sig (x, val) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",Fa,[i("summary",null,[s[513]||(s[513]=i("a",{id:"CompositionalNetworks.tr_count_lesser-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_lesser-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_lesser")],-1)),s[514]||(s[514]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[515]||(s[515]=l(`
julia
tr_count_lesser(i, x)
 tr_count_lesser(x)
-tr_count_lesser(x, X::AbstractVector)

Count the number of elements lesser than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_identityMethod.
julia
tr_identity(i, x)
+tr_count_lesser(x, X::AbstractVector)

Count the number of elements lesser than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",ba,[i("summary",null,[s[516]||(s[516]=i("a",{id:"CompositionalNetworks.tr_identity-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_identity-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_identity")],-1)),s[517]||(s[517]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[518]||(s[518]=l(`
julia
tr_identity(i, x)
 tr_identity(x)
-tr_identity(x, X::AbstractVector)

Identity function. Already defined in Julia as identity, specialized for vectors. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_in_unrolled_expansion_##225Method.
julia
tr_in(tr, X, x, param)

Application of an operation from the transformation layer. Used to generate more efficient code for all compositions.

source


# CompositionalNetworks.tr_val_minus_varMethod.
julia
tr_val_minus_var(i, x; val)
+tr_identity(x, X::AbstractVector)

Identity function. Already defined in Julia as identity, specialized for vectors. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",va,[i("summary",null,[s[519]||(s[519]=i("a",{id:"CompositionalNetworks.tr_in_unrolled_expansion_##225-NTuple{4, Any}",href:"#CompositionalNetworks.tr_in_unrolled_expansion_##225-NTuple{4, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_in_unrolled_expansion_##225")],-1)),s[520]||(s[520]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[521]||(s[521]=l('
julia
tr_in(tr, X, x, param)

Application of an operation from the transformation layer. Used to generate more efficient code for all compositions.

source

',3))]),i("details",ja,[i("summary",null,[s[522]||(s[522]=i("a",{id:"CompositionalNetworks.tr_val_minus_var-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_val_minus_var-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_val_minus_var")],-1)),s[523]||(s[523]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[524]||(s[524]=l(`
julia
tr_val_minus_var(i, x; val)
 tr_val_minus_var(x; val)
-tr_val_minus_var(x, X::AbstractVector; val)

Return the difference val - x[i] if positive, 0.0 otherwise. Extended method to vector with sig (x, val) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_var_minus_valMethod.
julia
tr_var_minus_val(i, x; val)
+tr_val_minus_var(x, X::AbstractVector; val)

Return the difference val - x[i] if positive, 0.0 otherwise. Extended method to vector with sig (x, val) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",fa,[i("summary",null,[s[525]||(s[525]=i("a",{id:"CompositionalNetworks.tr_var_minus_val-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_var_minus_val-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_var_minus_val")],-1)),s[526]||(s[526]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[527]||(s[527]=l(`
julia
tr_var_minus_val(i, x; val)
 tr_var_minus_val(x; val)
-tr_var_minus_val(x, X::AbstractVector; val)

Return the difference x[i] - val if positive, 0.0 otherwise. Extended method to vector with sig (x, val) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.transformation_layerFunction.
julia
transformation_layer(param = Vector{Symbol}())

Generate the layer of transformations functions of the ICN. Iff param value is non empty, also includes all the related parametric transformations.

source


# CompositionalNetworks.weights!Method.
julia
weights!(icn, weights)

Set the weights of an ICN with a BitVector.

source


# CompositionalNetworks.weightsMethod.
julia
weights(icn)

Access the current set of weights of an ICN.

source


# CompositionalNetworks.weights_biasMethod.
julia
weights_bias(x)

A metric that bias x towards operations with a lower bit. Do not affect the main metric.

source


# QUBOConstraints.AbstractOptimizerType.
julia
AbstractOptimizer

An abstract type (interface) used to learn QUBO matrices from constraints. Only a train method is required.

source


# QUBOConstraints.QUBO_baseFunction.
julia
QUBO_base(n, weight = 1)

A basic QUBO matrix to ensure that binarized variables keep a valid encoding.

source


# QUBOConstraints.QUBO_linear_sumMethod.
julia
QUBO_linear_sum(n, σ)

One valid QUBO matrix given n variables and parameter σ for the linear sum constraint.

source


# QUBOConstraints.binarizeMethod.
julia
binarize(x[, domain]; binarization = :one_hot)

Binarize x following the binarization encoding. If x is a vector (instead of a number per say), domain is optional.

source


# QUBOConstraints.debinarizeMethod.
julia
debinarize(x[, domain]; binarization = :one_hot)

Transform a binary vector into a number or a set of number. If domain is not given, it will compute a default value based on binarization and x.

source


# QUBOConstraints.is_validFunction.
julia
is_valid(x, encoding::Symbol = :none)

Check if x has a valid format for encoding.

For instance, if encoding == :one_hot, at most one bit of x can be set to 1.

source


# QUBOConstraints.trainMethod.
julia
train(args...)

Default train method for any AbstractOptimizer.

source


`,375),l=[n];function h(p,r,k,o,d,c){return a(),i("div",null,l)}const y=s(e,[["render",h]]);export{E as __pageData,y as default}; +tr_var_minus_val(x, X::AbstractVector; val)

Return the difference x[i] - val if positive, 0.0 otherwise. Extended method to vector with sig (x, val) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",Ba,[i("summary",null,[s[528]||(s[528]=i("a",{id:"CompositionalNetworks.transformation_layer",href:"#CompositionalNetworks.transformation_layer"},[i("span",{class:"jlbinding"},"CompositionalNetworks.transformation_layer")],-1)),s[529]||(s[529]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[530]||(s[530]=l('
julia
transformation_layer(param = Vector{Symbol}())

Generate the layer of transformations functions of the ICN. Iff param value is non empty, also includes all the related parametric transformations.

source

',3))]),i("details",Aa,[i("summary",null,[s[531]||(s[531]=i("a",{id:"CompositionalNetworks.weights!-Tuple{Any, Any}",href:"#CompositionalNetworks.weights!-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.weights!")],-1)),s[532]||(s[532]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[533]||(s[533]=l('
julia
weights!(icn, weights)

Set the weights of an ICN with a BitVector.

source

',3))]),i("details",xa,[i("summary",null,[s[534]||(s[534]=i("a",{id:"CompositionalNetworks.weights-Tuple{Any}",href:"#CompositionalNetworks.weights-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.weights")],-1)),s[535]||(s[535]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[536]||(s[536]=l('
julia
weights(icn)

Access the current set of weights of an ICN.

source

',3))]),i("details",Da,[i("summary",null,[s[537]||(s[537]=i("a",{id:"CompositionalNetworks.weights_bias-Tuple{Any}",href:"#CompositionalNetworks.weights_bias-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.weights_bias")],-1)),s[538]||(s[538]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[539]||(s[539]=l('
julia
weights_bias(x)

A metric that bias x towards operations with a lower bit. Do not affect the main metric.

source

',3))]),i("details",Ta,[i("summary",null,[s[540]||(s[540]=i("a",{id:"QUBOConstraints.AbstractOptimizer",href:"#QUBOConstraints.AbstractOptimizer"},[i("span",{class:"jlbinding"},"QUBOConstraints.AbstractOptimizer")],-1)),s[541]||(s[541]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[542]||(s[542]=l('
julia
AbstractOptimizer

An abstract type (interface) used to learn QUBO matrices from constraints. Only a train method is required.

source

',3))]),i("details",wa,[i("summary",null,[s[543]||(s[543]=i("a",{id:"QUBOConstraints.QUBO_base",href:"#QUBOConstraints.QUBO_base"},[i("span",{class:"jlbinding"},"QUBOConstraints.QUBO_base")],-1)),s[544]||(s[544]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[545]||(s[545]=l('
julia
QUBO_base(n, weight = 1)

A basic QUBO matrix to ensure that binarized variables keep a valid encoding.

source

',3))]),i("details",_a,[i("summary",null,[s[546]||(s[546]=i("a",{id:"QUBOConstraints.QUBO_linear_sum-Tuple{Any, Any}",href:"#QUBOConstraints.QUBO_linear_sum-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"QUBOConstraints.QUBO_linear_sum")],-1)),s[547]||(s[547]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[548]||(s[548]=l('
julia
QUBO_linear_sum(n, σ)

One valid QUBO matrix given n variables and parameter σ for the linear sum constraint.

source

',3))]),i("details",La,[i("summary",null,[s[549]||(s[549]=i("a",{id:"QUBOConstraints.binarize-Union{Tuple{Vector{T}}, Tuple{T}, Tuple{Vector{T}, Any}} where T<:Number",href:"#QUBOConstraints.binarize-Union{Tuple{Vector{T}}, Tuple{T}, Tuple{Vector{T}, Any}} where T<:Number"},[i("span",{class:"jlbinding"},"QUBOConstraints.binarize")],-1)),s[550]||(s[550]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[551]||(s[551]=l('
julia
binarize(x[, domain]; binarization = :one_hot)

Binarize x following the binarization encoding. If x is a vector (instead of a number per say), domain is optional.

source

',3))]),i("details",Na,[i("summary",null,[s[552]||(s[552]=i("a",{id:"QUBOConstraints.debinarize-Tuple{Any}",href:"#QUBOConstraints.debinarize-Tuple{Any}"},[i("span",{class:"jlbinding"},"QUBOConstraints.debinarize")],-1)),s[553]||(s[553]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[554]||(s[554]=l('
julia
debinarize(x[, domain]; binarization = :one_hot)

Transform a binary vector into a number or a set of number. If domain is not given, it will compute a default value based on binarization and x.

source

',3))]),i("details",Ma,[i("summary",null,[s[555]||(s[555]=i("a",{id:"QUBOConstraints.is_valid",href:"#QUBOConstraints.is_valid"},[i("span",{class:"jlbinding"},"QUBOConstraints.is_valid")],-1)),s[556]||(s[556]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[557]||(s[557]=l('
julia
is_valid(x, encoding::Symbol = :none)

Check if x has a valid format for encoding.

For instance, if encoding == :one_hot, at most one bit of x can be set to 1.

source

',4))]),i("details",Oa,[i("summary",null,[s[558]||(s[558]=i("a",{id:"QUBOConstraints.train-Tuple",href:"#QUBOConstraints.train-Tuple"},[i("span",{class:"jlbinding"},"QUBOConstraints.train")],-1)),s[559]||(s[559]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[560]||(s[560]=l('
julia
train(args...)

Default train method for any AbstractOptimizer.

source

',3))])])}const Pa=e(o,[["render",Ia]]);export{qa as __pageData,Pa as default}; diff --git a/dev/assets/api_10_full.md.CIhTEgrP.lean.js b/dev/assets/api_10_full.md.CIhTEgrP.lean.js new file mode 100644 index 0000000..94979ef --- /dev/null +++ b/dev/assets/api_10_full.md.CIhTEgrP.lean.js @@ -0,0 +1,251 @@ +import{_ as e,c as p,j as i,a,G as n,a5 as l,B as h,o as k}from"./chunks/framework.CJakPlgM.js";const qa=JSON.parse('{"title":"Full API","description":"","frontmatter":{},"headers":[],"relativePath":"api/10_full.md","filePath":"api/10_full.md","lastUpdated":null}'),o={name:"api/10_full.md"},r={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""},_={class:"jldocstring custom-block",open:""},L={class:"jldocstring custom-block",open:""},N={class:"jldocstring custom-block",open:""},M={class:"jldocstring custom-block",open:""},O={class:"jldocstring custom-block",open:""},I={class:"jldocstring custom-block",open:""},J={class:"jldocstring custom-block",open:""},S={class:"jldocstring custom-block",open:""},R={class:"jldocstring custom-block",open:""},U={class:"jldocstring custom-block",open:""},V={class:"jldocstring custom-block",open:""},z={class:"jldocstring custom-block",open:""},q={class:"jldocstring custom-block",open:""},P={class:"jldocstring custom-block",open:""},X={class:"jldocstring custom-block",open:""},G={class:"jldocstring custom-block",open:""},Q={class:"jldocstring custom-block",open:""},W={class:"jldocstring custom-block",open:""},Y={class:"jldocstring custom-block",open:""},$={class:"jldocstring custom-block",open:""},K={class:"jldocstring custom-block",open:""},H={class:"jldocstring custom-block",open:""},Z={class:"jldocstring custom-block",open:""},ss={class:"jldocstring custom-block",open:""},is={class:"jldocstring custom-block",open:""},as={class:"jldocstring custom-block",open:""},ts={class:"jldocstring custom-block",open:""},ns={class:"jldocstring custom-block",open:""},ls={class:"jldocstring custom-block",open:""},es={class:"jldocstring custom-block",open:""},ps={class:"jldocstring custom-block",open:""},hs={class:"jldocstring custom-block",open:""},ks={class:"jldocstring custom-block",open:""},os={class:"jldocstring custom-block",open:""},rs={class:"jldocstring custom-block",open:""},ds={class:"jldocstring custom-block",open:""},gs={class:"jldocstring custom-block",open:""},Es={class:"jldocstring custom-block",open:""},cs={class:"jldocstring custom-block",open:""},ys={class:"jldocstring custom-block",open:""},us={class:"jldocstring custom-block",open:""},Cs={class:"jldocstring custom-block",open:""},ms={class:"jldocstring custom-block",open:""},Fs={class:"jldocstring custom-block",open:""},bs={class:"jldocstring custom-block",open:""},vs={class:"jldocstring custom-block",open:""},js={class:"jldocstring custom-block",open:""},fs={class:"jldocstring custom-block",open:""},Bs={class:"jldocstring custom-block",open:""},As={class:"jldocstring custom-block",open:""},xs={class:"jldocstring custom-block",open:""},Ds={class:"jldocstring custom-block",open:""},Ts={class:"jldocstring custom-block",open:""},ws={class:"jldocstring custom-block",open:""},_s={class:"jldocstring custom-block",open:""},Ls={class:"jldocstring custom-block",open:""},Ns={class:"jldocstring custom-block",open:""},Ms={class:"jldocstring custom-block",open:""},Os={class:"jldocstring custom-block",open:""},Is={class:"jldocstring custom-block",open:""},Js={class:"jldocstring custom-block",open:""},Ss={class:"jldocstring custom-block",open:""},Rs={class:"jldocstring custom-block",open:""},Us={class:"jldocstring custom-block",open:""},Vs={class:"jldocstring custom-block",open:""},zs={class:"jldocstring custom-block",open:""},qs={class:"jldocstring custom-block",open:""},Ps={class:"jldocstring custom-block",open:""},Xs={class:"jldocstring custom-block",open:""},Gs={class:"jldocstring custom-block",open:""},Qs={class:"jldocstring custom-block",open:""},Ws={class:"jldocstring custom-block",open:""},Ys={class:"jldocstring custom-block",open:""},$s={class:"jldocstring custom-block",open:""},Ks={class:"jldocstring custom-block",open:""},Hs={class:"jldocstring custom-block",open:""},Zs={class:"jldocstring custom-block",open:""},si={class:"jldocstring custom-block",open:""},ii={class:"jldocstring custom-block",open:""},ai={class:"jldocstring custom-block",open:""},ti={class:"jldocstring custom-block",open:""},ni={class:"jldocstring custom-block",open:""},li={class:"jldocstring custom-block",open:""},ei={class:"jldocstring custom-block",open:""},pi={class:"jldocstring custom-block",open:""},hi={class:"jldocstring custom-block",open:""},ki={class:"jldocstring custom-block",open:""},oi={class:"jldocstring custom-block",open:""},ri={class:"jldocstring custom-block",open:""},di={class:"jldocstring custom-block",open:""},gi={class:"jldocstring custom-block",open:""},Ei={class:"jldocstring custom-block",open:""},ci={class:"jldocstring custom-block",open:""},yi={class:"jldocstring custom-block",open:""},ui={class:"jldocstring custom-block",open:""},Ci={class:"jldocstring custom-block",open:""},mi={class:"jldocstring custom-block",open:""},Fi={class:"jldocstring custom-block",open:""},bi={class:"jldocstring custom-block",open:""},vi={class:"jldocstring custom-block",open:""},ji={class:"jldocstring custom-block",open:""},fi={class:"jldocstring custom-block",open:""},Bi={class:"jldocstring custom-block",open:""},Ai={class:"jldocstring custom-block",open:""},xi={class:"jldocstring custom-block",open:""},Di={class:"jldocstring custom-block",open:""},Ti={class:"jldocstring custom-block",open:""},wi={class:"jldocstring custom-block",open:""},_i={class:"jldocstring custom-block",open:""},Li={class:"jldocstring custom-block",open:""},Ni={class:"jldocstring custom-block",open:""},Mi={class:"jldocstring custom-block",open:""},Oi={class:"jldocstring custom-block",open:""},Ii={class:"jldocstring custom-block",open:""},Ji={class:"jldocstring custom-block",open:""},Si={class:"jldocstring custom-block",open:""},Ri={class:"jldocstring custom-block",open:""},Ui={class:"jldocstring custom-block",open:""},Vi={class:"jldocstring custom-block",open:""},zi={class:"jldocstring custom-block",open:""},qi={class:"jldocstring custom-block",open:""},Pi={class:"jldocstring custom-block",open:""},Xi={class:"jldocstring custom-block",open:""},Gi={class:"jldocstring custom-block",open:""},Qi={class:"jldocstring custom-block",open:""},Wi={class:"jldocstring custom-block",open:""},Yi={class:"jldocstring custom-block",open:""},$i={class:"jldocstring custom-block",open:""},Ki={class:"jldocstring custom-block",open:""},Hi={class:"jldocstring custom-block",open:""},Zi={class:"jldocstring custom-block",open:""},sa={class:"jldocstring custom-block",open:""},ia={class:"jldocstring custom-block",open:""},aa={class:"jldocstring custom-block",open:""},ta={class:"jldocstring custom-block",open:""},na={class:"jldocstring custom-block",open:""},la={class:"jldocstring custom-block",open:""},ea={class:"jldocstring custom-block",open:""},pa={class:"jldocstring custom-block",open:""},ha={class:"jldocstring custom-block",open:""},ka={class:"jldocstring custom-block",open:""},oa={class:"jldocstring custom-block",open:""},ra={class:"jldocstring custom-block",open:""},da={class:"jldocstring custom-block",open:""},ga={class:"jldocstring custom-block",open:""},Ea={class:"jldocstring custom-block",open:""},ca={class:"jldocstring custom-block",open:""},ya={class:"jldocstring custom-block",open:""},ua={class:"jldocstring custom-block",open:""},Ca={class:"jldocstring custom-block",open:""},ma={class:"jldocstring custom-block",open:""},Fa={class:"jldocstring custom-block",open:""},ba={class:"jldocstring custom-block",open:""},va={class:"jldocstring custom-block",open:""},ja={class:"jldocstring custom-block",open:""},fa={class:"jldocstring custom-block",open:""},Ba={class:"jldocstring custom-block",open:""},Aa={class:"jldocstring custom-block",open:""},xa={class:"jldocstring custom-block",open:""},Da={class:"jldocstring custom-block",open:""},Ta={class:"jldocstring custom-block",open:""},wa={class:"jldocstring custom-block",open:""},_a={class:"jldocstring custom-block",open:""},La={class:"jldocstring custom-block",open:""},Na={class:"jldocstring custom-block",open:""},Ma={class:"jldocstring custom-block",open:""},Oa={class:"jldocstring custom-block",open:""};function Ia(Ja,s,Sa,Ra,Ua,Va){const t=h("Badge");return k(),p("div",null,[s[561]||(s[561]=i("h1",{id:"Full-API",tabindex:"-1"},[a("Full API "),i("a",{class:"header-anchor",href:"#Full-API","aria-label":'Permalink to "Full API {#Full-API}"'},"​")],-1)),i("details",r,[i("summary",null,[s[0]||(s[0]=i("a",{id:"ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS",href:"#ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS"},[i("span",{class:"jlbinding"},"ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS")],-1)),s[1]||(s[1]=a()),n(t,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[2]||(s[2]=l(`
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
+    :bool, # boolean parameter
+    :dim, # dimension, an integer parameter used along the pair_vars or vals parameters
+    :id, # index to target one variable in the input vector
+    :language, # describe a regular language such as an automaton or a MDD
+    :op, # an operator such as comparison or arithmetic operator
+    :pair_vars, # a list of parameters that are paired with each variable in the input vector
+    :val, # one scalar value
+    :vals, # a list of scalar values (independent of the input vector size)
+]

source

`,4))]),i("details",d,[i("summary",null,[s[3]||(s[3]=i("a",{id:"ConstraintCommons.AbstractAutomaton",href:"#ConstraintCommons.AbstractAutomaton"},[i("span",{class:"jlbinding"},"ConstraintCommons.AbstractAutomaton")],-1)),s[4]||(s[4]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[5]||(s[5]=l('
julia
AbstractAutomaton

An abstract interface for automata used in Julia Constraints packages. Requirements:

source

',4))]),i("details",g,[i("summary",null,[s[6]||(s[6]=i("a",{id:"ConstraintCommons.AbstractMultivaluedDecisionDiagram",href:"#ConstraintCommons.AbstractMultivaluedDecisionDiagram"},[i("span",{class:"jlbinding"},"ConstraintCommons.AbstractMultivaluedDecisionDiagram")],-1)),s[7]||(s[7]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[8]||(s[8]=l('
julia
AbstractMultivaluedDecisionDiagram

An abstract interface for Multivalued Decision Diagrams (MDD) used in Julia Constraints packages. Requirements:

source

',4))]),i("details",E,[i("summary",null,[s[9]||(s[9]=i("a",{id:"ConstraintCommons.Automaton",href:"#ConstraintCommons.Automaton"},[i("span",{class:"jlbinding"},"ConstraintCommons.Automaton")],-1)),s[10]||(s[10]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[11]||(s[11]=l('
julia
Automaton{S, T, F <: Union{S, Vector{S}, Set{S}}} <: AbstractAutomaton

A minimal implementation of a deterministic automaton structure.

source

',3))]),i("details",c,[i("summary",null,[s[12]||(s[12]=i("a",{id:"ConstraintCommons.MDD",href:"#ConstraintCommons.MDD"},[i("span",{class:"jlbinding"},"ConstraintCommons.MDD")],-1)),s[13]||(s[13]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[14]||(s[14]=l('
julia
MDD{S,T} <: AbstractMultivaluedDecisionDiagram

A minimal implementation of a multivalued decision diagram structure.

source

',3))]),i("details",y,[i("summary",null,[s[15]||(s[15]=i("a",{id:"ConstraintCommons.accept-Tuple{Automaton, Any}",href:"#ConstraintCommons.accept-Tuple{Automaton, Any}"},[i("span",{class:"jlbinding"},"ConstraintCommons.accept")],-1)),s[16]||(s[16]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[17]||(s[17]=l('
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

',3))]),i("details",u,[i("summary",null,[s[18]||(s[18]=i("a",{id:"ConstraintCommons.at_end-Union{Tuple{T}, Tuple{S}, Tuple{Automaton{S, T, S}, Any}} where {S, T}",href:"#ConstraintCommons.at_end-Union{Tuple{T}, Tuple{S}, Tuple{Automaton{S, T, S}, Any}} where {S, T}"},[i("span",{class:"jlbinding"},"ConstraintCommons.at_end")],-1)),s[19]||(s[19]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[20]||(s[20]=l('
julia
at_end(a::Automaton, s)

Internal method used by accept with Automaton.

source

',3))]),i("details",C,[i("summary",null,[s[21]||(s[21]=i("a",{id:"ConstraintCommons.consin-Tuple{Any, Nothing}",href:"#ConstraintCommons.consin-Tuple{Any, Nothing}"},[i("span",{class:"jlbinding"},"ConstraintCommons.consin")],-1)),s[22]||(s[22]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[23]||(s[23]=l('
julia
consin(::Any, ::Nothing)

Extends Base.in (or ) when the set is nothing. Returns false.

source

',3))]),i("details",m,[i("summary",null,[s[24]||(s[24]=i("a",{id:"ConstraintCommons.consisempty-Tuple{Nothing}",href:"#ConstraintCommons.consisempty-Tuple{Nothing}"},[i("span",{class:"jlbinding"},"ConstraintCommons.consisempty")],-1)),s[25]||(s[25]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[26]||(s[26]=l('
julia
consisempty(::Nothing)

Extends Base.isempty when the set is nothing. Returns true.

source

',3))]),i("details",F,[i("summary",null,[s[27]||(s[27]=i("a",{id:"ConstraintCommons.extract_parameters-Tuple{Method}",href:"#ConstraintCommons.extract_parameters-Tuple{Method}"},[i("span",{class:"jlbinding"},"ConstraintCommons.extract_parameters")],-1)),s[28]||(s[28]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[29]||(s[29]=l('
julia
extract_parameters(m::Union{Method, Function}; parameters)

Extracts the intersection between the kargs of m and parameters (defaults to USUAL_CONSTRAINT_PARAMETERS).

source

',3))]),i("details",b,[i("summary",null,[s[30]||(s[30]=i("a",{id:"ConstraintCommons.incsert!",href:"#ConstraintCommons.incsert!"},[i("span",{class:"jlbinding"},"ConstraintCommons.incsert!")],-1)),s[31]||(s[31]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[32]||(s[32]=l('
julia
incsert!(d::Union{AbstractDict, AbstractDictionary}, ind, val = 1)

Increase or insert a counter in a dictionary-based collection. The counter insertion defaults to val = 1.

source

',3))]),i("details",v,[i("summary",null,[s[33]||(s[33]=i("a",{id:"ConstraintCommons.oversample-Tuple{Any, Any}",href:"#ConstraintCommons.oversample-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"ConstraintCommons.oversample")],-1)),s[34]||(s[34]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[35]||(s[35]=l('
julia
oversample(X, f)

Oversample elements of X until the boolean function f has as many true and false configurations.

source

',3))]),i("details",j,[i("summary",null,[s[36]||(s[36]=i("a",{id:"ConstraintCommons.symcon",href:"#ConstraintCommons.symcon"},[i("span",{class:"jlbinding"},"ConstraintCommons.symcon")],-1)),s[37]||(s[37]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[38]||(s[38]=l('
julia
symcon(s1::Symbol, s2::Symbol, connector::AbstractString="_")

Extends * to Symbols multiplication by connecting the symbols by an _.

source

',3))]),i("details",f,[i("summary",null,[s[39]||(s[39]=i("a",{id:"ConstraintCommons.δ_extrema-Tuple{Any}",href:"#ConstraintCommons.δ_extrema-Tuple{Any}"},[i("span",{class:"jlbinding"},"ConstraintCommons.δ_extrema")],-1)),s[40]||(s[40]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[41]||(s[41]=l('
julia
δ_extrema(X...)

Compute both the difference between the maximum and the minimum of over all the collections of X.

source

',3))]),i("details",B,[i("summary",null,[s[42]||(s[42]=i("a",{id:"ConstraintDomains.AbstractDomain",href:"#ConstraintDomains.AbstractDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.AbstractDomain")],-1)),s[43]||(s[43]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[44]||(s[44]=l('
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

Additionally, if the domain is used in a dynamic context, it can extend

where args depends on D's structure

source

',7))]),i("details",A,[i("summary",null,[s[45]||(s[45]=i("a",{id:"ConstraintDomains.BoolParameterDomain",href:"#ConstraintDomains.BoolParameterDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.BoolParameterDomain")],-1)),s[46]||(s[46]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[47]||(s[47]=l('
julia
BoolParameterDomain <: AbstractDomain

A domain to store boolean values. It is used to generate random parameters.

source

',3))]),i("details",x,[i("summary",null,[s[48]||(s[48]=i("a",{id:"ConstraintDomains.ContinuousDomain",href:"#ConstraintDomains.ContinuousDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.ContinuousDomain")],-1)),s[49]||(s[49]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[50]||(s[50]=l('
julia
ContinuousDomain{T <: Real} <: AbstractDomain

An abstract supertype for all continuous domains.

source

',3))]),i("details",D,[i("summary",null,[s[51]||(s[51]=i("a",{id:"ConstraintDomains.DimParameterDomain",href:"#ConstraintDomains.DimParameterDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.DimParameterDomain")],-1)),s[52]||(s[52]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[53]||(s[53]=l('
julia
DimParameterDomain <: AbstractDomain

A domain to store dimensions. It is used to generate random parameters.

source

',3))]),i("details",T,[i("summary",null,[s[54]||(s[54]=i("a",{id:"ConstraintDomains.DiscreteDomain",href:"#ConstraintDomains.DiscreteDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.DiscreteDomain")],-1)),s[55]||(s[55]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[56]||(s[56]=l('
julia
DiscreteDomain{T <: Number} <: AbstractDomain

An abstract supertype for discrete domains (set, range).

source

',3))]),i("details",w,[i("summary",null,[s[57]||(s[57]=i("a",{id:"ConstraintDomains.EmptyDomain",href:"#ConstraintDomains.EmptyDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.EmptyDomain")],-1)),s[58]||(s[58]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[59]||(s[59]=l('
julia
EmptyDomain

A struct to handle yet to be defined domains.

source

',3))]),i("details",_,[i("summary",null,[s[60]||(s[60]=i("a",{id:"ConstraintDomains.ExploreSettings-Tuple{Any}",href:"#ConstraintDomains.ExploreSettings-Tuple{Any}"},[i("span",{class:"jlbinding"},"ConstraintDomains.ExploreSettings")],-1)),s[61]||(s[61]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[62]||(s[62]=l(`
julia
ExploreSettings(domains; 
+                complete_search_limit = 10^6, 
+                max_samplings = sum(domain_size, domains), 
+                search = :flexible, 
+                solutions_limit = floor(Int, sqrt(max_samplings)))

Create an ExploreSettings object to configure the exploration of a search space composed of a collection of domains.

Arguments

Returns

source

`,7))]),i("details",L,[i("summary",null,[s[63]||(s[63]=i("a",{id:"ConstraintDomains.FakeAutomaton",href:"#ConstraintDomains.FakeAutomaton"},[i("span",{class:"jlbinding"},"ConstraintDomains.FakeAutomaton")],-1)),s[64]||(s[64]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[65]||(s[65]=l('
julia
FakeAutomaton{T} <: ConstraintCommons.AbstractAutomaton

A structure to generate pseudo automaton enough for parameter exploration.

source

',3))]),i("details",N,[i("summary",null,[s[66]||(s[66]=i("a",{id:"ConstraintDomains.IdParameterDomain",href:"#ConstraintDomains.IdParameterDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.IdParameterDomain")],-1)),s[67]||(s[67]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[68]||(s[68]=l('
julia
IdParameterDomain <: AbstractDomain

A domain to store ids. It is used to generate random parameters.

source

',3))]),i("details",M,[i("summary",null,[s[69]||(s[69]=i("a",{id:"ConstraintDomains.Intervals",href:"#ConstraintDomains.Intervals"},[i("span",{class:"jlbinding"},"ConstraintDomains.Intervals")],-1)),s[70]||(s[70]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[71]||(s[71]=l('
julia
Intervals{T <: Real} <: ContinuousDomain{T}

An encapsuler to store a vector of PatternFolds.Interval. Dynamic changes to Intervals are not handled yet.

source

',3))]),i("details",O,[i("summary",null,[s[72]||(s[72]=i("a",{id:"ConstraintDomains.LanguageParameterDomain",href:"#ConstraintDomains.LanguageParameterDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.LanguageParameterDomain")],-1)),s[73]||(s[73]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[74]||(s[74]=l('
julia
LanguageParameterDomain <: AbstractDomain

A domain to store languages. It is used to generate random parameters.

source

',3))]),i("details",I,[i("summary",null,[s[75]||(s[75]=i("a",{id:"ConstraintDomains.OpParameterDomain",href:"#ConstraintDomains.OpParameterDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.OpParameterDomain")],-1)),s[76]||(s[76]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[77]||(s[77]=l('
julia
OpParameterDomain{T} <: AbstractDomain

A domain to store operators. It is used to generate random parameters.

source

',3))]),i("details",J,[i("summary",null,[s[78]||(s[78]=i("a",{id:"ConstraintDomains.PairVarsParameterDomain",href:"#ConstraintDomains.PairVarsParameterDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.PairVarsParameterDomain")],-1)),s[79]||(s[79]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[80]||(s[80]=l('
julia
PairVarsParameterDomain{T} <: AbstractDomain

A domain to store values paired with variables. It is used to generate random parameters.

source

',3))]),i("details",S,[i("summary",null,[s[81]||(s[81]=i("a",{id:"ConstraintDomains.RangeDomain",href:"#ConstraintDomains.RangeDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.RangeDomain")],-1)),s[82]||(s[82]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[83]||(s[83]=l('
julia
RangeDomain

A discrete domain defined by a range <: AbstractRange{Real}. As ranges are immutable in Julia, changes in RangeDomain must use set_domain!.

source

',3))]),i("details",R,[i("summary",null,[s[84]||(s[84]=i("a",{id:"ConstraintDomains.SetDomain",href:"#ConstraintDomains.SetDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.SetDomain")],-1)),s[85]||(s[85]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[86]||(s[86]=l('
julia
SetDomain{T <: Number} <: DiscreteDomain{T}

Domain that stores discrete values as a set of (unordered) points.

source

',3))]),i("details",U,[i("summary",null,[s[87]||(s[87]=i("a",{id:"ConstraintDomains.ValParameterDomain",href:"#ConstraintDomains.ValParameterDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.ValParameterDomain")],-1)),s[88]||(s[88]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[89]||(s[89]=l('
julia
ValParameterDomain{T} <: AbstractDomain

A domain to store one value. It is used to generate random parameters.

source

',3))]),i("details",V,[i("summary",null,[s[90]||(s[90]=i("a",{id:"ConstraintDomains.ValsParameterDomain",href:"#ConstraintDomains.ValsParameterDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.ValsParameterDomain")],-1)),s[91]||(s[91]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[92]||(s[92]=l('
julia
ValsParameterDomain{T} <: AbstractDomain

A domain to store values. It is used to generate random parameters.

source

',3))]),i("details",z,[i("summary",null,[s[93]||(s[93]=i("a",{id:"Base.convert-Union{Tuple{T}, Tuple{Type{ConstraintDomains.Intervals}, RangeDomain{T, R} where R<:AbstractRange{T}}} where T<:Real",href:"#Base.convert-Union{Tuple{T}, Tuple{Type{ConstraintDomains.Intervals}, RangeDomain{T, R} where R<:AbstractRange{T}}} where T<:Real"},[i("span",{class:"jlbinding"},"Base.convert")],-1)),s[94]||(s[94]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[95]||(s[95]=l('
julia
Base.convert(::Type{Union{Intervals, RangeDomain}}, d::Union{Intervals, RangeDomain})

Extends Base.convert for domains.

source

',3))]),i("details",q,[i("summary",null,[s[96]||(s[96]=i("a",{id:"Base.delete!-Tuple{SetDomain, Any}",href:"#Base.delete!-Tuple{SetDomain, Any}"},[i("span",{class:"jlbinding"},"Base.delete!")],-1)),s[97]||(s[97]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[98]||(s[98]=l('
julia
Base.delete!(d::SetDomain, value)(d::SetDomain, value)

Delete value from the list of points in d.

source

',3))]),i("details",P,[i("summary",null,[s[99]||(s[99]=i("a",{id:"Base.eltype-Union{Tuple{D}, Tuple{T}} where {T, D<:Union{ContinuousDomain{T}, DiscreteDomain{T}}}",href:"#Base.eltype-Union{Tuple{D}, Tuple{T}} where {T, D<:Union{ContinuousDomain{T}, DiscreteDomain{T}}}"},[i("span",{class:"jlbinding"},"Base.eltype")],-1)),s[100]||(s[100]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[101]||(s[101]=l('
julia
Base.eltype(::AbstractDomain)

Extend eltype for domains.

source

',3))]),i("details",X,[i("summary",null,[s[102]||(s[102]=i("a",{id:"Base.in-Tuple{Any, ConstraintDomains.Intervals}",href:"#Base.in-Tuple{Any, ConstraintDomains.Intervals}"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[103]||(s[103]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[104]||(s[104]=l('
julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

source

',4))]),i("details",G,[i("summary",null,[s[105]||(s[105]=i("a",{id:"Base.in-Union{Tuple{D}, Tuple{Any, D}} where D<:AbstractDomain",href:"#Base.in-Union{Tuple{D}, Tuple{Any, D}} where D<:AbstractDomain"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[106]||(s[106]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[107]||(s[107]=l('
julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

',3))]),i("details",Q,[i("summary",null,[s[108]||(s[108]=i("a",{id:"Base.in-Union{Tuple{D}, Tuple{Any, D}} where D<:DiscreteDomain",href:"#Base.in-Union{Tuple{D}, Tuple{Any, D}} where D<:DiscreteDomain"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[109]||(s[109]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[110]||(s[110]=l('
julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source

',3))]),i("details",W,[i("summary",null,[s[111]||(s[111]=i("a",{id:"Base.isempty-Tuple{D} where D<:AbstractDomain",href:"#Base.isempty-Tuple{D} where D<:AbstractDomain"},[i("span",{class:"jlbinding"},"Base.isempty")],-1)),s[112]||(s[112]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[113]||(s[113]=l('
julia
Base.isempty(d <: AbstractDomain)

Fallback method for isempty(d) that return length(d) == 0 which default to 0.

source

',3))]),i("details",Y,[i("summary",null,[s[114]||(s[114]=i("a",{id:"Base.length-Tuple{ConstraintDomains.Intervals}",href:"#Base.length-Tuple{ConstraintDomains.Intervals}"},[i("span",{class:"jlbinding"},"Base.length")],-1)),s[115]||(s[115]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[116]||(s[116]=l('
julia
Base.length(itv::Intervals)

Return the sum of the length of each interval in itv.

source

',3))]),i("details",$,[i("summary",null,[s[117]||(s[117]=i("a",{id:"Base.length-Tuple{D} where D<:AbstractDomain",href:"#Base.length-Tuple{D} where D<:AbstractDomain"},[i("span",{class:"jlbinding"},"Base.length")],-1)),s[118]||(s[118]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[119]||(s[119]=l('
julia
Base.rand(d <: AbstractDomain)

Fallback method for length(d) that return 0.

source

',3))]),i("details",K,[i("summary",null,[s[120]||(s[120]=i("a",{id:"Base.length-Tuple{D} where D<:DiscreteDomain",href:"#Base.length-Tuple{D} where D<:DiscreteDomain"},[i("span",{class:"jlbinding"},"Base.length")],-1)),s[121]||(s[121]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[122]||(s[122]=l('
julia
Base.length(d::D) where D <: DiscreteDomain

Return the number of points in d.

source

',3))]),i("details",H,[i("summary",null,[s[123]||(s[123]=i("a",{id:"Base.rand-Tuple{AbstractDomain}",href:"#Base.rand-Tuple{AbstractDomain}"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[124]||(s[124]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[125]||(s[125]=l('
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

',3))]),i("details",Z,[i("summary",null,[s[126]||(s[126]=i("a",{id:"Base.rand-Tuple{ConstraintDomains.FakeAutomaton}",href:"#Base.rand-Tuple{ConstraintDomains.FakeAutomaton}"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[127]||(s[127]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[128]||(s[128]=l('
julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

',3))]),i("details",ss,[i("summary",null,[s[129]||(s[129]=i("a",{id:"Base.rand-Tuple{ConstraintDomains.Intervals, Int64}",href:"#Base.rand-Tuple{ConstraintDomains.Intervals, Int64}"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[130]||(s[130]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[131]||(s[131]=l(`
julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

`,3))]),i("details",is,[i("summary",null,[s[132]||(s[132]=i("a",{id:"Base.rand-Tuple{D} where D<:DiscreteDomain",href:"#Base.rand-Tuple{D} where D<:DiscreteDomain"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[133]||(s[133]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[134]||(s[134]=l('
julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

',3))]),i("details",as,[i("summary",null,[s[135]||(s[135]=i("a",{id:"Base.string-Tuple{Vector{<:AbstractDomain}}",href:"#Base.string-Tuple{Vector{<:AbstractDomain}}"},[i("span",{class:"jlbinding"},"Base.string")],-1)),s[136]||(s[136]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[137]||(s[137]=l(`
julia
Base.string(D::Vector{<:AbstractDomain})
+Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source

`,3))]),i("details",ts,[i("summary",null,[s[138]||(s[138]=i("a",{id:"ConstraintCommons.accept-Tuple{ConstraintDomains.FakeAutomaton, Any}",href:"#ConstraintCommons.accept-Tuple{ConstraintDomains.FakeAutomaton, Any}"},[i("span",{class:"jlbinding"},"ConstraintCommons.accept")],-1)),s[139]||(s[139]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[140]||(s[140]=l('
julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

',3))]),i("details",ns,[i("summary",null,[s[141]||(s[141]=i("a",{id:"ConstraintDomains.ArbitraryDomain-Tuple{Any}",href:"#ConstraintDomains.ArbitraryDomain-Tuple{Any}"},[i("span",{class:"jlbinding"},"ConstraintDomains.ArbitraryDomain")],-1)),s[142]||(s[142]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[143]||(s[143]=l('
julia
ArbitraryDomain{T} <: DiscreteDomain{T}

A domain type that stores arbitrary values, possibly non numeric, of type T.

source

',3))]),i("details",ls,[i("summary",null,[s[144]||(s[144]=i("a",{id:"ConstraintDomains._explore-Tuple{Any, Any, Any, Val{:partial}}",href:"#ConstraintDomains._explore-Tuple{Any, Any, Any, Val{:partial}}"},[i("span",{class:"jlbinding"},"ConstraintDomains._explore")],-1)),s[145]||(s[145]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[146]||(s[146]=l('
julia
_explore(args...)

Internals of the explore function. Behavior is automatically adjusted on the kind of exploration: :flexible, :complete, :partial.

source

',3))]),i("details",es,[i("summary",null,[s[147]||(s[147]=i("a",{id:"ConstraintDomains.add!-Tuple{SetDomain, Any}",href:"#ConstraintDomains.add!-Tuple{SetDomain, Any}"},[i("span",{class:"jlbinding"},"ConstraintDomains.add!")],-1)),s[148]||(s[148]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[149]||(s[149]=l('
julia
add!(d::SetDomain, value)

Add value to the list of points in d.

source

',3))]),i("details",ps,[i("summary",null,[s[150]||(s[150]=i("a",{id:"ConstraintDomains.domain-Tuple{Any}",href:"#ConstraintDomains.domain-Tuple{Any}"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[151]||(s[151]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[152]||(s[152]=l(`
julia
domain(values)
+domain(range::R) where {T <: Real, R <: AbstractRange{T}}

Construct either a SetDomain or a RangeDomain.

julia
d1 = domain(1:5)
+d2 = domain([53.69, 89.2, 0.12])
+d3 = domain([2//3, 89//123])
+d4 = domain(4.3)
+d5 = domain(1,42,86.9)

source

`,4))]),i("details",hs,[i("summary",null,[s[153]||(s[153]=i("a",{id:"ConstraintDomains.domain-Tuple{}",href:"#ConstraintDomains.domain-Tuple{}"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[154]||(s[154]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[155]||(s[155]=l('
julia
domain()

Construct an EmptyDomain.

source

',3))]),i("details",ks,[i("summary",null,[s[156]||(s[156]=i("a",{id:"ConstraintDomains.domain-Union{Tuple{Array{Intervals.Interval{T, L, R}, 1}}, Tuple{R}, Tuple{L}, Tuple{T}} where {T<:Real, L, R}",href:"#ConstraintDomains.domain-Union{Tuple{Array{Intervals.Interval{T, L, R}, 1}}, Tuple{R}, Tuple{L}, Tuple{T}} where {T<:Real, L, R}"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[157]||(s[157]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[158]||(s[158]=l(`
julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

`,3))]),i("details",os,[i("summary",null,[s[159]||(s[159]=i("a",{id:"ConstraintDomains.domain_size-Tuple{ConstraintDomains.Intervals}",href:"#ConstraintDomains.domain_size-Tuple{ConstraintDomains.Intervals}"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[160]||(s[160]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[161]||(s[161]=l('
julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

',3))]),i("details",rs,[i("summary",null,[s[162]||(s[162]=i("a",{id:"ConstraintDomains.domain_size-Tuple{D} where D<:AbstractDomain",href:"#ConstraintDomains.domain_size-Tuple{D} where D<:AbstractDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[163]||(s[163]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[164]||(s[164]=l('
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

',3))]),i("details",ds,[i("summary",null,[s[165]||(s[165]=i("a",{id:"ConstraintDomains.domain_size-Tuple{D} where D<:DiscreteDomain",href:"#ConstraintDomains.domain_size-Tuple{D} where D<:DiscreteDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[166]||(s[166]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[167]||(s[167]=l('
julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',3))]),i("details",gs,[i("summary",null,[s[168]||(s[168]=i("a",{id:"ConstraintDomains.explore-Tuple{Any, Any}",href:"#ConstraintDomains.explore-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"ConstraintDomains.explore")],-1)),s[169]||(s[169]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[170]||(s[170]=l('
julia
explore(domains, concept; settings = ExploreSettings(domains), parameters...)

Search (a part of) a search space and return a pair of vectors of configurations: (solutions, non_solutions). The exploration behavior is determined based on the settings.

Arguments

Returns

source

',7))]),i("details",Es,[i("summary",null,[s[171]||(s[171]=i("a",{id:"ConstraintDomains.fake_automaton-Tuple{Any}",href:"#ConstraintDomains.fake_automaton-Tuple{Any}"},[i("span",{class:"jlbinding"},"ConstraintDomains.fake_automaton")],-1)),s[172]||(s[172]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[173]||(s[173]=l('
julia
fake_automaton(d)

Construct a FakeAutomaton.

source

',3))]),i("details",cs,[i("summary",null,[s[174]||(s[174]=i("a",{id:"ConstraintDomains.generate_parameters-Tuple{AbstractDomain, Symbol}",href:"#ConstraintDomains.generate_parameters-Tuple{AbstractDomain, Symbol}"},[i("span",{class:"jlbinding"},"ConstraintDomains.generate_parameters")],-1)),s[175]||(s[175]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[176]||(s[176]=l('
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source

',3))]),i("details",ys,[i("summary",null,[s[177]||(s[177]=i("a",{id:"ConstraintDomains.get_domain-Tuple{D} where D<:AbstractDomain",href:"#ConstraintDomains.get_domain-Tuple{D} where D<:AbstractDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.get_domain")],-1)),s[178]||(s[178]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[179]||(s[179]=l('
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

',3))]),i("details",us,[i("summary",null,[s[180]||(s[180]=i("a",{id:"ConstraintDomains.intersect_domains!-Union{Tuple{I}, Tuple{IS}, Tuple{IS, I, Any}} where {IS<:ConstraintDomains.Intervals, I<:Intervals.Interval}",href:"#ConstraintDomains.intersect_domains!-Union{Tuple{I}, Tuple{IS}, Tuple{IS, I, Any}} where {IS<:ConstraintDomains.Intervals, I<:Intervals.Interval}"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains!")],-1)),s[181]||(s[181]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[182]||(s[182]=l('
julia
intersect_domains!(is, i, new_itvls)

Compute the intersections of a domain with an interval and store the results in new_itvls.

Arguments

source

',5))]),i("details",Cs,[i("summary",null,[s[183]||(s[183]=i("a",{id:"ConstraintDomains.intersect_domains-Union{Tuple{I2}, Tuple{I1}, Tuple{I1, I2}} where {I1<:Intervals.Interval, I2<:Intervals.Interval}",href:"#ConstraintDomains.intersect_domains-Union{Tuple{I2}, Tuple{I1}, Tuple{I1, I2}} where {I1<:Intervals.Interval, I2<:Intervals.Interval}"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains")],-1)),s[184]||(s[184]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[185]||(s[185]=l('
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

',3))]),i("details",ms,[i("summary",null,[s[186]||(s[186]=i("a",{id:"ConstraintDomains.merge_domains-Tuple{RangeDomain, RangeDomain}",href:"#ConstraintDomains.merge_domains-Tuple{RangeDomain, RangeDomain}"},[i("span",{class:"jlbinding"},"ConstraintDomains.merge_domains")],-1)),s[187]||(s[187]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[188]||(s[188]=l('
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source

',3))]),i("details",Fs,[i("summary",null,[s[189]||(s[189]=i("a",{id:"ConstraintDomains.size-Tuple{I} where I<:Intervals.Interval",href:"#ConstraintDomains.size-Tuple{I} where I<:Intervals.Interval"},[i("span",{class:"jlbinding"},"ConstraintDomains.size")],-1)),s[190]||(s[190]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[191]||(s[191]=l('
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source

',3))]),i("details",bs,[i("summary",null,[s[192]||(s[192]=i("a",{id:"ConstraintDomains.to_domains-Tuple{Vector{Int64}}",href:"#ConstraintDomains.to_domains-Tuple{Vector{Int64}}"},[i("span",{class:"jlbinding"},"ConstraintDomains.to_domains")],-1)),s[193]||(s[193]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[194]||(s[194]=l('
julia
to_domains(args...)

Convert various arguments into valid domains format.

source

',3))]),i("details",vs,[i("summary",null,[s[195]||(s[195]=i("a",{id:"Constraints.USUAL_CONSTRAINTS",href:"#Constraints.USUAL_CONSTRAINTS"},[i("span",{class:"jlbinding"},"Constraints.USUAL_CONSTRAINTS")],-1)),s[196]||(s[196]=a()),n(t,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[197]||(s[197]=l('
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source

',6))]),i("details",js,[i("summary",null,[s[198]||(s[198]=i("a",{id:"Constraints.USUAL_SYMMETRIES",href:"#Constraints.USUAL_SYMMETRIES"},[i("span",{class:"jlbinding"},"Constraints.USUAL_SYMMETRIES")],-1)),s[199]||(s[199]=a()),n(t,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[200]||(s[200]=l('
julia
USUAL_SYMMETRIES

A Dictionary that contains the function to apply for each symmetry to avoid searching a whole space.

source

',3))]),i("details",fs,[i("summary",null,[s[201]||(s[201]=i("a",{id:"Constraints.Constraint",href:"#Constraints.Constraint"},[i("span",{class:"jlbinding"},"Constraints.Constraint")],-1)),s[202]||(s[202]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[203]||(s[203]=l('
julia
Constraint

Parametric structure with the following fields.

source

',4))]),i("details",Bs,[i("summary",null,[s[204]||(s[204]=i("a",{id:"ConstraintCommons.extract_parameters",href:"#ConstraintCommons.extract_parameters"},[i("span",{class:"jlbinding"},"ConstraintCommons.extract_parameters")],-1)),s[205]||(s[205]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[206]||(s[206]=l('
julia
extract_parameters(s::Symbol, constraints_dict=USUAL_CONSTRAINTS; parameters=ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS)

Return the parameters of the constraint s in constraints_dict.

Arguments

Example

julia
extract_parameters(:all_different)

source

',7))]),i("details",As,[i("summary",null,[s[207]||(s[207]=i("a",{id:"Constraints.args-Tuple{Constraint}",href:"#Constraints.args-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.args")],-1)),s[208]||(s[208]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[209]||(s[209]=l('
julia
args(c::Constraint)

Return the expected length restriction of the arguments in a constraint c. The value nothing indicates that any strictly positive number of value is accepted.

source

',3))]),i("details",xs,[i("summary",null,[s[210]||(s[210]=i("a",{id:"Constraints.concept-Tuple{Constraint}",href:"#Constraints.concept-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[211]||(s[211]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[212]||(s[212]=l('
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source

',3))]),i("details",Ds,[i("summary",null,[s[213]||(s[213]=i("a",{id:"Constraints.concept-Tuple{Symbol, Vararg{Any}}",href:"#Constraints.concept-Tuple{Symbol, Vararg{Any}}"},[i("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[214]||(s[214]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[215]||(s[215]=l('
julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

Example

julia
concept(:all_different, [1, 2, 3])

source

',7))]),i("details",Ts,[i("summary",null,[s[216]||(s[216]=i("a",{id:"Constraints.concept_vs_error-Tuple{Any, Any, Vararg{Any}}",href:"#Constraints.concept_vs_error-Tuple{Any, Any, Vararg{Any}}"},[i("span",{class:"jlbinding"},"Constraints.concept_vs_error")],-1)),s[217]||(s[217]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[218]||(s[218]=l('
julia
concept_vs_error(c, e, args...; kargs...)

Compare the results of a concept function and an error function for the same inputs. It is mainly used for testing purposes.

Arguments

Returns

Examples

julia
concept_vs_error(all_different, make_error(:all_different), [1, 2, 3]) # Returns false

source

',9))]),i("details",ws,[i("summary",null,[s[219]||(s[219]=i("a",{id:"Constraints.constraints_descriptions",href:"#Constraints.constraints_descriptions"},[i("span",{class:"jlbinding"},"Constraints.constraints_descriptions")],-1)),s[220]||(s[220]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[221]||(s[221]=l('
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

Example

julia
constraints_descriptions()

source

',7))]),i("details",_s,[i("summary",null,[s[222]||(s[222]=i("a",{id:"Constraints.constraints_parameters",href:"#Constraints.constraints_parameters"},[i("span",{class:"jlbinding"},"Constraints.constraints_parameters")],-1)),s[223]||(s[223]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[224]||(s[224]=l('
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

Example

julia
constraints_parameters()

source

',7))]),i("details",Ls,[i("summary",null,[s[225]||(s[225]=i("a",{id:"Constraints.describe",href:"#Constraints.describe"},[i("span",{class:"jlbinding"},"Constraints.describe")],-1)),s[226]||(s[226]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[227]||(s[227]=l('
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

Example

julia
describe()

source

',7))]),i("details",Ns,[i("summary",null,[s[228]||(s[228]=i("a",{id:"Constraints.error_f-Tuple{Constraint}",href:"#Constraints.error_f-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.error_f")],-1)),s[229]||(s[229]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[230]||(s[230]=l('
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source

',3))]),i("details",Ms,[i("summary",null,[s[231]||(s[231]=i("a",{id:"Constraints.make_error-Tuple{Symbol}",href:"#Constraints.make_error-Tuple{Symbol}"},[i("span",{class:"jlbinding"},"Constraints.make_error")],-1)),s[232]||(s[232]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[233]||(s[233]=l(`
julia
make_error(symb::Symbol)

Create a function that returns an error based on the predicate of the constraint identified by the symbol provided.

Arguments

Returns

Examples

julia
e = make_error(:all_different)
+e([1, 2, 3]) # Returns 0.0
+e([1, 1, 3]) # Returns 1.0

source

`,9))]),i("details",Os,[i("summary",null,[s[234]||(s[234]=i("a",{id:"Constraints.params_length-Tuple{Constraint}",href:"#Constraints.params_length-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.params_length")],-1)),s[235]||(s[235]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[236]||(s[236]=l('
julia
params_length(c::Constraint)

Return the expected length restriction of the arguments in a constraint c. The value nothing indicates that any strictly positive number of parameters is accepted.

source

',3))]),i("details",Is,[i("summary",null,[s[237]||(s[237]=i("a",{id:"Constraints.shrink_concept-Tuple{Any}",href:"#Constraints.shrink_concept-Tuple{Any}"},[i("span",{class:"jlbinding"},"Constraints.shrink_concept")],-1)),s[238]||(s[238]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[239]||(s[239]=l('
julia
shrink_concept(s)

Simply delete the concept_ part of symbol or string starting with it. TODO: add a check with a warning if s starts with something different.

source

',3))]),i("details",Js,[i("summary",null,[s[240]||(s[240]=i("a",{id:"Constraints.symmetries-Tuple{Constraint}",href:"#Constraints.symmetries-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.symmetries")],-1)),s[241]||(s[241]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[242]||(s[242]=l('
julia
symmetries(c::Constraint)

Return the list of symmetries of c.

source

',3))]),i("details",Ss,[i("summary",null,[s[243]||(s[243]=i("a",{id:"Constraints.xcsp_all_different-Tuple{Any, Nothing}",href:"#Constraints.xcsp_all_different-Tuple{Any, Nothing}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_all_different")],-1)),s[244]||(s[244]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[245]||(s[245]=l(`
julia
xcsp_all_different(list::Vector{Int})

Return true if all the values of list are different, false otherwise.

Arguments

Variants

julia
concept(:all_different, x; vals)
+concept(:all_different)(x; vals)

Examples

julia
c = concept(:all_different)
+
+c([1, 2, 3, 4])
+c([1, 2, 3, 1])
+c([1, 0, 0, 4]; vals=[0])
+c([1, 0, 0, 1]; vals=[0])

source

`,10))]),i("details",Rs,[i("summary",null,[s[246]||(s[246]=i("a",{id:"Constraints.xcsp_all_equal-Tuple{}",href:"#Constraints.xcsp_all_equal-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_all_equal")],-1)),s[247]||(s[247]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[248]||(s[248]=l(`
julia
xcsp_all_equal(list::Vector{Int}, val::Int)

Return true if all the values of list are equal to val, false otherwise.

Arguments

Variants

julia
concept(:all_equal, x; val=nothing, pair_vars=zeros(x), op=+)
+concept(:all_equal)(x; val=nothing, pair_vars=zeros(x), op=+)

Examples

julia
c = concept(:all_equal)
+
+c([0, 0, 0, 0])
+c([1, 2, 3, 4])
+c([3, 2, 1, 0]; pair_vars=[0, 1, 2, 3])
+c([0, 1, 2, 3]; pair_vars=[0, 1, 2, 3])
+c([1, 2, 3, 4]; op=/, val=1, pair_vars=[1, 2, 3, 4])
+c([1, 2, 3, 4]; op=*, val=1, pair_vars=[1, 2, 3, 4])

source

`,10))]),i("details",Us,[i("summary",null,[s[249]||(s[249]=i("a",{id:"Constraints.xcsp_cardinality-Tuple{}",href:"#Constraints.xcsp_cardinality-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_cardinality")],-1)),s[250]||(s[250]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[251]||(s[251]=l(`
julia
xcsp_cardinality(list, values, occurs, closed)

Return true if the number of occurrences of the values in values in list satisfies the given condition, false otherwise.

Arguments

Variants

julia
concept(:cardinality, x; bool=false, vals)
+concept(:cardinality)(x; bool=false, vals)
julia
concept(:cardinality_closed, x; vals)
+concept(:cardinality_closed)(x; vals)
julia
concept(:cardinality_open, x; vals)
+concept(:cardinality_open)(x; vals)

Examples

julia
c = concept(:cardinality)
+
+c([2, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])
+c([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3], bool=false)
+c([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3], bool=true)
+c([2, 5, 10, 10]; vals=[2 1; 5 1; 10 2])
+c([2, 5, 10, 10]; vals=[2 0 1 42; 5 1 3 7; 10 2 3 -4])
+c([2, 5, 5, 10]; vals=[2 0 1; 5 1 3; 10 2 3])
+c([2, 5, 10, 8]; vals=[2 1; 5 1; 10 2])
+c([5, 5, 5, 10]; vals=[2 0 1 42; 5 1 3 7; 10 2 3 -4])
+
+cc = concept(:cardinality_closed)
+cc([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])
+
+co = concept(:cardinality_open)
+co([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])

source

`,14))]),i("details",Vs,[i("summary",null,[s[252]||(s[252]=i("a",{id:"Constraints.xcsp_channel-Tuple{AbstractVector}",href:"#Constraints.xcsp_channel-Tuple{AbstractVector}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_channel")],-1)),s[253]||(s[253]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[254]||(s[254]=l(`
julia
xcsp_channel(; list)

Return true if the channel constraint is satisfied, false otherwise. The channel constraint ensures that if the i-th element of list is assigned the value j, then the j-th element of list must be assigned the value i.

Arguments

Variants

julia
concept(:channel, x; dim=1, id=nothing)
+concept(:channel)(x; dim=1, id=nothing)

Examples

julia
c = concept(:channel)
+
+c([2, 1, 4, 3])
+c([1, 2, 3, 4])
+c([2, 3, 1, 4])
+c([2, 1, 5, 3, 4, 2, 1, 4, 5, 3]; dim=2)
+c([2, 1, 4, 3, 5, 2, 1, 4, 5, 3]; dim=2)
+c([false, false, true, false]; id=3)
+c([false, false, true, false]; id=1)

source

`,10))]),i("details",zs,[i("summary",null,[s[255]||(s[255]=i("a",{id:"Constraints.xcsp_circuit-Tuple{}",href:"#Constraints.xcsp_circuit-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_circuit")],-1)),s[256]||(s[256]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[257]||(s[257]=l(`
julia
xcsp_circuit(; list, size)

Return true if the circuit constraint is satisfied, false otherwise. The circuit constraint is a global constraint ensuring that the values of x form a circuit, i.e., a sequence where each value is the index of the next value in the sequence, and the sequence eventually loops back to the start.

Arguments

Variants

julia
concept(:circuit, x; op, val)
+concept(:circuit)(x; op, val)

Examples

julia
c = concept(:circuit)
+
+c([1, 2, 3, 4])
+c([2, 3, 4, 1])
+c([2, 3, 1, 4]; op = ==, val = 3)
+c([4, 3, 1, 3]; op = >, val = 0)

source

`,10))]),i("details",qs,[i("summary",null,[s[258]||(s[258]=i("a",{id:"Constraints.xcsp_count-Tuple{}",href:"#Constraints.xcsp_count-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_count")],-1)),s[259]||(s[259]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[260]||(s[260]=l(`
julia
xcsp_count(list, values, condition)

Return true if the number of occurrences of the values in values in list satisfies the given condition, false otherwise.

Arguments

Variants

julia
concept(:count, x; vals, op, val)
+concept(:count)(x; vals, op, val)
julia
concept(:at_least, x; vals, val)
+concept(:at_least)(x; vals, val)
julia
concept(:at_most, x; vals, val)
+concept(:at_most)(x; vals, val)
julia
concept(:exactly, x; vals, val)
+concept(:exactly)(x; vals, val)

Examples

julia
c = concept(:count)
+
+c([2, 1, 4, 3]; vals=[1, 2, 3, 4], op=≥, val=2)
+c([1, 2, 3, 4]; vals=[1, 2], op==, val=2)
+c([2, 1, 4, 3]; vals=[1, 2], op=≤, val=1)

source

`,16))]),i("details",Ps,[i("summary",null,[s[261]||(s[261]=i("a",{id:"Constraints.xcsp_cumulative-Tuple{}",href:"#Constraints.xcsp_cumulative-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_cumulative")],-1)),s[262]||(s[262]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[263]||(s[263]=l(`
julia
xcsp_cumulative(; origins, lengths, heights, condition)

Return true if the cumulative constraint is satisfied, false otherwise. The cumulative constraint is a global constraint operating on a set of tasks, defined by origin (starting times), length, and height. This constraint ensures that, at each point in time, the sum of the height of tasks that overlap that point, respects a numerical condition.

Arguments

Variants

julia
concept(:cumulative, x; pair_vars, op, val)
+concept(:cumulative)(x; pair_vars, op, val)

Examples

julia
c = concept(:cumulative)
+
+c([1, 2, 3, 4, 5]; val = 1)
+c([1, 2, 2, 4, 5]; val = 1)
+c([1, 2, 3, 4, 5]; pair_vars = [3 2 5 4 2; 1 2 1 1 3], op =, val = 5)
+c([1, 2, 3, 4, 5]; pair_vars = [3 2 5 4 2; 1 2 1 1 3], op = <, val = 5)

source

`,10))]),i("details",Xs,[i("summary",null,[s[264]||(s[264]=i("a",{id:"Constraints.xcsp_element-Tuple{Any, Any, Tuple}",href:"#Constraints.xcsp_element-Tuple{Any, Any, Tuple}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_element")],-1)),s[265]||(s[265]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[266]||(s[266]=l(`
julia
xcsp_element(; list, index, condition)

Return true if the element constraint is satisfied, false otherwise. The element constraint is a global constraint specifying that a variable in x indexed by id should be equal to a value.

Arguments

Variants

julia
concept(:element, x; id=nothing, op===, val=nothing)
+concept(:element)(x; id=nothing, op===, val=nothing)

Examples

julia
c = concept(:element)
+
+c([1, 2, 3, 4, 5]; id=1, val=1)
+c([1, 2, 3, 4, 5]; id=1, val=2)
+c([1, 2, 3, 4, 2])
+c([1, 2, 3, 4, 1])

source

`,10))]),i("details",Gs,[i("summary",null,[s[267]||(s[267]=i("a",{id:"Constraints.xcsp_extension-Tuple{}",href:"#Constraints.xcsp_extension-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_extension")],-1)),s[268]||(s[268]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[269]||(s[269]=l(`
julia
xcsp_extension(; list, supports=nothing, conflicts=nothing)

Global constraint enforcing that x matches a configuration within the supports set pair_vars[1] or does not match any configuration within the conflicts set pair_vars[2]. It embodies the logic: x ∈ pair_vars[1] || x ∉ pair_vars[2], providing a comprehensive way to define valid (supported) and invalid (conflicted) configurations for constraint satisfaction problems.

Arguments

Variants

julia
concept(:extension, x; pair_vars)
+concept(:extension)(x; pair_vars)
julia
concept(:supports, x; pair_vars)
+concept(:supports)(x; pair_vars)
julia
concept(:conflicts, x; pair_vars)
+concept(:conflicts)(x; pair_vars)

Examples

julia
c = concept(:extension)
+c([1, 2, 3, 4, 5]; pair_vars=[[1, 2, 3, 4, 5]])
+c([1, 2, 3, 4, 5]; pair_vars=([[1, 2, 3, 4, 5]], [[1, 2, 1, 4, 5], [1, 2, 3, 5, 5]]))
+c([1, 2, 3, 4, 5]; pair_vars=[[1, 2, 1, 4, 5], [1, 2, 3, 5, 5]])
+
+c = concept(:supports)
+c([1, 2, 3, 4, 5]; pair_vars=[[1, 2, 3, 4, 5]])
+
+c = concept(:conflicts)
+c([1, 2, 3, 4, 5]; pair_vars=[[1, 2, 1, 4, 5], [1, 2, 3, 5, 5]])

source

`,14))]),i("details",Qs,[i("summary",null,[s[270]||(s[270]=i("a",{id:"Constraints.xcsp_instantiation-Tuple{}",href:"#Constraints.xcsp_instantiation-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_instantiation")],-1)),s[271]||(s[271]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[272]||(s[272]=l(`
julia
xcsp_instantiation(; list, values)

Return true if the instantiation constraint is satisfied, false otherwise. The instantiation constraint is a global constraint ensuring that x takes on a specific set of values in a specific order.

Arguments

Variants

julia
concept(:instantiation, x; pair_vars)
+concept(:instantiation)(x; pair_vars)

Examples

julia
c = concept(:instantiation)
+
+c([1, 2, 3, 4, 5]; pair_vars=[1, 2, 3, 4, 5])
+c([1, 2, 3, 4, 5]; pair_vars=[1, 2, 3, 4, 6])

source

`,10))]),i("details",Ws,[i("summary",null,[s[273]||(s[273]=i("a",{id:"Constraints.xcsp_intension-Tuple{}",href:"#Constraints.xcsp_intension-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_intension")],-1)),s[274]||(s[274]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[275]||(s[275]=l(`
julia
xcsp_intension(list, predicate)

An intensional constraint is usually defined from a predicate over list. As such it encompass any generic constraint.

Arguments

Variants

julia
concept(:dist_different, x)
+concept(:dist_different)(x)

Examples

@example
2 + 2
@example
2 + 2
@example
using Constraints # hide
+c = concept(:dist_different)
+c([1, 2, 3, 3]) && !c([1, 2, 3, 4])
@example
using Constraints # hide
+c = concept(:dist_different)
+c([1, 2, 3, 3]) && !c([1, 2, 3, 4])

source

`,13))]),i("details",Ys,[i("summary",null,[s[276]||(s[276]=i("a",{id:"Constraints.xcsp_maximum-Tuple{}",href:"#Constraints.xcsp_maximum-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_maximum")],-1)),s[277]||(s[277]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[278]||(s[278]=l(`
julia
xcsp_maximum(; list, condition)

Return true if the maximum constraint is satisfied, false otherwise. The maximum constraint is a global constraint specifying that a certain condition should hold for the maximum value in a list of variables.

Arguments

Variants

julia
concept(:maximum, x; op, val)
+concept(:maximum)(x; op, val)

Examples

julia
c = concept(:maximum)
+
+c([1, 2, 3, 4, 5]; op = ==, val = 5)
+c([1, 2, 3, 4, 5]; op = ==, val = 6)

source

`,10))]),i("details",$s,[i("summary",null,[s[279]||(s[279]=i("a",{id:"Constraints.xcsp_mdd-Tuple{}",href:"#Constraints.xcsp_mdd-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_mdd")],-1)),s[280]||(s[280]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[281]||(s[281]=l(`
julia
xcsp_mdd(; list, diagram)

Return a function that checks if the list of values list satisfies the MDD diagram.

Arguments

Variants

The MDD constraint is a constraint that can be used to model a wide range of problems. It is a directed graph where each node is labeled with a value and each edge is labeled with a value. The constraint is satisfied if there is a path from the first node to the last node such that the sequence of edge labels is a valid sequence of the value labels.

julia
concept(:mdd, x; language)
+concept(:mdd)(x; language)

Examples

julia
c = concept(:mdd)
+
+states = [
+    Dict( # level x1
+        (:r, 0) => :n1,
+        (:r, 1) => :n2,
+        (:r, 2) => :n3,
+    ),
+    Dict( # level x2
+        (:n1, 2) => :n4,
+        (:n2, 2) => :n4,
+        (:n3, 0) => :n5,
+    ),
+    Dict( # level x3
+        (:n4, 0) => :t,
+        (:n5, 0) => :t,
+    ),
+]
+
+a = MDD(states)
+
+c([0,2,0]; language = a)
+c([1,2,0]; language = a)
+c([2,0,0]; language = a)
+c([2,1,2]; language = a)
+c([1,0,2]; language = a)
+c([0,1,2]; language = a)

source

`,11))]),i("details",Ks,[i("summary",null,[s[282]||(s[282]=i("a",{id:"Constraints.xcsp_minimum-Tuple{}",href:"#Constraints.xcsp_minimum-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_minimum")],-1)),s[283]||(s[283]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[284]||(s[284]=l(`
julia
xcsp_minimum(; list, condition)

Return true if the minimum constraint is satisfied, false otherwise. The minimum constraint is a global constraint specifying that a certain condition should hold for the minimum value in a list of variables.

Arguments

Variants

julia
concept(:minimum, x; op, val)
+concept(:minimum)(x; op, val)

Examples

julia
c = concept(:minimum)
+
+c([1, 2, 3, 4, 5]; op = ==, val = 1)
+c([1, 2, 3, 4, 5]; op = ==, val = 0)

source

`,10))]),i("details",Hs,[i("summary",null,[s[285]||(s[285]=i("a",{id:"Constraints.xcsp_no_overlap-Tuple{Any, Any, Any}",href:"#Constraints.xcsp_no_overlap-Tuple{Any, Any, Any}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_no_overlap")],-1)),s[286]||(s[286]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[287]||(s[287]=l(`
julia
xcsp_no_overlap(; origins, lengths, zero_ignored)

Return true if the no_overlap constraint is satisfied, false otherwise. The no_overlap constraint is a global constraint used in constraint programming, often in scheduling problems. It ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts.

Arguments

Variants

julia
concept(:no_overlap, x; pair_vars, bool)
+concept(:no_overlap)(x; pair_vars, bool)
julia
concept(:no_overlap_no_zero, x; pair_vars)
+concept(:no_overlap_no_zero)(x; pair_vars)
julia
concept(:no_overlap_with_zero, x; pair_vars)
+concept(:no_overlap_with_zero)(x; pair_vars)

Examples

julia
c = concept(:no_overlap)
+
+c([1, 2, 3, 4, 5])
+c([1, 2, 3, 4, 1])
+c([1, 2, 4, 6, 3]; pair_vars = [1, 1, 1, 1, 1])
+c([1, 2, 4, 6, 3]; pair_vars = [1, 1, 1, 3, 1])
+c([1, 2, 4, 6, 3]; pair_vars = [1, 1, 3, 1, 1])
+c([1, 1, 1, 3, 5, 2, 7, 7, 5, 12, 8, 7]; pair_vars = [2, 4, 1, 4 ,2 ,3, 5, 1, 2, 3, 3, 2], dim = 3)
+c([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]; pair_vars = [2, 4, 1, 4 ,2 ,3, 5, 1, 2, 3, 3, 2], dim = 3)

source

`,14))]),i("details",Zs,[i("summary",null,[s[288]||(s[288]=i("a",{id:"Constraints.xcsp_nvalues-Tuple{Any, Any, Nothing}",href:"#Constraints.xcsp_nvalues-Tuple{Any, Any, Nothing}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_nvalues")],-1)),s[289]||(s[289]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[290]||(s[290]=l(`
julia
xcsp_nvalues(list, condition, except)

Return true if the number of distinct values in list satisfies the given condition, false otherwise.

Arguments

Variants

The constraint is defined by the following expression: nValues(x, op, val) where x is a list of variables, op is a comparison operator, and val is an integer value.

julia
concept(:nvalues, x; op, val)
+concept(:nvalues)(x; op, val)

Examples

julia
c = concept(:nvalues)
+
+c([1, 2, 3, 4, 5]; op = ==, val = 5)
+c([1, 2, 3, 4, 5]; op = ==, val = 2)
+c([1, 2, 3, 4, 3]; op = <=, val = 5)
+c([1, 2, 3, 4, 3]; op = <=, val = 3)

source

`,11))]),i("details",si,[i("summary",null,[s[291]||(s[291]=i("a",{id:"Constraints.xcsp_ordered-Tuple{Any, Any, Nothing}",href:"#Constraints.xcsp_ordered-Tuple{Any, Any, Nothing}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_ordered")],-1)),s[292]||(s[292]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[293]||(s[293]=l(`
julia
xcsp_ordered(list::Vector{Int}, operator, lengths)

Return true if all the values of list are in an increasing order, false otherwise.

Arguments

Variants

julia
concept(:ordered, x; op=≤, pair_vars=nothing)
+concept(:ordered)(x; op=≤, pair_vars=nothing)
julia
concept(:increasing, x; op=≤, pair_vars=nothing)
+concept(:increasing)(x; op=≤, pair_vars=nothing)
julia
concept(:decreasing, x; op=≥, pair_vars=nothing)
+concept(:decreasing)(x; op=≥, pair_vars=nothing)
julia
concept(:strictly_increasing, x; op=<, pair_vars=nothing)
+concept(:strictly_increasing)(x; op=<, pair_vars=nothing)
julia
concept(:strictly_decreasing, x; op=>, pair_vars=nothing)
+concept(:strictly_decreasing)(x; op=>, pair_vars=nothing)

Examples

julia
c = concept(:ordered)
+
+c([1, 2, 3, 4, 4]; op=≤)
+c([1, 2, 3, 4, 5]; op=<)
+!c([1, 2, 3, 4, 3]; op=≤)
+!c([1, 2, 3, 4, 3]; op=<)

source

`,18))]),i("details",ii,[i("summary",null,[s[294]||(s[294]=i("a",{id:"Constraints.xcsp_regular-Tuple{}",href:"#Constraints.xcsp_regular-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_regular")],-1)),s[295]||(s[295]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[296]||(s[296]=l(`
julia
xcsp_regular(; list, automaton)

Ensures that a sequence x (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of x with the language rules encoded within the automaton parameter, which must be an instance of <:AbstractAutomaton.

Arguments

Variants

julia
concept(:regular, x; language)
+concept(:regular)(x; language)

Examples

julia
c = concept(:regular)
+
+states = Dict(
+    (:a, 0) => :a,
+    (:a, 1) => :b,
+    (:b, 1) => :c,
+    (:c, 0) => :d,
+    (:d, 0) => :d,
+    (:d, 1) => :e,
+    (:e, 0) => :e,
+)
+start = :a
+finish = :e
+
+a = Automaton(states, start, finish)
+
+c([0,0,1,1,0,0,1,0,0]; language = a)
+c([1,1,1,0,1]; language = a)

source

`,10))]),i("details",ai,[i("summary",null,[s[297]||(s[297]=i("a",{id:"Constraints.xcsp_sum-Tuple{}",href:"#Constraints.xcsp_sum-Tuple{}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_sum")],-1)),s[298]||(s[298]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[299]||(s[299]=l(`
julia
xcsp_sum(list, coeffs, condition)

Return true if the sum of the variables in list satisfies the given condition, false otherwise.

Arguments

Variants

julia
concept(:sum, x; op===, pair_vars=ones(x), val)
+concept(:sum)(x; op===, pair_vars=ones(x), val)

Examples

julia
c = concept(:sum)
+
+c([1, 2, 3, 4, 5]; op===, val=15)
+c([1, 2, 3, 4, 5]; op===, val=2)
+c([1, 2, 3, 4, 3]; op=≤, val=15)
+c([1, 2, 3, 4, 3]; op=≤, val=3)

source

`,10))]),i("details",ti,[i("summary",null,[s[300]||(s[300]=i("a",{id:"Constraints.@usual-Tuple{Expr}",href:"#Constraints.@usual-Tuple{Expr}"},[i("span",{class:"jlbinding"},"Constraints.@usual")],-1)),s[301]||(s[301]=a()),n(t,{type:"info",class:"jlObjectType jlMacro",text:"Macro"})]),s[302]||(s[302]=l('
julia
usual(ex::Expr)

This macro is used to define a new constraint or update an existing one in the USUAL_CONSTRAINTS dictionary. It takes an expression ex as input, which represents the definition of a constraint.

Here's a step-by-step explanation of what the macro does:

  1. It first extracts the symbol of the concept from the input expression. This symbol is expected to be the first argument of the first argument of the expression. For example, if the expression is @usual all_different(x; y=1), the symbol would be :all_different.

  2. It then calls the shrink_concept function on the symbol to get a simplified version of the concept symbol.

  3. It initializes a dictionary defaults to store whether each keyword argument of the concept has a default value or not.

  4. It checks if the expression has more than two arguments. If it does, it means that there are keyword arguments present. It then loops over these keyword arguments. If a keyword argument is a symbol, it means it doesn't have a default value, so it adds an entry to the defaults dictionary with the keyword argument as the key and false as the value. If a keyword argument is not a symbol, it means it has a default value, so it adds an entry to the defaults dictionary with the keyword argument as the key and true as the value.

  5. It calls the make_error function on the simplified concept symbol to generate an error function for the constraint.

  6. It evaluates the input expression to get the concept function.

  7. It checks if the USUAL_CONSTRAINTS dictionary already contains an entry for the simplified concept symbol. If it does, it adds the defaults dictionary to the parameters of the existing constraint. If it doesn't, it creates a new constraint with the concept function, a description, the error function, and the defaults dictionary as the parameters, and adds it to the USUAL_CONSTRAINTS dictionary.

This macro is used to make it easier to define and update constraints in a consistent and possibly automated way.

Arguments

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source

',10))]),i("details",ni,[i("summary",null,[s[303]||(s[303]=i("a",{id:"CompositionalNetworks.Composition",href:"#CompositionalNetworks.Composition"},[i("span",{class:"jlbinding"},"CompositionalNetworks.Composition")],-1)),s[304]||(s[304]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[305]||(s[305]=l('
julia
struct Composition{F<:Function}

Store the all the information of a composition learned by an ICN.

source

',3))]),i("details",li,[i("summary",null,[s[306]||(s[306]=i("a",{id:"CompositionalNetworks.Composition-Union{Tuple{F}, Tuple{F, Any}} where F<:Function",href:"#CompositionalNetworks.Composition-Union{Tuple{F}, Tuple{F, Any}} where F<:Function"},[i("span",{class:"jlbinding"},"CompositionalNetworks.Composition")],-1)),s[307]||(s[307]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[308]||(s[308]=l('
julia
Composition(f::F, symbols) where {F<:Function}

Construct a Composition.

source

',3))]),i("details",ei,[i("summary",null,[s[309]||(s[309]=i("a",{id:"CompositionalNetworks.ICN",href:"#CompositionalNetworks.ICN"},[i("span",{class:"jlbinding"},"CompositionalNetworks.ICN")],-1)),s[310]||(s[310]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[311]||(s[311]=l('
julia
ICN(; nvars, dom_size, param, transformation, arithmetic, aggregation, comparison)

Construct an Interpretable Compositional Network, with the following arguments:

source

',4))]),i("details",pi,[i("summary",null,[s[312]||(s[312]=i("a",{id:"CompositionalNetworks.Layer",href:"#CompositionalNetworks.Layer"},[i("span",{class:"jlbinding"},"CompositionalNetworks.Layer")],-1)),s[313]||(s[313]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[314]||(s[314]=l('
julia
Layer

A structure to store a LittleDict of operations that can be selected during the learning phase of an ICN. If the layer is exclusive, only one operation can be selected at a time.

source

',3))]),i("details",hi,[i("summary",null,[s[315]||(s[315]=i("a",{id:"Base.length-Tuple{CompositionalNetworks.Layer}",href:"#Base.length-Tuple{CompositionalNetworks.Layer}"},[i("span",{class:"jlbinding"},"Base.length")],-1)),s[316]||(s[316]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[317]||(s[317]=l('
julia
length(layer)

Return the number of operations in a layer.

source

',3))]),i("details",ki,[i("summary",null,[s[318]||(s[318]=i("a",{id:"Base.length-Tuple{ICN}",href:"#Base.length-Tuple{ICN}"},[i("span",{class:"jlbinding"},"Base.length")],-1)),s[319]||(s[319]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[320]||(s[320]=l('
julia
Base.length(icn)

Return the total number of operations of an ICN.

source

',3))]),i("details",oi,[i("summary",null,[s[321]||(s[321]=i("a",{id:"CompositionalNetworks._compose-Tuple{ICN}",href:"#CompositionalNetworks._compose-Tuple{ICN}"},[i("span",{class:"jlbinding"},"CompositionalNetworks._compose")],-1)),s[322]||(s[322]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[323]||(s[323]=l('
julia
_compose(icn)

Internal function called by compose and show_composition.

source

',3))]),i("details",ri,[i("summary",null,[s[324]||(s[324]=i("a",{id:"CompositionalNetworks.ag_count_positive-Tuple{Any}",href:"#CompositionalNetworks.ag_count_positive-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.ag_count_positive")],-1)),s[325]||(s[325]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[326]||(s[326]=l('
julia
ag_count_positive(x)

Count the number of strictly positive elements of x.

source

',3))]),i("details",di,[i("summary",null,[s[327]||(s[327]=i("a",{id:"CompositionalNetworks.ag_sum-Tuple{Any}",href:"#CompositionalNetworks.ag_sum-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.ag_sum")],-1)),s[328]||(s[328]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[329]||(s[329]=l('
julia
ag_sum(x)

Aggregate through + a vector into a single scalar.

source

',3))]),i("details",gi,[i("summary",null,[s[330]||(s[330]=i("a",{id:"CompositionalNetworks.aggregation_layer-Tuple{}",href:"#CompositionalNetworks.aggregation_layer-Tuple{}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.aggregation_layer")],-1)),s[331]||(s[331]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[332]||(s[332]=l('
julia
aggregation_layer()

Generate the layer of aggregations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source

',3))]),i("details",Ei,[i("summary",null,[s[333]||(s[333]=i("a",{id:"CompositionalNetworks.ar_prod-Tuple{Any}",href:"#CompositionalNetworks.ar_prod-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.ar_prod")],-1)),s[334]||(s[334]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[335]||(s[335]=l('
julia
ar_prod(x)

Reduce k = length(x) vectors through product to a single vector.

source

',3))]),i("details",ci,[i("summary",null,[s[336]||(s[336]=i("a",{id:"CompositionalNetworks.ar_sum-Tuple{Any}",href:"#CompositionalNetworks.ar_sum-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.ar_sum")],-1)),s[337]||(s[337]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[338]||(s[338]=l('
julia
ar_sum(x)

Reduce k = length(x) vectors through sum to a single vector.

source

',3))]),i("details",yi,[i("summary",null,[s[339]||(s[339]=i("a",{id:"CompositionalNetworks.arithmetic_layer-Tuple{}",href:"#CompositionalNetworks.arithmetic_layer-Tuple{}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.arithmetic_layer")],-1)),s[340]||(s[340]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[341]||(s[341]=l('
julia
arithmetic_layer()

Generate the layer of arithmetic operations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source

',3))]),i("details",ui,[i("summary",null,[s[342]||(s[342]=i("a",{id:"CompositionalNetworks.as_bitvector",href:"#CompositionalNetworks.as_bitvector"},[i("span",{class:"jlbinding"},"CompositionalNetworks.as_bitvector")],-1)),s[343]||(s[343]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[344]||(s[344]=l('
julia
as_bitvector(n::Int, max_n::Int = n)

Convert an Int to a BitVector of minimal size (relatively to max_n).

source

',3))]),i("details",Ci,[i("summary",null,[s[345]||(s[345]=i("a",{id:"CompositionalNetworks.as_int-Tuple{AbstractVector}",href:"#CompositionalNetworks.as_int-Tuple{AbstractVector}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.as_int")],-1)),s[346]||(s[346]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[347]||(s[347]=l('
julia
as_int(v::AbstractVector)

Convert a BitVector into an Int.

source

',3))]),i("details",mi,[i("summary",null,[s[348]||(s[348]=i("a",{id:"CompositionalNetworks.co_abs_diff_var_val-Tuple{Any}",href:"#CompositionalNetworks.co_abs_diff_var_val-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.co_abs_diff_var_val")],-1)),s[349]||(s[349]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[350]||(s[350]=l('
julia
co_abs_diff_var_val(x; val)

Return the absolute difference between x and val.

source

',3))]),i("details",Fi,[i("summary",null,[s[351]||(s[351]=i("a",{id:"CompositionalNetworks.co_abs_diff_var_vars-Tuple{Any}",href:"#CompositionalNetworks.co_abs_diff_var_vars-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.co_abs_diff_var_vars")],-1)),s[352]||(s[352]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[353]||(s[353]=l('
julia
co_abs_diff_var_vars(x; nvars)

Return the absolute difference between x and the number of variables nvars.

source

',3))]),i("details",bi,[i("summary",null,[s[354]||(s[354]=i("a",{id:"CompositionalNetworks.co_euclidean-Tuple{Any}",href:"#CompositionalNetworks.co_euclidean-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.co_euclidean")],-1)),s[355]||(s[355]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[356]||(s[356]=l('
julia
co_euclidean(x; dom_size)

Compute an euclidean norm with domain size dom_size of a scalar.

source

',3))]),i("details",vi,[i("summary",null,[s[357]||(s[357]=i("a",{id:"CompositionalNetworks.co_euclidean_val-Tuple{Any}",href:"#CompositionalNetworks.co_euclidean_val-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.co_euclidean_val")],-1)),s[358]||(s[358]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[359]||(s[359]=l('
julia
co_euclidean_val(x; val, dom_size)

Compute an euclidean norm with domain size dom_size, weighted by val, of a scalar.

source

',3))]),i("details",ji,[i("summary",null,[s[360]||(s[360]=i("a",{id:"CompositionalNetworks.co_identity-Tuple{Any}",href:"#CompositionalNetworks.co_identity-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.co_identity")],-1)),s[361]||(s[361]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[362]||(s[362]=l('
julia
co_identity(x)

Identity function. Already defined in Julia as identity, specialized for scalars in the comparison layer.

source

',3))]),i("details",fi,[i("summary",null,[s[363]||(s[363]=i("a",{id:"CompositionalNetworks.co_val_minus_var-Tuple{Any}",href:"#CompositionalNetworks.co_val_minus_var-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.co_val_minus_var")],-1)),s[364]||(s[364]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[365]||(s[365]=l('
julia
co_val_minus_var(x; val)

Return the difference val - x if positive, 0.0 otherwise.

source

',3))]),i("details",Bi,[i("summary",null,[s[366]||(s[366]=i("a",{id:"CompositionalNetworks.co_var_minus_val-Tuple{Any}",href:"#CompositionalNetworks.co_var_minus_val-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.co_var_minus_val")],-1)),s[367]||(s[367]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[368]||(s[368]=l('
julia
co_var_minus_val(x; val)

Return the difference x - val if positive, 0.0 otherwise.

source

',3))]),i("details",Ai,[i("summary",null,[s[369]||(s[369]=i("a",{id:"CompositionalNetworks.co_var_minus_vars-Tuple{Any}",href:"#CompositionalNetworks.co_var_minus_vars-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.co_var_minus_vars")],-1)),s[370]||(s[370]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[371]||(s[371]=l('
julia
co_var_minus_vars(x; nvars)

Return the difference x - nvars if positive, 0.0 otherwise, where nvars denotes the numbers of variables.

source

',3))]),i("details",xi,[i("summary",null,[s[372]||(s[372]=i("a",{id:"CompositionalNetworks.co_vars_minus_var-Tuple{Any}",href:"#CompositionalNetworks.co_vars_minus_var-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.co_vars_minus_var")],-1)),s[373]||(s[373]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[374]||(s[374]=l('
julia
co_vars_minus_var(x; nvars)

Return the difference nvars - x if positive, 0.0 otherwise, where nvars denotes the numbers of variables.

source

',3))]),i("details",Di,[i("summary",null,[s[375]||(s[375]=i("a",{id:"CompositionalNetworks.code",href:"#CompositionalNetworks.code"},[i("span",{class:"jlbinding"},"CompositionalNetworks.code")],-1)),s[376]||(s[376]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[377]||(s[377]=l('
julia
code(c::Composition, lang=:maths; name="composition")

Access the code of a composition c in a given language lang. The name of the generated method is optional.

source

',3))]),i("details",Ti,[i("summary",null,[s[378]||(s[378]=i("a",{id:"CompositionalNetworks.comparison_layer",href:"#CompositionalNetworks.comparison_layer"},[i("span",{class:"jlbinding"},"CompositionalNetworks.comparison_layer")],-1)),s[379]||(s[379]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[380]||(s[380]=l('
julia
comparison_layer(param = false)

Generate the layer of transformations functions of the ICN. Iff param value is set, also includes all the parametric comparison with that value. The operations are mutually exclusive, that is only one will be selected.

source

',3))]),i("details",wi,[i("summary",null,[s[381]||(s[381]=i("a",{id:"CompositionalNetworks.compose",href:"#CompositionalNetworks.compose"},[i("span",{class:"jlbinding"},"CompositionalNetworks.compose")],-1)),s[382]||(s[382]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[383]||(s[383]=l('
julia
compose(icn, weights=nothing)

Return a function composed by some of the operations of a given ICN. Can be applied to any vector of variables. If weights are given, will assign to icn.

source

',3))]),i("details",_i,[i("summary",null,[s[384]||(s[384]=i("a",{id:"CompositionalNetworks.compose_to_file!-Tuple{Any, Any, Any}",href:"#CompositionalNetworks.compose_to_file!-Tuple{Any, Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.compose_to_file!")],-1)),s[385]||(s[385]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[386]||(s[386]=l('
julia
compose_to_file!(concept, name, path; domains, param = nothing, language = :Julia, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200)

Explore, learn and compose a function and write it to a file.

Arguments:

Keywords arguments:

source

',7))]),i("details",Li,[i("summary",null,[s[387]||(s[387]=i("a",{id:"CompositionalNetworks.composition-Tuple{Composition}",href:"#CompositionalNetworks.composition-Tuple{Composition}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.composition")],-1)),s[388]||(s[388]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[389]||(s[389]=l('
julia
composition(c::Composition)

Access the actual method of an ICN composition c.

source

',3))]),i("details",Ni,[i("summary",null,[s[390]||(s[390]=i("a",{id:"CompositionalNetworks.composition_to_file!",href:"#CompositionalNetworks.composition_to_file!"},[i("span",{class:"jlbinding"},"CompositionalNetworks.composition_to_file!")],-1)),s[391]||(s[391]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[392]||(s[392]=l('
julia
composition_to_file!(c::Composition, path, name, language=:Julia)

Write the composition code in a given language into a file at path.

source

',3))]),i("details",Mi,[i("summary",null,[s[393]||(s[393]=i("a",{id:"CompositionalNetworks.exclu-Tuple{Any}",href:"#CompositionalNetworks.exclu-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.exclu")],-1)),s[394]||(s[394]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[395]||(s[395]=l('
julia
exclu(layer)

Return true if the layer has mutually exclusive operations.

source

',3))]),i("details",Oi,[i("summary",null,[s[396]||(s[396]=i("a",{id:"CompositionalNetworks.explore_learn_compose-Tuple{Any, Any}",href:"#CompositionalNetworks.explore_learn_compose-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.explore_learn_compose")],-1)),s[397]||(s[397]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[398]||(s[398]=l('
julia
explore_learn_compose(concept; domains, param = nothing, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200, action = :composition)

Explore a search space, learn a composition from an ICN, and compose an error function.

Arguments:

source

',5))]),i("details",Ii,[i("summary",null,[s[399]||(s[399]=i("a",{id:"CompositionalNetworks.functions-Tuple{Any}",href:"#CompositionalNetworks.functions-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.functions")],-1)),s[400]||(s[400]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[401]||(s[401]=l('
julia
functions(layer)

Access the operations of a layer. The container is ordered.

source

',3))]),i("details",Ji,[i("summary",null,[s[402]||(s[402]=i("a",{id:"CompositionalNetworks.generate-Tuple{Composition, Any, Val{:maths}}",href:"#CompositionalNetworks.generate-Tuple{Composition, Any, Val{:maths}}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.generate")],-1)),s[403]||(s[403]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[404]||(s[404]=l('
julia
generate(c::Composition, name, lang)

Generates the code of c in a specific language lang.

source

',3))]),i("details",Si,[i("summary",null,[s[405]||(s[405]=i("a",{id:"CompositionalNetworks.generate_exclusive_operation-Tuple{Any}",href:"#CompositionalNetworks.generate_exclusive_operation-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.generate_exclusive_operation")],-1)),s[406]||(s[406]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[407]||(s[407]=l('
julia
generate_exclusive_operation(max_op_number)

Generates the operations (weights) of a layer with exclusive operations.

source

',3))]),i("details",Ri,[i("summary",null,[s[408]||(s[408]=i("a",{id:"CompositionalNetworks.generate_inclusive_operations-Tuple{Any, Any}",href:"#CompositionalNetworks.generate_inclusive_operations-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.generate_inclusive_operations")],-1)),s[409]||(s[409]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[410]||(s[410]=l(`
julia
generate_inclusive_operations(predicate, bits)
+generate_exclusive_operation(max_op_number)

Generates the operations (weights) of a layer with inclusive/exclusive operations.

source

`,3))]),i("details",Ui,[i("summary",null,[s[411]||(s[411]=i("a",{id:"CompositionalNetworks.generate_weights-Tuple{Any}",href:"#CompositionalNetworks.generate_weights-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.generate_weights")],-1)),s[412]||(s[412]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[413]||(s[413]=l(`
julia
generate_weights(layers)
+generate_weights(icn)

Generate the weights of a collection of layers or of an ICN.

source

`,3))]),i("details",Vi,[i("summary",null,[s[414]||(s[414]=i("a",{id:"CompositionalNetworks.hamming-Tuple{Any, Any}",href:"#CompositionalNetworks.hamming-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.hamming")],-1)),s[415]||(s[415]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[416]||(s[416]=l('
julia
hamming(x, X)

Compute the hamming distance of x over a collection of solutions X, i.e. the minimal number of variables to switch in xto reach a solution.

source

',3))]),i("details",zi,[i("summary",null,[s[417]||(s[417]=i("a",{id:"CompositionalNetworks.is_viable-Tuple{CompositionalNetworks.Layer, Any}",href:"#CompositionalNetworks.is_viable-Tuple{CompositionalNetworks.Layer, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.is_viable")],-1)),s[418]||(s[418]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[419]||(s[419]=l(`
julia
is_viable(layer, w)
+is_viable(icn)
+is_viable(icn, w)

Assert if a pair of layer/icn and weights compose a viable pattern. If no weights are given with an icn, it will check the current internal value.

source

`,3))]),i("details",qi,[i("summary",null,[s[420]||(s[420]=i("a",{id:"CompositionalNetworks.layers-Tuple{Any}",href:"#CompositionalNetworks.layers-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.layers")],-1)),s[421]||(s[421]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[422]||(s[422]=l('
julia
layers(icn)

Return the ordered layers of an ICN.

source

',3))]),i("details",Pi,[i("summary",null,[s[423]||(s[423]=i("a",{id:"CompositionalNetworks.lazy-Tuple{Vararg{Function}}",href:"#CompositionalNetworks.lazy-Tuple{Vararg{Function}}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.lazy")],-1)),s[424]||(s[424]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[425]||(s[425]=l('
julia
lazy(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V).

source

',3))]),i("details",Xi,[i("summary",null,[s[426]||(s[426]=i("a",{id:"CompositionalNetworks.lazy_param-Tuple{Vararg{Function}}",href:"#CompositionalNetworks.lazy_param-Tuple{Vararg{Function}}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.lazy_param")],-1)),s[427]||(s[427]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[428]||(s[428]=l('
julia
lazy_param(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V; param).

source

',3))]),i("details",Gi,[i("summary",null,[s[429]||(s[429]=i("a",{id:"CompositionalNetworks.learn_compose-Tuple{Any, Any, Any}",href:"#CompositionalNetworks.learn_compose-Tuple{Any, Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.learn_compose")],-1)),s[430]||(s[430]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[431]||(s[431]=l(`
julia
learn_compose(;
+    nvars, dom_size, param=nothing, icn=ICN(nvars, dom_size, param),
+    X, X_sols, global_iter=100, local_iter=100, metric=hamming, popSize=200
+)

Create an ICN, optimize it, and return its composition.

source

`,3))]),i("details",Qi,[i("summary",null,[s[432]||(s[432]=i("a",{id:"CompositionalNetworks.make_transformations-Tuple{Symbol}",href:"#CompositionalNetworks.make_transformations-Tuple{Symbol}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.make_transformations")],-1)),s[433]||(s[433]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[434]||(s[434]=l(`
julia
make_transformations(param::Symbol)

Generates a dictionary of transformation functions based on the specified parameterization. This function facilitates the creation of parametric layers for constraint transformations, allowing for flexible and dynamic constraint manipulation according to the needs of different constraint programming models.

Parameters

Returns

Transformation Types

The function delegates to a version that uses Val(param) for dispatch, ensuring compile-time selection of the appropriate transformation set.

Examples

julia
# Get basic transformations
+basic_transforms = make_transformations(:none)
+
+# Apply an identity transformation
+identity_result = basic_transforms[:identity](data)
+
+# Get value-based transformations
+val_transforms = make_transformations(:val)
+
+# Apply a count equal to parameter transformation
+count_eq_param_result = val_transforms[:count_eq_param](data, param)

source

`,12))]),i("details",Wi,[i("summary",null,[s[435]||(s[435]=i("a",{id:"CompositionalNetworks.manhattan-Tuple{Any, Any}",href:"#CompositionalNetworks.manhattan-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.manhattan")],-1)),s[436]||(s[436]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[437]||(s[437]=l('
julia
manhattan(x, X)

source

',2))]),i("details",Yi,[i("summary",null,[s[438]||(s[438]=i("a",{id:"CompositionalNetworks.map_tr!-Tuple{Any, Any, Any}",href:"#CompositionalNetworks.map_tr!-Tuple{Any, Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.map_tr!")],-1)),s[439]||(s[439]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[440]||(s[440]=l('
julia
map_tr!(f, x, X, param)

Return an anonymous function that applies f to all elements of x and store the result in X, with a parameter param (which is set to nothing for function with no parameter).

source

',3))]),i("details",$i,[i("summary",null,[s[441]||(s[441]=i("a",{id:"CompositionalNetworks.minkowski-Tuple{Any, Any, Any}",href:"#CompositionalNetworks.minkowski-Tuple{Any, Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.minkowski")],-1)),s[442]||(s[442]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[443]||(s[443]=l('
julia
minkowski(x, X, p)

source

',2))]),i("details",Ki,[i("summary",null,[s[444]||(s[444]=i("a",{id:"CompositionalNetworks.nbits-Tuple{Any}",href:"#CompositionalNetworks.nbits-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.nbits")],-1)),s[445]||(s[445]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[446]||(s[446]=l('
julia
nbits(icn)

Return the expected number of bits of a viable weight of an ICN.

source

',3))]),i("details",Hi,[i("summary",null,[s[447]||(s[447]=i("a",{id:"CompositionalNetworks.nbits_exclu-Tuple{Any}",href:"#CompositionalNetworks.nbits_exclu-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.nbits_exclu")],-1)),s[448]||(s[448]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[449]||(s[449]=l('
julia
nbits_exclu(layer)

Convert the length of an exclusive layer into a number of bits.

source

',3))]),i("details",Zi,[i("summary",null,[s[450]||(s[450]=i("a",{id:"CompositionalNetworks.reduce_symbols",href:"#CompositionalNetworks.reduce_symbols"},[i("span",{class:"jlbinding"},"CompositionalNetworks.reduce_symbols")],-1)),s[451]||(s[451]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[452]||(s[452]=l('
julia
reduce_symbols(symbols, sep)

Produce a formatted string that separates the symbols by sep. Used internally for show_composition.

source

',3))]),i("details",sa,[i("summary",null,[s[453]||(s[453]=i("a",{id:"CompositionalNetworks.regularization-Tuple{Any}",href:"#CompositionalNetworks.regularization-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.regularization")],-1)),s[454]||(s[454]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[455]||(s[455]=l('
julia
regularization(icn)

Return the regularization value of an ICN weights, which is proportional to the normalized number of operations selected in the icn layers.

source

',3))]),i("details",ia,[i("summary",null,[s[456]||(s[456]=i("a",{id:"CompositionalNetworks.selected_size-Tuple{Any, Any}",href:"#CompositionalNetworks.selected_size-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.selected_size")],-1)),s[457]||(s[457]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[458]||(s[458]=l('
julia
selected_size(layer, layer_weights)

Return the number of operations selected by layer_weights in layer.

source

',3))]),i("details",aa,[i("summary",null,[s[459]||(s[459]=i("a",{id:"CompositionalNetworks.show_layer-Tuple{Any}",href:"#CompositionalNetworks.show_layer-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.show_layer")],-1)),s[460]||(s[460]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[461]||(s[461]=l('
julia
show_layer(layer)

Return a string that contains the elements in a layer.

source

',3))]),i("details",ta,[i("summary",null,[s[462]||(s[462]=i("a",{id:"CompositionalNetworks.show_layers-Tuple{Any}",href:"#CompositionalNetworks.show_layers-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.show_layers")],-1)),s[463]||(s[463]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[464]||(s[464]=l('
julia
show_layers(icn)

Return a formatted string with each layers in the icn.

source

',3))]),i("details",na,[i("summary",null,[s[465]||(s[465]=i("a",{id:"CompositionalNetworks.symbol-Tuple{Any, Any}",href:"#CompositionalNetworks.symbol-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.symbol")],-1)),s[466]||(s[466]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[467]||(s[467]=l('
julia
symbol(layer, i)

Return the i-th symbols of the operations in a given layer.

source

',3))]),i("details",la,[i("summary",null,[s[468]||(s[468]=i("a",{id:"CompositionalNetworks.symbols-Tuple{Composition}",href:"#CompositionalNetworks.symbols-Tuple{Composition}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.symbols")],-1)),s[469]||(s[469]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[470]||(s[470]=l('
julia
symbols(c::Composition)

Output the composition as a layered collection of Symbols.

source

',3))]),i("details",ea,[i("summary",null,[s[471]||(s[471]=i("a",{id:"CompositionalNetworks.tr_contiguous_vars_minus-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_contiguous_vars_minus-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_contiguous_vars_minus")],-1)),s[472]||(s[472]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[473]||(s[473]=l(`
julia
tr_contiguous_vars_minus(i, x)
+tr_contiguous_vars_minus(x)
+tr_contiguous_vars_minus(x, X::AbstractVector)

Return the difference x[i] - x[i + 1] if positive, 0.0 otherwise. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",pa,[i("summary",null,[s[474]||(s[474]=i("a",{id:"CompositionalNetworks.tr_contiguous_vars_minus_rev-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_contiguous_vars_minus_rev-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_contiguous_vars_minus_rev")],-1)),s[475]||(s[475]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[476]||(s[476]=l(`
julia
tr_contiguous_vars_minus_rev(i, x)
+tr_contiguous_vars_minus_rev(x)
+tr_contiguous_vars_minus_rev(x, X::AbstractVector)

Return the difference x[i + 1] - x[i] if positive, 0.0 otherwise. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",ha,[i("summary",null,[s[477]||(s[477]=i("a",{id:"CompositionalNetworks.tr_count_bounding_val-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_bounding_val-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_bounding_val")],-1)),s[478]||(s[478]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[479]||(s[479]=l(`
julia
tr_count_bounding_val(i, x; val)
+tr_count_bounding_val(x; val)
+tr_count_bounding_val(x, X::AbstractVector; val)

Count the number of elements bounded (not strictly) by x[i] and x[i] + val. An extended method to vector with sig (x, val) is generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",ka,[i("summary",null,[s[480]||(s[480]=i("a",{id:"CompositionalNetworks.tr_count_eq-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_eq-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_eq")],-1)),s[481]||(s[481]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[482]||(s[482]=l(`
julia
tr_count_eq(i, x)
+tr_count_eq(x)
+tr_count_eq(x, X::AbstractVector)

Count the number of elements equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",oa,[i("summary",null,[s[483]||(s[483]=i("a",{id:"CompositionalNetworks.tr_count_eq_left-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_eq_left-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_eq_left")],-1)),s[484]||(s[484]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[485]||(s[485]=l(`
julia
tr_count_eq_left(i, x)
+tr_count_eq_left(x)
+tr_count_eq_left(x, X::AbstractVector)

Count the number of elements to the left of and equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",ra,[i("summary",null,[s[486]||(s[486]=i("a",{id:"CompositionalNetworks.tr_count_eq_right-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_eq_right-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_eq_right")],-1)),s[487]||(s[487]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[488]||(s[488]=l(`
julia
tr_count_eq_right(i, x)
+tr_count_eq_right(x)
+tr_count_eq_right(x, X::AbstractVector)

Count the number of elements to the right of and equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",da,[i("summary",null,[s[489]||(s[489]=i("a",{id:"CompositionalNetworks.tr_count_eq_val-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_eq_val-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_eq_val")],-1)),s[490]||(s[490]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[491]||(s[491]=l(`
julia
tr_count_eq_val(i, x; val)
+tr_count_eq_val(x; val)
+tr_count_eq_val(x, X::AbstractVector; val)

Count the number of elements equal to x[i] + val. Extended method to vector with sig (x, val) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",ga,[i("summary",null,[s[492]||(s[492]=i("a",{id:"CompositionalNetworks.tr_count_g_left-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_g_left-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_g_left")],-1)),s[493]||(s[493]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[494]||(s[494]=l(`
julia
tr_count_g_left(i, x)
+tr_count_g_left(x)
+tr_count_g_left(x, X::AbstractVector)

Count the number of elements to the left of and greater than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",Ea,[i("summary",null,[s[495]||(s[495]=i("a",{id:"CompositionalNetworks.tr_count_g_right-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_g_right-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_g_right")],-1)),s[496]||(s[496]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[497]||(s[497]=l(`
julia
tr_count_g_right(i, x)
+tr_count_g_right(x)
+tr_count_g_right(x, X::AbstractVector)

Count the number of elements to the right of and greater than x[i]. Extended method to vector with sig (x) are generated.

source

`,3))]),i("details",ca,[i("summary",null,[s[498]||(s[498]=i("a",{id:"CompositionalNetworks.tr_count_g_val-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_g_val-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_g_val")],-1)),s[499]||(s[499]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[500]||(s[500]=l(`
julia
tr_count_g_val(i, x; val)
+tr_count_g_val(x; val)
+tr_count_g_val(x, X::AbstractVector; val)

Count the number of elements greater than x[i] + val. Extended method to vector with sig (x, val) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",ya,[i("summary",null,[s[501]||(s[501]=i("a",{id:"CompositionalNetworks.tr_count_greater-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_greater-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_greater")],-1)),s[502]||(s[502]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[503]||(s[503]=l(`
julia
tr_count_greater(i, x)
+tr_count_greater(x)
+tr_count_greater(x, X::AbstractVector)

Count the number of elements greater than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",ua,[i("summary",null,[s[504]||(s[504]=i("a",{id:"CompositionalNetworks.tr_count_l_left-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_l_left-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_l_left")],-1)),s[505]||(s[505]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[506]||(s[506]=l(`
julia
tr_count_l_left(i, x)
+tr_count_l_left(x)
+tr_count_l_left(x, X::AbstractVector)

Count the number of elements to the left of and lesser than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",Ca,[i("summary",null,[s[507]||(s[507]=i("a",{id:"CompositionalNetworks.tr_count_l_right-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_l_right-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_l_right")],-1)),s[508]||(s[508]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[509]||(s[509]=l(`
julia
tr_count_l_right(i, x)
+tr_count_l_right(x)
+tr_count_l_right(x, X::AbstractVector)

Count the number of elements to the right of and lesser than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",ma,[i("summary",null,[s[510]||(s[510]=i("a",{id:"CompositionalNetworks.tr_count_l_val-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_l_val-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_l_val")],-1)),s[511]||(s[511]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[512]||(s[512]=l(`
julia
tr_count_l_val(i, x; val)
+tr_count_l_val(x; val)
+tr_count_l_val(x, X::AbstractVector; val)

Count the number of elements lesser than x[i] + val. Extended method to vector with sig (x, val) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",Fa,[i("summary",null,[s[513]||(s[513]=i("a",{id:"CompositionalNetworks.tr_count_lesser-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_count_lesser-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_lesser")],-1)),s[514]||(s[514]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[515]||(s[515]=l(`
julia
tr_count_lesser(i, x)
+tr_count_lesser(x)
+tr_count_lesser(x, X::AbstractVector)

Count the number of elements lesser than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",ba,[i("summary",null,[s[516]||(s[516]=i("a",{id:"CompositionalNetworks.tr_identity-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_identity-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_identity")],-1)),s[517]||(s[517]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[518]||(s[518]=l(`
julia
tr_identity(i, x)
+tr_identity(x)
+tr_identity(x, X::AbstractVector)

Identity function. Already defined in Julia as identity, specialized for vectors. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",va,[i("summary",null,[s[519]||(s[519]=i("a",{id:"CompositionalNetworks.tr_in_unrolled_expansion_##225-NTuple{4, Any}",href:"#CompositionalNetworks.tr_in_unrolled_expansion_##225-NTuple{4, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_in_unrolled_expansion_##225")],-1)),s[520]||(s[520]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[521]||(s[521]=l('
julia
tr_in(tr, X, x, param)

Application of an operation from the transformation layer. Used to generate more efficient code for all compositions.

source

',3))]),i("details",ja,[i("summary",null,[s[522]||(s[522]=i("a",{id:"CompositionalNetworks.tr_val_minus_var-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_val_minus_var-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_val_minus_var")],-1)),s[523]||(s[523]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[524]||(s[524]=l(`
julia
tr_val_minus_var(i, x; val)
+tr_val_minus_var(x; val)
+tr_val_minus_var(x, X::AbstractVector; val)

Return the difference val - x[i] if positive, 0.0 otherwise. Extended method to vector with sig (x, val) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",fa,[i("summary",null,[s[525]||(s[525]=i("a",{id:"CompositionalNetworks.tr_var_minus_val-Tuple{Any, Any}",href:"#CompositionalNetworks.tr_var_minus_val-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_var_minus_val")],-1)),s[526]||(s[526]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[527]||(s[527]=l(`
julia
tr_var_minus_val(i, x; val)
+tr_var_minus_val(x; val)
+tr_var_minus_val(x, X::AbstractVector; val)

Return the difference x[i] - val if positive, 0.0 otherwise. Extended method to vector with sig (x, val) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",Ba,[i("summary",null,[s[528]||(s[528]=i("a",{id:"CompositionalNetworks.transformation_layer",href:"#CompositionalNetworks.transformation_layer"},[i("span",{class:"jlbinding"},"CompositionalNetworks.transformation_layer")],-1)),s[529]||(s[529]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[530]||(s[530]=l('
julia
transformation_layer(param = Vector{Symbol}())

Generate the layer of transformations functions of the ICN. Iff param value is non empty, also includes all the related parametric transformations.

source

',3))]),i("details",Aa,[i("summary",null,[s[531]||(s[531]=i("a",{id:"CompositionalNetworks.weights!-Tuple{Any, Any}",href:"#CompositionalNetworks.weights!-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.weights!")],-1)),s[532]||(s[532]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[533]||(s[533]=l('
julia
weights!(icn, weights)

Set the weights of an ICN with a BitVector.

source

',3))]),i("details",xa,[i("summary",null,[s[534]||(s[534]=i("a",{id:"CompositionalNetworks.weights-Tuple{Any}",href:"#CompositionalNetworks.weights-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.weights")],-1)),s[535]||(s[535]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[536]||(s[536]=l('
julia
weights(icn)

Access the current set of weights of an ICN.

source

',3))]),i("details",Da,[i("summary",null,[s[537]||(s[537]=i("a",{id:"CompositionalNetworks.weights_bias-Tuple{Any}",href:"#CompositionalNetworks.weights_bias-Tuple{Any}"},[i("span",{class:"jlbinding"},"CompositionalNetworks.weights_bias")],-1)),s[538]||(s[538]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[539]||(s[539]=l('
julia
weights_bias(x)

A metric that bias x towards operations with a lower bit. Do not affect the main metric.

source

',3))]),i("details",Ta,[i("summary",null,[s[540]||(s[540]=i("a",{id:"QUBOConstraints.AbstractOptimizer",href:"#QUBOConstraints.AbstractOptimizer"},[i("span",{class:"jlbinding"},"QUBOConstraints.AbstractOptimizer")],-1)),s[541]||(s[541]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[542]||(s[542]=l('
julia
AbstractOptimizer

An abstract type (interface) used to learn QUBO matrices from constraints. Only a train method is required.

source

',3))]),i("details",wa,[i("summary",null,[s[543]||(s[543]=i("a",{id:"QUBOConstraints.QUBO_base",href:"#QUBOConstraints.QUBO_base"},[i("span",{class:"jlbinding"},"QUBOConstraints.QUBO_base")],-1)),s[544]||(s[544]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[545]||(s[545]=l('
julia
QUBO_base(n, weight = 1)

A basic QUBO matrix to ensure that binarized variables keep a valid encoding.

source

',3))]),i("details",_a,[i("summary",null,[s[546]||(s[546]=i("a",{id:"QUBOConstraints.QUBO_linear_sum-Tuple{Any, Any}",href:"#QUBOConstraints.QUBO_linear_sum-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"QUBOConstraints.QUBO_linear_sum")],-1)),s[547]||(s[547]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[548]||(s[548]=l('
julia
QUBO_linear_sum(n, σ)

One valid QUBO matrix given n variables and parameter σ for the linear sum constraint.

source

',3))]),i("details",La,[i("summary",null,[s[549]||(s[549]=i("a",{id:"QUBOConstraints.binarize-Union{Tuple{Vector{T}}, Tuple{T}, Tuple{Vector{T}, Any}} where T<:Number",href:"#QUBOConstraints.binarize-Union{Tuple{Vector{T}}, Tuple{T}, Tuple{Vector{T}, Any}} where T<:Number"},[i("span",{class:"jlbinding"},"QUBOConstraints.binarize")],-1)),s[550]||(s[550]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[551]||(s[551]=l('
julia
binarize(x[, domain]; binarization = :one_hot)

Binarize x following the binarization encoding. If x is a vector (instead of a number per say), domain is optional.

source

',3))]),i("details",Na,[i("summary",null,[s[552]||(s[552]=i("a",{id:"QUBOConstraints.debinarize-Tuple{Any}",href:"#QUBOConstraints.debinarize-Tuple{Any}"},[i("span",{class:"jlbinding"},"QUBOConstraints.debinarize")],-1)),s[553]||(s[553]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[554]||(s[554]=l('
julia
debinarize(x[, domain]; binarization = :one_hot)

Transform a binary vector into a number or a set of number. If domain is not given, it will compute a default value based on binarization and x.

source

',3))]),i("details",Ma,[i("summary",null,[s[555]||(s[555]=i("a",{id:"QUBOConstraints.is_valid",href:"#QUBOConstraints.is_valid"},[i("span",{class:"jlbinding"},"QUBOConstraints.is_valid")],-1)),s[556]||(s[556]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[557]||(s[557]=l('
julia
is_valid(x, encoding::Symbol = :none)

Check if x has a valid format for encoding.

For instance, if encoding == :one_hot, at most one bit of x can be set to 1.

source

',4))]),i("details",Oa,[i("summary",null,[s[558]||(s[558]=i("a",{id:"QUBOConstraints.train-Tuple",href:"#QUBOConstraints.train-Tuple"},[i("span",{class:"jlbinding"},"QUBOConstraints.train")],-1)),s[559]||(s[559]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[560]||(s[560]=l('
julia
train(args...)

Default train method for any AbstractOptimizer.

source

',3))])])}const Pa=e(o,[["render",Ia]]);export{qa as __pageData,Pa as default}; diff --git a/dev/assets/api_10_full.md.hyJT-s4-.lean.js b/dev/assets/api_10_full.md.hyJT-s4-.lean.js deleted file mode 100644 index b15c5c4..0000000 --- a/dev/assets/api_10_full.md.hyJT-s4-.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.CBLuZwrP.js";const E=JSON.parse('{"title":"Full API","description":"","frontmatter":{},"headers":[],"relativePath":"api/10_full.md","filePath":"api/10_full.md","lastUpdated":null}'),e={name:"api/10_full.md"},n=t("",375),l=[n];function h(p,r,k,o,d,c){return a(),i("div",null,l)}const y=s(e,[["render",h]]);export{E as __pageData,y as default}; diff --git a/dev/assets/app.B30tbP6z.js b/dev/assets/app.B30tbP6z.js deleted file mode 100644 index 7da1697..0000000 --- a/dev/assets/app.B30tbP6z.js +++ /dev/null @@ -1 +0,0 @@ -import{U as o,a8 as p,a9 as u,aa as l,ab as c,ac as f,ad as d,ae as m,af as h,ag as g,ah as A,d as P,u as v,y,x as w,ai as C,aj as R,ak as b,a6 as E}from"./chunks/framework.CBLuZwrP.js";import{R as S}from"./chunks/theme.CtZIydQx.js";function i(e){if(e.extends){const a=i(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=i(S),T=P({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=v();return y(()=>{w(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&C(),R(),b(),s.setup&&s.setup(),()=>E(s.Layout)}});async function _(){globalThis.__VITEPRESS__=!0;const e=x(),a=j();a.provide(u,e);const t=l(e.route);return a.provide(c,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function j(){return h(T)}function x(){let e=o,a;return g(t=>{let n=A(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=import(n)),o&&(e=!1),r},s.NotFound)}o&&_().then(({app:e,router:a,data:t})=>{a.go().then(()=>{p(a.route,t.site),e.mount("#app")})});export{_ as createApp}; diff --git a/dev/assets/app.BTJUqBJh.js b/dev/assets/app.BTJUqBJh.js new file mode 100644 index 0000000..ef9dde9 --- /dev/null +++ b/dev/assets/app.BTJUqBJh.js @@ -0,0 +1 @@ +import{R as p}from"./chunks/theme.BIQLsjK8.js";import{R as o,a6 as u,a7 as c,a8 as l,a9 as f,aa as d,ab as m,ac as h,ad as g,ae as A,af as v,d as P,u as R,v as w,s as y,ag as C,ah as b,ai as E,a4 as S}from"./chunks/framework.CJakPlgM.js";function i(e){if(e.extends){const a=i(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=i(p),T=P({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=R();return w(()=>{y(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&C(),b(),E(),s.setup&&s.setup(),()=>S(s.Layout)}});async function D(){globalThis.__VITEPRESS__=!0;const e=j(),a=_();a.provide(c,e);const t=l(e.route);return a.provide(f,t),a.component("Content",d),a.component("ClientOnly",m),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:h}),{app:a,router:e,data:t}}function _(){return g(T)}function j(){let e=o,a;return A(t=>{let n=v(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=import(n)),o&&(e=!1),r},s.NotFound)}o&&D().then(({app:e,router:a,data:t})=>{a.go().then(()=>{u(a.route,t.site),e.mount("#app")})});export{D as createApp}; diff --git a/dev/assets/chunks/@localSearchIndexroot.D5JLvZ7R.js b/dev/assets/chunks/@localSearchIndexroot.D5JLvZ7R.js deleted file mode 100644 index b127e12..0000000 --- a/dev/assets/chunks/@localSearchIndexroot.D5JLvZ7R.js +++ /dev/null @@ -1 +0,0 @@ -const t='{"documentCount":157,"nextId":157,"documentIds":{"0":"/dev/api/00_public#Public-API","1":"/dev/constraints/00_intro#Introduction-to-basics-constraint-based-modeling-tools","2":"/dev/constraints/00_intro#terminology","3":"/dev/constraints/00_intro#constraint","4":"/dev/constraints/00_intro#Constraint-Instantiation","5":"/dev/constraints/00_intro#configuration","6":"/dev/constraints/00_intro#Constraint-Satisfaction-or-Violation-by-a-Configuration","7":"/dev/constraints/00_intro#Domain-defined-variables","8":"/dev/constraints/00_intro#A-versatile-constraints\'-API","9":"/dev/constraints/00_intro#A-collection-of-models","10":"/dev/constraints/00_intro#Internal-Aspects","11":"/dev/api/10_full#Full-API","12":"/dev/constraints/10_variables_and_domains#Defining-Variables-and-Exploring-Domains","13":"/dev/constraints/10_variables_and_domains#Implementing-the-AbstractDomain-Interface","14":"/dev/constraints/10_variables_and_domains#Discrete-Domains","15":"/dev/constraints/10_variables_and_domains#SetDomain","16":"/dev/constraints/10_variables_and_domains#RangeDomain","17":"/dev/constraints/10_variables_and_domains#Arbitrary-Domains","18":"/dev/constraints/10_variables_and_domains#Continuous-Domains","19":"/dev/constraints/20_constraints#Interacting-with-Constraints-in-Julia","20":"/dev/constraints/20_constraints#Usual-Constraints-and-Parameters","21":"/dev/constraints/20_constraints#Concepts,-Error-Functions,-and-QUBO-matrices","22":"/dev/constraints/21_generic_constraints#Generic-Constraints","23":"/dev/constraints/21_generic_constraints#Intention-Constraints","24":"/dev/constraints/21_generic_constraints#Defining-an-intention-constraint-in-JC-API","25":"/dev/constraints/21_generic_constraints#apis","26":"/dev/constraints/21_generic_constraints#Extension-Constraints","27":"/dev/constraints/22_language_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","28":"/dev/constraints/22_language_constraints#Constraints-defined-from-Languages","29":"/dev/constraints/23_comparison_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","30":"/dev/constraints/23_comparison_constraints#Comparison-based-Constraints","31":"/dev/constraints/24_counting_summing_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","32":"/dev/constraints/24_counting_summing_constraints#Counting-and-Summing-Constraints","33":"/dev/constraints/25_connection_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","34":"/dev/constraints/25_connection_constraints#Connection-Constraints","35":"/dev/constraints/26_packing_scheduling_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","36":"/dev/constraints/26_packing_scheduling_constraints#Packing-and-Scheduling-Constraints","37":"/dev/constraints/27_graph_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","38":"/dev/constraints/27_graph_constraints#Constraints-on-Graphs","39":"/dev/constraints/28_elementary_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","40":"/dev/constraints/28_elementary_constraints#Elementary-Constraints","41":"/dev/constraints/40_constraint_models#constraintmodels-jl","42":"/dev/constraints/60_constraint_commons#constraintcommons-jl","43":"/dev/constraints/60_constraint_commons#parameters","44":"/dev/constraints/60_constraint_commons#performances","45":"/dev/constraints/60_constraint_commons#languages","46":"/dev/constraints/60_constraint_commons#Performances-2","47":"/dev/constraints/60_constraint_commons#extensions","48":"/dev/constraints/60_constraint_commons#Performances-3","49":"/dev/constraints/60_constraint_commons#sampling","50":"/dev/constraints/60_constraint_commons#Performances-4","51":"/dev/constraints/60_constraint_commons#extrema","52":"/dev/constraints/60_constraint_commons#Performances-5","53":"/dev/constraints/60_constraint_commons#dictionaries","54":"/dev/constraints/60_constraint_commons#Performances-6","55":"/dev/constraints/61_constraint_domains#ConstraintDomains.jl:-Defining-Variables-and-Exploring-Domains","56":"/dev/constraints/61_constraint_domains#commons","57":"/dev/constraints/61_constraint_domains#Extension-to-Base-module","58":"/dev/constraints/61_constraint_domains#performances","59":"/dev/constraints/61_constraint_domains#continuous","60":"/dev/constraints/61_constraint_domains#Extension-to-Base-module-2","61":"/dev/constraints/61_constraint_domains#Performances-2","62":"/dev/constraints/61_constraint_domains#discrete","63":"/dev/constraints/61_constraint_domains#Extension-to-Base-module-3","64":"/dev/constraints/61_constraint_domains#Performances-3","65":"/dev/constraints/61_constraint_domains#general","66":"/dev/constraints/61_constraint_domains#exploration","67":"/dev/constraints/61_constraint_domains#Performances-4","68":"/dev/constraints/61_constraint_domains#parameters","69":"/dev/constraints/62_constraints_jl#Interacting-with-Constraints-in-Julia","70":"/dev/constraints/62_constraints_jl#Usual-Parameters","71":"/dev/constraints/62_constraints_jl#Concepts,-Error-Functions,-and-QUBO-matrices","72":"/dev/constraints/62_constraints_jl#Usual-Constraints","73":"/dev/cp/00_intro#Welcome-to-Julia-Constraints","74":"/dev/cp/10_cp101#Constraint-Programming-101","75":"/dev/cp/10_cp101#What-is-Constraint-Programming?","76":"/dev/cp/10_cp101#Basic-Concepts-and-Terminology","77":"/dev/cp/10_cp101#How-CP-differs-from-other-optimization-techniques","78":"/dev/cp/20_opt#Dive-into-Optimization","79":"/dev/cp/20_opt#Understanding-Optimization","80":"/dev/cp/20_opt#Metaheuristics-Overview","81":"/dev/cp/20_opt#Mathematical-Programming-Basics","82":"/dev/cp/30_getting_started#Getting-Started-with-Julia-for-CP-and-Optimization","83":"/dev/cp/30_getting_started#Why-Julia?","84":"/dev/cp/30_getting_started#Setting-Up-Your-Julia-Environment","85":"/dev/cp/30_getting_started#Your-First-Julia-CP-Model","86":"/dev/cp/40_ecosystem#Exploring-JuliaConstraint-Packages","87":"/dev/cp/40_ecosystem#Package-Overviews","88":"/dev/cp/40_ecosystem#Installation-and-Getting-Started-Guides","89":"/dev/cp/50_advanced#Advanced-Constraint-Programming-Techniques","90":"/dev/cp/50_advanced#Global-Constraints-and-Their-Uses","91":"/dev/cp/50_advanced#Search-Strategies-and-Optimization","92":"/dev/cp/70_models#Building-and-Analyzing-Models","93":"/dev/cp/70_models#Modeling-Best-Practices","94":"/dev/cp/70_models#Performance-Analysis-and-Improvement","95":"/dev/cp/60_applications#Applying-Optimization-Methods","96":"/dev/cp/60_applications#Case-Studies-and-Real-World-Applications","97":"/dev/cp/60_applications#From-Theory-to-Practice","98":"/dev/cp/80_tuto_xp#Tutorials-and-Experiments","99":"/dev/cp/80_tuto_xp#Hands-On-Tutorials","100":"/dev/cp/80_tuto_xp#Experimental-Analysis","101":"/dev/cp/90_contribution#Community-and-Contribution","102":"/dev/cp/90_contribution#Joining-the-JuliaConstraint-Community","103":"/dev/cp/90_contribution#Future-Directions","104":"/dev/learning/00_intro#Learning-about-Constraints","105":"/dev/learning/00_intro#parameters","106":"/dev/learning/10_compositional_networks#compositionalnetworks-jl","107":"/dev/learning/10_compositional_networks#utilities","108":"/dev/learning/10_compositional_networks#metrics","109":"/dev/learning/11_layers#A-layer-structure-for-any-ICN","110":"/dev/learning/13_arithmetic#Arithmetic-Layer","111":"/dev/learning/13_arithmetic#List-of-arithmetic-operations","112":"/dev/learning/13_arithmetic#Layer-generation","113":"/dev/learning/14_aggregation#Aggregation-Layer","114":"/dev/learning/14_aggregation#List-of-aggregations","115":"/dev/learning/14_aggregation#Layer-generation","116":"/dev/learning/12_transformation#Transformations-Layer","117":"/dev/learning/12_transformation#List-of-transformations","118":"/dev/learning/12_transformation#non-parametric","119":"/dev/learning/12_transformation#Param:-:val","120":"/dev/learning/12_transformation#Layer-generation","121":"/dev/learning/15_comparison#Comparison-Layer","122":"/dev/learning/15_comparison#List-of-comparisons","123":"/dev/learning/15_comparison#non-parametric","124":"/dev/learning/15_comparison#Param:-:val","125":"/dev/learning/15_comparison#Layer-generation","126":"/dev/learning/20_qubo_constraints#Introduction-to-QUBOConstraints.jl","127":"/dev/learning/20_qubo_constraints#Basic-features","128":"/dev/learning/21_qubo_encoding#Encoding-for-QUBO-programs","129":"/dev/learning/22_qubo_learning#Learning-QUBO-matrices","130":"/dev/learning/22_qubo_learning#interface","131":"/dev/learning/22_qubo_learning#Examples-with-various-optimizers","132":"/dev/learning/22_qubo_learning#Gradient-Descent","133":"/dev/learning/22_qubo_learning#Constraint-based-Local-Search","134":"/dev/learning/30_constraints_translator#constraintstranslator-jl","135":"/dev/learning/90_constraint_learning#constraintlearning-jl","136":"/dev/meta/00_meta_strategist#metastrategist-jl","137":"/dev/perf/00_perf_checker#perfchecker-jl","138":"/dev/perf/00_perf_checker#usage","139":"/dev/perf/10_tutorial#tutorial","140":"/dev/perf/30_benchmark_ext#BenchmarkTools-Extension","141":"/dev/perf/30_benchmark_ext#usage","142":"/dev/perf/30_benchmark_ext#options","143":"/dev/perf/20_perf_interface#Extending-PerfChecker","144":"/dev/perf/20_perf_interface#The-Default-Options","145":"/dev/perf/20_perf_interface#Package-initialization","146":"/dev/perf/20_perf_interface#Preparatory-Code:","147":"/dev/perf/20_perf_interface#Main-Code-to-be-Performance-Tested","148":"/dev/perf/20_perf_interface#Post-Performance-Testing-Code","149":"/dev/perf/20_perf_interface#Converting-the-result-into-a-Table","150":"/dev/perf/40_chairmarks_ext#Chairmarks-Extension","151":"/dev/perf/40_chairmarks_ext#usage","152":"/dev/perf/40_chairmarks_ext#options","153":"/dev/perf/90_api#api","154":"/dev/solvers/00_intro#solvers","155":"/dev/solvers/10_cbls#cbls-jl","156":"/dev/solvers/60_local_search_solvers#localsearchsolvers-jl"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[2,1,616],"1":[7,1,54],"2":[1,7,49],"3":[1,8,42],"4":[2,8,40],"5":[1,8,39],"6":[7,8,49],"7":[3,7,28],"8":[5,7,36],"9":[4,7,38],"10":[2,7,40],"11":[2,1,1158],"12":[5,1,54],"13":[4,5,91],"14":[2,5,20],"15":[1,6,57],"16":[1,6,78],"17":[2,6,37],"18":[2,5,50],"19":[5,1,51],"20":[4,5,176],"21":[6,5,102],"22":[2,1,17],"23":[2,2,77],"24":[7,3,68],"25":[1,3,101],"26":[2,2,109],"27":[9,1,1],"28":[4,9,126],"29":[9,1,79],"30":[3,9,75],"31":[9,1,112],"32":[4,9,134],"33":[9,1,82],"34":[2,9,98],"35":[9,1,66],"36":[4,9,106],"37":[9,1,1],"38":[3,9,71],"39":[9,1,1],"40":[2,9,57],"41":[2,1,287],"42":[2,1,66],"43":[1,2,117],"44":[1,3,1],"45":[1,2,86],"46":[1,3,1],"47":[1,2,46],"48":[1,3,1],"49":[1,2,45],"50":[1,3,1],"51":[1,2,31],"52":[1,3,1],"53":[1,2,37],"54":[1,3,1],"55":[7,1,45],"56":[1,7,137],"57":[4,8,87],"58":[1,8,1],"59":[1,7,127],"60":[4,8,94],"61":[1,8,1],"62":[1,7,137],"63":[4,8,98],"64":[1,8,1],"65":[1,7,19],"66":[1,7,94],"67":[1,8,1],"68":[1,7,115],"69":[5,1,49],"70":[2,5,109],"71":[6,5,103],"72":[2,5,97],"73":[4,1,35],"74":[3,1,1],"75":[5,3,10],"76":[4,3,10],"77":[7,3,10],"78":[3,1,1],"79":[2,3,12],"80":[2,3,11],"81":[3,3,12],"82":[8,1,1],"83":[3,8,16],"84":[5,8,104],"85":[5,8,191],"86":[3,1,1],"87":[2,3,13],"88":[5,1,13],"89":[4,1,1],"90":[5,4,12],"91":[4,4,12],"92":[4,1,1],"93":[3,4,12],"94":[4,4,11],"95":[3,1,1],"96":[6,3,11],"97":[4,3,18],"98":[3,1,1],"99":[3,3,11],"100":[2,3,15],"101":[3,1,1],"102":[4,3,14],"103":[2,3,13],"104":[3,1,6],"105":[1,3,111],"106":[2,1,5],"107":[1,2,94],"108":[1,2,46],"109":[6,1,145],"110":[2,1,11],"111":[4,2,22],"112":[2,2,25],"113":[2,1,11],"114":[3,2,26],"115":[2,2,26],"116":[2,1,30],"117":[3,2,10],"118":[2,5,67],"119":[2,5,20],"120":[2,5,159],"121":[2,1,11],"122":[3,2,10],"123":[2,5,38],"124":[2,5,18],"125":[2,5,50],"126":[4,1,5],"127":[2,4,35],"128":[4,1,64],"129":[3,1,1],"130":[1,3,31],"131":[4,3,1],"132":[2,7,102],"133":[4,7,1],"134":[2,1,9],"135":[2,1,232],"136":[2,1,5],"137":[2,1,51],"138":[1,2,150],"139":[1,1,129],"140":[2,1,26],"141":[1,2,48],"142":[1,2,31],"143":[2,1,49],"144":[3,2,53],"145":[2,2,38],"146":[3,2,58],"147":[6,2,61],"148":[4,2,42],"149":[6,2,59],"150":[2,1,26],"151":[1,2,49],"152":[1,2,25],"153":[1,1,57],"154":[1,1,3],"155":[2,1,473],"156":[2,1,508]},"averageFieldLength":[2.9999999999999996,3.5031847133757967,65.35031847133757],"storedFields":{"0":{"title":"Public API","titles":[]},"1":{"title":"Introduction to basics constraint-based modeling tools","titles":[]},"2":{"title":"Terminology","titles":["Introduction to basics constraint-based modeling tools"]},"3":{"title":"Constraint","titles":["Introduction to basics constraint-based modeling tools","Terminology"]},"4":{"title":"Constraint Instantiation","titles":["Introduction to basics constraint-based modeling tools","Terminology"]},"5":{"title":"Configuration","titles":["Introduction to basics constraint-based modeling tools","Terminology"]},"6":{"title":"Constraint Satisfaction or Violation by a Configuration","titles":["Introduction to basics constraint-based modeling tools","Terminology"]},"7":{"title":"Domain-defined variables","titles":["Introduction to basics constraint-based modeling tools"]},"8":{"title":"A versatile constraints' API","titles":["Introduction to basics constraint-based modeling tools"]},"9":{"title":"A collection of models","titles":["Introduction to basics constraint-based modeling tools"]},"10":{"title":"Internal Aspects","titles":["Introduction to basics constraint-based modeling tools"]},"11":{"title":"Full API","titles":[]},"12":{"title":"Defining Variables and Exploring Domains","titles":[]},"13":{"title":"Implementing the AbstractDomain Interface","titles":["Defining Variables and Exploring Domains"]},"14":{"title":"Discrete Domains","titles":["Defining Variables and Exploring Domains"]},"15":{"title":"SetDomain","titles":["Defining Variables and Exploring Domains","Discrete Domains"]},"16":{"title":"RangeDomain","titles":["Defining Variables and Exploring Domains","Discrete Domains"]},"17":{"title":"Arbitrary Domains","titles":["Defining Variables and Exploring Domains","Discrete Domains"]},"18":{"title":"Continuous Domains","titles":["Defining Variables and Exploring Domains"]},"19":{"title":"Interacting with Constraints in Julia","titles":[]},"20":{"title":"Usual Constraints and Parameters","titles":["Interacting with Constraints in Julia"]},"21":{"title":"Concepts, Error Functions, and QUBO matrices","titles":["Interacting with Constraints in Julia"]},"22":{"title":"Generic Constraints","titles":[]},"23":{"title":"Intention Constraints","titles":["Generic Constraints"]},"24":{"title":"Defining an intention constraint in JC-API","titles":["Generic Constraints","Intention Constraints"]},"25":{"title":"APIs","titles":["Generic Constraints","Intention Constraints"]},"26":{"title":"Extension Constraints","titles":["Generic Constraints"]},"27":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"28":{"title":"Constraints defined from Languages","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"29":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"30":{"title":"Comparison-based Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"31":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"32":{"title":"Counting and Summing Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"33":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"34":{"title":"Connection Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"35":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"36":{"title":"Packing and Scheduling Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"37":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"38":{"title":"Constraints on Graphs","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"39":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"40":{"title":"Elementary Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"41":{"title":"ConstraintModels.jl","titles":[]},"42":{"title":"ConstraintCommons.jl","titles":[]},"43":{"title":"Parameters","titles":["ConstraintCommons.jl"]},"44":{"title":"Performances","titles":["ConstraintCommons.jl","Parameters"]},"45":{"title":"Languages","titles":["ConstraintCommons.jl"]},"46":{"title":"Performances","titles":["ConstraintCommons.jl","Languages"]},"47":{"title":"Extensions","titles":["ConstraintCommons.jl"]},"48":{"title":"Performances","titles":["ConstraintCommons.jl","Extensions"]},"49":{"title":"Sampling","titles":["ConstraintCommons.jl"]},"50":{"title":"Performances","titles":["ConstraintCommons.jl","Sampling"]},"51":{"title":"Extrema","titles":["ConstraintCommons.jl"]},"52":{"title":"Performances","titles":["ConstraintCommons.jl","Extrema"]},"53":{"title":"Dictionaries","titles":["ConstraintCommons.jl"]},"54":{"title":"Performances","titles":["ConstraintCommons.jl","Dictionaries"]},"55":{"title":"ConstraintDomains.jl: Defining Variables and Exploring Domains","titles":[]},"56":{"title":"Commons","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains"]},"57":{"title":"Extension to Base module","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Commons"]},"58":{"title":"Performances","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Commons"]},"59":{"title":"Continuous","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains"]},"60":{"title":"Extension to Base module","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Continuous"]},"61":{"title":"Performances","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Continuous"]},"62":{"title":"Discrete","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains"]},"63":{"title":"Extension to Base module","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Discrete"]},"64":{"title":"Performances","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Discrete"]},"65":{"title":"General","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains"]},"66":{"title":"Exploration","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains"]},"67":{"title":"Performances","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Exploration"]},"68":{"title":"Parameters","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains"]},"69":{"title":"Interacting with Constraints in Julia","titles":[]},"70":{"title":"Usual Parameters","titles":["Interacting with Constraints in Julia"]},"71":{"title":"Concepts, Error Functions, and QUBO matrices","titles":["Interacting with Constraints in Julia"]},"72":{"title":"Usual Constraints","titles":["Interacting with Constraints in Julia"]},"73":{"title":"Welcome to Julia Constraints","titles":[]},"74":{"title":"Constraint Programming 101","titles":[]},"75":{"title":"What is Constraint Programming?","titles":["Constraint Programming 101"]},"76":{"title":"Basic Concepts and Terminology","titles":["Constraint Programming 101"]},"77":{"title":"How CP differs from other optimization techniques","titles":["Constraint Programming 101"]},"78":{"title":"Dive into Optimization","titles":[]},"79":{"title":"Understanding Optimization","titles":["Dive into Optimization"]},"80":{"title":"Metaheuristics Overview","titles":["Dive into Optimization"]},"81":{"title":"Mathematical Programming Basics","titles":["Dive into Optimization"]},"82":{"title":"Getting Started with Julia for CP and Optimization","titles":[]},"83":{"title":"Why Julia?","titles":["Getting Started with Julia for CP and Optimization"]},"84":{"title":"Setting Up Your Julia Environment","titles":["Getting Started with Julia for CP and Optimization"]},"85":{"title":"Your First Julia CP Model","titles":["Getting Started with Julia for CP and Optimization"]},"86":{"title":"Exploring JuliaConstraint Packages","titles":[]},"87":{"title":"Package Overviews","titles":["Exploring JuliaConstraint Packages"]},"88":{"title":"Installation and Getting Started Guides","titles":[]},"89":{"title":"Advanced Constraint Programming Techniques","titles":[]},"90":{"title":"Global Constraints and Their Uses","titles":["Advanced Constraint Programming Techniques"]},"91":{"title":"Search Strategies and Optimization","titles":["Advanced Constraint Programming Techniques"]},"92":{"title":"Building and Analyzing Models","titles":[]},"93":{"title":"Modeling Best Practices","titles":["Building and Analyzing Models"]},"94":{"title":"Performance Analysis and Improvement","titles":["Building and Analyzing Models"]},"95":{"title":"Applying Optimization Methods","titles":[]},"96":{"title":"Case Studies and Real-World Applications","titles":["Applying Optimization Methods"]},"97":{"title":"From Theory to Practice","titles":["Applying Optimization Methods"]},"98":{"title":"Tutorials and Experiments","titles":[]},"99":{"title":"Hands-On Tutorials","titles":["Tutorials and Experiments"]},"100":{"title":"Experimental Analysis","titles":["Tutorials and Experiments"]},"101":{"title":"Community and Contribution","titles":[]},"102":{"title":"Joining the JuliaConstraint Community","titles":["Community and Contribution"]},"103":{"title":"Future Directions","titles":["Community and Contribution"]},"104":{"title":"Learning about Constraints","titles":[]},"105":{"title":"Parameters","titles":["Learning about Constraints"]},"106":{"title":"CompositionalNetworks.jl","titles":[]},"107":{"title":"Utilities","titles":["CompositionalNetworks.jl"]},"108":{"title":"Metrics","titles":["CompositionalNetworks.jl"]},"109":{"title":"A layer structure for any ICN","titles":[]},"110":{"title":"Arithmetic Layer","titles":[]},"111":{"title":"List of arithmetic operations","titles":["Arithmetic Layer"]},"112":{"title":"Layer generation","titles":["Arithmetic Layer"]},"113":{"title":"Aggregation Layer","titles":[]},"114":{"title":"List of aggregations","titles":["Aggregation Layer"]},"115":{"title":"Layer generation","titles":["Aggregation Layer"]},"116":{"title":"Transformations Layer","titles":[]},"117":{"title":"List of transformations","titles":["Transformations Layer"]},"118":{"title":"Non-parametric","titles":["Transformations Layer","List of transformations"]},"119":{"title":"Param: :val","titles":["Transformations Layer","List of transformations"]},"120":{"title":"Layer generation","titles":["Transformations Layer","List of transformations"]},"121":{"title":"Comparison Layer","titles":[]},"122":{"title":"List of comparisons","titles":["Comparison Layer"]},"123":{"title":"Non-parametric","titles":["Comparison Layer","List of comparisons"]},"124":{"title":"Param: :val","titles":["Comparison Layer","List of comparisons"]},"125":{"title":"Layer generation","titles":["Comparison Layer","List of comparisons"]},"126":{"title":"Introduction to QUBOConstraints.jl","titles":[]},"127":{"title":"Basic features","titles":["Introduction to QUBOConstraints.jl"]},"128":{"title":"Encoding for QUBO programs","titles":[]},"129":{"title":"Learning QUBO matrices","titles":[]},"130":{"title":"Interface","titles":["Learning QUBO matrices"]},"131":{"title":"Examples with various optimizers","titles":["Learning QUBO matrices"]},"132":{"title":"Gradient Descent","titles":["Learning QUBO matrices","Examples with various optimizers"]},"133":{"title":"Constraint-based Local Search","titles":["Learning QUBO matrices","Examples with various optimizers"]},"134":{"title":"ConstraintsTranslator.jl","titles":[]},"135":{"title":"ConstraintLearning.jl","titles":[]},"136":{"title":"MetaStrategist.jl","titles":[]},"137":{"title":"PerfChecker.jl","titles":[]},"138":{"title":"Usage","titles":["PerfChecker.jl"]},"139":{"title":"Tutorial","titles":[]},"140":{"title":"BenchmarkTools Extension","titles":[]},"141":{"title":"Usage","titles":["BenchmarkTools Extension"]},"142":{"title":"Options","titles":["BenchmarkTools Extension"]},"143":{"title":"Extending PerfChecker","titles":[]},"144":{"title":"The Default Options","titles":["Extending PerfChecker"]},"145":{"title":"Package initialization","titles":["Extending PerfChecker"]},"146":{"title":"Preparatory Code:","titles":["Extending PerfChecker"]},"147":{"title":"Main Code to be Performance Tested","titles":["Extending PerfChecker"]},"148":{"title":"Post Performance Testing Code","titles":["Extending PerfChecker"]},"149":{"title":"Converting the result into a Table","titles":["Extending PerfChecker"]},"150":{"title":"Chairmarks Extension","titles":[]},"151":{"title":"Usage","titles":["Chairmarks Extension"]},"152":{"title":"Options","titles":["Chairmarks Extension"]},"153":{"title":"API","titles":[]},"154":{"title":"Solvers","titles":[]},"155":{"title":"CBLS.jl","titles":[]},"156":{"title":"LocalSearchSolvers.jl","titles":[]}},"dirtCount":0,"index":[["∅",{"2":{"155":1}}],["∩",{"2":{"155":1}}],["$d",{"2":{"147":1}}],["$block",{"2":{"146":1,"147":1}}],["$kwarg",{"2":{"139":1}}],["θ",{"2":{"132":2}}],["^2",{"2":{"132":1}}],["η",{"2":{"132":6,"135":1}}],["⋯",{"2":{"85":2}}],["×",{"2":{"85":3}}],["q",{"2":{"132":18,"135":7}}],["qap",{"2":{"41":1}}],["quite",{"2":{"85":1}}],["quadractic",{"2":{"41":1}}],["queens",{"2":{"41":4}}],["quote",{"2":{"145":1,"146":1,"147":1}}],["quot",{"2":{"11":10,"36":4,"85":6,"138":2,"146":2}}],["qubooptimizer",{"2":{"135":2}}],["qubogradientoptimizer",{"2":{"135":4}}],["qubo",{"0":{"21":1,"71":1,"128":1,"129":1},"1":{"130":1,"131":1,"132":1,"133":1},"2":{"0":2,"11":5,"21":1,"71":1,"127":4,"130":1,"135":4}}],["quboconstraints",{"0":{"126":1},"1":{"127":1},"2":{"0":5,"11":7,"19":1,"21":1,"71":1,"126":1,"127":2,"128":3,"130":2,"132":1,"135":1}}],["z",{"2":{"31":4,"33":4,"35":4}}],["zeros",{"2":{"132":3}}],["zero",{"2":{"11":11,"36":11,"41":1}}],["≥",{"2":{"29":1,"31":3,"132":1}}],["\\tzero",{"2":{"35":1}}],["\\theights",{"2":{"35":1}}],["\\tlengths",{"2":{"35":2}}],["\\tlist",{"2":{"29":1,"31":2,"33":2}}],["\\torigins",{"2":{"35":2}}],["\\toperator",{"2":{"29":1}}],["\\tcondition",{"2":{"33":1,"35":1}}],["\\tindex",{"2":{"33":1}}],["\\t\\toccurs",{"2":{"31":1}}],["\\t\\texcept",{"2":{"31":1}}],["\\t\\tvalues",{"2":{"31":2}}],["\\t\\tcondition",{"2":{"31":2,"33":1}}],["≠",{"2":{"24":1,"25":3,"26":3}}],["−x",{"2":{"24":2}}],["|the",{"2":{"24":1}}],["|≠|x",{"2":{"24":1}}],["|x",{"2":{"24":1}}],["||",{"2":{"11":2,"155":1}}],["`function",{"2":{"156":1}}],["`struct",{"2":{"156":1}}],["``",{"2":{"155":3}}],["`grid`",{"2":{"41":1}}],["`m`",{"2":{"41":1}}],["`",{"2":{"11":1,"28":1,"135":1}}],["`automaton`",{"2":{"11":1,"28":1}}],["`x`",{"2":{"11":2,"28":2}}],["+",{"2":{"11":9,"114":1,"141":1,"151":1}}],["∉",{"2":{"11":3,"155":2}}],[">",{"2":{"11":1,"25":4,"26":4,"29":3,"31":5,"33":4,"35":2,"38":1,"132":8,"155":2}}],["7",{"2":{"11":5,"32":2,"36":3,"41":3,"153":1}}],["≤6",{"2":{"35":1}}],["≤12",{"2":{"35":1}}],["≤1",{"2":{"33":1}}],["≤10",{"2":{"31":3}}],["≤5",{"2":{"29":2,"31":5,"33":6,"35":4}}],["≤2",{"2":{"29":1}}],["≤4",{"2":{"29":2,"31":4,"33":1}}],["≤",{"2":{"11":5,"16":2,"31":2,"35":3,"36":1,"57":4,"60":4,"63":4,"85":2}}],["63",{"2":{"18":1}}],["6",{"2":{"11":5,"29":1,"31":1,"34":1,"35":3,"36":3,"40":1,"41":2,"143":1,"153":1}}],["6+5=11",{"2":{"6":1}}],["69",{"2":{"0":1,"11":1,"15":3,"56":1,"59":1,"62":1}}],["yes",{"2":{"156":1}}],["yet",{"2":{"11":2,"41":1,"56":1,"59":1}}],["you",{"2":{"141":1,"151":1}}],["your",{"0":{"84":1,"85":1}}],["y=1",{"2":{"11":1}}],["y=5",{"2":{"6":1}}],["y=2",{"2":{"5":1,"6":1}}],["y",{"2":{"3":1,"5":1,"23":2,"25":18,"26":19,"29":4,"31":6,"33":4,"35":4,"132":7,"135":4,"156":2}}],["σ",{"2":{"0":2,"11":2,"127":2}}],["gc=d",{"2":{"147":1}}],["gc",{"2":{"144":1,"147":1,"149":1,"152":1}}],["gcsample",{"2":{"142":2}}],["gctrial",{"2":{"142":2}}],["gctimes",{"2":{"139":1,"149":3}}],["gcc",{"2":{"11":3,"32":3}}],["giving",{"2":{"138":1}}],["gives",{"2":{"29":2,"33":1}}],["give",{"2":{"0":1,"11":1}}],["given",{"2":{"0":7,"4":1,"6":2,"11":18,"21":1,"28":2,"32":7,"41":2,"71":1,"109":2,"127":1,"128":1,"135":6,"138":1,"155":6}}],["guide",{"2":{"97":1,"139":1}}],["guides",{"0":{"88":1}}],["game",{"2":{"85":1}}],["good",{"2":{"143":1}}],["goes",{"2":{"138":2,"141":1,"151":1}}],["goal",{"2":{"41":1}}],["golomb",{"2":{"11":1,"24":2,"41":2,"155":1}}],["gt",{"2":{"24":1,"105":1,"134":1,"138":6}}],["g",{"2":{"11":15,"41":1,"79":1,"118":8,"119":1,"120":3}}],["grads",{"2":{"132":2}}],["gradientdescentoptimizer",{"2":{"132":5}}],["gradient",{"0":{"132":1},"2":{"132":1,"135":1}}],["graphs",{"0":{"38":1}}],["graph",{"2":{"11":1,"28":1,"41":4,"155":1,"156":1}}],["grid",{"2":{"41":5,"85":3}}],["greater",{"2":{"11":12,"118":7,"120":3}}],["global",{"0":{"90":1},"2":{"0":5,"11":36,"30":7,"32":4,"34":6,"36":6,"38":2,"40":2,"85":1,"90":1,"135":2,"155":15}}],["generic",{"0":{"22":1},"1":{"23":1,"24":1,"25":1,"26":1},"2":{"4":2,"8":1,"11":1,"22":1,"42":1,"155":1,"156":2}}],["generalstate",{"2":{"156":2}}],["generally",{"2":{"41":1}}],["general",{"0":{"65":1},"2":{"2":1,"156":1}}],["generating",{"2":{"13":1}}],["generation",{"0":{"112":1,"115":1,"120":1,"125":1},"2":{"0":2,"11":2}}],["generated",{"2":{"0":1,"11":18,"21":1,"71":1,"118":8}}],["generates",{"2":{"0":1,"11":5,"68":1,"105":1,"109":2,"120":1}}],["generate",{"2":{"0":7,"11":26,"68":10,"105":2,"107":2,"109":4,"112":1,"115":1,"120":2,"125":1,"135":2}}],["genetic",{"2":{"0":4,"11":4,"80":1,"135":3}}],["getting",{"0":{"82":1,"88":1},"1":{"83":1,"84":1,"85":1},"2":{"88":1}}],["get",{"2":{"0":1,"11":5,"41":2,"56":1,"85":1,"120":2,"153":2,"155":6,"156":17}}],["joinpath",{"2":{"139":3}}],["join",{"2":{"102":1}}],["joining",{"0":{"102":1}}],["j+1",{"2":{"85":1}}],["j",{"2":{"85":1}}],["just",{"2":{"146":1}}],["jumpcbls",{"2":{"15":1,"16":1,"18":1}}],["jump",{"2":{"1":1,"12":1,"15":2,"16":2,"23":1,"25":2,"26":1,"29":9,"31":12,"33":11,"35":6,"41":17,"55":1,"84":3,"85":2,"155":10,"156":1}}],["juliajump",{"2":{"155":3}}],["juliajulia>",{"2":{"141":1,"151":1,"153":1}}],["julia>",{"2":{"141":1,"151":1}}],["juliapost",{"2":{"156":1}}],["juliaperfchecker",{"2":{"145":1,"146":1,"148":1}}],["juliapredicate",{"2":{"155":1}}],["juliapredict",{"2":{"135":1}}],["juliapreliminaries",{"2":{"135":1}}],["juliaparameter",{"2":{"135":1}}],["juliaparams",{"2":{"0":1,"11":1}}],["juliapairvarsparameterdomain",{"2":{"11":1,"68":1}}],["juliaup",{"2":{"84":1}}],["juliausing",{"2":{"15":3,"16":1,"18":1,"25":3,"26":3,"29":9,"31":12,"33":12,"35":6,"84":2,"139":1}}],["juliausual",{"2":{"0":2,"11":3,"20":1,"72":1}}],["juliavariable",{"2":{"156":3}}],["juliavar",{"2":{"57":1,"60":1,"63":1,"156":1}}],["juliavalue",{"2":{"85":1}}],["juliavalsparameterdomain",{"2":{"11":1,"68":1}}],["juliavalparameterdomain",{"2":{"11":1,"68":1}}],["juliax",{"2":{"57":1,"60":1,"63":1,"156":1}}],["juliaxcsp",{"2":{"11":19,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1}}],["juliaqap",{"2":{"41":1}}],["juliaqubogradientoptimizer",{"2":{"135":1}}],["juliaqubo",{"2":{"0":1,"11":2,"127":2,"135":1}}],["juliano",{"2":{"135":1}}],["julian",{"2":{"41":1}}],["julianbits",{"2":{"0":1,"11":2,"109":1}}],["juliagolomb",{"2":{"41":1}}],["juliageneralstate",{"2":{"156":1}}],["juliagenerate",{"2":{"0":1,"11":5,"68":1,"105":1,"109":2,"135":1}}],["juliaget",{"2":{"0":1,"11":1,"56":1,"156":12}}],["juliafunction",{"2":{"144":1,"147":1,"149":1}}],["juliafunctions",{"2":{"11":1,"109":1}}],["juliafor",{"2":{"85":2}}],["juliafake",{"2":{"11":1,"68":1}}],["juliafakeautomaton",{"2":{"11":1,"68":1}}],["juliachemical",{"2":{"41":1}}],["juliac",{"2":{"11":18,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1}}],["juliaco",{"2":{"11":9,"123":1}}],["juliacompose",{"2":{"0":2,"11":2}}],["juliacompositionalnetworks",{"2":{"135":2}}],["juliacomposition",{"2":{"0":3,"11":3}}],["juliacomparison",{"2":{"0":1,"11":1,"125":1}}],["juliacode",{"2":{"0":1,"11":1}}],["juliaconcept",{"2":{"0":3,"11":37,"21":3,"28":2,"30":7,"32":9,"34":4,"36":4,"38":1,"40":1,"71":3}}],["juliaconstriction",{"2":{"156":1}}],["juliaconstraintcommons",{"2":{"11":1,"45":1,"68":1,"105":1}}],["juliaconstraints",{"2":{"0":4,"11":4,"20":4,"72":4}}],["juliaconstraint",{"0":{"86":1,"102":1},"1":{"87":1},"2":{"0":1,"11":1,"73":1,"87":1,"103":1,"156":3}}],["juliaconst",{"2":{"11":2,"20":2,"24":1,"43":2,"70":2,"135":2}}],["juliaconsisempty",{"2":{"0":1,"11":1,"47":1}}],["juliaconsin",{"2":{"0":1,"11":1,"47":1}}],["juliacontinuousdomain",{"2":{"0":1,"11":1,"59":1}}],["juliao",{"2":{"156":1}}],["juliaobjective",{"2":{"156":4}}],["juliaoptions",{"2":{"156":1}}],["juliaoptimizer",{"2":{"155":2}}],["juliaoptimize",{"2":{"85":1,"135":1}}],["juliaopparameterdomain",{"2":{"11":1,"68":1}}],["juliaoversample",{"2":{"0":1,"11":1,"49":1}}],["juliaboolparameterdomain",{"2":{"11":1,"68":1}}],["juliabinarize",{"2":{"0":1,"11":1,"128":1}}],["juliabase",{"2":{"0":1,"11":17,"41":4,"57":13,"59":1,"60":12,"62":1,"63":13,"65":2,"68":4,"105":4,"155":5}}],["juliaweights",{"2":{"0":3,"11":3}}],["juliatr",{"2":{"11":19,"118":9}}],["juliatrain",{"2":{"0":1,"11":1,"130":1,"135":2}}],["juliatransformation",{"2":{"0":1,"11":1,"120":1}}],["juliato",{"2":{"0":1,"11":1,"56":1}}],["juliaremote",{"2":{"156":2}}],["juliareduce",{"2":{"11":1,"107":1}}],["juliaregularization",{"2":{"0":1,"11":1}}],["juliarangedomain",{"2":{"0":1,"11":1,"62":1}}],["julialoss",{"2":{"135":1}}],["julialeadsolver",{"2":{"156":1}}],["julialearn",{"2":{"0":1,"11":1}}],["julialength",{"2":{"11":1,"60":1,"63":1,"109":1,"156":5}}],["julialayers",{"2":{"11":1}}],["julialayer",{"2":{"11":1,"109":1}}],["julialanguageparameterdomain",{"2":{"11":1,"68":1}}],["julialazy",{"2":{"0":2,"11":2,"107":2}}],["juliahamming",{"2":{"0":1,"11":1,"108":1}}],["juliaidparameterdomain",{"2":{"11":1,"68":1}}],["juliais",{"2":{"0":1,"11":2,"109":1,"128":1,"156":2}}],["juliaicnlocalsearchoptimizer",{"2":{"135":1}}],["juliaicngeneticoptimizer",{"2":{"135":1}}],["juliaicnconfig",{"2":{"135":1}}],["juliaicn",{"2":{"0":1,"11":1,"135":1}}],["juliaintention",{"2":{"155":1}}],["juliaintervals",{"2":{"11":1,"59":1}}],["juliaintersect",{"2":{"0":1,"11":2,"59":2,"62":1}}],["juliaincsert",{"2":{"0":1,"11":1,"53":1}}],["juliaempty",{"2":{"156":2}}],["juliaemptydomain",{"2":{"11":1,"56":1}}],["juliae",{"2":{"11":1}}],["juliaerror",{"2":{"0":1,"11":1,"21":1,"71":1,"155":1}}],["juliaexclu",{"2":{"11":1,"109":1}}],["juliaexplore",{"2":{"0":2,"11":2,"66":1}}],["juliaexploresettings",{"2":{"0":1,"11":1,"66":1}}],["juliaextract",{"2":{"0":3,"11":3,"43":3}}],["juliamodel",{"2":{"156":1}}],["juliamoi",{"2":{"155":17}}],["juliamoisupports",{"2":{"155":1}}],["juliamoisum",{"2":{"155":1}}],["juliamoiregular",{"2":{"155":1}}],["juliamoiordered",{"2":{"155":1}}],["juliamoinooverlap",{"2":{"155":1}}],["juliamoinvalues",{"2":{"155":1}}],["juliamoimultivalueddecisiondiagram",{"2":{"155":1}}],["juliamoiminimum",{"2":{"155":1}}],["juliamoimaximum",{"2":{"155":1}}],["juliamoiintention",{"2":{"155":1}}],["juliamoiinstantiation",{"2":{"155":1}}],["juliamoiextension",{"2":{"155":1}}],["juliamoierror",{"2":{"155":1}}],["juliamoielement",{"2":{"155":1}}],["juliamoidistdifferent",{"2":{"155":1}}],["juliamoicumulative",{"2":{"155":1}}],["juliamoiconflicts",{"2":{"155":1}}],["juliamoiallequal",{"2":{"155":1}}],["juliamoialldifferent",{"2":{"155":1}}],["juliamts",{"2":{"156":1}}],["juliamutually",{"2":{"135":1}}],["juliamutable",{"2":{"41":1}}],["juliam",{"2":{"85":1}}],["juliamincut",{"2":{"41":1}}],["juliaminkowski",{"2":{"0":1,"11":1,"108":1}}],["juliamax",{"2":{"156":1}}],["juliamainsolver",{"2":{"156":1}}],["juliamagic",{"2":{"41":1}}],["juliamap",{"2":{"11":1,"107":1}}],["juliamake",{"2":{"11":2,"120":1,"135":3}}],["juliamanhattan",{"2":{"0":1,"11":1,"108":1}}],["juliamerge",{"2":{"0":1,"11":1,"59":1,"62":1}}],["juliamdd",{"2":{"0":1,"11":1,"45":1}}],["juliad",{"2":{"156":1}}],["juliadraw",{"2":{"156":1}}],["juliadist",{"2":{"156":1}}],["juliadiscreteset",{"2":{"155":1}}],["juliadiscretedomain",{"2":{"0":1,"11":1,"62":1}}],["juliadisplay",{"2":{"41":1}}],["juliadimparameterdomain",{"2":{"11":1,"68":1}}],["juliadelete",{"2":{"156":2}}],["juliadebinarize",{"2":{"0":1,"11":1,"128":1}}],["juliadescribe",{"2":{"0":2,"11":2,"20":2,"72":2,"156":1}}],["juliad1",{"2":{"0":1,"11":1,"56":1,"59":1,"62":1}}],["juliadomain",{"2":{"0":6,"11":6,"56":6,"59":6,"62":6,"135":1,"156":1}}],["juliastop",{"2":{"156":1}}],["juliastatus",{"2":{"156":1}}],["juliastruct",{"2":{"0":1,"11":1,"132":1,"135":1}}],["juliaspecialize",{"2":{"156":2}}],["juliasolve",{"2":{"156":2}}],["juliasolution",{"2":{"156":1}}],["juliascalarfunction",{"2":{"155":1}}],["juliasub",{"2":{"135":1}}],["juliasudoku",{"2":{"41":1}}],["juliasudokuinstance",{"2":{"41":2}}],["juliaselected",{"2":{"11":1,"109":1}}],["juliasetdomain",{"2":{"0":1,"11":1,"62":1}}],["juliashrink",{"2":{"11":1}}],["juliashow",{"2":{"0":1,"11":2,"109":1}}],["juliasymbol",{"2":{"11":1,"109":1}}],["juliasymbols",{"2":{"0":1,"11":1}}],["juliasymmetries",{"2":{"0":1,"11":1}}],["juliasymcon",{"2":{"0":1,"11":1,"47":1}}],["julia",{"0":{"19":1,"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1,"69":1,"73":1,"82":1,"83":1,"84":1,"85":1},"1":{"20":1,"21":1,"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1,"70":1,"71":1,"72":1,"83":1,"84":1,"85":1},"2":{"0":5,"1":3,"8":1,"10":1,"11":13,"12":1,"16":3,"18":3,"20":3,"25":1,"26":1,"29":3,"31":4,"33":4,"35":2,"41":5,"42":2,"45":2,"55":1,"62":1,"66":1,"69":1,"70":2,"72":1,"83":1,"84":7,"85":5,"118":1,"120":1,"123":1,"135":1,"138":3,"142":1,"143":1,"152":1,"155":17,"156":83}}],["juliaδ",{"2":{"0":1,"11":1,"51":1,"135":1}}],["juliaas",{"2":{"11":2,"107":2}}],["juliaag",{"2":{"11":2,"114":2}}],["juliaaggregation",{"2":{"0":1,"11":1,"115":1}}],["juliaat",{"2":{"11":1,"45":1}}],["juliaabstractsolver",{"2":{"156":1}}],["juliaabstractoptimizer",{"2":{"11":1,"130":1}}],["juliaabstractmultivalueddecisiondiagram",{"2":{"11":1,"45":1}}],["juliaabstractautomaton",{"2":{"11":1,"45":1}}],["juliaabstractdomain",{"2":{"0":1,"11":1,"13":1,"56":1}}],["juliaar",{"2":{"11":2,"111":2}}],["juliaarbitrarydomain",{"2":{"11":1,"62":1}}],["juliaarithmetic",{"2":{"0":1,"11":1,"112":1}}],["juliaargs",{"2":{"0":1,"11":1}}],["juliaadd",{"2":{"0":1,"11":1,"62":1,"156":2}}],["juliaaccept",{"2":{"0":1,"11":1,"45":1,"68":1,"105":1}}],["juliaautomaton",{"2":{"0":1,"11":1,"45":1}}],["jc",{"0":{"24":1},"2":{"1":1,"15":1,"16":1,"18":1,"20":1,"23":1,"25":2,"26":1,"29":3,"31":4,"33":4,"35":2,"70":1}}],["jl",{"0":{"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1,"41":1,"42":1,"55":1,"106":1,"126":1,"134":1,"135":1,"136":1,"137":1,"155":1,"156":1},"1":{"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"107":1,"108":1,"127":1,"138":1},"2":{"0":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"19":1,"20":1,"21":2,"23":1,"24":1,"25":1,"41":1,"42":1,"55":1,"69":1,"71":2,"72":1,"84":3,"106":1,"109":1,"126":1,"134":1,"135":1,"136":1,"137":2,"138":1,"139":4,"140":2,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":2,"153":1,"155":2,"156":2}}],["kwarg",{"2":{"139":2}}],["keep",{"2":{"11":1,"127":1}}],["key",{"2":{"11":2,"76":1,"146":1,"147":1}}],["keywords",{"2":{"0":1,"11":2,"20":1,"43":1,"70":1}}],["keyword",{"2":{"0":1,"11":9,"20":2,"21":1,"70":2,"71":1,"143":1,"156":1}}],["k",{"2":{"11":2,"111":2,"156":1}}],["known",{"2":{"0":2,"5":1,"11":5,"32":3,"41":1,"156":1}}],["kind=",{"2":{"156":1}}],["kinds",{"2":{"14":1,"45":1}}],["kind",{"2":{"0":1,"11":3,"20":1,"43":1,"51":1,"66":1,"68":1,"70":1,"105":1,"156":6}}],["kargs",{"2":{"0":5,"11":7,"21":4,"43":1,"71":4,"135":6}}],["heuristic",{"2":{"85":1}}],["heavily",{"2":{"20":1,"70":1,"116":1}}],["heavy",{"2":{"19":1,"69":1}}],["here",{"2":{"11":1,"25":1,"138":2,"139":1,"141":1,"146":2,"147":1,"148":1,"151":1,"153":1,"155":1}}],["heights",{"2":{"11":5,"36":5,"155":1}}],["hide",{"2":{"11":2}}],["highly",{"2":{"109":1}}],["highlighting",{"2":{"83":1,"102":1}}],["highlight",{"2":{"73":1}}],["higher",{"2":{"23":1,"25":1}}],["highest",{"2":{"0":1,"11":1,"56":1,"59":1,"62":1,"156":1}}],["high",{"2":{"1":1}}],["host",{"2":{"84":1}}],["how",{"0":{"77":1},"2":{"21":1,"23":1,"24":1,"29":3,"31":4,"33":4,"35":2,"71":1,"90":1,"94":1,"100":1,"102":1,"117":1,"122":1}}],["however",{"2":{"6":1,"10":1,"85":1}}],["hold",{"2":{"11":4,"34":4,"135":1}}],["hot",{"2":{"0":3,"11":3,"128":3,"132":1}}],["hardware",{"2":{"84":1}}],["hands",{"0":{"99":1}}],["hand",{"2":{"21":1,"71":1}}],["handled",{"2":{"11":1,"59":1}}],["handle",{"2":{"11":1,"29":3,"31":4,"33":4,"35":2,"56":1,"156":2}}],["have",{"2":{"0":4,"4":1,"11":6,"20":1,"41":1,"70":1,"84":1,"96":1,"107":2,"155":1}}],["hamming",{"2":{"0":4,"11":4,"108":2,"135":3}}],["has",{"2":{"0":2,"11":6,"14":1,"49":1,"85":1,"109":1,"128":1,"140":1,"143":1,"150":1,"156":10}}],["https",{"2":{"0":1,"11":1,"20":1,"72":1}}],["9×9",{"2":{"41":4}}],["9",{"2":{"0":1,"11":1,"29":2,"31":1,"41":4,"56":1,"59":1,"62":1,"85":7}}],["8",{"2":{"11":6,"29":1,"31":6,"32":5,"33":2,"36":1,"41":3}}],["86",{"2":{"0":1,"11":1,"56":1,"59":1,"62":1}}],["89",{"2":{"0":2,"11":2,"15":6,"56":2,"59":2,"62":2,"156":1}}],["42",{"2":{"0":1,"11":3,"15":3,"18":3,"32":2,"56":1,"59":1,"62":1}}],["4",{"2":{"0":1,"11":82,"15":3,"16":3,"24":2,"25":7,"26":10,"29":7,"30":12,"31":32,"32":14,"33":23,"34":15,"35":19,"36":18,"38":4,"40":4,"41":3,"56":1,"59":1,"62":1,"139":1,"153":1,"155":1,"156":1}}],["3j+1",{"2":{"85":1}}],["3i+1",{"2":{"85":1}}],["324",{"2":{"18":1}}],["3+2=5",{"2":{"6":1}}],["3",{"2":{"0":3,"11":125,"15":9,"16":3,"18":3,"21":1,"24":2,"25":6,"26":9,"29":10,"30":17,"31":47,"32":33,"33":21,"34":15,"35":27,"36":26,"38":6,"40":4,"41":6,"56":2,"59":2,"62":2,"71":1,"85":6,"139":1,"153":1,"155":1,"156":1}}],["39",{"0":{"8":1},"2":{"0":1,"11":6,"13":2,"56":1,"57":1,"60":1,"63":1,"84":1,"85":1,"105":11,"107":1,"108":1,"109":1,"118":2,"119":6,"123":4,"124":4,"125":1,"138":1,"147":1,"153":1,"156":4}}],["001",{"2":{"132":1}}],["00514",{"2":{"0":1,"11":1,"20":1,"72":1}}],["0≤z",{"2":{"33":2}}],["0≤x",{"2":{"29":1}}],["0≤y",{"2":{"29":1}}],["0",{"2":{"0":3,"5":1,"11":73,"15":3,"16":6,"21":1,"25":2,"26":2,"28":22,"29":1,"30":14,"31":12,"32":8,"33":1,"34":1,"38":1,"41":54,"56":1,"57":2,"59":1,"60":1,"62":1,"63":1,"71":1,"85":2,"132":1,"139":11,"153":8,"155":2,"156":9}}],["28",{"2":{"156":1}}],["225",{"2":{"11":1}}],["200",{"2":{"0":2,"11":2,"135":1}}],["2009",{"2":{"0":1,"11":1,"20":1,"72":1}}],["2",{"2":{"0":3,"11":146,"15":6,"18":4,"21":1,"24":2,"25":5,"26":8,"28":10,"29":10,"30":15,"31":68,"32":40,"33":26,"34":16,"35":33,"36":28,"38":3,"40":4,"41":5,"56":2,"59":2,"62":2,"71":1,"85":2,"139":8,"153":1,"155":3,"156":1}}],["56",{"2":{"156":1}}],["53",{"2":{"0":1,"11":1,"15":3,"56":1,"59":1,"62":1}}],["5",{"2":{"0":1,"11":75,"16":3,"29":3,"30":1,"31":32,"32":29,"33":12,"34":11,"35":22,"36":13,"40":3,"41":2,"56":1,"59":1,"62":1,"132":1,"138":1,"141":1,"151":1,"153":1,"155":1,"156":1}}],["ci",{"2":{"137":1,"155":3}}],["circuit",{"2":{"11":12,"38":12}}],["cn",{"2":{"85":1}}],["c=c1",{"2":{"85":1}}],["c=usual",{"2":{"0":2,"11":2,"20":2,"72":2}}],["classic",{"2":{"85":2}}],["closed",{"2":{"11":9,"18":1,"31":1,"32":9,"139":1}}],["c2",{"2":{"31":1,"139":2}}],["c1",{"2":{"31":1}}],["cblstodo",{"2":{"85":4}}],["cbls",{"0":{"155":1},"2":{"15":8,"16":4,"25":7,"26":7,"29":6,"31":8,"33":11,"35":4,"84":2,"85":3,"135":1,"155":49,"156":1}}],["certain",{"2":{"11":6,"34":4,"36":2,"155":2}}],["cc",{"2":{"11":2,"32":2}}],["creating",{"2":{"138":1}}],["creation",{"2":{"11":1,"120":1}}],["created",{"2":{"155":1,"156":1}}],["creates",{"2":{"11":1,"139":1}}],["create",{"2":{"0":2,"11":3,"41":3,"66":1,"155":3}}],["crucial",{"2":{"10":1}}],["csps",{"2":{"9":1}}],["cut",{"2":{"41":1,"156":1}}],["cumulative",{"2":{"11":9,"35":9,"36":9,"155":3}}],["customize",{"2":{"144":1}}],["custom",{"2":{"7":1,"138":4,"139":1,"145":1,"149":1}}],["currently",{"2":{"11":1,"25":1,"26":1,"57":2,"60":1,"63":1,"68":1,"105":1,"155":1}}],["current",{"2":{"0":1,"11":2,"109":1,"156":1}}],["cp",{"0":{"77":1,"82":1,"85":1},"1":{"83":1,"84":1,"85":1},"2":{"1":1,"7":1,"19":1,"69":1,"73":1,"75":1,"84":1,"85":2,"91":1,"93":1,"96":1,"100":1}}],["choose",{"2":{"156":1}}],["choice",{"2":{"84":1}}],["chosen",{"2":{"20":1,"70":1}}],["chemical",{"2":{"41":3}}],["checked",{"2":{"155":1}}],["checkout",{"2":{"138":1}}],["checkres",{"2":{"138":1,"139":2}}],["checking",{"2":{"13":1}}],["checks",{"2":{"11":6,"28":1,"155":1}}],["check",{"2":{"0":1,"11":27,"24":1,"28":2,"30":3,"32":7,"34":8,"36":1,"38":1,"40":2,"57":1,"60":1,"63":1,"85":1,"105":10,"107":1,"108":1,"109":2,"118":2,"119":6,"123":4,"124":4,"125":1,"128":1,"137":2,"138":1,"139":1,"141":1,"144":1,"147":3,"148":1,"151":1,"155":4,"156":10}}],["chair",{"2":{"139":2,"149":6}}],["chairmarks",{"0":{"150":1},"1":{"151":1,"152":1},"2":{"139":5,"143":1,"144":1,"145":2,"146":1,"147":1,"148":1,"149":2,"150":1,"151":1}}],["chairmark",{"2":{"138":1,"139":3,"144":1,"145":1,"146":1,"147":1,"148":1,"151":1}}],["challenge",{"2":{"105":1}}],["challenged",{"2":{"18":1}}],["chapter",{"2":{"12":1,"73":1}}],["change",{"2":{"41":2}}],["changes",{"2":{"0":1,"11":2,"41":1,"59":1,"62":1}}],["channel",{"2":{"11":9,"33":12,"34":9}}],["characteristics",{"2":{"8":1}}],["c",{"2":{"0":24,"11":116,"20":4,"21":8,"25":3,"26":3,"28":10,"29":9,"30":14,"31":11,"32":19,"33":12,"34":15,"35":6,"36":11,"38":4,"40":2,"57":1,"60":1,"63":1,"71":8,"72":4,"139":2,"156":31}}],["capacited",{"2":{"156":1}}],["capacity",{"2":{"156":1}}],["capacities",{"2":{"41":1}}],["cairomakie",{"2":{"139":1}}],["case",{"0":{"96":1},"2":{"138":1,"141":1,"145":1,"148":1,"149":1,"151":1}}],["cast",{"2":{"11":1,"85":1}}],["catch",{"2":{"132":1}}],["categorized",{"2":{"22":1}}],["catalog",{"2":{"9":1,"19":1,"69":1}}],["call",{"2":{"139":1}}],["called",{"2":{"11":1,"23":1,"26":1,"85":3,"156":2}}],["calls",{"2":{"11":2}}],["cardinalityclosed",{"2":{"31":1}}],["cardinalityopen",{"2":{"31":1}}],["cardinality",{"2":{"11":20,"31":9,"32":20}}],["care",{"2":{"0":1,"11":1,"20":1,"72":1}}],["cannot",{"2":{"18":1}}],["can",{"2":{"0":3,"3":1,"11":10,"12":1,"13":1,"20":2,"28":1,"32":3,"55":1,"56":1,"70":2,"73":1,"84":1,"85":3,"102":1,"109":5,"120":1,"128":1,"138":3,"141":1,"143":1,"144":1,"149":1,"151":1,"155":2,"156":1}}],["cosntriction",{"2":{"156":1}}],["cost",{"2":{"156":19}}],["costs",{"2":{"156":20}}],["copied",{"2":{"155":7}}],["copy",{"2":{"155":19}}],["covering",{"2":{"99":1}}],["cover",{"2":{"81":1}}],["covers",{"2":{"42":1}}],["collaborate",{"2":{"102":1}}],["collect",{"2":{"25":1,"26":1,"132":1,"139":4}}],["collections",{"2":{"0":1,"11":1,"51":2}}],["collection",{"0":{"9":1},"2":{"0":6,"9":1,"11":9,"20":1,"21":1,"23":1,"24":1,"25":1,"53":1,"57":2,"59":1,"60":1,"63":1,"66":3,"68":1,"70":1,"71":1,"85":4,"105":1,"108":1,"135":3,"155":1,"156":5}}],["columns",{"2":{"85":1}}],["column",{"2":{"85":1}}],["col",{"2":{"41":1}}],["coordinates",{"2":{"41":1}}],["coefficients",{"2":{"11":1,"32":1}}],["coeffs",{"2":{"11":2,"31":1,"32":2}}],["correspond",{"2":{"20":1,"70":1}}],["corresponding",{"2":{"11":1,"41":1,"120":1}}],["corresponds",{"2":{"11":2,"34":2}}],["correspondence",{"2":{"11":2,"34":2}}],["core",{"2":{"0":1,"8":2,"11":3,"14":1,"20":7,"22":1,"42":1,"43":3,"45":1,"70":5,"72":2}}],["co",{"2":{"11":11,"32":2,"123":5,"124":4}}],["couple",{"2":{"20":1,"72":1}}],["counting",{"0":{"32":1},"2":{"11":1,"120":1}}],["count",{"2":{"11":95,"31":9,"32":6,"114":3,"118":40,"119":4,"120":21,"155":4}}],["counter",{"2":{"0":2,"11":2,"53":2,"156":1}}],["could",{"2":{"5":1,"23":1,"26":1}}],["come",{"2":{"155":1}}],["commonly",{"2":{"138":1}}],["commons",{"0":{"56":1},"1":{"57":1,"58":1}}],["community",{"0":{"101":1,"102":1},"1":{"102":1,"103":1},"2":{"102":1}}],["communities",{"2":{"2":1}}],["command",{"2":{"84":1}}],["combinatorial",{"2":{"1":1,"75":1,"109":1}}],["computational",{"2":{"83":1}}],["computes",{"2":{"156":1}}],["computed",{"2":{"11":17,"118":8}}],["compute",{"2":{"0":4,"11":7,"41":1,"51":2,"59":2,"62":1,"108":1,"128":1,"135":1,"155":1,"156":17}}],["compile",{"2":{"11":1,"120":1}}],["compliance",{"2":{"11":2,"28":2,"155":1}}],["complexity",{"2":{"99":1}}],["complex",{"2":{"9":1,"26":1,"90":1}}],["completed",{"2":{"85":1}}],["completely",{"2":{"0":1,"11":1}}],["complete",{"2":{"0":7,"11":8,"66":4}}],["comprehensive",{"2":{"11":2,"155":1}}],["compare",{"2":{"11":2,"30":1,"155":2}}],["comparisons",{"0":{"122":1},"1":{"123":1,"124":1,"125":1},"2":{"11":2,"120":2,"125":1}}],["comparison",{"0":{"30":1,"121":1},"1":{"122":1,"123":1,"124":1,"125":1},"2":{"0":5,"11":10,"20":1,"30":1,"32":1,"43":1,"70":1,"120":1,"121":1,"122":1,"123":1,"125":2}}],["compatibility",{"2":{"8":1}}],["compounds",{"2":{"41":1}}],["components",{"2":{"0":2,"9":1,"10":1,"11":2,"107":2}}],["compose",{"2":{"0":8,"11":12,"85":1,"109":1}}],["composed",{"2":{"0":3,"11":3,"66":1}}],["compositions",{"2":{"11":1}}],["compositionalneworks",{"2":{"107":1}}],["compositionalnetworks",{"0":{"106":1},"1":{"107":1,"108":1},"2":{"0":26,"11":77,"19":1,"21":1,"71":1,"106":1,"107":6,"108":3,"109":10,"111":2,"112":1,"114":2,"115":1,"118":9,"120":2,"123":1,"125":1,"135":3}}],["compositional",{"2":{"0":1,"11":1,"109":1}}],["composition",{"2":{"0":21,"11":24,"107":1}}],["coded",{"2":{"21":1,"71":1}}],["code",{"0":{"146":1,"147":1,"148":1},"2":{"0":3,"1":1,"11":5,"84":1,"138":2,"139":1,"141":2,"146":3,"147":2,"148":1,"151":2}}],["conduct",{"2":{"100":1}}],["conditions",{"2":{"11":1,"120":1,"156":1}}],["condition",{"2":{"3":1,"11":31,"31":1,"32":15,"33":1,"34":13,"36":3,"155":6}}],["concentrations",{"2":{"41":2}}],["concepts",{"0":{"21":1,"71":1,"76":1},"2":{"76":1,"80":1}}],["concept",{"2":{"0":21,"11":96,"20":1,"21":9,"24":1,"25":2,"26":2,"28":4,"29":7,"30":10,"31":26,"32":15,"33":15,"34":8,"35":9,"36":6,"38":2,"40":2,"66":4,"71":9,"72":1,"155":2}}],["config",{"2":{"138":3,"144":1,"146":1,"147":1,"148":1}}],["configuring",{"2":{"155":1}}],["configurable",{"2":{"137":1}}],["configuration",{"0":{"5":1,"6":1},"2":{"0":2,"2":2,"5":2,"6":4,"11":8,"41":2,"135":4,"139":1,"146":1,"147":1,"155":6,"156":3}}],["configurations",{"2":{"0":2,"11":6,"49":1,"66":1,"135":1,"155":4,"156":1}}],["configure",{"2":{"0":2,"11":2,"66":2}}],["conflict",{"2":{"11":1,"155":1}}],["conflicted",{"2":{"11":3,"155":1}}],["conflicts",{"2":{"11":8,"155":4}}],["conflicts=nothing",{"2":{"11":1}}],["converting",{"0":{"149":1}}],["converted",{"2":{"148":1,"155":4}}],["convert",{"2":{"0":1,"11":7,"56":1,"65":3,"107":2,"109":1,"149":1,"155":2}}],["contribute",{"2":{"102":1}}],["contribution",{"0":{"101":1},"1":{"102":1,"103":1}}],["contributions",{"2":{"9":1}}],["contributing",{"2":{"10":1}}],["contrast",{"2":{"77":1}}],["content",{"2":{"73":1}}],["context",{"2":{"0":1,"11":1,"13":1,"56":1,"109":2}}],["containing",{"2":{"155":1,"156":1}}],["container",{"2":{"11":1,"109":1,"155":1}}],["contains",{"2":{"0":2,"11":4,"20":1,"72":1,"85":1,"109":1}}],["contiguous",{"2":{"11":12,"118":2,"120":4}}],["contiuous",{"2":{"0":1,"11":1,"59":1,"62":1}}],["continuousdomain",{"2":{"0":1,"11":2,"59":2}}],["continuous",{"0":{"18":1,"59":1},"1":{"60":1,"61":1},"2":{"0":3,"7":1,"11":3,"12":1,"13":1,"18":1,"41":1,"55":1,"56":2,"59":2,"62":1}}],["connection",{"0":{"34":1}}],["connecting",{"2":{"0":1,"11":1,"47":1}}],["connector",{"2":{"0":1,"11":1,"47":1}}],["cons=dictionary",{"2":{"156":1}}],["cons",{"2":{"156":31}}],["consecutive",{"2":{"16":1}}],["constant",{"2":{"0":2,"11":3,"20":2,"43":1,"70":1,"72":1}}],["constriction",{"2":{"156":4}}],["constrains",{"2":{"156":1}}],["constrained",{"2":{"155":2,"156":2}}],["constraintlearning",{"0":{"135":1},"2":{"19":1,"135":27,"153":1}}],["constraintmodels",{"0":{"41":1},"2":{"9":1,"41":14}}],["constraintstranslator",{"0":{"134":1},"2":{"134":2}}],["constraints",{"0":{"8":1,"19":1,"20":1,"22":1,"23":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"69":1,"72":1,"73":1,"90":1,"104":1},"1":{"20":1,"21":1,"23":1,"24":2,"25":2,"26":1,"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1,"70":1,"71":1,"72":1,"105":1},"2":{"0":40,"1":2,"8":3,"10":1,"11":75,"12":2,"18":1,"19":3,"20":34,"21":4,"22":2,"23":3,"24":3,"25":4,"26":4,"28":2,"29":9,"30":3,"31":12,"32":4,"33":12,"34":4,"35":6,"36":2,"38":1,"40":1,"42":1,"43":9,"45":3,"55":2,"69":4,"70":8,"71":4,"72":26,"76":1,"84":1,"85":2,"90":1,"104":1,"105":1,"130":1,"135":1,"155":1,"156":23}}],["constraintdomains",{"0":{"55":1},"1":{"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1},"2":{"0":19,"7":1,"11":35,"12":1,"13":2,"15":1,"16":1,"18":1,"55":1,"56":6,"59":8,"62":10,"66":3,"68":11,"105":1}}],["constraint",{"0":{"1":1,"3":1,"4":1,"6":1,"24":1,"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1,"74":1,"75":1,"89":1,"133":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1,"75":1,"76":1,"77":1,"90":1,"91":1},"2":{"0":38,"1":2,"2":5,"3":3,"4":5,"6":6,"8":1,"9":1,"11":155,"13":1,"14":1,"15":4,"16":2,"19":1,"20":11,"21":12,"23":5,"24":5,"25":8,"26":8,"28":6,"29":7,"30":7,"31":12,"32":20,"33":9,"34":24,"35":6,"36":20,"38":7,"40":7,"42":1,"43":9,"49":1,"55":1,"57":3,"60":3,"63":3,"66":1,"69":1,"70":3,"71":12,"72":8,"73":1,"85":7,"109":1,"120":3,"127":1,"135":4,"155":66,"156":33}}],["constraintcommons",{"0":{"42":1},"1":{"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1},"2":{"0":12,"10":1,"11":18,"20":1,"42":1,"43":3,"45":6,"47":3,"49":1,"51":1,"53":1,"68":2,"70":1,"105":1,"155":2}}],["constructor",{"2":{"17":1,"41":1,"135":3,"156":1}}],["constructing",{"2":{"9":1,"41":1}}],["construct",{"2":{"0":5,"11":6,"41":3,"56":3,"59":3,"62":3,"68":1,"156":3}}],["considers",{"2":{"45":1}}],["considered",{"2":{"11":2,"32":2,"156":1}}],["consider",{"2":{"3":1}}],["consistent",{"2":{"2":1,"11":1}}],["consisempty",{"2":{"0":1,"11":1,"47":1}}],["consin",{"2":{"0":1,"11":1,"47":1}}],["lst",{"2":{"156":5}}],["ls",{"2":{"155":1}}],["l=n²",{"2":{"41":1}}],["l",{"2":{"11":15,"41":1,"118":4,"119":1,"120":3,"149":5,"155":2}}],["load",{"2":{"145":1}}],["loss",{"2":{"132":2,"135":2}}],["loggingextra",{"2":{"156":1}}],["logging",{"2":{"156":1}}],["log",{"2":{"105":10,"107":1,"108":1,"109":1,"118":2,"119":6,"123":4,"124":4,"125":1,"156":1}}],["logical",{"2":{"23":1}}],["logic",{"2":{"11":2,"155":1}}],["loop",{"2":{"156":8}}],["loops",{"2":{"11":3,"38":2}}],["looks",{"2":{"138":1,"139":1,"144":1,"145":1,"147":1}}],["look",{"2":{"84":1,"85":1}}],["locations",{"2":{"41":5}}],["localsearchsolverscblstodo",{"2":{"84":1}}],["localsearchsolvers",{"0":{"156":1},"2":{"84":2,"135":1,"155":1,"156":141}}],["local",{"0":{"133":1},"2":{"0":5,"11":5,"109":1,"135":1,"138":1,"155":1,"156":7}}],["lower",{"2":{"0":1,"11":1}}],["lowest",{"2":{"0":1,"11":1,"56":1,"59":1,"62":1}}],["launch",{"2":{"156":1}}],["large",{"2":{"85":1}}],["labels",{"2":{"11":2,"28":2,"155":2}}],["labeled",{"2":{"11":2,"28":2,"155":2}}],["last",{"2":{"11":1,"28":1,"85":1,"138":5,"153":2,"155":1,"156":1}}],["lazy",{"2":{"0":2,"11":2,"107":2,"116":2}}],["lang",{"2":{"0":1,"11":3}}],["languages",{"0":{"28":1,"45":1},"1":{"46":1},"2":{"11":1,"23":1,"42":1,"45":1,"68":1}}],["languageparameterdomain",{"2":{"11":1,"68":1,"105":1}}],["language=",{"2":{"0":1,"11":1}}],["language",{"2":{"0":5,"11":25,"20":2,"25":1,"28":17,"43":2,"70":2,"84":3,"155":4}}],["lang=",{"2":{"0":1,"11":1}}],["layered",{"2":{"0":1,"11":1}}],["layers",{"2":{"0":4,"11":9,"120":1}}],["layer",{"0":{"109":1,"110":1,"112":1,"113":1,"115":1,"116":1,"120":1,"121":1,"125":1},"1":{"111":1,"112":1,"114":1,"115":1,"117":1,"118":1,"119":1,"120":1,"122":1,"123":1,"124":1,"125":1},"2":{"0":16,"11":42,"42":1,"60":2,"63":2,"109":28,"110":1,"112":3,"113":1,"115":3,"116":1,"120":3,"121":1,"123":1,"125":3,"135":4}}],["let",{"2":{"85":1}}],["left",{"2":{"11":18,"118":10,"120":3}}],["leadsolvers",{"2":{"156":3}}],["leadsolver",{"2":{"156":1}}],["least",{"2":{"11":4,"18":1,"31":6,"32":4,"135":2,"155":1}}],["learning",{"0":{"104":1,"129":1},"1":{"105":1,"130":1,"131":1,"132":1,"133":1},"2":{"0":2,"8":1,"11":3,"12":1,"19":1,"42":1,"49":1,"55":2,"69":1,"104":1,"105":1,"109":2,"135":1}}],["learn",{"2":{"0":6,"11":7,"73":1,"109":1,"130":1,"135":5}}],["learned",{"2":{"0":1,"11":1,"19":1,"69":1,"135":1}}],["leverage",{"2":{"8":1}}],["levels",{"2":{"99":1}}],["level",{"2":{"1":1,"11":3,"23":1,"25":1,"28":3,"156":9}}],["lesser",{"2":{"11":11,"118":6,"120":3}}],["less",{"2":{"6":1,"23":1,"85":1,"155":1}}],["lengths",{"2":{"11":9,"30":3,"36":6}}],["length",{"2":{"0":6,"11":23,"13":2,"36":3,"56":2,"57":1,"59":1,"60":6,"62":1,"63":6,"109":2,"111":2,"132":4,"149":1,"156":12}}],["liking",{"2":{"144":1}}],["like",{"2":{"77":1,"80":1,"138":2,"139":1,"141":1,"144":1,"145":1,"147":1,"151":1}}],["likely",{"2":{"42":1}}],["links",{"2":{"41":1,"140":1,"150":1,"156":1}}],["line",{"2":{"41":9,"84":1}}],["linear",{"2":{"0":3,"11":3,"77":1,"79":1,"127":3}}],["lies",{"2":{"20":1,"70":1}}],["littledict",{"2":{"11":2,"109":2,"120":1}}],["listing",{"2":{"26":1}}],["listed",{"2":{"11":2,"155":3}}],["list=x",{"2":{"0":1,"11":2,"20":1,"72":1}}],["list",{"0":{"111":1,"114":1,"117":1,"122":1},"1":{"118":1,"119":1,"120":1,"123":1,"124":1,"125":1},"2":{"0":3,"11":92,"20":4,"24":1,"25":1,"26":1,"28":8,"29":2,"30":13,"31":2,"32":24,"33":2,"34":16,"36":5,"38":5,"40":6,"43":5,"62":1,"63":1,"70":4,"117":1,"122":1,"138":2,"155":1,"156":11}}],["limit",{"2":{"0":8,"11":10,"36":2,"66":6,"155":1,"156":10}}],["lt",{"2":{"0":2,"11":10,"13":1,"23":1,"24":1,"28":2,"41":1,"45":2,"56":1,"57":4,"60":4,"62":1,"63":4,"105":1,"134":1,"155":2,"156":3}}],["runtime",{"2":{"156":1}}],["runs",{"2":{"146":1,"147":1}}],["running",{"2":{"146":1}}],["run",{"2":{"41":1,"85":1,"135":1,"146":1,"147":1,"148":1,"155":1,"156":5}}],["rules",{"2":{"11":2,"28":2,"155":1}}],["ruler",{"2":{"11":2,"24":4,"41":1,"155":2}}],["rawoptimizerattribute",{"2":{"155":2}}],["raw",{"2":{"41":2}}],["rates",{"2":{"41":1}}],["rate",{"2":{"41":1}}],["rangeset",{"2":{"16":3}}],["ranges",{"2":{"0":1,"11":1,"62":1}}],["rangedomain",{"0":{"16":1},"2":{"0":3,"11":5,"25":1,"26":1,"56":1,"59":1,"62":3,"65":2}}],["range",{"2":{"0":3,"7":1,"8":1,"11":4,"13":1,"16":3,"28":1,"56":1,"59":1,"62":3,"155":1}}],["randomly",{"2":{"11":1,"57":2,"60":1,"63":1,"68":1,"105":1,"156":1}}],["random",{"2":{"0":1,"11":10,"13":1,"57":2,"60":1,"63":1,"68":10,"105":2,"156":2}}],["rand",{"2":{"0":1,"11":13,"13":2,"56":1,"57":16,"60":9,"63":9,"68":8,"105":8,"139":1,"156":2}}],["right",{"2":{"11":18,"118":15,"120":3}}],["round",{"2":{"132":1,"156":1}}],["routing",{"2":{"11":2,"38":2}}],["role",{"2":{"81":1}}],["roles",{"2":{"20":1,"70":1}}],["rows",{"2":{"85":1}}],["row",{"2":{"41":1,"85":1}}],["robust",{"2":{"10":1}}],["root",{"2":{"0":1,"11":1,"66":1}}],["r",{"2":{"0":2,"11":5,"28":3,"41":2,"56":2,"59":2,"62":2,"71":1,"132":8}}],["re",{"2":{"156":1}}],["remote",{"2":{"156":2}}],["remotely",{"2":{"156":1}}],["removed",{"2":{"16":1}}],["ref",{"2":{"116":1,"156":6}}],["reference",{"2":{"143":1}}],["refer",{"2":{"41":4}}],["refers",{"2":{"4":1,"6":1}}],["registries",{"2":{"153":1}}],["regions",{"2":{"85":1}}],["regularconstraint",{"2":{"155":1}}],["regular",{"2":{"11":10,"20":1,"28":9,"42":1,"43":1,"70":1,"155":2}}],["regularization",{"2":{"0":2,"11":2}}],["recognize",{"2":{"45":1}}],["recommended",{"2":{"16":1,"155":1,"156":1}}],["retrieve",{"2":{"41":1}}],["returned",{"2":{"11":1}}],["returns",{"2":{"0":4,"11":20,"47":2,"57":3,"60":2,"63":2,"66":2,"68":1,"105":1,"120":1,"141":1,"151":1,"153":1,"155":19,"156":1}}],["return",{"2":{"0":21,"11":64,"20":3,"21":4,"28":1,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"41":1,"43":1,"45":3,"56":3,"57":5,"59":3,"60":8,"62":3,"63":8,"66":1,"68":2,"71":4,"72":3,"105":2,"107":1,"109":5,"132":8,"135":4,"139":1,"144":1,"147":1,"149":1,"155":1,"156":21}}],["reproducible",{"2":{"137":1}}],["represented",{"2":{"11":2,"28":2,"146":1,"155":1}}],["represents",{"2":{"5":1,"11":1,"155":3}}],["representing",{"2":{"0":1,"11":2,"28":1,"66":1,"155":3}}],["replace",{"2":{"156":1}}],["replaced",{"2":{"16":1}}],["repl",{"2":{"84":1}}],["requires",{"2":{"139":1}}],["required",{"2":{"11":1,"130":1}}],["requirements",{"2":{"11":2,"45":2}}],["reverse",{"2":{"11":1,"41":1,"120":1,"139":2}}],["rev",{"2":{"11":5,"118":1,"120":1}}],["reduce",{"2":{"11":3,"107":1,"111":2}}],["reusable",{"2":{"9":1}}],["resume",{"2":{"156":1}}],["result",{"0":{"149":1},"2":{"11":23,"107":1,"118":8,"120":2,"146":1,"147":1,"148":1}}],["results",{"2":{"11":3,"41":1,"59":2,"138":3,"139":1}}],["restart",{"2":{"156":6}}],["restricting",{"2":{"156":2}}],["restriction",{"2":{"0":2,"11":2}}],["restricted",{"2":{"57":1,"60":1,"63":1,"156":4}}],["restricts",{"2":{"11":3,"32":3}}],["research",{"2":{"103":1}}],["respect",{"2":{"11":1,"120":1}}],["respectively",{"2":{"41":2}}],["respective",{"2":{"5":1,"12":1}}],["resource",{"2":{"9":1}}],["relies",{"2":{"116":1}}],["relate",{"2":{"11":1,"120":1}}],["related",{"2":{"0":1,"11":1,"12":1,"55":1,"104":1,"120":1,"135":1,"140":1,"149":1,"150":1}}],["relatively",{"2":{"11":1,"107":1,"156":1}}],["relationships",{"2":{"26":1}}],["relation",{"2":{"3":1}}],["relevant",{"2":{"1":1}}],["readers",{"2":{"73":1,"97":1,"102":1}}],["reactants",{"2":{"41":2}}],["reactions",{"2":{"41":1}}],["reaction",{"2":{"41":4}}],["reach",{"2":{"0":1,"11":1,"108":1}}],["real",{"0":{"96":1},"2":{"0":6,"11":7,"56":3,"59":5,"62":4,"73":1,"97":1,"155":2}}],["δ",{"2":{"0":1,"11":1,"51":1,"132":1,"135":1}}],["epoch",{"2":{"156":1}}],["err",{"2":{"155":3}}],["error",{"0":{"21":1,"71":1},"2":{"0":6,"11":24,"21":9,"71":9,"135":1,"155":4,"156":4}}],["euclidian",{"2":{"123":1,"124":1}}],["euclidean",{"2":{"11":6}}],["editors",{"2":{"84":1}}],["edge",{"2":{"11":2,"28":2,"155":2}}],["ecosystem",{"2":{"12":1,"19":1,"42":1,"55":1,"69":1,"84":1}}],["eq",{"2":{"11":22,"118":12,"119":1,"120":6}}],["equiped",{"2":{"41":1}}],["equilibrium",{"2":{"41":4}}],["equivalent",{"2":{"11":1,"57":1,"60":1,"63":1}}],["equalities",{"2":{"11":2,"120":2}}],["equal",{"2":{"6":1,"11":17,"29":5,"30":8,"32":1,"34":2,"41":1,"118":3,"120":1,"155":4}}],["earlier",{"2":{"153":1}}],["easy",{"2":{"137":1,"143":1}}],["easily",{"2":{"137":1,"138":1}}],["easier",{"2":{"11":1}}],["ease",{"2":{"83":1}}],["eachrow",{"2":{"132":4}}],["each",{"2":{"0":2,"8":1,"11":12,"20":3,"28":2,"34":2,"38":2,"41":3,"43":2,"60":1,"63":1,"70":3,"85":5,"87":1,"88":1,"109":1,"116":1,"143":1,"155":2,"156":1}}],["embodies",{"2":{"11":2,"155":1}}],["empty",{"2":{"0":1,"11":1,"120":1,"135":2,"155":7,"156":11}}],["emptydomain",{"2":{"0":1,"11":2,"56":2,"59":1,"62":1}}],["evolves",{"2":{"156":1}}],["evolution",{"2":{"139":2}}],["evals=d",{"2":{"147":1}}],["evals",{"2":{"139":1,"142":2,"144":1,"147":1,"152":1}}],["evaluated",{"2":{"156":1}}],["evaluates",{"2":{"11":2}}],["evaluation",{"2":{"135":1}}],["ever",{"2":{"53":1}}],["even",{"2":{"41":1}}],["eventually",{"2":{"11":2,"38":2}}],["estimation",{"2":{"21":1,"71":1}}],["establishes",{"2":{"11":2,"34":2}}],["essential",{"2":{"13":1,"42":1,"143":1}}],["essentially",{"2":{"4":1}}],["else",{"2":{"132":4}}],["elementary",{"0":{"40":1}}],["element",{"2":{"11":9,"16":1,"33":9,"34":9,"135":2,"153":1,"155":2,"156":1}}],["elements",{"2":{"0":2,"11":18,"13":2,"17":1,"41":1,"49":1,"56":1,"107":1,"109":1,"114":1,"118":8}}],["eltype",{"2":{"11":3,"65":3,"135":2}}],["enabled",{"2":{"156":1}}],["enumerate",{"2":{"132":1}}],["environment",{"0":{"84":1},"2":{"138":1,"139":1}}],["energy",{"2":{"41":1}}],["entry",{"2":{"11":3,"156":1}}],["enforcing",{"2":{"11":2,"155":1}}],["ensure",{"2":{"11":1,"85":1,"127":1}}],["ensures",{"2":{"11":12,"24":2,"28":2,"36":6,"38":2,"40":2,"85":1,"155":2}}],["ensuring",{"2":{"8":1,"11":17,"30":7,"32":5,"120":1,"135":3,"155":18}}],["encapsulate",{"2":{"11":1,"120":1,"156":2}}],["encapsuler",{"2":{"11":1,"59":1}}],["encourage",{"2":{"84":2,"102":1}}],["encode",{"2":{"135":1}}],["encoded",{"2":{"11":2,"28":2,"155":1}}],["encoding",{"0":{"128":1},"2":{"0":4,"11":5,"127":1,"128":4}}],["encompass",{"2":{"11":1}}],["enough",{"2":{"11":1,"68":1}}],["end``",{"2":{"156":1}}],["end",{"2":{"11":2,"25":1,"26":1,"45":2,"85":2,"132":15,"138":2,"139":3,"141":2,"144":1,"145":1,"146":1,"147":2,"149":1,"151":2,"155":1,"156":4}}],["etc",{"2":{"7":1,"138":1}}],["efficiently",{"2":{"41":1,"49":1,"155":1}}],["efficient",{"2":{"1":1,"10":1,"11":1,"16":1,"21":1,"71":1,"93":1}}],["e",{"2":{"0":1,"11":15,"28":4,"36":4,"38":2,"41":1,"79":1,"108":1,"132":3,"156":1}}],["either",{"2":{"0":4,"11":8,"21":1,"26":2,"36":4,"56":1,"59":1,"62":1,"71":1}}],["existing",{"2":{"11":2}}],["exists",{"2":{"11":3,"85":1,"146":1}}],["ex",{"2":{"11":3}}],["exactly",{"2":{"11":4,"31":7,"32":4,"155":3}}],["exampleusing",{"2":{"11":2}}],["example2",{"2":{"11":2}}],["examples",{"0":{"131":1},"1":{"132":1,"133":1},"2":{"11":22,"17":1,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"49":1,"84":1,"120":1,"139":1,"140":1,"150":1}}],["example",{"2":{"0":6,"1":1,"3":1,"4":1,"5":1,"6":1,"11":8,"20":4,"21":1,"23":2,"25":1,"26":1,"29":2,"33":1,"43":1,"71":1,"72":4,"84":1,"141":2,"143":1,"146":1,"151":2,"153":1}}],["exclu",{"2":{"11":3,"109":3}}],["exclude",{"2":{"11":1,"32":1}}],["excluded",{"2":{"11":1,"155":2}}],["exclusive",{"2":{"0":3,"11":11,"109":9,"112":1,"115":1,"125":1,"135":3}}],["except",{"2":{"11":2,"32":2}}],["except=vals",{"2":{"0":1,"11":2,"20":1,"72":1}}],["exceeds",{"2":{"6":1}}],["exceed",{"2":{"3":1,"11":2,"36":2}}],["experimental",{"0":{"100":1},"2":{"100":1}}],["experiments",{"0":{"98":1},"1":{"99":1,"100":1},"2":{"100":1}}],["expectations",{"2":{"84":1}}],["expect",{"2":{"73":1}}],["expected",{"2":{"0":3,"11":4}}],["expansion",{"2":{"11":1}}],["expr",{"2":{"11":2,"145":1,"146":3,"147":3}}],["express",{"2":{"155":1}}],["expressing",{"2":{"18":1}}],["expressions",{"2":{"109":1}}],["expression",{"2":{"11":8,"23":1,"32":1}}],["expresses",{"2":{"3":1}}],["explanation",{"2":{"11":1,"79":1}}],["explicitly",{"2":{"11":2,"26":1,"155":3}}],["explicit",{"2":{"11":2,"155":1}}],["exploring",{"0":{"12":1,"55":1,"86":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"87":1},"2":{"105":1}}],["explore",{"2":{"0":4,"11":7,"12":1,"55":1,"66":4}}],["explored",{"2":{"0":3,"11":3,"66":2}}],["exploresettings",{"2":{"0":6,"11":6,"66":6}}],["explorations",{"2":{"12":1,"55":1}}],["exploration",{"0":{"66":1},"1":{"67":1},"2":{"0":3,"11":5,"49":1,"66":4,"68":1}}],["export",{"2":{"0":1,"11":1,"156":1}}],["externally",{"2":{"156":1}}],["external",{"2":{"11":1,"120":1}}],["extensions",{"0":{"47":1},"1":{"48":1},"2":{"42":1,"141":1,"151":1}}],["extensionally",{"2":{"26":1}}],["extensional",{"2":{"26":1}}],["extension",{"0":{"26":1,"57":1,"60":1,"63":1,"140":1,"150":1},"1":{"141":1,"142":1,"151":1,"152":1},"2":{"11":8,"22":1,"140":1,"141":1,"143":4,"150":1,"151":1,"155":4}}],["extensibility",{"2":{"10":1}}],["extending",{"0":{"143":1},"1":{"144":1,"145":1,"146":1,"147":1,"148":1,"149":1},"2":{"143":1}}],["extended",{"2":{"0":2,"11":19,"107":2,"118":8,"143":1}}],["extend",{"2":{"0":1,"11":2,"13":1,"47":1,"56":1,"65":1,"143":1,"149":1}}],["extends",{"2":{"0":3,"11":7,"41":4,"47":3,"57":5,"60":3,"63":3,"65":1,"68":2,"105":2,"135":3}}],["extremal",{"2":{"16":1}}],["extrema",{"0":{"51":1},"1":{"52":1},"2":{"0":2,"11":2,"42":1,"51":3,"132":1,"135":1,"156":3}}],["extracted",{"2":{"8":1,"19":1,"20":1,"69":1,"72":1}}],["extracts",{"2":{"0":1,"11":2,"43":1}}],["extract",{"2":{"0":2,"11":2,"21":1,"43":2,"71":1}}],["x``or",{"2":{"135":1}}],["x̅",{"2":{"135":4}}],["xn",{"2":{"85":1}}],["xi",{"2":{"25":2,"26":2}}],["x4",{"2":{"15":1}}],["x3",{"2":{"11":1,"15":1,"28":1}}],["x3c",{"2":{"0":18,"11":48,"25":4,"26":4,"28":1,"29":2,"30":4,"31":4,"32":2,"35":2,"36":1,"41":3,"45":3,"56":6,"57":9,"59":11,"60":8,"62":12,"63":8,"68":12,"105":3,"132":2,"135":1,"155":70,"156":91}}],["x=x1",{"2":{"85":1}}],["x=6",{"2":{"6":1}}],["x=3",{"2":{"5":1,"6":1}}],["x26",{"2":{"11":4}}],["x2",{"2":{"4":1,"11":1,"15":1,"16":1,"28":1,"156":2}}],["x1+x2≤10",{"2":{"4":1}}],["x1",{"2":{"4":1,"11":1,"15":1,"16":1,"28":1,"156":2}}],["x+y≤10",{"2":{"3":1,"4":1,"6":1}}],["xto",{"2":{"0":1,"11":1,"108":1}}],["xcsp³",{"2":{"22":1}}],["xcsp",{"2":{"0":1,"1":1,"11":21,"20":3,"24":1,"25":1,"26":1,"28":2,"29":3,"30":3,"31":4,"32":4,"33":4,"34":4,"35":2,"36":2,"38":1,"40":1,"70":2,"72":1}}],["xcsp3",{"2":{"0":1,"8":1,"11":3,"20":6,"43":3,"45":1,"70":4,"72":2}}],["x",{"2":{"0":33,"3":1,"5":1,"11":298,"20":1,"21":4,"23":2,"24":8,"25":10,"26":11,"28":6,"29":12,"30":23,"31":22,"32":28,"33":16,"34":8,"35":8,"36":8,"38":2,"40":2,"41":4,"49":2,"51":2,"57":10,"60":10,"63":10,"71":4,"72":1,"85":6,"107":6,"108":8,"111":4,"114":3,"118":60,"123":1,"128":8,"132":42,"135":33,"139":4,"141":1,"151":1,"155":50,"156":68}}],["15",{"2":{"31":1,"141":1,"151":1}}],["1≤z",{"2":{"31":2,"35":2}}],["1≤y",{"2":{"29":1,"31":3,"33":2,"35":2}}],["1≤x",{"2":{"29":2,"31":7,"33":4,"35":2}}],["14",{"2":{"15":3}}],["101",{"0":{"74":1},"1":{"75":1,"76":1,"77":1}}],["10000",{"2":{"156":1}}],["1000",{"2":{"139":4}}],["100",{"2":{"0":2,"11":2,"139":1,"156":1}}],["10",{"2":{"0":2,"3":1,"5":1,"6":2,"11":29,"25":3,"26":3,"31":22,"32":27,"33":2,"35":2,"139":1,"141":1,"151":1,"156":2}}],["10^6",{"2":{"0":2,"11":2,"66":2}}],["123",{"2":{"0":1,"11":1,"15":3,"56":1,"59":1,"62":1}}],["12",{"2":{"0":1,"11":2,"15":3,"35":1,"36":1,"56":1,"59":1,"62":1}}],["1",{"2":{"0":6,"11":174,"15":3,"16":9,"18":1,"21":2,"24":2,"25":8,"26":11,"28":15,"29":30,"30":19,"31":122,"32":34,"33":44,"34":17,"35":61,"36":41,"38":4,"40":4,"41":3,"53":2,"56":2,"59":2,"62":2,"71":2,"85":5,"127":1,"128":1,"132":4,"139":3,"142":1,"144":2,"149":4,"152":2,"153":8,"155":4,"156":4}}],["=0",{"2":{"41":1}}],["=>",{"2":{"11":15,"28":15,"132":1,"138":2,"139":7,"141":3,"142":10,"144":6,"151":3,"152":6}}],["==",{"2":{"0":1,"11":9,"31":9,"32":2,"33":9,"34":4,"38":1,"57":1,"128":1,"132":2,"155":3}}],["=usual",{"2":{"0":1,"11":1,"20":1,"72":1}}],["=",{"2":{"0":34,"11":124,"15":10,"16":6,"18":3,"20":2,"21":2,"24":5,"25":10,"26":10,"28":16,"29":12,"30":3,"31":83,"32":16,"33":34,"34":12,"35":32,"36":17,"38":5,"40":1,"41":11,"43":1,"53":2,"56":5,"57":4,"59":5,"60":4,"62":5,"63":4,"66":5,"70":1,"71":2,"72":1,"85":1,"107":1,"111":2,"120":5,"125":1,"127":1,"128":3,"132":34,"135":12,"138":8,"139":7,"145":1,"146":1,"147":1,"148":1,"149":9,"155":19,"156":48}}],["vov",{"2":{"155":5}}],["vf",{"2":{"139":5}}],["v4",{"2":{"15":2}}],["v3",{"2":{"15":2,"31":3}}],["v2",{"2":{"15":2,"16":1,"31":3}}],["v1",{"2":{"15":2,"16":3,"31":3}}],["vs",{"2":{"11":3}}],["vec",{"2":{"85":1}}],["vectorofvariables",{"2":{"155":3}}],["vectors",{"2":{"0":1,"11":4,"66":1,"111":2,"118":1,"139":1}}],["vector",{"2":{"0":10,"11":62,"20":3,"28":2,"30":6,"32":9,"43":5,"45":1,"56":1,"57":4,"59":4,"60":3,"62":1,"63":3,"68":1,"70":3,"105":1,"107":2,"111":2,"114":1,"118":8,"120":1,"128":2,"132":5,"138":2,"139":1,"153":2,"155":17,"156":1}}],["verbose",{"2":{"156":4}}],["verbosity",{"2":{"155":1,"156":1}}],["versionnumber",{"2":{"138":1,"153":1}}],["versions",{"2":{"21":1,"71":1,"138":4,"139":1,"153":3}}],["version",{"2":{"11":2,"84":1,"120":1,"138":5,"153":3,"155":1}}],["versa",{"2":{"11":3,"34":2,"120":1}}],["versatile",{"0":{"8":1},"2":{"11":2,"155":1}}],["verifies",{"2":{"11":2,"28":2,"155":1}}],["vi",{"2":{"155":3}}],["via",{"2":{"137":1,"143":1,"144":1,"148":1}}],["viable",{"2":{"0":1,"11":6,"109":5}}],["vision",{"2":{"103":1}}],["visuals",{"2":{"139":4}}],["visualization",{"2":{"137":1,"138":1}}],["visual",{"2":{"84":1}}],["vice",{"2":{"11":3,"34":2,"120":1}}],["violated",{"2":{"6":2,"21":1,"71":1}}],["violates",{"2":{"6":1}}],["violation",{"0":{"6":1},"2":{"2":1}}],["v",{"2":{"0":2,"11":3,"107":3,"139":5,"153":7,"155":12,"156":3}}],["var",{"2":{"11":20,"156":12}}],["vars=dictionary",{"2":{"156":1}}],["vars=ones",{"2":{"11":2,"32":2}}],["vars=nothing",{"2":{"11":10,"30":10}}],["vars=",{"2":{"11":11,"30":4,"40":2}}],["vars=zeros",{"2":{"11":2,"30":2}}],["vars",{"2":{"11":51,"20":2,"35":9,"36":15,"40":2,"43":2,"70":2,"123":3,"155":20,"156":24}}],["variant",{"2":{"11":2,"36":2}}],["variants",{"2":{"11":19,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"85":1}}],["variableconstrainedoncreation",{"2":{"155":1}}],["variableinfo",{"2":{"155":2}}],["variables",{"0":{"7":1,"12":1,"55":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1},"2":{"0":4,"2":3,"3":3,"4":3,"5":3,"7":1,"11":32,"12":2,"18":1,"25":1,"26":2,"28":1,"32":8,"34":8,"38":2,"40":2,"55":1,"68":1,"76":1,"85":3,"105":1,"108":1,"127":2,"155":9,"156":26}}],["variable",{"2":{"0":2,"6":1,"11":11,"13":1,"15":8,"16":4,"20":2,"23":2,"25":2,"26":4,"29":5,"31":12,"33":8,"34":6,"35":6,"43":2,"57":3,"60":3,"63":3,"70":2,"85":2,"155":9,"156":40}}],["varies",{"2":{"2":1}}],["various",{"0":{"131":1},"1":{"132":1,"133":1},"2":{"0":1,"7":1,"11":2,"19":1,"51":1,"56":1,"69":1,"84":1,"91":1,"99":1,"120":1,"137":2}}],["val=3",{"2":{"11":1,"31":1,"32":1}}],["val=2",{"2":{"11":4,"31":2,"32":3,"33":1,"34":1}}],["val=15",{"2":{"11":2,"31":2,"32":2}}],["val=1",{"2":{"11":4,"30":2,"32":1,"33":1,"34":1}}],["val=nothing",{"2":{"11":4,"30":2,"34":2}}],["valparameterdomain",{"2":{"11":1,"68":1,"105":1}}],["vals=",{"2":{"11":15,"30":2,"31":7,"32":13}}],["vals=nothing",{"2":{"0":1,"11":2,"20":1,"72":1}}],["valsparameterdomain",{"2":{"11":1,"68":1,"105":1}}],["vals",{"2":{"11":24,"20":2,"29":1,"30":2,"31":19,"32":18,"43":2,"70":2,"118":2,"120":2,"155":7}}],["validity",{"2":{"11":1,"155":1}}],["valid",{"2":{"0":5,"11":10,"28":1,"56":1,"127":2,"128":3,"155":7}}],["value2",{"2":{"138":1,"141":1,"151":1}}],["value1",{"2":{"138":1,"141":1,"151":1}}],["valued",{"2":{"11":1,"28":1,"155":1}}],["value",{"2":{"0":13,"11":59,"20":1,"25":2,"26":2,"28":3,"29":5,"30":1,"31":12,"32":5,"33":8,"34":13,"35":6,"38":4,"41":1,"43":1,"57":8,"60":7,"62":2,"63":10,"68":2,"70":1,"85":3,"105":1,"109":1,"120":8,"125":2,"128":1,"138":1,"155":15,"156":20}}],["values",{"2":{"0":5,"2":1,"5":1,"11":67,"15":1,"20":1,"21":2,"26":2,"28":2,"30":13,"32":24,"34":4,"38":3,"40":6,"41":4,"43":1,"56":2,"59":2,"62":4,"68":3,"70":1,"71":2,"85":2,"120":5,"138":1,"142":1,"152":1,"155":12,"156":11}}],["val",{"0":{"119":1,"124":1},"2":{"0":3,"11":124,"13":1,"20":1,"30":3,"31":24,"32":21,"33":8,"34":8,"35":7,"36":6,"38":4,"41":4,"43":1,"53":2,"56":1,"70":1,"119":2,"120":8,"123":3,"124":3,"139":2,"144":2,"145":2,"146":2,"147":2,"148":2,"155":16,"156":8}}],["upcoming",{"2":{"103":1}}],["up",{"0":{"84":1},"2":{"17":1,"156":1}}],["update",{"2":{"11":2}}],["utilized",{"2":{"11":1,"42":1,"155":1}}],["utilities",{"0":{"107":1},"2":{"10":1,"49":1}}],["us",{"2":{"155":1}}],["usage",{"0":{"138":1,"141":1,"151":1},"2":{"25":1,"138":1,"140":1,"150":1}}],["using",{"2":{"0":1,"11":1,"16":2,"20":1,"25":2,"26":2,"72":1,"85":1,"135":1,"137":1,"138":3,"139":3,"141":2,"145":1,"151":2,"155":1}}],["uses",{"0":{"90":1},"2":{"11":1,"120":1,"135":1}}],["useful",{"2":{"11":1,"53":1,"109":1,"155":4,"156":1}}],["users",{"2":{"10":1,"42":1,"55":1,"84":2,"143":1,"144":1}}],["user",{"2":{"8":1,"20":1,"70":1,"146":1,"147":1,"156":2}}],["use",{"2":{"0":2,"10":1,"11":5,"21":2,"24":2,"30":2,"32":1,"42":1,"49":1,"55":1,"62":1,"71":2,"83":1,"84":2,"85":1,"116":1,"137":1,"143":1,"155":2,"156":2}}],["used",{"2":{"0":1,"10":1,"11":40,"13":1,"20":2,"28":1,"34":6,"36":8,"38":2,"40":2,"43":2,"45":3,"55":1,"56":1,"68":8,"70":2,"84":1,"107":1,"109":2,"130":1,"135":2,"138":3,"141":1,"151":1,"155":4,"156":1}}],["usually",{"2":{"11":1,"156":1}}],["usual",{"0":{"20":1,"70":1,"72":1},"2":{"0":14,"11":24,"20":14,"21":3,"23":1,"24":3,"25":1,"43":8,"70":5,"71":3,"72":9,"110":1,"113":1,"116":1,"121":1}}],["unfold",{"2":{"139":2}}],["undefkeyworderror",{"2":{"132":1}}],["understanding",{"0":{"79":1}}],["under",{"2":{"11":1,"120":1}}],["unrolled",{"2":{"11":1}}],["unacceptable",{"2":{"11":2,"155":1}}],["unique",{"2":{"11":3,"24":2,"34":2,"155":2}}],["union",{"2":{"0":4,"11":12,"32":1,"34":4,"43":1,"45":2,"53":1,"57":2,"60":1,"63":1,"65":2,"68":2,"105":2,"155":4,"156":69}}],["unlikely",{"2":{"10":1}}],["unordered",{"2":{"0":1,"11":1,"15":1,"62":1}}],["until",{"2":{"0":1,"11":1,"17":1,"49":1}}],["branch",{"2":{"138":1}}],["breaking",{"2":{"138":3,"153":3}}],["but",{"2":{"41":1,"85":1,"149":1}}],["building",{"0":{"92":1},"1":{"93":1,"94":1},"2":{"93":1}}],["build",{"2":{"25":1,"26":1,"105":10,"107":1,"108":1,"109":1,"118":2,"119":6,"123":4,"124":4,"125":1,"143":1,"155":2}}],["block",{"2":{"85":1,"138":1,"146":4,"147":2}}],["blocks",{"2":{"8":1,"85":2}}],["blank",{"2":{"41":2}}],["b2",{"2":{"31":1}}],["b1",{"2":{"31":1}}],["bariable",{"2":{"156":1}}],["backend",{"2":{"138":3,"142":1,"145":1,"149":1,"152":1}}],["backends",{"2":{"137":1,"138":1}}],["backward",{"2":{"41":1}}],["back",{"2":{"11":2,"38":2}}],["basis",{"2":{"85":1}}],["basic",{"0":{"76":1,"127":1},"2":{"11":5,"42":1,"84":1,"120":4,"127":1,"135":1,"149":1}}],["basics",{"0":{"1":1,"81":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1}}],["based",{"0":{"1":1,"30":1,"133":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1},"2":{"0":5,"1":1,"11":10,"20":4,"43":3,"53":1,"66":1,"68":1,"70":3,"72":1,"105":1,"109":1,"120":2,"128":1,"135":2,"140":1,"150":1,"155":1}}],["base",{"0":{"57":1,"60":1,"63":1},"2":{"0":6,"1":1,"11":29,"13":3,"41":9,"42":1,"47":2,"56":3,"57":12,"60":8,"63":9,"65":3,"68":4,"105":4,"109":1,"127":2,"155":5,"156":4}}],["bijective",{"2":{"11":2,"34":2}}],["binary",{"2":{"0":1,"11":1,"26":1,"128":1}}],["binarization==",{"2":{"132":1}}],["binarization",{"2":{"0":4,"11":4,"128":4,"132":13,"135":2}}],["binarized",{"2":{"11":1,"127":1}}],["binarize",{"2":{"0":2,"11":2,"128":2,"132":3}}],["bias",{"2":{"0":3,"11":3,"108":1}}],["bit",{"2":{"0":2,"11":2,"128":1}}],["bitvector",{"2":{"0":1,"11":5,"107":4}}],["bits",{"2":{"0":1,"11":3,"109":2}}],["b",{"2":{"0":1,"11":11,"28":2,"56":1,"57":8,"59":1,"60":8,"62":1,"63":8}}],["better",{"2":{"156":2}}],["between",{"2":{"0":7,"2":1,"3":1,"11":15,"13":1,"24":2,"26":1,"31":1,"34":2,"41":2,"43":1,"51":2,"56":3,"59":2,"62":2,"155":4,"156":1}}],["benchmarked",{"2":{"141":1,"151":1}}],["benchmark",{"2":{"141":1,"149":1}}],["benchmarking",{"2":{"140":1,"150":1}}],["benchmarktools",{"0":{"140":1},"1":{"141":1,"142":1},"2":{"138":1,"140":1,"141":2,"142":8,"151":1}}],["below",{"2":{"139":1}}],["belongs",{"2":{"57":1,"60":1,"63":1,"156":2}}],["begin",{"2":{"138":2,"139":2,"141":2,"151":2,"155":4,"156":22}}],["best",{"0":{"93":1},"2":{"84":1,"93":1,"135":1,"156":1}}],["been",{"2":{"14":1,"96":1,"140":1,"150":1,"156":7}}],["before",{"2":{"11":8,"36":8,"146":1}}],["because",{"2":{"6":2,"23":1,"26":1}}],["behavior",{"2":{"0":1,"11":2,"13":1,"17":1,"66":2}}],["be",{"0":{"147":1},"2":{"0":9,"2":1,"3":1,"4":1,"5":1,"10":1,"11":28,"12":2,"16":3,"17":1,"18":1,"23":2,"26":3,"28":3,"32":2,"34":2,"41":2,"55":1,"56":1,"66":3,"84":1,"85":1,"105":1,"109":5,"112":1,"115":1,"120":1,"125":1,"128":1,"135":2,"138":4,"141":2,"143":1,"144":1,"145":1,"146":2,"147":2,"148":2,"149":2,"151":2,"155":18,"156":3}}],["boxplots",{"2":{"139":4}}],["boxes",{"2":{"85":1}}],["bounded",{"2":{"11":1}}],["bounding",{"2":{"11":6,"119":1,"120":2}}],["bounds",{"2":{"0":1,"11":1,"13":1,"56":1}}],["bold",{"2":{"2":1}}],["bool=true",{"2":{"11":1,"31":1,"32":1}}],["bool=false",{"2":{"11":3,"31":1,"32":3}}],["boolparameterdomain",{"2":{"11":1,"68":1,"105":1}}],["bool",{"2":{"0":4,"11":9,"20":1,"32":1,"36":3,"43":1,"56":4,"59":4,"62":4,"70":1,"132":1,"138":1,"155":8,"156":4}}],["boolean",{"2":{"0":2,"11":5,"20":1,"43":1,"49":1,"68":1,"70":1,"138":1}}],["both",{"2":{"0":1,"11":5,"12":1,"41":2,"42":1,"51":1,"55":1,"155":1}}],["bytes",{"2":{"139":1,"149":4}}],["by",{"0":{"6":1},"2":{"0":5,"11":20,"19":2,"20":1,"21":1,"23":2,"26":3,"28":4,"32":1,"34":2,"41":1,"42":1,"45":1,"47":2,"57":1,"60":1,"62":1,"63":1,"69":2,"70":1,"71":1,"88":1,"99":1,"107":1,"109":1,"135":4,"146":2,"155":4,"156":10}}],["ptm",{"2":{"156":1}}],["png",{"2":{"139":2}}],["pkgextensions",{"2":{"143":1}}],["pkg",{"2":{"138":1,"143":1,"153":2}}],["pkgs",{"2":{"138":1,"139":1}}],["pôpulation",{"2":{"135":1}}],["penalty",{"2":{"132":20,"135":9}}],["perfchecker",{"0":{"137":1,"143":1},"1":{"138":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1},"2":{"137":1,"138":2,"139":3,"140":1,"141":1,"143":2,"144":3,"145":1,"146":1,"147":2,"148":1,"149":3,"150":1,"151":1,"153":5}}],["performances",{"0":{"44":1,"46":1,"48":1,"50":1,"52":1,"54":1,"58":1,"61":1,"64":1,"67":1}}],["performance",{"0":{"94":1,"147":1,"148":1},"2":{"10":1,"83":1,"94":1,"137":2,"138":4,"139":2,"144":1,"146":1,"147":1,"148":1,"156":1}}],["perform",{"2":{"0":1,"11":1,"66":1,"156":1}}],["per",{"2":{"0":1,"11":1,"19":1,"69":1,"128":1}}],["pivotal",{"2":{"69":1}}],["plainly",{"2":{"145":1}}],["placeholder",{"2":{"17":1}}],["plots",{"2":{"139":2}}],["plotting",{"2":{"139":1,"149":1}}],["pluto",{"2":{"84":1}}],["please",{"2":{"24":1,"84":1}}],["phase",{"2":{"11":1,"109":2}}],["push",{"2":{"132":1}}],["purpose",{"2":{"87":1}}],["purposes",{"2":{"11":1,"135":1}}],["puzzles",{"2":{"85":1}}],["puzzle",{"2":{"85":3}}],["public",{"0":{"0":1}}],["pseudo",{"2":{"11":1,"68":1}}],["p",{"2":{"0":1,"11":1,"41":2,"108":1,"155":1}}],["practice",{"0":{"97":1}}],["practices",{"0":{"93":1},"2":{"93":1}}],["practical",{"2":{"17":1,"19":1,"69":1}}],["primary",{"2":{"87":1,"138":1}}],["primarily",{"2":{"55":1}}],["printing",{"2":{"156":2}}],["print",{"2":{"85":1,"156":8}}],["principles",{"2":{"2":1}}],["projects",{"2":{"103":1}}],["proceeds",{"2":{"41":1}}],["processes",{"2":{"49":1}}],["processing",{"2":{"11":1,"120":1}}],["process",{"2":{"9":1,"11":1,"97":1,"120":1,"135":1,"138":1,"156":7}}],["programs",{"0":{"128":1}}],["programming",{"0":{"74":1,"75":1,"81":1,"89":1},"1":{"75":1,"76":1,"77":1,"90":1,"91":1},"2":{"1":2,"11":20,"14":1,"19":1,"26":1,"32":3,"34":6,"36":6,"38":2,"40":2,"42":1,"69":1,"73":1,"77":1,"79":1,"81":1,"85":1,"120":1,"155":1}}],["progress",{"2":{"21":1,"71":1}}],["produce",{"2":{"11":1,"107":1}}],["products",{"2":{"41":2}}],["product",{"2":{"11":1,"111":1}}],["prod",{"2":{"11":2,"111":2}}],["provide",{"2":{"13":1,"14":1,"17":1,"18":1,"20":1,"21":1,"23":2,"25":2,"26":1,"53":1,"71":1,"72":1,"84":1,"88":1,"99":1,"105":1,"138":1,"140":1,"144":1,"150":1,"155":1}}],["provided",{"2":{"11":18,"118":8,"138":2,"146":1}}],["provides",{"2":{"1":1,"9":1,"10":1,"12":1,"42":1,"73":1,"85":1,"137":2}}],["providing",{"2":{"8":1,"11":2,"155":1}}],["problem",{"2":{"4":3,"24":1,"41":6,"85":1,"97":1,"156":3}}],["problems",{"2":{"1":1,"9":1,"11":11,"18":1,"28":1,"36":6,"38":2,"41":2,"73":1,"75":1,"79":1,"85":1,"90":1,"91":1,"155":2,"156":1}}],["property",{"2":{"23":1}}],["properties",{"2":{"13":1,"41":1}}],["properly",{"2":{"0":1,"11":1,"13":1,"56":1}}],["proportional",{"2":{"0":1,"11":1}}],["prep",{"2":{"146":3}}],["preparatory",{"0":{"146":1},"2":{"138":1,"146":1}}],["prelimnary",{"2":{"141":1,"151":1}}],["preliminaries",{"2":{"132":3,"135":2}}],["previous",{"2":{"138":3}}],["previously",{"2":{"25":1}}],["precision",{"2":{"132":6,"135":1}}],["prefixed",{"2":{"20":1,"70":1}}],["prefix",{"2":{"11":3}}],["preferences",{"2":{"0":1,"11":1}}],["predictions",{"2":{"135":1}}],["prediction",{"2":{"135":1}}],["predict",{"2":{"132":9,"135":1}}],["predicates",{"2":{"85":2}}],["predicate",{"2":{"2":1,"3":1,"11":9,"23":1,"24":4,"25":2,"26":1,"109":1,"155":7}}],["predefined",{"2":{"9":1}}],["present",{"2":{"1":1,"11":1,"41":1,"139":1}}],["pretty",{"2":{"0":3,"11":3,"20":3,"72":3,"132":1,"156":2}}],["pool",{"2":{"156":1}}],["point",{"2":{"11":4,"36":2,"57":3,"60":2,"63":2,"68":1,"105":1}}],["points",{"2":{"0":4,"11":5,"56":1,"59":1,"60":1,"62":3,"63":2}}],["posed",{"2":{"85":1}}],["post",{"0":{"148":1},"2":{"73":1,"148":2,"149":1,"156":1}}],["pos",{"2":{"41":2}}],["positional",{"2":{"11":1}}],["positive",{"2":{"0":4,"11":15,"114":3}}],["possibly",{"2":{"11":2,"17":1,"62":1}}],["possible",{"2":{"5":1,"84":1,"117":1,"122":1,"155":1,"156":2}}],["populate",{"2":{"144":1}}],["population",{"2":{"0":2,"11":2,"135":2}}],["pop",{"2":{"135":2}}],["popsize=100",{"2":{"135":1}}],["popsize=200",{"2":{"0":1,"11":1}}],["popsize",{"2":{"0":4,"11":4}}],["pacakge",{"2":{"138":1}}],["packing",{"0":{"36":1}}],["package",{"0":{"87":1,"145":1},"2":{"12":1,"42":3,"43":1,"55":1,"69":1,"87":1,"88":1,"137":2,"138":1,"139":1,"145":1,"153":1}}],["packages",{"0":{"86":1},"1":{"87":1},"2":{"11":2,"42":2,"45":2,"137":1}}],["page",{"2":{"84":1}}],["passed",{"2":{"11":2}}],["patterfolds",{"2":{"139":1}}],["patterns",{"2":{"139":1}}],["pattern",{"2":{"11":1,"109":1}}],["patternfolds",{"2":{"11":1,"59":1,"139":3}}],["patch",{"2":{"138":2,"153":2}}],["patches",{"2":{"138":1,"153":1}}],["path",{"2":{"0":5,"11":6,"28":1,"138":2,"139":1,"141":1,"151":1,"155":1,"156":5}}],["pairs",{"2":{"11":1,"41":2,"155":2}}],["pairvarsparameterdomain",{"2":{"11":1,"68":1,"105":1}}],["paired",{"2":{"11":2,"20":1,"43":1,"68":1,"70":1}}],["pair",{"2":{"0":1,"11":64,"20":2,"30":16,"32":2,"35":9,"36":15,"40":4,"41":5,"43":2,"66":1,"70":2,"109":1,"135":3,"155":15}}],["parse",{"2":{"11":1}}],["paradigm",{"2":{"1":1}}],["param=nothing",{"2":{"0":1,"11":1}}],["params",{"2":{"0":1,"11":2,"132":1}}],["parameterization",{"2":{"11":1,"120":1}}],["parameter",{"2":{"0":4,"11":18,"20":4,"28":2,"43":3,"68":1,"70":4,"107":2,"120":6,"127":1,"135":1,"146":1,"155":1}}],["parameters=constraintcommons",{"2":{"0":1,"11":1,"43":1}}],["parameters",{"0":{"20":1,"43":1,"68":1,"70":1,"105":1},"1":{"44":1},"2":{"0":25,"11":44,"20":12,"42":1,"43":19,"66":3,"68":12,"70":8,"72":4,"105":6,"117":1,"120":2,"122":1,"135":5,"142":8}}],["parametric",{"0":{"118":1,"123":1},"2":{"0":3,"11":4,"120":2,"125":1,"135":1}}],["param",{"0":{"119":1,"124":1},"2":{"0":20,"11":37,"21":4,"68":2,"71":4,"105":2,"107":5,"119":6,"120":16,"124":4,"125":2}}],["parts",{"2":{"10":1}}],["particularly",{"2":{"109":1}}],["particular",{"2":{"4":1}}],["partially",{"2":{"0":1,"11":1,"85":1}}],["partial",{"2":{"0":2,"11":3,"49":1,"66":1,"156":1}}],["part",{"2":{"0":1,"11":2,"18":1,"19":1,"66":1,"69":1,"84":1}}],["∈",{"2":{"0":2,"11":9,"13":2,"47":1,"56":1,"57":7,"60":7,"63":7,"155":2,"156":3}}],["nine",{"2":{"85":1}}],["n²",{"2":{"41":1}}],["n×n",{"2":{"41":1}}],["nvalues",{"2":{"11":8,"31":9,"32":8,"155":1}}],["nvars",{"2":{"0":4,"11":12}}],["n5",{"2":{"11":2,"28":2}}],["n4",{"2":{"11":3,"28":3}}],["n3",{"2":{"11":2,"28":2}}],["n2",{"2":{"11":2,"28":2}}],["n1",{"2":{"11":2,"28":2}}],["numerous",{"2":{"18":1}}],["numerical",{"2":{"15":1,"17":1}}],["numeric",{"2":{"11":1,"62":1}}],["numbers",{"2":{"11":2,"138":1}}],["number",{"2":{"0":18,"11":52,"13":1,"32":11,"41":2,"56":1,"60":3,"62":2,"63":3,"66":2,"108":1,"109":5,"114":1,"118":8,"128":3,"135":2,"138":1,"155":23,"156":12}}],["n",{"2":{"0":2,"11":7,"41":16,"107":4,"127":3,"132":9}}],["nbits",{"2":{"0":1,"11":2,"109":1}}],["nbsp",{"2":{"0":74,"11":187,"13":1,"20":5,"21":2,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"41":18,"43":2,"45":6,"47":3,"49":1,"51":1,"53":1,"56":6,"57":5,"59":8,"60":4,"62":10,"63":5,"65":2,"66":3,"68":13,"70":1,"71":2,"72":4,"105":3,"107":6,"108":3,"109":11,"111":2,"112":1,"114":2,"115":1,"118":9,"120":2,"123":1,"125":1,"127":2,"128":3,"130":2,"135":28,"153":4,"155":72,"156":144}}],["neighbours",{"2":{"156":2}}],["neighbourhood",{"2":{"156":2}}],["neither",{"2":{"11":1}}],["never",{"2":{"156":1}}],["necessarily",{"2":{"84":1}}],["necessary",{"2":{"12":1,"156":3}}],["need",{"2":{"51":1,"85":2,"143":1}}],["needs",{"2":{"0":1,"11":2,"120":1}}],["net",{"2":{"41":1}}],["network",{"2":{"0":1,"11":1,"109":1}}],["next",{"2":{"11":2,"38":2,"138":3,"153":2}}],["negation",{"2":{"11":1}}],["new",{"2":{"0":3,"9":1,"11":8,"20":3,"59":3,"72":3,"138":1,"155":1,"156":2}}],["natural",{"2":{"23":1,"25":1}}],["nature",{"2":{"0":1,"11":2,"20":2,"43":1,"59":1,"62":1,"70":2}}],["navigate",{"2":{"20":1,"72":1}}],["names",{"2":{"11":1,"120":1}}],["name=",{"2":{"0":1,"11":1}}],["name",{"2":{"0":8,"11":9,"20":2,"21":1,"43":1,"70":1,"71":1,"72":1,"138":4,"155":2,"156":8}}],["now",{"2":{"41":1,"85":1}}],["nooverlap",{"2":{"35":4,"155":2}}],["normal",{"2":{"11":1,"120":1}}],["normalized",{"2":{"0":1,"11":1}}],["norm",{"2":{"11":2}}],["node",{"2":{"11":3,"28":3,"41":2,"155":3}}],["no",{"2":{"11":24,"35":6,"36":20,"41":4,"107":1,"109":1,"120":1,"135":1,"155":1}}],["notebooks",{"2":{"84":1,"140":1,"150":1}}],["note",{"2":{"19":1,"21":1,"23":1,"25":1,"29":2,"33":1,"43":1,"71":1,"84":1,"85":1,"155":1}}],["not",{"2":{"0":2,"3":1,"11":18,"16":1,"19":1,"21":1,"23":1,"25":1,"32":1,"36":6,"41":2,"59":1,"69":1,"71":1,"84":1,"85":3,"120":1,"128":1,"155":4,"156":1}}],["nothing",{"2":{"0":11,"11":17,"21":2,"30":1,"32":2,"47":5,"71":2,"107":1,"132":1,"135":2,"139":1,"144":2,"146":1,"152":2,"155":15}}],["nonnegative",{"2":{"155":1}}],["nonlinear",{"2":{"79":1}}],["none",{"2":{"0":1,"11":4,"120":3,"128":1,"132":2,"142":1,"144":1,"152":1,"155":1}}],["non",{"0":{"118":1,"123":1},"2":{"0":3,"11":4,"16":1,"17":1,"62":1,"66":2,"120":1,"135":4,"156":1}}],["o",{"2":{"135":1,"156":16}}],["own",{"2":{"84":1,"85":1,"156":1}}],["objs=dictionary",{"2":{"156":1}}],["objs",{"2":{"156":7}}],["objectives",{"2":{"156":10}}],["objective",{"2":{"85":1,"155":4,"156":24}}],["object",{"2":{"0":3,"11":3,"66":3}}],["observable",{"2":{"41":1}}],["odd",{"2":{"17":1}}],["occurrences",{"2":{"11":7,"32":7,"155":4}}],["occurs",{"2":{"11":2,"31":1,"32":2}}],["out",{"2":{"85":1}}],["output",{"2":{"0":2,"11":2,"135":1,"146":1,"147":1,"148":1,"149":1}}],["outputs",{"2":{"0":1,"11":1,"153":3}}],["our",{"2":{"4":1,"20":1,"49":1,"70":1,"85":2}}],["other",{"0":{"77":1},"2":{"1":1,"41":1,"77":1,"84":1,"85":4,"138":1,"141":1,"149":1,"151":1,"156":2}}],["otherwise",{"2":{"0":3,"6":1,"11":28,"21":1,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"45":1,"57":1,"60":1,"63":1,"68":1,"71":1,"105":1,"155":4,"156":1}}],["opt",{"2":{"155":2}}],["optmizers",{"2":{"135":1}}],["option",{"2":{"138":4,"155":1}}],["option2",{"2":{"138":1,"141":1,"151":1}}],["option1",{"2":{"138":1,"141":1,"151":1}}],["options",{"0":{"142":1,"144":1,"152":1},"2":{"135":2,"138":3,"142":1,"144":3,"152":1,"155":5,"156":34}}],["optionally",{"2":{"0":2,"11":2,"21":2,"71":2}}],["optional",{"2":{"0":10,"11":10,"41":1,"66":1,"128":1,"135":1,"138":1,"156":2}}],["optimizing",{"2":{"156":7}}],["optimization",{"0":{"77":1,"78":1,"79":1,"82":1,"91":1,"95":1},"1":{"79":1,"80":1,"81":1,"83":1,"84":1,"85":1,"96":1,"97":1},"2":{"2":1,"9":1,"14":1,"73":1,"79":2,"81":1,"83":1,"93":1,"96":1,"97":1,"156":2}}],["optimized",{"2":{"155":1}}],["optimizers",{"0":{"131":1},"1":{"132":1,"133":1},"2":{"135":1}}],["optimizer",{"2":{"15":11,"16":7,"25":7,"26":7,"29":3,"31":4,"33":4,"35":2,"85":1,"132":8,"135":6,"155":59,"156":3}}],["optimize",{"2":{"0":1,"11":1,"25":2,"26":2,"29":3,"31":4,"33":4,"35":2,"41":1,"135":11,"155":4}}],["open",{"2":{"11":6,"18":1,"31":1,"32":6,"116":1,"139":1}}],["operate",{"2":{"11":1,"120":1}}],["operation",{"2":{"11":5,"16":1,"109":5,"135":2}}],["operations",{"0":{"111":1},"2":{"0":7,"11":21,"47":1,"60":2,"63":2,"109":13,"112":2,"115":1,"120":1,"125":1,"135":3}}],["operators",{"2":{"11":1,"68":1}}],["operator",{"2":{"11":6,"20":2,"30":3,"32":1,"43":2,"70":2}}],["op=>",{"2":{"11":2,"30":2}}],["op=≤",{"2":{"11":9,"29":1,"30":6,"32":3}}],["op===",{"2":{"11":6,"32":4,"34":2}}],["op==",{"2":{"11":1,"32":1}}],["op=≥",{"2":{"11":3,"30":2,"31":1,"32":1}}],["op=",{"2":{"11":6,"29":1,"30":6}}],["op=+",{"2":{"11":2,"30":2}}],["opparameterdomain",{"2":{"11":1,"68":1,"105":1}}],["op",{"2":{"11":29,"20":1,"29":1,"31":16,"32":10,"33":6,"34":8,"35":4,"36":4,"38":4,"43":1,"70":1,"109":2,"155":9}}],["once",{"2":{"84":1}}],["ongoing",{"2":{"11":2,"36":2}}],["ones",{"2":{"7":1}}],["one",{"2":{"0":10,"11":16,"20":2,"21":1,"43":2,"68":1,"70":2,"71":1,"85":3,"105":1,"107":2,"109":2,"112":1,"115":1,"125":1,"127":1,"128":4,"132":1,"135":2,"138":1,"155":1,"156":3}}],["only",{"2":{"0":3,"11":6,"19":1,"32":1,"42":1,"69":1,"85":1,"109":2,"112":1,"115":1,"125":1,"130":1,"155":2,"156":1}}],["on",{"0":{"38":1,"99":1},"2":{"0":6,"1":1,"11":17,"13":1,"16":1,"20":4,"23":1,"24":2,"40":2,"41":1,"43":3,"56":1,"66":3,"68":1,"70":3,"72":1,"84":1,"91":1,"105":1,"116":1,"120":2,"128":1,"135":3,"138":1,"140":1,"147":1,"150":1,"155":4,"156":2}}],["overloading",{"2":{"148":1}}],["overloaded",{"2":{"144":1,"145":1,"146":1,"147":1,"148":1,"149":2}}],["overlap",{"2":{"11":21,"35":6,"36":21,"155":1}}],["overhead",{"2":{"142":2}}],["oversampling",{"2":{"132":6,"135":1}}],["oversample",{"2":{"0":2,"11":2,"49":2,"132":1}}],["overviews",{"0":{"87":1}}],["overview",{"0":{"80":1},"2":{"73":1}}],["over",{"2":{"0":3,"11":6,"51":1,"85":2,"108":1,"135":1,"137":1,"156":1}}],["oriented",{"2":{"42":1}}],["originating",{"2":{"11":1,"155":2}}],["origins",{"2":{"11":6,"36":6}}],["ordered",{"2":{"11":8,"29":6,"30":6,"109":1,"155":2,"156":1}}],["order",{"2":{"11":9,"30":6,"40":2,"41":1,"120":1,"155":3}}],["organization",{"2":{"73":1,"87":1}}],["org",{"2":{"0":1,"11":1,"20":1,"72":1}}],["or",{"0":{"6":1},"2":{"0":9,"2":1,"3":1,"6":2,"7":1,"11":28,"13":2,"19":1,"20":3,"21":4,"23":1,"26":2,"32":1,"36":4,"41":1,"42":2,"43":4,"47":1,"53":1,"56":2,"57":1,"59":1,"60":1,"62":1,"63":1,"70":3,"71":4,"84":1,"85":1,"103":1,"120":5,"128":1,"138":7,"153":3,"155":2,"156":6}}],["official",{"2":{"84":1}}],["offers",{"2":{"9":1}}],["often",{"2":{"11":8,"36":6,"38":2,"138":1}}],["of",{"0":{"9":1,"111":1,"114":1,"117":1,"122":1},"1":{"118":1,"119":1,"120":1,"123":1,"124":1,"125":1},"2":{"0":100,"1":4,"2":2,"3":1,"4":3,"5":2,"6":1,"7":1,"8":3,"9":1,"10":3,"11":301,"13":4,"14":2,"15":1,"17":1,"18":2,"19":3,"20":20,"21":11,"26":4,"28":10,"30":14,"32":35,"34":17,"36":14,"38":8,"40":6,"41":33,"42":1,"43":12,"45":3,"49":3,"51":4,"56":3,"57":5,"59":7,"60":10,"62":7,"63":11,"66":17,"68":2,"69":3,"70":11,"71":11,"72":9,"73":2,"79":2,"81":1,"83":2,"84":1,"85":11,"94":1,"97":1,"100":1,"103":1,"105":5,"107":6,"108":3,"109":15,"112":2,"114":2,"115":2,"116":3,"118":13,"120":8,"125":2,"128":3,"135":14,"137":1,"138":15,"139":2,"145":1,"146":1,"147":1,"148":1,"149":1,"153":2,"155":48,"156":78}}],["i+1",{"2":{"85":1}}],["iconic",{"2":{"85":1}}],["icnlocalsearchoptimizer",{"2":{"135":3}}],["icngeneticoptimizer",{"2":{"135":4}}],["icnoptimizer",{"2":{"135":3}}],["icnconfig",{"2":{"135":4}}],["icns",{"2":{"109":1,"110":1,"113":1,"116":1,"121":1,"135":1}}],["icn=icn",{"2":{"0":1,"11":1}}],["icn",{"0":{"109":1},"2":{"0":23,"11":36,"60":2,"63":2,"109":7,"112":1,"115":1,"120":1,"125":1,"135":12}}],["io",{"2":{"41":2}}],["illustrate",{"2":{"24":1}}],["ignores",{"2":{"11":1,"36":1}}],["ignore",{"2":{"11":1,"36":1}}],["ignored",{"2":{"11":2,"35":1,"36":2}}],["i`",{"2":{"11":1,"57":1,"60":1,"63":1}}],["identity",{"2":{"11":14,"118":6,"120":4,"123":4}}],["identified",{"2":{"11":1}}],["id=1",{"2":{"11":3,"33":3,"34":3}}],["id=3",{"2":{"11":1,"33":1,"34":1}}],["id=nothing",{"2":{"11":4,"34":4}}],["ids",{"2":{"11":1,"68":1}}],["idparameterdomain",{"2":{"11":1,"68":1,"105":1}}],["id",{"2":{"11":1,"20":1,"33":3,"41":2,"43":1,"70":1,"155":2,"156":13}}],["i",{"2":{"0":3,"11":64,"36":4,"38":2,"57":10,"59":7,"60":8,"62":3,"63":8,"68":2,"85":4,"105":2,"107":2,"108":1,"109":2,"118":17,"132":2,"139":4,"149":8,"155":2,"156":1}}],["improving",{"2":{"156":1}}],["improve",{"2":{"94":1}}],["improvement",{"0":{"94":1},"2":{"156":1}}],["impact",{"2":{"91":1}}],["importance",{"2":{"73":1,"100":1}}],["import",{"2":{"15":1,"16":1,"25":1,"26":1}}],["implemented",{"2":{"16":2,"17":1}}],["implementing",{"0":{"13":1}}],["implements",{"2":{"8":1}}],["implement",{"2":{"0":1,"11":2,"13":1,"45":1,"56":1,"68":1,"105":1}}],["implementations",{"2":{"13":1}}],["implementation",{"2":{"0":2,"11":2,"45":2,"116":1}}],["immutable",{"2":{"0":1,"11":1,"62":1}}],["ith",{"2":{"11":1,"57":2,"60":1,"63":1,"68":1,"105":1}}],["its",{"2":{"0":3,"10":1,"11":5,"14":1,"41":1,"59":1,"62":1,"73":1,"75":1,"81":1,"83":1,"84":2,"85":1,"87":1,"107":2,"138":1,"156":2}}],["itself",{"2":{"0":1,"11":1}}],["iterate",{"2":{"156":1}}],["iterators",{"2":{"132":1}}],["iteration",{"2":{"0":2,"11":2,"156":8}}],["iterations",{"2":{"0":1,"11":1,"66":1,"156":3}}],["iter=100",{"2":{"0":2,"11":2}}],["iter",{"2":{"0":8,"11":8,"135":3,"156":1}}],["itvls",{"2":{"11":3,"59":3}}],["itv",{"2":{"0":2,"11":9,"56":2,"57":8,"59":2,"60":7,"62":2,"63":7,"68":3,"105":3,"139":2}}],["it",{"2":{"0":6,"3":1,"4":1,"5":1,"6":1,"8":1,"10":1,"11":65,"13":1,"16":2,"17":1,"19":1,"20":2,"23":1,"24":1,"25":1,"28":1,"32":2,"36":6,"38":2,"42":2,"55":1,"56":1,"68":8,"69":1,"72":2,"84":1,"85":4,"109":1,"117":1,"120":1,"122":1,"128":1,"135":1,"137":1,"138":1,"139":2,"143":1,"144":2,"145":1,"147":1,"153":1,"155":7,"156":6}}],["isa",{"2":{"132":1}}],["issue",{"2":{"105":1,"116":1}}],["isempty",{"2":{"0":1,"11":4,"47":1,"57":3}}],["is",{"0":{"75":1},"2":{"0":32,"1":1,"3":1,"4":1,"5":1,"6":5,"10":1,"11":161,"13":3,"15":1,"16":2,"19":1,"20":6,"21":6,"23":3,"24":1,"25":3,"28":9,"32":15,"34":10,"36":10,"38":5,"40":3,"41":9,"42":1,"43":3,"47":2,"55":1,"56":2,"57":5,"59":3,"60":4,"63":4,"66":7,"68":9,"69":1,"70":1,"71":6,"72":5,"84":1,"85":6,"105":2,"107":1,"109":7,"112":1,"115":1,"118":16,"120":4,"125":2,"128":4,"130":1,"135":5,"137":1,"138":2,"139":3,"143":1,"145":1,"148":2,"155":32,"156":17}}],["inner",{"2":{"135":1,"156":1}}],["initpkgs",{"2":{"145":2}}],["initialization",{"0":{"145":1}}],["initializes",{"2":{"11":1}}],["init",{"2":{"132":1}}],["inf",{"2":{"156":1}}],["info",{"2":{"25":2,"26":2,"29":12,"31":25,"33":23,"35":15,"155":2,"156":6}}],["information",{"2":{"0":1,"11":1,"19":2,"69":2,"84":1,"135":1,"155":1,"156":1}}],["infrastructure",{"2":{"12":1}}],["inputs",{"2":{"11":1}}],["input",{"2":{"11":6,"20":3,"41":1,"43":3,"70":3,"138":3,"143":1}}],["involves",{"2":{"3":1}}],["involving",{"2":{"2":1,"11":1,"120":1}}],["invalid",{"2":{"0":1,"11":3,"155":1}}],["inside",{"2":{"143":1,"146":1,"147":1}}],["inspired",{"2":{"20":1,"70":1}}],["instructions",{"2":{"88":1}}],["installing",{"2":{"88":1}}],["installation",{"0":{"88":1}}],["installed",{"2":{"84":1,"153":1}}],["install",{"2":{"84":1}}],["instantiated",{"2":{"4":1}}],["instantiation",{"0":{"4":1},"2":{"2":1,"4":1,"6":2,"11":9,"40":9,"155":2}}],["instances",{"2":{"84":1}}],["instance",{"2":{"0":1,"11":3,"20":1,"28":2,"41":4,"70":1,"128":1,"155":13,"156":2}}],["instead",{"2":{"0":3,"11":4,"20":1,"43":1,"70":1,"107":2,"128":1,"155":2,"156":1}}],["insertion",{"2":{"0":1,"11":1,"53":1,"155":1}}],["insert",{"2":{"0":1,"11":1,"53":1,"156":3}}],["introduce",{"2":{"76":1,"80":1,"87":1,"156":1}}],["introductory",{"2":{"73":1}}],["introduction",{"0":{"1":1,"126":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"127":1},"2":{"126":1}}],["into",{"0":{"78":1,"149":1},"1":{"79":1,"80":1,"81":1},"2":{"0":3,"11":6,"22":1,"41":1,"56":1,"90":1,"107":1,"109":1,"114":1,"128":1,"135":1,"148":1,"149":1,"156":1}}],["integration",{"0":{"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1},"1":{"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1}}],["integers",{"2":{"16":1}}],["integer",{"2":{"0":3,"11":5,"20":1,"32":1,"41":3,"43":1,"66":3,"70":1,"79":1,"138":1,"155":5}}],["intend",{"2":{"156":1}}],["intended",{"2":{"138":1}}],["intentionally",{"2":{"23":1}}],["intentional",{"2":{"23":1}}],["intention",{"0":{"23":1,"24":1},"1":{"24":1,"25":1},"2":{"22":1,"23":2,"24":2,"25":5,"26":3,"29":3,"31":4,"33":4,"35":2,"155":17}}],["intensional",{"2":{"11":1}}],["intension",{"2":{"11":2}}],["interoperability",{"2":{"42":1}}],["interdiction",{"2":{"41":2,"156":2}}],["interacting",{"0":{"19":1,"69":1},"1":{"20":1,"21":1,"70":1,"71":1,"72":1},"2":{"109":1}}],["interpreted",{"2":{"11":2,"16":1,"28":2,"155":1}}],["interpretable",{"2":{"0":1,"11":1,"109":1}}],["intersect",{"2":{"0":1,"11":2,"59":2,"62":1}}],["intersections",{"2":{"0":1,"11":2,"59":2,"62":1}}],["intersection",{"2":{"0":1,"11":1,"43":1}}],["internally",{"2":{"11":1,"107":1}}],["internals",{"2":{"1":1,"11":1,"66":1}}],["internal",{"0":{"10":1},"2":{"0":1,"10":1,"11":4,"41":2,"45":1,"56":1,"109":1,"156":4}}],["interval",{"2":{"0":1,"11":8,"18":3,"56":1,"57":2,"59":6,"60":2,"62":3,"63":2,"68":1,"105":1,"139":1}}],["intervalsfold",{"2":{"139":1}}],["intervals",{"2":{"0":2,"7":1,"11":11,"18":2,"56":2,"57":5,"59":5,"60":4,"62":2,"63":4,"65":2,"68":2,"105":2,"139":2}}],["interfaced",{"2":{"140":1,"150":1}}],["interfaces",{"2":{"55":1,"84":1,"137":1}}],["interface",{"0":{"13":1,"130":1},"2":{"0":1,"8":1,"11":4,"13":1,"21":1,"23":1,"25":1,"45":2,"56":1,"71":1,"84":2,"130":1,"137":1,"143":1,"155":4}}],["int",{"2":{"0":4,"11":35,"16":1,"20":1,"25":2,"26":2,"28":2,"29":5,"30":8,"31":12,"32":9,"33":8,"34":1,"35":6,"38":1,"41":11,"57":2,"60":2,"63":2,"66":1,"72":1,"85":1,"107":8,"132":2,"155":9,"156":30}}],["inc",{"2":{"156":6}}],["increment",{"2":{"156":3}}],["incremental",{"2":{"155":4}}],["increasing",{"2":{"11":10,"29":1,"30":10}}],["increase",{"2":{"0":1,"11":1,"53":1}}],["inception",{"2":{"14":1}}],["inclusive",{"2":{"11":3,"109":3}}],["include",{"2":{"155":1}}],["included",{"2":{"11":1,"155":1}}],["includes",{"2":{"0":2,"8":1,"11":3,"36":1,"120":1,"125":1}}],["incsert",{"2":{"0":1,"11":1,"53":2}}],["indice",{"2":{"156":1}}],["indices",{"2":{"156":6}}],["indicate",{"2":{"156":2}}],["indicates",{"2":{"0":2,"11":2,"41":1}}],["indicating",{"2":{"0":1,"11":1,"66":1}}],["individuals",{"2":{"135":1}}],["independently",{"2":{"156":1}}],["independent",{"2":{"11":1,"20":1,"43":1,"70":1,"156":1}}],["indexed",{"2":{"11":2,"34":2}}],["index",{"2":{"11":6,"20":1,"34":3,"38":2,"43":1,"70":1,"155":7,"156":1}}],["ind",{"2":{"0":1,"11":1,"53":1,"156":2}}],["in",{"0":{"19":1,"24":1,"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1,"69":1},"1":{"20":1,"21":1,"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1,"70":1,"71":1,"72":1},"2":{"0":28,"2":3,"4":1,"5":1,"7":1,"11":133,"12":2,"13":2,"14":1,"15":4,"16":2,"18":1,"19":1,"20":11,"21":1,"22":1,"23":2,"24":1,"25":6,"26":6,"29":8,"30":6,"31":17,"32":24,"33":12,"34":14,"35":8,"36":18,"38":6,"40":4,"41":9,"42":1,"43":4,"45":2,"47":1,"51":1,"53":1,"55":1,"56":4,"57":6,"59":3,"60":8,"62":5,"63":9,"68":1,"69":1,"70":7,"71":1,"72":4,"73":1,"75":1,"81":1,"84":1,"85":7,"100":1,"105":1,"107":2,"108":1,"109":7,"116":1,"118":1,"120":1,"123":2,"132":2,"135":3,"138":1,"139":3,"141":2,"143":1,"145":1,"146":1,"148":1,"149":5,"151":2,"153":1,"155":39,"156":16}}],["iff",{"2":{"0":2,"11":2,"120":1,"125":1}}],["if",{"2":{"0":10,"4":1,"6":1,"11":63,"13":1,"21":1,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"45":3,"56":1,"57":10,"60":9,"63":9,"68":2,"71":1,"84":1,"85":1,"105":2,"109":4,"128":4,"132":4,"135":1,"155":9,"156":14}}],["was",{"2":{"143":1,"156":1}}],["want",{"2":{"141":1,"151":1}}],["way",{"2":{"11":3,"12":1,"23":1,"25":1,"26":1,"55":1,"105":1,"141":1,"151":1,"155":1}}],["warning",{"2":{"2":1,"11":1,"41":1}}],["would",{"2":{"4":1,"11":1}}],["worse",{"2":{"156":3}}],["world",{"0":{"96":1},"2":{"73":1,"97":1}}],["work",{"2":{"21":1,"71":1}}],["works",{"2":{"0":1,"11":1,"143":1,"144":1}}],["word",{"2":{"0":1,"11":8,"28":2,"45":6,"68":2,"105":2,"155":1}}],["well",{"2":{"85":1}}],["welcome",{"0":{"73":1},"2":{"9":1}}],["weigths",{"2":{"41":1,"108":1,"109":1}}],["weighting",{"2":{"135":1}}],["weighted",{"2":{"11":1}}],["weight",{"2":{"0":1,"11":2,"41":1,"127":1}}],["weights",{"2":{"0":8,"11":18,"41":3,"109":6,"135":5}}],["weights=nothing",{"2":{"0":1,"11":1}}],["we",{"2":{"1":1,"2":1,"4":1,"14":1,"17":1,"18":1,"19":1,"20":1,"23":1,"24":1,"25":1,"47":1,"49":1,"51":1,"53":1,"69":1,"72":1,"84":4,"85":6,"105":1}}],["write",{"2":{"0":2,"11":2}}],["while",{"2":{"156":5}}],["which",{"2":{"0":1,"6":2,"11":6,"20":1,"28":2,"41":7,"57":1,"70":1,"85":1,"107":1,"109":1,"137":1,"143":1,"155":1}}],["why",{"0":{"83":1}}],["what",{"0":{"75":1},"2":{"11":1,"73":1,"85":1}}],["whole",{"2":{"0":1,"11":1,"156":1}}],["whether",{"2":{"2":1,"6":1,"11":4,"32":1,"36":1,"155":1}}],["where",{"2":{"0":6,"11":18,"13":1,"28":1,"32":1,"38":2,"41":1,"56":5,"57":5,"59":5,"60":4,"62":5,"63":4,"68":2,"96":1,"105":2,"132":1,"138":1,"155":8,"156":69}}],["when",{"2":{"0":2,"1":1,"11":21,"41":1,"47":2,"85":1,"118":8,"120":2,"135":2,"138":1,"155":1,"156":2}}],["wip",{"2":{"137":1}}],["wikipedia",{"2":{"41":2,"85":1}}],["wide",{"2":{"8":1,"11":1,"28":1,"155":1}}],["width",{"2":{"0":2,"11":2,"20":2,"72":2}}],["width=150",{"2":{"0":1,"11":1,"20":1,"72":1}}],["will",{"2":{"0":7,"1":1,"11":8,"12":1,"16":1,"17":1,"20":1,"43":1,"72":1,"84":2,"85":1,"109":1,"112":1,"115":1,"125":1,"128":1,"135":1,"140":1,"150":1,"155":2}}],["without",{"2":{"11":17,"18":1,"118":8}}],["within",{"2":{"11":8,"12":1,"13":1,"28":2,"42":1,"69":1,"84":1,"87":1,"110":1,"113":1,"116":1,"121":1,"155":6,"156":1}}],["with",{"0":{"19":1,"69":1,"82":1,"131":1},"1":{"20":1,"21":1,"70":1,"71":1,"72":1,"83":1,"84":1,"85":1,"132":1,"133":1},"2":{"0":11,"2":1,"4":1,"5":1,"8":1,"9":1,"11":58,"16":1,"17":1,"20":5,"28":4,"36":3,"41":8,"43":1,"45":1,"59":1,"66":1,"68":1,"70":1,"72":4,"77":1,"85":5,"88":1,"107":2,"109":4,"118":8,"120":3,"125":1,"135":3,"138":2,"139":1,"140":1,"142":1,"144":1,"145":1,"150":1,"152":1,"155":6,"156":8}}],["w",{"2":{"0":2,"11":4,"45":2,"68":2,"105":2,"109":2,"135":2}}],["ds",{"2":{"135":2}}],["df",{"2":{"132":24,"135":2}}],["due",{"2":{"84":1}}],["during",{"2":{"11":1,"49":1,"109":2}}],["d1",{"2":{"15":1,"16":1,"18":1}}],["datatype",{"2":{"156":1}}],["dataframe",{"2":{"132":2,"135":1}}],["data",{"2":{"11":2,"120":2,"156":1}}],["draw",{"2":{"11":1,"57":2,"60":1,"63":1,"68":1,"105":1,"156":5}}],["done",{"2":{"148":1}}],["download",{"2":{"84":1}}],["doesn",{"2":{"11":3,"138":1}}],["does",{"2":{"11":9,"36":2,"155":4}}],["documenter",{"2":{"105":10,"107":1,"108":1,"109":1,"118":2,"119":6,"123":4,"124":4,"125":1}}],["documentation",{"2":{"1":1,"41":1,"84":1,"106":1,"134":1,"135":1,"136":1,"138":1,"140":1,"150":1,"155":1,"156":1}}],["docstring",{"2":{"105":20,"107":2,"108":2,"109":2,"118":4,"119":12,"123":8,"124":8,"125":2,"155":23,"156":29}}],["doc",{"2":{"2":1}}],["do",{"2":{"0":1,"11":6,"36":4,"120":1}}],["domath",{"2":{"141":1,"151":1}}],["domains",{"0":{"12":1,"14":1,"17":1,"18":1,"55":1},"1":{"13":1,"14":1,"15":2,"16":2,"17":2,"18":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1},"2":{"0":27,"5":2,"7":2,"11":34,"12":3,"13":1,"14":1,"16":1,"17":1,"18":2,"41":1,"55":2,"56":4,"57":3,"59":9,"60":2,"62":7,"63":2,"65":2,"66":10,"68":1,"76":1,"105":3,"132":11,"135":2,"156":3}}],["domain",{"0":{"7":1},"2":{"0":34,"7":1,"11":47,"13":7,"15":4,"16":3,"18":3,"32":1,"41":1,"56":19,"57":1,"59":12,"60":1,"62":15,"63":1,"66":2,"68":9,"85":1,"105":1,"128":4,"135":3,"156":20}}],["dom",{"2":{"0":4,"11":8,"132":4,"135":2}}],["d₂",{"2":{"0":2,"11":2,"59":2,"62":2}}],["d₁",{"2":{"0":2,"11":2,"59":2,"62":2}}],["d5",{"2":{"0":1,"11":1,"56":1,"59":1,"62":1}}],["d4",{"2":{"0":1,"11":1,"15":1,"56":1,"59":1,"62":1}}],["d3",{"2":{"0":1,"11":1,"15":1,"18":1,"56":1,"59":1,"62":1}}],["d2",{"2":{"0":1,"11":1,"15":1,"16":1,"18":1,"56":1,"59":1,"62":1}}],["dynamic",{"2":{"0":1,"11":3,"13":1,"16":1,"41":1,"56":1,"59":1,"120":1,"156":11}}],["dir",{"2":{"139":4,"141":1,"151":1}}],["directions",{"0":{"103":1},"2":{"11":1,"120":1}}],["directed",{"2":{"11":1,"28":1,"155":1}}],["directly",{"2":{"11":1,"23":1,"25":1,"155":1}}],["direct",{"2":{"10":1}}],["digits",{"2":{"85":2}}],["dive",{"0":{"78":1},"1":{"79":1,"80":1,"81":1},"2":{"90":1}}],["differs",{"0":{"77":1}}],["different",{"2":{"0":4,"2":1,"10":1,"11":29,"20":4,"21":1,"23":1,"24":6,"25":3,"26":2,"29":5,"30":8,"41":1,"43":1,"70":2,"71":1,"72":2,"84":1,"85":1,"120":3,"137":1,"139":1,"155":1,"156":1}}],["difference",{"2":{"0":2,"11":12,"20":1,"51":2,"56":1,"59":1,"62":1,"70":1}}],["diff",{"2":{"11":4,"123":1,"124":1}}],["dim=2",{"2":{"11":2,"33":2,"34":2}}],["dim=1",{"2":{"11":2,"34":2}}],["dimparameterdomain",{"2":{"11":1,"68":1,"105":1}}],["dimensions",{"2":{"11":1,"68":1}}],["dimension",{"2":{"11":1,"20":1,"43":1,"70":1,"155":5,"156":1}}],["dim",{"2":{"11":3,"20":1,"33":1,"35":1,"36":2,"43":1,"70":1,"132":3,"155":7,"156":4}}],["dictionaries",{"0":{"53":1},"1":{"54":1},"2":{"42":1,"53":1}}],["dictionaryview",{"2":{"156":1}}],["dictionary",{"2":{"0":8,"11":18,"20":5,"41":3,"43":1,"53":1,"72":5,"120":2,"137":1,"138":1,"139":1,"144":2,"146":1,"147":1,"156":6}}],["dict=usual",{"2":{"0":1,"11":1,"43":1}}],["dict",{"2":{"0":8,"11":12,"20":5,"28":4,"43":3,"72":5,"138":1,"139":1,"141":1,"144":2,"146":3,"147":3,"148":3,"151":1}}],["discuss",{"2":{"83":1,"91":1,"100":1}}],["discreteset",{"2":{"15":8,"25":1,"26":1,"155":6}}],["discretedomain",{"2":{"0":3,"11":7,"56":1,"57":3,"59":1,"60":3,"62":4,"63":3,"68":1,"105":1,"132":1}}],["discrete",{"0":{"14":1,"62":1},"1":{"15":1,"16":1,"17":1,"63":1,"64":1},"2":{"0":5,"7":1,"11":5,"12":1,"13":1,"14":2,"16":1,"55":1,"56":1,"59":1,"62":4,"135":1,"155":5,"156":1}}],["displays",{"2":{"41":1}}],["display",{"2":{"41":13}}],["dispatch",{"2":{"11":1,"120":1,"135":1,"156":2}}],["distributed",{"2":{"156":1}}],["distdifferent",{"2":{"25":3,"26":3,"155":1}}],["distinct",{"2":{"11":2,"32":2,"85":2,"155":1}}],["dist",{"2":{"11":5,"23":1,"24":6,"25":3,"26":2,"156":1}}],["distances",{"2":{"11":1,"24":2,"41":4,"155":1}}],["distance",{"2":{"0":5,"11":8,"13":1,"41":1,"56":2,"59":1,"62":1,"108":1,"155":3,"156":1}}],["diagrams",{"2":{"11":1,"45":2}}],["diagram",{"2":{"0":1,"11":5,"28":4,"45":1,"155":1}}],["d",{"2":{"0":22,"11":54,"13":7,"28":4,"53":1,"56":14,"57":29,"59":7,"60":23,"62":9,"63":26,"65":1,"68":12,"105":11,"132":2,"135":2,"139":3,"147":2,"148":2,"156":9}}],["deepcopy",{"2":{"156":1}}],["deeper",{"2":{"90":1}}],["debugging",{"2":{"156":1}}],["debinarize",{"2":{"0":1,"11":1,"128":1}}],["deprecated",{"2":{"155":1}}],["dependencies",{"2":{"139":1}}],["depending",{"2":{"84":1,"138":1}}],["depend",{"2":{"11":1,"120":1}}],["depends",{"2":{"0":1,"11":1,"13":1,"56":1,"156":1}}],["devops",{"2":{"138":2,"139":1}}],["develop",{"2":{"138":1}}],["developers",{"2":{"42":1}}],["development",{"2":{"42":1,"138":1}}],["developing",{"2":{"1":1}}],["dedicated",{"2":{"24":1}}],["descent",{"0":{"132":1},"2":{"135":1}}],["description",{"2":{"0":2,"11":3,"20":1,"24":1,"72":1,"155":12,"156":10}}],["descriptions",{"2":{"0":4,"11":4,"20":4,"72":4}}],["describes",{"2":{"41":1}}],["described",{"2":{"20":1,"70":1}}],["describe",{"2":{"0":2,"11":3,"20":4,"43":1,"70":2,"72":2,"110":1,"113":1,"116":1,"121":1,"132":1,"156":3}}],["design",{"2":{"19":1,"69":1}}],["designed",{"2":{"19":1,"23":1,"25":1,"42":1,"69":1,"137":1}}],["details",{"2":{"105":10,"107":1,"108":1,"109":1,"118":2,"119":6,"123":4,"124":4,"125":1}}],["detailed",{"2":{"12":1}}],["determining",{"2":{"13":1}}],["deterministic",{"2":{"0":1,"11":1,"45":1}}],["determine",{"2":{"0":1,"11":2}}],["determined",{"2":{"0":1,"11":1,"66":1,"156":1}}],["denotes",{"2":{"11":2}}],["decrement",{"2":{"156":1}}],["decrease",{"2":{"156":2}}],["decreasing",{"2":{"11":8,"30":8}}],["decay",{"2":{"156":3}}],["declare",{"2":{"11":1,"155":1}}],["decision",{"2":{"0":1,"11":3,"28":1,"45":3,"155":1}}],["derived",{"2":{"11":1,"155":1}}],["delta",{"2":{"156":6}}],["delegates",{"2":{"11":1,"120":1}}],["delete",{"2":{"0":4,"11":5,"13":1,"56":1,"63":3,"156":13}}],["delineation",{"2":{"11":2,"155":1}}],["definition",{"0":{"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1},"1":{"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1},"2":{"3":1,"4":1,"5":1,"6":1,"11":1,"19":1,"69":1}}],["defining",{"0":{"12":1,"24":1,"55":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1},"2":{"0":1,"11":1,"13":1,"20":1,"23":1,"25":1,"72":1,"155":2}}],["defines",{"2":{"0":1,"11":2,"25":1,"26":1,"59":1,"62":1,"109":1,"155":1}}],["define",{"2":{"0":2,"11":6,"12":1,"20":1,"23":1,"24":2,"26":1,"55":1,"72":1,"75":1,"85":1,"155":1}}],["defined",{"0":{"7":1,"28":1},"2":{"0":2,"7":1,"11":9,"12":1,"16":1,"20":1,"23":3,"26":3,"32":1,"56":1,"62":1,"72":1,"85":2,"118":1,"123":1,"135":2,"138":1,"142":1,"152":1,"155":4,"156":1}}],["default",{"0":{"144":1},"2":{"0":14,"11":21,"17":1,"20":3,"21":1,"32":1,"41":9,"43":3,"57":1,"66":5,"71":1,"72":3,"128":1,"130":1,"135":4,"138":3,"142":9,"144":2,"152":1,"156":2}}],["defaults",{"2":{"0":2,"11":8,"30":1,"43":1,"53":1,"135":2}}],["mts",{"2":{"156":7}}],["myperfextension",{"2":{"144":1,"145":1,"146":1,"147":1,"148":1}}],["mypackagename",{"2":{"138":1}}],["mkpath",{"2":{"139":1}}],["mmds",{"2":{"45":1}}],["might",{"2":{"85":2}}],["mission",{"2":{"73":1}}],["missing",{"2":{"25":1,"26":1,"105":20,"107":2,"108":2,"109":2,"118":4,"119":12,"123":8,"124":8,"125":2}}],["minor",{"2":{"138":2}}],["min",{"2":{"132":2,"155":1}}],["mincut",{"2":{"41":1,"156":2}}],["minus",{"2":{"11":28,"118":2,"119":2,"120":4,"123":2,"124":2}}],["minkowski",{"2":{"0":1,"11":1,"108":1}}],["minimization",{"2":{"155":1}}],["minimizing",{"2":{"41":1}}],["minimum",{"2":{"0":1,"11":12,"33":6,"34":11,"41":1,"51":1,"132":2,"155":4}}],["minimal",{"2":{"0":3,"11":4,"16":1,"45":2,"107":1,"108":1,"156":3}}],["move",{"2":{"156":3}}],["moved",{"2":{"105":1}}],["mode",{"2":{"155":1}}],["modeled",{"2":{"156":1}}],["modeler",{"2":{"41":13}}],["modellike",{"2":{"155":2}}],["modelize",{"2":{"41":1}}],["modeling",{"0":{"1":1,"93":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1},"2":{"9":1,"23":1,"25":1,"84":2,"85":1}}],["model",{"0":{"85":1},"2":{"11":3,"15":1,"16":1,"25":7,"26":7,"28":1,"29":19,"31":36,"33":28,"35":18,"41":14,"85":3,"155":45,"156":75}}],["models",{"0":{"9":1,"92":1},"1":{"93":1,"94":1},"2":{"1":1,"9":3,"11":1,"12":1,"13":1,"85":1,"93":1,"94":1,"120":1}}],["modules=",{"2":{"134":1}}],["module",{"0":{"57":1,"60":1,"63":1},"2":{"11":1}}],["more",{"2":{"9":1,"11":2,"16":1,"138":1}}],["moisupports",{"2":{"155":1}}],["moisum",{"2":{"155":1}}],["moiregular",{"2":{"155":1}}],["moiordered",{"2":{"155":1}}],["moinooverlap",{"2":{"155":1}}],["moinvalues",{"2":{"155":1}}],["moimultivalueddecisiondiagram",{"2":{"155":1}}],["moiminimum",{"2":{"155":1}}],["moimaximum",{"2":{"155":1}}],["moiintention",{"2":{"155":17}}],["moiinstantiation",{"2":{"155":1}}],["moiextension",{"2":{"155":1}}],["moierror",{"2":{"155":5}}],["moielement",{"2":{"155":1}}],["moidistdifferent",{"2":{"155":1}}],["moicumulative",{"2":{"155":1}}],["moiconflicts",{"2":{"155":1}}],["moiallequal",{"2":{"155":1}}],["moialldifferent",{"2":{"155":1}}],["moi",{"2":{"1":1,"12":1,"15":10,"16":8,"18":3,"25":5,"26":5,"29":3,"31":4,"33":4,"35":2,"41":1,"55":1,"155":38}}],["mostly",{"2":{"149":1}}],["most",{"2":{"0":1,"8":1,"10":1,"11":5,"31":6,"32":4,"55":1,"85":1,"128":1,"155":1}}],["memory",{"2":{"142":2}}],["membership",{"2":{"13":1}}],["means",{"2":{"11":5,"31":1,"34":2}}],["meaningful",{"2":{"100":1}}],["meaning",{"2":{"11":2,"32":2,"109":1}}],["measurement",{"2":{"156":1}}],["measure",{"2":{"0":2,"11":2}}],["meets",{"2":{"2":1}}],["metasolver",{"2":{"156":4}}],["metastrategist",{"0":{"136":1},"2":{"136":1}}],["metaheuristics",{"0":{"80":1},"2":{"77":1}}],["metrics",{"0":{"108":1},"2":{"137":1,"139":1}}],["metric=hamming",{"2":{"0":1,"11":1,"135":1}}],["metric",{"2":{"0":8,"11":8,"135":6}}],["methods",{"0":{"95":1},"1":{"96":1,"97":1},"2":{"0":3,"2":1,"11":4,"13":2,"20":1,"42":2,"45":1,"56":1,"68":1,"72":1,"77":1,"105":1,"107":2,"156":3}}],["method",{"2":{"0":55,"11":171,"21":1,"41":16,"43":1,"45":1,"56":1,"57":3,"59":1,"60":3,"62":1,"63":3,"71":1,"109":1,"118":8,"130":2,"135":26,"144":1,"145":2,"146":2,"147":1,"148":2,"149":1,"153":3,"155":24,"156":128}}],["merge",{"2":{"0":2,"11":2,"59":2,"62":2,"156":1}}],["mutable",{"2":{"156":2}}],["mutually",{"2":{"0":3,"11":4,"109":1,"112":1,"115":1,"125":1,"135":1}}],["much",{"2":{"21":1,"71":1}}],["must",{"2":{"0":2,"3":2,"11":8,"13":2,"23":1,"26":2,"28":2,"32":2,"41":2,"56":1,"62":1,"155":7}}],["multithreading",{"2":{"156":1}}],["multithreaded",{"2":{"156":1}}],["multiplied",{"2":{"41":1}}],["multiplication",{"2":{"0":1,"11":1,"47":1}}],["multimedia",{"2":{"41":4}}],["multi",{"2":{"11":1,"28":1,"155":1}}],["multivalued",{"2":{"0":1,"11":2,"45":3}}],["magic",{"2":{"41":2}}],["major",{"2":{"21":1,"71":1,"105":1,"138":2,"153":2}}],["machinery",{"2":{"19":1,"69":1}}],["macro",{"2":{"0":2,"11":6,"20":2,"72":2,"116":1,"137":1,"139":1,"144":1,"155":1}}],["makie",{"2":{"137":1,"138":1}}],["making",{"2":{"17":1}}],["make",{"2":{"11":8,"49":1,"116":2,"120":3,"125":1,"132":2,"135":3,"139":1,"156":1}}],["makes",{"2":{"6":1}}],["may",{"2":{"17":1}}],["map",{"2":{"11":1,"107":1,"132":5,"156":4}}],["mapping",{"2":{"11":1,"120":1}}],["marks",{"2":{"11":2,"24":2,"41":1,"155":2}}],["matter",{"2":{"138":1,"155":1}}],["matters",{"2":{"104":1}}],["matrices",{"0":{"21":1,"71":1,"129":1},"1":{"130":1,"131":1,"132":1,"133":1},"2":{"11":1,"21":1,"71":1,"130":1,"135":1}}],["matrix",{"2":{"0":1,"11":2,"41":4,"127":2,"135":2}}],["match",{"2":{"11":3,"155":2}}],["matches",{"2":{"11":3,"155":2}}],["mathoptinterface",{"2":{"1":1,"15":1,"16":1,"25":1,"26":1,"41":2,"155":17}}],["mathematical",{"0":{"81":1},"2":{"1":1,"2":1,"3":1,"81":1}}],["maths",{"2":{"0":1,"11":1}}],["mainsolver",{"2":{"155":1,"156":7}}],["mainly",{"2":{"11":1,"12":1,"17":1}}],["main",{"0":{"147":1},"2":{"0":1,"11":1,"20":1,"22":1,"70":1,"137":1,"144":1,"145":1,"155":1,"156":5}}],["manages",{"2":{"156":1}}],["manage",{"2":{"156":1}}],["managed",{"2":{"156":1}}],["manager",{"2":{"84":1}}],["manipulating",{"2":{"109":1}}],["manipulation",{"2":{"11":1,"19":1,"69":1,"120":1}}],["manhattan",{"2":{"0":1,"11":1,"108":1}}],["many",{"2":{"0":1,"11":1,"49":1,"138":1}}],["max",{"2":{"0":4,"11":8,"66":4,"107":2,"109":2,"155":1,"156":10}}],["maximum",{"2":{"0":5,"11":16,"33":5,"34":11,"51":1,"56":1,"59":1,"62":1,"66":2,"155":4,"156":6}}],["m",{"2":{"0":2,"11":2,"15":5,"16":3,"41":6,"43":2,"85":5,"156":139}}],["mddconstraint",{"2":{"155":2}}],["mdd",{"2":{"0":2,"11":16,"20":1,"28":12,"43":1,"45":3,"68":1,"70":1,"105":1,"155":2}}],["mdash",{"2":{"0":74,"11":187,"13":1,"20":5,"21":2,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"41":18,"43":2,"45":6,"47":3,"49":1,"51":1,"53":1,"56":6,"57":5,"59":8,"60":4,"62":10,"63":5,"65":2,"66":3,"68":13,"70":1,"71":2,"72":4,"105":3,"107":6,"108":3,"109":11,"111":2,"112":1,"114":2,"115":1,"118":9,"120":2,"123":1,"125":1,"127":2,"128":3,"130":2,"135":28,"153":4,"155":72,"156":144}}],["fetch",{"2":{"156":1}}],["feasible",{"2":{"85":2}}],["feature",{"2":{"21":1,"42":1,"71":1,"143":1}}],["features",{"0":{"127":1},"2":{"8":1,"12":1,"19":1,"55":1,"69":1,"87":1,"105":1,"137":1}}],["f2",{"2":{"156":2}}],["future",{"0":{"103":1},"2":{"43":1}}],["further",{"2":{"41":1,"84":1}}],["fundamentals",{"2":{"81":1}}],["fundamental",{"2":{"11":1,"155":1}}],["func",{"2":{"156":6}}],["funcs",{"2":{"0":2,"11":2,"107":2}}],["functionalities",{"2":{"10":1,"13":1}}],["functioning",{"2":{"10":1}}],["functions",{"0":{"21":1,"71":1},"2":{"0":2,"11":8,"41":1,"42":1,"109":3,"120":4,"125":1,"143":1,"149":2}}],["function",{"2":{"0":31,"11":67,"20":4,"21":7,"23":1,"28":3,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"41":1,"43":2,"45":2,"47":3,"49":2,"51":1,"53":2,"56":4,"57":5,"59":6,"60":4,"62":7,"63":5,"65":2,"66":3,"68":4,"71":7,"72":4,"85":1,"105":3,"107":12,"108":3,"109":9,"111":2,"112":1,"114":2,"115":1,"116":1,"118":10,"120":6,"123":2,"125":1,"127":2,"128":3,"130":1,"132":7,"135":4,"149":1,"153":1,"155":30,"156":18}}],["full",{"0":{"11":1}}],["faster",{"2":{"156":1}}],["facilities",{"2":{"41":6}}],["facilitate",{"2":{"19":1,"42":1,"69":1}}],["facilitates",{"2":{"11":1,"120":1}}],["fake",{"2":{"11":1,"68":1,"105":1}}],["fakeautomaton",{"2":{"11":5,"45":2,"57":2,"60":1,"63":1,"68":5,"105":4}}],["fa",{"2":{"11":3,"45":1,"57":4,"60":2,"63":2,"68":3,"105":3}}],["fails",{"2":{"2":1}}],["fallback",{"2":{"0":1,"11":4,"56":1,"57":2,"59":1,"60":2,"62":1,"63":2}}],["false",{"2":{"0":5,"6":1,"11":31,"18":1,"25":1,"26":1,"29":4,"30":3,"31":4,"32":4,"33":9,"34":10,"36":2,"38":1,"40":1,"45":1,"47":1,"49":1,"57":2,"60":2,"63":2,"68":1,"105":1,"125":1,"132":3,"155":4,"156":2}}],["fraction",{"2":{"149":1}}],["framework",{"2":{"1":1,"10":1}}],["front",{"2":{"116":1}}],["from",{"0":{"28":1,"77":1,"97":1},"2":{"0":2,"4":1,"8":1,"11":14,"20":1,"28":1,"41":2,"57":4,"60":2,"63":3,"68":2,"72":1,"73":1,"85":2,"97":1,"105":3,"120":2,"130":1,"135":1,"137":1,"139":4,"146":1,"147":1,"148":1,"149":1,"155":6,"156":17}}],["free",{"2":{"41":1}}],["friendly",{"2":{"8":1}}],["filter",{"2":{"132":1}}],["filled",{"2":{"85":1}}],["fill",{"2":{"41":4,"85":1}}],["file",{"2":{"0":7,"11":7,"109":1}}],["finally",{"2":{"21":1,"71":1}}],["finer",{"2":{"21":1,"71":1}}],["finds",{"2":{"153":1}}],["find",{"2":{"20":1,"70":1,"156":2}}],["finish",{"2":{"11":2,"28":2}}],["finishes",{"2":{"11":8,"36":8}}],["first",{"0":{"85":1},"2":{"11":15,"28":1,"31":1,"34":2,"36":8,"85":1,"132":4,"135":1,"138":4,"153":1,"155":1,"156":1}}],["fields",{"2":{"0":1,"11":1,"155":1}}],["flatten",{"2":{"132":1}}],["flexibility",{"2":{"84":1}}],["flexible",{"2":{"0":4,"1":1,"11":6,"26":1,"66":3,"120":1}}],["flows",{"2":{"41":1}}],["flow",{"2":{"41":1}}],["float64",{"2":{"11":2,"132":1,"155":1,"156":5}}],["floor",{"2":{"0":2,"11":2,"66":2}}],["folder",{"2":{"139":2}}],["fold",{"2":{"139":1}}],["follwing",{"2":{"137":1}}],["follows",{"2":{"85":1,"138":1,"155":1}}],["follow",{"2":{"43":1}}],["following",{"2":{"0":6,"2":1,"11":8,"13":1,"32":1,"49":1,"56":1,"107":2,"120":1,"128":1,"139":1,"141":1,"151":1,"156":1}}],["found",{"2":{"109":1}}],["foundational",{"2":{"42":1}}],["foundation",{"2":{"13":1}}],["foreseeable",{"2":{"43":1}}],["forwarded",{"2":{"156":1}}],["forward",{"2":{"41":2,"85":1}}],["forbidden",{"2":{"11":1,"41":1,"155":2}}],["formulating",{"2":{"97":1}}],["form",{"2":{"11":2,"38":2}}],["formal",{"2":{"3":1,"156":1}}],["formatted",{"2":{"0":1,"11":2,"107":1}}],["format",{"2":{"0":2,"11":3,"20":1,"41":9,"43":1,"56":1,"70":1,"128":1}}],["for",{"0":{"82":1,"109":1,"128":1},"1":{"83":1,"84":1,"85":1},"2":{"0":13,"1":3,"5":1,"6":1,"9":1,"10":1,"11":54,"12":1,"13":5,"16":2,"17":1,"20":1,"21":2,"23":1,"24":1,"25":2,"26":2,"29":2,"31":1,"33":1,"34":4,"36":6,"41":12,"43":1,"45":3,"47":1,"53":1,"56":3,"57":3,"59":2,"60":3,"62":2,"63":3,"65":2,"66":2,"68":2,"70":1,"71":2,"83":1,"84":3,"85":2,"88":1,"93":1,"103":1,"105":21,"106":1,"107":4,"108":2,"109":4,"118":5,"119":12,"120":5,"123":9,"124":8,"125":2,"127":1,"128":2,"130":1,"132":2,"134":1,"135":8,"136":1,"137":3,"138":5,"139":5,"143":2,"144":1,"146":2,"147":1,"149":5,"153":1,"155":14,"156":18}}],["f",{"2":{"0":14,"11":16,"21":6,"45":1,"49":2,"71":5,"107":6,"155":40,"156":7}}],["t2",{"2":{"155":4}}],["t1",{"2":{"155":3}}],["tbw",{"2":{"135":4,"156":2}}],["tutorial",{"0":{"139":1}}],["tutorials",{"0":{"98":1,"99":1},"1":{"99":1,"100":1},"2":{"99":1}}],["tuples",{"2":{"11":6,"26":2,"155":4}}],["tuple",{"2":{"0":6,"11":18,"34":7,"36":1,"41":2,"56":5,"59":5,"62":5,"66":1,"138":1,"155":9}}],["tips",{"2":{"93":1}}],["timelimitsec",{"2":{"155":1}}],["time",{"2":{"11":10,"36":8,"41":1,"109":2,"120":1,"142":2,"149":1,"155":1,"156":27}}],["timestamps",{"2":{"156":1}}],["times",{"2":{"11":3,"31":1,"32":3,"139":2,"149":3}}],["temporary",{"2":{"156":1}}],["templates",{"2":{"9":1}}],["tests",{"2":{"138":1}}],["tested",{"0":{"147":1},"2":{"138":1,"146":1}}],["test",{"2":{"132":6,"135":2,"137":1,"138":2}}],["testing",{"0":{"148":1},"2":{"11":1,"135":1,"137":1,"139":2,"144":1,"147":1,"148":1}}],["text",{"2":{"110":1,"113":1,"116":1,"121":1}}],["teach",{"2":{"94":1}}],["techniques",{"0":{"77":1,"89":1},"1":{"90":1,"91":1}}],["tendency",{"2":{"41":1}}],["terminology",{"0":{"2":1,"76":1},"1":{"3":1,"4":1,"5":1,"6":1},"2":{"2":1}}],["tr",{"2":{"11":58,"107":3,"118":29,"119":6}}],["try",{"2":{"2":1,"84":1,"132":1}}],["track",{"2":{"142":1,"144":1,"152":1}}],["transpose",{"2":{"132":3}}],["transported",{"2":{"41":1}}],["transforms",{"2":{"11":4,"120":4}}],["transform",{"2":{"0":1,"11":1,"128":1}}],["transformations",{"0":{"116":1,"117":1},"1":{"117":1,"118":2,"119":2,"120":2},"2":{"0":3,"11":16,"117":1,"120":15,"125":1}}],["transformation",{"2":{"0":4,"11":12,"116":3,"120":8}}],["train",{"2":{"0":2,"11":3,"130":3,"132":5,"135":2}}],["training",{"2":{"0":1,"11":1,"135":7}}],["true",{"2":{"0":4,"6":1,"11":28,"18":1,"25":1,"26":1,"29":4,"30":3,"31":10,"32":4,"33":5,"34":6,"35":1,"36":2,"38":1,"40":1,"45":3,"47":1,"49":1,"57":2,"60":2,"63":2,"68":1,"105":1,"109":1,"135":1,"139":1,"144":1,"152":1,"155":6,"156":3}}],["tag",{"2":{"138":1}}],["tags",{"2":{"138":2,"139":1}}],["tackle",{"2":{"105":1}}],["tabu",{"2":{"80":1,"156":46}}],["table",{"0":{"149":1},"2":{"0":4,"11":4,"20":4,"72":4,"132":1,"148":2,"149":4}}],["task",{"2":{"11":16,"36":16}}],["tasks",{"2":{"11":18,"36":18,"155":1,"156":1}}],["target",{"2":{"11":1,"20":1,"43":1,"70":1}}],["targeted",{"2":{"0":2,"11":2,"66":1,"84":1,"156":3}}],["taken",{"2":{"139":1}}],["takes",{"2":{"11":4,"40":2,"155":1}}],["take",{"2":{"0":1,"11":1,"20":1,"72":1,"85":1,"138":1}}],["two",{"2":{"0":3,"3":1,"11":11,"22":1,"26":1,"34":2,"36":4,"41":1,"45":1,"56":1,"59":3,"62":3,"155":1}}],["thus",{"2":{"41":1}}],["those",{"2":{"19":1,"20":1,"21":1,"69":1,"70":1,"71":1,"109":1}}],["th",{"2":{"11":1,"109":1}}],["throw",{"2":{"132":1}}],["through",{"2":{"7":1,"11":3,"12":1,"21":2,"23":3,"25":2,"55":1,"71":2,"84":3,"97":1,"111":2,"114":1,"135":2}}],["threads",{"2":{"138":2,"142":1,"144":1,"152":1,"156":12}}],["three",{"2":{"14":1}}],["threshold",{"2":{"11":1,"120":1}}],["third",{"2":{"11":2,"34":2}}],["this",{"2":{"0":1,"1":1,"2":1,"3":1,"6":1,"9":1,"11":16,"12":1,"17":1,"21":3,"24":1,"28":2,"29":2,"33":1,"34":2,"36":2,"41":1,"43":1,"55":1,"71":3,"85":2,"105":1,"109":2,"120":1,"138":2,"139":2,"140":1,"141":1,"142":1,"143":1,"144":2,"145":2,"146":2,"147":1,"150":1,"151":1,"152":1,"155":8,"156":3}}],["than",{"2":{"6":1,"9":1,"11":11,"23":1,"118":5,"120":1,"155":1}}],["that",{"2":{"0":16,"3":3,"11":101,"12":1,"13":1,"20":2,"21":1,"23":4,"24":2,"25":1,"26":4,"28":5,"29":2,"30":7,"32":11,"33":1,"34":14,"36":12,"38":2,"40":4,"41":2,"42":1,"43":2,"56":2,"57":2,"59":1,"60":2,"62":3,"63":2,"70":1,"71":1,"72":1,"73":1,"84":1,"85":6,"107":2,"109":3,"112":1,"115":1,"120":3,"125":2,"127":1,"135":3,"137":1,"143":1,"149":1,"155":33,"156":10}}],["theory",{"0":{"97":1}}],["they",{"2":{"23":3,"26":3,"41":1,"90":1,"102":1}}],["these",{"2":{"11":1,"13":1,"23":1,"26":2,"43":1,"149":1}}],["there",{"2":{"11":2,"28":1,"41":3,"143":1,"149":1,"155":1}}],["them",{"2":{"11":1,"155":1,"156":1}}],["then",{"2":{"4":1,"11":2,"24":1,"156":2}}],["their",{"0":{"90":1},"2":{"3":1,"5":1,"7":1,"11":1,"12":2,"18":1,"20":1,"70":1,"84":1,"85":1,"91":1,"120":1,"137":1,"142":1,"144":1,"152":1}}],["the",{"0":{"13":1,"102":1,"144":1,"149":1},"2":{"0":144,"1":1,"2":3,"3":2,"4":5,"5":2,"6":7,"8":1,"9":2,"10":2,"11":479,"12":4,"13":8,"14":1,"19":5,"20":35,"21":17,"22":1,"23":6,"24":9,"25":6,"26":5,"28":17,"29":2,"30":10,"31":1,"32":41,"33":1,"34":25,"36":33,"38":16,"40":3,"41":50,"42":3,"43":17,"45":2,"47":3,"49":2,"51":5,"53":2,"55":2,"56":8,"57":4,"59":8,"60":8,"62":6,"63":9,"66":18,"68":5,"69":5,"70":20,"71":17,"72":15,"73":3,"81":1,"83":1,"84":9,"85":13,"87":1,"94":1,"97":1,"100":1,"102":1,"103":1,"105":7,"107":4,"108":2,"109":19,"110":1,"112":3,"113":1,"114":1,"115":3,"116":5,"117":2,"118":21,"120":12,"121":1,"122":2,"123":1,"125":4,"127":1,"128":1,"135":17,"137":2,"138":19,"139":10,"141":3,"143":3,"144":2,"145":2,"146":6,"147":5,"148":5,"149":3,"151":3,"153":5,"155":155,"156":120}}],["tolerance",{"2":{"142":4}}],["topics",{"2":{"99":1}}],["total",{"2":{"11":1,"60":1,"63":1}}],["todo",{"2":{"11":1,"24":1,"29":3,"31":4,"33":4,"35":2,"84":1,"85":4,"156":1}}],["tools",{"0":{"1":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1},"2":{"19":1,"69":1}}],["towards",{"2":{"0":1,"11":1}}],["to",{"0":{"1":1,"57":1,"60":1,"63":1,"73":1,"97":1,"126":1,"147":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"127":1},"2":{"0":49,"2":3,"4":2,"5":1,"6":2,"8":1,"9":1,"10":3,"11":191,"12":2,"13":1,"16":2,"19":1,"20":7,"21":9,"23":1,"24":6,"25":1,"26":1,"28":4,"29":3,"30":9,"31":4,"32":13,"33":4,"34":12,"35":2,"36":2,"38":3,"40":2,"41":16,"42":2,"43":2,"45":1,"47":1,"49":1,"51":1,"53":1,"55":3,"56":4,"57":6,"59":3,"60":4,"62":1,"63":4,"66":6,"68":18,"69":1,"70":3,"71":9,"72":4,"73":1,"84":4,"85":6,"94":1,"100":1,"102":1,"105":4,"107":6,"108":1,"109":3,"110":1,"111":2,"113":1,"116":2,"118":16,"120":7,"121":1,"126":1,"127":1,"128":1,"130":1,"132":1,"135":12,"137":3,"138":10,"139":3,"140":1,"141":1,"142":1,"143":3,"144":4,"145":2,"146":3,"147":2,"148":3,"149":5,"150":1,"151":1,"152":1,"155":36,"156":49}}],["t",{"2":{"0":14,"11":29,"28":2,"41":10,"45":2,"56":8,"59":11,"62":14,"68":5,"138":1,"155":25,"156":7}}],["typeof",{"2":{"155":1}}],["typemax",{"2":{"132":1,"156":1}}],["types",{"2":{"7":1,"11":2,"13":1,"22":1,"26":1,"42":1,"79":1,"120":2,"156":8}}],["type",{"2":{"0":15,"11":35,"13":5,"41":7,"45":4,"56":6,"59":2,"62":5,"65":1,"66":2,"68":9,"109":1,"120":1,"130":2,"135":7,"155":55,"156":17}}],["swap",{"2":{"156":2}}],["switch",{"2":{"0":1,"11":1,"108":1}}],["src",{"2":{"155":2}}],["sltns",{"2":{"135":2}}],["script",{"2":{"139":1}}],["scatterlines",{"2":{"138":1,"139":1}}],["scalarfunction",{"2":{"155":3}}],["scalars",{"2":{"11":1,"123":1}}],["scalar",{"2":{"11":5,"20":2,"43":2,"70":2,"114":1,"155":1}}],["scenario",{"2":{"97":1}}],["science",{"2":{"83":1}}],["scheduling",{"0":{"36":1},"2":{"11":6,"36":6}}],["shifted",{"2":{"132":3}}],["share",{"2":{"93":1,"103":1}}],["shared",{"2":{"10":1,"42":1}}],["shrink",{"2":{"11":2}}],["showcase",{"2":{"96":1}}],["show",{"2":{"0":1,"11":4,"107":1,"109":1}}],["should",{"2":{"0":2,"11":11,"23":1,"25":1,"34":6,"55":1,"107":2,"155":4,"156":3}}],["shortcut",{"2":{"0":1,"11":1,"21":1,"71":1}}],["system",{"2":{"41":1}}],["syntax",{"2":{"21":1,"71":1,"84":1,"85":1,"155":1,"156":1}}],["syntaxes",{"2":{"1":1,"12":1}}],["symb",{"2":{"11":2}}],["symbols",{"2":{"0":6,"11":11,"47":2,"107":4,"109":1,"138":2}}],["symbol",{"2":{"0":15,"11":34,"20":4,"21":2,"43":4,"47":3,"66":1,"71":2,"72":4,"109":1,"120":5,"128":1,"132":1,"138":1,"143":1,"156":3}}],["symmetry",{"2":{"0":1,"11":1}}],["symmetries",{"2":{"0":4,"11":4}}],["symcon",{"2":{"0":1,"11":1,"47":1}}],["sat",{"2":{"156":3}}],["satisfying",{"2":{"156":2}}],["satisfy",{"2":{"3":1,"11":3,"23":1,"26":1,"32":3,"155":2}}],["satisfaction",{"0":{"6":1},"2":{"2":1,"9":1,"11":2,"155":1,"156":3}}],["satisfied",{"2":{"0":1,"6":2,"11":10,"21":1,"28":1,"34":4,"36":2,"38":1,"40":1,"71":1,"155":1,"156":1}}],["satisfies",{"2":{"0":1,"6":1,"11":8,"28":1,"32":6,"155":4}}],["save",{"2":{"139":2}}],["say",{"2":{"0":1,"11":1,"128":1}}],["samples=d",{"2":{"147":1}}],["samples",{"2":{"139":1,"142":2,"144":1,"147":1,"149":5,"152":1}}],["sampling",{"0":{"49":1},"1":{"50":1},"2":{"42":1,"49":2}}],["samplings",{"2":{"0":5,"11":5,"66":5}}],["same",{"2":{"0":2,"11":4,"20":1,"41":2,"59":1,"62":1,"72":1,"155":1}}],["stop",{"2":{"156":5}}],["storing",{"2":{"139":1}}],["storage",{"2":{"16":1}}],["stored",{"2":{"146":1,"147":1}}],["store",{"2":{"0":1,"11":15,"19":1,"59":3,"68":8,"69":1,"107":1,"109":2,"156":3}}],["stores",{"2":{"0":1,"11":2,"62":2,"139":2}}],["stuff",{"2":{"132":2}}],["studies",{"0":{"96":1},"2":{"96":1}}],["studio",{"2":{"84":1}}],["stdout",{"2":{"41":1}}],["still",{"2":{"21":1,"71":1}}],["stipulates",{"2":{"11":1,"155":2}}],["step",{"2":{"11":2,"88":2,"99":2,"156":3}}],["stamp",{"2":{"156":4}}],["status",{"2":{"156":4}}],["static",{"2":{"156":1}}],["states",{"2":{"11":4,"28":4}}],["state",{"2":{"5":1,"41":3,"156":36}}],["statement",{"2":{"3":1}}],["standard",{"2":{"12":1,"20":1,"22":1,"41":3,"55":1,"70":1}}],["standards",{"2":{"1":1,"8":1}}],["stands",{"2":{"12":1}}],["started",{"0":{"82":1,"88":1},"1":{"83":1,"84":1,"85":1},"2":{"88":1}}],["start=",{"2":{"41":1}}],["start",{"2":{"11":4,"28":2,"38":2,"41":1,"85":1,"138":1}}],["starts",{"2":{"11":9,"36":8,"156":2}}],["starting",{"2":{"11":1,"41":2,"156":1}}],["str",{"2":{"156":1}}],["strategies",{"0":{"91":1},"2":{"91":1}}],["straight",{"2":{"85":1}}],["straightforward",{"2":{"23":1,"155":1}}],["streamlining",{"0":{"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1},"1":{"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1}}],["streamline",{"2":{"9":1}}],["struct",{"2":{"11":1,"41":3,"56":1,"156":4}}],["structures",{"2":{"42":1}}],["structure",{"0":{"109":1},"2":{"0":5,"11":7,"13":1,"17":1,"41":1,"45":3,"56":2,"68":1,"109":4,"135":1,"156":5}}],["strongly",{"2":{"2":1}}],["string",{"2":{"0":1,"11":8,"41":1,"57":4,"60":4,"63":4,"107":1,"109":1,"138":1,"155":1,"156":1}}],["strictly",{"2":{"0":3,"11":13,"30":8,"114":1}}],["square",{"2":{"0":1,"11":1,"41":3,"66":1}}],["sqrt",{"2":{"0":1,"11":1,"66":1}}],["split",{"2":{"135":1}}],["specialize",{"2":{"156":10}}],["specialized",{"2":{"11":2,"118":1,"123":1,"156":10}}],["specializing",{"2":{"156":1}}],["specify",{"2":{"55":1}}],["specifying",{"2":{"0":3,"11":5,"12":1,"66":3,"155":5}}],["specifies",{"2":{"3":1,"11":8,"23":1,"26":1,"32":1,"34":6,"120":1}}],["specified",{"2":{"0":1,"11":3,"41":2,"57":2,"60":1,"63":1,"66":1,"68":1,"105":1,"120":1,"155":2}}],["specification",{"2":{"43":1}}],["specifications",{"2":{"0":1,"11":1,"20":1,"43":2,"72":1}}],["specifically",{"2":{"11":2,"57":2,"60":1,"63":1,"68":1,"105":1,"155":1}}],["specific",{"2":{"2":2,"4":1,"5":1,"6":1,"11":6,"40":4,"120":1,"135":2,"142":1,"152":1,"155":2}}],["span",{"2":{"11":1,"59":1,"62":1}}],["spaces",{"2":{"14":1,"49":1}}],["space",{"2":{"0":7,"11":9,"66":2,"155":3,"156":1}}],["sound",{"2":{"17":1}}],["source",{"2":{"0":74,"11":187,"13":1,"20":5,"21":3,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"41":21,"43":3,"45":7,"47":3,"49":1,"51":1,"53":1,"56":10,"57":15,"59":12,"60":15,"62":14,"63":16,"65":2,"66":3,"68":17,"70":1,"71":3,"72":4,"105":7,"107":6,"108":3,"109":11,"111":2,"112":1,"114":2,"115":1,"118":9,"120":2,"123":1,"125":1,"127":2,"128":3,"130":2,"135":28,"153":4,"155":74,"156":144}}],["soon",{"2":{"16":1,"155":1}}],["so",{"2":{"11":2,"41":1,"85":1}}],["solve",{"2":{"41":1,"85":1,"156":3}}],["solverversion",{"2":{"155":1}}],["solvername",{"2":{"155":1}}],["solvers",{"0":{"154":1},"2":{"84":3,"85":4,"109":1,"154":1,"156":2}}],["solver",{"2":{"41":6,"85":2,"135":1,"155":11,"156":29}}],["solving",{"2":{"1":1,"73":1,"75":1,"84":1,"91":1,"97":1,"156":4}}],["sols",{"2":{"0":1,"11":1,"135":4}}],["solution",{"2":{"0":1,"11":3,"29":2,"33":1,"41":2,"85":3,"108":1,"155":3,"156":4}}],["solutions",{"2":{"0":11,"11":11,"42":1,"66":7,"108":1,"135":8,"156":9}}],["something",{"2":{"11":1}}],["some",{"2":{"0":1,"11":1,"17":1,"47":1,"49":1,"85":1,"105":1,"110":1,"113":1,"116":1,"121":1,"135":1,"138":1,"140":1,"150":1,"155":1}}],["silent",{"2":{"155":4,"156":1}}],["situations",{"2":{"51":1}}],["sink",{"2":{"41":3}}],["since",{"2":{"14":1,"23":1,"25":1,"156":1}}],["single",{"2":{"11":3,"85":1,"111":2,"114":1}}],["significance",{"2":{"75":1}}],["signature",{"2":{"0":2,"11":2,"107":2}}],["sig",{"2":{"11":17,"118":8}}],["simulated",{"2":{"80":1}}],["simplify",{"2":{"90":1}}],["simplified",{"2":{"11":3}}],["simply",{"2":{"11":2,"15":1,"21":1,"57":2,"60":1,"63":1,"68":1,"71":1,"85":1,"105":1,"138":1}}],["simple",{"2":{"0":1,"11":1,"20":1,"72":1,"85":2}}],["similar",{"2":{"0":1,"11":1,"13":1,"31":1,"56":1}}],["sizes",{"2":{"0":1,"11":1,"66":1}}],["size",{"2":{"0":15,"11":31,"13":1,"20":1,"38":3,"41":3,"43":1,"56":5,"59":8,"62":8,"66":1,"70":1,"107":1,"109":2,"132":2,"135":7,"156":4}}],["successfully",{"2":{"96":1}}],["such",{"2":{"1":1,"7":1,"11":5,"18":1,"19":1,"20":2,"23":3,"25":2,"28":1,"41":2,"43":2,"70":2,"76":1,"109":1,"120":1,"155":1,"156":4}}],["sudoku",{"2":{"41":17,"85":4,"156":1}}],["sudokuinstances",{"2":{"41":1}}],["sudokuinstance",{"2":{"41":19}}],["subs",{"2":{"156":3}}],["subsolvers",{"2":{"156":4}}],["subsolver",{"2":{"156":6}}],["subsets",{"2":{"85":2}}],["subset",{"2":{"4":1,"155":1}}],["sub",{"2":{"135":1,"156":1}}],["subgrid",{"2":{"85":1}}],["subgrids",{"2":{"85":1}}],["subtype",{"2":{"41":1}}],["subtract",{"2":{"11":1,"120":1}}],["subtraction",{"2":{"11":1,"120":1}}],["supplies",{"2":{"41":1}}],["support",{"2":{"11":1,"155":1}}],["supported",{"2":{"11":4,"155":2}}],["supports=nothing",{"2":{"11":1}}],["supports",{"2":{"7":1,"11":7,"155":13}}],["supertype",{"2":{"0":2,"11":2,"13":1,"59":1,"62":1}}],["super",{"2":{"0":1,"11":1,"13":1,"56":1}}],["summing",{"0":{"32":1}}],["sum",{"2":{"0":5,"3":1,"11":21,"31":8,"32":8,"36":2,"41":1,"60":1,"63":1,"66":2,"111":3,"114":2,"127":3,"155":3}}],["series",{"2":{"85":1,"156":1}}],["serves",{"2":{"42":1}}],["segment",{"2":{"41":3}}],["sec",{"2":{"156":1}}],["section",{"2":{"24":1,"43":1,"140":1,"150":1}}],["seconds=d",{"2":{"147":1}}],["seconds",{"2":{"139":1,"142":2,"144":1,"147":1,"152":1,"156":1}}],["second",{"2":{"11":10,"34":2,"36":8}}],["see",{"2":{"18":2,"24":1,"156":1}}],["seen",{"2":{"3":1}}],["separator",{"2":{"41":1}}],["separates",{"2":{"11":1,"107":1}}],["sep",{"2":{"11":2,"41":2,"107":2}}],["select",{"2":{"138":1,"156":4}}],["selection",{"2":{"11":1,"120":1}}],["selected",{"2":{"0":4,"11":8,"109":6,"112":1,"115":1,"125":1,"135":2,"156":1}}],["sequence",{"2":{"11":10,"28":4,"38":6,"155":3}}],["several",{"2":{"10":1,"51":1,"84":1,"109":1}}],["searching",{"2":{"0":1,"11":1}}],["search",{"0":{"91":1,"133":1},"2":{"0":20,"11":20,"49":1,"66":9,"80":1,"91":1,"109":1,"155":1,"156":1}}],["setter",{"2":{"85":1}}],["setting",{"0":{"84":1},"2":{"156":1}}],["settings",{"2":{"0":4,"11":4,"66":4,"156":1}}],["setup",{"2":{"84":1}}],["sets",{"2":{"0":1,"7":1,"11":3,"16":1,"17":1,"34":2,"66":1,"135":3}}],["setdomain",{"0":{"15":1},"2":{"0":5,"11":5,"15":1,"16":1,"56":1,"59":1,"62":3,"63":2}}],["set",{"2":{"0":11,"3":1,"5":1,"6":1,"11":31,"15":1,"18":1,"26":2,"32":3,"34":4,"40":2,"41":4,"45":1,"47":2,"57":2,"60":1,"62":3,"63":1,"68":1,"105":1,"107":1,"120":1,"125":1,"128":2,"135":11,"155":68,"156":22}}],["s2",{"2":{"0":1,"11":1,"47":1}}],["s1",{"2":{"0":1,"11":1,"47":1}}],["s",{"2":{"0":14,"11":18,"13":2,"21":4,"41":5,"43":3,"45":6,"56":2,"59":1,"62":1,"71":4,"85":1,"105":10,"107":1,"108":1,"109":1,"118":2,"119":6,"123":4,"124":4,"125":1,"145":1,"147":1,"153":1,"156":109}}],["after",{"2":{"148":1}}],["affects",{"2":{"117":1,"122":1}}],["affect",{"2":{"0":1,"11":1}}],["authors",{"2":{"137":1}}],["autodocs",{"2":{"134":1}}],["auto",{"2":{"132":1}}],["automated",{"2":{"11":1}}],["automatically",{"2":{"11":1,"66":1}}],["automata",{"2":{"11":1,"45":2}}],["automaton",{"2":{"0":3,"11":16,"20":1,"28":7,"43":1,"45":5,"68":4,"70":1,"105":2,"155":2}}],["among",{"2":{"135":1,"156":1}}],["amount",{"2":{"41":1}}],["aka",{"2":{"55":1}}],["a2",{"2":{"31":2}}],["a1",{"2":{"31":2}}],["about",{"0":{"104":1},"1":{"105":1},"2":{"12":1,"19":1,"55":1,"69":1,"104":1,"154":1,"155":1,"156":1}}],["absolute",{"2":{"11":2}}],["abs",{"2":{"0":1,"11":5,"20":1,"24":2,"25":6,"26":6,"72":1,"123":1,"124":1}}],["abstractstring",{"2":{"156":2}}],["abstractstring=",{"2":{"0":1,"11":1,"47":1}}],["abstractstate",{"2":{"156":1}}],["abstractsolver",{"2":{"156":70}}],["abstractscalarset",{"2":{"155":2}}],["abstractscalarfunction",{"2":{"155":1}}],["abstractmatrix",{"2":{"41":4}}],["abstractmultivalueddecisiondiagram",{"2":{"0":1,"11":3,"45":3,"155":1}}],["abstractvectorset",{"2":{"155":22}}],["abstractvector",{"2":{"11":31,"34":4,"36":5,"38":1,"40":2,"107":1,"118":9,"156":1}}],["abstractoptimizer",{"2":{"0":1,"11":2,"130":2,"132":1,"135":2,"155":1}}],["abstractrange",{"2":{"0":2,"11":2,"56":1,"59":1,"62":2}}],["abstract",{"2":{"0":3,"11":6,"13":2,"42":1,"45":2,"56":1,"59":1,"62":1,"130":1,"135":2,"156":2}}],["abstractdomain",{"0":{"13":1},"2":{"0":10,"11":25,"13":5,"56":5,"57":6,"59":4,"60":5,"62":4,"63":5,"65":1,"68":10,"105":2,"156":6}}],["abstractdictionary",{"2":{"0":1,"11":1,"53":1}}],["abstractdict",{"2":{"0":1,"11":1,"53":1}}],["abstractautomaton`",{"2":{"11":1,"28":1}}],["abstractautomaton",{"2":{"0":1,"11":6,"28":2,"45":3,"68":1,"155":2}}],["aggragation",{"2":{"113":1}}],["aggregate",{"2":{"11":1,"114":1}}],["aggregations",{"0":{"114":1},"2":{"0":1,"11":1,"115":1}}],["aggregation",{"0":{"113":1},"1":{"114":1,"115":1},"2":{"0":4,"11":4,"115":1}}],["again",{"2":{"41":1}}],["against",{"2":{"11":2,"40":1,"120":1}}],["ag",{"2":{"11":2,"114":2}}],["advantages",{"2":{"83":1}}],["advanced",{"0":{"89":1},"1":{"90":1,"91":1},"2":{"42":1}}],["adjusted",{"2":{"11":1,"66":1}}],["added",{"2":{"24":1,"25":1,"155":1}}],["adds",{"2":{"11":4}}],["adding",{"2":{"0":2,"11":2,"20":2,"72":2}}],["additional",{"2":{"0":1,"11":1,"66":1}}],["additionally",{"2":{"0":1,"11":1,"13":1,"56":1}}],["add",{"2":{"0":3,"11":4,"13":1,"15":8,"16":4,"23":1,"24":1,"25":3,"26":3,"56":1,"62":2,"84":1,"85":4,"155":9,"156":20}}],["achieve",{"2":{"137":1}}],["accurate",{"2":{"132":2}}],["according",{"2":{"11":1,"120":1,"139":1,"155":1}}],["access",{"2":{"0":4,"11":5,"56":1,"109":1,"156":20}}],["acceptable",{"2":{"11":2,"155":1}}],["accepted",{"2":{"0":2,"11":4,"28":2,"155":1}}],["accepts",{"2":{"0":1,"11":3,"41":4,"45":3,"68":1,"105":1}}],["accept",{"2":{"0":1,"11":7,"45":6,"68":3,"105":3}}],["across",{"2":{"10":1,"139":1}}],["acts",{"2":{"19":1,"69":1}}],["action",{"2":{"0":2,"11":2}}],["actual",{"2":{"0":1,"4":1,"11":1,"139":1}}],["alternative",{"2":{"109":1}}],["alternatively",{"2":{"25":1,"26":1}}],["although",{"2":{"84":1}}],["already",{"2":{"11":3,"85":1,"118":1,"123":1,"135":1,"156":1}}],["along",{"2":{"1":1,"11":1,"20":1,"43":1,"70":1,"84":1}}],["algorithms",{"2":{"80":1}}],["algorithm",{"2":{"0":4,"11":4,"135":3}}],["also",{"2":{"0":2,"5":1,"11":5,"12":1,"19":1,"32":3,"69":1,"85":1,"120":1,"125":1,"149":1}}],["allequal",{"2":{"29":1,"155":2}}],["alldifferent",{"2":{"29":2,"85":5,"155":2}}],["allocs",{"2":{"139":1,"149":4}}],["allocations",{"2":{"11":17,"118":8,"139":1}}],["allow",{"2":{"26":1}}],["allows",{"2":{"16":1}}],["allowing",{"2":{"11":3,"120":1,"155":1}}],["all",{"2":{"0":10,"1":1,"11":45,"13":1,"20":4,"21":1,"26":1,"29":10,"30":24,"32":1,"41":1,"43":1,"51":1,"59":1,"70":1,"71":1,"72":3,"84":1,"85":2,"107":1,"120":1,"125":1,"141":1,"151":1,"153":2,"155":6,"156":4}}],["avoid",{"2":{"0":1,"11":2,"155":2,"156":1}}],["available",{"2":{"0":1,"11":2,"20":1,"23":1,"25":1,"41":2,"72":1,"84":2,"120":1,"156":1}}],["approach",{"2":{"85":1}}],["appropriate",{"2":{"11":1,"120":1,"147":1,"149":1}}],["appear",{"2":{"11":3,"32":3}}],["applies",{"2":{"11":1,"107":1,"155":1}}],["applied",{"2":{"0":2,"4":1,"11":3,"21":1,"71":1,"85":1,"96":1,"120":1,"155":1,"156":2}}],["applications",{"0":{"96":1}}],["application",{"2":{"2":1,"4":1,"11":1,"19":1,"69":1}}],["applying",{"0":{"95":1},"1":{"96":1,"97":1}}],["apply",{"2":{"0":5,"11":7,"21":4,"71":4,"120":2}}],["apixcspjumpmoi",{"2":{"25":1,"26":1,"29":3,"31":4,"33":4,"35":2}}],["apis",{"0":{"25":1}}],["apicbls",{"2":{"15":1,"16":1,"18":1}}],["api",{"0":{"0":1,"8":1,"11":1,"24":1,"153":1},"2":{"1":1,"20":2,"23":1,"25":1,"70":2,"153":1}}],["attribution",{"2":{"156":1}}],["attributed",{"2":{"156":6}}],["attribute",{"2":{"156":2}}],["attached",{"2":{"156":1}}],["atoms",{"2":{"41":1}}],["atmost",{"2":{"31":1,"155":2}}],["atleast",{"2":{"31":1,"155":2}}],["at",{"2":{"0":3,"11":15,"13":1,"18":1,"20":1,"31":12,"32":8,"36":2,"41":1,"45":1,"72":1,"84":1,"109":2,"128":1,"135":2,"155":3,"156":1}}],["arrange",{"2":{"153":3}}],["arrangement",{"2":{"135":1}}],["array",{"2":{"31":1}}],["ar",{"2":{"11":2,"111":2}}],["arbitrary",{"0":{"17":1},"2":{"11":2,"17":1,"62":1,"146":1}}],["arbitrarydomain",{"2":{"11":1,"62":1}}],["arithmetic",{"0":{"110":1,"111":1},"1":{"111":1,"112":1},"2":{"0":5,"11":6,"20":1,"43":1,"70":1,"110":1,"112":2}}],["arxiv",{"2":{"0":1,"11":1,"20":1,"72":1}}],["areas",{"2":{"103":1}}],["are",{"2":{"0":5,"7":1,"9":1,"10":1,"11":42,"12":1,"13":1,"16":1,"17":1,"20":3,"21":2,"22":1,"23":4,"24":2,"26":4,"30":10,"36":2,"41":5,"42":1,"43":1,"49":1,"55":1,"59":1,"62":1,"70":3,"71":2,"85":1,"109":2,"112":1,"115":1,"118":8,"120":1,"125":1,"138":1,"142":1,"143":1,"146":1,"147":1,"149":2,"152":1,"155":8,"156":2}}],["argmax",{"2":{"156":3}}],["argument",{"2":{"11":7,"20":1,"41":4,"70":1,"155":1}}],["arguments",{"2":{"0":16,"11":44,"20":4,"21":3,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"41":1,"43":1,"56":1,"59":1,"66":2,"70":1,"71":3,"72":3,"155":27,"156":8}}],["args",{"2":{"0":10,"11":13,"13":3,"21":4,"56":4,"66":1,"71":4,"130":1,"135":3}}],["aspect",{"2":{"12":1}}],["aspects",{"0":{"10":1}}],["associated",{"2":{"41":1,"85":1,"109":1,"145":1}}],["assert",{"2":{"11":1,"109":1}}],["assigned",{"2":{"5":1}}],["assign",{"2":{"0":1,"11":1,"41":1,"156":1}}],["assignments",{"2":{"0":1,"6":1,"11":1}}],["assignment",{"2":{"0":1,"2":1,"5":1,"11":1,"41":1}}],["as",{"2":{"0":8,"1":1,"3":1,"5":1,"7":1,"11":29,"12":1,"15":1,"16":5,"17":2,"18":2,"19":2,"20":6,"23":3,"25":3,"26":1,"28":2,"32":3,"41":3,"42":1,"43":2,"45":1,"49":1,"59":1,"62":3,"69":1,"70":3,"72":3,"76":1,"84":1,"85":1,"107":2,"109":1,"118":1,"120":1,"123":1,"135":1,"138":5,"142":1,"143":1,"152":1,"153":1,"155":4,"156":6}}],["analyze",{"2":{"94":1}}],["analyzing",{"0":{"92":1},"1":{"93":1,"94":1}}],["analysis",{"0":{"94":1,"100":1},"2":{"100":1}}],["annealing",{"2":{"80":1}}],["anonymous",{"2":{"11":1,"107":1}}],["another",{"2":{"11":2,"21":1,"34":2,"71":1}}],["an",{"0":{"24":1},"2":{"0":23,"1":1,"5":1,"11":64,"13":2,"20":3,"24":1,"25":1,"28":3,"30":3,"32":1,"41":3,"42":1,"43":3,"45":2,"47":1,"56":2,"59":6,"60":1,"62":3,"63":1,"66":5,"70":3,"73":2,"85":1,"97":1,"107":3,"109":5,"116":1,"120":1,"130":1,"135":7,"137":1,"138":1,"139":1,"143":1,"149":1,"155":12,"156":11}}],["any",{"0":{"109":1},"2":{"0":8,"11":19,"13":1,"36":6,"41":1,"47":1,"56":2,"57":1,"60":1,"63":1,"130":1,"138":1,"155":4,"156":1}}],["and",{"0":{"12":1,"20":1,"21":1,"27":1,"29":1,"31":1,"32":1,"33":1,"35":1,"36":1,"37":1,"39":1,"55":1,"71":1,"76":1,"82":1,"88":1,"90":1,"91":1,"92":1,"94":1,"96":1,"98":1,"101":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"83":1,"84":1,"85":1,"93":1,"94":1,"99":1,"100":1,"102":1,"103":1},"2":{"0":23,"1":3,"2":1,"3":2,"4":1,"5":2,"6":3,"7":1,"8":2,"9":2,"10":2,"11":65,"12":5,"13":3,"16":1,"19":3,"20":1,"21":4,"22":1,"23":1,"26":1,"28":1,"31":2,"32":1,"34":2,"38":2,"41":13,"42":4,"43":1,"45":1,"47":1,"49":1,"51":1,"55":2,"56":2,"59":2,"62":1,"66":1,"68":2,"69":3,"71":4,"72":1,"73":2,"75":1,"76":1,"77":1,"80":1,"81":1,"83":2,"84":2,"85":4,"87":1,"88":1,"90":1,"91":1,"93":2,"94":1,"96":1,"97":1,"99":1,"100":1,"102":1,"103":1,"105":2,"107":1,"109":3,"117":1,"118":5,"120":3,"122":1,"127":1,"128":1,"135":10,"138":1,"139":2,"140":1,"144":1,"150":1,"153":1,"155":10,"156":11}}],["a",{"0":{"6":1,"8":1,"9":1,"109":1,"149":1},"2":{"0":79,"1":1,"2":5,"3":6,"4":5,"5":4,"6":3,"8":2,"9":1,"11":284,"13":4,"15":2,"16":2,"17":2,"19":1,"20":10,"21":5,"23":10,"24":2,"25":3,"26":4,"28":29,"29":2,"30":3,"32":13,"33":1,"34":22,"36":8,"38":8,"40":8,"41":26,"42":1,"43":4,"45":11,"53":2,"56":9,"57":19,"59":8,"60":17,"62":8,"63":17,"66":9,"68":15,"69":2,"70":4,"71":5,"72":6,"84":2,"85":12,"97":1,"105":5,"107":8,"108":2,"109":16,"111":2,"114":2,"116":1,"120":10,"127":2,"128":7,"130":1,"135":23,"137":3,"138":8,"139":1,"140":1,"143":2,"144":1,"148":1,"149":1,"150":1,"153":3,"155":48,"156":51}}]],"serializationVersion":2}';export{t as default}; diff --git a/dev/assets/chunks/@localSearchIndexroot.Dv38fV8G.js b/dev/assets/chunks/@localSearchIndexroot.Dv38fV8G.js new file mode 100644 index 0000000..910465e --- /dev/null +++ b/dev/assets/chunks/@localSearchIndexroot.Dv38fV8G.js @@ -0,0 +1 @@ +const t='{"documentCount":157,"nextId":157,"documentIds":{"0":"/dev/api/00_public#Public-API","1":"/dev/constraints/00_intro#Introduction-to-basics-constraint-based-modeling-tools","2":"/dev/constraints/00_intro#terminology","3":"/dev/constraints/00_intro#constraint","4":"/dev/constraints/00_intro#Constraint-Instantiation","5":"/dev/constraints/00_intro#configuration","6":"/dev/constraints/00_intro#Constraint-Satisfaction-or-Violation-by-a-Configuration","7":"/dev/constraints/00_intro#Domain-defined-variables","8":"/dev/constraints/00_intro#A-versatile-constraints\'-API","9":"/dev/constraints/00_intro#A-collection-of-models","10":"/dev/constraints/00_intro#Internal-Aspects","11":"/dev/api/10_full#Full-API","12":"/dev/constraints/10_variables_and_domains#Defining-Variables-and-Exploring-Domains","13":"/dev/constraints/10_variables_and_domains#Implementing-the-AbstractDomain-Interface","14":"/dev/constraints/10_variables_and_domains#Discrete-Domains","15":"/dev/constraints/10_variables_and_domains#SetDomain","16":"/dev/constraints/10_variables_and_domains#RangeDomain","17":"/dev/constraints/10_variables_and_domains#Arbitrary-Domains","18":"/dev/constraints/10_variables_and_domains#Continuous-Domains","19":"/dev/constraints/20_constraints#Interacting-with-Constraints-in-Julia","20":"/dev/constraints/20_constraints#Usual-Constraints-and-Parameters","21":"/dev/constraints/20_constraints#Concepts,-Error-Functions,-and-QUBO-matrices","22":"/dev/constraints/21_generic_constraints#Generic-Constraints","23":"/dev/constraints/21_generic_constraints#Intention-Constraints","24":"/dev/constraints/21_generic_constraints#Defining-an-intention-constraint-in-JC-API","25":"/dev/constraints/21_generic_constraints#apis","26":"/dev/constraints/21_generic_constraints#Extension-Constraints","27":"/dev/constraints/22_language_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","28":"/dev/constraints/22_language_constraints#Constraints-defined-from-Languages","29":"/dev/constraints/23_comparison_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","30":"/dev/constraints/23_comparison_constraints#Comparison-based-Constraints","31":"/dev/constraints/24_counting_summing_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","32":"/dev/constraints/24_counting_summing_constraints#Counting-and-Summing-Constraints","33":"/dev/constraints/25_connection_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","34":"/dev/constraints/25_connection_constraints#Connection-Constraints","35":"/dev/constraints/26_packing_scheduling_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","36":"/dev/constraints/26_packing_scheduling_constraints#Packing-and-Scheduling-Constraints","37":"/dev/constraints/27_graph_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","38":"/dev/constraints/27_graph_constraints#Constraints-on-Graphs","39":"/dev/constraints/28_elementary_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","40":"/dev/constraints/28_elementary_constraints#Elementary-Constraints","41":"/dev/constraints/40_constraint_models#constraintmodels-jl","42":"/dev/constraints/60_constraint_commons#constraintcommons-jl","43":"/dev/constraints/60_constraint_commons#parameters","44":"/dev/constraints/60_constraint_commons#performances","45":"/dev/constraints/60_constraint_commons#languages","46":"/dev/constraints/60_constraint_commons#Performances-2","47":"/dev/constraints/60_constraint_commons#extensions","48":"/dev/constraints/60_constraint_commons#Performances-3","49":"/dev/constraints/60_constraint_commons#sampling","50":"/dev/constraints/60_constraint_commons#Performances-4","51":"/dev/constraints/60_constraint_commons#extrema","52":"/dev/constraints/60_constraint_commons#Performances-5","53":"/dev/constraints/60_constraint_commons#dictionaries","54":"/dev/constraints/60_constraint_commons#Performances-6","55":"/dev/constraints/62_constraints_jl#Interacting-with-Constraints-in-Julia","56":"/dev/constraints/62_constraints_jl#Usual-Parameters","57":"/dev/constraints/62_constraints_jl#Concepts,-Error-Functions,-and-QUBO-matrices","58":"/dev/constraints/62_constraints_jl#Usual-Constraints","59":"/dev/constraints/61_constraint_domains#ConstraintDomains.jl:-Defining-Variables-and-Exploring-Domains","60":"/dev/constraints/61_constraint_domains#commons","61":"/dev/constraints/61_constraint_domains#Extension-to-Base-module","62":"/dev/constraints/61_constraint_domains#performances","63":"/dev/constraints/61_constraint_domains#continuous","64":"/dev/constraints/61_constraint_domains#Extension-to-Base-module-2","65":"/dev/constraints/61_constraint_domains#Performances-2","66":"/dev/constraints/61_constraint_domains#discrete","67":"/dev/constraints/61_constraint_domains#Extension-to-Base-module-3","68":"/dev/constraints/61_constraint_domains#Performances-3","69":"/dev/constraints/61_constraint_domains#general","70":"/dev/constraints/61_constraint_domains#exploration","71":"/dev/constraints/61_constraint_domains#Performances-4","72":"/dev/constraints/61_constraint_domains#parameters","73":"/dev/cp/00_intro#Welcome-to-Julia-Constraints","74":"/dev/cp/10_cp101#Constraint-Programming-101","75":"/dev/cp/10_cp101#What-is-Constraint-Programming?","76":"/dev/cp/10_cp101#Basic-Concepts-and-Terminology","77":"/dev/cp/10_cp101#How-CP-differs-from-other-optimization-techniques","78":"/dev/cp/20_opt#Dive-into-Optimization","79":"/dev/cp/20_opt#Understanding-Optimization","80":"/dev/cp/20_opt#Metaheuristics-Overview","81":"/dev/cp/20_opt#Mathematical-Programming-Basics","82":"/dev/cp/30_getting_started#Getting-Started-with-Julia-for-CP-and-Optimization","83":"/dev/cp/30_getting_started#Why-Julia?","84":"/dev/cp/30_getting_started#Setting-Up-Your-Julia-Environment","85":"/dev/cp/30_getting_started#Your-First-Julia-CP-Model","86":"/dev/cp/40_ecosystem#Exploring-JuliaConstraint-Packages","87":"/dev/cp/40_ecosystem#Package-Overviews","88":"/dev/cp/40_ecosystem#Installation-and-Getting-Started-Guides","89":"/dev/cp/50_advanced#Advanced-Constraint-Programming-Techniques","90":"/dev/cp/50_advanced#Global-Constraints-and-Their-Uses","91":"/dev/cp/50_advanced#Search-Strategies-and-Optimization","92":"/dev/cp/60_applications#Applying-Optimization-Methods","93":"/dev/cp/60_applications#Case-Studies-and-Real-World-Applications","94":"/dev/cp/60_applications#From-Theory-to-Practice","95":"/dev/cp/80_tuto_xp#Tutorials-and-Experiments","96":"/dev/cp/80_tuto_xp#Hands-On-Tutorials","97":"/dev/cp/80_tuto_xp#Experimental-Analysis","98":"/dev/cp/70_models#Building-and-Analyzing-Models","99":"/dev/cp/70_models#Modeling-Best-Practices","100":"/dev/cp/70_models#Performance-Analysis-and-Improvement","101":"/dev/cp/90_contribution#Community-and-Contribution","102":"/dev/cp/90_contribution#Joining-the-JuliaConstraint-Community","103":"/dev/cp/90_contribution#Future-Directions","104":"/dev/learning/00_intro#Learning-about-Constraints","105":"/dev/learning/00_intro#parameters","106":"/dev/learning/10_compositional_networks#compositionalnetworks-jl","107":"/dev/learning/10_compositional_networks#utilities","108":"/dev/learning/10_compositional_networks#metrics","109":"/dev/learning/11_layers#A-layer-structure-for-any-ICN","110":"/dev/learning/12_transformation#Transformations-Layer","111":"/dev/learning/12_transformation#List-of-transformations","112":"/dev/learning/12_transformation#non-parametric","113":"/dev/learning/12_transformation#Param:-:val","114":"/dev/learning/12_transformation#Layer-generation","115":"/dev/learning/13_arithmetic#Arithmetic-Layer","116":"/dev/learning/13_arithmetic#List-of-arithmetic-operations","117":"/dev/learning/13_arithmetic#Layer-generation","118":"/dev/learning/14_aggregation#Aggregation-Layer","119":"/dev/learning/14_aggregation#List-of-aggregations","120":"/dev/learning/14_aggregation#Layer-generation","121":"/dev/learning/15_comparison#Comparison-Layer","122":"/dev/learning/15_comparison#List-of-comparisons","123":"/dev/learning/15_comparison#non-parametric","124":"/dev/learning/15_comparison#Param:-:val","125":"/dev/learning/15_comparison#Layer-generation","126":"/dev/learning/20_qubo_constraints#Introduction-to-QUBOConstraints.jl","127":"/dev/learning/20_qubo_constraints#Basic-features","128":"/dev/learning/21_qubo_encoding#Encoding-for-QUBO-programs","129":"/dev/learning/22_qubo_learning#Learning-QUBO-matrices","130":"/dev/learning/22_qubo_learning#interface","131":"/dev/learning/22_qubo_learning#Examples-with-various-optimizers","132":"/dev/learning/22_qubo_learning#Gradient-Descent","133":"/dev/learning/22_qubo_learning#Constraint-based-Local-Search","134":"/dev/learning/30_constraints_translator#constraintstranslator-jl","135":"/dev/learning/90_constraint_learning#constraintlearning-jl","136":"/dev/perf/00_perf_checker#perfchecker-jl","137":"/dev/perf/00_perf_checker#usage","138":"/dev/meta/00_meta_strategist#metastrategist-jl","139":"/dev/perf/10_tutorial#tutorial","140":"/dev/perf/20_perf_interface#Extending-PerfChecker","141":"/dev/perf/20_perf_interface#The-Default-Options","142":"/dev/perf/20_perf_interface#Package-initialization","143":"/dev/perf/20_perf_interface#Preparatory-Code:","144":"/dev/perf/20_perf_interface#Main-Code-to-be-Performance-Tested","145":"/dev/perf/20_perf_interface#Post-Performance-Testing-Code","146":"/dev/perf/20_perf_interface#Converting-the-result-into-a-Table","147":"/dev/perf/30_benchmark_ext#BenchmarkTools-Extension","148":"/dev/perf/30_benchmark_ext#usage","149":"/dev/perf/30_benchmark_ext#options","150":"/dev/perf/40_chairmarks_ext#Chairmarks-Extension","151":"/dev/perf/40_chairmarks_ext#usage","152":"/dev/perf/40_chairmarks_ext#options","153":"/dev/perf/90_api#api","154":"/dev/solvers/00_intro#solvers","155":"/dev/solvers/60_local_search_solvers#localsearchsolvers-jl","156":"/dev/solvers/10_cbls#cbls-jl"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[2,1,612],"1":[7,1,54],"2":[1,7,49],"3":[1,8,42],"4":[2,8,40],"5":[1,8,39],"6":[7,8,49],"7":[3,7,28],"8":[5,7,36],"9":[4,7,38],"10":[2,7,40],"11":[2,1,1145],"12":[5,1,54],"13":[4,5,88],"14":[2,5,20],"15":[1,6,57],"16":[1,6,78],"17":[2,6,37],"18":[2,5,50],"19":[5,1,51],"20":[4,5,172],"21":[6,5,99],"22":[2,1,17],"23":[2,2,77],"24":[7,3,68],"25":[1,3,101],"26":[2,2,109],"27":[9,1,1],"28":[4,9,118],"29":[9,1,79],"30":[3,9,75],"31":[9,1,112],"32":[4,9,123],"33":[9,1,82],"34":[2,9,87],"35":[9,1,66],"36":[4,9,111],"37":[9,1,1],"38":[3,9,67],"39":[9,1,1],"40":[2,9,52],"41":[2,1,283],"42":[2,1,66],"43":[1,2,114],"44":[1,3,1],"45":[1,2,82],"46":[1,3,1],"47":[1,2,43],"48":[1,3,1],"49":[1,2,42],"50":[1,3,1],"51":[1,2,28],"52":[1,3,1],"53":[1,2,34],"54":[1,3,1],"55":[5,1,49],"56":[2,5,106],"57":[6,5,100],"58":[2,5,93],"59":[7,1,45],"60":[1,7,133],"61":[4,8,84],"62":[1,8,1],"63":[1,7,123],"64":[4,8,91],"65":[1,8,1],"66":[1,7,133],"67":[4,8,95],"68":[1,8,1],"69":[1,7,16],"70":[1,7,90],"71":[1,8,1],"72":[1,7,111],"73":[4,1,35],"74":[3,1,1],"75":[5,3,10],"76":[4,3,10],"77":[7,3,10],"78":[3,1,1],"79":[2,3,12],"80":[2,3,11],"81":[3,3,12],"82":[8,1,1],"83":[3,8,16],"84":[5,8,104],"85":[5,8,191],"86":[3,1,1],"87":[2,3,13],"88":[5,1,13],"89":[4,1,1],"90":[5,4,12],"91":[4,4,12],"92":[3,1,1],"93":[6,3,11],"94":[4,3,18],"95":[3,1,1],"96":[3,3,11],"97":[2,3,15],"98":[4,1,1],"99":[3,4,12],"100":[4,4,11],"101":[3,1,1],"102":[4,3,14],"103":[2,3,13],"104":[3,1,6],"105":[1,3,108],"106":[2,1,5],"107":[1,2,92],"108":[1,2,43],"109":[6,1,140],"110":[2,1,30],"111":[3,2,10],"112":[2,5,64],"113":[2,5,20],"114":[2,5,157],"115":[2,1,11],"116":[4,2,19],"117":[2,2,22],"118":[2,1,11],"119":[3,2,23],"120":[2,2,23],"121":[2,1,11],"122":[3,2,10],"123":[2,5,35],"124":[2,5,18],"125":[2,5,47],"126":[4,1,5],"127":[2,4,32],"128":[4,1,61],"129":[3,1,1],"130":[1,3,27],"131":[4,3,1],"132":[2,7,102],"133":[4,7,1],"134":[2,1,9],"135":[2,1,227],"136":[2,1,51],"137":[1,2,150],"138":[2,1,5],"139":[1,1,129],"140":[2,1,49],"141":[3,2,53],"142":[2,2,38],"143":[3,2,58],"144":[6,2,61],"145":[4,2,42],"146":[6,2,59],"147":[2,1,26],"148":[1,2,48],"149":[1,2,31],"150":[2,1,26],"151":[1,2,49],"152":[1,2,25],"153":[1,1,53],"154":[1,1,3],"155":[2,1,501],"156":[2,1,470]},"averageFieldLength":[2.9999999999999996,3.5031847133757985,64.1337579617834],"storedFields":{"0":{"title":"Public API","titles":[]},"1":{"title":"Introduction to basics constraint-based modeling tools","titles":[]},"2":{"title":"Terminology","titles":["Introduction to basics constraint-based modeling tools"]},"3":{"title":"Constraint","titles":["Introduction to basics constraint-based modeling tools","Terminology"]},"4":{"title":"Constraint Instantiation","titles":["Introduction to basics constraint-based modeling tools","Terminology"]},"5":{"title":"Configuration","titles":["Introduction to basics constraint-based modeling tools","Terminology"]},"6":{"title":"Constraint Satisfaction or Violation by a Configuration","titles":["Introduction to basics constraint-based modeling tools","Terminology"]},"7":{"title":"Domain-defined variables","titles":["Introduction to basics constraint-based modeling tools"]},"8":{"title":"A versatile constraints' API","titles":["Introduction to basics constraint-based modeling tools"]},"9":{"title":"A collection of models","titles":["Introduction to basics constraint-based modeling tools"]},"10":{"title":"Internal Aspects","titles":["Introduction to basics constraint-based modeling tools"]},"11":{"title":"Full API","titles":[]},"12":{"title":"Defining Variables and Exploring Domains","titles":[]},"13":{"title":"Implementing the AbstractDomain Interface","titles":["Defining Variables and Exploring Domains"]},"14":{"title":"Discrete Domains","titles":["Defining Variables and Exploring Domains"]},"15":{"title":"SetDomain","titles":["Defining Variables and Exploring Domains","Discrete Domains"]},"16":{"title":"RangeDomain","titles":["Defining Variables and Exploring Domains","Discrete Domains"]},"17":{"title":"Arbitrary Domains","titles":["Defining Variables and Exploring Domains","Discrete Domains"]},"18":{"title":"Continuous Domains","titles":["Defining Variables and Exploring Domains"]},"19":{"title":"Interacting with Constraints in Julia","titles":[]},"20":{"title":"Usual Constraints and Parameters","titles":["Interacting with Constraints in Julia"]},"21":{"title":"Concepts, Error Functions, and QUBO matrices","titles":["Interacting with Constraints in Julia"]},"22":{"title":"Generic Constraints","titles":[]},"23":{"title":"Intention Constraints","titles":["Generic Constraints"]},"24":{"title":"Defining an intention constraint in JC-API","titles":["Generic Constraints","Intention Constraints"]},"25":{"title":"APIs","titles":["Generic Constraints","Intention Constraints"]},"26":{"title":"Extension Constraints","titles":["Generic Constraints"]},"27":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"28":{"title":"Constraints defined from Languages","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"29":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"30":{"title":"Comparison-based Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"31":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"32":{"title":"Counting and Summing Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"33":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"34":{"title":"Connection Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"35":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"36":{"title":"Packing and Scheduling Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"37":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"38":{"title":"Constraints on Graphs","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"39":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"40":{"title":"Elementary Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"41":{"title":"ConstraintModels.jl","titles":[]},"42":{"title":"ConstraintCommons.jl","titles":[]},"43":{"title":"Parameters","titles":["ConstraintCommons.jl"]},"44":{"title":"Performances","titles":["ConstraintCommons.jl","Parameters"]},"45":{"title":"Languages","titles":["ConstraintCommons.jl"]},"46":{"title":"Performances","titles":["ConstraintCommons.jl","Languages"]},"47":{"title":"Extensions","titles":["ConstraintCommons.jl"]},"48":{"title":"Performances","titles":["ConstraintCommons.jl","Extensions"]},"49":{"title":"Sampling","titles":["ConstraintCommons.jl"]},"50":{"title":"Performances","titles":["ConstraintCommons.jl","Sampling"]},"51":{"title":"Extrema","titles":["ConstraintCommons.jl"]},"52":{"title":"Performances","titles":["ConstraintCommons.jl","Extrema"]},"53":{"title":"Dictionaries","titles":["ConstraintCommons.jl"]},"54":{"title":"Performances","titles":["ConstraintCommons.jl","Dictionaries"]},"55":{"title":"Interacting with Constraints in Julia","titles":[]},"56":{"title":"Usual Parameters","titles":["Interacting with Constraints in Julia"]},"57":{"title":"Concepts, Error Functions, and QUBO matrices","titles":["Interacting with Constraints in Julia"]},"58":{"title":"Usual Constraints","titles":["Interacting with Constraints in Julia"]},"59":{"title":"ConstraintDomains.jl: Defining Variables and Exploring Domains","titles":[]},"60":{"title":"Commons","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains"]},"61":{"title":"Extension to Base module","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Commons"]},"62":{"title":"Performances","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Commons"]},"63":{"title":"Continuous","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains"]},"64":{"title":"Extension to Base module","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Continuous"]},"65":{"title":"Performances","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Continuous"]},"66":{"title":"Discrete","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains"]},"67":{"title":"Extension to Base module","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Discrete"]},"68":{"title":"Performances","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Discrete"]},"69":{"title":"General","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains"]},"70":{"title":"Exploration","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains"]},"71":{"title":"Performances","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Exploration"]},"72":{"title":"Parameters","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains"]},"73":{"title":"Welcome to Julia Constraints","titles":[]},"74":{"title":"Constraint Programming 101","titles":[]},"75":{"title":"What is Constraint Programming?","titles":["Constraint Programming 101"]},"76":{"title":"Basic Concepts and Terminology","titles":["Constraint Programming 101"]},"77":{"title":"How CP differs from other optimization techniques","titles":["Constraint Programming 101"]},"78":{"title":"Dive into Optimization","titles":[]},"79":{"title":"Understanding Optimization","titles":["Dive into Optimization"]},"80":{"title":"Metaheuristics Overview","titles":["Dive into Optimization"]},"81":{"title":"Mathematical Programming Basics","titles":["Dive into Optimization"]},"82":{"title":"Getting Started with Julia for CP and Optimization","titles":[]},"83":{"title":"Why Julia?","titles":["Getting Started with Julia for CP and Optimization"]},"84":{"title":"Setting Up Your Julia Environment","titles":["Getting Started with Julia for CP and Optimization"]},"85":{"title":"Your First Julia CP Model","titles":["Getting Started with Julia for CP and Optimization"]},"86":{"title":"Exploring JuliaConstraint Packages","titles":[]},"87":{"title":"Package Overviews","titles":["Exploring JuliaConstraint Packages"]},"88":{"title":"Installation and Getting Started Guides","titles":[]},"89":{"title":"Advanced Constraint Programming Techniques","titles":[]},"90":{"title":"Global Constraints and Their Uses","titles":["Advanced Constraint Programming Techniques"]},"91":{"title":"Search Strategies and Optimization","titles":["Advanced Constraint Programming Techniques"]},"92":{"title":"Applying Optimization Methods","titles":[]},"93":{"title":"Case Studies and Real-World Applications","titles":["Applying Optimization Methods"]},"94":{"title":"From Theory to Practice","titles":["Applying Optimization Methods"]},"95":{"title":"Tutorials and Experiments","titles":[]},"96":{"title":"Hands-On Tutorials","titles":["Tutorials and Experiments"]},"97":{"title":"Experimental Analysis","titles":["Tutorials and Experiments"]},"98":{"title":"Building and Analyzing Models","titles":[]},"99":{"title":"Modeling Best Practices","titles":["Building and Analyzing Models"]},"100":{"title":"Performance Analysis and Improvement","titles":["Building and Analyzing Models"]},"101":{"title":"Community and Contribution","titles":[]},"102":{"title":"Joining the JuliaConstraint Community","titles":["Community and Contribution"]},"103":{"title":"Future Directions","titles":["Community and Contribution"]},"104":{"title":"Learning about Constraints","titles":[]},"105":{"title":"Parameters","titles":["Learning about Constraints"]},"106":{"title":"CompositionalNetworks.jl","titles":[]},"107":{"title":"Utilities","titles":["CompositionalNetworks.jl"]},"108":{"title":"Metrics","titles":["CompositionalNetworks.jl"]},"109":{"title":"A layer structure for any ICN","titles":[]},"110":{"title":"Transformations Layer","titles":[]},"111":{"title":"List of transformations","titles":["Transformations Layer"]},"112":{"title":"Non-parametric","titles":["Transformations Layer","List of transformations"]},"113":{"title":"Param: :val","titles":["Transformations Layer","List of transformations"]},"114":{"title":"Layer generation","titles":["Transformations Layer","List of transformations"]},"115":{"title":"Arithmetic Layer","titles":[]},"116":{"title":"List of arithmetic operations","titles":["Arithmetic Layer"]},"117":{"title":"Layer generation","titles":["Arithmetic Layer"]},"118":{"title":"Aggregation Layer","titles":[]},"119":{"title":"List of aggregations","titles":["Aggregation Layer"]},"120":{"title":"Layer generation","titles":["Aggregation Layer"]},"121":{"title":"Comparison Layer","titles":[]},"122":{"title":"List of comparisons","titles":["Comparison Layer"]},"123":{"title":"Non-parametric","titles":["Comparison Layer","List of comparisons"]},"124":{"title":"Param: :val","titles":["Comparison Layer","List of comparisons"]},"125":{"title":"Layer generation","titles":["Comparison Layer","List of comparisons"]},"126":{"title":"Introduction to QUBOConstraints.jl","titles":[]},"127":{"title":"Basic features","titles":["Introduction to QUBOConstraints.jl"]},"128":{"title":"Encoding for QUBO programs","titles":[]},"129":{"title":"Learning QUBO matrices","titles":[]},"130":{"title":"Interface","titles":["Learning QUBO matrices"]},"131":{"title":"Examples with various optimizers","titles":["Learning QUBO matrices"]},"132":{"title":"Gradient Descent","titles":["Learning QUBO matrices","Examples with various optimizers"]},"133":{"title":"Constraint-based Local Search","titles":["Learning QUBO matrices","Examples with various optimizers"]},"134":{"title":"ConstraintsTranslator.jl","titles":[]},"135":{"title":"ConstraintLearning.jl","titles":[]},"136":{"title":"PerfChecker.jl","titles":[]},"137":{"title":"Usage","titles":["PerfChecker.jl"]},"138":{"title":"MetaStrategist.jl","titles":[]},"139":{"title":"Tutorial","titles":[]},"140":{"title":"Extending PerfChecker","titles":[]},"141":{"title":"The Default Options","titles":["Extending PerfChecker"]},"142":{"title":"Package initialization","titles":["Extending PerfChecker"]},"143":{"title":"Preparatory Code:","titles":["Extending PerfChecker"]},"144":{"title":"Main Code to be Performance Tested","titles":["Extending PerfChecker"]},"145":{"title":"Post Performance Testing Code","titles":["Extending PerfChecker"]},"146":{"title":"Converting the result into a Table","titles":["Extending PerfChecker"]},"147":{"title":"BenchmarkTools Extension","titles":[]},"148":{"title":"Usage","titles":["BenchmarkTools Extension"]},"149":{"title":"Options","titles":["BenchmarkTools Extension"]},"150":{"title":"Chairmarks Extension","titles":[]},"151":{"title":"Usage","titles":["Chairmarks Extension"]},"152":{"title":"Options","titles":["Chairmarks Extension"]},"153":{"title":"API","titles":[]},"154":{"title":"Solvers","titles":[]},"155":{"title":"LocalSearchSolvers.jl","titles":[]},"156":{"title":"CBLS.jl","titles":[]}},"dirtCount":0,"index":[["∅",{"2":{"156":1}}],["∩",{"2":{"156":1}}],["$d",{"2":{"144":1}}],["$block",{"2":{"143":1,"144":1}}],["$kwarg",{"2":{"139":1}}],["θ",{"2":{"132":2}}],["^2",{"2":{"132":1}}],["η",{"2":{"132":6,"135":1}}],["⋯",{"2":{"85":2}}],["×",{"2":{"85":3}}],["``",{"2":{"156":3}}],["`function",{"2":{"155":1}}],["`struct",{"2":{"155":1}}],["`",{"2":{"135":1}}],["`grid`",{"2":{"41":1}}],["`m`",{"2":{"41":1}}],["q",{"2":{"132":18,"135":7}}],["qap",{"2":{"41":1}}],["quite",{"2":{"85":1}}],["quadractic",{"2":{"41":1}}],["queens",{"2":{"41":4}}],["quote",{"2":{"142":1,"143":1,"144":1}}],["quot",{"2":{"11":6,"85":6,"137":2,"143":2}}],["qubooptimizer",{"2":{"135":2}}],["qubogradientoptimizer",{"2":{"135":4}}],["qubo",{"0":{"21":1,"57":1,"128":1,"129":1},"1":{"130":1,"131":1,"132":1,"133":1},"2":{"0":2,"11":5,"21":1,"57":1,"127":4,"130":1,"135":4}}],["quboconstraints",{"0":{"126":1},"1":{"127":1},"2":{"0":5,"11":7,"19":1,"21":1,"57":1,"126":1,"127":2,"128":3,"130":2,"132":1,"135":1}}],["z",{"2":{"31":4,"33":4,"35":4}}],["zeros",{"2":{"132":3}}],["zero",{"2":{"11":11,"36":11,"41":1}}],["≥",{"2":{"29":1,"31":3,"132":1}}],["\\tzero",{"2":{"35":1}}],["\\theights",{"2":{"35":1}}],["\\tlengths",{"2":{"35":2}}],["\\tlist",{"2":{"29":1,"31":2,"33":2}}],["\\torigins",{"2":{"35":2}}],["\\toperator",{"2":{"29":1}}],["\\tcondition",{"2":{"33":1,"35":1}}],["\\tindex",{"2":{"33":1}}],["\\t\\toccurs",{"2":{"31":1}}],["\\t\\texcept",{"2":{"31":1}}],["\\t\\tvalues",{"2":{"31":2}}],["\\t\\tcondition",{"2":{"31":2,"33":1}}],["≠",{"2":{"24":1,"25":3,"26":3}}],["−x",{"2":{"24":2}}],["|the",{"2":{"24":1}}],["|≠|x",{"2":{"24":1}}],["|x",{"2":{"24":1}}],["||",{"2":{"11":2,"156":1}}],["+",{"2":{"11":9,"119":1,"148":1,"151":1}}],["∉",{"2":{"11":3,"156":2}}],[">",{"2":{"11":1,"25":4,"26":4,"29":3,"31":5,"33":4,"35":2,"38":1,"132":8,"156":2}}],["7",{"2":{"11":5,"32":2,"36":3,"41":3,"153":1}}],["≤6",{"2":{"35":1}}],["≤12",{"2":{"35":1}}],["≤1",{"2":{"33":1}}],["≤10",{"2":{"31":3}}],["≤5",{"2":{"29":2,"31":5,"33":6,"35":4}}],["≤2",{"2":{"29":1}}],["≤4",{"2":{"29":2,"31":4,"33":1}}],["≤",{"2":{"11":5,"16":2,"31":2,"35":3,"36":1,"61":4,"64":4,"67":4,"85":2}}],["63",{"2":{"18":1}}],["6",{"2":{"11":5,"29":1,"31":1,"34":1,"35":3,"36":3,"40":1,"41":2,"140":1,"153":1}}],["6+5=11",{"2":{"6":1}}],["69",{"2":{"0":1,"11":1,"15":3,"60":1,"63":1,"66":1}}],["yes",{"2":{"155":1}}],["yet",{"2":{"11":2,"41":1,"60":1,"63":1}}],["you",{"2":{"148":1,"151":1}}],["your",{"0":{"84":1,"85":1}}],["y=1",{"2":{"11":1}}],["y=5",{"2":{"6":1}}],["y=2",{"2":{"5":1,"6":1}}],["y",{"2":{"3":1,"5":1,"23":2,"25":18,"26":19,"29":4,"31":6,"33":4,"35":4,"132":7,"135":4,"155":2}}],["σ",{"2":{"0":2,"11":2,"127":2}}],["gcsample",{"2":{"149":2}}],["gctrial",{"2":{"149":2}}],["gctimes",{"2":{"139":1,"146":3}}],["gc=d",{"2":{"144":1}}],["gc",{"2":{"141":1,"144":1,"146":1,"152":1}}],["giving",{"2":{"137":1}}],["gives",{"2":{"29":2,"33":1}}],["give",{"2":{"0":1,"11":1}}],["given",{"2":{"0":7,"4":1,"6":2,"11":19,"21":1,"28":2,"32":7,"41":2,"57":1,"109":2,"127":1,"128":1,"135":6,"137":1,"156":6}}],["guide",{"2":{"94":1,"139":1}}],["guides",{"0":{"88":1}}],["game",{"2":{"85":1}}],["good",{"2":{"140":1}}],["goes",{"2":{"137":2,"148":1,"151":1}}],["goal",{"2":{"41":1}}],["golomb",{"2":{"11":1,"24":2,"41":2,"156":1}}],["gt",{"2":{"24":1,"105":1,"134":1,"137":6}}],["g",{"2":{"11":15,"41":1,"79":1,"112":8,"113":1,"114":3}}],["grads",{"2":{"132":2}}],["gradientdescentoptimizer",{"2":{"132":5}}],["gradient",{"0":{"132":1},"2":{"132":1,"135":1}}],["graphs",{"0":{"38":1}}],["graph",{"2":{"11":1,"28":1,"41":4,"155":1,"156":1}}],["grid",{"2":{"41":5,"85":3}}],["greater",{"2":{"11":12,"112":7,"114":3}}],["global",{"0":{"90":1},"2":{"0":5,"11":36,"30":7,"32":4,"34":6,"36":6,"38":2,"40":2,"85":1,"90":1,"135":2,"156":15}}],["generic",{"0":{"22":1},"1":{"23":1,"24":1,"25":1,"26":1},"2":{"4":2,"8":1,"11":1,"22":1,"42":1,"155":2,"156":1}}],["generalstate",{"2":{"155":2}}],["generally",{"2":{"41":1}}],["general",{"0":{"69":1},"2":{"2":1,"155":1}}],["generating",{"2":{"13":1}}],["generation",{"0":{"114":1,"117":1,"120":1,"125":1},"2":{"0":2,"11":2}}],["generated",{"2":{"0":1,"11":18,"21":1,"57":1,"112":8}}],["generates",{"2":{"0":1,"11":5,"72":1,"105":1,"109":2,"114":1}}],["generate",{"2":{"0":7,"11":26,"72":10,"105":2,"107":2,"109":4,"114":2,"117":1,"120":1,"125":1,"135":2}}],["genetic",{"2":{"0":4,"11":4,"80":1,"135":3}}],["getting",{"0":{"82":1,"88":1},"1":{"83":1,"84":1,"85":1},"2":{"88":1}}],["get",{"2":{"0":1,"11":5,"41":2,"60":1,"85":1,"114":2,"153":2,"155":16,"156":6}}],["joinpath",{"2":{"139":3}}],["join",{"2":{"102":1}}],["joining",{"0":{"102":1}}],["j+1",{"2":{"85":1}}],["j",{"2":{"11":4,"34":4,"85":1}}],["just",{"2":{"143":1}}],["jumpcbls",{"2":{"15":1,"16":1,"18":1}}],["jump",{"2":{"1":1,"12":1,"15":2,"16":2,"23":1,"25":2,"26":1,"29":9,"31":12,"33":11,"35":6,"41":17,"59":1,"84":3,"85":2,"155":1,"156":10}}],["juliajump",{"2":{"156":3}}],["juliajulia>",{"2":{"148":1,"151":1,"153":1}}],["julia>",{"2":{"148":1,"151":1}}],["juliapost",{"2":{"155":1}}],["juliaperfchecker",{"2":{"142":1,"143":1,"145":1}}],["juliapredicate",{"2":{"156":1}}],["juliapredict",{"2":{"135":1}}],["juliapreliminaries",{"2":{"135":1}}],["juliaparameter",{"2":{"135":1}}],["juliaparams",{"2":{"0":1,"11":1}}],["juliapairvarsparameterdomain",{"2":{"11":1,"72":1}}],["juliaup",{"2":{"84":1}}],["juliausing",{"2":{"15":3,"16":1,"18":1,"25":3,"26":3,"29":9,"31":12,"33":12,"35":6,"84":2,"139":1}}],["juliausual",{"2":{"0":2,"11":3,"20":1,"58":1}}],["juliavariable",{"2":{"155":3}}],["juliavar",{"2":{"61":1,"64":1,"67":1,"155":1}}],["juliavalue",{"2":{"85":1}}],["juliavalsparameterdomain",{"2":{"11":1,"72":1}}],["juliavalparameterdomain",{"2":{"11":1,"72":1}}],["juliax",{"2":{"61":1,"64":1,"67":1,"155":1}}],["juliaxcsp",{"2":{"11":19,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1}}],["juliaqap",{"2":{"41":1}}],["juliaqubogradientoptimizer",{"2":{"135":1}}],["juliaqubo",{"2":{"0":1,"11":2,"127":2,"135":1}}],["juliano",{"2":{"135":1}}],["julian",{"2":{"41":1}}],["julianbits",{"2":{"0":1,"11":2,"109":1}}],["juliagolomb",{"2":{"41":1}}],["juliageneralstate",{"2":{"155":1}}],["juliagenerate",{"2":{"0":1,"11":5,"72":1,"105":1,"109":2,"135":1}}],["juliaget",{"2":{"0":1,"11":1,"60":1,"155":12}}],["juliafunction",{"2":{"141":1,"144":1,"146":1}}],["juliafunctions",{"2":{"11":1,"109":1}}],["juliafor",{"2":{"85":2}}],["juliafake",{"2":{"11":1,"72":1}}],["juliafakeautomaton",{"2":{"11":1,"72":1}}],["juliachemical",{"2":{"41":1}}],["juliac",{"2":{"11":18,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1}}],["juliaco",{"2":{"11":9,"123":1}}],["juliacompose",{"2":{"0":2,"11":2}}],["juliacompositionalnetworks",{"2":{"135":2}}],["juliacomposition",{"2":{"0":3,"11":3}}],["juliacomparison",{"2":{"0":1,"11":1,"125":1}}],["juliacode",{"2":{"0":1,"11":1}}],["juliaconcept",{"2":{"0":3,"11":37,"21":3,"28":2,"30":7,"32":9,"34":4,"36":4,"38":1,"40":1,"57":3}}],["juliaconstriction",{"2":{"155":1}}],["juliaconstraintcommons",{"2":{"11":1,"45":1,"72":1,"105":1}}],["juliaconstraints",{"2":{"0":4,"11":4,"20":4,"58":4}}],["juliaconstraint",{"0":{"86":1,"102":1},"1":{"87":1},"2":{"0":1,"11":1,"73":1,"87":1,"103":1,"155":3}}],["juliaconst",{"2":{"11":2,"20":2,"24":1,"43":2,"56":2,"135":2}}],["juliaconsisempty",{"2":{"0":1,"11":1,"47":1}}],["juliaconsin",{"2":{"0":1,"11":1,"47":1}}],["juliacontinuousdomain",{"2":{"0":1,"11":1,"63":1}}],["juliao",{"2":{"155":1}}],["juliaobjective",{"2":{"155":4}}],["juliaoptions",{"2":{"155":1}}],["juliaoptimizer",{"2":{"156":2}}],["juliaoptimize",{"2":{"85":1,"135":1}}],["juliaopparameterdomain",{"2":{"11":1,"72":1}}],["juliaoversample",{"2":{"0":1,"11":1,"49":1}}],["juliaboolparameterdomain",{"2":{"11":1,"72":1}}],["juliabinarize",{"2":{"0":1,"11":1,"128":1}}],["juliabase",{"2":{"0":1,"11":17,"41":4,"61":13,"63":1,"64":12,"66":1,"67":13,"69":2,"72":4,"105":4,"156":5}}],["juliaweights",{"2":{"0":3,"11":3}}],["juliatr",{"2":{"11":19,"112":9}}],["juliatrain",{"2":{"0":1,"11":1,"130":1,"135":2}}],["juliatransformation",{"2":{"0":1,"11":1,"114":1}}],["juliato",{"2":{"0":1,"11":1,"60":1}}],["juliaremote",{"2":{"155":2}}],["juliareduce",{"2":{"11":1,"107":1}}],["juliaregularization",{"2":{"0":1,"11":1}}],["juliarangedomain",{"2":{"0":1,"11":1,"66":1}}],["julialoss",{"2":{"135":1}}],["julialeadsolver",{"2":{"155":1}}],["julialearn",{"2":{"0":1,"11":1}}],["julialength",{"2":{"11":1,"64":1,"67":1,"109":1,"155":5}}],["julialayers",{"2":{"11":1}}],["julialayer",{"2":{"11":1,"109":1}}],["julialanguageparameterdomain",{"2":{"11":1,"72":1}}],["julialazy",{"2":{"0":2,"11":2,"107":2}}],["juliahamming",{"2":{"0":1,"11":1,"108":1}}],["juliaidparameterdomain",{"2":{"11":1,"72":1}}],["juliais",{"2":{"0":1,"11":2,"109":1,"128":1,"155":2}}],["juliaicnlocalsearchoptimizer",{"2":{"135":1}}],["juliaicngeneticoptimizer",{"2":{"135":1}}],["juliaicnconfig",{"2":{"135":1}}],["juliaicn",{"2":{"0":1,"11":1,"135":1}}],["juliaintention",{"2":{"156":1}}],["juliaintervals",{"2":{"11":1,"63":1}}],["juliaintersect",{"2":{"0":1,"11":2,"63":2,"66":1}}],["juliaincsert",{"2":{"0":1,"11":1,"53":1}}],["juliaempty",{"2":{"155":2}}],["juliaemptydomain",{"2":{"11":1,"60":1}}],["juliae",{"2":{"11":1}}],["juliaerror",{"2":{"0":1,"11":1,"21":1,"57":1,"156":1}}],["juliaexclu",{"2":{"11":1,"109":1}}],["juliaexplore",{"2":{"0":2,"11":2,"70":1}}],["juliaexploresettings",{"2":{"0":1,"11":1,"70":1}}],["juliaextract",{"2":{"0":3,"11":3,"43":3}}],["juliamoi",{"2":{"156":17}}],["juliamoisupports",{"2":{"156":1}}],["juliamoisum",{"2":{"156":1}}],["juliamoiregular",{"2":{"156":1}}],["juliamoiordered",{"2":{"156":1}}],["juliamoinooverlap",{"2":{"156":1}}],["juliamoinvalues",{"2":{"156":1}}],["juliamoimultivalueddecisiondiagram",{"2":{"156":1}}],["juliamoiminimum",{"2":{"156":1}}],["juliamoimaximum",{"2":{"156":1}}],["juliamoiintention",{"2":{"156":1}}],["juliamoiinstantiation",{"2":{"156":1}}],["juliamoiextension",{"2":{"156":1}}],["juliamoierror",{"2":{"156":1}}],["juliamoielement",{"2":{"156":1}}],["juliamoidistdifferent",{"2":{"156":1}}],["juliamoicumulative",{"2":{"156":1}}],["juliamoiconflicts",{"2":{"156":1}}],["juliamoiallequal",{"2":{"156":1}}],["juliamoialldifferent",{"2":{"156":1}}],["juliamodel",{"2":{"155":1}}],["juliamutually",{"2":{"135":1}}],["juliamutable",{"2":{"41":1}}],["juliam",{"2":{"85":1}}],["juliamincut",{"2":{"41":1}}],["juliaminkowski",{"2":{"0":1,"11":1,"108":1}}],["juliamax",{"2":{"155":1}}],["juliamainsolver",{"2":{"155":1}}],["juliamagic",{"2":{"41":1}}],["juliamap",{"2":{"11":1,"107":1}}],["juliamake",{"2":{"11":2,"114":1,"135":3}}],["juliamanhattan",{"2":{"0":1,"11":1,"108":1}}],["juliamerge",{"2":{"0":1,"11":1,"63":1,"66":1}}],["juliamdd",{"2":{"0":1,"11":1,"45":1}}],["juliad",{"2":{"155":1}}],["juliadraw",{"2":{"155":1}}],["juliadiscreteset",{"2":{"156":1}}],["juliadiscretedomain",{"2":{"0":1,"11":1,"66":1}}],["juliadist",{"2":{"155":1}}],["juliadisplay",{"2":{"41":1}}],["juliadimparameterdomain",{"2":{"11":1,"72":1}}],["juliadelete",{"2":{"155":2}}],["juliadebinarize",{"2":{"0":1,"11":1,"128":1}}],["juliadescribe",{"2":{"0":2,"11":2,"20":2,"58":2,"155":1}}],["juliad1",{"2":{"0":1,"11":1,"60":1,"63":1,"66":1}}],["juliadomain",{"2":{"0":6,"11":6,"60":6,"63":6,"66":6,"135":1,"155":1}}],["juliascalarfunction",{"2":{"156":1}}],["juliastop",{"2":{"155":1}}],["juliastatus",{"2":{"155":1}}],["juliastruct",{"2":{"0":1,"11":1,"132":1,"135":1}}],["juliaspecialize",{"2":{"155":2}}],["juliasolve",{"2":{"155":2}}],["juliasolution",{"2":{"155":1}}],["juliasub",{"2":{"135":1}}],["juliasudoku",{"2":{"41":1}}],["juliasudokuinstance",{"2":{"41":2}}],["juliaselected",{"2":{"11":1,"109":1}}],["juliasetdomain",{"2":{"0":1,"11":1,"66":1}}],["juliashrink",{"2":{"11":1}}],["juliashow",{"2":{"0":1,"11":2,"109":1}}],["juliasymbol",{"2":{"11":1,"109":1}}],["juliasymbols",{"2":{"0":1,"11":1}}],["juliasymmetries",{"2":{"0":1,"11":1}}],["juliasymcon",{"2":{"0":1,"11":1,"47":1}}],["julia",{"0":{"19":1,"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1,"55":1,"73":1,"82":1,"83":1,"84":1,"85":1},"1":{"20":1,"21":1,"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1,"56":1,"57":1,"58":1,"83":1,"84":1,"85":1},"2":{"0":5,"1":3,"8":1,"10":1,"11":13,"12":1,"16":3,"18":3,"20":3,"25":1,"26":1,"29":3,"31":4,"33":4,"35":2,"41":5,"42":2,"45":2,"55":1,"56":2,"58":1,"59":1,"66":1,"70":1,"83":1,"84":7,"85":5,"112":1,"114":1,"123":1,"135":1,"137":3,"140":1,"149":1,"152":1,"155":83,"156":17}}],["juliaδ",{"2":{"0":1,"11":1,"51":1,"135":1}}],["juliaas",{"2":{"11":2,"107":2}}],["juliaag",{"2":{"11":2,"119":2}}],["juliaaggregation",{"2":{"0":1,"11":1,"120":1}}],["juliaat",{"2":{"11":1,"45":1}}],["juliaabstractsolver",{"2":{"155":1}}],["juliaabstractoptimizer",{"2":{"11":1,"130":1}}],["juliaabstractmultivalueddecisiondiagram",{"2":{"11":1,"45":1}}],["juliaabstractautomaton",{"2":{"11":1,"45":1}}],["juliaabstractdomain",{"2":{"0":1,"11":1,"13":1,"60":1}}],["juliaar",{"2":{"11":2,"116":2}}],["juliaarbitrarydomain",{"2":{"11":1,"66":1}}],["juliaarithmetic",{"2":{"0":1,"11":1,"117":1}}],["juliaargs",{"2":{"0":1,"11":1}}],["juliaadd",{"2":{"0":1,"11":1,"66":1,"155":3}}],["juliaaccept",{"2":{"0":1,"11":1,"45":1,"72":1,"105":1}}],["juliaautomaton",{"2":{"0":1,"11":1,"45":1}}],["jc",{"0":{"24":1},"2":{"1":1,"15":1,"16":1,"18":1,"20":1,"23":1,"25":2,"26":1,"29":3,"31":4,"33":4,"35":2,"56":1}}],["jl",{"0":{"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1,"41":1,"42":1,"59":1,"106":1,"126":1,"134":1,"135":1,"136":1,"138":1,"155":1,"156":1},"1":{"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"107":1,"108":1,"127":1,"137":1},"2":{"0":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"19":1,"20":1,"21":2,"23":1,"24":1,"25":1,"41":1,"42":1,"55":1,"57":2,"58":1,"59":1,"84":3,"106":1,"109":1,"126":1,"134":1,"135":1,"136":2,"137":1,"138":1,"139":4,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":2,"150":2,"153":1,"155":2,"156":2}}],["kwarg",{"2":{"139":2}}],["keep",{"2":{"11":1,"127":1}}],["key",{"2":{"11":2,"76":1,"143":1,"144":1}}],["keywords",{"2":{"0":1,"11":2,"20":1,"43":1,"56":1}}],["keyword",{"2":{"0":1,"11":9,"20":2,"21":1,"56":2,"57":1,"140":1,"155":1}}],["k",{"2":{"11":2,"116":2,"155":1}}],["known",{"2":{"0":2,"5":1,"11":2,"41":1,"155":1}}],["kind=",{"2":{"155":1}}],["kinds",{"2":{"14":1,"45":1}}],["kind",{"2":{"0":1,"11":3,"20":1,"43":1,"51":1,"56":1,"70":1,"72":1,"105":1,"155":6}}],["kargs",{"2":{"0":5,"11":7,"21":4,"43":1,"57":4,"135":6}}],["heuristic",{"2":{"85":1}}],["heavily",{"2":{"20":1,"56":1,"110":1}}],["heavy",{"2":{"19":1,"55":1}}],["here",{"2":{"11":1,"25":1,"137":2,"139":1,"143":2,"144":1,"145":1,"148":1,"151":1,"153":1,"156":1}}],["height",{"2":{"11":4,"36":4}}],["heights",{"2":{"11":3,"36":3,"156":1}}],["hide",{"2":{"11":2}}],["highly",{"2":{"109":1}}],["highlighting",{"2":{"83":1,"102":1}}],["highlight",{"2":{"73":1}}],["higher",{"2":{"23":1,"25":1}}],["highest",{"2":{"0":1,"11":1,"60":1,"63":1,"66":1,"155":1}}],["high",{"2":{"1":1}}],["host",{"2":{"84":1}}],["how",{"0":{"77":1},"2":{"21":1,"23":1,"24":1,"29":3,"31":4,"33":4,"35":2,"57":1,"90":1,"97":1,"100":1,"102":1,"111":1,"122":1}}],["however",{"2":{"6":1,"10":1,"85":1}}],["holds",{"2":{"11":2,"34":2}}],["hold",{"2":{"11":2,"34":2,"135":1}}],["hot",{"2":{"0":3,"11":3,"128":3,"132":1}}],["hardware",{"2":{"84":1}}],["hands",{"0":{"96":1}}],["hand",{"2":{"21":1,"57":1}}],["handled",{"2":{"11":1,"63":1}}],["handle",{"2":{"11":1,"29":3,"31":4,"33":4,"35":2,"60":1,"155":2}}],["have",{"2":{"0":4,"4":1,"11":8,"20":1,"32":2,"41":1,"56":1,"84":1,"93":1,"107":2,"156":1}}],["hamming",{"2":{"0":4,"11":4,"108":2,"135":3}}],["has",{"2":{"0":2,"11":6,"14":1,"49":1,"85":1,"109":1,"128":1,"140":1,"147":1,"150":1,"155":10}}],["https",{"2":{"0":1,"11":1,"20":1,"58":1}}],["9×9",{"2":{"41":4}}],["9",{"2":{"0":1,"11":1,"29":2,"31":1,"41":4,"60":1,"63":1,"66":1,"85":7}}],["8",{"2":{"11":6,"29":1,"31":6,"32":5,"33":2,"36":1,"41":3}}],["86",{"2":{"0":1,"11":1,"60":1,"63":1,"66":1}}],["89",{"2":{"0":2,"11":2,"15":6,"60":2,"63":2,"66":2,"155":1}}],["42",{"2":{"0":1,"11":3,"15":3,"18":3,"32":2,"60":1,"63":1,"66":1}}],["4",{"2":{"0":1,"11":83,"15":3,"16":3,"24":2,"25":7,"26":10,"29":7,"30":12,"31":32,"32":14,"33":23,"34":15,"35":19,"36":18,"38":4,"40":4,"41":3,"60":1,"63":1,"66":1,"139":1,"153":1,"155":1,"156":1}}],["3j+1",{"2":{"85":1}}],["3i+1",{"2":{"85":1}}],["324",{"2":{"18":1}}],["3+2=5",{"2":{"6":1}}],["3",{"2":{"0":3,"11":125,"15":9,"16":3,"18":3,"21":1,"24":2,"25":6,"26":9,"29":10,"30":17,"31":47,"32":33,"33":21,"34":15,"35":27,"36":26,"38":6,"40":4,"41":6,"57":1,"60":2,"63":2,"66":2,"85":6,"139":1,"153":1,"155":1,"156":1}}],["39",{"0":{"8":1},"2":{"0":1,"11":6,"13":2,"60":1,"61":1,"64":1,"67":1,"84":1,"85":1,"105":11,"107":1,"108":1,"109":1,"112":2,"113":6,"123":4,"124":4,"125":1,"137":1,"144":1,"153":1,"155":4}}],["001",{"2":{"132":1}}],["00514",{"2":{"0":1,"11":1,"20":1,"58":1}}],["0≤z",{"2":{"33":2}}],["0≤x",{"2":{"29":1}}],["0≤y",{"2":{"29":1}}],["0",{"2":{"0":3,"5":1,"11":73,"15":3,"16":6,"21":1,"25":2,"26":2,"28":22,"29":1,"30":14,"31":12,"32":8,"33":1,"34":1,"38":1,"41":54,"57":1,"60":1,"61":2,"63":1,"64":1,"66":1,"67":1,"85":2,"132":1,"139":11,"153":8,"155":9,"156":2}}],["28",{"2":{"155":1}}],["225",{"2":{"11":1}}],["200",{"2":{"0":2,"11":2,"135":1}}],["2009",{"2":{"0":1,"11":1,"20":1,"58":1}}],["2",{"2":{"0":3,"11":146,"15":6,"18":4,"21":1,"24":2,"25":5,"26":8,"28":10,"29":10,"30":15,"31":68,"32":40,"33":26,"34":16,"35":33,"36":28,"38":3,"40":4,"41":5,"57":1,"60":2,"63":2,"66":2,"85":2,"139":8,"153":1,"155":1,"156":3}}],["56",{"2":{"155":1}}],["53",{"2":{"0":1,"11":1,"15":3,"60":1,"63":1,"66":1}}],["5",{"2":{"0":1,"11":75,"16":3,"29":3,"30":1,"31":32,"32":29,"33":12,"34":11,"35":22,"36":13,"40":3,"41":2,"60":1,"63":1,"66":1,"132":1,"137":1,"148":1,"151":1,"153":1,"155":1,"156":1}}],["ci",{"2":{"136":1,"156":3}}],["circuit",{"2":{"11":11,"38":11}}],["cn",{"2":{"85":1}}],["c=c1",{"2":{"85":1}}],["c=usual",{"2":{"0":2,"11":2,"20":2,"58":2}}],["classic",{"2":{"85":2}}],["closed",{"2":{"11":8,"18":1,"31":1,"32":8,"139":1}}],["c2",{"2":{"31":1,"139":2}}],["c1",{"2":{"31":1}}],["cblstodo",{"2":{"85":4}}],["cbls",{"0":{"156":1},"2":{"15":8,"16":4,"25":7,"26":7,"29":6,"31":8,"33":11,"35":4,"84":2,"85":3,"135":1,"155":1,"156":49}}],["certain",{"2":{"11":4,"34":4,"156":2}}],["cc",{"2":{"11":2,"32":2}}],["creating",{"2":{"137":1}}],["creation",{"2":{"11":1,"114":1}}],["created",{"2":{"155":1,"156":1}}],["creates",{"2":{"11":1,"139":1}}],["create",{"2":{"0":2,"11":3,"41":3,"70":1,"156":3}}],["crucial",{"2":{"10":1}}],["csps",{"2":{"9":1}}],["cut",{"2":{"41":1,"155":1}}],["cumulative",{"2":{"11":8,"35":9,"36":8,"156":3}}],["customize",{"2":{"141":1}}],["custom",{"2":{"7":1,"137":4,"139":1,"142":1,"146":1}}],["currently",{"2":{"11":1,"25":1,"26":1,"61":2,"64":1,"67":1,"72":1,"105":1,"156":1}}],["current",{"2":{"0":1,"11":2,"109":1,"155":1}}],["cp",{"0":{"77":1,"82":1,"85":1},"1":{"83":1,"84":1,"85":1},"2":{"1":1,"7":1,"19":1,"55":1,"73":1,"75":1,"84":1,"85":2,"91":1,"93":1,"97":1,"99":1}}],["choose",{"2":{"155":1}}],["choice",{"2":{"84":1}}],["chosen",{"2":{"20":1,"56":1}}],["chemical",{"2":{"41":3}}],["checked",{"2":{"156":1}}],["checkout",{"2":{"137":1}}],["checkres",{"2":{"137":1,"139":2}}],["checking",{"2":{"13":1}}],["checks",{"2":{"11":5,"28":1,"156":1}}],["check",{"2":{"0":1,"11":27,"24":1,"28":2,"30":3,"32":7,"34":8,"36":1,"38":1,"40":2,"61":1,"64":1,"67":1,"85":1,"105":10,"107":1,"108":1,"109":2,"112":2,"113":6,"123":4,"124":4,"125":1,"128":1,"136":2,"137":1,"139":1,"141":1,"144":3,"145":1,"148":1,"151":1,"155":10,"156":4}}],["chair",{"2":{"139":2,"146":6}}],["chairmarks",{"0":{"150":1},"1":{"151":1,"152":1},"2":{"139":5,"140":1,"141":1,"142":2,"143":1,"144":1,"145":1,"146":2,"150":1,"151":1}}],["chairmark",{"2":{"137":1,"139":3,"141":1,"142":1,"143":1,"144":1,"145":1,"151":1}}],["challenge",{"2":{"105":1}}],["challenged",{"2":{"18":1}}],["chapter",{"2":{"12":1,"73":1}}],["change",{"2":{"41":2}}],["changes",{"2":{"0":1,"11":2,"41":1,"63":1,"66":1}}],["channel",{"2":{"11":8,"33":12,"34":8}}],["characteristics",{"2":{"8":1}}],["c",{"2":{"0":24,"11":116,"20":4,"21":8,"25":3,"26":3,"28":10,"29":9,"30":14,"31":11,"32":19,"33":12,"34":15,"35":6,"36":11,"38":4,"40":2,"57":8,"58":4,"61":1,"64":1,"67":1,"139":2,"155":31}}],["capacited",{"2":{"155":1}}],["capacity",{"2":{"155":1}}],["capacities",{"2":{"41":1}}],["cairomakie",{"2":{"139":1}}],["case",{"0":{"93":1},"2":{"137":1,"142":1,"145":1,"146":1,"148":1,"151":1}}],["cast",{"2":{"11":1,"85":1}}],["catch",{"2":{"132":1}}],["categorized",{"2":{"22":1}}],["catalog",{"2":{"9":1,"19":1,"55":1}}],["call",{"2":{"139":1}}],["called",{"2":{"11":1,"23":1,"26":1,"85":3,"155":2}}],["calls",{"2":{"11":2}}],["cardinalityclosed",{"2":{"31":1}}],["cardinalityopen",{"2":{"31":1}}],["cardinality",{"2":{"11":14,"31":9,"32":14}}],["care",{"2":{"0":1,"11":1,"20":1,"58":1}}],["cannot",{"2":{"11":1,"18":1,"32":1}}],["can",{"2":{"0":3,"3":1,"11":11,"12":1,"13":1,"20":2,"28":1,"32":4,"56":2,"59":1,"60":1,"73":1,"84":1,"85":3,"102":1,"109":5,"114":1,"128":1,"137":3,"140":1,"141":1,"146":1,"148":1,"151":1,"155":1,"156":2}}],["copied",{"2":{"156":7}}],["copy",{"2":{"156":19}}],["cosntriction",{"2":{"155":1}}],["cost",{"2":{"155":19}}],["costs",{"2":{"155":20}}],["covering",{"2":{"96":1}}],["cover",{"2":{"81":1}}],["covers",{"2":{"42":1}}],["collaborate",{"2":{"102":1}}],["collect",{"2":{"25":1,"26":1,"132":1,"139":4}}],["collections",{"2":{"0":1,"11":1,"51":2}}],["collection",{"0":{"9":1},"2":{"0":6,"9":1,"11":9,"20":1,"21":1,"23":1,"24":1,"25":1,"53":1,"56":1,"57":1,"61":2,"63":1,"64":1,"67":1,"70":3,"72":1,"85":4,"105":1,"108":1,"135":3,"155":5,"156":1}}],["columns",{"2":{"85":1}}],["column",{"2":{"85":1}}],["col",{"2":{"41":1}}],["coordinates",{"2":{"41":1}}],["correspond",{"2":{"20":1,"56":1}}],["corresponding",{"2":{"11":1,"41":1,"114":1}}],["core",{"2":{"0":1,"8":2,"11":3,"14":1,"20":7,"22":1,"42":1,"43":3,"45":1,"56":5,"58":2}}],["coefficients",{"2":{"11":1,"32":1}}],["coeffs",{"2":{"11":2,"31":1,"32":2}}],["co",{"2":{"11":11,"32":2,"123":5,"124":4}}],["couple",{"2":{"20":1,"58":1}}],["counting",{"0":{"32":1},"2":{"11":1,"114":1}}],["count",{"2":{"11":95,"31":9,"32":6,"112":40,"113":4,"114":21,"119":3,"156":4}}],["counter",{"2":{"0":2,"11":2,"53":2,"155":1}}],["could",{"2":{"5":1,"23":1,"26":1}}],["come",{"2":{"156":1}}],["commonly",{"2":{"137":1}}],["commons",{"0":{"60":1},"1":{"61":1,"62":1}}],["community",{"0":{"101":1,"102":1},"1":{"102":1,"103":1},"2":{"102":1}}],["communities",{"2":{"2":1}}],["command",{"2":{"84":1}}],["combinatorial",{"2":{"1":1,"75":1,"109":1}}],["computational",{"2":{"83":1}}],["computes",{"2":{"155":1}}],["computed",{"2":{"11":17,"112":8}}],["compute",{"2":{"0":4,"11":7,"41":1,"51":2,"63":2,"66":1,"108":1,"128":1,"135":1,"155":17,"156":1}}],["compile",{"2":{"11":1,"114":1}}],["compliance",{"2":{"11":2,"28":2,"156":1}}],["complexity",{"2":{"96":1}}],["complex",{"2":{"9":1,"26":1,"90":1}}],["completed",{"2":{"85":1}}],["completely",{"2":{"0":1,"11":1}}],["complete",{"2":{"0":7,"11":8,"70":4}}],["comprehensive",{"2":{"11":2,"156":1}}],["compare",{"2":{"11":2,"30":1,"156":2}}],["comparisons",{"0":{"122":1},"1":{"123":1,"124":1,"125":1},"2":{"11":2,"114":2,"125":1}}],["comparison",{"0":{"30":1,"121":1},"1":{"122":1,"123":1,"124":1,"125":1},"2":{"0":5,"11":11,"20":1,"30":2,"32":1,"43":1,"56":1,"114":1,"121":1,"122":1,"123":1,"125":2}}],["compatibility",{"2":{"8":1}}],["compounds",{"2":{"41":1}}],["components",{"2":{"0":2,"9":1,"10":1,"11":2,"107":2}}],["compose",{"2":{"0":8,"11":12,"85":1,"109":1}}],["composed",{"2":{"0":3,"11":3,"70":1}}],["compositions",{"2":{"11":1}}],["compositionalneworks",{"2":{"107":1}}],["compositionalnetworks",{"0":{"106":1},"1":{"107":1,"108":1},"2":{"0":26,"11":77,"19":1,"21":1,"57":1,"106":1,"107":6,"108":3,"109":10,"112":9,"114":2,"116":2,"117":1,"119":2,"120":1,"123":1,"125":1,"135":3}}],["compositional",{"2":{"0":1,"11":1,"109":1}}],["composition",{"2":{"0":21,"11":24,"107":1}}],["coded",{"2":{"21":1,"57":1}}],["code",{"0":{"143":1,"144":1,"145":1},"2":{"0":3,"1":1,"11":5,"84":1,"137":2,"139":1,"143":3,"144":2,"145":1,"148":2,"151":2}}],["conduct",{"2":{"97":1}}],["conditions",{"2":{"11":1,"114":1,"155":1}}],["condition",{"2":{"3":1,"11":34,"31":1,"32":16,"33":1,"34":13,"36":5,"156":6}}],["concentrations",{"2":{"41":2}}],["concepts",{"0":{"21":1,"57":1,"76":1},"2":{"76":1,"80":1}}],["concept",{"2":{"0":21,"11":96,"20":1,"21":9,"24":1,"25":2,"26":2,"28":4,"29":7,"30":10,"31":26,"32":15,"33":15,"34":8,"35":9,"36":6,"38":2,"40":2,"57":9,"58":1,"70":4,"156":2}}],["config",{"2":{"137":3,"141":1,"143":1,"144":1,"145":1}}],["configuring",{"2":{"156":1}}],["configurable",{"2":{"136":1}}],["configuration",{"0":{"5":1,"6":1},"2":{"0":2,"2":2,"5":2,"6":4,"11":8,"41":2,"135":4,"139":1,"143":1,"144":1,"155":3,"156":6}}],["configurations",{"2":{"0":2,"11":8,"49":1,"70":1,"135":1,"155":1,"156":4}}],["configure",{"2":{"0":2,"11":2,"70":2}}],["conflict",{"2":{"11":1,"156":1}}],["conflicted",{"2":{"11":3,"156":1}}],["conflicts",{"2":{"11":8,"156":4}}],["conflicts=nothing",{"2":{"11":1}}],["converting",{"0":{"146":1}}],["converted",{"2":{"145":1,"156":4}}],["convert",{"2":{"0":1,"11":7,"60":1,"69":3,"107":2,"109":1,"146":1,"156":2}}],["contribute",{"2":{"102":1}}],["contribution",{"0":{"101":1},"1":{"102":1,"103":1}}],["contributions",{"2":{"9":1}}],["contributing",{"2":{"10":1}}],["contrast",{"2":{"77":1}}],["content",{"2":{"73":1}}],["context",{"2":{"0":1,"11":1,"13":1,"60":1,"109":2}}],["containing",{"2":{"155":1,"156":1}}],["container",{"2":{"11":1,"109":1,"156":1}}],["contains",{"2":{"0":2,"11":4,"20":1,"58":1,"85":1,"109":1}}],["contiguous",{"2":{"11":12,"112":2,"114":4}}],["contiuous",{"2":{"0":1,"11":1,"63":1,"66":1}}],["continuousdomain",{"2":{"0":1,"11":2,"63":2}}],["continuous",{"0":{"18":1,"63":1},"1":{"64":1,"65":1},"2":{"0":3,"7":1,"11":3,"12":1,"13":1,"18":1,"41":1,"59":1,"60":2,"63":2,"66":1}}],["connection",{"0":{"34":1}}],["connecting",{"2":{"0":1,"11":1,"47":1}}],["connector",{"2":{"0":1,"11":1,"47":1}}],["cons=dictionary",{"2":{"155":1}}],["cons",{"2":{"155":31}}],["consecutive",{"2":{"16":1}}],["constriction",{"2":{"155":4}}],["constrained",{"2":{"155":2,"156":2}}],["constrains",{"2":{"155":1}}],["constraintlearning",{"0":{"135":1},"2":{"19":1,"135":27,"153":1}}],["constraintmodels",{"0":{"41":1},"2":{"9":1,"41":14}}],["constraintstranslator",{"0":{"134":1},"2":{"134":2}}],["constraints",{"0":{"8":1,"19":1,"20":1,"22":1,"23":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"55":1,"58":1,"73":1,"90":1,"104":1},"1":{"20":1,"21":1,"23":1,"24":2,"25":2,"26":1,"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1,"56":1,"57":1,"58":1,"105":1},"2":{"0":40,"1":2,"8":3,"10":1,"11":75,"12":2,"18":1,"19":3,"20":34,"21":4,"22":2,"23":3,"24":3,"25":4,"26":4,"28":2,"29":9,"30":3,"31":12,"32":4,"33":12,"34":4,"35":6,"36":2,"38":1,"40":1,"42":1,"43":9,"45":3,"55":4,"56":8,"57":4,"58":26,"59":2,"76":1,"84":1,"85":2,"90":1,"104":1,"105":1,"130":1,"135":1,"155":23,"156":1}}],["constraintdomains",{"0":{"59":1},"1":{"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1},"2":{"0":19,"7":1,"11":35,"12":1,"13":2,"15":1,"16":1,"18":1,"59":1,"60":6,"63":8,"66":10,"70":3,"72":11,"105":1}}],["constraint",{"0":{"1":1,"3":1,"4":1,"6":1,"24":1,"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1,"74":1,"75":1,"89":1,"133":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1,"75":1,"76":1,"77":1,"90":1,"91":1},"2":{"0":38,"1":2,"2":5,"3":3,"4":5,"6":6,"8":1,"9":1,"11":122,"13":1,"14":1,"15":4,"16":2,"19":1,"20":11,"21":12,"23":5,"24":5,"25":8,"26":8,"28":6,"29":7,"30":7,"31":12,"32":10,"33":9,"34":14,"35":6,"36":16,"38":4,"40":4,"42":1,"43":9,"49":1,"55":1,"56":3,"57":12,"58":8,"59":1,"61":3,"64":3,"67":3,"70":1,"73":1,"85":7,"109":1,"114":3,"127":1,"135":4,"155":33,"156":66}}],["constraintcommons",{"0":{"42":1},"1":{"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1},"2":{"0":12,"10":1,"11":18,"20":1,"42":1,"43":3,"45":6,"47":3,"49":1,"51":1,"53":1,"56":1,"72":2,"105":1,"156":2}}],["constructor",{"2":{"17":1,"41":1,"135":3,"155":1}}],["constructing",{"2":{"9":1,"41":1}}],["construct",{"2":{"0":5,"11":6,"41":3,"60":3,"63":3,"66":3,"72":1,"155":3}}],["considered",{"2":{"155":1}}],["considers",{"2":{"45":1}}],["consider",{"2":{"3":1}}],["consistent",{"2":{"2":1,"11":1}}],["consisempty",{"2":{"0":1,"11":1,"47":1}}],["consin",{"2":{"0":1,"11":1,"47":1}}],["nine",{"2":{"85":1}}],["n²",{"2":{"41":1}}],["n×n",{"2":{"41":1}}],["nvalues",{"2":{"11":7,"31":9,"32":7,"156":1}}],["nvars",{"2":{"0":4,"11":12}}],["n5",{"2":{"11":2,"28":2}}],["n4",{"2":{"11":3,"28":3}}],["n3",{"2":{"11":2,"28":2}}],["n2",{"2":{"11":2,"28":2}}],["n1",{"2":{"11":2,"28":2}}],["numerous",{"2":{"18":1}}],["numerical",{"2":{"11":6,"15":1,"17":1,"32":2,"34":2,"36":2}}],["numeric",{"2":{"11":1,"66":1}}],["numbers",{"2":{"11":2,"137":1}}],["number",{"2":{"0":18,"11":52,"13":1,"32":11,"41":2,"60":1,"64":3,"66":2,"67":3,"70":2,"108":1,"109":5,"112":8,"119":1,"128":3,"135":2,"137":1,"155":12,"156":23}}],["n",{"2":{"0":2,"11":7,"41":16,"107":4,"127":3,"132":9}}],["nbits",{"2":{"0":1,"11":2,"109":1}}],["neighbours",{"2":{"155":2}}],["neighbourhood",{"2":{"155":2}}],["neither",{"2":{"11":1}}],["never",{"2":{"155":1}}],["necessarily",{"2":{"84":1}}],["necessary",{"2":{"12":1,"155":3}}],["need",{"2":{"51":1,"85":2,"140":1}}],["needs",{"2":{"0":1,"11":2,"114":1}}],["net",{"2":{"41":1}}],["network",{"2":{"0":1,"11":1,"109":1}}],["next",{"2":{"11":2,"38":2,"137":3,"153":2}}],["negation",{"2":{"11":1}}],["new",{"2":{"0":3,"9":1,"11":8,"20":3,"58":3,"63":3,"137":1,"155":2,"156":1}}],["natural",{"2":{"23":1,"25":1}}],["nature",{"2":{"0":1,"11":2,"20":2,"43":1,"56":2,"63":1,"66":1}}],["navigate",{"2":{"20":1,"58":1}}],["names",{"2":{"11":1,"114":1}}],["name=",{"2":{"0":1,"11":1}}],["name",{"2":{"0":8,"11":9,"20":2,"21":1,"43":1,"56":1,"57":1,"58":1,"137":4,"155":8,"156":2}}],["now",{"2":{"41":1,"85":1}}],["nooverlap",{"2":{"35":4,"156":2}}],["normal",{"2":{"11":1,"114":1}}],["normalized",{"2":{"0":1,"11":1}}],["norm",{"2":{"11":2}}],["node",{"2":{"11":3,"28":3,"41":2,"156":3}}],["no",{"2":{"11":21,"35":6,"36":17,"41":4,"107":1,"109":1,"114":1,"135":1,"156":1}}],["notebooks",{"2":{"84":1,"147":1,"150":1}}],["note",{"2":{"19":1,"21":1,"23":1,"25":1,"29":2,"33":1,"43":1,"57":1,"84":1,"85":1,"156":1}}],["not",{"2":{"0":2,"3":1,"11":16,"16":1,"19":1,"21":1,"23":1,"25":1,"32":1,"36":4,"41":2,"55":1,"57":1,"63":1,"84":1,"85":3,"114":1,"128":1,"155":1,"156":4}}],["nothing",{"2":{"0":11,"11":17,"21":2,"30":1,"32":2,"47":5,"57":2,"107":1,"132":1,"135":2,"139":1,"141":2,"143":1,"152":2,"156":15}}],["nonnegative",{"2":{"156":1}}],["nonlinear",{"2":{"79":1}}],["none",{"2":{"0":1,"11":4,"114":3,"128":1,"132":2,"141":1,"149":1,"152":1,"156":1}}],["non",{"0":{"112":1,"123":1},"2":{"0":3,"11":4,"16":1,"17":1,"66":1,"70":2,"114":1,"135":4,"155":1}}],["ls",{"2":{"156":1}}],["lst",{"2":{"155":5}}],["l=n²",{"2":{"41":1}}],["l",{"2":{"11":15,"41":1,"112":4,"113":1,"114":3,"146":5,"156":2}}],["load",{"2":{"142":1}}],["loss",{"2":{"132":2,"135":2}}],["loggingextra",{"2":{"155":1}}],["logging",{"2":{"155":1}}],["log",{"2":{"105":10,"107":1,"108":1,"109":1,"112":2,"113":6,"123":4,"124":4,"125":1,"155":1}}],["logical",{"2":{"23":1}}],["logic",{"2":{"11":2,"156":1}}],["loop",{"2":{"155":8}}],["loops",{"2":{"11":3,"38":2}}],["looks",{"2":{"137":1,"139":1,"141":1,"142":1,"144":1}}],["look",{"2":{"84":1,"85":1}}],["locations",{"2":{"41":5}}],["localsearchsolverscblstodo",{"2":{"84":1}}],["localsearchsolvers",{"0":{"155":1},"2":{"84":2,"135":1,"155":141,"156":1}}],["local",{"0":{"133":1},"2":{"0":5,"11":5,"109":1,"135":1,"137":1,"155":7,"156":1}}],["lower",{"2":{"0":1,"11":1}}],["lowest",{"2":{"0":1,"11":1,"60":1,"63":1,"66":1}}],["launch",{"2":{"155":1}}],["large",{"2":{"85":1}}],["labels",{"2":{"11":2,"28":2,"156":2}}],["labeled",{"2":{"11":2,"28":2,"156":2}}],["last",{"2":{"11":1,"28":1,"85":1,"137":5,"153":2,"155":1,"156":1}}],["lazy",{"2":{"0":2,"11":2,"107":2,"110":2}}],["lang",{"2":{"0":1,"11":3}}],["languages",{"0":{"28":1,"45":1},"1":{"46":1},"2":{"11":1,"23":1,"42":1,"45":1,"72":1}}],["languageparameterdomain",{"2":{"11":1,"72":1,"105":1}}],["language=",{"2":{"0":1,"11":1}}],["language",{"2":{"0":5,"11":25,"20":2,"25":1,"28":17,"43":2,"56":2,"84":3,"156":4}}],["lang=",{"2":{"0":1,"11":1}}],["layered",{"2":{"0":1,"11":1}}],["layers",{"2":{"0":4,"11":9,"114":1}}],["layer",{"0":{"109":1,"110":1,"114":1,"115":1,"117":1,"118":1,"120":1,"121":1,"125":1},"1":{"111":1,"112":1,"113":1,"114":1,"116":1,"117":1,"119":1,"120":1,"122":1,"123":1,"124":1,"125":1},"2":{"0":16,"11":42,"42":1,"64":2,"67":2,"109":28,"110":1,"114":3,"115":1,"117":3,"118":1,"120":3,"121":1,"123":1,"125":3,"135":4}}],["let",{"2":{"85":1}}],["left",{"2":{"11":18,"112":10,"114":3}}],["leadsolvers",{"2":{"155":3}}],["leadsolver",{"2":{"155":1}}],["least",{"2":{"11":4,"18":1,"31":6,"32":4,"135":2,"156":1}}],["learning",{"0":{"104":1,"129":1},"1":{"105":1,"130":1,"131":1,"132":1,"133":1},"2":{"0":2,"8":1,"11":3,"12":1,"19":1,"42":1,"49":1,"55":1,"59":2,"104":1,"105":1,"109":2,"135":1}}],["learn",{"2":{"0":6,"11":7,"73":1,"109":1,"130":1,"135":5}}],["learned",{"2":{"0":1,"11":1,"19":1,"55":1,"135":1}}],["leverage",{"2":{"8":1}}],["levels",{"2":{"96":1}}],["level",{"2":{"1":1,"11":3,"23":1,"25":1,"28":3,"155":9}}],["lesser",{"2":{"11":11,"112":6,"114":3}}],["less",{"2":{"6":1,"23":1,"85":1,"156":1}}],["lengths",{"2":{"11":9,"30":3,"36":6}}],["length",{"2":{"0":6,"11":28,"13":2,"36":8,"60":2,"61":1,"63":1,"64":6,"66":1,"67":6,"109":2,"116":2,"132":4,"146":1,"155":12}}],["liking",{"2":{"141":1}}],["like",{"2":{"77":1,"80":1,"137":2,"139":1,"141":1,"142":1,"144":1,"148":1,"151":1}}],["likely",{"2":{"42":1}}],["links",{"2":{"41":1,"147":1,"150":1,"155":1}}],["line",{"2":{"41":9,"84":1}}],["linear",{"2":{"0":3,"11":3,"77":1,"79":1,"127":3}}],["lies",{"2":{"20":1,"56":1}}],["littledict",{"2":{"11":2,"109":2,"114":1}}],["listing",{"2":{"26":1}}],["listed",{"2":{"11":2,"156":3}}],["list=x",{"2":{"0":1,"11":2,"20":1,"58":1}}],["list",{"0":{"111":1,"116":1,"119":1,"122":1},"1":{"112":1,"113":1,"114":1,"123":1,"124":1,"125":1},"2":{"0":3,"11":91,"20":4,"24":1,"25":1,"26":1,"28":8,"29":2,"30":13,"31":2,"32":27,"33":2,"34":16,"36":5,"38":3,"40":4,"43":5,"56":4,"66":1,"67":1,"111":1,"122":1,"137":2,"155":11,"156":1}}],["limit",{"2":{"0":8,"11":8,"70":6,"155":10,"156":1}}],["lt",{"2":{"0":2,"11":11,"13":1,"23":1,"24":1,"28":3,"41":1,"45":2,"60":1,"61":4,"64":4,"66":1,"67":4,"105":1,"134":1,"155":3,"156":2}}],["runtime",{"2":{"155":1}}],["runs",{"2":{"143":1,"144":1}}],["running",{"2":{"143":1}}],["run",{"2":{"41":1,"85":1,"135":1,"143":1,"144":1,"145":1,"155":5,"156":1}}],["rules",{"2":{"11":2,"28":2,"156":1}}],["ruler",{"2":{"11":1,"24":4,"41":1,"156":2}}],["rawoptimizerattribute",{"2":{"156":2}}],["raw",{"2":{"41":2}}],["rates",{"2":{"41":1}}],["rate",{"2":{"41":1}}],["rangeset",{"2":{"16":3}}],["ranges",{"2":{"0":1,"11":1,"66":1}}],["rangedomain",{"0":{"16":1},"2":{"0":3,"11":5,"25":1,"26":1,"60":1,"63":1,"66":3,"69":2}}],["range",{"2":{"0":3,"7":1,"8":1,"11":4,"13":1,"16":3,"28":1,"60":1,"63":1,"66":3,"156":1}}],["randomly",{"2":{"11":1,"61":2,"64":1,"67":1,"72":1,"105":1,"155":1}}],["random",{"2":{"0":1,"11":10,"13":1,"61":2,"64":1,"67":1,"72":10,"105":2,"155":2}}],["rand",{"2":{"0":1,"11":13,"13":2,"60":1,"61":16,"64":9,"67":9,"72":8,"105":8,"139":1,"155":2}}],["right",{"2":{"11":18,"112":15,"114":3}}],["round",{"2":{"132":1,"155":1}}],["routing",{"2":{"11":1,"38":1}}],["role",{"2":{"81":1}}],["roles",{"2":{"20":1,"56":1}}],["rows",{"2":{"85":1}}],["row",{"2":{"41":1,"85":1}}],["robust",{"2":{"10":1}}],["root",{"2":{"0":1,"11":1,"70":1}}],["r",{"2":{"0":2,"11":5,"28":3,"41":2,"57":1,"60":2,"63":2,"66":2,"132":8}}],["re",{"2":{"155":1}}],["remote",{"2":{"155":2}}],["remotely",{"2":{"155":1}}],["removed",{"2":{"16":1}}],["ref",{"2":{"110":1,"155":6}}],["reference",{"2":{"140":1}}],["refer",{"2":{"41":4}}],["refers",{"2":{"4":1,"6":1}}],["registries",{"2":{"153":1}}],["regions",{"2":{"85":1}}],["regularconstraint",{"2":{"156":1}}],["regular",{"2":{"11":10,"20":1,"28":9,"42":1,"43":1,"56":1,"156":2}}],["regularization",{"2":{"0":2,"11":2}}],["recognize",{"2":{"45":1}}],["recommended",{"2":{"16":1,"155":1,"156":1}}],["retrieve",{"2":{"41":1}}],["returned",{"2":{"11":1}}],["returns",{"2":{"0":4,"11":20,"47":2,"61":3,"64":2,"67":2,"70":2,"72":1,"105":1,"114":1,"148":1,"151":1,"153":1,"155":1,"156":19}}],["return",{"2":{"0":21,"11":64,"20":3,"21":4,"28":1,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"41":1,"43":1,"45":3,"57":4,"58":3,"60":3,"61":5,"63":3,"64":8,"66":3,"67":8,"70":1,"72":2,"105":2,"107":1,"109":5,"132":8,"135":4,"139":1,"141":1,"144":1,"146":1,"155":20,"156":1}}],["reproducible",{"2":{"136":1}}],["represented",{"2":{"11":2,"28":2,"143":1,"156":1}}],["represents",{"2":{"5":1,"11":1,"156":3}}],["representing",{"2":{"0":1,"11":2,"28":1,"70":1,"156":3}}],["replace",{"2":{"155":1}}],["replaced",{"2":{"16":1}}],["repl",{"2":{"84":1}}],["requires",{"2":{"139":1}}],["required",{"2":{"11":1,"130":1}}],["requirements",{"2":{"11":2,"45":2}}],["reverse",{"2":{"11":1,"41":1,"114":1,"139":2}}],["rev",{"2":{"11":5,"112":1,"114":1}}],["reduce",{"2":{"11":3,"107":1,"116":2}}],["reusable",{"2":{"9":1}}],["resume",{"2":{"155":1}}],["result",{"0":{"146":1},"2":{"11":23,"107":1,"112":8,"114":2,"143":1,"144":1,"145":1}}],["results",{"2":{"11":3,"41":1,"63":2,"137":3,"139":1}}],["restart",{"2":{"155":6}}],["restricting",{"2":{"155":2}}],["restriction",{"2":{"0":2,"11":2}}],["restricted",{"2":{"61":1,"64":1,"67":1,"155":4}}],["restricts",{"2":{"11":3,"32":3}}],["research",{"2":{"103":1}}],["respect",{"2":{"11":1,"114":1}}],["respects",{"2":{"11":2,"36":2}}],["respectively",{"2":{"41":2}}],["respective",{"2":{"5":1,"12":1}}],["resource",{"2":{"9":1}}],["relies",{"2":{"110":1}}],["relate",{"2":{"11":1,"114":1}}],["related",{"2":{"0":1,"11":1,"12":1,"59":1,"104":1,"114":1,"135":1,"146":1,"147":1,"150":1}}],["relatively",{"2":{"11":1,"107":1,"155":1}}],["relationships",{"2":{"26":1}}],["relation",{"2":{"3":1}}],["relevant",{"2":{"1":1}}],["readers",{"2":{"73":1,"94":1,"102":1}}],["reactants",{"2":{"41":2}}],["reactions",{"2":{"41":1}}],["reaction",{"2":{"41":4}}],["reach",{"2":{"0":1,"11":1,"108":1}}],["real",{"0":{"93":1},"2":{"0":6,"11":7,"60":3,"63":5,"66":4,"73":1,"94":1,"156":2}}],["δ",{"2":{"0":1,"11":1,"51":1,"132":1,"135":1}}],["err",{"2":{"156":3}}],["error",{"0":{"21":1,"57":1},"2":{"0":6,"11":24,"21":9,"57":9,"135":1,"155":4,"156":4}}],["epoch",{"2":{"155":1}}],["euclidian",{"2":{"123":1,"124":1}}],["euclidean",{"2":{"11":6}}],["editors",{"2":{"84":1}}],["edge",{"2":{"11":2,"28":2,"156":2}}],["estimation",{"2":{"21":1,"57":1}}],["essential",{"2":{"13":1,"42":1,"140":1}}],["essentially",{"2":{"4":1}}],["ecosystem",{"2":{"12":1,"19":1,"42":1,"55":1,"59":1,"84":1}}],["eq",{"2":{"11":22,"112":12,"113":1,"114":6}}],["equiped",{"2":{"41":1}}],["equilibrium",{"2":{"41":4}}],["equivalent",{"2":{"11":1,"61":1,"64":1,"67":1}}],["equalities",{"2":{"11":2,"114":2}}],["equal",{"2":{"6":1,"11":16,"29":5,"30":8,"34":2,"41":1,"112":3,"114":1,"156":4}}],["earlier",{"2":{"153":1}}],["easy",{"2":{"136":1,"140":1}}],["easily",{"2":{"136":1,"137":1}}],["easier",{"2":{"11":1}}],["ease",{"2":{"83":1}}],["eachrow",{"2":{"132":4}}],["each",{"2":{"0":2,"8":1,"11":12,"20":3,"28":2,"36":2,"38":2,"41":3,"43":2,"56":3,"64":1,"67":1,"85":5,"87":1,"88":1,"109":1,"110":1,"140":1,"155":1,"156":2}}],["embodies",{"2":{"11":2,"156":1}}],["empty",{"2":{"0":1,"11":1,"114":1,"135":2,"155":11,"156":7}}],["emptydomain",{"2":{"0":1,"11":2,"60":2,"63":1,"66":1}}],["evolves",{"2":{"155":1}}],["evolution",{"2":{"139":2}}],["evals=d",{"2":{"144":1}}],["evals",{"2":{"139":1,"141":1,"144":1,"149":2,"152":1}}],["evaluated",{"2":{"155":1}}],["evaluates",{"2":{"11":2}}],["evaluation",{"2":{"135":1}}],["ever",{"2":{"53":1}}],["even",{"2":{"41":1}}],["eventually",{"2":{"11":2,"38":2}}],["else",{"2":{"132":4}}],["elementary",{"0":{"40":1}}],["element",{"2":{"11":12,"16":1,"33":9,"34":12,"135":2,"153":1,"155":1,"156":2}}],["elements",{"2":{"0":2,"11":18,"13":2,"17":1,"41":1,"49":1,"60":1,"107":1,"109":1,"112":8,"119":1}}],["eltype",{"2":{"11":3,"69":3,"135":2}}],["enabled",{"2":{"155":1}}],["enumerate",{"2":{"132":1}}],["environment",{"0":{"84":1},"2":{"137":1,"139":1}}],["energy",{"2":{"41":1}}],["entry",{"2":{"11":3,"155":1}}],["enforcing",{"2":{"11":2,"156":1}}],["ensure",{"2":{"11":1,"85":1,"127":1}}],["ensures",{"2":{"11":12,"24":2,"28":2,"32":1,"34":2,"36":6,"85":1,"156":2}}],["ensuring",{"2":{"8":1,"11":22,"30":7,"32":5,"34":2,"38":2,"40":2,"114":1,"135":3,"156":18}}],["encapsulate",{"2":{"11":1,"114":1,"155":2}}],["encapsuler",{"2":{"11":1,"63":1}}],["encourage",{"2":{"84":2,"102":1}}],["encode",{"2":{"135":1}}],["encoded",{"2":{"11":2,"28":2,"156":1}}],["encoding",{"0":{"128":1},"2":{"0":4,"11":5,"127":1,"128":4}}],["encompass",{"2":{"11":1}}],["enough",{"2":{"11":1,"72":1}}],["end``",{"2":{"155":1}}],["end",{"2":{"11":2,"25":1,"26":1,"45":2,"85":2,"132":15,"137":2,"139":3,"141":1,"142":1,"143":1,"144":2,"146":1,"148":2,"151":2,"155":3,"156":1}}],["etc",{"2":{"7":1,"137":1}}],["efficiently",{"2":{"41":1,"49":1,"156":1}}],["efficient",{"2":{"1":1,"10":1,"11":1,"16":1,"21":1,"57":1,"99":1}}],["e",{"2":{"0":1,"11":15,"28":4,"36":4,"38":2,"41":1,"79":1,"108":1,"132":3,"155":1}}],["either",{"2":{"0":4,"11":8,"21":1,"26":2,"36":4,"57":1,"60":1,"63":1,"66":1}}],["existing",{"2":{"11":2}}],["exists",{"2":{"11":3,"85":1,"143":1}}],["ex",{"2":{"11":3}}],["exactly",{"2":{"11":4,"31":7,"32":4,"156":3}}],["exampleusing",{"2":{"11":2}}],["example2",{"2":{"11":2}}],["examples",{"0":{"131":1},"1":{"132":1,"133":1},"2":{"11":22,"17":1,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"49":1,"84":1,"114":1,"139":1,"147":1,"150":1}}],["example",{"2":{"0":6,"1":1,"3":1,"4":1,"5":1,"6":1,"11":8,"20":4,"21":1,"23":2,"25":1,"26":1,"29":2,"33":1,"43":1,"57":1,"58":4,"84":1,"140":1,"143":1,"148":2,"151":2,"153":1}}],["exclu",{"2":{"11":3,"109":3}}],["exclude",{"2":{"11":1,"32":1}}],["excluded",{"2":{"11":1,"156":2}}],["exclusive",{"2":{"0":3,"11":11,"109":9,"117":1,"120":1,"125":1,"135":3}}],["except",{"2":{"11":2,"32":2}}],["except=vals",{"2":{"0":1,"11":2,"20":1,"58":1}}],["exceeds",{"2":{"6":1}}],["exceed",{"2":{"3":1}}],["experimental",{"0":{"97":1},"2":{"97":1}}],["experiments",{"0":{"95":1},"1":{"96":1,"97":1},"2":{"97":1}}],["expectations",{"2":{"84":1}}],["expect",{"2":{"73":1}}],["expected",{"2":{"0":3,"11":4}}],["expansion",{"2":{"11":1}}],["expr",{"2":{"11":2,"142":1,"143":3,"144":3}}],["express",{"2":{"156":1}}],["expressing",{"2":{"18":1}}],["expressions",{"2":{"109":1}}],["expression",{"2":{"11":8,"23":1,"32":1}}],["expresses",{"2":{"3":1}}],["explicit",{"2":{"156":1}}],["explicitly",{"2":{"11":2,"26":1,"156":3}}],["explanation",{"2":{"11":1,"79":1}}],["exploring",{"0":{"12":1,"59":1,"86":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"87":1},"2":{"105":1}}],["explore",{"2":{"0":4,"11":7,"12":1,"59":1,"70":4}}],["explored",{"2":{"0":3,"11":3,"70":2}}],["exploresettings",{"2":{"0":6,"11":6,"70":6}}],["explorations",{"2":{"12":1,"59":1}}],["exploration",{"0":{"70":1},"1":{"71":1},"2":{"0":3,"11":5,"49":1,"70":4,"72":1}}],["export",{"2":{"0":1,"11":1,"155":1}}],["externally",{"2":{"155":1}}],["external",{"2":{"11":1,"114":1}}],["extensions",{"0":{"47":1},"1":{"48":1},"2":{"42":1,"148":1,"151":1}}],["extensionally",{"2":{"26":1}}],["extensional",{"2":{"26":1}}],["extension",{"0":{"26":1,"61":1,"64":1,"67":1,"147":1,"150":1},"1":{"148":1,"149":1,"151":1,"152":1},"2":{"11":8,"22":1,"140":4,"147":1,"148":1,"150":1,"151":1,"156":4}}],["extensibility",{"2":{"10":1}}],["extending",{"0":{"140":1},"1":{"141":1,"142":1,"143":1,"144":1,"145":1,"146":1},"2":{"140":1}}],["extended",{"2":{"0":2,"11":19,"107":2,"112":8,"140":1}}],["extend",{"2":{"0":1,"11":2,"13":1,"47":1,"60":1,"69":1,"140":1,"146":1}}],["extends",{"2":{"0":3,"11":7,"41":4,"47":3,"61":5,"64":3,"67":3,"69":1,"72":2,"105":2,"135":3}}],["extremal",{"2":{"16":1}}],["extrema",{"0":{"51":1},"1":{"52":1},"2":{"0":2,"11":2,"42":1,"51":3,"132":1,"135":1,"155":3}}],["extracted",{"2":{"8":1,"19":1,"20":1,"55":1,"58":1}}],["extracts",{"2":{"0":1,"11":2,"43":1}}],["extract",{"2":{"0":2,"11":2,"21":1,"43":2,"57":1}}],["x``or",{"2":{"135":1}}],["x̅",{"2":{"135":4}}],["xn",{"2":{"85":1}}],["xi",{"2":{"25":2,"26":2}}],["x4",{"2":{"15":1}}],["x3",{"2":{"11":1,"15":1,"28":1}}],["x3c",{"2":{"0":18,"11":47,"25":4,"26":4,"29":2,"30":4,"31":4,"32":2,"35":2,"36":1,"41":3,"45":3,"60":6,"61":9,"63":11,"64":8,"66":12,"67":8,"72":12,"105":3,"132":2,"135":1,"155":91,"156":70}}],["x=x1",{"2":{"85":1}}],["x=6",{"2":{"6":1}}],["x=3",{"2":{"5":1,"6":1}}],["x26",{"2":{"11":4}}],["x2",{"2":{"4":1,"11":1,"15":1,"16":1,"28":1,"155":2}}],["x1+x2≤10",{"2":{"4":1}}],["x1",{"2":{"4":1,"11":1,"15":1,"16":1,"28":1,"155":2}}],["x+y≤10",{"2":{"3":1,"4":1,"6":1}}],["xto",{"2":{"0":1,"11":1,"108":1}}],["xcsp³",{"2":{"22":1}}],["xcsp",{"2":{"0":1,"1":1,"11":21,"20":3,"24":1,"25":1,"26":1,"28":2,"29":3,"30":3,"31":4,"32":4,"33":4,"34":4,"35":2,"36":2,"38":1,"40":1,"56":2,"58":1}}],["xcsp3",{"2":{"0":1,"8":1,"11":3,"20":6,"43":3,"45":1,"56":4,"58":2}}],["x",{"2":{"0":33,"3":1,"5":1,"11":316,"20":1,"21":4,"23":2,"24":8,"25":10,"26":11,"28":8,"29":12,"30":23,"31":22,"32":33,"33":16,"34":14,"35":8,"36":8,"38":4,"40":4,"41":4,"49":2,"51":2,"57":4,"58":1,"61":10,"64":10,"67":10,"85":6,"107":6,"108":8,"112":60,"116":4,"119":3,"123":1,"128":8,"132":42,"135":33,"139":4,"148":1,"151":1,"155":68,"156":50}}],["15",{"2":{"31":1,"148":1,"151":1}}],["1≤z",{"2":{"31":2,"35":2}}],["1≤y",{"2":{"29":1,"31":3,"33":2,"35":2}}],["1≤x",{"2":{"29":2,"31":7,"33":4,"35":2}}],["14",{"2":{"15":3}}],["101",{"0":{"74":1},"1":{"75":1,"76":1,"77":1}}],["10000",{"2":{"155":1}}],["1000",{"2":{"139":4}}],["100",{"2":{"0":2,"11":2,"139":1,"155":1}}],["10",{"2":{"0":2,"3":1,"5":1,"6":2,"11":29,"25":3,"26":3,"31":22,"32":27,"33":2,"35":2,"139":1,"148":1,"151":1,"155":2}}],["10^6",{"2":{"0":2,"11":2,"70":2}}],["123",{"2":{"0":1,"11":1,"15":3,"60":1,"63":1,"66":1}}],["12",{"2":{"0":1,"11":2,"15":3,"35":1,"36":1,"60":1,"63":1,"66":1}}],["1",{"2":{"0":6,"11":174,"15":3,"16":9,"18":1,"21":2,"24":2,"25":8,"26":11,"28":15,"29":30,"30":19,"31":122,"32":34,"33":44,"34":17,"35":61,"36":41,"38":4,"40":4,"41":3,"53":2,"57":2,"60":2,"63":2,"66":2,"85":5,"127":1,"128":1,"132":4,"139":3,"141":2,"146":4,"149":1,"152":2,"153":8,"155":4,"156":4}}],["=0",{"2":{"41":1}}],["=>",{"2":{"11":15,"28":15,"132":1,"137":2,"139":7,"141":6,"148":3,"149":10,"151":3,"152":6}}],["==",{"2":{"0":1,"11":9,"31":9,"32":2,"33":9,"34":4,"38":1,"61":1,"128":1,"132":2,"156":3}}],["=usual",{"2":{"0":1,"11":1,"20":1,"58":1}}],["=",{"2":{"0":34,"11":124,"15":10,"16":6,"18":3,"20":2,"21":2,"24":5,"25":10,"26":10,"28":16,"29":12,"30":3,"31":83,"32":16,"33":34,"34":12,"35":32,"36":17,"38":5,"40":1,"41":11,"43":1,"53":2,"56":1,"57":2,"58":1,"60":5,"61":4,"63":5,"64":4,"66":5,"67":4,"70":5,"85":1,"107":1,"114":5,"116":2,"125":1,"127":1,"128":3,"132":34,"135":12,"137":8,"139":7,"142":1,"143":1,"144":1,"145":1,"146":9,"155":47,"156":19}}],["vov",{"2":{"156":5}}],["vf",{"2":{"139":5}}],["v4",{"2":{"15":2}}],["v3",{"2":{"15":2,"31":3}}],["v2",{"2":{"15":2,"16":1,"31":3}}],["v1",{"2":{"15":2,"16":3,"31":3}}],["vs",{"2":{"11":3}}],["vec",{"2":{"85":1}}],["vectorofvariables",{"2":{"156":3}}],["vectors",{"2":{"0":1,"11":4,"70":1,"112":1,"116":2,"139":1}}],["vector",{"2":{"0":10,"11":63,"20":3,"28":2,"30":6,"32":9,"43":5,"45":1,"56":3,"60":1,"61":4,"63":4,"64":3,"66":1,"67":3,"72":1,"105":1,"107":2,"112":8,"114":1,"116":2,"119":1,"128":2,"132":5,"137":2,"139":1,"153":2,"155":1,"156":17}}],["verbose",{"2":{"155":4}}],["verbosity",{"2":{"155":1,"156":1}}],["versa",{"2":{"11":1,"114":1}}],["versatile",{"0":{"8":1},"2":{"156":1}}],["versionnumber",{"2":{"137":1,"153":1}}],["versions",{"2":{"21":1,"57":1,"137":4,"139":1,"153":3}}],["version",{"2":{"11":2,"84":1,"114":1,"137":5,"153":3,"156":1}}],["verifies",{"2":{"11":2,"28":2,"156":1}}],["vi",{"2":{"156":3}}],["via",{"2":{"136":1,"140":1,"141":1,"145":1}}],["viable",{"2":{"0":1,"11":6,"109":5}}],["vision",{"2":{"103":1}}],["visuals",{"2":{"139":4}}],["visualization",{"2":{"136":1,"137":1}}],["visual",{"2":{"84":1}}],["vice",{"2":{"11":1,"114":1}}],["violated",{"2":{"6":2,"21":1,"57":1}}],["violates",{"2":{"6":1}}],["violation",{"0":{"6":1},"2":{"2":1}}],["v",{"2":{"0":2,"11":3,"107":3,"139":5,"153":7,"155":3,"156":12}}],["var",{"2":{"11":20,"155":12}}],["vars=dictionary",{"2":{"155":1}}],["vars=ones",{"2":{"11":2,"32":2}}],["vars=nothing",{"2":{"11":10,"30":10}}],["vars=",{"2":{"11":11,"30":4,"40":2}}],["vars=zeros",{"2":{"11":2,"30":2}}],["vars",{"2":{"11":51,"20":2,"35":9,"36":15,"40":2,"43":2,"56":2,"123":3,"155":24,"156":20}}],["variant",{"2":{"11":2,"36":2}}],["variants",{"2":{"11":19,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"85":1}}],["variableconstrainedoncreation",{"2":{"156":1}}],["variableinfo",{"2":{"156":2}}],["variables",{"0":{"7":1,"12":1,"59":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1},"2":{"0":4,"2":3,"3":3,"4":3,"5":3,"7":1,"11":19,"12":2,"18":1,"25":1,"26":2,"28":1,"32":5,"34":2,"59":1,"72":1,"76":1,"85":3,"105":1,"108":1,"127":2,"155":26,"156":9}}],["variable",{"2":{"0":2,"6":1,"11":7,"13":1,"15":8,"16":4,"20":2,"23":2,"25":2,"26":4,"29":5,"31":12,"33":8,"34":2,"35":6,"43":2,"56":2,"61":3,"64":3,"67":3,"85":2,"155":40,"156":9}}],["varies",{"2":{"2":1}}],["various",{"0":{"131":1},"1":{"132":1,"133":1},"2":{"0":1,"7":1,"11":2,"19":1,"51":1,"55":1,"60":1,"84":1,"91":1,"96":1,"114":1,"136":2}}],["val=3",{"2":{"11":1,"31":1,"32":1}}],["val=2",{"2":{"11":4,"31":2,"32":3,"33":1,"34":1}}],["val=15",{"2":{"11":2,"31":2,"32":2}}],["val=1",{"2":{"11":4,"30":2,"32":1,"33":1,"34":1}}],["val=nothing",{"2":{"11":4,"30":2,"34":2}}],["valparameterdomain",{"2":{"11":1,"72":1,"105":1}}],["vals=",{"2":{"11":15,"30":2,"31":7,"32":13}}],["vals=nothing",{"2":{"0":1,"11":2,"20":1,"58":1}}],["valsparameterdomain",{"2":{"11":1,"72":1,"105":1}}],["vals",{"2":{"11":24,"20":2,"29":1,"30":2,"31":19,"32":18,"43":2,"56":2,"112":2,"114":2,"156":7}}],["validity",{"2":{"11":1,"156":1}}],["valid",{"2":{"0":5,"11":10,"28":1,"60":1,"127":2,"128":3,"156":7}}],["value2",{"2":{"137":1,"148":1,"151":1}}],["value1",{"2":{"137":1,"148":1,"151":1}}],["valued",{"2":{"11":1,"28":1,"156":1}}],["value",{"2":{"0":13,"11":53,"20":1,"25":2,"26":2,"28":3,"29":5,"30":1,"31":12,"32":1,"33":8,"34":11,"35":6,"38":4,"41":1,"43":1,"56":1,"61":8,"64":7,"66":2,"67":10,"72":2,"85":3,"105":1,"109":1,"114":8,"125":2,"128":1,"137":1,"155":20,"156":15}}],["values",{"2":{"0":5,"2":1,"5":1,"11":70,"15":1,"20":1,"21":2,"26":2,"28":2,"30":13,"32":27,"34":4,"38":3,"40":6,"41":4,"43":1,"56":1,"57":2,"60":2,"63":2,"66":4,"72":3,"85":2,"114":5,"137":1,"149":1,"152":1,"155":11,"156":12}}],["val",{"0":{"113":1,"124":1},"2":{"0":3,"11":124,"13":1,"20":1,"30":3,"31":24,"32":21,"33":8,"34":8,"35":7,"36":6,"38":4,"41":4,"43":1,"53":2,"56":1,"60":1,"113":2,"114":8,"123":3,"124":3,"139":2,"141":2,"142":2,"143":2,"144":2,"145":2,"155":8,"156":16}}],["upcoming",{"2":{"103":1}}],["up",{"0":{"84":1},"2":{"17":1,"155":1}}],["update",{"2":{"11":2}}],["utilized",{"2":{"11":1,"42":1,"156":1}}],["utilities",{"0":{"107":1},"2":{"10":1,"49":1}}],["us",{"2":{"156":1}}],["usage",{"0":{"137":1,"148":1,"151":1},"2":{"25":1,"137":1,"147":1,"150":1}}],["using",{"2":{"0":1,"11":1,"16":2,"20":1,"25":2,"26":2,"58":1,"85":1,"135":1,"136":1,"137":3,"139":3,"142":1,"148":2,"151":2,"156":1}}],["uses",{"0":{"90":1},"2":{"11":1,"114":1,"135":1}}],["useful",{"2":{"11":1,"53":1,"109":1,"155":1,"156":4}}],["users",{"2":{"10":1,"42":1,"59":1,"84":2,"140":1,"141":1}}],["user",{"2":{"8":1,"20":1,"56":1,"143":1,"144":1,"155":2}}],["use",{"2":{"0":2,"10":1,"11":5,"21":2,"24":2,"30":2,"32":1,"42":1,"49":1,"57":2,"59":1,"66":1,"83":1,"84":2,"85":1,"110":1,"136":1,"140":1,"155":2,"156":2}}],["used",{"2":{"0":1,"10":1,"11":27,"13":1,"20":2,"28":1,"36":4,"38":1,"43":2,"45":3,"56":2,"59":1,"60":1,"72":8,"84":1,"107":1,"109":2,"130":1,"135":2,"137":3,"148":1,"151":1,"155":1,"156":4}}],["usually",{"2":{"11":1,"155":1}}],["usual",{"0":{"20":1,"56":1,"58":1},"2":{"0":14,"11":24,"20":14,"21":3,"23":1,"24":3,"25":1,"43":8,"56":5,"57":3,"58":9,"110":1,"115":1,"118":1,"121":1}}],["unacceptable",{"2":{"156":1}}],["unfold",{"2":{"139":2}}],["undefkeyworderror",{"2":{"132":1}}],["understanding",{"0":{"79":1}}],["under",{"2":{"11":1,"114":1}}],["unique",{"2":{"24":2,"156":2}}],["union",{"2":{"0":4,"11":12,"32":1,"34":4,"43":1,"45":2,"53":1,"61":2,"64":1,"67":1,"69":2,"72":2,"105":2,"155":69,"156":4}}],["unrolled",{"2":{"11":1}}],["unlikely",{"2":{"10":1}}],["unordered",{"2":{"0":1,"11":1,"15":1,"66":1}}],["until",{"2":{"0":1,"11":1,"17":1,"49":1}}],["branch",{"2":{"137":1}}],["breaking",{"2":{"137":3,"153":3}}],["but",{"2":{"41":1,"85":1,"146":1}}],["building",{"0":{"98":1},"1":{"99":1,"100":1},"2":{"99":1}}],["build",{"2":{"25":1,"26":1,"105":10,"107":1,"108":1,"109":1,"112":2,"113":6,"123":4,"124":4,"125":1,"140":1,"156":2}}],["block",{"2":{"85":1,"137":1,"143":4,"144":2}}],["blocks",{"2":{"8":1,"85":2}}],["blank",{"2":{"41":2}}],["b2",{"2":{"31":1}}],["b1",{"2":{"31":1}}],["bariable",{"2":{"155":1}}],["backend",{"2":{"137":3,"142":1,"146":1,"149":1,"152":1}}],["backends",{"2":{"136":1,"137":1}}],["backward",{"2":{"41":1}}],["back",{"2":{"11":2,"38":2}}],["basis",{"2":{"85":1}}],["basic",{"0":{"76":1,"127":1},"2":{"11":5,"42":1,"84":1,"114":4,"127":1,"135":1,"146":1}}],["basics",{"0":{"1":1,"81":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1}}],["based",{"0":{"1":1,"30":1,"133":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1},"2":{"0":5,"1":1,"11":10,"20":4,"43":3,"53":1,"56":3,"58":1,"70":1,"72":1,"105":1,"109":1,"114":2,"128":1,"135":2,"147":1,"150":1,"156":1}}],["base",{"0":{"61":1,"64":1,"67":1},"2":{"0":6,"1":1,"11":29,"13":3,"41":9,"42":1,"47":2,"60":3,"61":12,"64":8,"67":9,"69":3,"72":4,"105":4,"109":1,"127":2,"155":4,"156":5}}],["binary",{"2":{"0":1,"11":1,"26":1,"128":1}}],["binarization==",{"2":{"132":1}}],["binarization",{"2":{"0":4,"11":4,"128":4,"132":13,"135":2}}],["binarized",{"2":{"11":1,"127":1}}],["binarize",{"2":{"0":2,"11":2,"128":2,"132":3}}],["bias",{"2":{"0":3,"11":3,"108":1}}],["bit",{"2":{"0":2,"11":2,"128":1}}],["bitvector",{"2":{"0":1,"11":5,"107":4}}],["bits",{"2":{"0":1,"11":3,"109":2}}],["b",{"2":{"0":1,"11":11,"28":2,"60":1,"61":8,"63":1,"64":8,"66":1,"67":8}}],["better",{"2":{"155":2}}],["between",{"2":{"0":7,"2":1,"3":1,"11":12,"13":1,"24":2,"26":1,"31":1,"41":2,"43":1,"51":2,"60":3,"63":2,"66":2,"155":1,"156":4}}],["benchmarked",{"2":{"148":1,"151":1}}],["benchmarking",{"2":{"147":1,"150":1}}],["benchmark",{"2":{"146":1,"148":1}}],["benchmarktools",{"0":{"147":1},"1":{"148":1,"149":1},"2":{"137":1,"147":1,"148":2,"149":8,"151":1}}],["below",{"2":{"139":1}}],["belongs",{"2":{"61":1,"64":1,"67":1,"155":2}}],["begin",{"2":{"137":2,"139":2,"148":2,"151":2,"155":22,"156":4}}],["best",{"0":{"99":1},"2":{"84":1,"99":1,"135":1,"155":1}}],["been",{"2":{"14":1,"93":1,"147":1,"150":1,"155":7}}],["before",{"2":{"11":8,"36":8,"143":1}}],["because",{"2":{"6":2,"23":1,"26":1}}],["behavior",{"2":{"0":1,"11":2,"13":1,"17":1,"70":2}}],["be",{"0":{"144":1},"2":{"0":9,"2":1,"3":1,"4":1,"5":1,"10":1,"11":28,"12":2,"16":3,"17":1,"18":1,"23":2,"26":3,"28":3,"34":4,"41":2,"59":1,"60":1,"70":3,"84":1,"85":1,"105":1,"109":5,"114":1,"117":1,"120":1,"125":1,"128":1,"135":2,"137":4,"140":1,"141":1,"142":1,"143":2,"144":2,"145":2,"146":2,"148":2,"151":2,"155":3,"156":18}}],["boxplots",{"2":{"139":4}}],["boxes",{"2":{"85":1}}],["bounded",{"2":{"11":1}}],["bounding",{"2":{"11":6,"113":1,"114":2}}],["bounds",{"2":{"0":1,"11":1,"13":1,"60":1}}],["bold",{"2":{"2":1}}],["bool=true",{"2":{"11":1,"31":1,"32":1}}],["bool=false",{"2":{"11":3,"31":1,"32":3}}],["boolparameterdomain",{"2":{"11":1,"72":1,"105":1}}],["bool",{"2":{"0":4,"11":9,"20":1,"32":1,"36":3,"43":1,"56":1,"60":4,"63":4,"66":4,"132":1,"137":1,"155":4,"156":8}}],["boolean",{"2":{"0":2,"11":5,"20":1,"43":1,"49":1,"56":1,"72":1,"137":1}}],["both",{"2":{"0":1,"11":3,"12":1,"41":2,"42":1,"51":1,"59":1,"156":1}}],["bytes",{"2":{"139":1,"146":4}}],["by",{"0":{"6":1},"2":{"0":5,"11":26,"19":2,"20":1,"21":1,"23":2,"26":3,"28":4,"30":1,"32":1,"34":2,"36":5,"41":1,"42":1,"45":1,"47":2,"55":2,"56":1,"57":1,"61":1,"64":1,"66":1,"67":1,"88":1,"96":1,"107":1,"109":1,"135":4,"143":2,"155":10,"156":4}}],["ptm",{"2":{"155":1}}],["png",{"2":{"139":2}}],["pkgextensions",{"2":{"140":1}}],["pkg",{"2":{"137":1,"140":1,"153":2}}],["pkgs",{"2":{"137":1,"139":1}}],["pôpulation",{"2":{"135":1}}],["penalty",{"2":{"132":20,"135":9}}],["perfchecker",{"0":{"136":1,"140":1},"1":{"137":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1},"2":{"136":1,"137":2,"139":3,"140":2,"141":3,"142":1,"143":1,"144":2,"145":1,"146":3,"147":1,"148":1,"150":1,"151":1,"153":5}}],["performances",{"0":{"44":1,"46":1,"48":1,"50":1,"52":1,"54":1,"62":1,"65":1,"68":1,"71":1}}],["performance",{"0":{"100":1,"144":1,"145":1},"2":{"10":1,"83":1,"100":1,"136":2,"137":4,"139":2,"141":1,"143":1,"144":1,"145":1,"155":1}}],["perform",{"2":{"0":1,"11":1,"70":1,"155":1}}],["per",{"2":{"0":1,"11":1,"19":1,"55":1,"128":1}}],["pivotal",{"2":{"55":1}}],["plainly",{"2":{"142":1}}],["placeholder",{"2":{"17":1}}],["plots",{"2":{"139":2}}],["plotting",{"2":{"139":1,"146":1}}],["pluto",{"2":{"84":1}}],["please",{"2":{"24":1,"84":1}}],["phase",{"2":{"11":1,"109":2}}],["push",{"2":{"132":1}}],["purpose",{"2":{"87":1}}],["purposes",{"2":{"11":1,"135":1}}],["puzzles",{"2":{"85":1}}],["puzzle",{"2":{"85":3}}],["public",{"0":{"0":1}}],["pseudo",{"2":{"11":1,"72":1}}],["p",{"2":{"0":1,"11":1,"41":2,"108":1,"156":1}}],["practices",{"0":{"99":1},"2":{"99":1}}],["practice",{"0":{"94":1}}],["practical",{"2":{"17":1,"19":1,"55":1}}],["primary",{"2":{"87":1,"137":1}}],["primarily",{"2":{"59":1}}],["printing",{"2":{"155":2}}],["print",{"2":{"85":1,"155":8}}],["principles",{"2":{"2":1}}],["projects",{"2":{"103":1}}],["proceeds",{"2":{"41":1}}],["processes",{"2":{"49":1}}],["processing",{"2":{"11":1,"114":1}}],["process",{"2":{"9":1,"11":1,"94":1,"114":1,"135":1,"137":1,"155":7}}],["programs",{"0":{"128":1}}],["programming",{"0":{"74":1,"75":1,"81":1,"89":1},"1":{"75":1,"76":1,"77":1,"90":1,"91":1},"2":{"1":2,"11":2,"14":1,"19":1,"26":1,"36":1,"42":1,"55":1,"73":1,"77":1,"79":1,"81":1,"85":1,"114":1,"156":1}}],["progress",{"2":{"21":1,"57":1}}],["produce",{"2":{"11":1,"107":1}}],["products",{"2":{"41":2}}],["product",{"2":{"11":1,"116":1}}],["prod",{"2":{"11":2,"116":2}}],["provide",{"2":{"13":1,"14":1,"17":1,"18":1,"20":1,"21":1,"23":2,"25":2,"26":1,"53":1,"57":1,"58":1,"84":1,"88":1,"96":1,"105":1,"137":1,"141":1,"147":1,"150":1,"156":1}}],["provided",{"2":{"11":18,"112":8,"137":2,"143":1}}],["provides",{"2":{"1":1,"9":1,"10":1,"12":1,"42":1,"73":1,"85":1,"136":2}}],["providing",{"2":{"8":1,"11":2,"156":1}}],["problem",{"2":{"4":3,"24":1,"41":6,"85":1,"94":1,"155":3}}],["problems",{"2":{"1":1,"9":1,"11":8,"18":1,"28":1,"36":4,"38":1,"41":2,"73":1,"75":1,"79":1,"85":1,"90":1,"91":1,"155":1,"156":2}}],["property",{"2":{"23":1}}],["properties",{"2":{"13":1,"41":1}}],["properly",{"2":{"0":1,"11":1,"13":1,"60":1}}],["proportional",{"2":{"0":1,"11":1}}],["prelimnary",{"2":{"148":1,"151":1}}],["preliminaries",{"2":{"132":3,"135":2}}],["prep",{"2":{"143":3}}],["preparatory",{"0":{"143":1},"2":{"137":1,"143":1}}],["previous",{"2":{"137":3}}],["previously",{"2":{"25":1}}],["precision",{"2":{"132":6,"135":1}}],["prefixed",{"2":{"20":1,"56":1}}],["prefix",{"2":{"11":3}}],["preferences",{"2":{"0":1,"11":1}}],["predictions",{"2":{"135":1}}],["prediction",{"2":{"135":1}}],["predict",{"2":{"132":9,"135":1}}],["predicates",{"2":{"85":2}}],["predicate",{"2":{"2":1,"3":1,"11":9,"23":1,"24":4,"25":2,"26":1,"109":1,"156":7}}],["predefined",{"2":{"9":1}}],["present",{"2":{"1":1,"11":1,"41":1,"139":1}}],["pretty",{"2":{"0":3,"11":3,"20":3,"58":3,"132":1,"155":2}}],["pool",{"2":{"155":1}}],["point",{"2":{"11":6,"36":4,"61":3,"64":2,"67":2,"72":1,"105":1}}],["points",{"2":{"0":4,"11":5,"60":1,"63":1,"64":1,"66":3,"67":2}}],["posed",{"2":{"85":1}}],["post",{"0":{"145":1},"2":{"73":1,"145":2,"146":1,"155":1}}],["pos",{"2":{"41":2}}],["positional",{"2":{"11":1}}],["positive",{"2":{"0":4,"11":15,"119":3}}],["possibly",{"2":{"11":2,"17":1,"66":1}}],["possible",{"2":{"5":1,"84":1,"111":1,"122":1,"155":2,"156":1}}],["populate",{"2":{"141":1}}],["population",{"2":{"0":2,"11":2,"135":2}}],["pop",{"2":{"135":2}}],["popsize=100",{"2":{"135":1}}],["popsize=200",{"2":{"0":1,"11":1}}],["popsize",{"2":{"0":4,"11":4}}],["pacakge",{"2":{"137":1}}],["packing",{"0":{"36":1}}],["package",{"0":{"87":1,"142":1},"2":{"12":1,"42":3,"43":1,"55":1,"59":1,"87":1,"88":1,"136":2,"137":1,"139":1,"142":1,"153":1}}],["packages",{"0":{"86":1},"1":{"87":1},"2":{"11":2,"42":2,"45":2,"136":1}}],["page",{"2":{"84":1}}],["passed",{"2":{"11":2}}],["patterfolds",{"2":{"139":1}}],["patterns",{"2":{"139":1}}],["pattern",{"2":{"11":1,"109":1}}],["patternfolds",{"2":{"11":1,"63":1,"139":3}}],["patch",{"2":{"137":2,"153":2}}],["patches",{"2":{"137":1,"153":1}}],["path",{"2":{"0":5,"11":6,"28":1,"137":2,"139":1,"148":1,"151":1,"155":5,"156":1}}],["pairs",{"2":{"11":1,"41":2,"156":2}}],["pairvarsparameterdomain",{"2":{"11":1,"72":1,"105":1}}],["paired",{"2":{"11":2,"20":1,"43":1,"56":1,"72":1}}],["pair",{"2":{"0":1,"11":64,"20":2,"30":16,"32":2,"35":9,"36":15,"40":4,"41":5,"43":2,"56":2,"70":1,"109":1,"135":3,"156":15}}],["parse",{"2":{"11":1}}],["paradigm",{"2":{"1":1}}],["param=nothing",{"2":{"0":1,"11":1}}],["params",{"2":{"0":1,"11":2,"132":1}}],["parameterization",{"2":{"11":1,"114":1}}],["parameter",{"2":{"0":4,"11":18,"20":4,"28":2,"43":3,"56":4,"72":1,"107":2,"114":6,"127":1,"135":1,"143":1,"156":1}}],["parameters=constraintcommons",{"2":{"0":1,"11":1,"43":1}}],["parameters",{"0":{"20":1,"43":1,"56":1,"72":1,"105":1},"1":{"44":1},"2":{"0":25,"11":44,"20":12,"42":1,"43":19,"56":8,"58":4,"70":3,"72":12,"105":6,"111":1,"114":2,"122":1,"135":5,"149":8}}],["parametric",{"0":{"112":1,"123":1},"2":{"0":3,"11":4,"114":2,"125":1,"135":1}}],["param",{"0":{"113":1,"124":1},"2":{"0":20,"11":37,"21":4,"57":4,"72":2,"105":2,"107":5,"113":6,"114":16,"124":4,"125":2}}],["parts",{"2":{"10":1}}],["particularly",{"2":{"109":1}}],["particular",{"2":{"4":1}}],["partially",{"2":{"0":1,"11":1,"85":1}}],["partial",{"2":{"0":2,"11":3,"49":1,"70":1,"155":1}}],["part",{"2":{"0":1,"11":2,"18":1,"19":1,"55":1,"70":1,"84":1}}],["∈",{"2":{"0":2,"11":9,"13":2,"47":1,"60":1,"61":7,"64":7,"67":7,"155":3,"156":2}}],["o",{"2":{"135":1,"155":16}}],["own",{"2":{"84":1,"85":1,"155":1}}],["objs=dictionary",{"2":{"155":1}}],["objs",{"2":{"155":7}}],["objectives",{"2":{"155":10}}],["objective",{"2":{"85":1,"155":24,"156":4}}],["object",{"2":{"0":3,"11":3,"70":3}}],["observable",{"2":{"41":1}}],["odd",{"2":{"17":1}}],["occurrences",{"2":{"11":7,"32":7,"156":4}}],["occurs",{"2":{"11":2,"31":1,"32":2}}],["out",{"2":{"85":1}}],["outside",{"2":{"11":2,"32":2}}],["output",{"2":{"0":2,"11":2,"135":1,"143":1,"144":1,"145":1,"146":1}}],["outputs",{"2":{"0":1,"11":1,"153":3}}],["our",{"2":{"4":1,"20":1,"49":1,"56":1,"85":2}}],["other",{"0":{"77":1},"2":{"1":1,"41":1,"77":1,"84":1,"85":4,"137":1,"146":1,"148":1,"151":1,"155":2}}],["otherwise",{"2":{"0":3,"6":1,"11":28,"21":1,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"45":1,"57":1,"61":1,"64":1,"67":1,"72":1,"105":1,"155":1,"156":4}}],["opt",{"2":{"156":2}}],["optmizers",{"2":{"135":1}}],["option",{"2":{"137":4,"156":1}}],["option2",{"2":{"137":1,"148":1,"151":1}}],["option1",{"2":{"137":1,"148":1,"151":1}}],["options",{"0":{"141":1,"149":1,"152":1},"2":{"135":2,"137":3,"141":3,"149":1,"152":1,"155":34,"156":5}}],["optionally",{"2":{"0":2,"11":2,"21":2,"57":2}}],["optional",{"2":{"0":10,"11":10,"41":1,"70":1,"128":1,"135":1,"137":1,"155":2}}],["optimizing",{"2":{"155":7}}],["optimization",{"0":{"77":1,"78":1,"79":1,"82":1,"91":1,"92":1},"1":{"79":1,"80":1,"81":1,"83":1,"84":1,"85":1,"93":1,"94":1},"2":{"2":1,"9":1,"14":1,"73":1,"79":2,"81":1,"83":1,"93":1,"94":1,"99":1,"155":2}}],["optimized",{"2":{"156":1}}],["optimizers",{"0":{"131":1},"1":{"132":1,"133":1},"2":{"135":1}}],["optimizer",{"2":{"15":11,"16":7,"25":7,"26":7,"29":3,"31":4,"33":4,"35":2,"85":1,"132":8,"135":6,"155":3,"156":59}}],["optimize",{"2":{"0":1,"11":1,"25":2,"26":2,"29":3,"31":4,"33":4,"35":2,"41":1,"135":11,"156":4}}],["open",{"2":{"11":5,"18":1,"31":1,"32":5,"110":1,"139":1}}],["operate",{"2":{"11":1,"114":1}}],["operation",{"2":{"11":5,"16":1,"109":5,"135":2}}],["operations",{"0":{"116":1},"2":{"0":7,"11":21,"47":1,"64":2,"67":2,"109":13,"114":1,"117":2,"120":1,"125":1,"135":3}}],["operating",{"2":{"11":5,"36":5}}],["operators",{"2":{"11":1,"72":1}}],["operator",{"2":{"11":7,"20":2,"30":4,"32":1,"43":2,"56":2}}],["op=>",{"2":{"11":2,"30":2}}],["op=≤",{"2":{"11":9,"29":1,"30":6,"32":3}}],["op===",{"2":{"11":6,"32":4,"34":2}}],["op==",{"2":{"11":1,"32":1}}],["op=≥",{"2":{"11":3,"30":2,"31":1,"32":1}}],["op=",{"2":{"11":6,"29":1,"30":6}}],["op=+",{"2":{"11":2,"30":2}}],["opparameterdomain",{"2":{"11":1,"72":1,"105":1}}],["op",{"2":{"11":29,"20":1,"29":1,"31":16,"32":10,"33":6,"34":8,"35":4,"36":4,"38":4,"43":1,"56":1,"109":2,"156":9}}],["once",{"2":{"84":1}}],["ones",{"2":{"7":1,"11":2,"32":2}}],["one",{"2":{"0":10,"11":16,"20":2,"21":1,"43":2,"56":2,"57":1,"72":1,"85":3,"105":1,"107":2,"109":2,"117":1,"120":1,"125":1,"127":1,"128":4,"132":1,"135":2,"137":1,"155":3,"156":1}}],["only",{"2":{"0":3,"11":5,"19":1,"42":1,"55":1,"85":1,"109":2,"117":1,"120":1,"125":1,"130":1,"155":1,"156":2}}],["on",{"0":{"38":1,"96":1},"2":{"0":6,"1":1,"11":21,"13":1,"16":1,"20":4,"23":1,"24":2,"36":5,"40":2,"41":1,"43":3,"56":3,"58":1,"60":1,"70":3,"72":1,"84":1,"91":1,"105":1,"110":1,"114":2,"128":1,"135":3,"137":1,"144":1,"147":1,"150":1,"155":2,"156":4}}],["overhead",{"2":{"149":2}}],["overloading",{"2":{"145":1}}],["overloaded",{"2":{"141":1,"142":1,"143":1,"144":1,"145":1,"146":2}}],["overlap",{"2":{"11":20,"35":6,"36":20,"156":1}}],["oversampling",{"2":{"132":6,"135":1}}],["oversample",{"2":{"0":2,"11":2,"49":2,"132":1}}],["overviews",{"0":{"87":1}}],["overview",{"0":{"80":1},"2":{"73":1}}],["over",{"2":{"0":3,"11":6,"51":1,"85":2,"108":1,"135":1,"136":1,"155":1}}],["oriented",{"2":{"42":1}}],["originating",{"2":{"11":1,"156":2}}],["origin",{"2":{"11":5,"36":5}}],["origins",{"2":{"11":6,"36":6}}],["ordered",{"2":{"11":8,"29":6,"30":6,"109":1,"155":1,"156":2}}],["order",{"2":{"11":9,"30":6,"40":2,"41":1,"114":1,"156":3}}],["organization",{"2":{"73":1,"87":1}}],["org",{"2":{"0":1,"11":1,"20":1,"58":1}}],["or",{"0":{"6":1},"2":{"0":9,"2":1,"3":1,"6":2,"7":1,"11":28,"13":2,"19":1,"20":3,"21":4,"23":1,"26":2,"32":1,"36":4,"41":1,"42":2,"43":4,"47":1,"53":1,"56":3,"57":4,"60":2,"61":1,"63":1,"64":1,"66":1,"67":1,"84":1,"85":1,"103":1,"114":5,"128":1,"137":7,"153":3,"155":6,"156":2}}],["official",{"2":{"84":1}}],["offers",{"2":{"9":1}}],["often",{"2":{"11":5,"36":4,"38":1,"137":1}}],["of",{"0":{"9":1,"111":1,"116":1,"119":1,"122":1},"1":{"112":1,"113":1,"114":1,"123":1,"124":1,"125":1},"2":{"0":100,"1":4,"2":2,"3":1,"4":3,"5":2,"6":1,"7":1,"8":3,"9":1,"10":3,"11":286,"13":4,"14":2,"15":1,"17":1,"18":2,"19":3,"20":20,"21":11,"26":4,"28":10,"30":12,"32":29,"34":11,"36":19,"38":6,"40":4,"41":33,"42":1,"43":12,"45":3,"49":3,"51":4,"55":3,"56":11,"57":11,"58":9,"60":3,"61":5,"63":7,"64":10,"66":7,"67":11,"70":17,"72":2,"73":2,"79":2,"81":1,"83":2,"84":1,"85":11,"94":1,"97":1,"100":1,"103":1,"105":5,"107":6,"108":3,"109":15,"110":3,"112":13,"114":8,"117":2,"119":2,"120":2,"125":2,"128":3,"135":14,"136":1,"137":15,"139":2,"142":1,"143":1,"144":1,"145":1,"146":1,"153":2,"155":78,"156":48}}],["i+1",{"2":{"85":1}}],["iconic",{"2":{"85":1}}],["icnlocalsearchoptimizer",{"2":{"135":3}}],["icngeneticoptimizer",{"2":{"135":4}}],["icnoptimizer",{"2":{"135":3}}],["icnconfig",{"2":{"135":4}}],["icns",{"2":{"109":1,"110":1,"115":1,"118":1,"121":1,"135":1}}],["icn=icn",{"2":{"0":1,"11":1}}],["icn",{"0":{"109":1},"2":{"0":23,"11":36,"64":2,"67":2,"109":7,"114":1,"117":1,"120":1,"125":1,"135":12}}],["io",{"2":{"41":2}}],["illustrate",{"2":{"24":1}}],["ignores",{"2":{"11":1,"36":1}}],["ignore",{"2":{"11":1,"36":1}}],["ignored",{"2":{"11":2,"35":1,"36":2}}],["i`",{"2":{"11":1,"61":1,"64":1,"67":1}}],["identity",{"2":{"11":14,"112":6,"114":4,"123":4}}],["identified",{"2":{"11":1}}],["id=1",{"2":{"11":3,"33":3,"34":3}}],["id=3",{"2":{"11":1,"33":1,"34":1}}],["id=nothing",{"2":{"11":4,"34":4}}],["ids",{"2":{"11":1,"72":1}}],["idparameterdomain",{"2":{"11":1,"72":1,"105":1}}],["id",{"2":{"11":3,"20":1,"33":3,"34":2,"41":2,"43":1,"56":1,"155":13,"156":2}}],["i",{"2":{"0":3,"11":68,"34":4,"36":4,"38":2,"61":10,"63":7,"64":8,"66":3,"67":8,"72":2,"85":4,"105":2,"107":2,"108":1,"109":2,"112":17,"132":2,"139":4,"146":8,"155":1,"156":2}}],["improving",{"2":{"155":1}}],["improve",{"2":{"100":1}}],["improvement",{"0":{"100":1},"2":{"155":1}}],["impact",{"2":{"91":1}}],["importance",{"2":{"73":1,"97":1}}],["import",{"2":{"15":1,"16":1,"25":1,"26":1}}],["implemented",{"2":{"16":2,"17":1}}],["implementing",{"0":{"13":1}}],["implements",{"2":{"8":1}}],["implement",{"2":{"0":1,"11":2,"13":1,"45":1,"60":1,"72":1,"105":1}}],["implementations",{"2":{"13":1}}],["implementation",{"2":{"0":2,"11":2,"45":2,"110":1}}],["immutable",{"2":{"0":1,"11":1,"66":1}}],["ith",{"2":{"11":1,"61":2,"64":1,"67":1,"72":1,"105":1}}],["its",{"2":{"0":3,"10":1,"11":5,"14":1,"41":1,"63":1,"66":1,"73":1,"75":1,"81":1,"83":1,"84":2,"85":1,"87":1,"107":2,"137":1,"155":2}}],["itself",{"2":{"0":1,"11":1}}],["iterate",{"2":{"155":1}}],["iterators",{"2":{"132":1}}],["iteration",{"2":{"0":2,"11":2,"155":8}}],["iterations",{"2":{"0":1,"11":1,"70":1,"155":3}}],["iter=100",{"2":{"0":2,"11":2}}],["iter",{"2":{"0":8,"11":8,"135":3,"155":1}}],["itvls",{"2":{"11":3,"63":3}}],["itv",{"2":{"0":2,"11":9,"60":2,"61":8,"63":2,"64":7,"66":2,"67":7,"72":3,"105":3,"139":2}}],["it",{"2":{"0":6,"3":1,"4":1,"5":1,"6":1,"8":1,"10":1,"11":57,"13":1,"16":2,"17":1,"19":1,"20":2,"23":1,"24":1,"25":1,"28":1,"32":2,"36":1,"42":2,"55":1,"58":2,"59":1,"60":1,"72":8,"84":1,"85":4,"109":1,"111":1,"114":1,"122":1,"128":1,"135":1,"136":1,"137":1,"139":2,"140":1,"141":2,"142":1,"144":1,"153":1,"155":6,"156":7}}],["isa",{"2":{"132":1}}],["issue",{"2":{"105":1,"110":1}}],["isempty",{"2":{"0":1,"11":4,"47":1,"61":3}}],["is",{"0":{"75":1},"2":{"0":32,"1":1,"3":1,"4":1,"5":1,"6":5,"10":1,"11":146,"13":3,"15":1,"16":2,"19":1,"20":6,"21":6,"23":3,"24":1,"25":3,"28":9,"32":11,"34":9,"36":4,"38":4,"40":2,"41":9,"42":1,"43":3,"47":2,"55":1,"56":1,"57":6,"58":5,"59":1,"60":2,"61":5,"63":3,"64":4,"67":4,"70":7,"72":9,"84":1,"85":6,"105":2,"107":1,"109":7,"112":16,"114":4,"117":1,"120":1,"125":2,"128":4,"130":1,"135":5,"136":1,"137":2,"139":3,"140":1,"142":1,"145":2,"155":17,"156":32}}],["inner",{"2":{"135":1,"155":1}}],["initpkgs",{"2":{"142":2}}],["initialization",{"0":{"142":1}}],["initializes",{"2":{"11":1}}],["init",{"2":{"132":1}}],["inf",{"2":{"155":1}}],["info",{"2":{"25":2,"26":2,"29":12,"31":25,"33":23,"35":15,"155":6,"156":2}}],["information",{"2":{"0":1,"11":1,"19":2,"55":2,"84":1,"135":1,"155":1,"156":1}}],["infrastructure",{"2":{"12":1}}],["inputs",{"2":{"11":1}}],["input",{"2":{"11":6,"20":3,"41":1,"43":3,"56":3,"137":3,"140":1}}],["involves",{"2":{"3":1}}],["involving",{"2":{"2":1,"11":1,"114":1}}],["invalid",{"2":{"0":1,"11":3,"156":1}}],["inside",{"2":{"140":1,"143":1,"144":1}}],["inspired",{"2":{"20":1,"56":1}}],["instructions",{"2":{"88":1}}],["installing",{"2":{"88":1}}],["installation",{"0":{"88":1}}],["installed",{"2":{"84":1,"153":1}}],["install",{"2":{"84":1}}],["instantiated",{"2":{"4":1}}],["instantiation",{"0":{"4":1},"2":{"2":1,"4":1,"6":2,"11":8,"40":8,"156":2}}],["instances",{"2":{"84":1}}],["instance",{"2":{"0":1,"11":3,"20":1,"28":2,"41":4,"56":1,"128":1,"155":2,"156":13}}],["instead",{"2":{"0":3,"11":4,"20":1,"43":1,"56":1,"107":2,"128":1,"155":1,"156":2}}],["insertion",{"2":{"0":1,"11":1,"53":1,"156":1}}],["insert",{"2":{"0":1,"11":1,"53":1,"155":3}}],["introduce",{"2":{"76":1,"80":1,"87":1,"155":1}}],["introductory",{"2":{"73":1}}],["introduction",{"0":{"1":1,"126":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"127":1},"2":{"126":1}}],["into",{"0":{"78":1,"146":1},"1":{"79":1,"80":1,"81":1},"2":{"0":3,"11":6,"22":1,"41":1,"60":1,"90":1,"107":1,"109":1,"119":1,"128":1,"135":1,"145":1,"146":1,"155":1}}],["integration",{"0":{"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1},"1":{"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1}}],["integers",{"2":{"16":1}}],["integer",{"2":{"0":3,"11":5,"20":1,"32":1,"41":3,"43":1,"56":1,"70":3,"79":1,"137":1,"156":5}}],["intend",{"2":{"155":1}}],["intended",{"2":{"137":1}}],["intentionally",{"2":{"23":1}}],["intentional",{"2":{"23":1}}],["intention",{"0":{"23":1,"24":1},"1":{"24":1,"25":1},"2":{"22":1,"23":2,"24":2,"25":5,"26":3,"29":3,"31":4,"33":4,"35":2,"156":17}}],["intensional",{"2":{"11":1}}],["intension",{"2":{"11":2}}],["interoperability",{"2":{"42":1}}],["interdiction",{"2":{"41":2,"155":2}}],["interacting",{"0":{"19":1,"55":1},"1":{"20":1,"21":1,"56":1,"57":1,"58":1},"2":{"109":1}}],["interpreted",{"2":{"11":2,"16":1,"28":2,"156":1}}],["interpretable",{"2":{"0":1,"11":1,"109":1}}],["intersect",{"2":{"0":1,"11":2,"63":2,"66":1}}],["intersections",{"2":{"0":1,"11":2,"63":2,"66":1}}],["intersection",{"2":{"0":1,"11":1,"43":1}}],["internally",{"2":{"11":1,"107":1}}],["internals",{"2":{"1":1,"11":1,"70":1}}],["internal",{"0":{"10":1},"2":{"0":1,"10":1,"11":4,"41":2,"45":1,"60":1,"109":1,"155":4}}],["interval",{"2":{"0":1,"11":8,"18":3,"60":1,"61":2,"63":6,"64":2,"66":3,"67":2,"72":1,"105":1,"139":1}}],["intervalsfold",{"2":{"139":1}}],["intervals",{"2":{"0":2,"7":1,"11":11,"18":2,"60":2,"61":5,"63":5,"64":4,"66":2,"67":4,"69":2,"72":2,"105":2,"139":2}}],["interfaced",{"2":{"147":1,"150":1}}],["interfaces",{"2":{"59":1,"84":1,"136":1}}],["interface",{"0":{"13":1,"130":1},"2":{"0":1,"8":1,"11":4,"13":1,"21":1,"23":1,"25":1,"45":2,"57":1,"60":1,"84":2,"130":1,"136":1,"140":1,"156":4}}],["int",{"2":{"0":4,"11":35,"16":1,"20":1,"25":2,"26":2,"28":2,"29":5,"30":8,"31":12,"32":9,"33":8,"34":1,"35":6,"38":1,"41":11,"58":1,"61":2,"64":2,"67":2,"70":1,"85":1,"107":8,"132":2,"155":30,"156":9}}],["incremental",{"2":{"156":4}}],["increment",{"2":{"155":3}}],["increasing",{"2":{"11":9,"29":1,"30":9}}],["increase",{"2":{"0":1,"11":1,"53":1}}],["inc",{"2":{"155":6}}],["inception",{"2":{"14":1}}],["inclusive",{"2":{"11":3,"109":3}}],["include",{"2":{"156":1}}],["included",{"2":{"11":1,"156":1}}],["includes",{"2":{"0":2,"8":1,"11":3,"36":1,"114":1,"125":1}}],["incsert",{"2":{"0":1,"11":1,"53":2}}],["indice",{"2":{"155":1}}],["indices",{"2":{"155":6}}],["indicate",{"2":{"155":2}}],["indicates",{"2":{"0":2,"11":2,"41":1}}],["indicating",{"2":{"0":1,"11":1,"70":1}}],["individuals",{"2":{"135":1}}],["independently",{"2":{"155":1}}],["independent",{"2":{"11":1,"20":1,"43":1,"56":1,"155":1}}],["indexed",{"2":{"11":2,"34":2}}],["index",{"2":{"11":6,"20":1,"34":3,"38":2,"43":1,"56":1,"155":1,"156":7}}],["ind",{"2":{"0":1,"11":1,"53":1,"155":2}}],["in",{"0":{"19":1,"24":1,"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1,"55":1},"1":{"20":1,"21":1,"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1,"56":1,"57":1,"58":1},"2":{"0":28,"2":3,"4":1,"5":1,"7":1,"11":116,"12":2,"13":2,"14":1,"15":4,"16":2,"18":1,"19":1,"20":11,"21":1,"22":1,"23":2,"24":1,"25":6,"26":6,"29":8,"30":8,"31":17,"32":26,"33":12,"34":6,"35":8,"36":11,"38":2,"40":2,"41":9,"42":1,"43":4,"45":2,"47":1,"51":1,"53":1,"55":1,"56":7,"57":1,"58":4,"59":1,"60":4,"61":6,"63":3,"64":8,"66":5,"67":9,"72":1,"73":1,"75":1,"81":1,"84":1,"85":7,"97":1,"105":1,"107":2,"108":1,"109":7,"110":1,"112":1,"114":1,"123":2,"132":2,"135":3,"137":1,"139":3,"140":1,"142":1,"143":1,"145":1,"146":5,"148":2,"151":2,"153":1,"155":16,"156":39}}],["iff",{"2":{"0":2,"11":2,"114":1,"125":1}}],["if",{"2":{"0":10,"4":1,"6":1,"11":65,"13":1,"21":1,"28":2,"30":3,"32":4,"34":6,"36":2,"38":1,"40":1,"45":3,"57":1,"60":1,"61":10,"64":9,"67":9,"72":2,"84":1,"85":1,"105":2,"109":4,"128":4,"132":4,"135":1,"155":14,"156":9}}],["want",{"2":{"148":1,"151":1}}],["was",{"2":{"140":1,"155":1}}],["way",{"2":{"11":3,"12":1,"23":1,"25":1,"26":1,"59":1,"105":1,"148":1,"151":1,"156":1}}],["warning",{"2":{"2":1,"11":1,"41":1}}],["would",{"2":{"4":1,"11":1}}],["worse",{"2":{"155":3}}],["world",{"0":{"93":1},"2":{"73":1,"94":1}}],["work",{"2":{"21":1,"57":1}}],["works",{"2":{"0":1,"11":1,"140":1,"141":1}}],["word",{"2":{"0":1,"11":8,"28":2,"45":6,"72":2,"105":2,"156":1}}],["well",{"2":{"85":1}}],["welcome",{"0":{"73":1},"2":{"9":1}}],["weigths",{"2":{"41":1,"108":1,"109":1}}],["weighting",{"2":{"135":1}}],["weighted",{"2":{"11":1}}],["weight",{"2":{"0":1,"11":2,"41":1,"127":1}}],["weights",{"2":{"0":8,"11":18,"41":3,"109":6,"135":5}}],["weights=nothing",{"2":{"0":1,"11":1}}],["we",{"2":{"1":1,"2":1,"4":1,"14":1,"17":1,"18":1,"19":1,"20":1,"23":1,"24":1,"25":1,"47":1,"49":1,"51":1,"53":1,"55":1,"58":1,"84":4,"85":6,"105":1}}],["write",{"2":{"0":2,"11":2}}],["while",{"2":{"155":5}}],["which",{"2":{"0":1,"6":2,"11":6,"20":1,"28":2,"41":7,"56":1,"61":1,"85":1,"107":1,"109":1,"136":1,"140":1,"156":1}}],["why",{"0":{"83":1}}],["what",{"0":{"75":1},"2":{"11":1,"73":1,"85":1}}],["whole",{"2":{"0":1,"11":1,"155":1}}],["whether",{"2":{"2":1,"6":1,"11":4,"32":1,"36":1,"156":1}}],["where",{"2":{"0":6,"11":18,"13":1,"28":1,"32":1,"38":2,"41":1,"60":5,"61":5,"63":5,"64":4,"66":5,"67":4,"72":2,"93":1,"105":2,"132":1,"137":1,"155":69,"156":8}}],["when",{"2":{"0":2,"1":1,"11":21,"41":1,"47":2,"85":1,"112":8,"114":2,"135":2,"137":1,"155":2,"156":1}}],["wip",{"2":{"136":1}}],["wikipedia",{"2":{"41":2,"85":1}}],["wide",{"2":{"8":1,"11":1,"28":1,"156":1}}],["width",{"2":{"0":2,"11":2,"20":2,"58":2}}],["width=150",{"2":{"0":1,"11":1,"20":1,"58":1}}],["will",{"2":{"0":7,"1":1,"11":8,"12":1,"16":1,"17":1,"20":1,"43":1,"58":1,"84":2,"85":1,"109":1,"117":1,"120":1,"125":1,"128":1,"135":1,"147":1,"150":1,"156":2}}],["without",{"2":{"11":17,"18":1,"112":8}}],["within",{"2":{"11":8,"12":1,"13":1,"28":2,"42":1,"55":1,"84":1,"87":1,"110":1,"115":1,"118":1,"121":1,"155":1,"156":6}}],["with",{"0":{"19":1,"55":1,"82":1,"131":1},"1":{"20":1,"21":1,"56":1,"57":1,"58":1,"83":1,"84":1,"85":1,"132":1,"133":1},"2":{"0":11,"2":1,"4":1,"5":1,"8":1,"9":1,"11":58,"16":1,"17":1,"20":5,"28":4,"36":3,"41":8,"43":1,"45":1,"56":1,"58":4,"63":1,"70":1,"72":1,"77":1,"85":5,"88":1,"107":2,"109":4,"112":8,"114":3,"125":1,"135":3,"137":2,"139":1,"141":1,"142":1,"147":1,"149":1,"150":1,"152":1,"155":8,"156":6}}],["w",{"2":{"0":2,"11":4,"45":2,"72":2,"105":2,"109":2,"135":2}}],["ds",{"2":{"135":2}}],["df",{"2":{"132":24,"135":2}}],["due",{"2":{"84":1}}],["during",{"2":{"11":1,"49":1,"109":2}}],["d1",{"2":{"15":1,"16":1,"18":1}}],["datatype",{"2":{"155":1}}],["dataframe",{"2":{"132":2,"135":1}}],["data",{"2":{"11":2,"114":2,"155":1}}],["draw",{"2":{"11":1,"61":2,"64":1,"67":1,"72":1,"105":1,"155":5}}],["done",{"2":{"145":1}}],["download",{"2":{"84":1}}],["doesn",{"2":{"11":3,"137":1}}],["does",{"2":{"11":7,"156":4}}],["documenter",{"2":{"105":10,"107":1,"108":1,"109":1,"112":2,"113":6,"123":4,"124":4,"125":1}}],["documentation",{"2":{"1":1,"41":1,"84":1,"106":1,"134":1,"135":1,"137":1,"138":1,"147":1,"150":1,"155":1,"156":1}}],["docstring",{"2":{"105":20,"107":2,"108":2,"109":2,"112":4,"113":12,"123":8,"124":8,"125":2,"155":29,"156":23}}],["doc",{"2":{"2":1}}],["do",{"2":{"0":1,"11":6,"36":4,"114":1}}],["domath",{"2":{"148":1,"151":1}}],["domains",{"0":{"12":1,"14":1,"17":1,"18":1,"59":1},"1":{"13":1,"14":1,"15":2,"16":2,"17":2,"18":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1},"2":{"0":27,"5":2,"7":2,"11":34,"12":3,"13":1,"14":1,"16":1,"17":1,"18":2,"41":1,"59":2,"60":4,"61":3,"63":9,"64":2,"66":7,"67":2,"69":2,"70":10,"72":1,"76":1,"105":3,"132":11,"135":2,"155":3}}],["domain",{"0":{"7":1},"2":{"0":34,"7":1,"11":46,"13":7,"15":4,"16":3,"18":3,"41":1,"60":19,"61":1,"63":12,"64":1,"66":15,"67":1,"70":2,"72":9,"85":1,"105":1,"128":4,"135":3,"155":20}}],["dom",{"2":{"0":4,"11":8,"132":4,"135":2}}],["d₂",{"2":{"0":2,"11":2,"63":2,"66":2}}],["d₁",{"2":{"0":2,"11":2,"63":2,"66":2}}],["d5",{"2":{"0":1,"11":1,"60":1,"63":1,"66":1}}],["d4",{"2":{"0":1,"11":1,"15":1,"60":1,"63":1,"66":1}}],["d3",{"2":{"0":1,"11":1,"15":1,"18":1,"60":1,"63":1,"66":1}}],["d2",{"2":{"0":1,"11":1,"15":1,"16":1,"18":1,"60":1,"63":1,"66":1}}],["dynamic",{"2":{"0":1,"11":3,"13":1,"16":1,"41":1,"60":1,"63":1,"114":1,"155":11}}],["dir",{"2":{"139":4,"148":1,"151":1}}],["directions",{"0":{"103":1},"2":{"11":1,"114":1}}],["directed",{"2":{"11":1,"28":1,"156":1}}],["directly",{"2":{"11":1,"23":1,"25":1,"156":1}}],["direct",{"2":{"10":1}}],["digits",{"2":{"85":2}}],["dive",{"0":{"78":1},"1":{"79":1,"80":1,"81":1},"2":{"90":1}}],["differs",{"0":{"77":1}}],["different",{"2":{"0":4,"2":1,"10":1,"11":29,"20":4,"21":1,"23":1,"24":6,"25":3,"26":2,"29":5,"30":8,"41":1,"43":1,"56":2,"57":1,"58":2,"84":1,"85":1,"114":3,"136":1,"139":1,"155":1,"156":1}}],["difference",{"2":{"0":2,"11":13,"20":1,"51":2,"56":1,"60":1,"63":1,"66":1}}],["diff",{"2":{"11":4,"123":1,"124":1}}],["dim=2",{"2":{"11":2,"33":2,"34":2}}],["dim=1",{"2":{"11":2,"34":2}}],["dimparameterdomain",{"2":{"11":1,"72":1,"105":1}}],["dimensional",{"2":{"11":1}}],["dimensions",{"2":{"11":1,"72":1}}],["dimension",{"2":{"11":1,"20":1,"43":1,"56":1,"155":1,"156":5}}],["dim",{"2":{"11":3,"20":1,"33":1,"35":1,"36":2,"43":1,"56":1,"132":3,"155":4,"156":7}}],["dictionaries",{"0":{"53":1},"1":{"54":1},"2":{"42":1,"53":1}}],["dictionaryview",{"2":{"155":1}}],["dictionary",{"2":{"0":8,"11":18,"20":5,"41":3,"43":1,"53":1,"58":5,"114":2,"136":1,"137":1,"139":1,"141":2,"143":1,"144":1,"155":6}}],["dict=usual",{"2":{"0":1,"11":1,"43":1}}],["dict",{"2":{"0":8,"11":12,"20":5,"28":4,"43":3,"58":5,"137":1,"139":1,"141":2,"143":3,"144":3,"145":3,"148":1,"151":1}}],["discuss",{"2":{"83":1,"91":1,"97":1}}],["discreteset",{"2":{"15":8,"25":1,"26":1,"156":6}}],["discretedomain",{"2":{"0":3,"11":7,"60":1,"61":3,"63":1,"64":3,"66":4,"67":3,"72":1,"105":1,"132":1}}],["discrete",{"0":{"14":1,"66":1},"1":{"15":1,"16":1,"17":1,"67":1,"68":1},"2":{"0":5,"7":1,"11":5,"12":1,"13":1,"14":2,"16":1,"59":1,"60":1,"63":1,"66":4,"135":1,"155":1,"156":5}}],["displays",{"2":{"41":1}}],["display",{"2":{"41":13}}],["dispatch",{"2":{"11":1,"114":1,"135":1,"155":2}}],["distributed",{"2":{"155":1}}],["distdifferent",{"2":{"25":3,"26":3,"156":1}}],["distinct",{"2":{"11":2,"32":2,"85":2,"156":1}}],["dist",{"2":{"11":5,"23":1,"24":6,"25":3,"26":2,"155":1}}],["distances",{"2":{"24":2,"41":4,"156":1}}],["distance",{"2":{"0":5,"11":6,"13":1,"41":1,"60":2,"63":1,"66":1,"108":1,"155":1,"156":3}}],["diagrams",{"2":{"11":1,"45":2}}],["diagram",{"2":{"0":1,"11":5,"28":4,"45":1,"156":1}}],["d",{"2":{"0":22,"11":54,"13":7,"28":4,"53":1,"60":14,"61":29,"63":7,"64":23,"66":9,"67":26,"69":1,"72":12,"105":11,"132":2,"135":2,"139":3,"144":2,"145":2,"155":9}}],["deprecated",{"2":{"156":1}}],["dependencies",{"2":{"139":1}}],["depending",{"2":{"84":1,"137":1}}],["depend",{"2":{"11":1,"114":1}}],["depends",{"2":{"0":1,"11":1,"13":1,"60":1,"155":1}}],["deepcopy",{"2":{"155":1}}],["deeper",{"2":{"90":1}}],["debugging",{"2":{"155":1}}],["debinarize",{"2":{"0":1,"11":1,"128":1}}],["delineation",{"2":{"156":1}}],["delta",{"2":{"155":6}}],["delegates",{"2":{"11":1,"114":1}}],["delete",{"2":{"0":4,"11":5,"13":1,"60":1,"67":3,"155":13}}],["devops",{"2":{"137":2,"139":1}}],["develop",{"2":{"137":1}}],["developers",{"2":{"42":1}}],["development",{"2":{"42":1,"137":1}}],["developing",{"2":{"1":1}}],["dedicated",{"2":{"24":1}}],["descent",{"0":{"132":1},"2":{"135":1}}],["description",{"2":{"0":2,"11":3,"20":1,"24":1,"58":1,"155":10,"156":12}}],["descriptions",{"2":{"0":4,"11":4,"20":4,"58":4}}],["describes",{"2":{"41":1}}],["described",{"2":{"20":1,"56":1}}],["describe",{"2":{"0":2,"11":3,"20":4,"43":1,"56":2,"58":2,"110":1,"115":1,"118":1,"121":1,"132":1,"155":3}}],["design",{"2":{"19":1,"55":1}}],["designed",{"2":{"19":1,"23":1,"25":1,"42":1,"55":1,"136":1}}],["details",{"2":{"105":10,"107":1,"108":1,"109":1,"112":2,"113":6,"123":4,"124":4,"125":1}}],["detailed",{"2":{"12":1}}],["determining",{"2":{"13":1}}],["deterministic",{"2":{"0":1,"11":1,"45":1}}],["determine",{"2":{"0":1,"11":2}}],["determined",{"2":{"0":1,"11":1,"70":1,"155":1}}],["denotes",{"2":{"11":2}}],["decrement",{"2":{"155":1}}],["decrease",{"2":{"155":2}}],["decreasing",{"2":{"11":8,"30":8}}],["decay",{"2":{"155":3}}],["declare",{"2":{"11":1,"156":1}}],["decision",{"2":{"0":1,"11":3,"28":1,"45":3,"156":1}}],["derived",{"2":{"11":1,"156":1}}],["definition",{"0":{"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1},"1":{"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1},"2":{"3":1,"4":1,"5":1,"6":1,"11":1,"19":1,"55":1}}],["defining",{"0":{"12":1,"24":1,"59":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1},"2":{"0":1,"11":1,"13":1,"20":1,"23":1,"25":1,"58":1,"156":2}}],["defines",{"2":{"0":1,"11":2,"25":1,"26":1,"63":1,"66":1,"109":1,"156":1}}],["define",{"2":{"0":2,"11":6,"12":1,"20":1,"23":1,"24":2,"26":1,"58":1,"59":1,"75":1,"85":1,"156":1}}],["defined",{"0":{"7":1,"28":1},"2":{"0":2,"7":1,"11":15,"12":1,"16":1,"20":1,"23":3,"26":3,"30":1,"32":1,"36":5,"58":1,"60":1,"66":1,"85":2,"112":1,"123":1,"135":2,"137":1,"149":1,"152":1,"155":1,"156":4}}],["default",{"0":{"141":1},"2":{"0":14,"11":21,"17":1,"20":3,"21":1,"32":1,"41":9,"43":3,"57":1,"58":3,"61":1,"70":5,"128":1,"130":1,"135":4,"137":3,"141":2,"149":9,"152":1,"155":2}}],["defaults",{"2":{"0":2,"11":8,"30":1,"43":1,"53":1,"135":2}}],["myperfextension",{"2":{"141":1,"142":1,"143":1,"144":1,"145":1}}],["mypackagename",{"2":{"137":1}}],["mkpath",{"2":{"139":1}}],["mmds",{"2":{"45":1}}],["might",{"2":{"85":2}}],["mission",{"2":{"73":1}}],["missing",{"2":{"25":1,"26":1,"105":20,"107":2,"108":2,"109":2,"112":4,"113":12,"123":8,"124":8,"125":2}}],["minor",{"2":{"137":2}}],["min",{"2":{"132":2,"156":1}}],["mincut",{"2":{"41":1,"155":2}}],["minus",{"2":{"11":28,"112":2,"113":2,"114":4,"123":2,"124":2}}],["minkowski",{"2":{"0":1,"11":1,"108":1}}],["minimization",{"2":{"156":1}}],["minimizing",{"2":{"41":1}}],["minimum",{"2":{"0":1,"11":11,"33":6,"34":10,"41":1,"51":1,"132":2,"156":4}}],["minimal",{"2":{"0":3,"11":4,"16":1,"45":2,"107":1,"108":1,"155":3}}],["move",{"2":{"155":3}}],["moved",{"2":{"105":1}}],["mode",{"2":{"156":1}}],["modellike",{"2":{"156":2}}],["modeled",{"2":{"155":1}}],["modeler",{"2":{"41":13}}],["modelize",{"2":{"41":1}}],["modeling",{"0":{"1":1,"99":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1},"2":{"9":1,"23":1,"25":1,"84":2,"85":1}}],["model",{"0":{"85":1},"2":{"11":3,"15":1,"16":1,"25":7,"26":7,"28":1,"29":19,"31":36,"33":28,"35":18,"41":14,"85":3,"155":74,"156":45}}],["models",{"0":{"9":1,"98":1},"1":{"99":1,"100":1},"2":{"1":1,"9":3,"11":1,"12":1,"13":1,"85":1,"99":1,"100":1,"114":1}}],["modules=",{"2":{"134":1}}],["module",{"0":{"61":1,"64":1,"67":1},"2":{"11":1}}],["more",{"2":{"9":1,"11":2,"16":1,"137":1}}],["moisupports",{"2":{"156":1}}],["moisum",{"2":{"156":1}}],["moiregular",{"2":{"156":1}}],["moiordered",{"2":{"156":1}}],["moinooverlap",{"2":{"156":1}}],["moinvalues",{"2":{"156":1}}],["moimultivalueddecisiondiagram",{"2":{"156":1}}],["moiminimum",{"2":{"156":1}}],["moimaximum",{"2":{"156":1}}],["moiintention",{"2":{"156":17}}],["moiinstantiation",{"2":{"156":1}}],["moiextension",{"2":{"156":1}}],["moierror",{"2":{"156":5}}],["moielement",{"2":{"156":1}}],["moidistdifferent",{"2":{"156":1}}],["moicumulative",{"2":{"156":1}}],["moiconflicts",{"2":{"156":1}}],["moiallequal",{"2":{"156":1}}],["moialldifferent",{"2":{"156":1}}],["moi",{"2":{"1":1,"12":1,"15":10,"16":8,"18":3,"25":5,"26":5,"29":3,"31":4,"33":4,"35":2,"41":1,"59":1,"156":38}}],["mostly",{"2":{"146":1}}],["most",{"2":{"0":1,"8":1,"10":1,"11":5,"31":6,"32":4,"59":1,"85":1,"128":1,"156":1}}],["memory",{"2":{"149":2}}],["membership",{"2":{"13":1}}],["means",{"2":{"11":3,"31":1}}],["meaningful",{"2":{"97":1}}],["meaning",{"2":{"11":2,"32":2,"109":1}}],["measurement",{"2":{"155":1}}],["measure",{"2":{"0":2,"11":2}}],["meets",{"2":{"2":1}}],["metasolver",{"2":{"155":4}}],["metastrategist",{"0":{"138":1},"2":{"138":1}}],["metaheuristics",{"0":{"80":1},"2":{"77":1}}],["metrics",{"0":{"108":1},"2":{"136":1,"139":1}}],["metric=hamming",{"2":{"0":1,"11":1,"135":1}}],["metric",{"2":{"0":8,"11":8,"135":6}}],["methods",{"0":{"92":1},"1":{"93":1,"94":1},"2":{"0":3,"2":1,"11":4,"13":2,"20":1,"42":2,"45":1,"58":1,"60":1,"72":1,"77":1,"105":1,"107":2,"155":3}}],["method",{"2":{"0":5,"11":28,"21":1,"43":1,"45":1,"57":1,"60":1,"61":3,"63":1,"64":3,"66":1,"67":3,"112":8,"130":2,"135":3,"141":1,"142":2,"143":2,"144":1,"145":2,"146":1,"155":1}}],["merge",{"2":{"0":2,"11":2,"63":2,"66":2,"155":1}}],["mutable",{"2":{"155":2}}],["mutually",{"2":{"0":3,"11":4,"109":1,"117":1,"120":1,"125":1,"135":1}}],["much",{"2":{"21":1,"57":1}}],["must",{"2":{"0":2,"3":2,"11":8,"13":2,"23":1,"26":2,"28":2,"34":2,"41":2,"60":1,"66":1,"156":7}}],["multithreading",{"2":{"155":1}}],["multithreaded",{"2":{"155":1}}],["multiplied",{"2":{"41":1}}],["multiplication",{"2":{"0":1,"11":1,"47":1}}],["multimedia",{"2":{"41":4}}],["multi",{"2":{"11":1,"28":1,"156":1}}],["multivalued",{"2":{"0":1,"11":2,"45":3}}],["magic",{"2":{"41":2}}],["major",{"2":{"21":1,"57":1,"105":1,"137":2,"153":2}}],["machinery",{"2":{"19":1,"55":1}}],["macro",{"2":{"0":2,"11":5,"20":2,"58":2,"110":1,"136":1,"139":1,"141":1,"156":1}}],["makie",{"2":{"136":1,"137":1}}],["making",{"2":{"17":1}}],["make",{"2":{"11":8,"49":1,"110":2,"114":3,"125":1,"132":2,"135":3,"139":1,"155":1}}],["makes",{"2":{"6":1}}],["may",{"2":{"17":1}}],["map",{"2":{"11":1,"107":1,"132":5,"155":4}}],["mapping",{"2":{"11":1,"114":1}}],["marks",{"2":{"11":1,"24":2,"41":1,"156":2}}],["matter",{"2":{"137":1,"156":1}}],["matters",{"2":{"104":1}}],["matrices",{"0":{"21":1,"57":1,"129":1},"1":{"130":1,"131":1,"132":1,"133":1},"2":{"11":1,"21":1,"57":1,"130":1,"135":1}}],["matrix",{"2":{"0":1,"11":2,"41":4,"127":2,"135":2}}],["match",{"2":{"11":3,"156":2}}],["matches",{"2":{"11":3,"156":2}}],["mathoptinterface",{"2":{"1":1,"15":1,"16":1,"25":1,"26":1,"41":2,"156":17}}],["mathematical",{"0":{"81":1},"2":{"1":1,"2":1,"3":1,"81":1}}],["maths",{"2":{"0":1,"11":1}}],["mainsolver",{"2":{"155":7,"156":1}}],["mainly",{"2":{"11":1,"12":1,"17":1}}],["main",{"0":{"144":1},"2":{"0":1,"11":1,"20":1,"22":1,"56":1,"136":1,"141":1,"142":1,"155":5,"156":1}}],["manages",{"2":{"155":1}}],["manage",{"2":{"155":1}}],["managed",{"2":{"155":1}}],["manager",{"2":{"84":1}}],["manipulating",{"2":{"109":1}}],["manipulation",{"2":{"11":1,"19":1,"55":1,"114":1}}],["manhattan",{"2":{"0":1,"11":1,"108":1}}],["many",{"2":{"0":1,"11":1,"49":1,"137":1}}],["max",{"2":{"0":4,"11":8,"70":4,"107":2,"109":2,"155":10,"156":1}}],["maximum",{"2":{"0":5,"11":15,"33":5,"34":10,"51":1,"60":1,"63":1,"66":1,"70":2,"155":6,"156":4}}],["m",{"2":{"0":2,"11":2,"15":5,"16":3,"41":6,"43":2,"85":5,"155":139}}],["mddconstraint",{"2":{"156":2}}],["mdd",{"2":{"0":2,"11":16,"20":1,"28":12,"43":1,"45":3,"56":1,"72":1,"105":1,"156":2}}],["fetch",{"2":{"155":1}}],["feasible",{"2":{"85":2}}],["feature",{"2":{"21":1,"42":1,"57":1,"140":1}}],["features",{"0":{"127":1},"2":{"8":1,"12":1,"19":1,"55":1,"59":1,"87":1,"105":1,"136":1}}],["f2",{"2":{"155":2}}],["future",{"0":{"103":1},"2":{"43":1}}],["further",{"2":{"41":1,"84":1}}],["fundamentals",{"2":{"81":1}}],["fundamental",{"2":{"11":1,"156":1}}],["func",{"2":{"155":6}}],["funcs",{"2":{"0":2,"11":2,"107":2}}],["functionalities",{"2":{"10":1,"13":1}}],["functioning",{"2":{"10":1}}],["functions",{"0":{"21":1,"57":1},"2":{"0":2,"11":8,"41":1,"42":1,"109":3,"114":4,"125":1,"140":1,"146":2}}],["function",{"2":{"0":19,"11":52,"20":1,"21":5,"23":1,"28":1,"43":1,"49":1,"53":1,"57":5,"58":1,"70":1,"85":1,"107":6,"110":1,"112":1,"114":4,"123":1,"132":7,"135":3,"146":1,"155":12,"156":29}}],["full",{"0":{"11":1}}],["faster",{"2":{"155":1}}],["facilities",{"2":{"41":6}}],["facilitate",{"2":{"19":1,"42":1,"55":1}}],["facilitates",{"2":{"11":1,"114":1}}],["fake",{"2":{"11":1,"72":1,"105":1}}],["fakeautomaton",{"2":{"11":5,"45":2,"61":2,"64":1,"67":1,"72":5,"105":4}}],["fa",{"2":{"11":3,"45":1,"61":4,"64":2,"67":2,"72":3,"105":3}}],["fails",{"2":{"2":1}}],["fallback",{"2":{"0":1,"11":4,"60":1,"61":2,"63":1,"64":2,"66":1,"67":2}}],["false",{"2":{"0":5,"6":1,"11":31,"18":1,"25":1,"26":1,"29":4,"30":3,"31":4,"32":4,"33":9,"34":10,"36":2,"38":1,"40":1,"45":1,"47":1,"49":1,"61":2,"64":2,"67":2,"72":1,"105":1,"125":1,"132":3,"155":2,"156":4}}],["fraction",{"2":{"146":1}}],["framework",{"2":{"1":1,"10":1}}],["front",{"2":{"110":1}}],["from",{"0":{"28":1,"77":1,"94":1},"2":{"0":2,"4":1,"8":1,"11":14,"20":1,"28":1,"41":2,"58":1,"61":4,"64":2,"67":3,"72":2,"73":1,"85":2,"94":1,"105":3,"114":2,"130":1,"135":1,"136":1,"139":4,"143":1,"144":1,"145":1,"146":1,"155":17,"156":6}}],["free",{"2":{"41":1}}],["friendly",{"2":{"8":1}}],["filter",{"2":{"132":1}}],["filled",{"2":{"85":1}}],["fill",{"2":{"41":4,"85":1}}],["file",{"2":{"0":7,"11":7,"109":1}}],["finally",{"2":{"21":1,"57":1}}],["finer",{"2":{"21":1,"57":1}}],["finds",{"2":{"153":1}}],["find",{"2":{"20":1,"56":1,"155":2}}],["finish",{"2":{"11":2,"28":2}}],["finishes",{"2":{"11":8,"36":8}}],["first",{"0":{"85":1},"2":{"11":13,"28":1,"31":1,"36":8,"85":1,"132":4,"135":1,"137":4,"153":1,"155":1,"156":1}}],["fields",{"2":{"0":1,"11":1,"156":1}}],["flatten",{"2":{"132":1}}],["flexibility",{"2":{"84":1}}],["flexible",{"2":{"0":4,"1":1,"11":6,"26":1,"70":3,"114":1}}],["flows",{"2":{"41":1}}],["flow",{"2":{"41":1}}],["float64",{"2":{"11":2,"132":1,"155":5,"156":1}}],["floor",{"2":{"0":2,"11":2,"70":2}}],["folder",{"2":{"139":2}}],["fold",{"2":{"139":1}}],["follwing",{"2":{"136":1}}],["follows",{"2":{"85":1,"137":1,"156":1}}],["follow",{"2":{"43":1}}],["following",{"2":{"0":6,"2":1,"11":8,"13":1,"32":1,"49":1,"60":1,"107":2,"114":1,"128":1,"139":1,"148":1,"151":1,"155":1}}],["found",{"2":{"109":1}}],["foundational",{"2":{"42":1}}],["foundation",{"2":{"13":1}}],["foreseeable",{"2":{"43":1}}],["forwarded",{"2":{"155":1}}],["forward",{"2":{"41":2,"85":1}}],["forbidden",{"2":{"11":1,"41":1,"156":2}}],["formulating",{"2":{"94":1}}],["form",{"2":{"11":2,"38":2}}],["formal",{"2":{"3":1,"155":1}}],["formatted",{"2":{"0":1,"11":2,"107":1}}],["format",{"2":{"0":2,"11":3,"20":1,"41":9,"43":1,"56":1,"60":1,"128":1}}],["for",{"0":{"82":1,"109":1,"128":1},"1":{"83":1,"84":1,"85":1},"2":{"0":13,"1":3,"5":1,"6":1,"9":1,"10":1,"11":51,"12":1,"13":5,"16":2,"17":1,"20":1,"21":2,"23":1,"24":1,"25":2,"26":2,"29":2,"31":1,"33":1,"34":4,"36":4,"38":1,"41":12,"43":1,"45":3,"47":1,"53":1,"56":1,"57":2,"60":3,"61":3,"63":2,"64":3,"66":2,"67":3,"69":2,"70":2,"72":2,"83":1,"84":3,"85":2,"88":1,"99":1,"103":1,"105":21,"106":1,"107":4,"108":2,"109":4,"112":5,"113":12,"114":5,"123":9,"124":8,"125":2,"127":1,"128":2,"130":1,"132":2,"134":1,"135":8,"136":3,"137":5,"138":1,"139":5,"140":2,"141":1,"143":2,"144":1,"146":5,"153":1,"155":18,"156":14}}],["f",{"2":{"0":14,"11":16,"21":6,"45":1,"49":2,"57":5,"107":6,"155":7,"156":40}}],["t2",{"2":{"156":4}}],["t1",{"2":{"156":3}}],["tbw",{"2":{"135":4,"155":2}}],["tips",{"2":{"99":1}}],["timelimitsec",{"2":{"156":1}}],["time",{"2":{"11":8,"36":6,"41":1,"109":2,"114":1,"146":1,"149":2,"155":26,"156":1}}],["times",{"2":{"11":8,"31":1,"32":3,"36":5,"139":2,"146":3}}],["tutorial",{"0":{"139":1}}],["tutorials",{"0":{"95":1,"96":1},"1":{"96":1,"97":1},"2":{"96":1}}],["tuples",{"2":{"11":2,"26":2,"156":4}}],["tuple",{"2":{"0":6,"11":14,"34":7,"36":1,"41":2,"60":5,"63":5,"66":5,"70":1,"137":1,"156":9}}],["temporary",{"2":{"155":1}}],["templates",{"2":{"9":1}}],["tests",{"2":{"137":1}}],["tested",{"0":{"144":1},"2":{"137":1,"143":1}}],["test",{"2":{"132":6,"135":2,"136":1,"137":2}}],["testing",{"0":{"145":1},"2":{"11":1,"135":1,"136":1,"139":2,"141":1,"144":1,"145":1}}],["text",{"2":{"110":1,"115":1,"118":1,"121":1}}],["teach",{"2":{"100":1}}],["techniques",{"0":{"77":1,"89":1},"1":{"90":1,"91":1}}],["tendency",{"2":{"41":1}}],["terminology",{"0":{"2":1,"76":1},"1":{"3":1,"4":1,"5":1,"6":1},"2":{"2":1}}],["tr",{"2":{"11":58,"107":3,"112":29,"113":6}}],["try",{"2":{"2":1,"84":1,"132":1}}],["track",{"2":{"141":1,"149":1,"152":1}}],["transpose",{"2":{"132":3}}],["transported",{"2":{"41":1}}],["transforms",{"2":{"11":4,"114":4}}],["transform",{"2":{"0":1,"11":1,"128":1}}],["transformations",{"0":{"110":1,"111":1},"1":{"111":1,"112":2,"113":2,"114":2},"2":{"0":3,"11":16,"111":1,"114":15,"125":1}}],["transformation",{"2":{"0":4,"11":12,"110":3,"114":8}}],["train",{"2":{"0":2,"11":3,"130":3,"132":5,"135":2}}],["training",{"2":{"0":1,"11":1,"135":7}}],["true",{"2":{"0":4,"6":1,"11":28,"18":1,"25":1,"26":1,"29":4,"30":3,"31":10,"32":4,"33":5,"34":6,"35":1,"36":2,"38":1,"40":1,"45":3,"47":1,"49":1,"61":2,"64":2,"67":2,"72":1,"105":1,"109":1,"135":1,"139":1,"141":1,"152":1,"155":3,"156":6}}],["tag",{"2":{"137":1}}],["tags",{"2":{"137":2,"139":1}}],["tackle",{"2":{"105":1}}],["tabu",{"2":{"80":1,"155":46}}],["table",{"0":{"146":1},"2":{"0":4,"11":4,"20":4,"58":4,"132":1,"145":2,"146":4}}],["task",{"2":{"11":16,"36":16}}],["tasks",{"2":{"11":23,"36":23,"155":1,"156":1}}],["target",{"2":{"11":1,"20":1,"43":1,"56":1}}],["targeted",{"2":{"0":2,"11":2,"70":1,"84":1,"155":3}}],["taken",{"2":{"139":1}}],["takes",{"2":{"11":4,"40":2,"156":1}}],["take",{"2":{"0":1,"11":1,"20":1,"58":1,"85":1,"137":1}}],["two",{"2":{"0":3,"3":1,"11":9,"22":1,"26":1,"36":4,"41":1,"45":1,"60":1,"63":3,"66":3,"156":1}}],["thus",{"2":{"41":1}}],["those",{"2":{"19":1,"20":1,"21":1,"55":1,"56":1,"57":1,"109":1}}],["throw",{"2":{"132":1}}],["through",{"2":{"7":1,"11":3,"12":1,"21":2,"23":3,"25":2,"57":2,"59":1,"84":3,"94":1,"116":2,"119":1,"135":2}}],["threads",{"2":{"137":2,"141":1,"149":1,"152":1,"155":12}}],["three",{"2":{"14":1}}],["threshold",{"2":{"11":1,"114":1}}],["th",{"2":{"11":5,"34":4,"109":1}}],["than",{"2":{"6":1,"9":1,"11":11,"23":1,"112":5,"114":1,"156":1}}],["that",{"2":{"0":16,"3":3,"11":90,"12":1,"13":1,"20":2,"21":1,"23":4,"24":2,"25":1,"26":4,"28":5,"29":2,"30":7,"32":11,"33":1,"34":8,"36":10,"38":2,"40":2,"41":2,"42":1,"43":2,"56":1,"57":1,"58":1,"60":2,"61":2,"63":1,"64":2,"66":3,"67":2,"73":1,"84":1,"85":6,"107":2,"109":3,"114":3,"117":1,"120":1,"125":2,"127":1,"135":3,"136":1,"140":1,"146":1,"155":10,"156":33}}],["this",{"2":{"0":1,"1":1,"2":1,"3":1,"6":1,"9":1,"11":17,"12":1,"17":1,"21":3,"24":1,"28":2,"29":2,"33":1,"36":7,"41":1,"43":1,"57":3,"59":1,"85":2,"105":1,"109":2,"114":1,"137":2,"139":2,"140":1,"141":2,"142":2,"143":2,"144":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"155":3,"156":8}}],["theory",{"0":{"94":1}}],["they",{"2":{"23":3,"26":3,"41":1,"90":1,"102":1}}],["these",{"2":{"11":1,"13":1,"23":1,"26":2,"43":1,"146":1}}],["there",{"2":{"11":2,"28":1,"41":3,"140":1,"146":1,"156":1}}],["them",{"2":{"11":1,"155":1,"156":1}}],["then",{"2":{"4":1,"11":4,"24":1,"34":2,"155":2}}],["their",{"0":{"90":1},"2":{"3":1,"5":1,"7":1,"11":1,"12":2,"18":1,"20":1,"56":1,"84":1,"85":1,"91":1,"114":1,"136":1,"141":1,"149":1,"152":1}}],["the",{"0":{"13":1,"102":1,"141":1,"146":1},"2":{"0":144,"1":1,"2":3,"3":2,"4":5,"5":2,"6":7,"8":1,"9":2,"10":2,"11":452,"12":4,"13":8,"14":1,"19":5,"20":35,"21":17,"22":1,"23":6,"24":9,"25":6,"26":5,"28":17,"29":2,"30":10,"31":1,"32":33,"33":1,"34":21,"36":29,"38":15,"40":2,"41":50,"42":3,"43":17,"45":2,"47":3,"49":2,"51":5,"53":2,"55":5,"56":20,"57":17,"58":15,"59":2,"60":8,"61":4,"63":8,"64":8,"66":6,"67":9,"70":18,"72":5,"73":3,"81":1,"83":1,"84":9,"85":13,"87":1,"94":1,"97":1,"100":1,"102":1,"103":1,"105":7,"107":4,"108":2,"109":19,"110":5,"111":2,"112":21,"114":12,"115":1,"117":3,"118":1,"119":1,"120":3,"121":1,"122":2,"123":1,"125":4,"127":1,"128":1,"135":17,"136":2,"137":19,"139":10,"140":3,"141":2,"142":2,"143":6,"144":5,"145":5,"146":3,"148":3,"151":3,"153":5,"155":120,"156":155}}],["typeof",{"2":{"156":1}}],["typemax",{"2":{"132":1,"155":1}}],["types",{"2":{"7":1,"11":2,"13":1,"22":1,"26":1,"42":1,"79":1,"114":2,"155":8}}],["type",{"2":{"0":5,"11":10,"13":4,"41":6,"60":4,"66":2,"69":1,"70":1,"114":1,"130":1,"135":3,"155":6,"156":8}}],["tolerance",{"2":{"149":4}}],["topics",{"2":{"96":1}}],["total",{"2":{"11":2,"30":1,"64":1,"67":1}}],["todo",{"2":{"11":1,"24":1,"29":3,"31":4,"33":4,"35":2,"84":1,"85":4,"155":1}}],["tools",{"0":{"1":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1},"2":{"19":1,"55":1}}],["towards",{"2":{"0":1,"11":1}}],["to",{"0":{"1":1,"61":1,"64":1,"67":1,"73":1,"94":1,"126":1,"144":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"127":1},"2":{"0":49,"2":3,"4":2,"5":1,"6":2,"8":1,"9":1,"10":3,"11":188,"12":2,"13":1,"16":2,"19":1,"20":7,"21":9,"23":1,"24":6,"25":1,"26":1,"28":4,"29":3,"30":9,"31":4,"32":12,"33":4,"34":10,"35":2,"36":2,"38":3,"40":2,"41":16,"42":2,"43":2,"45":1,"47":1,"49":1,"51":1,"53":1,"55":1,"56":3,"57":9,"58":4,"59":3,"60":4,"61":6,"63":3,"64":4,"66":1,"67":4,"70":6,"72":18,"73":1,"84":4,"85":6,"97":1,"100":1,"102":1,"105":4,"107":6,"108":1,"109":3,"110":2,"112":16,"114":7,"115":1,"116":2,"118":1,"121":1,"126":1,"127":1,"128":1,"130":1,"132":1,"135":12,"136":3,"137":10,"139":3,"140":3,"141":4,"142":2,"143":3,"144":2,"145":3,"146":5,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"155":49,"156":36}}],["t",{"2":{"0":14,"11":29,"28":2,"41":10,"45":2,"60":8,"63":11,"66":14,"72":5,"137":1,"155":7,"156":25}}],["src",{"2":{"156":2}}],["swap",{"2":{"155":2}}],["switch",{"2":{"0":1,"11":1,"108":1}}],["sltns",{"2":{"135":2}}],["script",{"2":{"139":1}}],["scatterlines",{"2":{"137":1,"139":1}}],["scalarfunction",{"2":{"156":3}}],["scalars",{"2":{"11":1,"123":1}}],["scalar",{"2":{"11":5,"20":2,"43":2,"56":2,"119":1,"156":1}}],["scenario",{"2":{"94":1}}],["science",{"2":{"83":1}}],["scheduling",{"0":{"36":1},"2":{"11":4,"36":4}}],["shifted",{"2":{"132":3}}],["share",{"2":{"99":1,"103":1}}],["shared",{"2":{"10":1,"42":1}}],["shrink",{"2":{"11":2}}],["showcase",{"2":{"93":1}}],["show",{"2":{"0":1,"11":4,"107":1,"109":1}}],["should",{"2":{"0":2,"11":9,"23":1,"25":1,"34":4,"59":1,"107":2,"155":3,"156":4}}],["shortcut",{"2":{"0":1,"11":1,"21":1,"57":1}}],["system",{"2":{"41":1}}],["syntax",{"2":{"21":1,"57":1,"84":1,"85":1,"155":1,"156":1}}],["syntaxes",{"2":{"1":1,"12":1}}],["symb",{"2":{"11":2}}],["symbols",{"2":{"0":6,"11":11,"47":2,"107":4,"109":1,"137":2}}],["symbol",{"2":{"0":15,"11":34,"20":4,"21":2,"43":4,"47":3,"57":2,"58":4,"70":1,"109":1,"114":5,"128":1,"132":1,"137":1,"140":1,"155":3}}],["symmetry",{"2":{"0":1,"11":1}}],["symmetries",{"2":{"0":4,"11":4}}],["symcon",{"2":{"0":1,"11":1,"47":1}}],["sat",{"2":{"155":3}}],["satisfying",{"2":{"155":2}}],["satisfy",{"2":{"3":1,"11":3,"23":1,"26":1,"32":3,"156":2}}],["satisfaction",{"0":{"6":1},"2":{"2":1,"9":1,"11":2,"155":3,"156":1}}],["satisfied",{"2":{"0":1,"6":2,"11":10,"21":1,"28":1,"34":4,"36":2,"38":1,"40":1,"57":1,"155":1,"156":1}}],["satisfies",{"2":{"0":1,"6":1,"11":9,"28":1,"32":7,"156":4}}],["save",{"2":{"139":2}}],["say",{"2":{"0":1,"11":1,"128":1}}],["samples=d",{"2":{"144":1}}],["samples",{"2":{"139":1,"141":1,"144":1,"146":5,"149":2,"152":1}}],["sampling",{"0":{"49":1},"1":{"50":1},"2":{"42":1,"49":2}}],["samplings",{"2":{"0":5,"11":5,"70":5}}],["same",{"2":{"0":2,"11":4,"20":1,"41":2,"58":1,"63":1,"66":1,"156":1}}],["stop",{"2":{"155":5}}],["storing",{"2":{"139":1}}],["storage",{"2":{"16":1}}],["stored",{"2":{"143":1,"144":1}}],["store",{"2":{"0":1,"11":15,"19":1,"55":1,"63":3,"72":8,"107":1,"109":2,"155":3}}],["stores",{"2":{"0":1,"11":2,"66":2,"139":2}}],["stuff",{"2":{"132":2}}],["studies",{"0":{"93":1},"2":{"93":1}}],["studio",{"2":{"84":1}}],["stdout",{"2":{"41":1}}],["still",{"2":{"21":1,"57":1}}],["stipulates",{"2":{"11":1,"156":2}}],["step",{"2":{"11":2,"88":2,"96":2,"155":3}}],["stamp",{"2":{"155":3}}],["status",{"2":{"155":4}}],["static",{"2":{"155":1}}],["states",{"2":{"11":4,"28":4}}],["state",{"2":{"5":1,"41":3,"155":36}}],["statement",{"2":{"3":1}}],["standard",{"2":{"12":1,"20":1,"22":1,"41":3,"56":1,"59":1}}],["standards",{"2":{"1":1,"8":1}}],["stands",{"2":{"12":1}}],["started",{"0":{"82":1,"88":1},"1":{"83":1,"84":1,"85":1},"2":{"88":1}}],["start=",{"2":{"41":1}}],["start",{"2":{"11":4,"28":2,"38":2,"41":1,"85":1,"137":1}}],["starts",{"2":{"11":9,"36":8,"155":2}}],["starting",{"2":{"11":6,"36":5,"41":2,"155":1}}],["str",{"2":{"155":1}}],["strategies",{"0":{"91":1},"2":{"91":1}}],["straight",{"2":{"85":1}}],["straightforward",{"2":{"23":1,"156":1}}],["streamlining",{"0":{"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1},"1":{"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1}}],["streamline",{"2":{"9":1}}],["struct",{"2":{"11":1,"41":3,"60":1,"155":4}}],["structures",{"2":{"42":1}}],["structure",{"0":{"109":1},"2":{"0":5,"11":7,"13":1,"17":1,"41":1,"45":3,"60":2,"72":1,"109":4,"135":1,"155":5}}],["strongly",{"2":{"2":1}}],["string",{"2":{"0":1,"11":8,"41":1,"61":4,"64":4,"67":4,"107":1,"109":1,"137":1,"155":1,"156":1}}],["strictly",{"2":{"0":3,"11":13,"30":8,"119":1}}],["square",{"2":{"0":1,"11":1,"41":3,"70":1}}],["sqrt",{"2":{"0":1,"11":1,"70":1}}],["split",{"2":{"135":1}}],["specialize",{"2":{"155":10}}],["specialized",{"2":{"11":2,"112":1,"123":1,"155":10}}],["specializing",{"2":{"155":1}}],["specify",{"2":{"59":1}}],["specifying",{"2":{"0":3,"11":9,"12":1,"34":4,"70":3,"156":5}}],["specifies",{"2":{"3":1,"11":1,"23":1,"26":1,"114":1}}],["specified",{"2":{"0":1,"11":3,"41":2,"61":2,"64":1,"67":1,"70":1,"72":1,"105":1,"114":1,"156":2}}],["specification",{"2":{"43":1}}],["specifications",{"2":{"0":1,"11":1,"20":1,"43":2,"58":1}}],["specifically",{"2":{"11":1,"61":2,"64":1,"67":1,"72":1,"105":1,"156":1}}],["specific",{"2":{"2":2,"4":1,"5":1,"6":1,"11":7,"32":1,"40":4,"114":1,"135":2,"149":1,"152":1,"156":2}}],["span",{"2":{"11":1,"63":1,"66":1}}],["spaces",{"2":{"14":1,"49":1}}],["space",{"2":{"0":7,"11":9,"70":2,"155":1,"156":3}}],["sound",{"2":{"17":1}}],["source",{"2":{"0":74,"11":187,"13":1,"20":5,"21":3,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"41":21,"43":3,"45":7,"47":3,"49":1,"51":1,"53":1,"56":1,"57":3,"58":4,"60":10,"61":15,"63":12,"64":15,"66":14,"67":16,"69":2,"70":3,"72":17,"105":7,"107":6,"108":3,"109":11,"112":9,"114":2,"116":2,"117":1,"119":2,"120":1,"123":1,"125":1,"127":2,"128":3,"130":2,"135":28,"153":4,"155":144,"156":74}}],["soon",{"2":{"16":1,"156":1}}],["so",{"2":{"11":2,"41":1,"85":1}}],["solve",{"2":{"41":1,"85":1,"155":3}}],["solverversion",{"2":{"156":1}}],["solvername",{"2":{"156":1}}],["solvers",{"0":{"154":1},"2":{"84":3,"85":4,"109":1,"154":1,"155":2}}],["solver",{"2":{"41":6,"85":2,"135":1,"155":29,"156":11}}],["solving",{"2":{"1":1,"73":1,"75":1,"84":1,"91":1,"94":1,"155":4}}],["sols",{"2":{"0":1,"11":1,"135":4}}],["solution",{"2":{"0":1,"11":3,"29":2,"33":1,"41":2,"85":3,"108":1,"155":4,"156":3}}],["solutions",{"2":{"0":11,"11":11,"42":1,"70":7,"108":1,"135":8,"155":9}}],["something",{"2":{"11":1}}],["some",{"2":{"0":1,"11":1,"17":1,"47":1,"49":1,"85":1,"105":1,"110":1,"115":1,"118":1,"121":1,"135":1,"137":1,"147":1,"150":1,"156":1}}],["silent",{"2":{"155":1,"156":4}}],["situations",{"2":{"51":1}}],["sink",{"2":{"41":3}}],["since",{"2":{"14":1,"23":1,"25":1,"155":1}}],["single",{"2":{"11":3,"85":1,"116":2,"119":1}}],["significance",{"2":{"75":1}}],["signature",{"2":{"0":2,"11":2,"107":2}}],["sig",{"2":{"11":17,"112":8}}],["simulated",{"2":{"80":1}}],["simplify",{"2":{"90":1}}],["simplified",{"2":{"11":3}}],["simply",{"2":{"11":2,"15":1,"21":1,"57":1,"61":2,"64":1,"67":1,"72":1,"85":1,"105":1,"137":1}}],["simple",{"2":{"0":1,"11":1,"20":1,"58":1,"85":2}}],["similar",{"2":{"0":1,"11":1,"13":1,"31":1,"60":1}}],["sizes",{"2":{"0":1,"11":1,"70":1}}],["size",{"2":{"0":15,"11":31,"13":1,"20":1,"38":3,"41":3,"43":1,"56":1,"60":5,"63":8,"66":8,"70":1,"107":1,"109":2,"132":2,"135":7,"155":4}}],["successfully",{"2":{"93":1}}],["such",{"2":{"1":1,"7":1,"11":5,"18":1,"19":1,"20":2,"23":3,"25":2,"28":1,"41":2,"43":2,"56":2,"76":1,"109":1,"114":1,"155":4,"156":1}}],["sudoku",{"2":{"41":17,"85":4,"155":1}}],["sudokuinstances",{"2":{"41":1}}],["sudokuinstance",{"2":{"41":19}}],["subs",{"2":{"155":3}}],["subsolvers",{"2":{"155":4}}],["subsolver",{"2":{"155":6}}],["subsets",{"2":{"85":2}}],["subset",{"2":{"4":1,"156":1}}],["sub",{"2":{"135":1,"155":1}}],["subgrid",{"2":{"85":1}}],["subgrids",{"2":{"85":1}}],["subtype",{"2":{"41":1}}],["subtract",{"2":{"11":1,"114":1}}],["subtraction",{"2":{"11":1,"114":1}}],["supplies",{"2":{"41":1}}],["support",{"2":{"11":1,"156":1}}],["supported",{"2":{"11":4,"156":2}}],["supports=nothing",{"2":{"11":1}}],["supports",{"2":{"7":1,"11":7,"156":13}}],["supertype",{"2":{"0":2,"11":2,"13":1,"63":1,"66":1}}],["super",{"2":{"0":1,"11":1,"13":1,"60":1}}],["summing",{"0":{"32":1}}],["sum",{"2":{"0":5,"3":1,"11":21,"31":8,"32":8,"36":2,"41":1,"64":1,"67":1,"70":2,"116":3,"119":2,"127":3,"156":3}}],["series",{"2":{"85":1,"155":1}}],["serves",{"2":{"42":1}}],["segment",{"2":{"41":3}}],["sec",{"2":{"155":1}}],["section",{"2":{"24":1,"43":1,"147":1,"150":1}}],["seconds=d",{"2":{"144":1}}],["seconds",{"2":{"139":1,"141":1,"144":1,"149":2,"152":1,"155":1}}],["second",{"2":{"11":8,"36":8}}],["see",{"2":{"18":2,"24":1,"155":1}}],["seen",{"2":{"3":1}}],["separator",{"2":{"41":1}}],["separates",{"2":{"11":1,"107":1}}],["sep",{"2":{"11":2,"41":2,"107":2}}],["select",{"2":{"137":1,"155":4}}],["selection",{"2":{"11":1,"114":1}}],["selected",{"2":{"0":4,"11":8,"109":6,"117":1,"120":1,"125":1,"135":2,"155":1}}],["sequence",{"2":{"11":10,"28":4,"38":6,"156":3}}],["several",{"2":{"10":1,"51":1,"84":1,"109":1}}],["searching",{"2":{"0":1,"11":1}}],["search",{"0":{"91":1,"133":1},"2":{"0":20,"11":20,"49":1,"70":9,"80":1,"91":1,"109":1,"155":1,"156":1}}],["setter",{"2":{"85":1}}],["setting",{"0":{"84":1},"2":{"155":1}}],["settings",{"2":{"0":4,"11":4,"70":4,"155":1}}],["setup",{"2":{"84":1}}],["sets",{"2":{"0":1,"7":1,"11":1,"16":1,"17":1,"70":1,"135":3}}],["setdomain",{"0":{"15":1},"2":{"0":5,"11":5,"15":1,"16":1,"60":1,"63":1,"66":3,"67":2}}],["set",{"2":{"0":11,"3":1,"5":1,"6":1,"11":29,"15":1,"18":1,"26":2,"36":5,"40":2,"41":4,"45":1,"47":2,"61":2,"64":1,"66":3,"67":1,"72":1,"105":1,"107":1,"114":1,"125":1,"128":2,"135":11,"155":22,"156":68}}],["s2",{"2":{"0":1,"11":1,"47":1}}],["s1",{"2":{"0":1,"11":1,"47":1}}],["s",{"2":{"0":14,"11":18,"13":2,"21":4,"41":5,"43":3,"45":6,"57":4,"60":2,"63":1,"66":1,"85":1,"105":10,"107":1,"108":1,"109":1,"112":2,"113":6,"123":4,"124":4,"125":1,"142":1,"144":1,"153":1,"155":109}}],["after",{"2":{"145":1}}],["affects",{"2":{"111":1,"122":1}}],["affect",{"2":{"0":1,"11":1}}],["authors",{"2":{"136":1}}],["autodocs",{"2":{"134":1}}],["auto",{"2":{"132":1}}],["automated",{"2":{"11":1}}],["automatically",{"2":{"11":1,"70":1}}],["automata",{"2":{"11":1,"45":2}}],["automaton",{"2":{"0":3,"11":17,"20":1,"28":8,"43":1,"45":5,"56":1,"72":4,"105":2,"156":2}}],["among",{"2":{"135":1,"155":1}}],["amount",{"2":{"41":1}}],["aka",{"2":{"59":1}}],["a2",{"2":{"31":2}}],["a1",{"2":{"31":2}}],["about",{"0":{"104":1},"1":{"105":1},"2":{"12":1,"19":1,"55":1,"59":1,"104":1,"154":1,"155":1,"156":1}}],["absolute",{"2":{"11":3}}],["abs",{"2":{"0":1,"11":5,"20":1,"24":2,"25":6,"26":6,"58":1,"123":1,"124":1}}],["abstractscalarset",{"2":{"156":2}}],["abstractscalarfunction",{"2":{"156":1}}],["abstractstring",{"2":{"155":2}}],["abstractstring=",{"2":{"0":1,"11":1,"47":1}}],["abstractstate",{"2":{"155":1}}],["abstractsolver",{"2":{"155":70}}],["abstractmatrix",{"2":{"41":4}}],["abstractmultivalueddecisiondiagram",{"2":{"0":1,"11":3,"45":3,"156":1}}],["abstractvectorset",{"2":{"156":22}}],["abstractvector",{"2":{"11":31,"34":4,"36":5,"38":1,"40":2,"107":1,"112":9,"155":1}}],["abstractoptimizer",{"2":{"0":1,"11":2,"130":2,"132":1,"135":2,"156":1}}],["abstractrange",{"2":{"0":2,"11":2,"60":1,"63":1,"66":2}}],["abstract",{"2":{"0":3,"11":6,"13":2,"42":1,"45":2,"60":1,"63":1,"66":1,"130":1,"135":2,"155":2}}],["abstractdomain",{"0":{"13":1},"2":{"0":10,"11":25,"13":5,"60":5,"61":6,"63":4,"64":5,"66":4,"67":5,"69":1,"72":10,"105":2,"155":6}}],["abstractdictionary",{"2":{"0":1,"11":1,"53":1}}],["abstractdict",{"2":{"0":1,"11":1,"53":1}}],["abstractautomaton",{"2":{"0":1,"11":7,"28":3,"45":3,"72":1,"156":2}}],["aggragation",{"2":{"118":1}}],["aggregate",{"2":{"11":1,"119":1}}],["aggregations",{"0":{"119":1},"2":{"0":1,"11":1,"120":1}}],["aggregation",{"0":{"118":1},"1":{"119":1,"120":1},"2":{"0":4,"11":4,"120":1}}],["again",{"2":{"41":1}}],["against",{"2":{"11":2,"40":1,"114":1}}],["ag",{"2":{"11":2,"119":2}}],["advantages",{"2":{"83":1}}],["advanced",{"0":{"89":1},"1":{"90":1,"91":1},"2":{"42":1}}],["adjusted",{"2":{"11":1,"70":1}}],["added",{"2":{"24":1,"25":1,"156":1}}],["adds",{"2":{"11":4}}],["adding",{"2":{"0":2,"11":2,"20":2,"58":2}}],["additional",{"2":{"0":1,"11":1,"70":1}}],["additionally",{"2":{"0":1,"11":1,"13":1,"60":1}}],["add",{"2":{"0":3,"11":4,"13":1,"15":8,"16":4,"23":1,"24":1,"25":3,"26":3,"60":1,"66":2,"84":1,"85":4,"155":19,"156":9}}],["achieve",{"2":{"136":1}}],["accurate",{"2":{"132":2}}],["according",{"2":{"11":1,"114":1,"139":1,"156":1}}],["access",{"2":{"0":4,"11":5,"60":1,"109":1,"155":20}}],["acceptable",{"2":{"156":1}}],["accepted",{"2":{"0":2,"11":4,"28":2,"156":1}}],["accepts",{"2":{"0":1,"11":3,"41":4,"45":3,"72":1,"105":1}}],["accept",{"2":{"0":1,"11":7,"45":6,"72":3,"105":3}}],["across",{"2":{"10":1,"139":1}}],["acts",{"2":{"19":1,"55":1}}],["action",{"2":{"0":2,"11":2}}],["actual",{"2":{"0":1,"4":1,"11":1,"139":1}}],["alternative",{"2":{"109":1}}],["alternatively",{"2":{"25":1,"26":1}}],["although",{"2":{"84":1}}],["already",{"2":{"11":3,"85":1,"112":1,"123":1,"135":1,"155":1}}],["along",{"2":{"1":1,"11":1,"20":1,"43":1,"56":1,"84":1}}],["algorithms",{"2":{"80":1}}],["algorithm",{"2":{"0":4,"11":4,"135":3}}],["also",{"2":{"0":2,"5":1,"11":2,"12":1,"19":1,"55":1,"85":1,"114":1,"125":1,"146":1}}],["allequal",{"2":{"29":1,"156":2}}],["alldifferent",{"2":{"29":2,"85":5,"156":2}}],["allocs",{"2":{"139":1,"146":4}}],["allocations",{"2":{"11":17,"112":8,"139":1}}],["allow",{"2":{"26":1}}],["allows",{"2":{"16":1}}],["allowing",{"2":{"11":1,"114":1,"156":1}}],["all",{"2":{"0":10,"1":1,"11":42,"13":1,"20":4,"21":1,"26":1,"29":10,"30":22,"41":1,"43":1,"51":1,"56":1,"57":1,"58":3,"63":1,"84":1,"85":2,"107":1,"114":1,"125":1,"148":1,"151":1,"153":2,"155":4,"156":6}}],["avoid",{"2":{"0":1,"11":2,"155":1,"156":2}}],["available",{"2":{"0":1,"11":2,"20":1,"23":1,"25":1,"41":2,"58":1,"84":2,"114":1,"155":1}}],["approach",{"2":{"85":1}}],["appropriate",{"2":{"11":1,"114":1,"144":1,"146":1}}],["appear",{"2":{"11":3,"32":3}}],["applies",{"2":{"11":1,"107":1,"156":1}}],["applied",{"2":{"0":2,"4":1,"11":3,"21":1,"57":1,"85":1,"93":1,"114":1,"155":2,"156":1}}],["applications",{"0":{"93":1}}],["application",{"2":{"2":1,"4":1,"11":1,"19":1,"55":1}}],["applying",{"0":{"92":1},"1":{"93":1,"94":1}}],["apply",{"2":{"0":5,"11":7,"21":4,"57":4,"114":2}}],["apixcspjumpmoi",{"2":{"25":1,"26":1,"29":3,"31":4,"33":4,"35":2}}],["apis",{"0":{"25":1}}],["apicbls",{"2":{"15":1,"16":1,"18":1}}],["api",{"0":{"0":1,"8":1,"11":1,"24":1,"153":1},"2":{"1":1,"20":2,"23":1,"25":1,"56":2,"153":1}}],["attribution",{"2":{"155":1}}],["attributed",{"2":{"155":6}}],["attribute",{"2":{"155":2}}],["attached",{"2":{"155":1}}],["atoms",{"2":{"41":1}}],["atmost",{"2":{"31":1,"156":2}}],["atleast",{"2":{"31":1,"156":2}}],["at",{"2":{"0":3,"11":15,"13":1,"18":1,"20":1,"31":12,"32":8,"36":2,"41":1,"45":1,"58":1,"84":1,"109":2,"128":1,"135":2,"155":1,"156":3}}],["arrange",{"2":{"153":3}}],["arrangement",{"2":{"135":1}}],["array",{"2":{"31":1}}],["ar",{"2":{"11":2,"116":2}}],["arbitrary",{"0":{"17":1},"2":{"11":2,"17":1,"66":1,"143":1}}],["arbitrarydomain",{"2":{"11":1,"66":1}}],["arithmetic",{"0":{"115":1,"116":1},"1":{"116":1,"117":1},"2":{"0":5,"11":6,"20":1,"43":1,"56":1,"115":1,"117":2}}],["arxiv",{"2":{"0":1,"11":1,"20":1,"58":1}}],["areas",{"2":{"103":1}}],["are",{"2":{"0":5,"7":1,"9":1,"10":1,"11":39,"12":1,"13":1,"16":1,"17":1,"20":3,"21":2,"22":1,"23":4,"24":2,"26":4,"30":10,"41":5,"42":1,"43":1,"49":1,"56":3,"57":2,"59":1,"63":1,"66":1,"85":1,"109":2,"112":8,"114":1,"117":1,"120":1,"125":1,"137":1,"140":1,"143":1,"144":1,"146":2,"149":1,"152":1,"155":2,"156":8}}],["argmax",{"2":{"155":3}}],["argument",{"2":{"11":7,"20":1,"41":4,"56":1,"156":1}}],["arguments",{"2":{"0":16,"11":44,"20":4,"21":3,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"41":1,"43":1,"56":1,"57":3,"58":3,"60":1,"63":1,"70":2,"155":8,"156":27}}],["args",{"2":{"0":10,"11":13,"13":3,"21":4,"57":4,"60":4,"70":1,"130":1,"135":3}}],["aspect",{"2":{"12":1}}],["aspects",{"0":{"10":1}}],["associated",{"2":{"41":1,"85":1,"109":1,"142":1}}],["assert",{"2":{"11":1,"109":1}}],["assigned",{"2":{"5":1,"11":4,"34":4}}],["assign",{"2":{"0":1,"11":1,"41":1,"155":1}}],["assignments",{"2":{"0":1,"6":1,"11":1}}],["assignment",{"2":{"0":1,"2":1,"5":1,"11":1,"41":1}}],["as",{"2":{"0":8,"1":1,"3":1,"5":1,"7":1,"11":26,"12":1,"15":1,"16":5,"17":2,"18":2,"19":2,"20":6,"23":3,"25":3,"26":1,"28":2,"41":3,"42":1,"43":2,"45":1,"49":1,"55":1,"56":3,"58":3,"63":1,"66":3,"76":1,"84":1,"85":1,"107":2,"109":1,"112":1,"114":1,"123":1,"135":1,"137":5,"140":1,"149":1,"152":1,"153":1,"155":6,"156":4}}],["analyze",{"2":{"100":1}}],["analyzing",{"0":{"98":1},"1":{"99":1,"100":1}}],["analysis",{"0":{"97":1,"100":1},"2":{"97":1}}],["annealing",{"2":{"80":1}}],["another",{"2":{"21":1,"57":1}}],["anonymous",{"2":{"11":1,"107":1}}],["an",{"0":{"24":1},"2":{"0":23,"1":1,"5":1,"11":63,"13":2,"20":3,"24":1,"25":1,"28":3,"30":2,"32":1,"41":3,"42":1,"43":3,"45":2,"47":1,"56":3,"60":2,"63":6,"64":1,"66":3,"67":1,"70":5,"73":2,"85":1,"94":1,"107":3,"109":5,"110":1,"114":1,"130":1,"135":7,"136":1,"137":1,"139":1,"140":1,"146":1,"155":11,"156":12}}],["any",{"0":{"109":1},"2":{"0":8,"11":17,"13":1,"36":4,"41":1,"47":1,"60":2,"61":1,"64":1,"67":1,"130":1,"137":1,"155":1,"156":4}}],["and",{"0":{"12":1,"20":1,"21":1,"27":1,"29":1,"31":1,"32":1,"33":1,"35":1,"36":1,"37":1,"39":1,"57":1,"59":1,"76":1,"82":1,"88":1,"90":1,"91":1,"93":1,"95":1,"98":1,"100":1,"101":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"83":1,"84":1,"85":1,"96":1,"97":1,"99":1,"100":1,"102":1,"103":1},"2":{"0":23,"1":3,"2":1,"3":2,"4":1,"5":2,"6":3,"7":1,"8":2,"9":2,"10":2,"11":66,"12":5,"13":3,"16":1,"19":3,"20":1,"21":4,"22":1,"23":1,"26":1,"28":1,"31":2,"32":1,"36":5,"38":2,"41":13,"42":4,"43":1,"45":1,"47":1,"49":1,"51":1,"55":3,"57":4,"58":1,"59":2,"60":2,"63":2,"66":1,"70":1,"72":2,"73":2,"75":1,"76":1,"77":1,"80":1,"81":1,"83":2,"84":2,"85":4,"87":1,"88":1,"90":1,"91":1,"93":1,"94":1,"96":1,"97":1,"99":2,"100":1,"102":1,"103":1,"105":2,"107":1,"109":3,"111":1,"112":5,"114":3,"122":1,"127":1,"128":1,"135":10,"137":1,"139":2,"141":1,"147":1,"150":1,"153":1,"155":11,"156":10}}],["a",{"0":{"6":1,"8":1,"9":1,"109":1,"146":1},"2":{"0":79,"1":1,"2":5,"3":6,"4":5,"5":4,"6":3,"8":2,"9":1,"11":266,"13":4,"15":2,"16":2,"17":2,"19":1,"20":10,"21":5,"23":10,"24":2,"25":3,"26":4,"28":29,"29":2,"30":5,"32":7,"33":1,"34":13,"36":9,"38":5,"40":5,"41":26,"42":1,"43":4,"45":11,"53":2,"55":2,"56":4,"57":5,"58":6,"60":9,"61":19,"63":8,"64":17,"66":8,"67":17,"70":9,"72":15,"84":2,"85":12,"94":1,"105":5,"107":8,"108":2,"109":16,"110":1,"114":10,"116":2,"119":2,"127":2,"128":7,"130":1,"135":23,"136":3,"137":8,"139":1,"140":2,"141":1,"145":1,"146":1,"147":1,"150":1,"153":3,"155":51,"156":48}}]],"serializationVersion":2}';export{t as default}; diff --git a/dev/assets/chunks/VPLocalSearchBox.B4ckM-ik.js b/dev/assets/chunks/VPLocalSearchBox.B4ckM-ik.js new file mode 100644 index 0000000..c6e3e53 --- /dev/null +++ b/dev/assets/chunks/VPLocalSearchBox.B4ckM-ik.js @@ -0,0 +1,7 @@ +var Nt=Object.defineProperty;var Ft=(a,e,t)=>e in a?Nt(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var Re=(a,e,t)=>Ft(a,typeof e!="symbol"?e+"":e,t);import{V as Ot,p as se,h as pe,aj as Xe,ak as Rt,al as Ct,q as je,am as Mt,d as At,D as ye,an as et,ao as Lt,ap as Dt,s as zt,aq as Pt,v as Ce,P as ue,O as we,ar as jt,as as Vt,W as $t,R as Bt,$ as Wt,o as q,b as Kt,j as S,a0 as Jt,k as D,at as Ut,au as qt,av as Gt,c as Y,n as tt,e as xe,C as st,F as nt,a as de,t as he,aw as Ht,ax as it,ay as Qt,a9 as Yt,af as Zt,az as Xt,_ as es}from"./framework.CJakPlgM.js";import{u as ts,c as ss}from"./theme.BIQLsjK8.js";const ns={root:()=>Ot(()=>import("./@localSearchIndexroot.Dv38fV8G.js"),[])};/*! +* tabbable 6.2.0 +* @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE +*/var vt=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],Ie=vt.join(","),mt=typeof Element>"u",ie=mt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,ke=!mt&&Element.prototype.getRootNode?function(a){var e;return a==null||(e=a.getRootNode)===null||e===void 0?void 0:e.call(a)}:function(a){return a==null?void 0:a.ownerDocument},Ne=function a(e,t){var s;t===void 0&&(t=!0);var n=e==null||(s=e.getAttribute)===null||s===void 0?void 0:s.call(e,"inert"),r=n===""||n==="true",i=r||t&&e&&a(e.parentNode);return i},is=function(e){var t,s=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return s===""||s==="true"},gt=function(e,t,s){if(Ne(e))return[];var n=Array.prototype.slice.apply(e.querySelectorAll(Ie));return t&&ie.call(e,Ie)&&n.unshift(e),n=n.filter(s),n},bt=function a(e,t,s){for(var n=[],r=Array.from(e);r.length;){var i=r.shift();if(!Ne(i,!1))if(i.tagName==="SLOT"){var o=i.assignedElements(),l=o.length?o:i.children,c=a(l,!0,s);s.flatten?n.push.apply(n,c):n.push({scopeParent:i,candidates:c})}else{var h=ie.call(i,Ie);h&&s.filter(i)&&(t||!e.includes(i))&&n.push(i);var v=i.shadowRoot||typeof s.getShadowRoot=="function"&&s.getShadowRoot(i),p=!Ne(v,!1)&&(!s.shadowRootFilter||s.shadowRootFilter(i));if(v&&p){var b=a(v===!0?i.children:v.children,!0,s);s.flatten?n.push.apply(n,b):n.push({scopeParent:i,candidates:b})}else r.unshift.apply(r,i.children)}}return n},yt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},ne=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||is(e))&&!yt(e)?0:e.tabIndex},rs=function(e,t){var s=ne(e);return s<0&&t&&!yt(e)?0:s},as=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},wt=function(e){return e.tagName==="INPUT"},os=function(e){return wt(e)&&e.type==="hidden"},ls=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(s){return s.tagName==="SUMMARY"});return t},cs=function(e,t){for(var s=0;ssummary:first-of-type"),i=r?e.parentElement:e;if(ie.call(i,"details:not([open]) *"))return!0;if(!s||s==="full"||s==="legacy-full"){if(typeof n=="function"){for(var o=e;e;){var l=e.parentElement,c=ke(e);if(l&&!l.shadowRoot&&n(l)===!0)return rt(e);e.assignedSlot?e=e.assignedSlot:!l&&c!==e.ownerDocument?e=c.host:e=l}e=o}if(fs(e))return!e.getClientRects().length;if(s!=="legacy-full")return!0}else if(s==="non-zero-area")return rt(e);return!1},vs=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var s=0;s=0)},gs=function a(e){var t=[],s=[];return e.forEach(function(n,r){var i=!!n.scopeParent,o=i?n.scopeParent:n,l=rs(o,i),c=i?a(n.candidates):o;l===0?i?t.push.apply(t,c):t.push(o):s.push({documentOrder:r,tabIndex:l,item:n,isScope:i,content:c})}),s.sort(as).reduce(function(n,r){return r.isScope?n.push.apply(n,r.content):n.push(r.content),n},[]).concat(t)},bs=function(e,t){t=t||{};var s;return t.getShadowRoot?s=bt([e],t.includeContainer,{filter:Ve.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:ms}):s=gt(e,t.includeContainer,Ve.bind(null,t)),gs(s)},ys=function(e,t){t=t||{};var s;return t.getShadowRoot?s=bt([e],t.includeContainer,{filter:Fe.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):s=gt(e,t.includeContainer,Fe.bind(null,t)),s},re=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ie.call(e,Ie)===!1?!1:Ve(t,e)},ws=vt.concat("iframe").join(","),Me=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ie.call(e,ws)===!1?!1:Fe(t,e)};/*! +* focus-trap 7.6.0 +* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE +*/function xs(a,e,t){return(e=_s(e))in a?Object.defineProperty(a,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[e]=t,a}function at(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(a);e&&(s=s.filter(function(n){return Object.getOwnPropertyDescriptor(a,n).enumerable})),t.push.apply(t,s)}return t}function ot(a){for(var e=1;e0){var s=e[e.length-1];s!==t&&s.pause()}var n=e.indexOf(t);n===-1||e.splice(n,1),e.push(t)},deactivateTrap:function(e,t){var s=e.indexOf(t);s!==-1&&e.splice(s,1),e.length>0&&e[e.length-1].unpause()}},Es=function(e){return e.tagName&&e.tagName.toLowerCase()==="input"&&typeof e.select=="function"},Ts=function(e){return(e==null?void 0:e.key)==="Escape"||(e==null?void 0:e.key)==="Esc"||(e==null?void 0:e.keyCode)===27},ve=function(e){return(e==null?void 0:e.key)==="Tab"||(e==null?void 0:e.keyCode)===9},Is=function(e){return ve(e)&&!e.shiftKey},ks=function(e){return ve(e)&&e.shiftKey},ct=function(e){return setTimeout(e,0)},ut=function(e,t){var s=-1;return e.every(function(n,r){return t(n)?(s=r,!1):!0}),s},fe=function(e){for(var t=arguments.length,s=new Array(t>1?t-1:0),n=1;n1?g-1:0),E=1;E=0)d=s.activeElement;else{var u=i.tabbableGroups[0],g=u&&u.firstTabbableNode;d=g||h("fallbackFocus")}if(!d)throw new Error("Your focus-trap needs to have at least one focusable element");return d},p=function(){if(i.containerGroups=i.containers.map(function(d){var u=bs(d,r.tabbableOptions),g=ys(d,r.tabbableOptions),_=u.length>0?u[0]:void 0,E=u.length>0?u[u.length-1]:void 0,N=g.find(function(f){return re(f)}),F=g.slice().reverse().find(function(f){return re(f)}),m=!!u.find(function(f){return ne(f)>0});return{container:d,tabbableNodes:u,focusableNodes:g,posTabIndexesFound:m,firstTabbableNode:_,lastTabbableNode:E,firstDomTabbableNode:N,lastDomTabbableNode:F,nextTabbableNode:function(T){var A=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,C=u.indexOf(T);return C<0?A?g.slice(g.indexOf(T)+1).find(function(M){return re(M)}):g.slice(0,g.indexOf(T)).reverse().find(function(M){return re(M)}):u[C+(A?1:-1)]}}}),i.tabbableGroups=i.containerGroups.filter(function(d){return d.tabbableNodes.length>0}),i.tabbableGroups.length<=0&&!h("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");if(i.containerGroups.find(function(d){return d.posTabIndexesFound})&&i.containerGroups.length>1)throw new Error("At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.")},b=function(d){var u=d.activeElement;if(u)return u.shadowRoot&&u.shadowRoot.activeElement!==null?b(u.shadowRoot):u},y=function(d){if(d!==!1&&d!==b(document)){if(!d||!d.focus){y(v());return}d.focus({preventScroll:!!r.preventScroll}),i.mostRecentlyFocusedNode=d,Es(d)&&d.select()}},x=function(d){var u=h("setReturnFocus",d);return u||(u===!1?!1:d)},w=function(d){var u=d.target,g=d.event,_=d.isBackward,E=_===void 0?!1:_;u=u||Se(g),p();var N=null;if(i.tabbableGroups.length>0){var F=c(u,g),m=F>=0?i.containerGroups[F]:void 0;if(F<0)E?N=i.tabbableGroups[i.tabbableGroups.length-1].lastTabbableNode:N=i.tabbableGroups[0].firstTabbableNode;else if(E){var f=ut(i.tabbableGroups,function(L){var j=L.firstTabbableNode;return u===j});if(f<0&&(m.container===u||Me(u,r.tabbableOptions)&&!re(u,r.tabbableOptions)&&!m.nextTabbableNode(u,!1))&&(f=F),f>=0){var T=f===0?i.tabbableGroups.length-1:f-1,A=i.tabbableGroups[T];N=ne(u)>=0?A.lastTabbableNode:A.lastDomTabbableNode}else ve(g)||(N=m.nextTabbableNode(u,!1))}else{var C=ut(i.tabbableGroups,function(L){var j=L.lastTabbableNode;return u===j});if(C<0&&(m.container===u||Me(u,r.tabbableOptions)&&!re(u,r.tabbableOptions)&&!m.nextTabbableNode(u))&&(C=F),C>=0){var M=C===i.tabbableGroups.length-1?0:C+1,I=i.tabbableGroups[M];N=ne(u)>=0?I.firstTabbableNode:I.firstDomTabbableNode}else ve(g)||(N=m.nextTabbableNode(u))}}else N=h("fallbackFocus");return N},O=function(d){var u=Se(d);if(!(c(u,d)>=0)){if(fe(r.clickOutsideDeactivates,d)){o.deactivate({returnFocus:r.returnFocusOnDeactivate});return}fe(r.allowOutsideClick,d)||d.preventDefault()}},R=function(d){var u=Se(d),g=c(u,d)>=0;if(g||u instanceof Document)g&&(i.mostRecentlyFocusedNode=u);else{d.stopImmediatePropagation();var _,E=!0;if(i.mostRecentlyFocusedNode)if(ne(i.mostRecentlyFocusedNode)>0){var N=c(i.mostRecentlyFocusedNode),F=i.containerGroups[N].tabbableNodes;if(F.length>0){var m=F.findIndex(function(f){return f===i.mostRecentlyFocusedNode});m>=0&&(r.isKeyForward(i.recentNavEvent)?m+1=0&&(_=F[m-1],E=!1))}}else i.containerGroups.some(function(f){return f.tabbableNodes.some(function(T){return ne(T)>0})})||(E=!1);else E=!1;E&&(_=w({target:i.mostRecentlyFocusedNode,isBackward:r.isKeyBackward(i.recentNavEvent)})),y(_||i.mostRecentlyFocusedNode||v())}i.recentNavEvent=void 0},K=function(d){var u=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;i.recentNavEvent=d;var g=w({event:d,isBackward:u});g&&(ve(d)&&d.preventDefault(),y(g))},G=function(d){(r.isKeyForward(d)||r.isKeyBackward(d))&&K(d,r.isKeyBackward(d))},W=function(d){Ts(d)&&fe(r.escapeDeactivates,d)!==!1&&(d.preventDefault(),o.deactivate())},V=function(d){var u=Se(d);c(u,d)>=0||fe(r.clickOutsideDeactivates,d)||fe(r.allowOutsideClick,d)||(d.preventDefault(),d.stopImmediatePropagation())},$=function(){if(i.active)return lt.activateTrap(n,o),i.delayInitialFocusTimer=r.delayInitialFocus?ct(function(){y(v())}):y(v()),s.addEventListener("focusin",R,!0),s.addEventListener("mousedown",O,{capture:!0,passive:!1}),s.addEventListener("touchstart",O,{capture:!0,passive:!1}),s.addEventListener("click",V,{capture:!0,passive:!1}),s.addEventListener("keydown",G,{capture:!0,passive:!1}),s.addEventListener("keydown",W),o},me=function(){if(i.active)return s.removeEventListener("focusin",R,!0),s.removeEventListener("mousedown",O,!0),s.removeEventListener("touchstart",O,!0),s.removeEventListener("click",V,!0),s.removeEventListener("keydown",G,!0),s.removeEventListener("keydown",W),o},P=function(d){var u=d.some(function(g){var _=Array.from(g.removedNodes);return _.some(function(E){return E===i.mostRecentlyFocusedNode})});u&&y(v())},H=typeof window<"u"&&"MutationObserver"in window?new MutationObserver(P):void 0,J=function(){H&&(H.disconnect(),i.active&&!i.paused&&i.containers.map(function(d){H.observe(d,{subtree:!0,childList:!0})}))};return o={get active(){return i.active},get paused(){return i.paused},activate:function(d){if(i.active)return this;var u=l(d,"onActivate"),g=l(d,"onPostActivate"),_=l(d,"checkCanFocusTrap");_||p(),i.active=!0,i.paused=!1,i.nodeFocusedBeforeActivation=s.activeElement,u==null||u();var E=function(){_&&p(),$(),J(),g==null||g()};return _?(_(i.containers.concat()).then(E,E),this):(E(),this)},deactivate:function(d){if(!i.active)return this;var u=ot({onDeactivate:r.onDeactivate,onPostDeactivate:r.onPostDeactivate,checkCanReturnFocus:r.checkCanReturnFocus},d);clearTimeout(i.delayInitialFocusTimer),i.delayInitialFocusTimer=void 0,me(),i.active=!1,i.paused=!1,J(),lt.deactivateTrap(n,o);var g=l(u,"onDeactivate"),_=l(u,"onPostDeactivate"),E=l(u,"checkCanReturnFocus"),N=l(u,"returnFocus","returnFocusOnDeactivate");g==null||g();var F=function(){ct(function(){N&&y(x(i.nodeFocusedBeforeActivation)),_==null||_()})};return N&&E?(E(x(i.nodeFocusedBeforeActivation)).then(F,F),this):(F(),this)},pause:function(d){if(i.paused||!i.active)return this;var u=l(d,"onPause"),g=l(d,"onPostPause");return i.paused=!0,u==null||u(),me(),J(),g==null||g(),this},unpause:function(d){if(!i.paused||!i.active)return this;var u=l(d,"onUnpause"),g=l(d,"onPostUnpause");return i.paused=!1,u==null||u(),p(),$(),J(),g==null||g(),this},updateContainerElements:function(d){var u=[].concat(d).filter(Boolean);return i.containers=u.map(function(g){return typeof g=="string"?s.querySelector(g):g}),i.active&&p(),J(),this}},o.updateContainerElements(e),o};function Os(a,e={}){let t;const{immediate:s,...n}=e,r=se(!1),i=se(!1),o=p=>t&&t.activate(p),l=p=>t&&t.deactivate(p),c=()=>{t&&(t.pause(),i.value=!0)},h=()=>{t&&(t.unpause(),i.value=!1)},v=pe(()=>{const p=Xe(a);return(Array.isArray(p)?p:[p]).map(b=>{const y=Xe(b);return typeof y=="string"?y:Rt(y)}).filter(Ct)});return je(v,p=>{p.length&&(t=Fs(p,{...n,onActivate(){r.value=!0,e.onActivate&&e.onActivate()},onDeactivate(){r.value=!1,e.onDeactivate&&e.onDeactivate()}}),s&&o())},{flush:"post"}),Mt(()=>l()),{hasFocus:r,isPaused:i,activate:o,deactivate:l,pause:c,unpause:h}}class oe{constructor(e,t=!0,s=[],n=5e3){this.ctx=e,this.iframes=t,this.exclude=s,this.iframesTimeout=n}static matches(e,t){const s=typeof t=="string"?[t]:t,n=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(n){let r=!1;return s.every(i=>n.call(e,i)?(r=!0,!1):!0),r}else return!1}getContexts(){let e,t=[];return typeof this.ctx>"u"||!this.ctx?e=[]:NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?e=this.ctx:typeof this.ctx=="string"?e=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):e=[this.ctx],e.forEach(s=>{const n=t.filter(r=>r.contains(s)).length>0;t.indexOf(s)===-1&&!n&&t.push(s)}),t}getIframeContents(e,t,s=()=>{}){let n;try{const r=e.contentWindow;if(n=r.document,!r||!n)throw new Error("iframe inaccessible")}catch{s()}n&&t(n)}isIframeBlank(e){const t="about:blank",s=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&s!==t&&s}observeIframeLoad(e,t,s){let n=!1,r=null;const i=()=>{if(!n){n=!0,clearTimeout(r);try{this.isIframeBlank(e)||(e.removeEventListener("load",i),this.getIframeContents(e,t,s))}catch{s()}}};e.addEventListener("load",i),r=setTimeout(i,this.iframesTimeout)}onIframeReady(e,t,s){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,s):this.getIframeContents(e,t,s):this.observeIframeLoad(e,t,s)}catch{s()}}waitForIframes(e,t){let s=0;this.forEachIframe(e,()=>!0,n=>{s++,this.waitForIframes(n.querySelector("html"),()=>{--s||t()})},n=>{n||t()})}forEachIframe(e,t,s,n=()=>{}){let r=e.querySelectorAll("iframe"),i=r.length,o=0;r=Array.prototype.slice.call(r);const l=()=>{--i<=0&&n(o)};i||l(),r.forEach(c=>{oe.matches(c,this.exclude)?l():this.onIframeReady(c,h=>{t(c)&&(o++,s(h)),l()},l)})}createIterator(e,t,s){return document.createNodeIterator(e,t,s,!1)}createInstanceOnIframe(e){return new oe(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,s){const n=e.compareDocumentPosition(s),r=Node.DOCUMENT_POSITION_PRECEDING;if(n&r)if(t!==null){const i=t.compareDocumentPosition(s),o=Node.DOCUMENT_POSITION_FOLLOWING;if(i&o)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let s;return t===null?s=e.nextNode():s=e.nextNode()&&e.nextNode(),{prevNode:t,node:s}}checkIframeFilter(e,t,s,n){let r=!1,i=!1;return n.forEach((o,l)=>{o.val===s&&(r=l,i=o.handled)}),this.compareNodeIframe(e,t,s)?(r===!1&&!i?n.push({val:s,handled:!0}):r!==!1&&!i&&(n[r].handled=!0),!0):(r===!1&&n.push({val:s,handled:!1}),!1)}handleOpenIframes(e,t,s,n){e.forEach(r=>{r.handled||this.getIframeContents(r.val,i=>{this.createInstanceOnIframe(i).forEachNode(t,s,n)})})}iterateThroughNodes(e,t,s,n,r){const i=this.createIterator(t,e,n);let o=[],l=[],c,h,v=()=>({prevNode:h,node:c}=this.getIteratorNode(i),c);for(;v();)this.iframes&&this.forEachIframe(t,p=>this.checkIframeFilter(c,h,p,o),p=>{this.createInstanceOnIframe(p).forEachNode(e,b=>l.push(b),n)}),l.push(c);l.forEach(p=>{s(p)}),this.iframes&&this.handleOpenIframes(o,e,s,n),r()}forEachNode(e,t,s,n=()=>{}){const r=this.getContexts();let i=r.length;i||n(),r.forEach(o=>{const l=()=>{this.iterateThroughNodes(e,o,t,s,()=>{--i<=0&&n()})};this.iframes?this.waitForIframes(o,l):l()})}}let Rs=class{constructor(e){this.ctx=e,this.ie=!1;const t=window.navigator.userAgent;(t.indexOf("MSIE")>-1||t.indexOf("Trident")>-1)&&(this.ie=!0)}set opt(e){this._opt=Object.assign({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:"partially",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:"disabled",each:()=>{},noMatch:()=>{},filter:()=>!0,done:()=>{},debug:!1,log:window.console},e)}get opt(){return this._opt}get iterator(){return new oe(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const s=this.opt.log;this.opt.debug&&typeof s=="object"&&typeof s[t]=="function"&&s[t](`mark.js: ${e}`)}escapeStr(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}createRegExp(e){return this.opt.wildcards!=="disabled"&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),this.opt.wildcards!=="disabled"&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),e}createSynonymsRegExp(e){const t=this.opt.synonyms,s=this.opt.caseSensitive?"":"i",n=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let r in t)if(t.hasOwnProperty(r)){const i=t[r],o=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(r):this.escapeStr(r),l=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(i):this.escapeStr(i);o!==""&&l!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(o)}|${this.escapeStr(l)})`,`gm${s}`),n+`(${this.processSynomyms(o)}|${this.processSynomyms(l)})`+n))}return e}processSynomyms(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}setupWildcardsRegExp(e){return e=e.replace(/(?:\\)*\?/g,t=>t.charAt(0)==="\\"?"?":""),e.replace(/(?:\\)*\*/g,t=>t.charAt(0)==="\\"?"*":"")}createWildcardsRegExp(e){let t=this.opt.wildcards==="withSpaces";return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}setupIgnoreJoinersRegExp(e){return e.replace(/[^(|)\\]/g,(t,s,n)=>{let r=n.charAt(s+1);return/[(|)\\]/.test(r)||r===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const s=this.opt.ignorePunctuation;return Array.isArray(s)&&s.length&&t.push(this.escapeStr(s.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join(`[${t.join("")}]*`):e}createDiacriticsRegExp(e){const t=this.opt.caseSensitive?"":"i",s=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"];let n=[];return e.split("").forEach(r=>{s.every(i=>{if(i.indexOf(r)!==-1){if(n.indexOf(i)>-1)return!1;e=e.replace(new RegExp(`[${i}]`,`gm${t}`),`[${i}]`),n.push(i)}return!0})}),e}createMergedBlanksRegExp(e){return e.replace(/[\s]+/gmi,"[\\s]+")}createAccuracyRegExp(e){const t="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿";let s=this.opt.accuracy,n=typeof s=="string"?s:s.value,r=typeof s=="string"?[]:s.limiters,i="";switch(r.forEach(o=>{i+=`|${this.escapeStr(o)}`}),n){case"partially":default:return`()(${e})`;case"complementary":return i="\\s"+(i||this.escapeStr(t)),`()([^${i}]*${e}[^${i}]*)`;case"exactly":return`(^|\\s${i})(${e})(?=$|\\s${i})`}}getSeparatedKeywords(e){let t=[];return e.forEach(s=>{this.opt.separateWordSearch?s.split(" ").forEach(n=>{n.trim()&&t.indexOf(n)===-1&&t.push(n)}):s.trim()&&t.indexOf(s)===-1&&t.push(s)}),{keywords:t.sort((s,n)=>n.length-s.length),length:t.length}}isNumeric(e){return Number(parseFloat(e))==e}checkRanges(e){if(!Array.isArray(e)||Object.prototype.toString.call(e[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];const t=[];let s=0;return e.sort((n,r)=>n.start-r.start).forEach(n=>{let{start:r,end:i,valid:o}=this.callNoMatchOnInvalidRanges(n,s);o&&(n.start=r,n.length=i-r,t.push(n),s=i)}),t}callNoMatchOnInvalidRanges(e,t){let s,n,r=!1;return e&&typeof e.start<"u"?(s=parseInt(e.start,10),n=s+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&n-t>0&&n-s>0?r=!0:(this.log(`Ignoring invalid or overlapping range: ${JSON.stringify(e)}`),this.opt.noMatch(e))):(this.log(`Ignoring invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)),{start:s,end:n,valid:r}}checkWhitespaceRanges(e,t,s){let n,r=!0,i=s.length,o=t-i,l=parseInt(e.start,10)-o;return l=l>i?i:l,n=l+parseInt(e.length,10),n>i&&(n=i,this.log(`End range automatically set to the max value of ${i}`)),l<0||n-l<0||l>i||n>i?(r=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):s.substring(l,n).replace(/\s+/g,"")===""&&(r=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:l,end:n,valid:r}}getTextNodes(e){let t="",s=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,n=>{s.push({start:t.length,end:(t+=n.textContent).length,node:n})},n=>this.matchesExclude(n.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT,()=>{e({value:t,nodes:s})})}matchesExclude(e){return oe.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,s){const n=this.opt.element?this.opt.element:"mark",r=e.splitText(t),i=r.splitText(s-t);let o=document.createElement(n);return o.setAttribute("data-markjs","true"),this.opt.className&&o.setAttribute("class",this.opt.className),o.textContent=r.textContent,r.parentNode.replaceChild(o,r),i}wrapRangeInMappedTextNode(e,t,s,n,r){e.nodes.every((i,o)=>{const l=e.nodes[o+1];if(typeof l>"u"||l.start>t){if(!n(i.node))return!1;const c=t-i.start,h=(s>i.end?i.end:s)-i.start,v=e.value.substr(0,i.start),p=e.value.substr(h+i.start);if(i.node=this.wrapRangeInTextNode(i.node,c,h),e.value=v+p,e.nodes.forEach((b,y)=>{y>=o&&(e.nodes[y].start>0&&y!==o&&(e.nodes[y].start-=h),e.nodes[y].end-=h)}),s-=h,r(i.node.previousSibling,i.start),s>i.end)t=i.end;else return!1}return!0})}wrapMatches(e,t,s,n,r){const i=t===0?0:t+1;this.getTextNodes(o=>{o.nodes.forEach(l=>{l=l.node;let c;for(;(c=e.exec(l.textContent))!==null&&c[i]!=="";){if(!s(c[i],l))continue;let h=c.index;if(i!==0)for(let v=1;v{let l;for(;(l=e.exec(o.value))!==null&&l[i]!=="";){let c=l.index;if(i!==0)for(let v=1;vs(l[i],v),(v,p)=>{e.lastIndex=p,n(v)})}r()})}wrapRangeFromIndex(e,t,s,n){this.getTextNodes(r=>{const i=r.value.length;e.forEach((o,l)=>{let{start:c,end:h,valid:v}=this.checkWhitespaceRanges(o,i,r.value);v&&this.wrapRangeInMappedTextNode(r,c,h,p=>t(p,o,r.value.substring(c,h),l),p=>{s(p,o)})}),n()})}unwrapMatches(e){const t=e.parentNode;let s=document.createDocumentFragment();for(;e.firstChild;)s.appendChild(e.removeChild(e.firstChild));t.replaceChild(s,e),this.ie?this.normalizeTextNode(t):t.normalize()}normalizeTextNode(e){if(e){if(e.nodeType===3)for(;e.nextSibling&&e.nextSibling.nodeType===3;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}markRegExp(e,t){this.opt=t,this.log(`Searching with expression "${e}"`);let s=0,n="wrapMatches";const r=i=>{s++,this.opt.each(i)};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),this[n](e,this.opt.ignoreGroups,(i,o)=>this.opt.filter(o,i,s),r,()=>{s===0&&this.opt.noMatch(e),this.opt.done(s)})}mark(e,t){this.opt=t;let s=0,n="wrapMatches";const{keywords:r,length:i}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),o=this.opt.caseSensitive?"":"i",l=c=>{let h=new RegExp(this.createRegExp(c),`gm${o}`),v=0;this.log(`Searching with expression "${h}"`),this[n](h,1,(p,b)=>this.opt.filter(b,c,s,v),p=>{v++,s++,this.opt.each(p)},()=>{v===0&&this.opt.noMatch(c),r[i-1]===c?this.opt.done(s):l(r[r.indexOf(c)+1])})};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),i===0?this.opt.done(s):l(r[0])}markRanges(e,t){this.opt=t;let s=0,n=this.checkRanges(e);n&&n.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(n)),this.wrapRangeFromIndex(n,(r,i,o,l)=>this.opt.filter(r,i,o,l),(r,i)=>{s++,this.opt.each(r,i)},()=>{this.opt.done(s)})):this.opt.done(s)}unmark(e){this.opt=e;let t=this.opt.element?this.opt.element:"*";t+="[data-markjs]",this.opt.className&&(t+=`.${this.opt.className}`),this.log(`Removal selector "${t}"`),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,s=>{this.unwrapMatches(s)},s=>{const n=oe.matches(s,t),r=this.matchesExclude(s);return!n||r?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function Cs(a){const e=new Rs(a);return this.mark=(t,s)=>(e.mark(t,s),this),this.markRegExp=(t,s)=>(e.markRegExp(t,s),this),this.markRanges=(t,s)=>(e.markRanges(t,s),this),this.unmark=t=>(e.unmark(t),this),this}function Te(a,e,t,s){function n(r){return r instanceof t?r:new t(function(i){i(r)})}return new(t||(t=Promise))(function(r,i){function o(h){try{c(s.next(h))}catch(v){i(v)}}function l(h){try{c(s.throw(h))}catch(v){i(v)}}function c(h){h.done?r(h.value):n(h.value).then(o,l)}c((s=s.apply(a,[])).next())})}const Ms="ENTRIES",xt="KEYS",St="VALUES",z="";class Ae{constructor(e,t){const s=e._tree,n=Array.from(s.keys());this.set=e,this._type=t,this._path=n.length>0?[{node:s,keys:n}]:[]}next(){const e=this.dive();return this.backtrack(),e}dive(){if(this._path.length===0)return{done:!0,value:void 0};const{node:e,keys:t}=ae(this._path);if(ae(t)===z)return{done:!1,value:this.result()};const s=e.get(ae(t));return this._path.push({node:s,keys:Array.from(s.keys())}),this.dive()}backtrack(){if(this._path.length===0)return;const e=ae(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}key(){return this.set._prefix+this._path.map(({keys:e})=>ae(e)).filter(e=>e!==z).join("")}value(){return ae(this._path).node.get(z)}result(){switch(this._type){case St:return this.value();case xt:return this.key();default:return[this.key(),this.value()]}}[Symbol.iterator](){return this}}const ae=a=>a[a.length-1],As=(a,e,t)=>{const s=new Map;if(e===void 0)return s;const n=e.length+1,r=n+t,i=new Uint8Array(r*n).fill(t+1);for(let o=0;o{const l=r*i;e:for(const c of a.keys())if(c===z){const h=n[l-1];h<=t&&s.set(o,[a.get(c),h])}else{let h=r;for(let v=0;vt)continue e}_t(a.get(c),e,t,s,n,h,i,o+c)}};class Z{constructor(e=new Map,t=""){this._size=void 0,this._tree=e,this._prefix=t}atPrefix(e){if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");const[t,s]=Oe(this._tree,e.slice(this._prefix.length));if(t===void 0){const[n,r]=Ke(s);for(const i of n.keys())if(i!==z&&i.startsWith(r)){const o=new Map;return o.set(i.slice(r.length),n.get(i)),new Z(o,e)}}return new Z(t,e)}clear(){this._size=void 0,this._tree.clear()}delete(e){return this._size=void 0,Ls(this._tree,e)}entries(){return new Ae(this,Ms)}forEach(e){for(const[t,s]of this)e(t,s,this)}fuzzyGet(e,t){return As(this._tree,e,t)}get(e){const t=$e(this._tree,e);return t!==void 0?t.get(z):void 0}has(e){const t=$e(this._tree,e);return t!==void 0&&t.has(z)}keys(){return new Ae(this,xt)}set(e,t){if(typeof e!="string")throw new Error("key must be a string");return this._size=void 0,Le(this._tree,e).set(z,t),this}get size(){if(this._size)return this._size;this._size=0;const e=this.entries();for(;!e.next().done;)this._size+=1;return this._size}update(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const s=Le(this._tree,e);return s.set(z,t(s.get(z))),this}fetch(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const s=Le(this._tree,e);let n=s.get(z);return n===void 0&&s.set(z,n=t()),n}values(){return new Ae(this,St)}[Symbol.iterator](){return this.entries()}static from(e){const t=new Z;for(const[s,n]of e)t.set(s,n);return t}static fromObject(e){return Z.from(Object.entries(e))}}const Oe=(a,e,t=[])=>{if(e.length===0||a==null)return[a,t];for(const s of a.keys())if(s!==z&&e.startsWith(s))return t.push([a,s]),Oe(a.get(s),e.slice(s.length),t);return t.push([a,e]),Oe(void 0,"",t)},$e=(a,e)=>{if(e.length===0||a==null)return a;for(const t of a.keys())if(t!==z&&e.startsWith(t))return $e(a.get(t),e.slice(t.length))},Le=(a,e)=>{const t=e.length;e:for(let s=0;a&&s{const[t,s]=Oe(a,e);if(t!==void 0){if(t.delete(z),t.size===0)Et(s);else if(t.size===1){const[n,r]=t.entries().next().value;Tt(s,n,r)}}},Et=a=>{if(a.length===0)return;const[e,t]=Ke(a);if(e.delete(t),e.size===0)Et(a.slice(0,-1));else if(e.size===1){const[s,n]=e.entries().next().value;s!==z&&Tt(a.slice(0,-1),s,n)}},Tt=(a,e,t)=>{if(a.length===0)return;const[s,n]=Ke(a);s.set(n+e,t),s.delete(n)},Ke=a=>a[a.length-1],Je="or",It="and",Ds="and_not";class le{constructor(e){if((e==null?void 0:e.fields)==null)throw new Error('MiniSearch: option "fields" must be provided');const t=e.autoVacuum==null||e.autoVacuum===!0?Pe:e.autoVacuum;this._options=Object.assign(Object.assign(Object.assign({},ze),e),{autoVacuum:t,searchOptions:Object.assign(Object.assign({},dt),e.searchOptions||{}),autoSuggestOptions:Object.assign(Object.assign({},$s),e.autoSuggestOptions||{})}),this._index=new Z,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldIds={},this._fieldLength=new Map,this._avgFieldLength=[],this._nextId=0,this._storedFields=new Map,this._dirtCount=0,this._currentVacuum=null,this._enqueuedVacuum=null,this._enqueuedVacuumConditions=We,this.addFields(this._options.fields)}add(e){const{extractField:t,tokenize:s,processTerm:n,fields:r,idField:i}=this._options,o=t(e,i);if(o==null)throw new Error(`MiniSearch: document does not have ID field "${i}"`);if(this._idToShortId.has(o))throw new Error(`MiniSearch: duplicate ID ${o}`);const l=this.addDocumentId(o);this.saveStoredFields(l,e);for(const c of r){const h=t(e,c);if(h==null)continue;const v=s(h.toString(),c),p=this._fieldIds[c],b=new Set(v).size;this.addFieldLength(l,p,this._documentCount-1,b);for(const y of v){const x=n(y,c);if(Array.isArray(x))for(const w of x)this.addTerm(p,l,w);else x&&this.addTerm(p,l,x)}}}addAll(e){for(const t of e)this.add(t)}addAllAsync(e,t={}){const{chunkSize:s=10}=t,n={chunk:[],promise:Promise.resolve()},{chunk:r,promise:i}=e.reduce(({chunk:o,promise:l},c,h)=>(o.push(c),(h+1)%s===0?{chunk:[],promise:l.then(()=>new Promise(v=>setTimeout(v,0))).then(()=>this.addAll(o))}:{chunk:o,promise:l}),n);return i.then(()=>this.addAll(r))}remove(e){const{tokenize:t,processTerm:s,extractField:n,fields:r,idField:i}=this._options,o=n(e,i);if(o==null)throw new Error(`MiniSearch: document does not have ID field "${i}"`);const l=this._idToShortId.get(o);if(l==null)throw new Error(`MiniSearch: cannot remove document with ID ${o}: it is not in the index`);for(const c of r){const h=n(e,c);if(h==null)continue;const v=t(h.toString(),c),p=this._fieldIds[c],b=new Set(v).size;this.removeFieldLength(l,p,this._documentCount,b);for(const y of v){const x=s(y,c);if(Array.isArray(x))for(const w of x)this.removeTerm(p,l,w);else x&&this.removeTerm(p,l,x)}}this._storedFields.delete(l),this._documentIds.delete(l),this._idToShortId.delete(o),this._fieldLength.delete(l),this._documentCount-=1}removeAll(e){if(e)for(const t of e)this.remove(t);else{if(arguments.length>0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new Z,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}}discard(e){const t=this._idToShortId.get(e);if(t==null)throw new Error(`MiniSearch: cannot discard document with ID ${e}: it is not in the index`);this._idToShortId.delete(e),this._documentIds.delete(t),this._storedFields.delete(t),(this._fieldLength.get(t)||[]).forEach((s,n)=>{this.removeFieldLength(t,n,this._documentCount,s)}),this._fieldLength.delete(t),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()}maybeAutoVacuum(){if(this._options.autoVacuum===!1)return;const{minDirtFactor:e,minDirtCount:t,batchSize:s,batchWait:n}=this._options.autoVacuum;this.conditionalVacuum({batchSize:s,batchWait:n},{minDirtCount:t,minDirtFactor:e})}discardAll(e){const t=this._options.autoVacuum;try{this._options.autoVacuum=!1;for(const s of e)this.discard(s)}finally{this._options.autoVacuum=t}this.maybeAutoVacuum()}replace(e){const{idField:t,extractField:s}=this._options,n=s(e,t);this.discard(n),this.add(e)}vacuum(e={}){return this.conditionalVacuum(e)}conditionalVacuum(e,t){return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(()=>{const s=this._enqueuedVacuumConditions;return this._enqueuedVacuumConditions=We,this.performVacuuming(e,s)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)}performVacuuming(e,t){return Te(this,void 0,void 0,function*(){const s=this._dirtCount;if(this.vacuumConditionsMet(t)){const n=e.batchSize||Be.batchSize,r=e.batchWait||Be.batchWait;let i=1;for(const[o,l]of this._index){for(const[c,h]of l)for(const[v]of h)this._documentIds.has(v)||(h.size<=1?l.delete(c):h.delete(v));this._index.get(o).size===0&&this._index.delete(o),i%n===0&&(yield new Promise(c=>setTimeout(c,r))),i+=1}this._dirtCount-=s}yield null,this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null})}vacuumConditionsMet(e){if(e==null)return!0;let{minDirtCount:t,minDirtFactor:s}=e;return t=t||Pe.minDirtCount,s=s||Pe.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=s}get isVacuuming(){return this._currentVacuum!=null}get dirtCount(){return this._dirtCount}get dirtFactor(){return this._dirtCount/(1+this._documentCount+this._dirtCount)}has(e){return this._idToShortId.has(e)}getStoredFields(e){const t=this._idToShortId.get(e);if(t!=null)return this._storedFields.get(t)}search(e,t={}){const s=this.executeQuery(e,t),n=[];for(const[r,{score:i,terms:o,match:l}]of s){const c=o.length||1,h={id:this._documentIds.get(r),score:i*c,terms:Object.keys(l),queryTerms:o,match:l};Object.assign(h,this._storedFields.get(r)),(t.filter==null||t.filter(h))&&n.push(h)}return e===le.wildcard&&t.boostDocument==null&&this._options.searchOptions.boostDocument==null||n.sort(ft),n}autoSuggest(e,t={}){t=Object.assign(Object.assign({},this._options.autoSuggestOptions),t);const s=new Map;for(const{score:r,terms:i}of this.search(e,t)){const o=i.join(" "),l=s.get(o);l!=null?(l.score+=r,l.count+=1):s.set(o,{score:r,terms:i,count:1})}const n=[];for(const[r,{score:i,terms:o,count:l}]of s)n.push({suggestion:r,terms:o,score:i/l});return n.sort(ft),n}get documentCount(){return this._documentCount}get termCount(){return this._index.size}static loadJSON(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJS(JSON.parse(e),t)}static loadJSONAsync(e,t){return Te(this,void 0,void 0,function*(){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJSAsync(JSON.parse(e),t)})}static getDefault(e){if(ze.hasOwnProperty(e))return De(ze,e);throw new Error(`MiniSearch: unknown option "${e}"`)}static loadJS(e,t){const{index:s,documentIds:n,fieldLength:r,storedFields:i,serializationVersion:o}=e,l=this.instantiateMiniSearch(e,t);l._documentIds=_e(n),l._fieldLength=_e(r),l._storedFields=_e(i);for(const[c,h]of l._documentIds)l._idToShortId.set(h,c);for(const[c,h]of s){const v=new Map;for(const p of Object.keys(h)){let b=h[p];o===1&&(b=b.ds),v.set(parseInt(p,10),_e(b))}l._index.set(c,v)}return l}static loadJSAsync(e,t){return Te(this,void 0,void 0,function*(){const{index:s,documentIds:n,fieldLength:r,storedFields:i,serializationVersion:o}=e,l=this.instantiateMiniSearch(e,t);l._documentIds=yield Ee(n),l._fieldLength=yield Ee(r),l._storedFields=yield Ee(i);for(const[h,v]of l._documentIds)l._idToShortId.set(v,h);let c=0;for(const[h,v]of s){const p=new Map;for(const b of Object.keys(v)){let y=v[b];o===1&&(y=y.ds),p.set(parseInt(b,10),yield Ee(y))}++c%1e3===0&&(yield kt(0)),l._index.set(h,p)}return l})}static instantiateMiniSearch(e,t){const{documentCount:s,nextId:n,fieldIds:r,averageFieldLength:i,dirtCount:o,serializationVersion:l}=e;if(l!==1&&l!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");const c=new le(t);return c._documentCount=s,c._nextId=n,c._idToShortId=new Map,c._fieldIds=r,c._avgFieldLength=i,c._dirtCount=o||0,c._index=new Z,c}executeQuery(e,t={}){if(e===le.wildcard)return this.executeWildcardQuery(t);if(typeof e!="string"){const p=Object.assign(Object.assign(Object.assign({},t),e),{queries:void 0}),b=e.queries.map(y=>this.executeQuery(y,p));return this.combineResults(b,p.combineWith)}const{tokenize:s,processTerm:n,searchOptions:r}=this._options,i=Object.assign(Object.assign({tokenize:s,processTerm:n},r),t),{tokenize:o,processTerm:l}=i,v=o(e).flatMap(p=>l(p)).filter(p=>!!p).map(Vs(i)).map(p=>this.executeQuerySpec(p,i));return this.combineResults(v,i.combineWith)}executeQuerySpec(e,t){const s=Object.assign(Object.assign({},this._options.searchOptions),t),n=(s.fields||this._options.fields).reduce((x,w)=>Object.assign(Object.assign({},x),{[w]:De(s.boost,w)||1}),{}),{boostDocument:r,weights:i,maxFuzzy:o,bm25:l}=s,{fuzzy:c,prefix:h}=Object.assign(Object.assign({},dt.weights),i),v=this._index.get(e.term),p=this.termResults(e.term,e.term,1,e.termBoost,v,n,r,l);let b,y;if(e.prefix&&(b=this._index.atPrefix(e.term)),e.fuzzy){const x=e.fuzzy===!0?.2:e.fuzzy,w=x<1?Math.min(o,Math.round(e.term.length*x)):x;w&&(y=this._index.fuzzyGet(e.term,w))}if(b)for(const[x,w]of b){const O=x.length-e.term.length;if(!O)continue;y==null||y.delete(x);const R=h*x.length/(x.length+.3*O);this.termResults(e.term,x,R,e.termBoost,w,n,r,l,p)}if(y)for(const x of y.keys()){const[w,O]=y.get(x);if(!O)continue;const R=c*x.length/(x.length+O);this.termResults(e.term,x,R,e.termBoost,w,n,r,l,p)}return p}executeWildcardQuery(e){const t=new Map,s=Object.assign(Object.assign({},this._options.searchOptions),e);for(const[n,r]of this._documentIds){const i=s.boostDocument?s.boostDocument(r,"",this._storedFields.get(n)):1;t.set(n,{score:i,terms:[],match:{}})}return t}combineResults(e,t=Je){if(e.length===0)return new Map;const s=t.toLowerCase(),n=zs[s];if(!n)throw new Error(`Invalid combination operator: ${t}`);return e.reduce(n)||new Map}toJSON(){const e=[];for(const[t,s]of this._index){const n={};for(const[r,i]of s)n[r]=Object.fromEntries(i);e.push([t,n])}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:e,serializationVersion:2}}termResults(e,t,s,n,r,i,o,l,c=new Map){if(r==null)return c;for(const h of Object.keys(i)){const v=i[h],p=this._fieldIds[h],b=r.get(p);if(b==null)continue;let y=b.size;const x=this._avgFieldLength[p];for(const w of b.keys()){if(!this._documentIds.has(w)){this.removeTerm(p,w,t),y-=1;continue}const O=o?o(this._documentIds.get(w),t,this._storedFields.get(w)):1;if(!O)continue;const R=b.get(w),K=this._fieldLength.get(w)[p],G=js(R,y,this._documentCount,K,x,l),W=s*n*v*O*G,V=c.get(w);if(V){V.score+=W,Bs(V.terms,e);const $=De(V.match,t);$?$.push(h):V.match[t]=[h]}else c.set(w,{score:W,terms:[e],match:{[t]:[h]}})}}return c}addTerm(e,t,s){const n=this._index.fetch(s,pt);let r=n.get(e);if(r==null)r=new Map,r.set(t,1),n.set(e,r);else{const i=r.get(t);r.set(t,(i||0)+1)}}removeTerm(e,t,s){if(!this._index.has(s)){this.warnDocumentChanged(t,e,s);return}const n=this._index.fetch(s,pt),r=n.get(e);r==null||r.get(t)==null?this.warnDocumentChanged(t,e,s):r.get(t)<=1?r.size<=1?n.delete(e):r.delete(t):r.set(t,r.get(t)-1),this._index.get(s).size===0&&this._index.delete(s)}warnDocumentChanged(e,t,s){for(const n of Object.keys(this._fieldIds))if(this._fieldIds[n]===t){this._options.logger("warn",`MiniSearch: document with ID ${this._documentIds.get(e)} has changed before removal: term "${s}" was not present in field "${n}". Removing a document after it has changed can corrupt the index!`,"version_conflict");return}}addDocumentId(e){const t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t}addFields(e){for(let t=0;tObject.prototype.hasOwnProperty.call(a,e)?a[e]:void 0,zs={[Je]:(a,e)=>{for(const t of e.keys()){const s=a.get(t);if(s==null)a.set(t,e.get(t));else{const{score:n,terms:r,match:i}=e.get(t);s.score=s.score+n,s.match=Object.assign(s.match,i),ht(s.terms,r)}}return a},[It]:(a,e)=>{const t=new Map;for(const s of e.keys()){const n=a.get(s);if(n==null)continue;const{score:r,terms:i,match:o}=e.get(s);ht(n.terms,i),t.set(s,{score:n.score+r,terms:n.terms,match:Object.assign(n.match,o)})}return t},[Ds]:(a,e)=>{for(const t of e.keys())a.delete(t);return a}},Ps={k:1.2,b:.7,d:.5},js=(a,e,t,s,n,r)=>{const{k:i,b:o,d:l}=r;return Math.log(1+(t-e+.5)/(e+.5))*(l+a*(i+1)/(a+i*(1-o+o*s/n)))},Vs=a=>(e,t,s)=>{const n=typeof a.fuzzy=="function"?a.fuzzy(e,t,s):a.fuzzy||!1,r=typeof a.prefix=="function"?a.prefix(e,t,s):a.prefix===!0,i=typeof a.boostTerm=="function"?a.boostTerm(e,t,s):1;return{term:e,fuzzy:n,prefix:r,termBoost:i}},ze={idField:"id",extractField:(a,e)=>a[e],tokenize:a=>a.split(Ws),processTerm:a=>a.toLowerCase(),fields:void 0,searchOptions:void 0,storeFields:[],logger:(a,e)=>{typeof(console==null?void 0:console[a])=="function"&&console[a](e)},autoVacuum:!0},dt={combineWith:Je,prefix:!1,fuzzy:!1,maxFuzzy:6,boost:{},weights:{fuzzy:.45,prefix:.375},bm25:Ps},$s={combineWith:It,prefix:(a,e,t)=>e===t.length-1},Be={batchSize:1e3,batchWait:10},We={minDirtFactor:.1,minDirtCount:20},Pe=Object.assign(Object.assign({},Be),We),Bs=(a,e)=>{a.includes(e)||a.push(e)},ht=(a,e)=>{for(const t of e)a.includes(t)||a.push(t)},ft=({score:a},{score:e})=>e-a,pt=()=>new Map,_e=a=>{const e=new Map;for(const t of Object.keys(a))e.set(parseInt(t,10),a[t]);return e},Ee=a=>Te(void 0,void 0,void 0,function*(){const e=new Map;let t=0;for(const s of Object.keys(a))e.set(parseInt(s,10),a[s]),++t%1e3===0&&(yield kt(0));return e}),kt=a=>new Promise(e=>setTimeout(e,a)),Ws=/[\n\r\p{Z}\p{P}]+/u;class Ks{constructor(e=10){Re(this,"max");Re(this,"cache");this.max=e,this.cache=new Map}get(e){let t=this.cache.get(e);return t!==void 0&&(this.cache.delete(e),this.cache.set(e,t)),t}set(e,t){this.cache.has(e)?this.cache.delete(e):this.cache.size===this.max&&this.cache.delete(this.first()),this.cache.set(e,t)}first(){return this.cache.keys().next().value}clear(){this.cache.clear()}}const Js=["aria-owns"],Us={class:"shell"},qs=["title"],Gs={class:"search-actions before"},Hs=["title"],Qs=["placeholder"],Ys={class:"search-actions"},Zs=["title"],Xs=["disabled","title"],en=["id","role","aria-labelledby"],tn=["aria-selected"],sn=["href","aria-label","onMouseenter","onFocusin"],nn={class:"titles"},rn=["innerHTML"],an={class:"title main"},on=["innerHTML"],ln={key:0,class:"excerpt-wrapper"},cn={key:0,class:"excerpt",inert:""},un=["innerHTML"],dn={key:0,class:"no-results"},hn={class:"search-keyboard-shortcuts"},fn=["aria-label"],pn=["aria-label"],vn=["aria-label"],mn=["aria-label"],gn=At({__name:"VPLocalSearchBox",emits:["close"],setup(a,{emit:e}){var N,F;const t=e,s=ye(),n=ye(),r=ye(ns),i=ts(),{activate:o}=Os(s,{immediate:!0,allowOutsideClick:!0,clickOutsideDeactivates:!0,escapeDeactivates:!0}),{localeIndex:l,theme:c}=i,h=et(async()=>{var m,f,T,A,C,M,I,L,j;return it(le.loadJSON((T=await((f=(m=r.value)[l.value])==null?void 0:f.call(m)))==null?void 0:T.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1},...((A=c.value.search)==null?void 0:A.provider)==="local"&&((M=(C=c.value.search.options)==null?void 0:C.miniSearch)==null?void 0:M.searchOptions)},...((I=c.value.search)==null?void 0:I.provider)==="local"&&((j=(L=c.value.search.options)==null?void 0:L.miniSearch)==null?void 0:j.options)}))}),p=pe(()=>{var m,f;return((m=c.value.search)==null?void 0:m.provider)==="local"&&((f=c.value.search.options)==null?void 0:f.disableQueryPersistence)===!0}).value?se(""):Lt("vitepress:local-search-filter",""),b=Dt("vitepress:local-search-detailed-list",((N=c.value.search)==null?void 0:N.provider)==="local"&&((F=c.value.search.options)==null?void 0:F.detailedView)===!0),y=pe(()=>{var m,f,T;return((m=c.value.search)==null?void 0:m.provider)==="local"&&(((f=c.value.search.options)==null?void 0:f.disableDetailedView)===!0||((T=c.value.search.options)==null?void 0:T.detailedView)===!1)}),x=pe(()=>{var f,T,A,C,M,I,L;const m=((f=c.value.search)==null?void 0:f.options)??c.value.algolia;return((M=(C=(A=(T=m==null?void 0:m.locales)==null?void 0:T[l.value])==null?void 0:A.translations)==null?void 0:C.button)==null?void 0:M.buttonText)||((L=(I=m==null?void 0:m.translations)==null?void 0:I.button)==null?void 0:L.buttonText)||"Search"});zt(()=>{y.value&&(b.value=!1)});const w=ye([]),O=se(!1);je(p,()=>{O.value=!1});const R=et(async()=>{if(n.value)return it(new Cs(n.value))},null),K=new Ks(16);Pt(()=>[h.value,p.value,b.value],async([m,f,T],A,C)=>{var ge,Ue,qe,Ge;(A==null?void 0:A[0])!==m&&K.clear();let M=!1;if(C(()=>{M=!0}),!m)return;w.value=m.search(f).slice(0,16),O.value=!0;const I=T?await Promise.all(w.value.map(B=>G(B.id))):[];if(M)return;for(const{id:B,mod:X}of I){const ee=B.slice(0,B.indexOf("#"));let Q=K.get(ee);if(Q)continue;Q=new Map,K.set(ee,Q);const U=X.default??X;if(U!=null&&U.render||U!=null&&U.setup){const te=Qt(U);te.config.warnHandler=()=>{},te.provide(Yt,i),Object.defineProperties(te.config.globalProperties,{$frontmatter:{get(){return i.frontmatter.value}},$params:{get(){return i.page.value.params}}});const He=document.createElement("div");te.mount(He),He.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(ce=>{var Ze;const be=(Ze=ce.querySelector("a"))==null?void 0:Ze.getAttribute("href"),Qe=(be==null?void 0:be.startsWith("#"))&&be.slice(1);if(!Qe)return;let Ye="";for(;(ce=ce.nextElementSibling)&&!/^h[1-6]$/i.test(ce.tagName);)Ye+=ce.outerHTML;Q.set(Qe,Ye)}),te.unmount()}if(M)return}const L=new Set;if(w.value=w.value.map(B=>{const[X,ee]=B.id.split("#"),Q=K.get(X),U=(Q==null?void 0:Q.get(ee))??"";for(const te in B.match)L.add(te);return{...B,text:U}}),await ue(),M)return;await new Promise(B=>{var X;(X=R.value)==null||X.unmark({done:()=>{var ee;(ee=R.value)==null||ee.markRegExp(E(L),{done:B})}})});const j=((ge=s.value)==null?void 0:ge.querySelectorAll(".result .excerpt"))??[];for(const B of j)(Ue=B.querySelector('mark[data-markjs="true"]'))==null||Ue.scrollIntoView({block:"center"});(Ge=(qe=n.value)==null?void 0:qe.firstElementChild)==null||Ge.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function G(m){const f=Zt(m.slice(0,m.indexOf("#")));try{if(!f)throw new Error(`Cannot find file for id: ${m}`);return{id:m,mod:await import(f)}}catch(T){return console.error(T),{id:m,mod:{}}}}const W=se(),V=pe(()=>{var m;return((m=p.value)==null?void 0:m.length)<=0});function $(m=!0){var f,T;(f=W.value)==null||f.focus(),m&&((T=W.value)==null||T.select())}Ce(()=>{$()});function me(m){m.pointerType==="mouse"&&$()}const P=se(-1),H=se(!1);je(w,m=>{P.value=m.length?0:-1,J()});function J(){ue(()=>{const m=document.querySelector(".result.selected");m==null||m.scrollIntoView({block:"nearest"})})}we("ArrowUp",m=>{m.preventDefault(),P.value--,P.value<0&&(P.value=w.value.length-1),H.value=!0,J()}),we("ArrowDown",m=>{m.preventDefault(),P.value++,P.value>=w.value.length&&(P.value=0),H.value=!0,J()});const k=jt();we("Enter",m=>{if(m.isComposing||m.target instanceof HTMLButtonElement&&m.target.type!=="submit")return;const f=w.value[P.value];if(m.target instanceof HTMLInputElement&&!f){m.preventDefault();return}f&&(k.go(f.id),t("close"))}),we("Escape",()=>{t("close")});const u=ss({modal:{displayDetails:"Display detailed list",resetButtonTitle:"Reset search",backButtonTitle:"Close search",noResultsText:"No results for",footer:{selectText:"to select",selectKeyAriaLabel:"enter",navigateText:"to navigate",navigateUpKeyAriaLabel:"up arrow",navigateDownKeyAriaLabel:"down arrow",closeText:"to close",closeKeyAriaLabel:"escape"}}});Ce(()=>{window.history.pushState(null,"",null)}),Vt("popstate",m=>{m.preventDefault(),t("close")});const g=$t(Bt?document.body:null);Ce(()=>{ue(()=>{g.value=!0,ue().then(()=>o())})}),Wt(()=>{g.value=!1});function _(){p.value="",ue().then(()=>$(!1))}function E(m){return new RegExp([...m].sort((f,T)=>T.length-f.length).map(f=>`(${Xt(f)})`).join("|"),"gi")}return(m,f)=>{var T,A,C,M;return q(),Kt(Ht,{to:"body"},[S("div",{ref_key:"el",ref:s,role:"button","aria-owns":(T=w.value)!=null&&T.length?"localsearch-list":void 0,"aria-expanded":"true","aria-haspopup":"listbox","aria-labelledby":"localsearch-label",class:"VPLocalSearchBox"},[S("div",{class:"backdrop",onClick:f[0]||(f[0]=I=>m.$emit("close"))}),S("div",Us,[S("form",{class:"search-bar",onPointerup:f[4]||(f[4]=I=>me(I)),onSubmit:f[5]||(f[5]=Jt(()=>{},["prevent"]))},[S("label",{title:x.value,id:"localsearch-label",for:"localsearch-input"},f[8]||(f[8]=[S("span",{"aria-hidden":"true",class:"vpi-search search-icon local-search-icon"},null,-1)]),8,qs),S("div",Gs,[S("button",{class:"back-button",title:D(u)("modal.backButtonTitle"),onClick:f[1]||(f[1]=I=>m.$emit("close"))},f[9]||(f[9]=[S("span",{class:"vpi-arrow-left local-search-icon"},null,-1)]),8,Hs)]),Ut(S("input",{ref_key:"searchInput",ref:W,"onUpdate:modelValue":f[2]||(f[2]=I=>Gt(p)?p.value=I:null),placeholder:x.value,id:"localsearch-input","aria-labelledby":"localsearch-label",class:"search-input"},null,8,Qs),[[qt,D(p)]]),S("div",Ys,[y.value?xe("",!0):(q(),Y("button",{key:0,class:tt(["toggle-layout-button",{"detailed-list":D(b)}]),type:"button",title:D(u)("modal.displayDetails"),onClick:f[3]||(f[3]=I=>P.value>-1&&(b.value=!D(b)))},f[10]||(f[10]=[S("span",{class:"vpi-layout-list local-search-icon"},null,-1)]),10,Zs)),S("button",{class:"clear-button",type:"reset",disabled:V.value,title:D(u)("modal.resetButtonTitle"),onClick:_},f[11]||(f[11]=[S("span",{class:"vpi-delete local-search-icon"},null,-1)]),8,Xs)])],32),S("ul",{ref_key:"resultsEl",ref:n,id:(A=w.value)!=null&&A.length?"localsearch-list":void 0,role:(C=w.value)!=null&&C.length?"listbox":void 0,"aria-labelledby":(M=w.value)!=null&&M.length?"localsearch-label":void 0,class:"results",onMousemove:f[7]||(f[7]=I=>H.value=!1)},[(q(!0),Y(nt,null,st(w.value,(I,L)=>(q(),Y("li",{key:I.id,role:"option","aria-selected":P.value===L?"true":"false"},[S("a",{href:I.id,class:tt(["result",{selected:P.value===L}]),"aria-label":[...I.titles,I.title].join(" > "),onMouseenter:j=>!H.value&&(P.value=L),onFocusin:j=>P.value=L,onClick:f[6]||(f[6]=j=>m.$emit("close"))},[S("div",null,[S("div",nn,[f[13]||(f[13]=S("span",{class:"title-icon"},"#",-1)),(q(!0),Y(nt,null,st(I.titles,(j,ge)=>(q(),Y("span",{key:ge,class:"title"},[S("span",{class:"text",innerHTML:j},null,8,rn),f[12]||(f[12]=S("span",{class:"vpi-chevron-right local-search-icon"},null,-1))]))),128)),S("span",an,[S("span",{class:"text",innerHTML:I.title},null,8,on)])]),D(b)?(q(),Y("div",ln,[I.text?(q(),Y("div",cn,[S("div",{class:"vp-doc",innerHTML:I.text},null,8,un)])):xe("",!0),f[14]||(f[14]=S("div",{class:"excerpt-gradient-bottom"},null,-1)),f[15]||(f[15]=S("div",{class:"excerpt-gradient-top"},null,-1))])):xe("",!0)])],42,sn)],8,tn))),128)),D(p)&&!w.value.length&&O.value?(q(),Y("li",dn,[de(he(D(u)("modal.noResultsText"))+' "',1),S("strong",null,he(D(p)),1),f[16]||(f[16]=de('" '))])):xe("",!0)],40,en),S("div",hn,[S("span",null,[S("kbd",{"aria-label":D(u)("modal.footer.navigateUpKeyAriaLabel")},f[17]||(f[17]=[S("span",{class:"vpi-arrow-up navigate-icon"},null,-1)]),8,fn),S("kbd",{"aria-label":D(u)("modal.footer.navigateDownKeyAriaLabel")},f[18]||(f[18]=[S("span",{class:"vpi-arrow-down navigate-icon"},null,-1)]),8,pn),de(" "+he(D(u)("modal.footer.navigateText")),1)]),S("span",null,[S("kbd",{"aria-label":D(u)("modal.footer.selectKeyAriaLabel")},f[19]||(f[19]=[S("span",{class:"vpi-corner-down-left navigate-icon"},null,-1)]),8,vn),de(" "+he(D(u)("modal.footer.selectText")),1)]),S("span",null,[S("kbd",{"aria-label":D(u)("modal.footer.closeKeyAriaLabel")},"esc",8,mn),de(" "+he(D(u)("modal.footer.closeText")),1)])])])],8,Js)])}}}),_n=es(gn,[["__scopeId","data-v-5b749456"]]);export{_n as default}; diff --git a/dev/assets/chunks/VPLocalSearchBox.DJfC04nF.js b/dev/assets/chunks/VPLocalSearchBox.DJfC04nF.js deleted file mode 100644 index 2aed4d0..0000000 --- a/dev/assets/chunks/VPLocalSearchBox.DJfC04nF.js +++ /dev/null @@ -1,7 +0,0 @@ -var kt=Object.defineProperty;var Ft=(a,e,t)=>e in a?kt(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var Ce=(a,e,t)=>Ft(a,typeof e!="symbol"?e+"":e,t);import{X as Ot,s as ne,v as Ve,al as Rt,am as Ct,d as Mt,G as be,an as et,h as ye,ao as At,ap as Lt,x as Dt,aq as zt,y as Me,R as de,Q as we,ar as Pt,as as jt,Y as Vt,U as $t,a1 as Bt,o as Q,b as Wt,j as x,a2 as Kt,k as D,at as Jt,au as Ut,av as qt,c as Z,n as tt,e as _e,E as st,F as nt,a as he,t as fe,aw as Gt,p as Qt,l as Ht,ax as it,ay as Yt,ab as Zt,ah as Xt,az as es,_ as ts}from"./framework.CBLuZwrP.js";import{u as ss,c as ns}from"./theme.CtZIydQx.js";const is={root:()=>Ot(()=>import("./@localSearchIndexroot.D5JLvZ7R.js"),[])};/*! -* tabbable 6.2.0 -* @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE -*/var vt=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],Ie=vt.join(","),mt=typeof Element>"u",re=mt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Ne=!mt&&Element.prototype.getRootNode?function(a){var e;return a==null||(e=a.getRootNode)===null||e===void 0?void 0:e.call(a)}:function(a){return a==null?void 0:a.ownerDocument},ke=function a(e,t){var s;t===void 0&&(t=!0);var n=e==null||(s=e.getAttribute)===null||s===void 0?void 0:s.call(e,"inert"),r=n===""||n==="true",i=r||t&&e&&a(e.parentNode);return i},rs=function(e){var t,s=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return s===""||s==="true"},gt=function(e,t,s){if(ke(e))return[];var n=Array.prototype.slice.apply(e.querySelectorAll(Ie));return t&&re.call(e,Ie)&&n.unshift(e),n=n.filter(s),n},bt=function a(e,t,s){for(var n=[],r=Array.from(e);r.length;){var i=r.shift();if(!ke(i,!1))if(i.tagName==="SLOT"){var o=i.assignedElements(),c=o.length?o:i.children,l=a(c,!0,s);s.flatten?n.push.apply(n,l):n.push({scopeParent:i,candidates:l})}else{var h=re.call(i,Ie);h&&s.filter(i)&&(t||!e.includes(i))&&n.push(i);var f=i.shadowRoot||typeof s.getShadowRoot=="function"&&s.getShadowRoot(i),v=!ke(f,!1)&&(!s.shadowRootFilter||s.shadowRootFilter(i));if(f&&v){var b=a(f===!0?i.children:f.children,!0,s);s.flatten?n.push.apply(n,b):n.push({scopeParent:i,candidates:b})}else r.unshift.apply(r,i.children)}}return n},yt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},ie=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||rs(e))&&!yt(e)?0:e.tabIndex},as=function(e,t){var s=ie(e);return s<0&&t&&!yt(e)?0:s},os=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},wt=function(e){return e.tagName==="INPUT"},cs=function(e){return wt(e)&&e.type==="hidden"},ls=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(s){return s.tagName==="SUMMARY"});return t},us=function(e,t){for(var s=0;ssummary:first-of-type"),i=r?e.parentElement:e;if(re.call(i,"details:not([open]) *"))return!0;if(!s||s==="full"||s==="legacy-full"){if(typeof n=="function"){for(var o=e;e;){var c=e.parentElement,l=Ne(e);if(c&&!c.shadowRoot&&n(c)===!0)return rt(e);e.assignedSlot?e=e.assignedSlot:!c&&l!==e.ownerDocument?e=l.host:e=c}e=o}if(ps(e))return!e.getClientRects().length;if(s!=="legacy-full")return!0}else if(s==="non-zero-area")return rt(e);return!1},ms=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var s=0;s=0)},bs=function a(e){var t=[],s=[];return e.forEach(function(n,r){var i=!!n.scopeParent,o=i?n.scopeParent:n,c=as(o,i),l=i?a(n.candidates):o;c===0?i?t.push.apply(t,l):t.push(o):s.push({documentOrder:r,tabIndex:c,item:n,isScope:i,content:l})}),s.sort(os).reduce(function(n,r){return r.isScope?n.push.apply(n,r.content):n.push(r.content),n},[]).concat(t)},ys=function(e,t){t=t||{};var s;return t.getShadowRoot?s=bt([e],t.includeContainer,{filter:$e.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:gs}):s=gt(e,t.includeContainer,$e.bind(null,t)),bs(s)},ws=function(e,t){t=t||{};var s;return t.getShadowRoot?s=bt([e],t.includeContainer,{filter:Fe.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):s=gt(e,t.includeContainer,Fe.bind(null,t)),s},ae=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return re.call(e,Ie)===!1?!1:$e(t,e)},_s=vt.concat("iframe").join(","),Ae=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return re.call(e,_s)===!1?!1:Fe(t,e)};/*! -* focus-trap 7.5.4 -* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE -*/function at(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(a);e&&(s=s.filter(function(n){return Object.getOwnPropertyDescriptor(a,n).enumerable})),t.push.apply(t,s)}return t}function ot(a){for(var e=1;e0){var s=e[e.length-1];s!==t&&s.pause()}var n=e.indexOf(t);n===-1||e.splice(n,1),e.push(t)},deactivateTrap:function(e,t){var s=e.indexOf(t);s!==-1&&e.splice(s,1),e.length>0&&e[e.length-1].unpause()}},Ts=function(e){return e.tagName&&e.tagName.toLowerCase()==="input"&&typeof e.select=="function"},Is=function(e){return(e==null?void 0:e.key)==="Escape"||(e==null?void 0:e.key)==="Esc"||(e==null?void 0:e.keyCode)===27},ve=function(e){return(e==null?void 0:e.key)==="Tab"||(e==null?void 0:e.keyCode)===9},Ns=function(e){return ve(e)&&!e.shiftKey},ks=function(e){return ve(e)&&e.shiftKey},lt=function(e){return setTimeout(e,0)},ut=function(e,t){var s=-1;return e.every(function(n,r){return t(n)?(s=r,!1):!0}),s},pe=function(e){for(var t=arguments.length,s=new Array(t>1?t-1:0),n=1;n1?m-1:0),E=1;E=0)u=s.activeElement;else{var d=i.tabbableGroups[0],m=d&&d.firstTabbableNode;u=m||h("fallbackFocus")}if(!u)throw new Error("Your focus-trap needs to have at least one focusable element");return u},v=function(){if(i.containerGroups=i.containers.map(function(u){var d=ys(u,r.tabbableOptions),m=ws(u,r.tabbableOptions),S=d.length>0?d[0]:void 0,E=d.length>0?d[d.length-1]:void 0,k=m.find(function(p){return ae(p)}),F=m.slice().reverse().find(function(p){return ae(p)}),M=!!d.find(function(p){return ie(p)>0});return{container:u,tabbableNodes:d,focusableNodes:m,posTabIndexesFound:M,firstTabbableNode:S,lastTabbableNode:E,firstDomTabbableNode:k,lastDomTabbableNode:F,nextTabbableNode:function(g){var N=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,O=d.indexOf(g);return O<0?N?m.slice(m.indexOf(g)+1).find(function(P){return ae(P)}):m.slice(0,m.indexOf(g)).reverse().find(function(P){return ae(P)}):d[O+(N?1:-1)]}}}),i.tabbableGroups=i.containerGroups.filter(function(u){return u.tabbableNodes.length>0}),i.tabbableGroups.length<=0&&!h("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");if(i.containerGroups.find(function(u){return u.posTabIndexesFound})&&i.containerGroups.length>1)throw new Error("At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.")},b=function T(u){var d=u.activeElement;if(d)return d.shadowRoot&&d.shadowRoot.activeElement!==null?T(d.shadowRoot):d},w=function T(u){if(u!==!1&&u!==b(document)){if(!u||!u.focus){T(f());return}u.focus({preventScroll:!!r.preventScroll}),i.mostRecentlyFocusedNode=u,Ts(u)&&u.select()}},_=function(u){var d=h("setReturnFocus",u);return d||(d===!1?!1:u)},y=function(u){var d=u.target,m=u.event,S=u.isBackward,E=S===void 0?!1:S;d=d||xe(m),v();var k=null;if(i.tabbableGroups.length>0){var F=l(d,m),M=F>=0?i.containerGroups[F]:void 0;if(F<0)E?k=i.tabbableGroups[i.tabbableGroups.length-1].lastTabbableNode:k=i.tabbableGroups[0].firstTabbableNode;else if(E){var p=ut(i.tabbableGroups,function(I){var L=I.firstTabbableNode;return d===L});if(p<0&&(M.container===d||Ae(d,r.tabbableOptions)&&!ae(d,r.tabbableOptions)&&!M.nextTabbableNode(d,!1))&&(p=F),p>=0){var g=p===0?i.tabbableGroups.length-1:p-1,N=i.tabbableGroups[g];k=ie(d)>=0?N.lastTabbableNode:N.lastDomTabbableNode}else ve(m)||(k=M.nextTabbableNode(d,!1))}else{var O=ut(i.tabbableGroups,function(I){var L=I.lastTabbableNode;return d===L});if(O<0&&(M.container===d||Ae(d,r.tabbableOptions)&&!ae(d,r.tabbableOptions)&&!M.nextTabbableNode(d))&&(O=F),O>=0){var P=O===i.tabbableGroups.length-1?0:O+1,j=i.tabbableGroups[P];k=ie(d)>=0?j.firstTabbableNode:j.firstDomTabbableNode}else ve(m)||(k=M.nextTabbableNode(d))}}else k=h("fallbackFocus");return k},R=function(u){var d=xe(u);if(!(l(d,u)>=0)){if(pe(r.clickOutsideDeactivates,u)){o.deactivate({returnFocus:r.returnFocusOnDeactivate});return}pe(r.allowOutsideClick,u)||u.preventDefault()}},C=function(u){var d=xe(u),m=l(d,u)>=0;if(m||d instanceof Document)m&&(i.mostRecentlyFocusedNode=d);else{u.stopImmediatePropagation();var S,E=!0;if(i.mostRecentlyFocusedNode)if(ie(i.mostRecentlyFocusedNode)>0){var k=l(i.mostRecentlyFocusedNode),F=i.containerGroups[k].tabbableNodes;if(F.length>0){var M=F.findIndex(function(p){return p===i.mostRecentlyFocusedNode});M>=0&&(r.isKeyForward(i.recentNavEvent)?M+1=0&&(S=F[M-1],E=!1))}}else i.containerGroups.some(function(p){return p.tabbableNodes.some(function(g){return ie(g)>0})})||(E=!1);else E=!1;E&&(S=y({target:i.mostRecentlyFocusedNode,isBackward:r.isKeyBackward(i.recentNavEvent)})),w(S||i.mostRecentlyFocusedNode||f())}i.recentNavEvent=void 0},J=function(u){var d=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;i.recentNavEvent=u;var m=y({event:u,isBackward:d});m&&(ve(u)&&u.preventDefault(),w(m))},H=function(u){if(Is(u)&&pe(r.escapeDeactivates,u)!==!1){u.preventDefault(),o.deactivate();return}(r.isKeyForward(u)||r.isKeyBackward(u))&&J(u,r.isKeyBackward(u))},W=function(u){var d=xe(u);l(d,u)>=0||pe(r.clickOutsideDeactivates,u)||pe(r.allowOutsideClick,u)||(u.preventDefault(),u.stopImmediatePropagation())},V=function(){if(i.active)return ct.activateTrap(n,o),i.delayInitialFocusTimer=r.delayInitialFocus?lt(function(){w(f())}):w(f()),s.addEventListener("focusin",C,!0),s.addEventListener("mousedown",R,{capture:!0,passive:!1}),s.addEventListener("touchstart",R,{capture:!0,passive:!1}),s.addEventListener("click",W,{capture:!0,passive:!1}),s.addEventListener("keydown",H,{capture:!0,passive:!1}),o},$=function(){if(i.active)return s.removeEventListener("focusin",C,!0),s.removeEventListener("mousedown",R,!0),s.removeEventListener("touchstart",R,!0),s.removeEventListener("click",W,!0),s.removeEventListener("keydown",H,!0),o},Re=function(u){var d=u.some(function(m){var S=Array.from(m.removedNodes);return S.some(function(E){return E===i.mostRecentlyFocusedNode})});d&&w(f())},A=typeof window<"u"&&"MutationObserver"in window?new MutationObserver(Re):void 0,U=function(){A&&(A.disconnect(),i.active&&!i.paused&&i.containers.map(function(u){A.observe(u,{subtree:!0,childList:!0})}))};return o={get active(){return i.active},get paused(){return i.paused},activate:function(u){if(i.active)return this;var d=c(u,"onActivate"),m=c(u,"onPostActivate"),S=c(u,"checkCanFocusTrap");S||v(),i.active=!0,i.paused=!1,i.nodeFocusedBeforeActivation=s.activeElement,d==null||d();var E=function(){S&&v(),V(),U(),m==null||m()};return S?(S(i.containers.concat()).then(E,E),this):(E(),this)},deactivate:function(u){if(!i.active)return this;var d=ot({onDeactivate:r.onDeactivate,onPostDeactivate:r.onPostDeactivate,checkCanReturnFocus:r.checkCanReturnFocus},u);clearTimeout(i.delayInitialFocusTimer),i.delayInitialFocusTimer=void 0,$(),i.active=!1,i.paused=!1,U(),ct.deactivateTrap(n,o);var m=c(d,"onDeactivate"),S=c(d,"onPostDeactivate"),E=c(d,"checkCanReturnFocus"),k=c(d,"returnFocus","returnFocusOnDeactivate");m==null||m();var F=function(){lt(function(){k&&w(_(i.nodeFocusedBeforeActivation)),S==null||S()})};return k&&E?(E(_(i.nodeFocusedBeforeActivation)).then(F,F),this):(F(),this)},pause:function(u){if(i.paused||!i.active)return this;var d=c(u,"onPause"),m=c(u,"onPostPause");return i.paused=!0,d==null||d(),$(),U(),m==null||m(),this},unpause:function(u){if(!i.paused||!i.active)return this;var d=c(u,"onUnpause"),m=c(u,"onPostUnpause");return i.paused=!1,d==null||d(),v(),V(),U(),m==null||m(),this},updateContainerElements:function(u){var d=[].concat(u).filter(Boolean);return i.containers=d.map(function(m){return typeof m=="string"?s.querySelector(m):m}),i.active&&v(),U(),this}},o.updateContainerElements(e),o};function Rs(a,e={}){let t;const{immediate:s,...n}=e,r=ne(!1),i=ne(!1),o=f=>t&&t.activate(f),c=f=>t&&t.deactivate(f),l=()=>{t&&(t.pause(),i.value=!0)},h=()=>{t&&(t.unpause(),i.value=!1)};return Ve(()=>Rt(a),f=>{f&&(t=Os(f,{...n,onActivate(){r.value=!0,e.onActivate&&e.onActivate()},onDeactivate(){r.value=!1,e.onDeactivate&&e.onDeactivate()}}),s&&o())},{flush:"post"}),Ct(()=>c()),{hasFocus:r,isPaused:i,activate:o,deactivate:c,pause:l,unpause:h}}class ce{constructor(e,t=!0,s=[],n=5e3){this.ctx=e,this.iframes=t,this.exclude=s,this.iframesTimeout=n}static matches(e,t){const s=typeof t=="string"?[t]:t,n=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(n){let r=!1;return s.every(i=>n.call(e,i)?(r=!0,!1):!0),r}else return!1}getContexts(){let e,t=[];return typeof this.ctx>"u"||!this.ctx?e=[]:NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?e=this.ctx:typeof this.ctx=="string"?e=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):e=[this.ctx],e.forEach(s=>{const n=t.filter(r=>r.contains(s)).length>0;t.indexOf(s)===-1&&!n&&t.push(s)}),t}getIframeContents(e,t,s=()=>{}){let n;try{const r=e.contentWindow;if(n=r.document,!r||!n)throw new Error("iframe inaccessible")}catch{s()}n&&t(n)}isIframeBlank(e){const t="about:blank",s=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&s!==t&&s}observeIframeLoad(e,t,s){let n=!1,r=null;const i=()=>{if(!n){n=!0,clearTimeout(r);try{this.isIframeBlank(e)||(e.removeEventListener("load",i),this.getIframeContents(e,t,s))}catch{s()}}};e.addEventListener("load",i),r=setTimeout(i,this.iframesTimeout)}onIframeReady(e,t,s){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,s):this.getIframeContents(e,t,s):this.observeIframeLoad(e,t,s)}catch{s()}}waitForIframes(e,t){let s=0;this.forEachIframe(e,()=>!0,n=>{s++,this.waitForIframes(n.querySelector("html"),()=>{--s||t()})},n=>{n||t()})}forEachIframe(e,t,s,n=()=>{}){let r=e.querySelectorAll("iframe"),i=r.length,o=0;r=Array.prototype.slice.call(r);const c=()=>{--i<=0&&n(o)};i||c(),r.forEach(l=>{ce.matches(l,this.exclude)?c():this.onIframeReady(l,h=>{t(l)&&(o++,s(h)),c()},c)})}createIterator(e,t,s){return document.createNodeIterator(e,t,s,!1)}createInstanceOnIframe(e){return new ce(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,s){const n=e.compareDocumentPosition(s),r=Node.DOCUMENT_POSITION_PRECEDING;if(n&r)if(t!==null){const i=t.compareDocumentPosition(s),o=Node.DOCUMENT_POSITION_FOLLOWING;if(i&o)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let s;return t===null?s=e.nextNode():s=e.nextNode()&&e.nextNode(),{prevNode:t,node:s}}checkIframeFilter(e,t,s,n){let r=!1,i=!1;return n.forEach((o,c)=>{o.val===s&&(r=c,i=o.handled)}),this.compareNodeIframe(e,t,s)?(r===!1&&!i?n.push({val:s,handled:!0}):r!==!1&&!i&&(n[r].handled=!0),!0):(r===!1&&n.push({val:s,handled:!1}),!1)}handleOpenIframes(e,t,s,n){e.forEach(r=>{r.handled||this.getIframeContents(r.val,i=>{this.createInstanceOnIframe(i).forEachNode(t,s,n)})})}iterateThroughNodes(e,t,s,n,r){const i=this.createIterator(t,e,n);let o=[],c=[],l,h,f=()=>({prevNode:h,node:l}=this.getIteratorNode(i),l);for(;f();)this.iframes&&this.forEachIframe(t,v=>this.checkIframeFilter(l,h,v,o),v=>{this.createInstanceOnIframe(v).forEachNode(e,b=>c.push(b),n)}),c.push(l);c.forEach(v=>{s(v)}),this.iframes&&this.handleOpenIframes(o,e,s,n),r()}forEachNode(e,t,s,n=()=>{}){const r=this.getContexts();let i=r.length;i||n(),r.forEach(o=>{const c=()=>{this.iterateThroughNodes(e,o,t,s,()=>{--i<=0&&n()})};this.iframes?this.waitForIframes(o,c):c()})}}let Cs=class{constructor(e){this.ctx=e,this.ie=!1;const t=window.navigator.userAgent;(t.indexOf("MSIE")>-1||t.indexOf("Trident")>-1)&&(this.ie=!0)}set opt(e){this._opt=Object.assign({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:"partially",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:"disabled",each:()=>{},noMatch:()=>{},filter:()=>!0,done:()=>{},debug:!1,log:window.console},e)}get opt(){return this._opt}get iterator(){return new ce(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const s=this.opt.log;this.opt.debug&&typeof s=="object"&&typeof s[t]=="function"&&s[t](`mark.js: ${e}`)}escapeStr(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}createRegExp(e){return this.opt.wildcards!=="disabled"&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),this.opt.wildcards!=="disabled"&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),e}createSynonymsRegExp(e){const t=this.opt.synonyms,s=this.opt.caseSensitive?"":"i",n=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let r in t)if(t.hasOwnProperty(r)){const i=t[r],o=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(r):this.escapeStr(r),c=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(i):this.escapeStr(i);o!==""&&c!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(o)}|${this.escapeStr(c)})`,`gm${s}`),n+`(${this.processSynomyms(o)}|${this.processSynomyms(c)})`+n))}return e}processSynomyms(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}setupWildcardsRegExp(e){return e=e.replace(/(?:\\)*\?/g,t=>t.charAt(0)==="\\"?"?":""),e.replace(/(?:\\)*\*/g,t=>t.charAt(0)==="\\"?"*":"")}createWildcardsRegExp(e){let t=this.opt.wildcards==="withSpaces";return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}setupIgnoreJoinersRegExp(e){return e.replace(/[^(|)\\]/g,(t,s,n)=>{let r=n.charAt(s+1);return/[(|)\\]/.test(r)||r===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const s=this.opt.ignorePunctuation;return Array.isArray(s)&&s.length&&t.push(this.escapeStr(s.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join(`[${t.join("")}]*`):e}createDiacriticsRegExp(e){const t=this.opt.caseSensitive?"":"i",s=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"];let n=[];return e.split("").forEach(r=>{s.every(i=>{if(i.indexOf(r)!==-1){if(n.indexOf(i)>-1)return!1;e=e.replace(new RegExp(`[${i}]`,`gm${t}`),`[${i}]`),n.push(i)}return!0})}),e}createMergedBlanksRegExp(e){return e.replace(/[\s]+/gmi,"[\\s]+")}createAccuracyRegExp(e){const t="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿";let s=this.opt.accuracy,n=typeof s=="string"?s:s.value,r=typeof s=="string"?[]:s.limiters,i="";switch(r.forEach(o=>{i+=`|${this.escapeStr(o)}`}),n){case"partially":default:return`()(${e})`;case"complementary":return i="\\s"+(i||this.escapeStr(t)),`()([^${i}]*${e}[^${i}]*)`;case"exactly":return`(^|\\s${i})(${e})(?=$|\\s${i})`}}getSeparatedKeywords(e){let t=[];return e.forEach(s=>{this.opt.separateWordSearch?s.split(" ").forEach(n=>{n.trim()&&t.indexOf(n)===-1&&t.push(n)}):s.trim()&&t.indexOf(s)===-1&&t.push(s)}),{keywords:t.sort((s,n)=>n.length-s.length),length:t.length}}isNumeric(e){return Number(parseFloat(e))==e}checkRanges(e){if(!Array.isArray(e)||Object.prototype.toString.call(e[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];const t=[];let s=0;return e.sort((n,r)=>n.start-r.start).forEach(n=>{let{start:r,end:i,valid:o}=this.callNoMatchOnInvalidRanges(n,s);o&&(n.start=r,n.length=i-r,t.push(n),s=i)}),t}callNoMatchOnInvalidRanges(e,t){let s,n,r=!1;return e&&typeof e.start<"u"?(s=parseInt(e.start,10),n=s+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&n-t>0&&n-s>0?r=!0:(this.log(`Ignoring invalid or overlapping range: ${JSON.stringify(e)}`),this.opt.noMatch(e))):(this.log(`Ignoring invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)),{start:s,end:n,valid:r}}checkWhitespaceRanges(e,t,s){let n,r=!0,i=s.length,o=t-i,c=parseInt(e.start,10)-o;return c=c>i?i:c,n=c+parseInt(e.length,10),n>i&&(n=i,this.log(`End range automatically set to the max value of ${i}`)),c<0||n-c<0||c>i||n>i?(r=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):s.substring(c,n).replace(/\s+/g,"")===""&&(r=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:c,end:n,valid:r}}getTextNodes(e){let t="",s=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,n=>{s.push({start:t.length,end:(t+=n.textContent).length,node:n})},n=>this.matchesExclude(n.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT,()=>{e({value:t,nodes:s})})}matchesExclude(e){return ce.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,s){const n=this.opt.element?this.opt.element:"mark",r=e.splitText(t),i=r.splitText(s-t);let o=document.createElement(n);return o.setAttribute("data-markjs","true"),this.opt.className&&o.setAttribute("class",this.opt.className),o.textContent=r.textContent,r.parentNode.replaceChild(o,r),i}wrapRangeInMappedTextNode(e,t,s,n,r){e.nodes.every((i,o)=>{const c=e.nodes[o+1];if(typeof c>"u"||c.start>t){if(!n(i.node))return!1;const l=t-i.start,h=(s>i.end?i.end:s)-i.start,f=e.value.substr(0,i.start),v=e.value.substr(h+i.start);if(i.node=this.wrapRangeInTextNode(i.node,l,h),e.value=f+v,e.nodes.forEach((b,w)=>{w>=o&&(e.nodes[w].start>0&&w!==o&&(e.nodes[w].start-=h),e.nodes[w].end-=h)}),s-=h,r(i.node.previousSibling,i.start),s>i.end)t=i.end;else return!1}return!0})}wrapMatches(e,t,s,n,r){const i=t===0?0:t+1;this.getTextNodes(o=>{o.nodes.forEach(c=>{c=c.node;let l;for(;(l=e.exec(c.textContent))!==null&&l[i]!=="";){if(!s(l[i],c))continue;let h=l.index;if(i!==0)for(let f=1;f{let c;for(;(c=e.exec(o.value))!==null&&c[i]!=="";){let l=c.index;if(i!==0)for(let f=1;fs(c[i],f),(f,v)=>{e.lastIndex=v,n(f)})}r()})}wrapRangeFromIndex(e,t,s,n){this.getTextNodes(r=>{const i=r.value.length;e.forEach((o,c)=>{let{start:l,end:h,valid:f}=this.checkWhitespaceRanges(o,i,r.value);f&&this.wrapRangeInMappedTextNode(r,l,h,v=>t(v,o,r.value.substring(l,h),c),v=>{s(v,o)})}),n()})}unwrapMatches(e){const t=e.parentNode;let s=document.createDocumentFragment();for(;e.firstChild;)s.appendChild(e.removeChild(e.firstChild));t.replaceChild(s,e),this.ie?this.normalizeTextNode(t):t.normalize()}normalizeTextNode(e){if(e){if(e.nodeType===3)for(;e.nextSibling&&e.nextSibling.nodeType===3;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}markRegExp(e,t){this.opt=t,this.log(`Searching with expression "${e}"`);let s=0,n="wrapMatches";const r=i=>{s++,this.opt.each(i)};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),this[n](e,this.opt.ignoreGroups,(i,o)=>this.opt.filter(o,i,s),r,()=>{s===0&&this.opt.noMatch(e),this.opt.done(s)})}mark(e,t){this.opt=t;let s=0,n="wrapMatches";const{keywords:r,length:i}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),o=this.opt.caseSensitive?"":"i",c=l=>{let h=new RegExp(this.createRegExp(l),`gm${o}`),f=0;this.log(`Searching with expression "${h}"`),this[n](h,1,(v,b)=>this.opt.filter(b,l,s,f),v=>{f++,s++,this.opt.each(v)},()=>{f===0&&this.opt.noMatch(l),r[i-1]===l?this.opt.done(s):c(r[r.indexOf(l)+1])})};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),i===0?this.opt.done(s):c(r[0])}markRanges(e,t){this.opt=t;let s=0,n=this.checkRanges(e);n&&n.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(n)),this.wrapRangeFromIndex(n,(r,i,o,c)=>this.opt.filter(r,i,o,c),(r,i)=>{s++,this.opt.each(r,i)},()=>{this.opt.done(s)})):this.opt.done(s)}unmark(e){this.opt=e;let t=this.opt.element?this.opt.element:"*";t+="[data-markjs]",this.opt.className&&(t+=`.${this.opt.className}`),this.log(`Removal selector "${t}"`),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,s=>{this.unwrapMatches(s)},s=>{const n=ce.matches(s,t),r=this.matchesExclude(s);return!n||r?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function Ms(a){const e=new Cs(a);return this.mark=(t,s)=>(e.mark(t,s),this),this.markRegExp=(t,s)=>(e.markRegExp(t,s),this),this.markRanges=(t,s)=>(e.markRanges(t,s),this),this.unmark=t=>(e.unmark(t),this),this}function Te(a,e,t,s){function n(r){return r instanceof t?r:new t(function(i){i(r)})}return new(t||(t=Promise))(function(r,i){function o(h){try{l(s.next(h))}catch(f){i(f)}}function c(h){try{l(s.throw(h))}catch(f){i(f)}}function l(h){h.done?r(h.value):n(h.value).then(o,c)}l((s=s.apply(a,[])).next())})}const As="ENTRIES",_t="KEYS",xt="VALUES",z="";class Le{constructor(e,t){const s=e._tree,n=Array.from(s.keys());this.set=e,this._type=t,this._path=n.length>0?[{node:s,keys:n}]:[]}next(){const e=this.dive();return this.backtrack(),e}dive(){if(this._path.length===0)return{done:!0,value:void 0};const{node:e,keys:t}=oe(this._path);if(oe(t)===z)return{done:!1,value:this.result()};const s=e.get(oe(t));return this._path.push({node:s,keys:Array.from(s.keys())}),this.dive()}backtrack(){if(this._path.length===0)return;const e=oe(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}key(){return this.set._prefix+this._path.map(({keys:e})=>oe(e)).filter(e=>e!==z).join("")}value(){return oe(this._path).node.get(z)}result(){switch(this._type){case xt:return this.value();case _t:return this.key();default:return[this.key(),this.value()]}}[Symbol.iterator](){return this}}const oe=a=>a[a.length-1],Ls=(a,e,t)=>{const s=new Map;if(e===void 0)return s;const n=e.length+1,r=n+t,i=new Uint8Array(r*n).fill(t+1);for(let o=0;o{const c=r*i;e:for(const l of a.keys())if(l===z){const h=n[c-1];h<=t&&s.set(o,[a.get(l),h])}else{let h=r;for(let f=0;ft)continue e}St(a.get(l),e,t,s,n,h,i,o+l)}};class X{constructor(e=new Map,t=""){this._size=void 0,this._tree=e,this._prefix=t}atPrefix(e){if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");const[t,s]=Oe(this._tree,e.slice(this._prefix.length));if(t===void 0){const[n,r]=Je(s);for(const i of n.keys())if(i!==z&&i.startsWith(r)){const o=new Map;return o.set(i.slice(r.length),n.get(i)),new X(o,e)}}return new X(t,e)}clear(){this._size=void 0,this._tree.clear()}delete(e){return this._size=void 0,Ds(this._tree,e)}entries(){return new Le(this,As)}forEach(e){for(const[t,s]of this)e(t,s,this)}fuzzyGet(e,t){return Ls(this._tree,e,t)}get(e){const t=Be(this._tree,e);return t!==void 0?t.get(z):void 0}has(e){const t=Be(this._tree,e);return t!==void 0&&t.has(z)}keys(){return new Le(this,_t)}set(e,t){if(typeof e!="string")throw new Error("key must be a string");return this._size=void 0,De(this._tree,e).set(z,t),this}get size(){if(this._size)return this._size;this._size=0;const e=this.entries();for(;!e.next().done;)this._size+=1;return this._size}update(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const s=De(this._tree,e);return s.set(z,t(s.get(z))),this}fetch(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const s=De(this._tree,e);let n=s.get(z);return n===void 0&&s.set(z,n=t()),n}values(){return new Le(this,xt)}[Symbol.iterator](){return this.entries()}static from(e){const t=new X;for(const[s,n]of e)t.set(s,n);return t}static fromObject(e){return X.from(Object.entries(e))}}const Oe=(a,e,t=[])=>{if(e.length===0||a==null)return[a,t];for(const s of a.keys())if(s!==z&&e.startsWith(s))return t.push([a,s]),Oe(a.get(s),e.slice(s.length),t);return t.push([a,e]),Oe(void 0,"",t)},Be=(a,e)=>{if(e.length===0||a==null)return a;for(const t of a.keys())if(t!==z&&e.startsWith(t))return Be(a.get(t),e.slice(t.length))},De=(a,e)=>{const t=e.length;e:for(let s=0;a&&s{const[t,s]=Oe(a,e);if(t!==void 0){if(t.delete(z),t.size===0)Et(s);else if(t.size===1){const[n,r]=t.entries().next().value;Tt(s,n,r)}}},Et=a=>{if(a.length===0)return;const[e,t]=Je(a);if(e.delete(t),e.size===0)Et(a.slice(0,-1));else if(e.size===1){const[s,n]=e.entries().next().value;s!==z&&Tt(a.slice(0,-1),s,n)}},Tt=(a,e,t)=>{if(a.length===0)return;const[s,n]=Je(a);s.set(n+e,t),s.delete(n)},Je=a=>a[a.length-1],Ue="or",It="and",zs="and_not";class le{constructor(e){if((e==null?void 0:e.fields)==null)throw new Error('MiniSearch: option "fields" must be provided');const t=e.autoVacuum==null||e.autoVacuum===!0?je:e.autoVacuum;this._options=Object.assign(Object.assign(Object.assign({},Pe),e),{autoVacuum:t,searchOptions:Object.assign(Object.assign({},dt),e.searchOptions||{}),autoSuggestOptions:Object.assign(Object.assign({},Bs),e.autoSuggestOptions||{})}),this._index=new X,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldIds={},this._fieldLength=new Map,this._avgFieldLength=[],this._nextId=0,this._storedFields=new Map,this._dirtCount=0,this._currentVacuum=null,this._enqueuedVacuum=null,this._enqueuedVacuumConditions=Ke,this.addFields(this._options.fields)}add(e){const{extractField:t,tokenize:s,processTerm:n,fields:r,idField:i}=this._options,o=t(e,i);if(o==null)throw new Error(`MiniSearch: document does not have ID field "${i}"`);if(this._idToShortId.has(o))throw new Error(`MiniSearch: duplicate ID ${o}`);const c=this.addDocumentId(o);this.saveStoredFields(c,e);for(const l of r){const h=t(e,l);if(h==null)continue;const f=s(h.toString(),l),v=this._fieldIds[l],b=new Set(f).size;this.addFieldLength(c,v,this._documentCount-1,b);for(const w of f){const _=n(w,l);if(Array.isArray(_))for(const y of _)this.addTerm(v,c,y);else _&&this.addTerm(v,c,_)}}}addAll(e){for(const t of e)this.add(t)}addAllAsync(e,t={}){const{chunkSize:s=10}=t,n={chunk:[],promise:Promise.resolve()},{chunk:r,promise:i}=e.reduce(({chunk:o,promise:c},l,h)=>(o.push(l),(h+1)%s===0?{chunk:[],promise:c.then(()=>new Promise(f=>setTimeout(f,0))).then(()=>this.addAll(o))}:{chunk:o,promise:c}),n);return i.then(()=>this.addAll(r))}remove(e){const{tokenize:t,processTerm:s,extractField:n,fields:r,idField:i}=this._options,o=n(e,i);if(o==null)throw new Error(`MiniSearch: document does not have ID field "${i}"`);const c=this._idToShortId.get(o);if(c==null)throw new Error(`MiniSearch: cannot remove document with ID ${o}: it is not in the index`);for(const l of r){const h=n(e,l);if(h==null)continue;const f=t(h.toString(),l),v=this._fieldIds[l],b=new Set(f).size;this.removeFieldLength(c,v,this._documentCount,b);for(const w of f){const _=s(w,l);if(Array.isArray(_))for(const y of _)this.removeTerm(v,c,y);else _&&this.removeTerm(v,c,_)}}this._storedFields.delete(c),this._documentIds.delete(c),this._idToShortId.delete(o),this._fieldLength.delete(c),this._documentCount-=1}removeAll(e){if(e)for(const t of e)this.remove(t);else{if(arguments.length>0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new X,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}}discard(e){const t=this._idToShortId.get(e);if(t==null)throw new Error(`MiniSearch: cannot discard document with ID ${e}: it is not in the index`);this._idToShortId.delete(e),this._documentIds.delete(t),this._storedFields.delete(t),(this._fieldLength.get(t)||[]).forEach((s,n)=>{this.removeFieldLength(t,n,this._documentCount,s)}),this._fieldLength.delete(t),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()}maybeAutoVacuum(){if(this._options.autoVacuum===!1)return;const{minDirtFactor:e,minDirtCount:t,batchSize:s,batchWait:n}=this._options.autoVacuum;this.conditionalVacuum({batchSize:s,batchWait:n},{minDirtCount:t,minDirtFactor:e})}discardAll(e){const t=this._options.autoVacuum;try{this._options.autoVacuum=!1;for(const s of e)this.discard(s)}finally{this._options.autoVacuum=t}this.maybeAutoVacuum()}replace(e){const{idField:t,extractField:s}=this._options,n=s(e,t);this.discard(n),this.add(e)}vacuum(e={}){return this.conditionalVacuum(e)}conditionalVacuum(e,t){return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(()=>{const s=this._enqueuedVacuumConditions;return this._enqueuedVacuumConditions=Ke,this.performVacuuming(e,s)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)}performVacuuming(e,t){return Te(this,void 0,void 0,function*(){const s=this._dirtCount;if(this.vacuumConditionsMet(t)){const n=e.batchSize||We.batchSize,r=e.batchWait||We.batchWait;let i=1;for(const[o,c]of this._index){for(const[l,h]of c)for(const[f]of h)this._documentIds.has(f)||(h.size<=1?c.delete(l):h.delete(f));this._index.get(o).size===0&&this._index.delete(o),i%n===0&&(yield new Promise(l=>setTimeout(l,r))),i+=1}this._dirtCount-=s}yield null,this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null})}vacuumConditionsMet(e){if(e==null)return!0;let{minDirtCount:t,minDirtFactor:s}=e;return t=t||je.minDirtCount,s=s||je.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=s}get isVacuuming(){return this._currentVacuum!=null}get dirtCount(){return this._dirtCount}get dirtFactor(){return this._dirtCount/(1+this._documentCount+this._dirtCount)}has(e){return this._idToShortId.has(e)}getStoredFields(e){const t=this._idToShortId.get(e);if(t!=null)return this._storedFields.get(t)}search(e,t={}){const s=this.executeQuery(e,t),n=[];for(const[r,{score:i,terms:o,match:c}]of s){const l=o.length||1,h={id:this._documentIds.get(r),score:i*l,terms:Object.keys(c),queryTerms:o,match:c};Object.assign(h,this._storedFields.get(r)),(t.filter==null||t.filter(h))&&n.push(h)}return e===le.wildcard&&t.boostDocument==null&&this._options.searchOptions.boostDocument==null||n.sort(ft),n}autoSuggest(e,t={}){t=Object.assign(Object.assign({},this._options.autoSuggestOptions),t);const s=new Map;for(const{score:r,terms:i}of this.search(e,t)){const o=i.join(" "),c=s.get(o);c!=null?(c.score+=r,c.count+=1):s.set(o,{score:r,terms:i,count:1})}const n=[];for(const[r,{score:i,terms:o,count:c}]of s)n.push({suggestion:r,terms:o,score:i/c});return n.sort(ft),n}get documentCount(){return this._documentCount}get termCount(){return this._index.size}static loadJSON(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJS(JSON.parse(e),t)}static loadJSONAsync(e,t){return Te(this,void 0,void 0,function*(){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJSAsync(JSON.parse(e),t)})}static getDefault(e){if(Pe.hasOwnProperty(e))return ze(Pe,e);throw new Error(`MiniSearch: unknown option "${e}"`)}static loadJS(e,t){const{index:s,documentIds:n,fieldLength:r,storedFields:i,serializationVersion:o}=e,c=this.instantiateMiniSearch(e,t);c._documentIds=Se(n),c._fieldLength=Se(r),c._storedFields=Se(i);for(const[l,h]of c._documentIds)c._idToShortId.set(h,l);for(const[l,h]of s){const f=new Map;for(const v of Object.keys(h)){let b=h[v];o===1&&(b=b.ds),f.set(parseInt(v,10),Se(b))}c._index.set(l,f)}return c}static loadJSAsync(e,t){return Te(this,void 0,void 0,function*(){const{index:s,documentIds:n,fieldLength:r,storedFields:i,serializationVersion:o}=e,c=this.instantiateMiniSearch(e,t);c._documentIds=yield Ee(n),c._fieldLength=yield Ee(r),c._storedFields=yield Ee(i);for(const[h,f]of c._documentIds)c._idToShortId.set(f,h);let l=0;for(const[h,f]of s){const v=new Map;for(const b of Object.keys(f)){let w=f[b];o===1&&(w=w.ds),v.set(parseInt(b,10),yield Ee(w))}++l%1e3===0&&(yield Nt(0)),c._index.set(h,v)}return c})}static instantiateMiniSearch(e,t){const{documentCount:s,nextId:n,fieldIds:r,averageFieldLength:i,dirtCount:o,serializationVersion:c}=e;if(c!==1&&c!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");const l=new le(t);return l._documentCount=s,l._nextId=n,l._idToShortId=new Map,l._fieldIds=r,l._avgFieldLength=i,l._dirtCount=o||0,l._index=new X,l}executeQuery(e,t={}){if(e===le.wildcard)return this.executeWildcardQuery(t);if(typeof e!="string"){const v=Object.assign(Object.assign(Object.assign({},t),e),{queries:void 0}),b=e.queries.map(w=>this.executeQuery(w,v));return this.combineResults(b,v.combineWith)}const{tokenize:s,processTerm:n,searchOptions:r}=this._options,i=Object.assign(Object.assign({tokenize:s,processTerm:n},r),t),{tokenize:o,processTerm:c}=i,f=o(e).flatMap(v=>c(v)).filter(v=>!!v).map($s(i)).map(v=>this.executeQuerySpec(v,i));return this.combineResults(f,i.combineWith)}executeQuerySpec(e,t){const s=Object.assign(Object.assign({},this._options.searchOptions),t),n=(s.fields||this._options.fields).reduce((_,y)=>Object.assign(Object.assign({},_),{[y]:ze(s.boost,y)||1}),{}),{boostDocument:r,weights:i,maxFuzzy:o,bm25:c}=s,{fuzzy:l,prefix:h}=Object.assign(Object.assign({},dt.weights),i),f=this._index.get(e.term),v=this.termResults(e.term,e.term,1,e.termBoost,f,n,r,c);let b,w;if(e.prefix&&(b=this._index.atPrefix(e.term)),e.fuzzy){const _=e.fuzzy===!0?.2:e.fuzzy,y=_<1?Math.min(o,Math.round(e.term.length*_)):_;y&&(w=this._index.fuzzyGet(e.term,y))}if(b)for(const[_,y]of b){const R=_.length-e.term.length;if(!R)continue;w==null||w.delete(_);const C=h*_.length/(_.length+.3*R);this.termResults(e.term,_,C,e.termBoost,y,n,r,c,v)}if(w)for(const _ of w.keys()){const[y,R]=w.get(_);if(!R)continue;const C=l*_.length/(_.length+R);this.termResults(e.term,_,C,e.termBoost,y,n,r,c,v)}return v}executeWildcardQuery(e){const t=new Map,s=Object.assign(Object.assign({},this._options.searchOptions),e);for(const[n,r]of this._documentIds){const i=s.boostDocument?s.boostDocument(r,"",this._storedFields.get(n)):1;t.set(n,{score:i,terms:[],match:{}})}return t}combineResults(e,t=Ue){if(e.length===0)return new Map;const s=t.toLowerCase(),n=Ps[s];if(!n)throw new Error(`Invalid combination operator: ${t}`);return e.reduce(n)||new Map}toJSON(){const e=[];for(const[t,s]of this._index){const n={};for(const[r,i]of s)n[r]=Object.fromEntries(i);e.push([t,n])}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:e,serializationVersion:2}}termResults(e,t,s,n,r,i,o,c,l=new Map){if(r==null)return l;for(const h of Object.keys(i)){const f=i[h],v=this._fieldIds[h],b=r.get(v);if(b==null)continue;let w=b.size;const _=this._avgFieldLength[v];for(const y of b.keys()){if(!this._documentIds.has(y)){this.removeTerm(v,y,t),w-=1;continue}const R=o?o(this._documentIds.get(y),t,this._storedFields.get(y)):1;if(!R)continue;const C=b.get(y),J=this._fieldLength.get(y)[v],H=Vs(C,w,this._documentCount,J,_,c),W=s*n*f*R*H,V=l.get(y);if(V){V.score+=W,Ws(V.terms,e);const $=ze(V.match,t);$?$.push(h):V.match[t]=[h]}else l.set(y,{score:W,terms:[e],match:{[t]:[h]}})}}return l}addTerm(e,t,s){const n=this._index.fetch(s,pt);let r=n.get(e);if(r==null)r=new Map,r.set(t,1),n.set(e,r);else{const i=r.get(t);r.set(t,(i||0)+1)}}removeTerm(e,t,s){if(!this._index.has(s)){this.warnDocumentChanged(t,e,s);return}const n=this._index.fetch(s,pt),r=n.get(e);r==null||r.get(t)==null?this.warnDocumentChanged(t,e,s):r.get(t)<=1?r.size<=1?n.delete(e):r.delete(t):r.set(t,r.get(t)-1),this._index.get(s).size===0&&this._index.delete(s)}warnDocumentChanged(e,t,s){for(const n of Object.keys(this._fieldIds))if(this._fieldIds[n]===t){this._options.logger("warn",`MiniSearch: document with ID ${this._documentIds.get(e)} has changed before removal: term "${s}" was not present in field "${n}". Removing a document after it has changed can corrupt the index!`,"version_conflict");return}}addDocumentId(e){const t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t}addFields(e){for(let t=0;tObject.prototype.hasOwnProperty.call(a,e)?a[e]:void 0,Ps={[Ue]:(a,e)=>{for(const t of e.keys()){const s=a.get(t);if(s==null)a.set(t,e.get(t));else{const{score:n,terms:r,match:i}=e.get(t);s.score=s.score+n,s.match=Object.assign(s.match,i),ht(s.terms,r)}}return a},[It]:(a,e)=>{const t=new Map;for(const s of e.keys()){const n=a.get(s);if(n==null)continue;const{score:r,terms:i,match:o}=e.get(s);ht(n.terms,i),t.set(s,{score:n.score+r,terms:n.terms,match:Object.assign(n.match,o)})}return t},[zs]:(a,e)=>{for(const t of e.keys())a.delete(t);return a}},js={k:1.2,b:.7,d:.5},Vs=(a,e,t,s,n,r)=>{const{k:i,b:o,d:c}=r;return Math.log(1+(t-e+.5)/(e+.5))*(c+a*(i+1)/(a+i*(1-o+o*s/n)))},$s=a=>(e,t,s)=>{const n=typeof a.fuzzy=="function"?a.fuzzy(e,t,s):a.fuzzy||!1,r=typeof a.prefix=="function"?a.prefix(e,t,s):a.prefix===!0,i=typeof a.boostTerm=="function"?a.boostTerm(e,t,s):1;return{term:e,fuzzy:n,prefix:r,termBoost:i}},Pe={idField:"id",extractField:(a,e)=>a[e],tokenize:a=>a.split(Ks),processTerm:a=>a.toLowerCase(),fields:void 0,searchOptions:void 0,storeFields:[],logger:(a,e)=>{typeof(console==null?void 0:console[a])=="function"&&console[a](e)},autoVacuum:!0},dt={combineWith:Ue,prefix:!1,fuzzy:!1,maxFuzzy:6,boost:{},weights:{fuzzy:.45,prefix:.375},bm25:js},Bs={combineWith:It,prefix:(a,e,t)=>e===t.length-1},We={batchSize:1e3,batchWait:10},Ke={minDirtFactor:.1,minDirtCount:20},je=Object.assign(Object.assign({},We),Ke),Ws=(a,e)=>{a.includes(e)||a.push(e)},ht=(a,e)=>{for(const t of e)a.includes(t)||a.push(t)},ft=({score:a},{score:e})=>e-a,pt=()=>new Map,Se=a=>{const e=new Map;for(const t of Object.keys(a))e.set(parseInt(t,10),a[t]);return e},Ee=a=>Te(void 0,void 0,void 0,function*(){const e=new Map;let t=0;for(const s of Object.keys(a))e.set(parseInt(s,10),a[s]),++t%1e3===0&&(yield Nt(0));return e}),Nt=a=>new Promise(e=>setTimeout(e,a)),Ks=/[\n\r\p{Z}\p{P}]+/u;class Js{constructor(e=10){Ce(this,"max");Ce(this,"cache");this.max=e,this.cache=new Map}get(e){let t=this.cache.get(e);return t!==void 0&&(this.cache.delete(e),this.cache.set(e,t)),t}set(e,t){this.cache.has(e)?this.cache.delete(e):this.cache.size===this.max&&this.cache.delete(this.first()),this.cache.set(e,t)}first(){return this.cache.keys().next().value}clear(){this.cache.clear()}}const K=a=>(Qt("data-v-f4c4f812"),a=a(),Ht(),a),Us=["aria-owns"],qs={class:"shell"},Gs=["title"],Qs=K(()=>x("span",{"aria-hidden":"true",class:"vpi-search search-icon local-search-icon"},null,-1)),Hs=[Qs],Ys={class:"search-actions before"},Zs=["title"],Xs=K(()=>x("span",{class:"vpi-arrow-left local-search-icon"},null,-1)),en=[Xs],tn=["placeholder"],sn={class:"search-actions"},nn=["title"],rn=K(()=>x("span",{class:"vpi-layout-list local-search-icon"},null,-1)),an=[rn],on=["disabled","title"],cn=K(()=>x("span",{class:"vpi-delete local-search-icon"},null,-1)),ln=[cn],un=["id","role","aria-labelledby"],dn=["aria-selected"],hn=["href","aria-label","onMouseenter","onFocusin"],fn={class:"titles"},pn=K(()=>x("span",{class:"title-icon"},"#",-1)),vn=["innerHTML"],mn=K(()=>x("span",{class:"vpi-chevron-right local-search-icon"},null,-1)),gn={class:"title main"},bn=["innerHTML"],yn={key:0,class:"excerpt-wrapper"},wn={key:0,class:"excerpt",inert:""},_n=["innerHTML"],xn=K(()=>x("div",{class:"excerpt-gradient-bottom"},null,-1)),Sn=K(()=>x("div",{class:"excerpt-gradient-top"},null,-1)),En={key:0,class:"no-results"},Tn={class:"search-keyboard-shortcuts"},In=["aria-label"],Nn=K(()=>x("span",{class:"vpi-arrow-up navigate-icon"},null,-1)),kn=[Nn],Fn=["aria-label"],On=K(()=>x("span",{class:"vpi-arrow-down navigate-icon"},null,-1)),Rn=[On],Cn=["aria-label"],Mn=K(()=>x("span",{class:"vpi-corner-down-left navigate-icon"},null,-1)),An=[Mn],Ln=["aria-label"],Dn=Mt({__name:"VPLocalSearchBox",emits:["close"],setup(a,{emit:e}){var F,M;const t=e,s=be(),n=be(),r=be(is),i=ss(),{activate:o}=Rs(s,{immediate:!0,allowOutsideClick:!0,clickOutsideDeactivates:!0,escapeDeactivates:!0}),{localeIndex:c,theme:l}=i,h=et(async()=>{var p,g,N,O,P,j,I,L,q;return it(le.loadJSON((N=await((g=(p=r.value)[c.value])==null?void 0:g.call(p)))==null?void 0:N.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1},...((O=l.value.search)==null?void 0:O.provider)==="local"&&((j=(P=l.value.search.options)==null?void 0:P.miniSearch)==null?void 0:j.searchOptions)},...((I=l.value.search)==null?void 0:I.provider)==="local"&&((q=(L=l.value.search.options)==null?void 0:L.miniSearch)==null?void 0:q.options)}))}),v=ye(()=>{var p,g;return((p=l.value.search)==null?void 0:p.provider)==="local"&&((g=l.value.search.options)==null?void 0:g.disableQueryPersistence)===!0}).value?ne(""):At("vitepress:local-search-filter",""),b=Lt("vitepress:local-search-detailed-list",((F=l.value.search)==null?void 0:F.provider)==="local"&&((M=l.value.search.options)==null?void 0:M.detailedView)===!0),w=ye(()=>{var p,g,N;return((p=l.value.search)==null?void 0:p.provider)==="local"&&(((g=l.value.search.options)==null?void 0:g.disableDetailedView)===!0||((N=l.value.search.options)==null?void 0:N.detailedView)===!1)}),_=ye(()=>{var g,N,O,P,j,I,L;const p=((g=l.value.search)==null?void 0:g.options)??l.value.algolia;return((j=(P=(O=(N=p==null?void 0:p.locales)==null?void 0:N[c.value])==null?void 0:O.translations)==null?void 0:P.button)==null?void 0:j.buttonText)||((L=(I=p==null?void 0:p.translations)==null?void 0:I.button)==null?void 0:L.buttonText)||"Search"});Dt(()=>{w.value&&(b.value=!1)});const y=be([]),R=ne(!1);Ve(v,()=>{R.value=!1});const C=et(async()=>{if(n.value)return it(new Ms(n.value))},null),J=new Js(16);zt(()=>[h.value,v.value,b.value],async([p,g,N],O,P)=>{var me,qe,Ge,Qe;(O==null?void 0:O[0])!==p&&J.clear();let j=!1;if(P(()=>{j=!0}),!p)return;y.value=p.search(g).slice(0,16),R.value=!0;const I=N?await Promise.all(y.value.map(B=>H(B.id))):[];if(j)return;for(const{id:B,mod:ee}of I){const te=B.slice(0,B.indexOf("#"));let Y=J.get(te);if(Y)continue;Y=new Map,J.set(te,Y);const G=ee.default??ee;if(G!=null&&G.render||G!=null&&G.setup){const se=Yt(G);se.config.warnHandler=()=>{},se.provide(Zt,i),Object.defineProperties(se.config.globalProperties,{$frontmatter:{get(){return i.frontmatter.value}},$params:{get(){return i.page.value.params}}});const He=document.createElement("div");se.mount(He),He.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(ue=>{var Xe;const ge=(Xe=ue.querySelector("a"))==null?void 0:Xe.getAttribute("href"),Ye=(ge==null?void 0:ge.startsWith("#"))&&ge.slice(1);if(!Ye)return;let Ze="";for(;(ue=ue.nextElementSibling)&&!/^h[1-6]$/i.test(ue.tagName);)Ze+=ue.outerHTML;Y.set(Ye,Ze)}),se.unmount()}if(j)return}const L=new Set;if(y.value=y.value.map(B=>{const[ee,te]=B.id.split("#"),Y=J.get(ee),G=(Y==null?void 0:Y.get(te))??"";for(const se in B.match)L.add(se);return{...B,text:G}}),await de(),j)return;await new Promise(B=>{var ee;(ee=C.value)==null||ee.unmark({done:()=>{var te;(te=C.value)==null||te.markRegExp(k(L),{done:B})}})});const q=((me=s.value)==null?void 0:me.querySelectorAll(".result .excerpt"))??[];for(const B of q)(qe=B.querySelector('mark[data-markjs="true"]'))==null||qe.scrollIntoView({block:"center"});(Qe=(Ge=n.value)==null?void 0:Ge.firstElementChild)==null||Qe.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function H(p){const g=Xt(p.slice(0,p.indexOf("#")));try{if(!g)throw new Error(`Cannot find file for id: ${p}`);return{id:p,mod:await import(g)}}catch(N){return console.error(N),{id:p,mod:{}}}}const W=ne(),V=ye(()=>{var p;return((p=v.value)==null?void 0:p.length)<=0});function $(p=!0){var g,N;(g=W.value)==null||g.focus(),p&&((N=W.value)==null||N.select())}Me(()=>{$()});function Re(p){p.pointerType==="mouse"&&$()}const A=ne(-1),U=ne(!1);Ve(y,p=>{A.value=p.length?0:-1,T()});function T(){de(()=>{const p=document.querySelector(".result.selected");p==null||p.scrollIntoView({block:"nearest"})})}we("ArrowUp",p=>{p.preventDefault(),A.value--,A.value<0&&(A.value=y.value.length-1),U.value=!0,T()}),we("ArrowDown",p=>{p.preventDefault(),A.value++,A.value>=y.value.length&&(A.value=0),U.value=!0,T()});const u=Pt();we("Enter",p=>{if(p.isComposing||p.target instanceof HTMLButtonElement&&p.target.type!=="submit")return;const g=y.value[A.value];if(p.target instanceof HTMLInputElement&&!g){p.preventDefault();return}g&&(u.go(g.id),t("close"))}),we("Escape",()=>{t("close")});const m=ns({modal:{displayDetails:"Display detailed list",resetButtonTitle:"Reset search",backButtonTitle:"Close search",noResultsText:"No results for",footer:{selectText:"to select",selectKeyAriaLabel:"enter",navigateText:"to navigate",navigateUpKeyAriaLabel:"up arrow",navigateDownKeyAriaLabel:"down arrow",closeText:"to close",closeKeyAriaLabel:"escape"}}});Me(()=>{window.history.pushState(null,"",null)}),jt("popstate",p=>{p.preventDefault(),t("close")});const S=Vt($t?document.body:null);Me(()=>{de(()=>{S.value=!0,de().then(()=>o())})}),Bt(()=>{S.value=!1});function E(){v.value="",de().then(()=>$(!1))}function k(p){return new RegExp([...p].sort((g,N)=>N.length-g.length).map(g=>`(${es(g)})`).join("|"),"gi")}return(p,g)=>{var N,O,P,j;return Q(),Wt(Gt,{to:"body"},[x("div",{ref_key:"el",ref:s,role:"button","aria-owns":(N=y.value)!=null&&N.length?"localsearch-list":void 0,"aria-expanded":"true","aria-haspopup":"listbox","aria-labelledby":"localsearch-label",class:"VPLocalSearchBox"},[x("div",{class:"backdrop",onClick:g[0]||(g[0]=I=>p.$emit("close"))}),x("div",qs,[x("form",{class:"search-bar",onPointerup:g[4]||(g[4]=I=>Re(I)),onSubmit:g[5]||(g[5]=Kt(()=>{},["prevent"]))},[x("label",{title:_.value,id:"localsearch-label",for:"localsearch-input"},Hs,8,Gs),x("div",Ys,[x("button",{class:"back-button",title:D(m)("modal.backButtonTitle"),onClick:g[1]||(g[1]=I=>p.$emit("close"))},en,8,Zs)]),Jt(x("input",{ref_key:"searchInput",ref:W,"onUpdate:modelValue":g[2]||(g[2]=I=>qt(v)?v.value=I:null),placeholder:_.value,id:"localsearch-input","aria-labelledby":"localsearch-label",class:"search-input"},null,8,tn),[[Ut,D(v)]]),x("div",sn,[w.value?_e("",!0):(Q(),Z("button",{key:0,class:tt(["toggle-layout-button",{"detailed-list":D(b)}]),type:"button",title:D(m)("modal.displayDetails"),onClick:g[3]||(g[3]=I=>A.value>-1&&(b.value=!D(b)))},an,10,nn)),x("button",{class:"clear-button",type:"reset",disabled:V.value,title:D(m)("modal.resetButtonTitle"),onClick:E},ln,8,on)])],32),x("ul",{ref_key:"resultsEl",ref:n,id:(O=y.value)!=null&&O.length?"localsearch-list":void 0,role:(P=y.value)!=null&&P.length?"listbox":void 0,"aria-labelledby":(j=y.value)!=null&&j.length?"localsearch-label":void 0,class:"results",onMousemove:g[7]||(g[7]=I=>U.value=!1)},[(Q(!0),Z(nt,null,st(y.value,(I,L)=>(Q(),Z("li",{key:I.id,role:"option","aria-selected":A.value===L?"true":"false"},[x("a",{href:I.id,class:tt(["result",{selected:A.value===L}]),"aria-label":[...I.titles,I.title].join(" > "),onMouseenter:q=>!U.value&&(A.value=L),onFocusin:q=>A.value=L,onClick:g[6]||(g[6]=q=>p.$emit("close"))},[x("div",null,[x("div",fn,[pn,(Q(!0),Z(nt,null,st(I.titles,(q,me)=>(Q(),Z("span",{key:me,class:"title"},[x("span",{class:"text",innerHTML:q},null,8,vn),mn]))),128)),x("span",gn,[x("span",{class:"text",innerHTML:I.title},null,8,bn)])]),D(b)?(Q(),Z("div",yn,[I.text?(Q(),Z("div",wn,[x("div",{class:"vp-doc",innerHTML:I.text},null,8,_n)])):_e("",!0),xn,Sn])):_e("",!0)])],42,hn)],8,dn))),128)),D(v)&&!y.value.length&&R.value?(Q(),Z("li",En,[he(fe(D(m)("modal.noResultsText"))+' "',1),x("strong",null,fe(D(v)),1),he('" ')])):_e("",!0)],40,un),x("div",Tn,[x("span",null,[x("kbd",{"aria-label":D(m)("modal.footer.navigateUpKeyAriaLabel")},kn,8,In),x("kbd",{"aria-label":D(m)("modal.footer.navigateDownKeyAriaLabel")},Rn,8,Fn),he(" "+fe(D(m)("modal.footer.navigateText")),1)]),x("span",null,[x("kbd",{"aria-label":D(m)("modal.footer.selectKeyAriaLabel")},An,8,Cn),he(" "+fe(D(m)("modal.footer.selectText")),1)]),x("span",null,[x("kbd",{"aria-label":D(m)("modal.footer.closeKeyAriaLabel")},"esc",8,Ln),he(" "+fe(D(m)("modal.footer.closeText")),1)])])])],8,Us)])}}}),Bn=ts(Dn,[["__scopeId","data-v-f4c4f812"]]);export{Bn as default}; diff --git a/dev/assets/chunks/framework.CBLuZwrP.js b/dev/assets/chunks/framework.CBLuZwrP.js deleted file mode 100644 index 1867df0..0000000 --- a/dev/assets/chunks/framework.CBLuZwrP.js +++ /dev/null @@ -1,17 +0,0 @@ -/** -* @vue/shared v3.4.34 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**//*! #__NO_SIDE_EFFECTS__ */function wr(e,t){const n=new Set(e.split(","));return r=>n.has(r)}const ne={},yt=[],Te=()=>{},Pi=()=>!1,Kt=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Er=e=>e.startsWith("onUpdate:"),fe=Object.assign,Cr=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Ni=Object.prototype.hasOwnProperty,z=(e,t)=>Ni.call(e,t),B=Array.isArray,_t=e=>xn(e)==="[object Map]",zs=e=>xn(e)==="[object Set]",K=e=>typeof e=="function",ie=e=>typeof e=="string",Qe=e=>typeof e=="symbol",Z=e=>e!==null&&typeof e=="object",Js=e=>(Z(e)||K(e))&&K(e.then)&&K(e.catch),Qs=Object.prototype.toString,xn=e=>Qs.call(e),Fi=e=>xn(e).slice(8,-1),Zs=e=>xn(e)==="[object Object]",Sr=e=>ie(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,vt=wr(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Tn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},$i=/-(\w)/g,Oe=Tn(e=>e.replace($i,(t,n)=>n?n.toUpperCase():"")),Hi=/\B([A-Z])/g,Ze=Tn(e=>e.replace(Hi,"-$1").toLowerCase()),An=Tn(e=>e.charAt(0).toUpperCase()+e.slice(1)),fn=Tn(e=>e?`on${An(e)}`:""),ze=(e,t)=>!Object.is(e,t),dn=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},cr=e=>{const t=parseFloat(e);return isNaN(t)?e:t},ji=e=>{const t=ie(e)?Number(e):NaN;return isNaN(t)?e:t};let Jr;const to=()=>Jr||(Jr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function xr(e){if(B(e)){const t={};for(let n=0;n{if(n){const r=n.split(Di);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function Tr(e){let t="";if(ie(e))t=e;else if(B(e))for(let n=0;n!!(e&&e.__v_isRef===!0),Wi=e=>ie(e)?e:e==null?"":B(e)||Z(e)&&(e.toString===Qs||!K(e.toString))?ro(e)?Wi(e.value):JSON.stringify(e,so,2):String(e),so=(e,t)=>ro(t)?so(e,t.value):_t(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s],o)=>(n[kn(r,o)+" =>"]=s,n),{})}:zs(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>kn(n))}:Qe(t)?kn(t):Z(t)&&!B(t)&&!Zs(t)?String(t):t,kn=(e,t="")=>{var n;return Qe(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** -* @vue/reactivity v3.4.34 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let we;class qi{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=we,!t&&we&&(this.index=(we.scopes||(we.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=we;try{return we=this,t()}finally{we=n}}}on(){we=this}off(){we=this.parent}stop(t){if(this._active){let n,r;for(n=0,r=this.effects.length;n=4))break}this._dirtyLevel===1&&(this._dirtyLevel=0),tt()}return this._dirtyLevel>=4}set dirty(t){this._dirtyLevel=t?4:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let t=Xe,n=ct;try{return Xe=!0,ct=this,this._runnings++,Qr(this),this.fn()}finally{Zr(this),this._runnings--,ct=n,Xe=t}}stop(){this.active&&(Qr(this),Zr(this),this.onStop&&this.onStop(),this.active=!1)}}function Yi(e){return e.value}function Qr(e){e._trackId++,e._depsLength=0}function Zr(e){if(e.deps.length>e._depsLength){for(let t=e._depsLength;t{const n=new Map;return n.cleanup=e,n.computed=t,n},yn=new WeakMap,at=Symbol(""),fr=Symbol("");function ve(e,t,n){if(Xe&&ct){let r=yn.get(e);r||yn.set(e,r=new Map);let s=r.get(n);s||r.set(n,s=uo(()=>r.delete(n))),co(ct,s)}}function Ve(e,t,n,r,s,o){const i=yn.get(e);if(!i)return;let l=[];if(t==="clear")l=[...i.values()];else if(n==="length"&&B(e)){const c=Number(r);i.forEach((u,f)=>{(f==="length"||!Qe(f)&&f>=c)&&l.push(u)})}else switch(n!==void 0&&l.push(i.get(n)),t){case"add":B(e)?Sr(n)&&l.push(i.get("length")):(l.push(i.get(at)),_t(e)&&l.push(i.get(fr)));break;case"delete":B(e)||(l.push(i.get(at)),_t(e)&&l.push(i.get(fr)));break;case"set":_t(e)&&l.push(i.get(at));break}Rr();for(const c of l)c&&ao(c,4);Or()}function zi(e,t){const n=yn.get(e);return n&&n.get(t)}const Ji=wr("__proto__,__v_isRef,__isVue"),fo=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Qe)),es=Qi();function Qi(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=J(this);for(let o=0,i=this.length;o{e[t]=function(...n){et(),Rr();const r=J(this)[t].apply(this,n);return Or(),tt(),r}}),e}function Zi(e){Qe(e)||(e=String(e));const t=J(this);return ve(t,"has",e),t.hasOwnProperty(e)}class ho{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){const s=this._isReadonly,o=this._isShallow;if(n==="__v_isReactive")return!s;if(n==="__v_isReadonly")return s;if(n==="__v_isShallow")return o;if(n==="__v_raw")return r===(s?o?dl:yo:o?mo:go).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const i=B(t);if(!s){if(i&&z(es,n))return Reflect.get(es,n,r);if(n==="hasOwnProperty")return Zi}const l=Reflect.get(t,n,r);return(Qe(n)?fo.has(n):Ji(n))||(s||ve(t,"get",n),o)?l:de(l)?i&&Sr(n)?l:l.value:Z(l)?s?Ln(l):On(l):l}}class po extends ho{constructor(t=!1){super(!1,t)}set(t,n,r,s){let o=t[n];if(!this._isShallow){const c=dt(o);if(!St(r)&&!dt(r)&&(o=J(o),r=J(r)),!B(t)&&de(o)&&!de(r))return c?!1:(o.value=r,!0)}const i=B(t)&&Sr(n)?Number(n)e,Rn=e=>Reflect.getPrototypeOf(e);function Jt(e,t,n=!1,r=!1){e=e.__v_raw;const s=J(e),o=J(t);n||(ze(t,o)&&ve(s,"get",t),ve(s,"get",o));const{has:i}=Rn(s),l=r?Lr:n?Pr:jt;if(i.call(s,t))return l(e.get(t));if(i.call(s,o))return l(e.get(o));e!==s&&e.get(t)}function Qt(e,t=!1){const n=this.__v_raw,r=J(n),s=J(e);return t||(ze(e,s)&&ve(r,"has",e),ve(r,"has",s)),e===s?n.has(e):n.has(e)||n.has(s)}function Zt(e,t=!1){return e=e.__v_raw,!t&&ve(J(e),"iterate",at),Reflect.get(e,"size",e)}function ts(e,t=!1){!t&&!St(e)&&!dt(e)&&(e=J(e));const n=J(this);return Rn(n).has.call(n,e)||(n.add(e),Ve(n,"add",e,e)),this}function ns(e,t,n=!1){!n&&!St(t)&&!dt(t)&&(t=J(t));const r=J(this),{has:s,get:o}=Rn(r);let i=s.call(r,e);i||(e=J(e),i=s.call(r,e));const l=o.call(r,e);return r.set(e,t),i?ze(t,l)&&Ve(r,"set",e,t):Ve(r,"add",e,t),this}function rs(e){const t=J(this),{has:n,get:r}=Rn(t);let s=n.call(t,e);s||(e=J(e),s=n.call(t,e)),r&&r.call(t,e);const o=t.delete(e);return s&&Ve(t,"delete",e,void 0),o}function ss(){const e=J(this),t=e.size!==0,n=e.clear();return t&&Ve(e,"clear",void 0,void 0),n}function en(e,t){return function(r,s){const o=this,i=o.__v_raw,l=J(i),c=t?Lr:e?Pr:jt;return!e&&ve(l,"iterate",at),i.forEach((u,f)=>r.call(s,c(u),c(f),o))}}function tn(e,t,n){return function(...r){const s=this.__v_raw,o=J(s),i=_t(o),l=e==="entries"||e===Symbol.iterator&&i,c=e==="keys"&&i,u=s[e](...r),f=n?Lr:t?Pr:jt;return!t&&ve(o,"iterate",c?fr:at),{next(){const{value:h,done:m}=u.next();return m?{value:h,done:m}:{value:l?[f(h[0]),f(h[1])]:f(h),done:m}},[Symbol.iterator](){return this}}}}function Ue(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function sl(){const e={get(o){return Jt(this,o)},get size(){return Zt(this)},has:Qt,add:ts,set:ns,delete:rs,clear:ss,forEach:en(!1,!1)},t={get(o){return Jt(this,o,!1,!0)},get size(){return Zt(this)},has:Qt,add(o){return ts.call(this,o,!0)},set(o,i){return ns.call(this,o,i,!0)},delete:rs,clear:ss,forEach:en(!1,!0)},n={get(o){return Jt(this,o,!0)},get size(){return Zt(this,!0)},has(o){return Qt.call(this,o,!0)},add:Ue("add"),set:Ue("set"),delete:Ue("delete"),clear:Ue("clear"),forEach:en(!0,!1)},r={get(o){return Jt(this,o,!0,!0)},get size(){return Zt(this,!0)},has(o){return Qt.call(this,o,!0)},add:Ue("add"),set:Ue("set"),delete:Ue("delete"),clear:Ue("clear"),forEach:en(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(o=>{e[o]=tn(o,!1,!1),n[o]=tn(o,!0,!1),t[o]=tn(o,!1,!0),r[o]=tn(o,!0,!0)}),[e,n,t,r]}const[ol,il,ll,cl]=sl();function Mr(e,t){const n=t?e?cl:ll:e?il:ol;return(r,s,o)=>s==="__v_isReactive"?!e:s==="__v_isReadonly"?e:s==="__v_raw"?r:Reflect.get(z(n,s)&&s in r?n:r,s,o)}const al={get:Mr(!1,!1)},ul={get:Mr(!1,!0)},fl={get:Mr(!0,!1)};const go=new WeakMap,mo=new WeakMap,yo=new WeakMap,dl=new WeakMap;function hl(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function pl(e){return e.__v_skip||!Object.isExtensible(e)?0:hl(Fi(e))}function On(e){return dt(e)?e:Ir(e,!1,tl,al,go)}function gl(e){return Ir(e,!1,rl,ul,mo)}function Ln(e){return Ir(e,!0,nl,fl,yo)}function Ir(e,t,n,r,s){if(!Z(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=s.get(e);if(o)return o;const i=pl(e);if(i===0)return e;const l=new Proxy(e,i===2?r:n);return s.set(e,l),l}function bt(e){return dt(e)?bt(e.__v_raw):!!(e&&e.__v_isReactive)}function dt(e){return!!(e&&e.__v_isReadonly)}function St(e){return!!(e&&e.__v_isShallow)}function _o(e){return e?!!e.__v_raw:!1}function J(e){const t=e&&e.__v_raw;return t?J(t):e}function hn(e){return Object.isExtensible(e)&&eo(e,"__v_skip",!0),e}const jt=e=>Z(e)?On(e):e,Pr=e=>Z(e)?Ln(e):e;class vo{constructor(t,n,r,s){this.getter=t,this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new Ar(()=>t(this._value),()=>Mt(this,this.effect._dirtyLevel===2?2:3)),this.effect.computed=this,this.effect.active=this._cacheable=!s,this.__v_isReadonly=r}get value(){const t=J(this);return(!t._cacheable||t.effect.dirty)&&ze(t._value,t._value=t.effect.run())&&Mt(t,4),Nr(t),t.effect._dirtyLevel>=2&&Mt(t,2),t._value}set value(t){this._setter(t)}get _dirty(){return this.effect.dirty}set _dirty(t){this.effect.dirty=t}}function ml(e,t,n=!1){let r,s;const o=K(e);return o?(r=e,s=Te):(r=e.get,s=e.set),new vo(r,s,o||!s,n)}function Nr(e){var t;Xe&&ct&&(e=J(e),co(ct,(t=e.dep)!=null?t:e.dep=uo(()=>e.dep=void 0,e instanceof vo?e:void 0)))}function Mt(e,t=4,n,r){e=J(e);const s=e.dep;s&&ao(s,t)}function de(e){return!!(e&&e.__v_isRef===!0)}function oe(e){return bo(e,!1)}function Fr(e){return bo(e,!0)}function bo(e,t){return de(e)?e:new yl(e,t)}class yl{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:J(t),this._value=n?t:jt(t)}get value(){return Nr(this),this._value}set value(t){const n=this.__v_isShallow||St(t)||dt(t);t=n?t:J(t),ze(t,this._rawValue)&&(this._rawValue,this._rawValue=t,this._value=n?t:jt(t),Mt(this,4))}}function wo(e){return de(e)?e.value:e}const _l={get:(e,t,n)=>wo(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const s=e[t];return de(s)&&!de(n)?(s.value=n,!0):Reflect.set(e,t,n,r)}};function Eo(e){return bt(e)?e:new Proxy(e,_l)}class vl{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:r}=t(()=>Nr(this),()=>Mt(this));this._get=n,this._set=r}get value(){return this._get()}set value(t){this._set(t)}}function bl(e){return new vl(e)}class wl{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return zi(J(this._object),this._key)}}class El{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function Cl(e,t,n){return de(e)?e:K(e)?new El(e):Z(e)&&arguments.length>1?Sl(e,t,n):oe(e)}function Sl(e,t,n){const r=e[t];return de(r)?r:new wl(e,t,n)}/** -* @vue/runtime-core v3.4.34 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function Ye(e,t,n,r){try{return r?e(...r):e()}catch(s){Wt(s,t,n)}}function Ae(e,t,n,r){if(K(e)){const s=Ye(e,t,n,r);return s&&Js(s)&&s.catch(o=>{Wt(o,t,n)}),s}if(B(e)){const s=[];for(let o=0;o>>1,s=pe[r],o=Dt(s);oNe&&pe.splice(t,1)}function Rl(e){B(e)?wt.push(...e):(!Ke||!Ke.includes(e,e.allowRecurse?it+1:it))&&wt.push(e),So()}function os(e,t,n=Vt?Ne+1:0){for(;nDt(n)-Dt(r));if(wt.length=0,Ke){Ke.push(...t);return}for(Ke=t,it=0;ite.id==null?1/0:e.id,Ol=(e,t)=>{const n=Dt(e)-Dt(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function xo(e){dr=!1,Vt=!0,pe.sort(Ol);try{for(Ne=0;Ne{r._d&&ws(-1);const o=vn(t);let i;try{i=e(...s)}finally{vn(o),r._d&&ws(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function uu(e,t){if(ue===null)return e;const n=Vn(ue),r=e.dirs||(e.dirs=[]);for(let s=0;s{e.isMounted=!0}),Mo(()=>{e.isUnmounting=!0}),e}const Ce=[Function,Array],To={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Ce,onEnter:Ce,onAfterEnter:Ce,onEnterCancelled:Ce,onBeforeLeave:Ce,onLeave:Ce,onAfterLeave:Ce,onLeaveCancelled:Ce,onBeforeAppear:Ce,onAppear:Ce,onAfterAppear:Ce,onAppearCancelled:Ce},Ao=e=>{const t=e.subTree;return t.component?Ao(t.component):t},Il={name:"BaseTransition",props:To,setup(e,{slots:t}){const n=jn(),r=Ml();return()=>{const s=t.default&&Oo(t.default(),!0);if(!s||!s.length)return;let o=s[0];if(s.length>1){for(const m of s)if(m.type!==me){o=m;break}}const i=J(e),{mode:l}=i;if(r.isLeaving)return Kn(o);const c=is(o);if(!c)return Kn(o);let u=hr(c,i,r,n,m=>u=m);bn(c,u);const f=n.subTree,h=f&&is(f);if(h&&h.type!==me&&!lt(c,h)&&Ao(n).type!==me){const m=hr(h,i,r,n);if(bn(h,m),l==="out-in"&&c.type!==me)return r.isLeaving=!0,m.afterLeave=()=>{r.isLeaving=!1,n.update.active!==!1&&(n.effect.dirty=!0,n.update())},Kn(o);l==="in-out"&&c.type!==me&&(m.delayLeave=(b,S,O)=>{const k=Ro(r,h);k[String(h.key)]=h,b[We]=()=>{S(),b[We]=void 0,delete u.delayedLeave},u.delayedLeave=O})}return o}}},Pl=Il;function Ro(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function hr(e,t,n,r,s){const{appear:o,mode:i,persisted:l=!1,onBeforeEnter:c,onEnter:u,onAfterEnter:f,onEnterCancelled:h,onBeforeLeave:m,onLeave:b,onAfterLeave:S,onLeaveCancelled:O,onBeforeAppear:k,onAppear:W,onAfterAppear:D,onAppearCancelled:p}=t,y=String(e.key),I=Ro(n,e),T=(M,_)=>{M&&Ae(M,r,9,_)},F=(M,_)=>{const N=_[1];T(M,_),B(M)?M.every(x=>x.length<=1)&&N():M.length<=1&&N()},$={mode:i,persisted:l,beforeEnter(M){let _=c;if(!n.isMounted)if(o)_=k||c;else return;M[We]&&M[We](!0);const N=I[y];N&<(e,N)&&N.el[We]&&N.el[We](),T(_,[M])},enter(M){let _=u,N=f,x=h;if(!n.isMounted)if(o)_=W||u,N=D||f,x=p||h;else return;let G=!1;const ee=M[nn]=re=>{G||(G=!0,re?T(x,[M]):T(N,[M]),$.delayedLeave&&$.delayedLeave(),M[nn]=void 0)};_?F(_,[M,ee]):ee()},leave(M,_){const N=String(e.key);if(M[nn]&&M[nn](!0),n.isUnmounting)return _();T(m,[M]);let x=!1;const G=M[We]=ee=>{x||(x=!0,_(),ee?T(O,[M]):T(S,[M]),M[We]=void 0,I[N]===e&&delete I[N])};I[N]=e,b?F(b,[M,G]):G()},clone(M){const _=hr(M,t,n,r,s);return s&&s(_),_}};return $}function Kn(e){if(qt(e))return e=Je(e),e.children=null,e}function is(e){if(!qt(e))return e;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&K(n.default))return n.default()}}function bn(e,t){e.shapeFlag&6&&e.component?bn(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Oo(e,t=!1,n){let r=[],s=0;for(let o=0;o1)for(let o=0;o!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function fu(e){K(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:s=200,timeout:o,suspensible:i=!0,onError:l}=e;let c=null,u,f=0;const h=()=>(f++,c=null,m()),m=()=>{let b;return c||(b=c=t().catch(S=>{if(S=S instanceof Error?S:new Error(String(S)),l)return new Promise((O,k)=>{l(S,()=>O(h()),()=>k(S),f+1)});throw S}).then(S=>b!==c&&c?c:(S&&(S.__esModule||S[Symbol.toStringTag]==="Module")&&(S=S.default),u=S,S)))};return Hr({name:"AsyncComponentWrapper",__asyncLoader:m,get __asyncResolved(){return u},setup(){const b=ae;if(u)return()=>Wn(u,b);const S=D=>{c=null,Wt(D,b,13,!r)};if(i&&b.suspense||Xt)return m().then(D=>()=>Wn(D,b)).catch(D=>(S(D),()=>r?le(r,{error:D}):null));const O=oe(!1),k=oe(),W=oe(!!s);return s&&setTimeout(()=>{W.value=!1},s),o!=null&&setTimeout(()=>{if(!O.value&&!k.value){const D=new Error(`Async component timed out after ${o}ms.`);S(D),k.value=D}},o),m().then(()=>{O.value=!0,b.parent&&qt(b.parent.vnode)&&(b.parent.effect.dirty=!0,In(b.parent.update))}).catch(D=>{S(D),k.value=D}),()=>{if(O.value&&u)return Wn(u,b);if(k.value&&r)return le(r,{error:k.value});if(n&&!W.value)return le(n)}}})}function Wn(e,t){const{ref:n,props:r,children:s,ce:o}=t.vnode,i=le(e,r,s);return i.ref=n,i.ce=o,delete t.vnode.ce,i}const qt=e=>e.type.__isKeepAlive;function Nl(e,t){Lo(e,"a",t)}function Fl(e,t){Lo(e,"da",t)}function Lo(e,t,n=ae){const r=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(Nn(t,r,n),n){let s=n.parent;for(;s&&s.parent;)qt(s.parent.vnode)&&$l(r,t,n,s),s=s.parent}}function $l(e,t,n,r){const s=Nn(t,e,r,!0);Fn(()=>{Cr(r[t],s)},n)}function Nn(e,t,n=ae,r=!1){if(n){const s=n[e]||(n[e]=[]),o=t.__weh||(t.__weh=(...i)=>{et();const l=Gt(n),c=Ae(t,n,e,i);return l(),tt(),c});return r?s.unshift(o):s.push(o),o}}const De=e=>(t,n=ae)=>{(!Xt||e==="sp")&&Nn(e,(...r)=>t(...r),n)},Hl=De("bm"),Tt=De("m"),jl=De("bu"),Vl=De("u"),Mo=De("bum"),Fn=De("um"),Dl=De("sp"),Ul=De("rtg"),Bl=De("rtc");function kl(e,t=ae){Nn("ec",e,t)}const Io="components";function du(e,t){return No(Io,e,!0,t)||e}const Po=Symbol.for("v-ndc");function hu(e){return ie(e)?No(Io,e,!1)||e:e||Po}function No(e,t,n=!0,r=!1){const s=ue||ae;if(s){const o=s.type;{const l=Fc(o,!1);if(l&&(l===t||l===Oe(t)||l===An(Oe(t))))return o}const i=ls(s[e]||o[e],t)||ls(s.appContext[e],t);return!i&&r?o:i}}function ls(e,t){return e&&(e[t]||e[Oe(t)]||e[An(Oe(t))])}function pu(e,t,n,r){let s;const o=n;if(B(e)||ie(e)){s=new Array(e.length);for(let i=0,l=e.length;it(i,l,void 0,o));else{const i=Object.keys(e);s=new Array(i.length);for(let l=0,c=i.length;lCn(t)?!(t.type===me||t.type===_e&&!Fo(t.children)):!0)?e:null}function mu(e,t){const n={};for(const r in e)n[/[A-Z]/.test(r)?`on:${r}`:fn(r)]=e[r];return n}const pr=e=>e?li(e)?Vn(e):pr(e.parent):null,It=fe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>pr(e.parent),$root:e=>pr(e.root),$emit:e=>e.emit,$options:e=>jr(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,In(e.update)}),$nextTick:e=>e.n||(e.n=Mn.bind(e.proxy)),$watch:e=>yc.bind(e)}),qn=(e,t)=>e!==ne&&!e.__isScriptSetup&&z(e,t),Kl={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:r,data:s,props:o,accessCache:i,type:l,appContext:c}=e;let u;if(t[0]!=="$"){const b=i[t];if(b!==void 0)switch(b){case 1:return r[t];case 2:return s[t];case 4:return n[t];case 3:return o[t]}else{if(qn(r,t))return i[t]=1,r[t];if(s!==ne&&z(s,t))return i[t]=2,s[t];if((u=e.propsOptions[0])&&z(u,t))return i[t]=3,o[t];if(n!==ne&&z(n,t))return i[t]=4,n[t];gr&&(i[t]=0)}}const f=It[t];let h,m;if(f)return t==="$attrs"&&ve(e.attrs,"get",""),f(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==ne&&z(n,t))return i[t]=4,n[t];if(m=c.config.globalProperties,z(m,t))return m[t]},set({_:e},t,n){const{data:r,setupState:s,ctx:o}=e;return qn(s,t)?(s[t]=n,!0):r!==ne&&z(r,t)?(r[t]=n,!0):z(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:s,propsOptions:o}},i){let l;return!!n[i]||e!==ne&&z(e,i)||qn(t,i)||(l=o[0])&&z(l,i)||z(r,i)||z(It,i)||z(s.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:z(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function yu(){return Wl().slots}function Wl(){const e=jn();return e.setupContext||(e.setupContext=ai(e))}function cs(e){return B(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let gr=!0;function ql(e){const t=jr(e),n=e.proxy,r=e.ctx;gr=!1,t.beforeCreate&&as(t.beforeCreate,e,"bc");const{data:s,computed:o,methods:i,watch:l,provide:c,inject:u,created:f,beforeMount:h,mounted:m,beforeUpdate:b,updated:S,activated:O,deactivated:k,beforeDestroy:W,beforeUnmount:D,destroyed:p,unmounted:y,render:I,renderTracked:T,renderTriggered:F,errorCaptured:$,serverPrefetch:M,expose:_,inheritAttrs:N,components:x,directives:G,filters:ee}=t;if(u&&Gl(u,r,null),i)for(const Y in i){const j=i[Y];K(j)&&(r[Y]=j.bind(n))}if(s){const Y=s.call(n,n);Z(Y)&&(e.data=On(Y))}if(gr=!0,o)for(const Y in o){const j=o[Y],He=K(j)?j.bind(n,n):K(j.get)?j.get.bind(n,n):Te,Yt=!K(j)&&K(j.set)?j.set.bind(n):Te,nt=se({get:He,set:Yt});Object.defineProperty(r,Y,{enumerable:!0,configurable:!0,get:()=>nt.value,set:Me=>nt.value=Me})}if(l)for(const Y in l)$o(l[Y],r,n,Y);if(c){const Y=K(c)?c.call(n):c;Reflect.ownKeys(Y).forEach(j=>{Zl(j,Y[j])})}f&&as(f,e,"c");function U(Y,j){B(j)?j.forEach(He=>Y(He.bind(n))):j&&Y(j.bind(n))}if(U(Hl,h),U(Tt,m),U(jl,b),U(Vl,S),U(Nl,O),U(Fl,k),U(kl,$),U(Bl,T),U(Ul,F),U(Mo,D),U(Fn,y),U(Dl,M),B(_))if(_.length){const Y=e.exposed||(e.exposed={});_.forEach(j=>{Object.defineProperty(Y,j,{get:()=>n[j],set:He=>n[j]=He})})}else e.exposed||(e.exposed={});I&&e.render===Te&&(e.render=I),N!=null&&(e.inheritAttrs=N),x&&(e.components=x),G&&(e.directives=G)}function Gl(e,t,n=Te){B(e)&&(e=mr(e));for(const r in e){const s=e[r];let o;Z(s)?"default"in s?o=Ct(s.from||r,s.default,!0):o=Ct(s.from||r):o=Ct(s),de(o)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>o.value,set:i=>o.value=i}):t[r]=o}}function as(e,t,n){Ae(B(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function $o(e,t,n,r){const s=r.includes(".")?Qo(n,r):()=>n[r];if(ie(e)){const o=t[e];K(o)&&Fe(s,o)}else if(K(e))Fe(s,e.bind(n));else if(Z(e))if(B(e))e.forEach(o=>$o(o,t,n,r));else{const o=K(e.handler)?e.handler.bind(n):t[e.handler];K(o)&&Fe(s,o,e)}}function jr(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:s,optionsCache:o,config:{optionMergeStrategies:i}}=e.appContext,l=o.get(t);let c;return l?c=l:!s.length&&!n&&!r?c=t:(c={},s.length&&s.forEach(u=>wn(c,u,i,!0)),wn(c,t,i)),Z(t)&&o.set(t,c),c}function wn(e,t,n,r=!1){const{mixins:s,extends:o}=t;o&&wn(e,o,n,!0),s&&s.forEach(i=>wn(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const l=Xl[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const Xl={data:us,props:fs,emits:fs,methods:Lt,computed:Lt,beforeCreate:ge,created:ge,beforeMount:ge,mounted:ge,beforeUpdate:ge,updated:ge,beforeDestroy:ge,beforeUnmount:ge,destroyed:ge,unmounted:ge,activated:ge,deactivated:ge,errorCaptured:ge,serverPrefetch:ge,components:Lt,directives:Lt,watch:zl,provide:us,inject:Yl};function us(e,t){return t?e?function(){return fe(K(e)?e.call(this,this):e,K(t)?t.call(this,this):t)}:t:e}function Yl(e,t){return Lt(mr(e),mr(t))}function mr(e){if(B(e)){const t={};for(let n=0;n1)return n&&K(t)?t.call(r&&r.proxy):t}}const jo={},Vo=()=>Object.create(jo),Do=e=>Object.getPrototypeOf(e)===jo;function ec(e,t,n,r=!1){const s={},o=Vo();e.propsDefaults=Object.create(null),Uo(e,t,s,o);for(const i in e.propsOptions[0])i in s||(s[i]=void 0);n?e.props=r?s:gl(s):e.type.props?e.props=s:e.props=o,e.attrs=o}function tc(e,t,n,r){const{props:s,attrs:o,vnode:{patchFlag:i}}=e,l=J(s),[c]=e.propsOptions;let u=!1;if((r||i>0)&&!(i&16)){if(i&8){const f=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[m,b]=Bo(h,t,!0);fe(i,m),b&&l.push(...b)};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}if(!o&&!c)return Z(e)&&r.set(e,yt),yt;if(B(o))for(let f=0;f-1,b[1]=O<0||S-1||z(b,"default"))&&l.push(h)}}}const u=[i,l];return Z(e)&&r.set(e,u),u}function ds(e){return e[0]!=="$"&&!vt(e)}function hs(e){return e===null?"null":typeof e=="function"?e.name||"":typeof e=="object"&&e.constructor&&e.constructor.name||""}function ps(e,t){return hs(e)===hs(t)}function gs(e,t){return B(t)?t.findIndex(n=>ps(n,e)):K(t)&&ps(t,e)?0:-1}const ko=e=>e[0]==="_"||e==="$stable",Vr=e=>B(e)?e.map(xe):[xe(e)],rc=(e,t,n)=>{if(t._n)return t;const r=Ll((...s)=>Vr(t(...s)),n);return r._c=!1,r},Ko=(e,t,n)=>{const r=e._ctx;for(const s in e){if(ko(s))continue;const o=e[s];if(K(o))t[s]=rc(s,o,r);else if(o!=null){const i=Vr(o);t[s]=()=>i}}},Wo=(e,t)=>{const n=Vr(t);e.slots.default=()=>n},qo=(e,t,n)=>{for(const r in t)(n||r!=="_")&&(e[r]=t[r])},sc=(e,t,n)=>{const r=e.slots=Vo();if(e.vnode.shapeFlag&32){const s=t._;s?(qo(r,t,n),n&&eo(r,"_",s,!0)):Ko(t,r)}else t&&Wo(e,t)},oc=(e,t,n)=>{const{vnode:r,slots:s}=e;let o=!0,i=ne;if(r.shapeFlag&32){const l=t._;l?n&&l===1?o=!1:qo(s,t,n):(o=!t.$stable,Ko(t,s)),i=t}else t&&(Wo(e,t),i={default:1});if(o)for(const l in s)!ko(l)&&i[l]==null&&delete s[l]};function En(e,t,n,r,s=!1){if(B(e)){e.forEach((m,b)=>En(m,t&&(B(t)?t[b]:t),n,r,s));return}if(Et(r)&&!s)return;const o=r.shapeFlag&4?Vn(r.component):r.el,i=s?null:o,{i:l,r:c}=e,u=t&&t.r,f=l.refs===ne?l.refs={}:l.refs,h=l.setupState;if(u!=null&&u!==c&&(ie(u)?(f[u]=null,z(h,u)&&(h[u]=null)):de(u)&&(u.value=null)),K(c))Ye(c,l,12,[i,f]);else{const m=ie(c),b=de(c);if(m||b){const S=()=>{if(e.f){const O=m?z(h,c)?h[c]:f[c]:c.value;s?B(O)&&Cr(O,o):B(O)?O.includes(o)||O.push(o):m?(f[c]=[o],z(h,c)&&(h[c]=f[c])):(c.value=[o],e.k&&(f[e.k]=c.value))}else m?(f[c]=i,z(h,c)&&(h[c]=i)):b&&(c.value=i,e.k&&(f[e.k]=i))};i?(S.id=-1,ye(S,n)):S()}}}const Go=Symbol("_vte"),ic=e=>e.__isTeleport,Nt=e=>e&&(e.disabled||e.disabled===""),ms=e=>typeof SVGElement<"u"&&e instanceof SVGElement,ys=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,_r=(e,t)=>{const n=e&&e.to;return ie(n)?t?t(n):null:n},lc={name:"Teleport",__isTeleport:!0,process(e,t,n,r,s,o,i,l,c,u){const{mc:f,pc:h,pbc:m,o:{insert:b,querySelector:S,createText:O,createComment:k}}=u,W=Nt(t.props);let{shapeFlag:D,children:p,dynamicChildren:y}=t;if(e==null){const I=t.el=O(""),T=t.anchor=O(""),F=t.target=_r(t.props,S),$=t.targetStart=O(""),M=t.targetAnchor=O("");b(I,n,r),b(T,n,r),$[Go]=M,F&&(b($,F),b(M,F),i==="svg"||ms(F)?i="svg":(i==="mathml"||ys(F))&&(i="mathml"));const _=(N,x)=>{D&16&&f(p,N,x,s,o,i,l,c)};W?_(n,T):F&&_(F,M)}else{t.el=e.el,t.targetStart=e.targetStart;const I=t.anchor=e.anchor,T=t.target=e.target,F=t.targetAnchor=e.targetAnchor,$=Nt(e.props),M=$?n:T,_=$?I:F;if(i==="svg"||ms(T)?i="svg":(i==="mathml"||ys(T))&&(i="mathml"),y?(m(e.dynamicChildren,y,M,s,o,i,l),Dr(e,t,!0)):c||h(e,t,M,_,s,o,i,l,!1),W)$?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):rn(t,n,I,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const N=t.target=_r(t.props,S);N&&rn(t,N,null,u,0)}else $&&rn(t,T,F,u,1)}Xo(t)},remove(e,t,n,{um:r,o:{remove:s}},o){const{shapeFlag:i,children:l,anchor:c,targetStart:u,targetAnchor:f,target:h,props:m}=e;if(h&&(s(u),s(f)),o&&s(c),i&16){const b=o||!Nt(m);for(let S=0;S{_s||(console.error("Hydration completed but contains mismatches."),_s=!0)},ac=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",uc=e=>e.namespaceURI.includes("MathML"),sn=e=>{if(ac(e))return"svg";if(uc(e))return"mathml"},on=e=>e.nodeType===8;function fc(e){const{mt:t,p:n,o:{patchProp:r,createText:s,nextSibling:o,parentNode:i,remove:l,insert:c,createComment:u}}=e,f=(p,y)=>{if(!y.hasChildNodes()){n(null,p,y),_n(),y._vnode=p;return}h(y.firstChild,p,null,null,null),_n(),y._vnode=p},h=(p,y,I,T,F,$=!1)=>{$=$||!!y.dynamicChildren;const M=on(p)&&p.data==="[",_=()=>O(p,y,I,T,F,M),{type:N,ref:x,shapeFlag:G,patchFlag:ee}=y;let re=p.nodeType;y.el=p,ee===-2&&($=!1,y.dynamicChildren=null);let U=null;switch(N){case ut:re!==3?y.children===""?(c(y.el=s(""),i(p),p),U=p):U=_():(p.data!==y.children&&(gt(),p.data=y.children),U=o(p));break;case me:D(p)?(U=o(p),W(y.el=p.content.firstChild,p,I)):re!==8||M?U=_():U=o(p);break;case Ft:if(M&&(p=o(p),re=p.nodeType),re===1||re===3){U=p;const Y=!y.children.length;for(let j=0;j{$=$||!!y.dynamicChildren;const{type:M,props:_,patchFlag:N,shapeFlag:x,dirs:G,transition:ee}=y,re=M==="input"||M==="option";if(re||N!==-1){G&&Pe(y,null,I,"created");let U=!1;if(D(p)){U=zo(T,ee)&&I&&I.vnode.props&&I.vnode.props.appear;const j=p.content.firstChild;U&&ee.beforeEnter(j),W(j,p,I),y.el=p=j}if(x&16&&!(_&&(_.innerHTML||_.textContent))){let j=b(p.firstChild,y,p,I,T,F,$);for(;j;){gt();const He=j;j=j.nextSibling,l(He)}}else x&8&&p.textContent!==y.children&&(gt(),p.textContent=y.children);if(_){if(re||!$||N&48)for(const j in _)(re&&(j.endsWith("value")||j==="indeterminate")||Kt(j)&&!vt(j)||j[0]===".")&&r(p,j,null,_[j],void 0,I);else if(_.onClick)r(p,"onClick",null,_.onClick,void 0,I);else if(N&4&&bt(_.style))for(const j in _.style)_.style[j]}let Y;(Y=_&&_.onVnodeBeforeMount)&&Se(Y,I,y),G&&Pe(y,null,I,"beforeMount"),((Y=_&&_.onVnodeMounted)||G||U)&&ei(()=>{Y&&Se(Y,I,y),U&&ee.enter(p),G&&Pe(y,null,I,"mounted")},T)}return p.nextSibling},b=(p,y,I,T,F,$,M)=>{M=M||!!y.dynamicChildren;const _=y.children,N=_.length;for(let x=0;x{const{slotScopeIds:M}=y;M&&(F=F?F.concat(M):M);const _=i(p),N=b(o(p),y,_,I,T,F,$);return N&&on(N)&&N.data==="]"?o(y.anchor=N):(gt(),c(y.anchor=u("]"),_,N),N)},O=(p,y,I,T,F,$)=>{if(gt(),y.el=null,$){const N=k(p);for(;;){const x=o(p);if(x&&x!==N)l(x);else break}}const M=o(p),_=i(p);return l(p),n(null,y,_,M,I,T,sn(_),F),M},k=(p,y="[",I="]")=>{let T=0;for(;p;)if(p=o(p),p&&on(p)&&(p.data===y&&T++,p.data===I)){if(T===0)return o(p);T--}return p},W=(p,y,I)=>{const T=y.parentNode;T&&T.replaceChild(p,y);let F=I;for(;F;)F.vnode.el===y&&(F.vnode.el=F.subTree.el=p),F=F.parent},D=p=>p.nodeType===1&&p.tagName.toLowerCase()==="template";return[f,h]}const ye=ei;function dc(e){return Yo(e)}function hc(e){return Yo(e,fc)}function Yo(e,t){const n=to();n.__VUE__=!0;const{insert:r,remove:s,patchProp:o,createElement:i,createText:l,createComment:c,setText:u,setElementText:f,parentNode:h,nextSibling:m,setScopeId:b=Te,insertStaticContent:S}=e,O=(a,d,g,E=null,v=null,C=null,L=void 0,A=null,R=!!d.dynamicChildren)=>{if(a===d)return;a&&!lt(a,d)&&(E=zt(a),Me(a,v,C,!0),a=null),d.patchFlag===-2&&(R=!1,d.dynamicChildren=null);const{type:w,ref:P,shapeFlag:V}=d;switch(w){case ut:k(a,d,g,E);break;case me:W(a,d,g,E);break;case Ft:a==null&&D(d,g,E,L);break;case _e:x(a,d,g,E,v,C,L,A,R);break;default:V&1?I(a,d,g,E,v,C,L,A,R):V&6?G(a,d,g,E,v,C,L,A,R):(V&64||V&128)&&w.process(a,d,g,E,v,C,L,A,R,ht)}P!=null&&v&&En(P,a&&a.ref,C,d||a,!d)},k=(a,d,g,E)=>{if(a==null)r(d.el=l(d.children),g,E);else{const v=d.el=a.el;d.children!==a.children&&u(v,d.children)}},W=(a,d,g,E)=>{a==null?r(d.el=c(d.children||""),g,E):d.el=a.el},D=(a,d,g,E)=>{[a.el,a.anchor]=S(a.children,d,g,E,a.el,a.anchor)},p=({el:a,anchor:d},g,E)=>{let v;for(;a&&a!==d;)v=m(a),r(a,g,E),a=v;r(d,g,E)},y=({el:a,anchor:d})=>{let g;for(;a&&a!==d;)g=m(a),s(a),a=g;s(d)},I=(a,d,g,E,v,C,L,A,R)=>{d.type==="svg"?L="svg":d.type==="math"&&(L="mathml"),a==null?T(d,g,E,v,C,L,A,R):M(a,d,v,C,L,A,R)},T=(a,d,g,E,v,C,L,A)=>{let R,w;const{props:P,shapeFlag:V,transition:H,dirs:q}=a;if(R=a.el=i(a.type,C,P&&P.is,P),V&8?f(R,a.children):V&16&&$(a.children,R,null,E,v,Gn(a,C),L,A),q&&Pe(a,null,E,"created"),F(R,a,a.scopeId,L,E),P){for(const te in P)te!=="value"&&!vt(te)&&o(R,te,null,P[te],C,E);"value"in P&&o(R,"value",null,P.value,C),(w=P.onVnodeBeforeMount)&&Se(w,E,a)}q&&Pe(a,null,E,"beforeMount");const X=zo(v,H);X&&H.beforeEnter(R),r(R,d,g),((w=P&&P.onVnodeMounted)||X||q)&&ye(()=>{w&&Se(w,E,a),X&&H.enter(R),q&&Pe(a,null,E,"mounted")},v)},F=(a,d,g,E,v)=>{if(g&&b(a,g),E)for(let C=0;C{for(let w=R;w{const A=d.el=a.el;let{patchFlag:R,dynamicChildren:w,dirs:P}=d;R|=a.patchFlag&16;const V=a.props||ne,H=d.props||ne;let q;if(g&&rt(g,!1),(q=H.onVnodeBeforeUpdate)&&Se(q,g,d,a),P&&Pe(d,a,g,"beforeUpdate"),g&&rt(g,!0),(V.innerHTML&&H.innerHTML==null||V.textContent&&H.textContent==null)&&f(A,""),w?_(a.dynamicChildren,w,A,g,E,Gn(d,v),C):L||j(a,d,A,null,g,E,Gn(d,v),C,!1),R>0){if(R&16)N(A,V,H,g,v);else if(R&2&&V.class!==H.class&&o(A,"class",null,H.class,v),R&4&&o(A,"style",V.style,H.style,v),R&8){const X=d.dynamicProps;for(let te=0;te{q&&Se(q,g,d,a),P&&Pe(d,a,g,"updated")},E)},_=(a,d,g,E,v,C,L)=>{for(let A=0;A{if(d!==g){if(d!==ne)for(const C in d)!vt(C)&&!(C in g)&&o(a,C,d[C],null,v,E);for(const C in g){if(vt(C))continue;const L=g[C],A=d[C];L!==A&&C!=="value"&&o(a,C,A,L,v,E)}"value"in g&&o(a,"value",d.value,g.value,v)}},x=(a,d,g,E,v,C,L,A,R)=>{const w=d.el=a?a.el:l(""),P=d.anchor=a?a.anchor:l("");let{patchFlag:V,dynamicChildren:H,slotScopeIds:q}=d;q&&(A=A?A.concat(q):q),a==null?(r(w,g,E),r(P,g,E),$(d.children||[],g,P,v,C,L,A,R)):V>0&&V&64&&H&&a.dynamicChildren?(_(a.dynamicChildren,H,g,v,C,L,A),(d.key!=null||v&&d===v.subTree)&&Dr(a,d,!0)):j(a,d,g,P,v,C,L,A,R)},G=(a,d,g,E,v,C,L,A,R)=>{d.slotScopeIds=A,a==null?d.shapeFlag&512?v.ctx.activate(d,g,E,L,R):ee(d,g,E,v,C,L,R):re(a,d,R)},ee=(a,d,g,E,v,C,L)=>{const A=a.component=Mc(a,E,v);if(qt(a)&&(A.ctx.renderer=ht),Ic(A,!1,L),A.asyncDep){if(v&&v.registerDep(A,U,L),!a.el){const R=A.subTree=le(me);W(null,R,d,g)}}else U(A,a,d,g,v,C,L)},re=(a,d,g)=>{const E=d.component=a.component;if(Ec(a,d,g))if(E.asyncDep&&!E.asyncResolved){Y(E,d,g);return}else E.next=d,Al(E.update),E.effect.dirty=!0,E.update();else d.el=a.el,E.vnode=d},U=(a,d,g,E,v,C,L)=>{const A=()=>{if(a.isMounted){let{next:P,bu:V,u:H,parent:q,vnode:X}=a;{const pt=Jo(a);if(pt){P&&(P.el=X.el,Y(a,P,L)),pt.asyncDep.then(()=>{a.isUnmounted||A()});return}}let te=P,Q;rt(a,!1),P?(P.el=X.el,Y(a,P,L)):P=X,V&&dn(V),(Q=P.props&&P.props.onVnodeBeforeUpdate)&&Se(Q,q,P,X),rt(a,!0);const ce=Xn(a),Re=a.subTree;a.subTree=ce,O(Re,ce,h(Re.el),zt(Re),a,v,C),P.el=ce.el,te===null&&Cc(a,ce.el),H&&ye(H,v),(Q=P.props&&P.props.onVnodeUpdated)&&ye(()=>Se(Q,q,P,X),v)}else{let P;const{el:V,props:H}=d,{bm:q,m:X,parent:te}=a,Q=Et(d);if(rt(a,!1),q&&dn(q),!Q&&(P=H&&H.onVnodeBeforeMount)&&Se(P,te,d),rt(a,!0),V&&Bn){const ce=()=>{a.subTree=Xn(a),Bn(V,a.subTree,a,v,null)};Q?d.type.__asyncLoader().then(()=>!a.isUnmounted&&ce()):ce()}else{const ce=a.subTree=Xn(a);O(null,ce,g,E,a,v,C),d.el=ce.el}if(X&&ye(X,v),!Q&&(P=H&&H.onVnodeMounted)){const ce=d;ye(()=>Se(P,te,ce),v)}(d.shapeFlag&256||te&&Et(te.vnode)&&te.vnode.shapeFlag&256)&&a.a&&ye(a.a,v),a.isMounted=!0,d=g=E=null}},R=a.effect=new Ar(A,Te,()=>In(w),a.scope),w=a.update=()=>{R.dirty&&R.run()};w.i=a,w.id=a.uid,rt(a,!0),w()},Y=(a,d,g)=>{d.component=a;const E=a.vnode.props;a.vnode=d,a.next=null,tc(a,d.props,E,g),oc(a,d.children,g),et(),os(a),tt()},j=(a,d,g,E,v,C,L,A,R=!1)=>{const w=a&&a.children,P=a?a.shapeFlag:0,V=d.children,{patchFlag:H,shapeFlag:q}=d;if(H>0){if(H&128){Yt(w,V,g,E,v,C,L,A,R);return}else if(H&256){He(w,V,g,E,v,C,L,A,R);return}}q&8?(P&16&&At(w,v,C),V!==w&&f(g,V)):P&16?q&16?Yt(w,V,g,E,v,C,L,A,R):At(w,v,C,!0):(P&8&&f(g,""),q&16&&$(V,g,E,v,C,L,A,R))},He=(a,d,g,E,v,C,L,A,R)=>{a=a||yt,d=d||yt;const w=a.length,P=d.length,V=Math.min(w,P);let H;for(H=0;HP?At(a,v,C,!0,!1,V):$(d,g,E,v,C,L,A,R,V)},Yt=(a,d,g,E,v,C,L,A,R)=>{let w=0;const P=d.length;let V=a.length-1,H=P-1;for(;w<=V&&w<=H;){const q=a[w],X=d[w]=R?qe(d[w]):xe(d[w]);if(lt(q,X))O(q,X,g,null,v,C,L,A,R);else break;w++}for(;w<=V&&w<=H;){const q=a[V],X=d[H]=R?qe(d[H]):xe(d[H]);if(lt(q,X))O(q,X,g,null,v,C,L,A,R);else break;V--,H--}if(w>V){if(w<=H){const q=H+1,X=qH)for(;w<=V;)Me(a[w],v,C,!0),w++;else{const q=w,X=w,te=new Map;for(w=X;w<=H;w++){const be=d[w]=R?qe(d[w]):xe(d[w]);be.key!=null&&te.set(be.key,w)}let Q,ce=0;const Re=H-X+1;let pt=!1,Xr=0;const Rt=new Array(Re);for(w=0;w=Re){Me(be,v,C,!0);continue}let Ie;if(be.key!=null)Ie=te.get(be.key);else for(Q=X;Q<=H;Q++)if(Rt[Q-X]===0&<(be,d[Q])){Ie=Q;break}Ie===void 0?Me(be,v,C,!0):(Rt[Ie-X]=w+1,Ie>=Xr?Xr=Ie:pt=!0,O(be,d[Ie],g,null,v,C,L,A,R),ce++)}const Yr=pt?pc(Rt):yt;for(Q=Yr.length-1,w=Re-1;w>=0;w--){const be=X+w,Ie=d[be],zr=be+1{const{el:C,type:L,transition:A,children:R,shapeFlag:w}=a;if(w&6){nt(a.component.subTree,d,g,E);return}if(w&128){a.suspense.move(d,g,E);return}if(w&64){L.move(a,d,g,ht);return}if(L===_e){r(C,d,g);for(let V=0;VA.enter(C),v);else{const{leave:V,delayLeave:H,afterLeave:q}=A,X=()=>r(C,d,g),te=()=>{V(C,()=>{X(),q&&q()})};H?H(C,X,te):te()}else r(C,d,g)},Me=(a,d,g,E=!1,v=!1)=>{const{type:C,props:L,ref:A,children:R,dynamicChildren:w,shapeFlag:P,patchFlag:V,dirs:H,cacheIndex:q}=a;if(V===-2&&(v=!1),A!=null&&En(A,null,g,a,!0),q!=null&&(d.renderCache[q]=void 0),P&256){d.ctx.deactivate(a);return}const X=P&1&&H,te=!Et(a);let Q;if(te&&(Q=L&&L.onVnodeBeforeUnmount)&&Se(Q,d,a),P&6)Ii(a.component,g,E);else{if(P&128){a.suspense.unmount(g,E);return}X&&Pe(a,null,d,"beforeUnmount"),P&64?a.type.remove(a,d,g,ht,E):w&&!w.hasOnce&&(C!==_e||V>0&&V&64)?At(w,d,g,!1,!0):(C===_e&&V&384||!v&&P&16)&&At(R,d,g),E&&qr(a)}(te&&(Q=L&&L.onVnodeUnmounted)||X)&&ye(()=>{Q&&Se(Q,d,a),X&&Pe(a,null,d,"unmounted")},g)},qr=a=>{const{type:d,el:g,anchor:E,transition:v}=a;if(d===_e){Mi(g,E);return}if(d===Ft){y(a);return}const C=()=>{s(g),v&&!v.persisted&&v.afterLeave&&v.afterLeave()};if(a.shapeFlag&1&&v&&!v.persisted){const{leave:L,delayLeave:A}=v,R=()=>L(g,C);A?A(a.el,C,R):R()}else C()},Mi=(a,d)=>{let g;for(;a!==d;)g=m(a),s(a),a=g;s(d)},Ii=(a,d,g)=>{const{bum:E,scope:v,update:C,subTree:L,um:A,m:R,a:w}=a;vs(R),vs(w),E&&dn(E),v.stop(),C&&(C.active=!1,Me(L,a,d,g)),A&&ye(A,d),ye(()=>{a.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&a.asyncDep&&!a.asyncResolved&&a.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},At=(a,d,g,E=!1,v=!1,C=0)=>{for(let L=C;L{if(a.shapeFlag&6)return zt(a.component.subTree);if(a.shapeFlag&128)return a.suspense.next();const d=m(a.anchor||a.el),g=d&&d[Go];return g?m(g):d};let Dn=!1;const Gr=(a,d,g)=>{a==null?d._vnode&&Me(d._vnode,null,null,!0):O(d._vnode||null,a,d,null,null,null,g),Dn||(Dn=!0,os(),_n(),Dn=!1),d._vnode=a},ht={p:O,um:Me,m:nt,r:qr,mt:ee,mc:$,pc:j,pbc:_,n:zt,o:e};let Un,Bn;return t&&([Un,Bn]=t(ht)),{render:Gr,hydrate:Un,createApp:Ql(Gr,Un)}}function Gn({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function rt({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function zo(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Dr(e,t,n=!1){const r=e.children,s=t.children;if(B(r)&&B(s))for(let o=0;o>1,e[n[l]]0&&(t[r]=n[o-1]),n[o]=r)}}for(o=n.length,i=n[o-1];o-- >0;)n[o]=i,i=t[i];return n}function Jo(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Jo(t)}function vs(e){if(e)for(let t=0;tCt(gc);function Ur(e,t){return $n(e,null,t)}function vu(e,t){return $n(e,null,{flush:"post"})}const ln={};function Fe(e,t,n){return $n(e,t,n)}function $n(e,t,{immediate:n,deep:r,flush:s,once:o,onTrack:i,onTrigger:l}=ne){if(t&&o){const T=t;t=(...F)=>{T(...F),I()}}const c=ae,u=T=>r===!0?T:Ge(T,r===!1?1:void 0);let f,h=!1,m=!1;if(de(e)?(f=()=>e.value,h=St(e)):bt(e)?(f=()=>u(e),h=!0):B(e)?(m=!0,h=e.some(T=>bt(T)||St(T)),f=()=>e.map(T=>{if(de(T))return T.value;if(bt(T))return u(T);if(K(T))return Ye(T,c,2)})):K(e)?t?f=()=>Ye(e,c,2):f=()=>(b&&b(),Ae(e,c,3,[S])):f=Te,t&&r){const T=f;f=()=>Ge(T())}let b,S=T=>{b=p.onStop=()=>{Ye(T,c,4),b=p.onStop=void 0}},O;if(Xt)if(S=Te,t?n&&Ae(t,c,3,[f(),m?[]:void 0,S]):f(),s==="sync"){const T=mc();O=T.__watcherHandles||(T.__watcherHandles=[])}else return Te;let k=m?new Array(e.length).fill(ln):ln;const W=()=>{if(!(!p.active||!p.dirty))if(t){const T=p.run();(r||h||(m?T.some((F,$)=>ze(F,k[$])):ze(T,k)))&&(b&&b(),Ae(t,c,3,[T,k===ln?void 0:m&&k[0]===ln?[]:k,S]),k=T)}else p.run()};W.allowRecurse=!!t;let D;s==="sync"?D=W:s==="post"?D=()=>ye(W,c&&c.suspense):(W.pre=!0,c&&(W.id=c.uid),D=()=>In(W));const p=new Ar(f,Te,D),y=oo(),I=()=>{p.stop(),y&&Cr(y.effects,p)};return t?n?W():k=p.run():s==="post"?ye(p.run.bind(p),c&&c.suspense):p.run(),O&&O.push(I),I}function yc(e,t,n){const r=this.proxy,s=ie(e)?e.includes(".")?Qo(r,e):()=>r[e]:e.bind(r,r);let o;K(t)?o=t:(o=t.handler,n=t);const i=Gt(this),l=$n(s,o.bind(r),n);return i(),l}function Qo(e,t){const n=t.split(".");return()=>{let r=e;for(let s=0;s{Ge(r,t,n)});else if(Zs(e)){for(const r in e)Ge(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&Ge(e[r],t,n)}return e}const _c=(e,t)=>t==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Oe(t)}Modifiers`]||e[`${Ze(t)}Modifiers`];function vc(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||ne;let s=n;const o=t.startsWith("update:"),i=o&&_c(r,t.slice(7));i&&(i.trim&&(s=n.map(f=>ie(f)?f.trim():f)),i.number&&(s=n.map(cr)));let l,c=r[l=fn(t)]||r[l=fn(Oe(t))];!c&&o&&(c=r[l=fn(Ze(t))]),c&&Ae(c,e,6,s);const u=r[l+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Ae(u,e,6,s)}}function Zo(e,t,n=!1){const r=t.emitsCache,s=r.get(e);if(s!==void 0)return s;const o=e.emits;let i={},l=!1;if(!K(e)){const c=u=>{const f=Zo(u,t,!0);f&&(l=!0,fe(i,f))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!o&&!l?(Z(e)&&r.set(e,null),null):(B(o)?o.forEach(c=>i[c]=null):fe(i,o),Z(e)&&r.set(e,i),i)}function Hn(e,t){return!e||!Kt(t)?!1:(t=t.slice(2).replace(/Once$/,""),z(e,t[0].toLowerCase()+t.slice(1))||z(e,Ze(t))||z(e,t))}function Xn(e){const{type:t,vnode:n,proxy:r,withProxy:s,propsOptions:[o],slots:i,attrs:l,emit:c,render:u,renderCache:f,props:h,data:m,setupState:b,ctx:S,inheritAttrs:O}=e,k=vn(e);let W,D;try{if(n.shapeFlag&4){const y=s||r,I=y;W=xe(u.call(I,y,f,h,b,m,S)),D=l}else{const y=t;W=xe(y.length>1?y(h,{attrs:l,slots:i,emit:c}):y(h,null)),D=t.props?l:bc(l)}}catch(y){$t.length=0,Wt(y,e,1),W=le(me)}let p=W;if(D&&O!==!1){const y=Object.keys(D),{shapeFlag:I}=p;y.length&&I&7&&(o&&y.some(Er)&&(D=wc(D,o)),p=Je(p,D,!1,!0))}return n.dirs&&(p=Je(p,null,!1,!0),p.dirs=p.dirs?p.dirs.concat(n.dirs):n.dirs),n.transition&&(p.transition=n.transition),W=p,vn(k),W}const bc=e=>{let t;for(const n in e)(n==="class"||n==="style"||Kt(n))&&((t||(t={}))[n]=e[n]);return t},wc=(e,t)=>{const n={};for(const r in e)(!Er(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function Ec(e,t,n){const{props:r,children:s,component:o}=e,{props:i,children:l,patchFlag:c}=t,u=o.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?bs(r,i,u):!!i;if(c&8){const f=t.dynamicProps;for(let h=0;he.__isSuspense;function ei(e,t){t&&t.pendingBranch?B(e)?t.effects.push(...e):t.effects.push(e):Rl(e)}const _e=Symbol.for("v-fgt"),ut=Symbol.for("v-txt"),me=Symbol.for("v-cmt"),Ft=Symbol.for("v-stc"),$t=[];let Ee=null;function ti(e=!1){$t.push(Ee=e?null:[])}function xc(){$t.pop(),Ee=$t[$t.length-1]||null}let Ut=1;function ws(e){Ut+=e,e<0&&Ee&&(Ee.hasOnce=!0)}function ni(e){return e.dynamicChildren=Ut>0?Ee||yt:null,xc(),Ut>0&&Ee&&Ee.push(e),e}function bu(e,t,n,r,s,o){return ni(oi(e,t,n,r,s,o,!0))}function ri(e,t,n,r,s){return ni(le(e,t,n,r,s,!0))}function Cn(e){return e?e.__v_isVNode===!0:!1}function lt(e,t){return e.type===t.type&&e.key===t.key}const si=({key:e})=>e??null,pn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?ie(e)||de(e)||K(e)?{i:ue,r:e,k:t,f:!!n}:e:null);function oi(e,t=null,n=null,r=0,s=null,o=e===_e?0:1,i=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&si(t),ref:t&&pn(t),scopeId:Pn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:ue};return l?(Br(c,n),o&128&&e.normalize(c)):n&&(c.shapeFlag|=ie(n)?8:16),Ut>0&&!i&&Ee&&(c.patchFlag>0||o&6)&&c.patchFlag!==32&&Ee.push(c),c}const le=Tc;function Tc(e,t=null,n=null,r=0,s=null,o=!1){if((!e||e===Po)&&(e=me),Cn(e)){const l=Je(e,t,!0);return n&&Br(l,n),Ut>0&&!o&&Ee&&(l.shapeFlag&6?Ee[Ee.indexOf(e)]=l:Ee.push(l)),l.patchFlag=-2,l}if($c(e)&&(e=e.__vccOpts),t){t=Ac(t);let{class:l,style:c}=t;l&&!ie(l)&&(t.class=Tr(l)),Z(c)&&(_o(c)&&!B(c)&&(c=fe({},c)),t.style=xr(c))}const i=ie(e)?1:Sc(e)?128:ic(e)?64:Z(e)?4:K(e)?2:0;return oi(e,t,n,r,s,i,o,!0)}function Ac(e){return e?_o(e)||Do(e)?fe({},e):e:null}function Je(e,t,n=!1,r=!1){const{props:s,ref:o,patchFlag:i,children:l,transition:c}=e,u=t?Rc(s||{},t):s,f={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&si(u),ref:t&&t.ref?n&&o?B(o)?o.concat(pn(t)):[o,pn(t)]:pn(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==_e?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Je(e.ssContent),ssFallback:e.ssFallback&&Je(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&r&&bn(f,c.clone(f)),f}function ii(e=" ",t=0){return le(ut,null,e,t)}function wu(e,t){const n=le(Ft,null,e);return n.staticCount=t,n}function Eu(e="",t=!1){return t?(ti(),ri(me,null,e)):le(me,null,e)}function xe(e){return e==null||typeof e=="boolean"?le(me):B(e)?le(_e,null,e.slice()):typeof e=="object"?qe(e):le(ut,null,String(e))}function qe(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Je(e)}function Br(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(B(t))n=16;else if(typeof t=="object")if(r&65){const s=t.default;s&&(s._c&&(s._d=!1),Br(e,s()),s._c&&(s._d=!0));return}else{n=32;const s=t._;!s&&!Do(t)?t._ctx=ue:s===3&&ue&&(ue.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else K(t)?(t={default:t,_ctx:ue},n=32):(t=String(t),r&64?(n=16,t=[ii(t)]):n=8);e.children=t,e.shapeFlag|=n}function Rc(...e){const t={};for(let n=0;nae||ue;let Sn,vr;{const e=to(),t=(n,r)=>{let s;return(s=e[n])||(s=e[n]=[]),s.push(r),o=>{s.length>1?s.forEach(i=>i(o)):s[0](o)}};Sn=t("__VUE_INSTANCE_SETTERS__",n=>ae=n),vr=t("__VUE_SSR_SETTERS__",n=>Xt=n)}const Gt=e=>{const t=ae;return Sn(e),e.scope.on(),()=>{e.scope.off(),Sn(t)}},Es=()=>{ae&&ae.scope.off(),Sn(null)};function li(e){return e.vnode.shapeFlag&4}let Xt=!1;function Ic(e,t=!1,n=!1){t&&vr(t);const{props:r,children:s}=e.vnode,o=li(e);ec(e,r,o,t),sc(e,s,n);const i=o?Pc(e,t):void 0;return t&&vr(!1),i}function Pc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Kl);const{setup:r}=n;if(r){const s=e.setupContext=r.length>1?ai(e):null,o=Gt(e);et();const i=Ye(r,e,0,[e.props,s]);if(tt(),o(),Js(i)){if(i.then(Es,Es),t)return i.then(l=>{Cs(e,l,t)}).catch(l=>{Wt(l,e,0)});e.asyncDep=i}else Cs(e,i,t)}else ci(e,t)}function Cs(e,t,n){K(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Z(t)&&(e.setupState=Eo(t)),ci(e,n)}let Ss;function ci(e,t,n){const r=e.type;if(!e.render){if(!t&&Ss&&!r.render){const s=r.template||jr(e).template;if(s){const{isCustomElement:o,compilerOptions:i}=e.appContext.config,{delimiters:l,compilerOptions:c}=r,u=fe(fe({isCustomElement:o,delimiters:l},i),c);r.render=Ss(s,u)}}e.render=r.render||Te}{const s=Gt(e);et();try{ql(e)}finally{tt(),s()}}}const Nc={get(e,t){return ve(e,"get",""),e[t]}};function ai(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Nc),slots:e.slots,emit:e.emit,expose:t}}function Vn(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Eo(hn(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in It)return It[n](e)},has(t,n){return n in t||n in It}})):e.proxy}function Fc(e,t=!0){return K(e)?e.displayName||e.name:e.name||t&&e.__name}function $c(e){return K(e)&&"__vccOpts"in e}const se=(e,t)=>ml(e,t,Xt);function br(e,t,n){const r=arguments.length;return r===2?Z(t)&&!B(t)?Cn(t)?le(e,null,[t]):le(e,t):le(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&Cn(n)&&(n=[n]),le(e,t,n))}const Hc="3.4.34";/** -* @vue/runtime-dom v3.4.34 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/const jc="http://www.w3.org/2000/svg",Vc="http://www.w3.org/1998/Math/MathML",je=typeof document<"u"?document:null,xs=je&&je.createElement("template"),Dc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const s=t==="svg"?je.createElementNS(jc,e):t==="mathml"?je.createElementNS(Vc,e):n?je.createElement(e,{is:n}):je.createElement(e);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>je.createTextNode(e),createComment:e=>je.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>je.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,s,o){const i=n?n.previousSibling:t.lastChild;if(s&&(s===o||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===o||!(s=s.nextSibling)););else{xs.innerHTML=r==="svg"?`${e}`:r==="mathml"?`${e}`:e;const l=xs.content;if(r==="svg"||r==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Be="transition",Ot="animation",Bt=Symbol("_vtc"),ui=(e,{slots:t})=>br(Pl,Uc(e),t);ui.displayName="Transition";const fi={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};ui.props=fe({},To,fi);const st=(e,t=[])=>{B(e)?e.forEach(n=>n(...t)):e&&e(...t)},Ts=e=>e?B(e)?e.some(t=>t.length>1):e.length>1:!1;function Uc(e){const t={};for(const x in e)x in fi||(t[x]=e[x]);if(e.css===!1)return t;const{name:n="v",type:r,duration:s,enterFromClass:o=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=o,appearActiveClass:u=i,appearToClass:f=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:m=`${n}-leave-active`,leaveToClass:b=`${n}-leave-to`}=e,S=Bc(s),O=S&&S[0],k=S&&S[1],{onBeforeEnter:W,onEnter:D,onEnterCancelled:p,onLeave:y,onLeaveCancelled:I,onBeforeAppear:T=W,onAppear:F=D,onAppearCancelled:$=p}=t,M=(x,G,ee)=>{ot(x,G?f:l),ot(x,G?u:i),ee&&ee()},_=(x,G)=>{x._isLeaving=!1,ot(x,h),ot(x,b),ot(x,m),G&&G()},N=x=>(G,ee)=>{const re=x?F:D,U=()=>M(G,x,ee);st(re,[G,U]),As(()=>{ot(G,x?c:o),ke(G,x?f:l),Ts(re)||Rs(G,r,O,U)})};return fe(t,{onBeforeEnter(x){st(W,[x]),ke(x,o),ke(x,i)},onBeforeAppear(x){st(T,[x]),ke(x,c),ke(x,u)},onEnter:N(!1),onAppear:N(!0),onLeave(x,G){x._isLeaving=!0;const ee=()=>_(x,G);ke(x,h),ke(x,m),Wc(),As(()=>{x._isLeaving&&(ot(x,h),ke(x,b),Ts(y)||Rs(x,r,k,ee))}),st(y,[x,ee])},onEnterCancelled(x){M(x,!1),st(p,[x])},onAppearCancelled(x){M(x,!0),st($,[x])},onLeaveCancelled(x){_(x),st(I,[x])}})}function Bc(e){if(e==null)return null;if(Z(e))return[Yn(e.enter),Yn(e.leave)];{const t=Yn(e);return[t,t]}}function Yn(e){return ji(e)}function ke(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Bt]||(e[Bt]=new Set)).add(t)}function ot(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[Bt];n&&(n.delete(t),n.size||(e[Bt]=void 0))}function As(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let kc=0;function Rs(e,t,n,r){const s=e._endId=++kc,o=()=>{s===e._endId&&r()};if(n)return setTimeout(o,n);const{type:i,timeout:l,propCount:c}=Kc(e,t);if(!i)return r();const u=i+"end";let f=0;const h=()=>{e.removeEventListener(u,m),o()},m=b=>{b.target===e&&++f>=c&&h()};setTimeout(()=>{f(n[S]||"").split(", "),s=r(`${Be}Delay`),o=r(`${Be}Duration`),i=Os(s,o),l=r(`${Ot}Delay`),c=r(`${Ot}Duration`),u=Os(l,c);let f=null,h=0,m=0;t===Be?i>0&&(f=Be,h=i,m=o.length):t===Ot?u>0&&(f=Ot,h=u,m=c.length):(h=Math.max(i,u),f=h>0?i>u?Be:Ot:null,m=f?f===Be?o.length:c.length:0);const b=f===Be&&/\b(transform|all)(,|$)/.test(r(`${Be}Property`).toString());return{type:f,timeout:h,propCount:m,hasTransform:b}}function Os(e,t){for(;e.lengthLs(n)+Ls(e[r])))}function Ls(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Wc(){return document.body.offsetHeight}function qc(e,t,n){const r=e[Bt];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Ms=Symbol("_vod"),Gc=Symbol("_vsh"),Xc=Symbol(""),Yc=/(^|;)\s*display\s*:/;function zc(e,t,n){const r=e.style,s=ie(n);let o=!1;if(n&&!s){if(t)if(ie(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&gn(r,l,"")}else for(const i in t)n[i]==null&&gn(r,i,"");for(const i in n)i==="display"&&(o=!0),gn(r,i,n[i])}else if(s){if(t!==n){const i=r[Xc];i&&(n+=";"+i),r.cssText=n,o=Yc.test(n)}}else t&&e.removeAttribute("style");Ms in e&&(e[Ms]=o?r.display:"",e[Gc]&&(r.display="none"))}const Is=/\s*!important$/;function gn(e,t,n){if(B(n))n.forEach(r=>gn(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Jc(e,t);Is.test(n)?e.setProperty(Ze(r),n.replace(Is,""),"important"):e[r]=n}}const Ps=["Webkit","Moz","ms"],zn={};function Jc(e,t){const n=zn[t];if(n)return n;let r=Oe(t);if(r!=="filter"&&r in e)return zn[t]=r;r=An(r);for(let s=0;sJn||(na.then(()=>Jn=0),Jn=Date.now());function sa(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;Ae(oa(r,n.value),t,5,[r])};return n.value=e,n.attached=ra(),n}function oa(e,t){if(B(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>s=>!s._stopped&&r&&r(s))}else return t}const js=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,ia=(e,t,n,r,s,o)=>{const i=s==="svg";t==="class"?qc(e,r,i):t==="style"?zc(e,n,r):Kt(t)?Er(t)||ea(e,t,n,r,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):la(e,t,r,i))?(Qc(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Fs(e,t,r,i,o,t!=="value")):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Fs(e,t,r,i))};function la(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&js(t)&&K(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const s=e.tagName;if(s==="IMG"||s==="VIDEO"||s==="CANVAS"||s==="SOURCE")return!1}return js(t)&&ie(n)?!1:t in e}const Vs=e=>{const t=e.props["onUpdate:modelValue"]||!1;return B(t)?n=>dn(t,n):t};function ca(e){e.target.composing=!0}function Ds(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Qn=Symbol("_assign"),Cu={created(e,{modifiers:{lazy:t,trim:n,number:r}},s){e[Qn]=Vs(s);const o=r||s.props&&s.props.type==="number";mt(e,t?"change":"input",i=>{if(i.target.composing)return;let l=e.value;n&&(l=l.trim()),o&&(l=cr(l)),e[Qn](l)}),n&&mt(e,"change",()=>{e.value=e.value.trim()}),t||(mt(e,"compositionstart",ca),mt(e,"compositionend",Ds),mt(e,"change",Ds))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:s,number:o}},i){if(e[Qn]=Vs(i),e.composing)return;const l=(o||e.type==="number")&&!/^0\d/.test(e.value)?cr(e.value):e.value,c=t??"";l!==c&&(document.activeElement===e&&e.type!=="range"&&(r&&t===n||s&&e.value.trim()===c)||(e.value=c))}},aa=["ctrl","shift","alt","meta"],ua={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>aa.some(n=>e[`${n}Key`]&&!t.includes(n))},Su=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(s,...o)=>{for(let i=0;i{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=s=>{if(!("key"in s))return;const o=Ze(s.key);if(t.some(i=>i===o||fa[i]===o))return e(s)})},di=fe({patchProp:ia},Dc);let Ht,Us=!1;function da(){return Ht||(Ht=dc(di))}function ha(){return Ht=Us?Ht:hc(di),Us=!0,Ht}const Tu=(...e)=>{const t=da().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=pi(r);if(!s)return;const o=t._component;!K(o)&&!o.render&&!o.template&&(o.template=s.innerHTML),s.innerHTML="";const i=n(s,!1,hi(s));return s instanceof Element&&(s.removeAttribute("v-cloak"),s.setAttribute("data-v-app","")),i},t},Au=(...e)=>{const t=ha().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=pi(r);if(s)return n(s,!0,hi(s))},t};function hi(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function pi(e){return ie(e)?document.querySelector(e):e}const Ru=(e,t)=>{const n=e.__vccOpts||e;for(const[r,s]of t)n[r]=s;return n},pa="modulepreload",ga=function(e){return"/dev/"+e},Bs={},Ou=function(t,n,r){let s=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),i=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));s=Promise.all(n.map(l=>{if(l=ga(l),l in Bs)return;Bs[l]=!0;const c=l.endsWith(".css"),u=c?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${l}"]${u}`))return;const f=document.createElement("link");if(f.rel=c?"stylesheet":pa,c||(f.as="script",f.crossOrigin=""),f.href=l,i&&f.setAttribute("nonce",i),document.head.appendChild(f),c)return new Promise((h,m)=>{f.addEventListener("load",h),f.addEventListener("error",()=>m(new Error(`Unable to preload CSS for ${l}`)))})}))}return s.then(()=>t()).catch(o=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=o,window.dispatchEvent(i),!i.defaultPrevented)throw o})},ma=window.__VP_SITE_DATA__;function kr(e){return oo()?(Xi(e),!0):!1}function $e(e){return typeof e=="function"?e():wo(e)}const gi=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const ya=Object.prototype.toString,_a=e=>ya.call(e)==="[object Object]",kt=()=>{},ks=va();function va(){var e,t;return gi&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window==null?void 0:window.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function ba(e,t){function n(...r){return new Promise((s,o)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(s).catch(o)})}return n}const mi=e=>e();function wa(e,t={}){let n,r,s=kt;const o=l=>{clearTimeout(l),s(),s=kt};return l=>{const c=$e(e),u=$e(t.maxWait);return n&&o(n),c<=0||u!==void 0&&u<=0?(r&&(o(r),r=null),Promise.resolve(l())):new Promise((f,h)=>{s=t.rejectOnCancel?h:f,u&&!r&&(r=setTimeout(()=>{n&&o(n),r=null,f(l())},u)),n=setTimeout(()=>{r&&o(r),r=null,f(l())},c)})}}function Ea(e=mi){const t=oe(!0);function n(){t.value=!1}function r(){t.value=!0}const s=(...o)=>{t.value&&e(...o)};return{isActive:Ln(t),pause:n,resume:r,eventFilter:s}}function Ca(e){return jn()}function yi(...e){if(e.length!==1)return Cl(...e);const t=e[0];return typeof t=="function"?Ln(bl(()=>({get:t,set:kt}))):oe(t)}function _i(e,t,n={}){const{eventFilter:r=mi,...s}=n;return Fe(e,ba(r,t),s)}function Sa(e,t,n={}){const{eventFilter:r,...s}=n,{eventFilter:o,pause:i,resume:l,isActive:c}=Ea(r);return{stop:_i(e,t,{...s,eventFilter:o}),pause:i,resume:l,isActive:c}}function Kr(e,t=!0,n){Ca()?Tt(e,n):t?e():Mn(e)}function Lu(e,t,n={}){const{debounce:r=0,maxWait:s=void 0,...o}=n;return _i(e,t,{...o,eventFilter:wa(r,{maxWait:s})})}function Mu(e,t,n){let r;de(n)?r={evaluating:n}:r={};const{lazy:s=!1,evaluating:o=void 0,shallow:i=!0,onError:l=kt}=r,c=oe(!s),u=i?Fr(t):oe(t);let f=0;return Ur(async h=>{if(!c.value)return;f++;const m=f;let b=!1;o&&Promise.resolve().then(()=>{o.value=!0});try{const S=await e(O=>{h(()=>{o&&(o.value=!1),b||O()})});m===f&&(u.value=S)}catch(S){l(S)}finally{o&&m===f&&(o.value=!1),b=!0}}),s?se(()=>(c.value=!0,u.value)):u}function vi(e){var t;const n=$e(e);return(t=n==null?void 0:n.$el)!=null?t:n}const Le=gi?window:void 0;function xt(...e){let t,n,r,s;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,s]=e,t=Le):[t,n,r,s]=e,!t)return kt;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const o=[],i=()=>{o.forEach(f=>f()),o.length=0},l=(f,h,m,b)=>(f.addEventListener(h,m,b),()=>f.removeEventListener(h,m,b)),c=Fe(()=>[vi(t),$e(s)],([f,h])=>{if(i(),!f)return;const m=_a(h)?{...h}:h;o.push(...n.flatMap(b=>r.map(S=>l(f,b,S,m))))},{immediate:!0,flush:"post"}),u=()=>{c(),i()};return kr(u),u}function xa(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function Iu(...e){let t,n,r={};e.length===3?(t=e[0],n=e[1],r=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],r=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:s=Le,eventName:o="keydown",passive:i=!1,dedupe:l=!1}=r,c=xa(t);return xt(s,o,f=>{f.repeat&&$e(l)||c(f)&&n(f)},i)}function Ta(){const e=oe(!1),t=jn();return t&&Tt(()=>{e.value=!0},t),e}function Aa(e){const t=Ta();return se(()=>(t.value,!!e()))}function bi(e,t={}){const{window:n=Le}=t,r=Aa(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let s;const o=oe(!1),i=u=>{o.value=u.matches},l=()=>{s&&("removeEventListener"in s?s.removeEventListener("change",i):s.removeListener(i))},c=Ur(()=>{r.value&&(l(),s=n.matchMedia($e(e)),"addEventListener"in s?s.addEventListener("change",i):s.addListener(i),o.value=s.matches)});return kr(()=>{c(),l(),s=void 0}),o}const cn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},an="__vueuse_ssr_handlers__",Ra=Oa();function Oa(){return an in cn||(cn[an]=cn[an]||{}),cn[an]}function wi(e,t){return Ra[e]||t}function La(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const Ma={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},Ks="vueuse-storage";function Wr(e,t,n,r={}){var s;const{flush:o="pre",deep:i=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:u=!1,shallow:f,window:h=Le,eventFilter:m,onError:b=_=>{console.error(_)},initOnMounted:S}=r,O=(f?Fr:oe)(typeof t=="function"?t():t);if(!n)try{n=wi("getDefaultStorage",()=>{var _;return(_=Le)==null?void 0:_.localStorage})()}catch(_){b(_)}if(!n)return O;const k=$e(t),W=La(k),D=(s=r.serializer)!=null?s:Ma[W],{pause:p,resume:y}=Sa(O,()=>T(O.value),{flush:o,deep:i,eventFilter:m});h&&l&&Kr(()=>{xt(h,"storage",$),xt(h,Ks,M),S&&$()}),S||$();function I(_,N){h&&h.dispatchEvent(new CustomEvent(Ks,{detail:{key:e,oldValue:_,newValue:N,storageArea:n}}))}function T(_){try{const N=n.getItem(e);if(_==null)I(N,null),n.removeItem(e);else{const x=D.write(_);N!==x&&(n.setItem(e,x),I(N,x))}}catch(N){b(N)}}function F(_){const N=_?_.newValue:n.getItem(e);if(N==null)return c&&k!=null&&n.setItem(e,D.write(k)),k;if(!_&&u){const x=D.read(N);return typeof u=="function"?u(x,k):W==="object"&&!Array.isArray(x)?{...k,...x}:x}else return typeof N!="string"?N:D.read(N)}function $(_){if(!(_&&_.storageArea!==n)){if(_&&_.key==null){O.value=k;return}if(!(_&&_.key!==e)){p();try{(_==null?void 0:_.newValue)!==D.write(O.value)&&(O.value=F(_))}catch(N){b(N)}finally{_?Mn(y):y()}}}}function M(_){$(_.detail)}return O}function Ei(e){return bi("(prefers-color-scheme: dark)",e)}function Ia(e={}){const{selector:t="html",attribute:n="class",initialValue:r="auto",window:s=Le,storage:o,storageKey:i="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:u,disableTransition:f=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},m=Ei({window:s}),b=se(()=>m.value?"dark":"light"),S=c||(i==null?yi(r):Wr(i,r,o,{window:s,listenToStorageChanges:l})),O=se(()=>S.value==="auto"?b.value:S.value),k=wi("updateHTMLAttrs",(y,I,T)=>{const F=typeof y=="string"?s==null?void 0:s.document.querySelector(y):vi(y);if(!F)return;let $;if(f&&($=s.document.createElement("style"),$.appendChild(document.createTextNode("*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}")),s.document.head.appendChild($)),I==="class"){const M=T.split(/\s/g);Object.values(h).flatMap(_=>(_||"").split(/\s/g)).filter(Boolean).forEach(_=>{M.includes(_)?F.classList.add(_):F.classList.remove(_)})}else F.setAttribute(I,T);f&&(s.getComputedStyle($).opacity,document.head.removeChild($))});function W(y){var I;k(t,n,(I=h[y])!=null?I:y)}function D(y){e.onChanged?e.onChanged(y,W):W(y)}Fe(O,D,{flush:"post",immediate:!0}),Kr(()=>D(O.value));const p=se({get(){return u?S.value:O.value},set(y){S.value=y}});try{return Object.assign(p,{store:S,system:b,state:O})}catch{return p}}function Pa(e={}){const{valueDark:t="dark",valueLight:n="",window:r=Le}=e,s=Ia({...e,onChanged:(l,c)=>{var u;e.onChanged?(u=e.onChanged)==null||u.call(e,l==="dark",c,l):c(l)},modes:{dark:t,light:n}}),o=se(()=>s.system?s.system.value:Ei({window:r}).value?"dark":"light");return se({get(){return s.value==="dark"},set(l){const c=l?"dark":"light";o.value===c?s.value="auto":s.value=c}})}function Zn(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}function Pu(e,t,n={}){const{window:r=Le}=n;return Wr(e,t,r==null?void 0:r.localStorage,n)}function Ci(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const er=new WeakMap;function Nu(e,t=!1){const n=oe(t);let r=null,s="";Fe(yi(e),l=>{const c=Zn($e(l));if(c){const u=c;if(er.get(u)||er.set(u,u.style.overflow),u.style.overflow!=="hidden"&&(s=u.style.overflow),u.style.overflow==="hidden")return n.value=!0;if(n.value)return u.style.overflow="hidden"}},{immediate:!0});const o=()=>{const l=Zn($e(e));!l||n.value||(ks&&(r=xt(l,"touchmove",c=>{Na(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},i=()=>{const l=Zn($e(e));!l||!n.value||(ks&&(r==null||r()),l.style.overflow=s,er.delete(l),n.value=!1)};return kr(i),se({get(){return n.value},set(l){l?o():i()}})}function Fu(e,t,n={}){const{window:r=Le}=n;return Wr(e,t,r==null?void 0:r.sessionStorage,n)}function $u(e={}){const{window:t=Le,behavior:n="auto"}=e;if(!t)return{x:oe(0),y:oe(0)};const r=oe(t.scrollX),s=oe(t.scrollY),o=se({get(){return r.value},set(l){scrollTo({left:l,behavior:n})}}),i=se({get(){return s.value},set(l){scrollTo({top:l,behavior:n})}});return xt(t,"scroll",()=>{r.value=t.scrollX,s.value=t.scrollY},{capture:!1,passive:!0}),{x:o,y:i}}function Hu(e={}){const{window:t=Le,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:r=Number.POSITIVE_INFINITY,listenOrientation:s=!0,includeScrollbar:o=!0}=e,i=oe(n),l=oe(r),c=()=>{t&&(o?(i.value=t.innerWidth,l.value=t.innerHeight):(i.value=t.document.documentElement.clientWidth,l.value=t.document.documentElement.clientHeight))};if(c(),Kr(c),xt("resize",c,{passive:!0}),s){const u=bi("(orientation: portrait)");Fe(u,()=>c())}return{width:i,height:l}}var tr={BASE_URL:"/dev/",DEV:!1,MODE:"production",PROD:!0,SSR:!1},nr={};const Si=/^(?:[a-z]+:|\/\/)/i,Fa="vitepress-theme-appearance",$a=/#.*$/,Ha=/[?#].*$/,ja=/(?:(^|\/)index)?\.(?:md|html)$/,he=typeof document<"u",xi={relativePath:"404.md",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function Va(e,t,n=!1){if(t===void 0)return!1;if(e=Ws(`/${e}`),n)return new RegExp(t).test(e);if(Ws(t)!==e)return!1;const r=t.match($a);return r?(he?location.hash:"")===r[0]:!0}function Ws(e){return decodeURI(e).replace(Ha,"").replace(ja,"$1")}function Da(e){return Si.test(e)}function Ua(e,t){return Object.keys((e==null?void 0:e.locales)||{}).find(n=>n!=="root"&&!Da(n)&&Va(t,`/${n}/`,!0))||"root"}function Ba(e,t){var r,s,o,i,l,c,u;const n=Ua(e,t);return Object.assign({},e,{localeIndex:n,lang:((r=e.locales[n])==null?void 0:r.lang)??e.lang,dir:((s=e.locales[n])==null?void 0:s.dir)??e.dir,title:((o=e.locales[n])==null?void 0:o.title)??e.title,titleTemplate:((i=e.locales[n])==null?void 0:i.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:Ai(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(u=e.locales[n])==null?void 0:u.themeConfig}})}function Ti(e,t){const n=t.title||e.title,r=t.titleTemplate??e.titleTemplate;if(typeof r=="string"&&r.includes(":title"))return r.replace(/:title/g,n);const s=ka(e.title,r);return n===s.slice(3)?n:`${n}${s}`}function ka(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Ka(e,t){const[n,r]=t;if(n!=="meta")return!1;const s=Object.entries(r)[0];return s==null?!1:e.some(([o,i])=>o===n&&i[s[0]]===s[1])}function Ai(e,t){return[...e.filter(n=>!Ka(t,n)),...t]}const Wa=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,qa=/^[a-z]:/i;function qs(e){const t=qa.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Wa,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const rr=new Set;function Ga(e){if(rr.size===0){const n=typeof process=="object"&&(nr==null?void 0:nr.VITE_EXTRA_EXTENSIONS)||(tr==null?void 0:tr.VITE_EXTRA_EXTENSIONS)||"";("3g2,3gp,aac,ai,apng,au,avif,bin,bmp,cer,class,conf,crl,css,csv,dll,doc,eps,epub,exe,gif,gz,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,m4a,man,mid,midi,mjs,mov,mp2,mp3,mp4,mpe,mpeg,mpg,mpp,oga,ogg,ogv,ogx,opus,otf,p10,p7c,p7m,p7s,pdf,png,ps,qt,roff,rtf,rtx,ser,svg,t,tif,tiff,tr,ts,tsv,ttf,txt,vtt,wav,weba,webm,webp,woff,woff2,xhtml,xml,yaml,yml,zip"+(n&&typeof n=="string"?","+n:"")).split(",").forEach(r=>rr.add(r))}const t=e.split(".").pop();return t==null||!rr.has(t.toLowerCase())}function ju(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}const Xa=Symbol(),ft=Fr(ma);function Vu(e){const t=se(()=>Ba(ft.value,e.data.relativePath)),n=t.value.appearance,r=n==="force-dark"?oe(!0):n?Pa({storageKey:Fa,initialValue:()=>n==="dark"?"dark":"auto",...typeof n=="object"?n:{}}):oe(!1),s=oe(he?location.hash:"");return he&&window.addEventListener("hashchange",()=>{s.value=location.hash}),Fe(()=>e.data,()=>{s.value=he?location.hash:""}),{site:t,theme:se(()=>t.value.themeConfig),page:se(()=>e.data),frontmatter:se(()=>e.data.frontmatter),params:se(()=>e.data.params),lang:se(()=>t.value.lang),dir:se(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:se(()=>t.value.localeIndex||"root"),title:se(()=>Ti(t.value,e.data)),description:se(()=>e.data.description||t.value.description),isDark:r,hash:se(()=>s.value)}}function Ya(){const e=Ct(Xa);if(!e)throw new Error("vitepress data not properly injected in app");return e}function za(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function Gs(e){return Si.test(e)||!e.startsWith("/")?e:za(ft.value.base,e)}function Ja(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),he){const n="/dev/";t=qs(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let r=__VP_HASH_MAP__[t.toLowerCase()];if(r||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",r=__VP_HASH_MAP__[t.toLowerCase()]),!r)return null;t=`${n}assets/${t}.${r}.js`}else t=`./${qs(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let mn=[];function Du(e){mn.push(e),Fn(()=>{mn=mn.filter(t=>t!==e)})}function Qa(){let e=ft.value.scrollOffset,t=0,n=24;if(typeof e=="object"&&"padding"in e&&(n=e.padding,e=e.selector),typeof e=="number")t=e;else if(typeof e=="string")t=Xs(e,n);else if(Array.isArray(e))for(const r of e){const s=Xs(r,n);if(s){t=s;break}}return t}function Xs(e,t){const n=document.querySelector(e);if(!n)return 0;const r=n.getBoundingClientRect().bottom;return r<0?0:r+t}const Za=Symbol(),Ri="http://a.com",eu=()=>({path:"/",component:null,data:xi});function Uu(e,t){const n=On(eu()),r={route:n,go:s};async function s(l=he?location.href:"/"){var c,u;l=sr(l),await((c=r.onBeforeRouteChange)==null?void 0:c.call(r,l))!==!1&&(he&&l!==sr(location.href)&&(history.replaceState({scrollPosition:window.scrollY},""),history.pushState({},"",l)),await i(l),await((u=r.onAfterRouteChanged)==null?void 0:u.call(r,l)))}let o=null;async function i(l,c=0,u=!1){var m;if(await((m=r.onBeforePageLoad)==null?void 0:m.call(r,l))===!1)return;const f=new URL(l,Ri),h=o=f.pathname;try{let b=await e(h);if(!b)throw new Error(`Page not found: ${h}`);if(o===h){o=null;const{default:S,__pageData:O}=b;if(!S)throw new Error(`Invalid route component: ${S}`);n.path=he?h:Gs(h),n.component=hn(S),n.data=hn(O),he&&Mn(()=>{let k=ft.value.base+O.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!ft.value.cleanUrls&&!k.endsWith("/")&&(k+=".html"),k!==f.pathname&&(f.pathname=k,l=k+f.search+f.hash,history.replaceState({},"",l)),f.hash&&!c){let W=null;try{W=document.getElementById(decodeURIComponent(f.hash).slice(1))}catch(D){console.warn(D)}if(W){Ys(W,f.hash);return}}window.scrollTo(0,c)})}}catch(b){if(!/fetch|Page not found/.test(b.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(b),!u)try{const S=await fetch(ft.value.base+"hashmap.json");window.__VP_HASH_MAP__=await S.json(),await i(l,c,!0);return}catch{}if(o===h){o=null,n.path=he?h:Gs(h),n.component=t?hn(t):null;const S=he?h.replace(/(^|\/)$/,"$1index").replace(/(\.html)?$/,".md").replace(/^\//,""):"404.md";n.data={...xi,relativePath:S}}}}return he&&(history.state===null&&history.replaceState({},""),window.addEventListener("click",l=>{if(l.defaultPrevented||!(l.target instanceof Element)||l.target.closest("button")||l.button!==0||l.ctrlKey||l.shiftKey||l.altKey||l.metaKey)return;const c=l.target.closest("a");if(!c||c.closest(".vp-raw")||c.hasAttribute("download")||c.hasAttribute("target"))return;const u=c.getAttribute("href")??(c instanceof SVGAElement?c.getAttribute("xlink:href"):null);if(u==null)return;const{href:f,origin:h,pathname:m,hash:b,search:S}=new URL(u,c.baseURI),O=new URL(location.href);h===O.origin&&Ga(m)&&(l.preventDefault(),m===O.pathname&&S===O.search?(b!==O.hash&&(history.pushState({},"",f),window.dispatchEvent(new HashChangeEvent("hashchange",{oldURL:O.href,newURL:f}))),b?Ys(c,b,c.classList.contains("header-anchor")):window.scrollTo(0,0)):s(f))},{capture:!0}),window.addEventListener("popstate",async l=>{var c;l.state!==null&&(await i(sr(location.href),l.state&&l.state.scrollPosition||0),(c=r.onAfterRouteChanged)==null||c.call(r,location.href))}),window.addEventListener("hashchange",l=>{l.preventDefault()})),r}function tu(){const e=Ct(Za);if(!e)throw new Error("useRouter() is called without provider.");return e}function Oi(){return tu().route}function Ys(e,t,n=!1){let r=null;try{r=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(s){console.warn(s)}if(r){let s=function(){!n||Math.abs(i-window.scrollY)>window.innerHeight?window.scrollTo(0,i):window.scrollTo({left:0,top:i,behavior:"smooth"})};const o=parseInt(window.getComputedStyle(r).paddingTop,10),i=window.scrollY+r.getBoundingClientRect().top-Qa()+o;requestAnimationFrame(s)}}function sr(e){const t=new URL(e,Ri);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),ft.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const or=()=>mn.forEach(e=>e()),Bu=Hr({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=Oi(),{site:n}=Ya();return()=>br(e.as,n.value.contentProps??{style:{position:"relative"}},[t.component?br(t.component,{onVnodeMounted:or,onVnodeUpdated:or,onVnodeUnmounted:or}):"404 Page Not Found"])}}),ku=Hr({setup(e,{slots:t}){const n=oe(!1);return Tt(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function Ku(){he&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const r=(n=t.parentElement)==null?void 0:n.parentElement;if(!r)return;const s=Array.from(r.querySelectorAll("input")).indexOf(t);if(s<0)return;const o=r.querySelector(".blocks");if(!o)return;const i=Array.from(o.children).find(u=>u.classList.contains("active"));if(!i)return;const l=o.children[s];if(!l||i===l)return;i.classList.remove("active"),l.classList.add("active");const c=r==null?void 0:r.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function Wu(){if(he){const e=new WeakMap;window.addEventListener("click",t=>{var r;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const s=n.parentElement,o=(r=n.nextElementSibling)==null?void 0:r.nextElementSibling;if(!s||!o)return;const i=/language-(shellscript|shell|bash|sh|zsh)/.test(s.className),l=[".vp-copy-ignore",".diff.remove"],c=o.cloneNode(!0);c.querySelectorAll(l.join(",")).forEach(f=>f.remove());let u=c.textContent||"";i&&(u=u.replace(/^ *(\$|>) /gm,"").trim()),nu(u).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const f=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,f)})}})}}async function nu(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const r=document.getSelection(),s=r?r.rangeCount>0&&r.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),s&&(r.removeAllRanges(),r.addRange(s)),n&&n.focus()}}function qu(e,t){let n=!0,r=[];const s=o=>{if(n){n=!1,o.forEach(l=>{const c=ir(l);for(const u of document.head.children)if(u.isEqualNode(c)){r.push(u);return}});return}const i=o.map(ir);r.forEach((l,c)=>{const u=i.findIndex(f=>f==null?void 0:f.isEqualNode(l??null));u!==-1?delete i[u]:(l==null||l.remove(),delete r[c])}),i.forEach(l=>l&&document.head.appendChild(l)),r=[...r,...i].filter(Boolean)};Ur(()=>{const o=e.data,i=t.value,l=o&&o.description,c=o&&o.frontmatter.head||[],u=Ti(i,o);u!==document.title&&(document.title=u);const f=l||i.description;let h=document.querySelector("meta[name=description]");h?h.getAttribute("content")!==f&&h.setAttribute("content",f):ir(["meta",{name:"description",content:f}]),s(Ai(i.head,su(c)))})}function ir([e,t,n]){const r=document.createElement(e);for(const s in t)r.setAttribute(s,t[s]);return n&&(r.innerHTML=n),e==="script"&&!t.async&&(r.async=!1),r}function ru(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function su(e){return e.filter(t=>!ru(t))}const lr=new Set,Li=()=>document.createElement("link"),ou=e=>{const t=Li();t.rel="prefetch",t.href=e,document.head.appendChild(t)},iu=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let un;const lu=he&&(un=Li())&&un.relList&&un.relList.supports&&un.relList.supports("prefetch")?ou:iu;function Gu(){if(!he||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const r=()=>{n&&n.disconnect(),n=new IntersectionObserver(o=>{o.forEach(i=>{if(i.isIntersecting){const l=i.target;n.unobserve(l);const{pathname:c}=l;if(!lr.has(c)){lr.add(c);const u=Ja(c);u&&lu(u)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(o=>{const{hostname:i,pathname:l}=new URL(o.href instanceof SVGAnimatedString?o.href.animVal:o.href,o.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||o.target!=="_blank"&&i===location.hostname&&(l!==location.pathname?n.observe(o):lr.add(l))})})};Tt(r);const s=Oi();Fe(()=>s.path,r),Fn(()=>{n&&n.disconnect()})}export{xu as $,vu as A,Vl as B,Qa as C,du as D,pu as E,_e as F,Fr as G,Du as H,le as I,hu as J,Si as K,Oi as L,Rc as M,Ct as N,Hu as O,xr as P,Iu as Q,Mn as R,$u as S,ui as T,he as U,Ln as V,fu as W,Ou as X,Nu as Y,Zl as Z,Ru as _,ii as a,mu as a0,Mo as a1,Su as a2,yu as a3,On as a4,Cl as a5,br as a6,wu as a7,qu as a8,Za as a9,Vu as aa,Xa as ab,Bu as ac,ku as ad,ft as ae,Au as af,Uu as ag,Ja as ah,Gu as ai,Wu as aj,Ku as ak,vi as al,kr as am,Mu as an,Fu as ao,Pu as ap,Lu as aq,tu as ar,xt as as,uu as at,Cu as au,de as av,_u as aw,hn as ax,Tu as ay,ju as az,ri as b,bu as c,Hr as d,Eu as e,Ga as f,Gs as g,se as h,Da as i,oi as j,wo as k,au as l,Va as m,Tr as n,ti as o,cu as p,bi as q,gu as r,oe as s,Wi as t,Ya as u,Fe as v,Ll as w,Ur as x,Tt as y,Fn as z}; diff --git a/dev/assets/chunks/framework.CJakPlgM.js b/dev/assets/chunks/framework.CJakPlgM.js new file mode 100644 index 0000000..d1417f6 --- /dev/null +++ b/dev/assets/chunks/framework.CJakPlgM.js @@ -0,0 +1,18 @@ +/** +* @vue/shared v3.5.10 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**//*! #__NO_SIDE_EFFECTS__ */function Hs(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const Z={},Ct=[],Ue=()=>{},Jo=()=>!1,Zt=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),$s=e=>e.startsWith("onUpdate:"),fe=Object.assign,Ds=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Qo=Object.prototype.hasOwnProperty,J=(e,t)=>Qo.call(e,t),K=Array.isArray,At=e=>Fn(e)==="[object Map]",ui=e=>Fn(e)==="[object Set]",q=e=>typeof e=="function",re=e=>typeof e=="string",st=e=>typeof e=="symbol",ne=e=>e!==null&&typeof e=="object",di=e=>(ne(e)||q(e))&&q(e.then)&&q(e.catch),hi=Object.prototype.toString,Fn=e=>hi.call(e),Zo=e=>Fn(e).slice(8,-1),pi=e=>Fn(e)==="[object Object]",js=e=>re(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Rt=Hs(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Hn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},el=/-(\w)/g,Ie=Hn(e=>e.replace(el,(t,n)=>n?n.toUpperCase():"")),tl=/\B([A-Z])/g,rt=Hn(e=>e.replace(tl,"-$1").toLowerCase()),$n=Hn(e=>e.charAt(0).toUpperCase()+e.slice(1)),wn=Hn(e=>e?`on${$n(e)}`:""),tt=(e,t)=>!Object.is(e,t),Sn=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},ws=e=>{const t=parseFloat(e);return isNaN(t)?e:t},nl=e=>{const t=re(e)?Number(e):NaN;return isNaN(t)?e:t};let hr;const mi=()=>hr||(hr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Vs(e){if(K(e)){const t={};for(let n=0;n{if(n){const s=n.split(rl);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function Us(e){let t="";if(re(e))t=e;else if(K(e))for(let n=0;n!!(e&&e.__v_isRef===!0),al=e=>re(e)?e:e==null?"":K(e)||ne(e)&&(e.toString===hi||!q(e.toString))?vi(e)?al(e.value):JSON.stringify(e,bi,2):String(e),bi=(e,t)=>vi(t)?bi(e,t.value):At(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],i)=>(n[Zn(s,i)+" =>"]=r,n),{})}:ui(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Zn(n))}:st(t)?Zn(t):ne(t)&&!K(t)&&!pi(t)?String(t):t,Zn=(e,t="")=>{var n;return st(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.5.10 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let _e;class fl{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=_e,!t&&_e&&(this.index=(_e.scopes||(_e.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0)return;let e;for(;xt;){let t=xt,n;for(;t;)t.flags&1||(t.flags&=-9),t=t.next;for(t=xt,xt=void 0;t;){if(n=t.next,t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function xi(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Ti(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),Ws(s),dl(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function Ss(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Ci(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Ci(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Wt))return;e.globalVersion=Wt;const t=e.dep;if(e.flags|=2,t.version>0&&!e.isSSR&&e.deps&&!Ss(e)){e.flags&=-3;return}const n=te,s=Ne;te=e,Ne=!0;try{xi(e);const r=e.fn(e._value);(t.version===0||tt(r,e._value))&&(e._value=r,t.version++)}catch(r){throw t.version++,r}finally{te=n,Ne=s,Ti(e),e.flags&=-3}}function Ws(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s),!n.subs&&n.computed){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)Ws(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function dl(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let Ne=!0;const Ai=[];function it(){Ai.push(Ne),Ne=!1}function ot(){const e=Ai.pop();Ne=e===void 0?!0:e}function pr(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=te;te=void 0;try{t()}finally{te=n}}}let Wt=0;class hl{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Dn{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.target=void 0,this.map=void 0,this.key=void 0,this.sc=0}track(t){if(!te||!Ne||te===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==te)n=this.activeLink=new hl(te,this),te.deps?(n.prevDep=te.depsTail,te.depsTail.nextDep=n,te.depsTail=n):te.deps=te.depsTail=n,Ri(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=te.depsTail,n.nextDep=void 0,te.depsTail.nextDep=n,te.depsTail=n,te.deps===n&&(te.deps=s)}return n}trigger(t){this.version++,Wt++,this.notify(t)}notify(t){Bs();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{ks()}}}function Ri(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)Ri(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const Rn=new WeakMap,ht=Symbol(""),Es=Symbol(""),Kt=Symbol("");function ve(e,t,n){if(Ne&&te){let s=Rn.get(e);s||Rn.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new Dn),r.target=e,r.map=s,r.key=n),r.track()}}function Ge(e,t,n,s,r,i){const o=Rn.get(e);if(!o){Wt++;return}const l=c=>{c&&c.trigger()};if(Bs(),t==="clear")o.forEach(l);else{const c=K(e),f=c&&js(n);if(c&&n==="length"){const a=Number(s);o.forEach((h,g)=>{(g==="length"||g===Kt||!st(g)&&g>=a)&&l(h)})}else switch(n!==void 0&&l(o.get(n)),f&&l(o.get(Kt)),t){case"add":c?f&&l(o.get("length")):(l(o.get(ht)),At(e)&&l(o.get(Es)));break;case"delete":c||(l(o.get(ht)),At(e)&&l(o.get(Es)));break;case"set":At(e)&&l(o.get(ht));break}}ks()}function pl(e,t){const n=Rn.get(e);return n&&n.get(t)}function _t(e){const t=z(e);return t===e?t:(ve(t,"iterate",Kt),Pe(e)?t:t.map(me))}function jn(e){return ve(e=z(e),"iterate",Kt),e}const gl={__proto__:null,[Symbol.iterator](){return ts(this,Symbol.iterator,me)},concat(...e){return _t(this).concat(...e.map(t=>K(t)?_t(t):t))},entries(){return ts(this,"entries",e=>(e[1]=me(e[1]),e))},every(e,t){return We(this,"every",e,t,void 0,arguments)},filter(e,t){return We(this,"filter",e,t,n=>n.map(me),arguments)},find(e,t){return We(this,"find",e,t,me,arguments)},findIndex(e,t){return We(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return We(this,"findLast",e,t,me,arguments)},findLastIndex(e,t){return We(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return We(this,"forEach",e,t,void 0,arguments)},includes(...e){return ns(this,"includes",e)},indexOf(...e){return ns(this,"indexOf",e)},join(e){return _t(this).join(e)},lastIndexOf(...e){return ns(this,"lastIndexOf",e)},map(e,t){return We(this,"map",e,t,void 0,arguments)},pop(){return Ht(this,"pop")},push(...e){return Ht(this,"push",e)},reduce(e,...t){return gr(this,"reduce",e,t)},reduceRight(e,...t){return gr(this,"reduceRight",e,t)},shift(){return Ht(this,"shift")},some(e,t){return We(this,"some",e,t,void 0,arguments)},splice(...e){return Ht(this,"splice",e)},toReversed(){return _t(this).toReversed()},toSorted(e){return _t(this).toSorted(e)},toSpliced(...e){return _t(this).toSpliced(...e)},unshift(...e){return Ht(this,"unshift",e)},values(){return ts(this,"values",me)}};function ts(e,t,n){const s=jn(e),r=s[t]();return s!==e&&!Pe(e)&&(r._next=r.next,r.next=()=>{const i=r._next();return i.value&&(i.value=n(i.value)),i}),r}const ml=Array.prototype;function We(e,t,n,s,r,i){const o=jn(e),l=o!==e&&!Pe(e),c=o[t];if(c!==ml[t]){const h=c.apply(e,i);return l?me(h):h}let f=n;o!==e&&(l?f=function(h,g){return n.call(this,me(h),g,e)}:n.length>2&&(f=function(h,g){return n.call(this,h,g,e)}));const a=c.call(o,f,s);return l&&r?r(a):a}function gr(e,t,n,s){const r=jn(e);let i=n;return r!==e&&(Pe(e)?n.length>3&&(i=function(o,l,c){return n.call(this,o,l,c,e)}):i=function(o,l,c){return n.call(this,o,me(l),c,e)}),r[t](i,...s)}function ns(e,t,n){const s=z(e);ve(s,"iterate",Kt);const r=s[t](...n);return(r===-1||r===!1)&&Ys(n[0])?(n[0]=z(n[0]),s[t](...n)):r}function Ht(e,t,n=[]){it(),Bs();const s=z(e)[t].apply(e,n);return ks(),ot(),s}const yl=Hs("__proto__,__v_isRef,__isVue"),Oi=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(st));function vl(e){st(e)||(e=String(e));const t=z(this);return ve(t,"has",e),t.hasOwnProperty(e)}class Mi{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){const r=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(r?i?Pl:Ni:i?Li:Ii).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const o=K(t);if(!r){let c;if(o&&(c=gl[n]))return c;if(n==="hasOwnProperty")return vl}const l=Reflect.get(t,n,ae(t)?t:s);return(st(n)?Oi.has(n):yl(n))||(r||ve(t,"get",n),i)?l:ae(l)?o&&js(n)?l:l.value:ne(l)?r?Bn(l):Un(l):l}}class Pi extends Mi{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];if(!this._isShallow){const c=vt(i);if(!Pe(s)&&!vt(s)&&(i=z(i),s=z(s)),!K(t)&&ae(i)&&!ae(s))return c?!1:(i.value=s,!0)}const o=K(t)&&js(n)?Number(n)e,Vn=e=>Reflect.getPrototypeOf(e);function cn(e,t,n=!1,s=!1){e=e.__v_raw;const r=z(e),i=z(t);n||(tt(t,i)&&ve(r,"get",t),ve(r,"get",i));const{has:o}=Vn(r),l=s?Ks:n?Xs:me;if(o.call(r,t))return l(e.get(t));if(o.call(r,i))return l(e.get(i));e!==r&&e.get(t)}function an(e,t=!1){const n=this.__v_raw,s=z(n),r=z(e);return t||(tt(e,r)&&ve(s,"has",e),ve(s,"has",r)),e===r?n.has(e):n.has(e)||n.has(r)}function fn(e,t=!1){return e=e.__v_raw,!t&&ve(z(e),"iterate",ht),Reflect.get(e,"size",e)}function mr(e,t=!1){!t&&!Pe(e)&&!vt(e)&&(e=z(e));const n=z(this);return Vn(n).has.call(n,e)||(n.add(e),Ge(n,"add",e,e)),this}function yr(e,t,n=!1){!n&&!Pe(t)&&!vt(t)&&(t=z(t));const s=z(this),{has:r,get:i}=Vn(s);let o=r.call(s,e);o||(e=z(e),o=r.call(s,e));const l=i.call(s,e);return s.set(e,t),o?tt(t,l)&&Ge(s,"set",e,t):Ge(s,"add",e,t),this}function vr(e){const t=z(this),{has:n,get:s}=Vn(t);let r=n.call(t,e);r||(e=z(e),r=n.call(t,e)),s&&s.call(t,e);const i=t.delete(e);return r&&Ge(t,"delete",e,void 0),i}function br(){const e=z(this),t=e.size!==0,n=e.clear();return t&&Ge(e,"clear",void 0,void 0),n}function un(e,t){return function(s,r){const i=this,o=i.__v_raw,l=z(o),c=t?Ks:e?Xs:me;return!e&&ve(l,"iterate",ht),o.forEach((f,a)=>s.call(r,c(f),c(a),i))}}function dn(e,t,n){return function(...s){const r=this.__v_raw,i=z(r),o=At(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,f=r[e](...s),a=n?Ks:t?Xs:me;return!t&&ve(i,"iterate",c?Es:ht),{next(){const{value:h,done:g}=f.next();return g?{value:h,done:g}:{value:l?[a(h[0]),a(h[1])]:a(h),done:g}},[Symbol.iterator](){return this}}}}function Xe(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function El(){const e={get(i){return cn(this,i)},get size(){return fn(this)},has:an,add:mr,set:yr,delete:vr,clear:br,forEach:un(!1,!1)},t={get(i){return cn(this,i,!1,!0)},get size(){return fn(this)},has:an,add(i){return mr.call(this,i,!0)},set(i,o){return yr.call(this,i,o,!0)},delete:vr,clear:br,forEach:un(!1,!0)},n={get(i){return cn(this,i,!0)},get size(){return fn(this,!0)},has(i){return an.call(this,i,!0)},add:Xe("add"),set:Xe("set"),delete:Xe("delete"),clear:Xe("clear"),forEach:un(!0,!1)},s={get(i){return cn(this,i,!0,!0)},get size(){return fn(this,!0)},has(i){return an.call(this,i,!0)},add:Xe("add"),set:Xe("set"),delete:Xe("delete"),clear:Xe("clear"),forEach:un(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=dn(i,!1,!1),n[i]=dn(i,!0,!1),t[i]=dn(i,!1,!0),s[i]=dn(i,!0,!0)}),[e,n,t,s]}const[xl,Tl,Cl,Al]=El();function qs(e,t){const n=t?e?Al:Cl:e?Tl:xl;return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(J(n,r)&&r in s?n:s,r,i)}const Rl={get:qs(!1,!1)},Ol={get:qs(!1,!0)},Ml={get:qs(!0,!1)};const Ii=new WeakMap,Li=new WeakMap,Ni=new WeakMap,Pl=new WeakMap;function Il(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Ll(e){return e.__v_skip||!Object.isExtensible(e)?0:Il(Zo(e))}function Un(e){return vt(e)?e:Gs(e,!1,_l,Rl,Ii)}function Nl(e){return Gs(e,!1,Sl,Ol,Li)}function Bn(e){return Gs(e,!0,wl,Ml,Ni)}function Gs(e,t,n,s,r){if(!ne(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=r.get(e);if(i)return i;const o=Ll(e);if(o===0)return e;const l=new Proxy(e,o===2?s:n);return r.set(e,l),l}function pt(e){return vt(e)?pt(e.__v_raw):!!(e&&e.__v_isReactive)}function vt(e){return!!(e&&e.__v_isReadonly)}function Pe(e){return!!(e&&e.__v_isShallow)}function Ys(e){return e?!!e.__v_raw:!1}function z(e){const t=e&&e.__v_raw;return t?z(t):e}function En(e){return!J(e,"__v_skip")&&Object.isExtensible(e)&&gi(e,"__v_skip",!0),e}const me=e=>ne(e)?Un(e):e,Xs=e=>ne(e)?Bn(e):e;function ae(e){return e?e.__v_isRef===!0:!1}function oe(e){return Fi(e,!1)}function zs(e){return Fi(e,!0)}function Fi(e,t){return ae(e)?e:new Fl(e,t)}class Fl{constructor(t,n){this.dep=new Dn,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:z(t),this._value=n?t:me(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||Pe(t)||vt(t);t=s?t:z(t),tt(t,n)&&(this._rawValue=t,this._value=s?t:me(t),this.dep.trigger())}}function Hi(e){return ae(e)?e.value:e}const Hl={get:(e,t,n)=>t==="__v_raw"?e:Hi(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return ae(r)&&!ae(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function $i(e){return pt(e)?e:new Proxy(e,Hl)}class $l{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new Dn,{get:s,set:r}=t(n.track.bind(n),n.trigger.bind(n));this._get=s,this._set=r}get value(){return this._value=this._get()}set value(t){this._set(t)}}function Dl(e){return new $l(e)}class jl{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,this.__v_isRef=!0,this._value=void 0}get value(){const t=this._object[this._key];return this._value=t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return pl(z(this._object),this._key)}}class Vl{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function Ul(e,t,n){return ae(e)?e:q(e)?new Vl(e):ne(e)&&arguments.length>1?Bl(e,t,n):oe(e)}function Bl(e,t,n){const s=e[t];return ae(s)?s:new jl(e,t,n)}class kl{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Dn(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Wt-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&te!==this)return Ei(this),!0}get value(){const t=this.dep.track();return Ci(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Wl(e,t,n=!1){let s,r;return q(e)?s=e:(s=e.get,r=e.set),new kl(s,r,n)}const hn={},On=new WeakMap;let ut;function Kl(e,t=!1,n=ut){if(n){let s=On.get(n);s||On.set(n,s=[]),s.push(e)}}function ql(e,t,n=Z){const{immediate:s,deep:r,once:i,scheduler:o,augmentJob:l,call:c}=n,f=m=>r?m:Pe(m)||r===!1||r===0?qe(m,1):qe(m);let a,h,g,v,_=!1,S=!1;if(ae(e)?(h=()=>e.value,_=Pe(e)):pt(e)?(h=()=>f(e),_=!0):K(e)?(S=!0,_=e.some(m=>pt(m)||Pe(m)),h=()=>e.map(m=>{if(ae(m))return m.value;if(pt(m))return f(m);if(q(m))return c?c(m,2):m()})):q(e)?t?h=c?()=>c(e,2):e:h=()=>{if(g){it();try{g()}finally{ot()}}const m=ut;ut=a;try{return c?c(e,3,[v]):e(v)}finally{ut=m}}:h=Ue,t&&r){const m=h,M=r===!0?1/0:r;h=()=>qe(m(),M)}const U=_i(),N=()=>{a.stop(),U&&Ds(U.effects,a)};if(i&&t){const m=t;t=(...M)=>{m(...M),N()}}let B=S?new Array(e.length).fill(hn):hn;const p=m=>{if(!(!(a.flags&1)||!a.dirty&&!m))if(t){const M=a.run();if(r||_||(S?M.some((F,$)=>tt(F,B[$])):tt(M,B))){g&&g();const F=ut;ut=a;try{const $=[M,B===hn?void 0:S&&B[0]===hn?[]:B,v];c?c(t,3,$):t(...$),B=M}finally{ut=F}}}else a.run()};return l&&l(p),a=new wi(h),a.scheduler=o?()=>o(p,!1):p,v=m=>Kl(m,!1,a),g=a.onStop=()=>{const m=On.get(a);if(m){if(c)c(m,4);else for(const M of m)M();On.delete(a)}},t?s?p(!0):B=a.run():o?o(p.bind(null,!0),!0):a.run(),N.pause=a.pause.bind(a),N.resume=a.resume.bind(a),N.stop=N,N}function qe(e,t=1/0,n){if(t<=0||!ne(e)||e.__v_skip||(n=n||new Set,n.has(e)))return e;if(n.add(e),t--,ae(e))qe(e.value,t,n);else if(K(e))for(let s=0;s{qe(s,t,n)});else if(pi(e)){for(const s in e)qe(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&qe(e[s],t,n)}return e}/** +* @vue/runtime-core v3.5.10 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function en(e,t,n,s){try{return s?e(...s):e()}catch(r){tn(r,t,n)}}function Fe(e,t,n,s){if(q(e)){const r=en(e,t,n,s);return r&&di(r)&&r.catch(i=>{tn(i,t,n)}),r}if(K(e)){const r=[];for(let i=0;i>>1,r=we[s],i=Gt(r);i=Gt(n)?we.push(e):we.splice(Yl(t),0,e),e.flags|=1,ji()}}function ji(){!qt&&!xs&&(xs=!0,Js=Di.then(Vi))}function Xl(e){K(e)?Ot.push(...e):Qe&&e.id===-1?Qe.splice(St+1,0,e):e.flags&1||(Ot.push(e),e.flags|=1),ji()}function _r(e,t,n=qt?je+1:0){for(;nGt(n)-Gt(s));if(Ot.length=0,Qe){Qe.push(...t);return}for(Qe=t,St=0;Ste.id==null?e.flags&2?-1:1/0:e.id;function Vi(e){xs=!1,qt=!0;try{for(je=0;je{s._d&&Nr(-1);const i=Pn(t);let o;try{o=e(...r)}finally{Pn(i),s._d&&Nr(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function If(e,t){if(de===null)return e;const n=Xn(de),s=e.dirs||(e.dirs=[]);for(let r=0;re.__isTeleport,jt=e=>e&&(e.disabled||e.disabled===""),Jl=e=>e&&(e.defer||e.defer===""),wr=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Sr=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Ts=(e,t)=>{const n=e&&e.to;return re(n)?t?t(n):null:n},Ql={name:"Teleport",__isTeleport:!0,process(e,t,n,s,r,i,o,l,c,f){const{mc:a,pc:h,pbc:g,o:{insert:v,querySelector:_,createText:S,createComment:U}}=f,N=jt(t.props);let{shapeFlag:B,children:p,dynamicChildren:m}=t;if(e==null){const M=t.el=S(""),F=t.anchor=S("");v(M,n,s),v(F,n,s);const $=(R,b)=>{B&16&&(r&&r.isCE&&(r.ce._teleportTarget=R),a(p,R,b,r,i,o,l,c))},j=()=>{const R=t.target=Ts(t.props,_),b=Wi(R,t,S,v);R&&(o!=="svg"&&wr(R)?o="svg":o!=="mathml"&&Sr(R)&&(o="mathml"),N||($(R,b),xn(t)))};N&&($(n,F),xn(t)),Jl(t.props)?Ee(j,i):j()}else{t.el=e.el,t.targetStart=e.targetStart;const M=t.anchor=e.anchor,F=t.target=e.target,$=t.targetAnchor=e.targetAnchor,j=jt(e.props),R=j?n:F,b=j?M:$;if(o==="svg"||wr(F)?o="svg":(o==="mathml"||Sr(F))&&(o="mathml"),m?(g(e.dynamicChildren,m,R,r,i,o,l),sr(e,t,!0)):c||h(e,t,R,b,r,i,o,l,!1),N)j?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):pn(t,n,M,f,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const L=t.target=Ts(t.props,_);L&&pn(t,L,null,f,0)}else j&&pn(t,F,$,f,1);xn(t)}},remove(e,t,n,{um:s,o:{remove:r}},i){const{shapeFlag:o,children:l,anchor:c,targetStart:f,targetAnchor:a,target:h,props:g}=e;if(h&&(r(f),r(a)),i&&r(c),o&16){const v=i||!jt(g);for(let _=0;_{e.isMounted=!0}),Ji(()=>{e.isUnmounting=!0}),e}const Re=[Function,Array],Ki={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Re,onEnter:Re,onAfterEnter:Re,onEnterCancelled:Re,onBeforeLeave:Re,onLeave:Re,onAfterLeave:Re,onLeaveCancelled:Re,onBeforeAppear:Re,onAppear:Re,onAfterAppear:Re,onAppearCancelled:Re},qi=e=>{const t=e.subTree;return t.component?qi(t.component):t},tc={name:"BaseTransition",props:Ki,setup(e,{slots:t}){const n=Yn(),s=ec();return()=>{const r=t.default&&Xi(t.default(),!0);if(!r||!r.length)return;const i=Gi(r),o=z(e),{mode:l}=o;if(s.isLeaving)return ss(i);const c=Er(i);if(!c)return ss(i);let f=Cs(c,o,s,n,g=>f=g);c.type!==ye&&Yt(c,f);const a=n.subTree,h=a&&Er(a);if(h&&h.type!==ye&&!dt(c,h)&&qi(n).type!==ye){const g=Cs(h,o,s,n);if(Yt(h,g),l==="out-in"&&c.type!==ye)return s.isLeaving=!0,g.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete g.afterLeave},ss(i);l==="in-out"&&c.type!==ye&&(g.delayLeave=(v,_,S)=>{const U=Yi(s,h);U[String(h.key)]=h,v[Ze]=()=>{_(),v[Ze]=void 0,delete f.delayedLeave},f.delayedLeave=S})}return i}}};function Gi(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==ye){t=n;break}}return t}const nc=tc;function Yi(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Cs(e,t,n,s,r){const{appear:i,mode:o,persisted:l=!1,onBeforeEnter:c,onEnter:f,onAfterEnter:a,onEnterCancelled:h,onBeforeLeave:g,onLeave:v,onAfterLeave:_,onLeaveCancelled:S,onBeforeAppear:U,onAppear:N,onAfterAppear:B,onAppearCancelled:p}=t,m=String(e.key),M=Yi(n,e),F=(R,b)=>{R&&Fe(R,s,9,b)},$=(R,b)=>{const L=b[1];F(R,b),K(R)?R.every(x=>x.length<=1)&&L():R.length<=1&&L()},j={mode:o,persisted:l,beforeEnter(R){let b=c;if(!n.isMounted)if(i)b=U||c;else return;R[Ze]&&R[Ze](!0);const L=M[m];L&&dt(e,L)&&L.el[Ze]&&L.el[Ze](),F(b,[R])},enter(R){let b=f,L=a,x=h;if(!n.isMounted)if(i)b=N||f,L=B||a,x=p||h;else return;let W=!1;const se=R[gn]=ce=>{W||(W=!0,ce?F(x,[R]):F(L,[R]),j.delayedLeave&&j.delayedLeave(),R[gn]=void 0)};b?$(b,[R,se]):se()},leave(R,b){const L=String(e.key);if(R[gn]&&R[gn](!0),n.isUnmounting)return b();F(g,[R]);let x=!1;const W=R[Ze]=se=>{x||(x=!0,b(),se?F(S,[R]):F(_,[R]),R[Ze]=void 0,M[L]===e&&delete M[L])};M[L]=e,v?$(v,[R,W]):W()},clone(R){const b=Cs(R,t,n,s,r);return r&&r(b),b}};return j}function ss(e){if(nn(e))return e=nt(e),e.children=null,e}function Er(e){if(!nn(e))return ki(e.type)&&e.children?Gi(e.children):e;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&q(n.default))return n.default()}}function Yt(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Yt(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Xi(e,t=!1,n){let s=[],r=0;for(let i=0;i1)for(let i=0;iIn(_,t&&(K(t)?t[S]:t),n,s,r));return}if(gt(s)&&!r)return;const i=s.shapeFlag&4?Xn(s.component):s.el,o=r?null:i,{i:l,r:c}=e,f=t&&t.r,a=l.refs===Z?l.refs={}:l.refs,h=l.setupState,g=z(h),v=h===Z?()=>!1:_=>J(g,_);if(f!=null&&f!==c&&(re(f)?(a[f]=null,v(f)&&(h[f]=null)):ae(f)&&(f.value=null)),q(c))en(c,l,12,[o,a]);else{const _=re(c),S=ae(c);if(_||S){const U=()=>{if(e.f){const N=_?v(c)?h[c]:a[c]:c.value;r?K(N)&&Ds(N,i):K(N)?N.includes(i)||N.push(i):_?(a[c]=[i],v(c)&&(h[c]=a[c])):(c.value=[i],e.k&&(a[e.k]=c.value))}else _?(a[c]=o,v(c)&&(h[c]=o)):S&&(c.value=o,e.k&&(a[e.k]=o))};o?(U.id=-1,Ee(U,n)):U()}}}let xr=!1;const wt=()=>{xr||(console.error("Hydration completed but contains mismatches."),xr=!0)},sc=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",rc=e=>e.namespaceURI.includes("MathML"),mn=e=>{if(e.nodeType===1){if(sc(e))return"svg";if(rc(e))return"mathml"}},Tt=e=>e.nodeType===8;function ic(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:f}}=e,a=(p,m)=>{if(!m.hasChildNodes()){n(null,p,m),Mn(),m._vnode=p;return}h(m.firstChild,p,null,null,null),Mn(),m._vnode=p},h=(p,m,M,F,$,j=!1)=>{j=j||!!m.dynamicChildren;const R=Tt(p)&&p.data==="[",b=()=>S(p,m,M,F,$,R),{type:L,ref:x,shapeFlag:W,patchFlag:se}=m;let ce=p.nodeType;m.el=p,se===-2&&(j=!1,m.dynamicChildren=null);let V=null;switch(L){case mt:ce!==3?m.children===""?(c(m.el=r(""),o(p),p),V=p):V=b():(p.data!==m.children&&(wt(),p.data=m.children),V=i(p));break;case ye:B(p)?(V=i(p),N(m.el=p.content.firstChild,p,M)):ce!==8||R?V=b():V=i(p);break;case Ut:if(R&&(p=i(p),ce=p.nodeType),ce===1||ce===3){V=p;const Y=!m.children.length;for(let D=0;D{j=j||!!m.dynamicChildren;const{type:R,props:b,patchFlag:L,shapeFlag:x,dirs:W,transition:se}=m,ce=R==="input"||R==="option";if(ce||L!==-1){W&&Ve(m,null,M,"created");let V=!1;if(B(p)){V=go(F,se)&&M&&M.vnode.props&&M.vnode.props.appear;const D=p.content.firstChild;V&&se.beforeEnter(D),N(D,p,M),m.el=p=D}if(x&16&&!(b&&(b.innerHTML||b.textContent))){let D=v(p.firstChild,m,p,M,F,$,j);for(;D;){yn(p,1)||wt();const he=D;D=D.nextSibling,l(he)}}else if(x&8){let D=m.children;D[0]===` +`&&(p.tagName==="PRE"||p.tagName==="TEXTAREA")&&(D=D.slice(1)),p.textContent!==D&&(yn(p,0)||wt(),p.textContent=m.children)}if(b){if(ce||!j||L&48){const D=p.tagName.includes("-");for(const he in b)(ce&&(he.endsWith("value")||he==="indeterminate")||Zt(he)&&!Rt(he)||he[0]==="."||D)&&s(p,he,null,b[he],void 0,M)}else if(b.onClick)s(p,"onClick",null,b.onClick,void 0,M);else if(L&4&&pt(b.style))for(const D in b.style)b.style[D]}let Y;(Y=b&&b.onVnodeBeforeMount)&&Oe(Y,M,m),W&&Ve(m,null,M,"beforeMount"),((Y=b&&b.onVnodeMounted)||W||V)&&_o(()=>{Y&&Oe(Y,M,m),V&&se.enter(p),W&&Ve(m,null,M,"mounted")},F)}return p.nextSibling},v=(p,m,M,F,$,j,R)=>{R=R||!!m.dynamicChildren;const b=m.children,L=b.length;for(let x=0;x{const{slotScopeIds:R}=m;R&&($=$?$.concat(R):R);const b=o(p),L=v(i(p),m,b,M,F,$,j);return L&&Tt(L)&&L.data==="]"?i(m.anchor=L):(wt(),c(m.anchor=f("]"),b,L),L)},S=(p,m,M,F,$,j)=>{if(yn(p.parentElement,1)||wt(),m.el=null,j){const L=U(p);for(;;){const x=i(p);if(x&&x!==L)l(x);else break}}const R=i(p),b=o(p);return l(p),n(null,m,b,R,M,F,mn(b),$),R},U=(p,m="[",M="]")=>{let F=0;for(;p;)if(p=i(p),p&&Tt(p)&&(p.data===m&&F++,p.data===M)){if(F===0)return i(p);F--}return p},N=(p,m,M)=>{const F=m.parentNode;F&&F.replaceChild(p,m);let $=M;for(;$;)$.vnode.el===m&&($.vnode.el=$.subTree.el=p),$=$.parent},B=p=>p.nodeType===1&&p.tagName==="TEMPLATE";return[a,h]}const Tr="data-allow-mismatch",oc={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function yn(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(Tr);)e=e.parentElement;const n=e&&e.getAttribute(Tr);if(n==null)return!1;if(n==="")return!0;{const s=n.split(",");return t===0&&s.includes("children")?!0:n.split(",").includes(oc[t])}}function lc(e,t){if(Tt(e)&&e.data==="["){let n=1,s=e.nextSibling;for(;s;){if(s.nodeType===1){if(t(s)===!1)break}else if(Tt(s))if(s.data==="]"){if(--n===0)break}else s.data==="["&&n++;s=s.nextSibling}}else t(e)}const gt=e=>!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function Nf(e){q(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:s,delay:r=200,hydrate:i,timeout:o,suspensible:l=!0,onError:c}=e;let f=null,a,h=0;const g=()=>(h++,f=null,v()),v=()=>{let _;return f||(_=f=t().catch(S=>{if(S=S instanceof Error?S:new Error(String(S)),c)return new Promise((U,N)=>{c(S,()=>U(g()),()=>N(S),h+1)});throw S}).then(S=>_!==f&&f?f:(S&&(S.__esModule||S[Symbol.toStringTag]==="Module")&&(S=S.default),a=S,S)))};return Zs({name:"AsyncComponentWrapper",__asyncLoader:v,__asyncHydrate(_,S,U){const N=i?()=>{const B=i(U,p=>lc(_,p));B&&(S.bum||(S.bum=[])).push(B)}:U;a?N():v().then(()=>!S.isUnmounted&&N())},get __asyncResolved(){return a},setup(){const _=ue;if(er(_),a)return()=>rs(a,_);const S=p=>{f=null,tn(p,_,13,!s)};if(l&&_.suspense||rn)return v().then(p=>()=>rs(p,_)).catch(p=>(S(p),()=>s?le(s,{error:p}):null));const U=oe(!1),N=oe(),B=oe(!!r);return r&&setTimeout(()=>{B.value=!1},r),o!=null&&setTimeout(()=>{if(!U.value&&!N.value){const p=new Error(`Async component timed out after ${o}ms.`);S(p),N.value=p}},o),v().then(()=>{U.value=!0,_.parent&&nn(_.parent.vnode)&&_.parent.update()}).catch(p=>{S(p),N.value=p}),()=>{if(U.value&&a)return rs(a,_);if(N.value&&s)return le(s,{error:N.value});if(n&&!B.value)return le(n)}}})}function rs(e,t){const{ref:n,props:s,children:r,ce:i}=t.vnode,o=le(e,s,r);return o.ref=n,o.ce=i,delete t.vnode.ce,o}const nn=e=>e.type.__isKeepAlive;function cc(e,t){zi(e,"a",t)}function ac(e,t){zi(e,"da",t)}function zi(e,t,n=ue){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(Wn(t,s,n),n){let r=n.parent;for(;r&&r.parent;)nn(r.parent.vnode)&&fc(s,t,n,r),r=r.parent}}function fc(e,t,n,s){const r=Wn(t,e,s,!0);Kn(()=>{Ds(s[t],r)},n)}function Wn(e,t,n=ue,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{it();const l=sn(n),c=Fe(t,n,e,o);return l(),ot(),c});return s?r.unshift(i):r.push(i),i}}const Ye=e=>(t,n=ue)=>{(!rn||e==="sp")&&Wn(e,(...s)=>t(...s),n)},uc=Ye("bm"),Lt=Ye("m"),dc=Ye("bu"),hc=Ye("u"),Ji=Ye("bum"),Kn=Ye("um"),pc=Ye("sp"),gc=Ye("rtg"),mc=Ye("rtc");function yc(e,t=ue){Wn("ec",e,t)}const Qi="components";function Ff(e,t){return eo(Qi,e,!0,t)||e}const Zi=Symbol.for("v-ndc");function Hf(e){return re(e)?eo(Qi,e,!1)||e:e||Zi}function eo(e,t,n=!0,s=!1){const r=de||ue;if(r){const i=r.type;{const l=na(i,!1);if(l&&(l===t||l===Ie(t)||l===$n(Ie(t))))return i}const o=Cr(r[e]||i[e],t)||Cr(r.appContext[e],t);return!o&&s?i:o}}function Cr(e,t){return e&&(e[t]||e[Ie(t)]||e[$n(Ie(t))])}function $f(e,t,n,s){let r;const i=n,o=K(e);if(o||re(e)){const l=o&&pt(e);let c=!1;l&&(c=!Pe(e),e=jn(e)),r=new Array(e.length);for(let f=0,a=e.length;ft(l,c,void 0,i));else{const l=Object.keys(e);r=new Array(l.length);for(let c=0,f=l.length;czt(t)?!(t.type===ye||t.type===Se&&!to(t.children)):!0)?e:null}function jf(e,t){const n={};for(const s in e)n[/[A-Z]/.test(s)?`on:${s}`:wn(s)]=e[s];return n}const As=e=>e?To(e)?Xn(e):As(e.parent):null,Vt=fe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>As(e.parent),$root:e=>As(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>tr(e),$forceUpdate:e=>e.f||(e.f=()=>{Qs(e.update)}),$nextTick:e=>e.n||(e.n=kn.bind(e.proxy)),$watch:e=>jc.bind(e)}),is=(e,t)=>e!==Z&&!e.__isScriptSetup&&J(e,t),vc={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;let f;if(t[0]!=="$"){const v=o[t];if(v!==void 0)switch(v){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(is(s,t))return o[t]=1,s[t];if(r!==Z&&J(r,t))return o[t]=2,r[t];if((f=e.propsOptions[0])&&J(f,t))return o[t]=3,i[t];if(n!==Z&&J(n,t))return o[t]=4,n[t];Rs&&(o[t]=0)}}const a=Vt[t];let h,g;if(a)return t==="$attrs"&&ve(e.attrs,"get",""),a(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==Z&&J(n,t))return o[t]=4,n[t];if(g=c.config.globalProperties,J(g,t))return g[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return is(r,t)?(r[t]=n,!0):s!==Z&&J(s,t)?(s[t]=n,!0):J(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,propsOptions:i}},o){let l;return!!n[o]||e!==Z&&J(e,o)||is(t,o)||(l=i[0])&&J(l,o)||J(s,o)||J(Vt,o)||J(r.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:J(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Vf(){return bc().slots}function bc(){const e=Yn();return e.setupContext||(e.setupContext=Ao(e))}function Ar(e){return K(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Rs=!0;function _c(e){const t=tr(e),n=e.proxy,s=e.ctx;Rs=!1,t.beforeCreate&&Rr(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:f,created:a,beforeMount:h,mounted:g,beforeUpdate:v,updated:_,activated:S,deactivated:U,beforeDestroy:N,beforeUnmount:B,destroyed:p,unmounted:m,render:M,renderTracked:F,renderTriggered:$,errorCaptured:j,serverPrefetch:R,expose:b,inheritAttrs:L,components:x,directives:W,filters:se}=t;if(f&&wc(f,s,null),o)for(const Y in o){const D=o[Y];q(D)&&(s[Y]=D.bind(n))}if(r){const Y=r.call(n,n);ne(Y)&&(e.data=Un(Y))}if(Rs=!0,i)for(const Y in i){const D=i[Y],he=q(D)?D.bind(n,n):q(D.get)?D.get.bind(n,n):Ue,on=!q(D)&&q(D.set)?D.set.bind(n):Ue,lt=ie({get:he,set:on});Object.defineProperty(s,Y,{enumerable:!0,configurable:!0,get:()=>lt.value,set:$e=>lt.value=$e})}if(l)for(const Y in l)no(l[Y],s,n,Y);if(c){const Y=q(c)?c.call(n):c;Reflect.ownKeys(Y).forEach(D=>{Ac(D,Y[D])})}a&&Rr(a,e,"c");function V(Y,D){K(D)?D.forEach(he=>Y(he.bind(n))):D&&Y(D.bind(n))}if(V(uc,h),V(Lt,g),V(dc,v),V(hc,_),V(cc,S),V(ac,U),V(yc,j),V(mc,F),V(gc,$),V(Ji,B),V(Kn,m),V(pc,R),K(b))if(b.length){const Y=e.exposed||(e.exposed={});b.forEach(D=>{Object.defineProperty(Y,D,{get:()=>n[D],set:he=>n[D]=he})})}else e.exposed||(e.exposed={});M&&e.render===Ue&&(e.render=M),L!=null&&(e.inheritAttrs=L),x&&(e.components=x),W&&(e.directives=W),R&&er(e)}function wc(e,t,n=Ue){K(e)&&(e=Os(e));for(const s in e){const r=e[s];let i;ne(r)?"default"in r?i=Pt(r.from||s,r.default,!0):i=Pt(r.from||s):i=Pt(r),ae(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function Rr(e,t,n){Fe(K(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function no(e,t,n,s){let r=s.includes(".")?yo(n,s):()=>n[s];if(re(e)){const i=t[e];q(i)&&Be(r,i)}else if(q(e))Be(r,e.bind(n));else if(ne(e))if(K(e))e.forEach(i=>no(i,t,n,s));else{const i=q(e.handler)?e.handler.bind(n):t[e.handler];q(i)&&Be(r,i,e)}}function tr(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(f=>Ln(c,f,o,!0)),Ln(c,t,o)),ne(t)&&i.set(t,c),c}function Ln(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&Ln(e,i,n,!0),r&&r.forEach(o=>Ln(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=Sc[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const Sc={data:Or,props:Mr,emits:Mr,methods:Dt,computed:Dt,beforeCreate:be,created:be,beforeMount:be,mounted:be,beforeUpdate:be,updated:be,beforeDestroy:be,beforeUnmount:be,destroyed:be,unmounted:be,activated:be,deactivated:be,errorCaptured:be,serverPrefetch:be,components:Dt,directives:Dt,watch:xc,provide:Or,inject:Ec};function Or(e,t){return t?e?function(){return fe(q(e)?e.call(this,this):e,q(t)?t.call(this,this):t)}:t:e}function Ec(e,t){return Dt(Os(e),Os(t))}function Os(e){if(K(e)){const t={};for(let n=0;n1)return n&&q(t)?t.call(s&&s.proxy):t}}const ro={},io=()=>Object.create(ro),oo=e=>Object.getPrototypeOf(e)===ro;function Rc(e,t,n,s=!1){const r={},i=io();e.propsDefaults=Object.create(null),lo(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:Nl(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function Oc(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=z(r),[c]=e.propsOptions;let f=!1;if((s||o>0)&&!(o&16)){if(o&8){const a=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[g,v]=co(h,t,!0);fe(o,g),v&&l.push(...v)};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}if(!i&&!c)return ne(e)&&s.set(e,Ct),Ct;if(K(i))for(let a=0;ae[0]==="_"||e==="$stable",nr=e=>K(e)?e.map(Me):[Me(e)],Pc=(e,t,n)=>{if(t._n)return t;const s=zl((...r)=>nr(t(...r)),n);return s._c=!1,s},fo=(e,t,n)=>{const s=e._ctx;for(const r in e){if(ao(r))continue;const i=e[r];if(q(i))t[r]=Pc(r,i,s);else if(i!=null){const o=nr(i);t[r]=()=>o}}},uo=(e,t)=>{const n=nr(t);e.slots.default=()=>n},ho=(e,t,n)=>{for(const s in t)(n||s!=="_")&&(e[s]=t[s])},Ic=(e,t,n)=>{const s=e.slots=io();if(e.vnode.shapeFlag&32){const r=t._;r?(ho(s,t,n),n&&gi(s,"_",r,!0)):fo(t,s)}else t&&uo(e,t)},Lc=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=Z;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:ho(r,t,n):(i=!t.$stable,fo(t,r)),o=t}else t&&(uo(e,t),o={default:1});if(i)for(const l in r)!ao(l)&&o[l]==null&&delete r[l]},Ee=_o;function Nc(e){return po(e)}function Fc(e){return po(e,ic)}function po(e,t){const n=mi();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:f,setElementText:a,parentNode:h,nextSibling:g,setScopeId:v=Ue,insertStaticContent:_}=e,S=(u,d,y,T=null,w=null,E=null,P=void 0,O=null,A=!!d.dynamicChildren)=>{if(u===d)return;u&&!dt(u,d)&&(T=ln(u),$e(u,w,E,!0),u=null),d.patchFlag===-2&&(A=!1,d.dynamicChildren=null);const{type:C,ref:k,shapeFlag:I}=d;switch(C){case mt:U(u,d,y,T);break;case ye:N(u,d,y,T);break;case Ut:u==null&&B(d,y,T,P);break;case Se:x(u,d,y,T,w,E,P,O,A);break;default:I&1?M(u,d,y,T,w,E,P,O,A):I&6?W(u,d,y,T,w,E,P,O,A):(I&64||I&128)&&C.process(u,d,y,T,w,E,P,O,A,bt)}k!=null&&w&&In(k,u&&u.ref,E,d||u,!d)},U=(u,d,y,T)=>{if(u==null)s(d.el=l(d.children),y,T);else{const w=d.el=u.el;d.children!==u.children&&f(w,d.children)}},N=(u,d,y,T)=>{u==null?s(d.el=c(d.children||""),y,T):d.el=u.el},B=(u,d,y,T)=>{[u.el,u.anchor]=_(u.children,d,y,T,u.el,u.anchor)},p=({el:u,anchor:d},y,T)=>{let w;for(;u&&u!==d;)w=g(u),s(u,y,T),u=w;s(d,y,T)},m=({el:u,anchor:d})=>{let y;for(;u&&u!==d;)y=g(u),r(u),u=y;r(d)},M=(u,d,y,T,w,E,P,O,A)=>{d.type==="svg"?P="svg":d.type==="math"&&(P="mathml"),u==null?F(d,y,T,w,E,P,O,A):R(u,d,w,E,P,O,A)},F=(u,d,y,T,w,E,P,O)=>{let A,C;const{props:k,shapeFlag:I,transition:H,dirs:G}=u;if(A=u.el=o(u.type,E,k&&k.is,k),I&8?a(A,u.children):I&16&&j(u.children,A,null,T,w,os(u,E),P,O),G&&Ve(u,null,T,"created"),$(A,u,u.scopeId,P,T),k){for(const ee in k)ee!=="value"&&!Rt(ee)&&i(A,ee,null,k[ee],E,T);"value"in k&&i(A,"value",null,k.value,E),(C=k.onVnodeBeforeMount)&&Oe(C,T,u)}G&&Ve(u,null,T,"beforeMount");const X=go(w,H);X&&H.beforeEnter(A),s(A,d,y),((C=k&&k.onVnodeMounted)||X||G)&&Ee(()=>{C&&Oe(C,T,u),X&&H.enter(A),G&&Ve(u,null,T,"mounted")},w)},$=(u,d,y,T,w)=>{if(y&&v(u,y),T)for(let E=0;E{for(let C=A;C{const O=d.el=u.el;let{patchFlag:A,dynamicChildren:C,dirs:k}=d;A|=u.patchFlag&16;const I=u.props||Z,H=d.props||Z;let G;if(y&&ct(y,!1),(G=H.onVnodeBeforeUpdate)&&Oe(G,y,d,u),k&&Ve(d,u,y,"beforeUpdate"),y&&ct(y,!0),(I.innerHTML&&H.innerHTML==null||I.textContent&&H.textContent==null)&&a(O,""),C?b(u.dynamicChildren,C,O,y,T,os(d,w),E):P||D(u,d,O,null,y,T,os(d,w),E,!1),A>0){if(A&16)L(O,I,H,y,w);else if(A&2&&I.class!==H.class&&i(O,"class",null,H.class,w),A&4&&i(O,"style",I.style,H.style,w),A&8){const X=d.dynamicProps;for(let ee=0;ee{G&&Oe(G,y,d,u),k&&Ve(d,u,y,"updated")},T)},b=(u,d,y,T,w,E,P)=>{for(let O=0;O{if(d!==y){if(d!==Z)for(const E in d)!Rt(E)&&!(E in y)&&i(u,E,d[E],null,w,T);for(const E in y){if(Rt(E))continue;const P=y[E],O=d[E];P!==O&&E!=="value"&&i(u,E,O,P,w,T)}"value"in y&&i(u,"value",d.value,y.value,w)}},x=(u,d,y,T,w,E,P,O,A)=>{const C=d.el=u?u.el:l(""),k=d.anchor=u?u.anchor:l("");let{patchFlag:I,dynamicChildren:H,slotScopeIds:G}=d;G&&(O=O?O.concat(G):G),u==null?(s(C,y,T),s(k,y,T),j(d.children||[],y,k,w,E,P,O,A)):I>0&&I&64&&H&&u.dynamicChildren?(b(u.dynamicChildren,H,y,w,E,P,O),(d.key!=null||w&&d===w.subTree)&&sr(u,d,!0)):D(u,d,y,k,w,E,P,O,A)},W=(u,d,y,T,w,E,P,O,A)=>{d.slotScopeIds=O,u==null?d.shapeFlag&512?w.ctx.activate(d,y,T,P,A):se(d,y,T,w,E,P,A):ce(u,d,A)},se=(u,d,y,T,w,E,P)=>{const O=u.component=Qc(u,T,w);if(nn(u)&&(O.ctx.renderer=bt),Zc(O,!1,P),O.asyncDep){if(w&&w.registerDep(O,V,P),!u.el){const A=O.subTree=le(ye);N(null,A,d,y)}}else V(O,u,d,y,w,E,P)},ce=(u,d,y)=>{const T=d.component=u.component;if(Wc(u,d,y))if(T.asyncDep&&!T.asyncResolved){Y(T,d,y);return}else T.next=d,T.update();else d.el=u.el,T.vnode=d},V=(u,d,y,T,w,E,P)=>{const O=()=>{if(u.isMounted){let{next:I,bu:H,u:G,parent:X,vnode:ee}=u;{const Te=mo(u);if(Te){I&&(I.el=ee.el,Y(u,I,P)),Te.asyncDep.then(()=>{u.isUnmounted||O()});return}}let Q=I,xe;ct(u,!1),I?(I.el=ee.el,Y(u,I,P)):I=ee,H&&Sn(H),(xe=I.props&&I.props.onVnodeBeforeUpdate)&&Oe(xe,X,I,ee),ct(u,!0);const pe=ls(u),Le=u.subTree;u.subTree=pe,S(Le,pe,h(Le.el),ln(Le),u,w,E),I.el=pe.el,Q===null&&Kc(u,pe.el),G&&Ee(G,w),(xe=I.props&&I.props.onVnodeUpdated)&&Ee(()=>Oe(xe,X,I,ee),w)}else{let I;const{el:H,props:G}=d,{bm:X,m:ee,parent:Q,root:xe,type:pe}=u,Le=gt(d);if(ct(u,!1),X&&Sn(X),!Le&&(I=G&&G.onVnodeBeforeMount)&&Oe(I,Q,d),ct(u,!0),H&&Qn){const Te=()=>{u.subTree=ls(u),Qn(H,u.subTree,u,w,null)};Le&&pe.__asyncHydrate?pe.__asyncHydrate(H,u,Te):Te()}else{xe.ce&&xe.ce._injectChildStyle(pe);const Te=u.subTree=ls(u);S(null,Te,y,T,u,w,E),d.el=Te.el}if(ee&&Ee(ee,w),!Le&&(I=G&&G.onVnodeMounted)){const Te=d;Ee(()=>Oe(I,Q,Te),w)}(d.shapeFlag&256||Q&>(Q.vnode)&&Q.vnode.shapeFlag&256)&&u.a&&Ee(u.a,w),u.isMounted=!0,d=y=T=null}};u.scope.on();const A=u.effect=new wi(O);u.scope.off();const C=u.update=A.run.bind(A),k=u.job=A.runIfDirty.bind(A);k.i=u,k.id=u.uid,A.scheduler=()=>Qs(k),ct(u,!0),C()},Y=(u,d,y)=>{d.component=u;const T=u.vnode.props;u.vnode=d,u.next=null,Oc(u,d.props,T,y),Lc(u,d.children,y),it(),_r(u),ot()},D=(u,d,y,T,w,E,P,O,A=!1)=>{const C=u&&u.children,k=u?u.shapeFlag:0,I=d.children,{patchFlag:H,shapeFlag:G}=d;if(H>0){if(H&128){on(C,I,y,T,w,E,P,O,A);return}else if(H&256){he(C,I,y,T,w,E,P,O,A);return}}G&8?(k&16&&Nt(C,w,E),I!==C&&a(y,I)):k&16?G&16?on(C,I,y,T,w,E,P,O,A):Nt(C,w,E,!0):(k&8&&a(y,""),G&16&&j(I,y,T,w,E,P,O,A))},he=(u,d,y,T,w,E,P,O,A)=>{u=u||Ct,d=d||Ct;const C=u.length,k=d.length,I=Math.min(C,k);let H;for(H=0;Hk?Nt(u,w,E,!0,!1,I):j(d,y,T,w,E,P,O,A,I)},on=(u,d,y,T,w,E,P,O,A)=>{let C=0;const k=d.length;let I=u.length-1,H=k-1;for(;C<=I&&C<=H;){const G=u[C],X=d[C]=A?et(d[C]):Me(d[C]);if(dt(G,X))S(G,X,y,null,w,E,P,O,A);else break;C++}for(;C<=I&&C<=H;){const G=u[I],X=d[H]=A?et(d[H]):Me(d[H]);if(dt(G,X))S(G,X,y,null,w,E,P,O,A);else break;I--,H--}if(C>I){if(C<=H){const G=H+1,X=GH)for(;C<=I;)$e(u[C],w,E,!0),C++;else{const G=C,X=C,ee=new Map;for(C=X;C<=H;C++){const Ce=d[C]=A?et(d[C]):Me(d[C]);Ce.key!=null&&ee.set(Ce.key,C)}let Q,xe=0;const pe=H-X+1;let Le=!1,Te=0;const Ft=new Array(pe);for(C=0;C=pe){$e(Ce,w,E,!0);continue}let De;if(Ce.key!=null)De=ee.get(Ce.key);else for(Q=X;Q<=H;Q++)if(Ft[Q-X]===0&&dt(Ce,d[Q])){De=Q;break}De===void 0?$e(Ce,w,E,!0):(Ft[De-X]=C+1,De>=Te?Te=De:Le=!0,S(Ce,d[De],y,null,w,E,P,O,A),xe++)}const ur=Le?Hc(Ft):Ct;for(Q=ur.length-1,C=pe-1;C>=0;C--){const Ce=X+C,De=d[Ce],dr=Ce+1{const{el:E,type:P,transition:O,children:A,shapeFlag:C}=u;if(C&6){lt(u.component.subTree,d,y,T);return}if(C&128){u.suspense.move(d,y,T);return}if(C&64){P.move(u,d,y,bt);return}if(P===Se){s(E,d,y);for(let I=0;IO.enter(E),w);else{const{leave:I,delayLeave:H,afterLeave:G}=O,X=()=>s(E,d,y),ee=()=>{I(E,()=>{X(),G&&G()})};H?H(E,X,ee):ee()}else s(E,d,y)},$e=(u,d,y,T=!1,w=!1)=>{const{type:E,props:P,ref:O,children:A,dynamicChildren:C,shapeFlag:k,patchFlag:I,dirs:H,cacheIndex:G}=u;if(I===-2&&(w=!1),O!=null&&In(O,null,y,u,!0),G!=null&&(d.renderCache[G]=void 0),k&256){d.ctx.deactivate(u);return}const X=k&1&&H,ee=!gt(u);let Q;if(ee&&(Q=P&&P.onVnodeBeforeUnmount)&&Oe(Q,d,u),k&6)zo(u.component,y,T);else{if(k&128){u.suspense.unmount(y,T);return}X&&Ve(u,null,d,"beforeUnmount"),k&64?u.type.remove(u,d,y,bt,T):C&&!C.hasOnce&&(E!==Se||I>0&&I&64)?Nt(C,d,y,!1,!0):(E===Se&&I&384||!w&&k&16)&&Nt(A,d,y),T&&ar(u)}(ee&&(Q=P&&P.onVnodeUnmounted)||X)&&Ee(()=>{Q&&Oe(Q,d,u),X&&Ve(u,null,d,"unmounted")},y)},ar=u=>{const{type:d,el:y,anchor:T,transition:w}=u;if(d===Se){Xo(y,T);return}if(d===Ut){m(u);return}const E=()=>{r(y),w&&!w.persisted&&w.afterLeave&&w.afterLeave()};if(u.shapeFlag&1&&w&&!w.persisted){const{leave:P,delayLeave:O}=w,A=()=>P(y,E);O?O(u.el,E,A):A()}else E()},Xo=(u,d)=>{let y;for(;u!==d;)y=g(u),r(u),u=y;r(d)},zo=(u,d,y)=>{const{bum:T,scope:w,job:E,subTree:P,um:O,m:A,a:C}=u;Ir(A),Ir(C),T&&Sn(T),w.stop(),E&&(E.flags|=8,$e(P,u,d,y)),O&&Ee(O,d),Ee(()=>{u.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},Nt=(u,d,y,T=!1,w=!1,E=0)=>{for(let P=E;P{if(u.shapeFlag&6)return ln(u.component.subTree);if(u.shapeFlag&128)return u.suspense.next();const d=g(u.anchor||u.el),y=d&&d[Bi];return y?g(y):d};let zn=!1;const fr=(u,d,y)=>{u==null?d._vnode&&$e(d._vnode,null,null,!0):S(d._vnode||null,u,d,null,null,null,y),d._vnode=u,zn||(zn=!0,_r(),Mn(),zn=!1)},bt={p:S,um:$e,m:lt,r:ar,mt:se,mc:j,pc:D,pbc:b,n:ln,o:e};let Jn,Qn;return t&&([Jn,Qn]=t(bt)),{render:fr,hydrate:Jn,createApp:Cc(fr,Jn)}}function os({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function ct({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function go(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function sr(e,t,n=!1){const s=e.children,r=t.children;if(K(s)&&K(r))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function mo(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:mo(t)}function Ir(e){if(e)for(let t=0;tPt($c);function rr(e,t){return qn(e,null,t)}function Uf(e,t){return qn(e,null,{flush:"post"})}function Be(e,t,n){return qn(e,t,n)}function qn(e,t,n=Z){const{immediate:s,deep:r,flush:i,once:o}=n,l=fe({},n);let c;if(rn)if(i==="sync"){const g=Dc();c=g.__watcherHandles||(g.__watcherHandles=[])}else if(!t||s)l.once=!0;else{const g=()=>{};return g.stop=Ue,g.resume=Ue,g.pause=Ue,g}const f=ue;l.call=(g,v,_)=>Fe(g,f,v,_);let a=!1;i==="post"?l.scheduler=g=>{Ee(g,f&&f.suspense)}:i!=="sync"&&(a=!0,l.scheduler=(g,v)=>{v?g():Qs(g)}),l.augmentJob=g=>{t&&(g.flags|=4),a&&(g.flags|=2,f&&(g.id=f.uid,g.i=f))};const h=ql(e,t,l);return c&&c.push(h),h}function jc(e,t,n){const s=this.proxy,r=re(e)?e.includes(".")?yo(s,e):()=>s[e]:e.bind(s,s);let i;q(t)?i=t:(i=t.handler,n=t);const o=sn(this),l=qn(r,i.bind(s),n);return o(),l}function yo(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;rt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Ie(t)}Modifiers`]||e[`${rt(t)}Modifiers`];function Uc(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||Z;let r=n;const i=t.startsWith("update:"),o=i&&Vc(s,t.slice(7));o&&(o.trim&&(r=n.map(a=>re(a)?a.trim():a)),o.number&&(r=n.map(ws)));let l,c=s[l=wn(t)]||s[l=wn(Ie(t))];!c&&i&&(c=s[l=wn(rt(t))]),c&&Fe(c,e,6,r);const f=s[l+"Once"];if(f){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Fe(f,e,6,r)}}function vo(e,t,n=!1){const s=t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!q(e)){const c=f=>{const a=vo(f,t,!0);a&&(l=!0,fe(o,a))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(ne(e)&&s.set(e,null),null):(K(i)?i.forEach(c=>o[c]=null):fe(o,i),ne(e)&&s.set(e,o),o)}function Gn(e,t){return!e||!Zt(t)?!1:(t=t.slice(2).replace(/Once$/,""),J(e,t[0].toLowerCase()+t.slice(1))||J(e,rt(t))||J(e,t))}function ls(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[i],slots:o,attrs:l,emit:c,render:f,renderCache:a,props:h,data:g,setupState:v,ctx:_,inheritAttrs:S}=e,U=Pn(e);let N,B;try{if(n.shapeFlag&4){const m=r||s,M=m;N=Me(f.call(M,m,a,h,v,g,_)),B=l}else{const m=t;N=Me(m.length>1?m(h,{attrs:l,slots:o,emit:c}):m(h,null)),B=t.props?l:Bc(l)}}catch(m){Bt.length=0,tn(m,e,1),N=le(ye)}let p=N;if(B&&S!==!1){const m=Object.keys(B),{shapeFlag:M}=p;m.length&&M&7&&(i&&m.some($s)&&(B=kc(B,i)),p=nt(p,B,!1,!0))}return n.dirs&&(p=nt(p,null,!1,!0),p.dirs=p.dirs?p.dirs.concat(n.dirs):n.dirs),n.transition&&Yt(p,n.transition),N=p,Pn(U),N}const Bc=e=>{let t;for(const n in e)(n==="class"||n==="style"||Zt(n))&&((t||(t={}))[n]=e[n]);return t},kc=(e,t)=>{const n={};for(const s in e)(!$s(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Wc(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:c}=t,f=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?Lr(s,o,f):!!o;if(c&8){const a=t.dynamicProps;for(let h=0;he.__isSuspense;function _o(e,t){t&&t.pendingBranch?K(e)?t.effects.push(...e):t.effects.push(e):Xl(e)}const Se=Symbol.for("v-fgt"),mt=Symbol.for("v-txt"),ye=Symbol.for("v-cmt"),Ut=Symbol.for("v-stc"),Bt=[];let Ae=null;function Ps(e=!1){Bt.push(Ae=e?null:[])}function qc(){Bt.pop(),Ae=Bt[Bt.length-1]||null}let Xt=1;function Nr(e){Xt+=e,e<0&&Ae&&(Ae.hasOnce=!0)}function wo(e){return e.dynamicChildren=Xt>0?Ae||Ct:null,qc(),Xt>0&&Ae&&Ae.push(e),e}function Bf(e,t,n,s,r,i){return wo(Eo(e,t,n,s,r,i,!0))}function Is(e,t,n,s,r){return wo(le(e,t,n,s,r,!0))}function zt(e){return e?e.__v_isVNode===!0:!1}function dt(e,t){return e.type===t.type&&e.key===t.key}const So=({key:e})=>e??null,Tn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?re(e)||ae(e)||q(e)?{i:de,r:e,k:t,f:!!n}:e:null);function Eo(e,t=null,n=null,s=0,r=null,i=e===Se?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&So(t),ref:t&&Tn(t),scopeId:Ui,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:de};return l?(ir(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=re(n)?8:16),Xt>0&&!o&&Ae&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Ae.push(c),c}const le=Gc;function Gc(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===Zi)&&(e=ye),zt(e)){const l=nt(e,t,!0);return n&&ir(l,n),Xt>0&&!i&&Ae&&(l.shapeFlag&6?Ae[Ae.indexOf(e)]=l:Ae.push(l)),l.patchFlag=-2,l}if(sa(e)&&(e=e.__vccOpts),t){t=Yc(t);let{class:l,style:c}=t;l&&!re(l)&&(t.class=Us(l)),ne(c)&&(Ys(c)&&!K(c)&&(c=fe({},c)),t.style=Vs(c))}const o=re(e)?1:bo(e)?128:ki(e)?64:ne(e)?4:q(e)?2:0;return Eo(e,t,n,s,r,o,i,!0)}function Yc(e){return e?Ys(e)||oo(e)?fe({},e):e:null}function nt(e,t,n=!1,s=!1){const{props:r,ref:i,patchFlag:o,children:l,transition:c}=e,f=t?Xc(r||{},t):r,a={__v_isVNode:!0,__v_skip:!0,type:e.type,props:f,key:f&&So(f),ref:t&&t.ref?n&&i?K(i)?i.concat(Tn(t)):[i,Tn(t)]:Tn(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Se?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&nt(e.ssContent),ssFallback:e.ssFallback&&nt(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&s&&Yt(a,c.clone(a)),a}function xo(e=" ",t=0){return le(mt,null,e,t)}function kf(e,t){const n=le(Ut,null,e);return n.staticCount=t,n}function Wf(e="",t=!1){return t?(Ps(),Is(ye,null,e)):le(ye,null,e)}function Me(e){return e==null||typeof e=="boolean"?le(ye):K(e)?le(Se,null,e.slice()):zt(e)?et(e):le(mt,null,String(e))}function et(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:nt(e)}function ir(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(K(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),ir(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!oo(t)?t._ctx=de:r===3&&de&&(de.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else q(t)?(t={default:t,_ctx:de},n=32):(t=String(t),s&64?(n=16,t=[xo(t)]):n=8);e.children=t,e.shapeFlag|=n}function Xc(...e){const t={};for(let n=0;nue||de;let Nn,Ls;{const e=mi(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),i=>{r.length>1?r.forEach(o=>o(i)):r[0](i)}};Nn=t("__VUE_INSTANCE_SETTERS__",n=>ue=n),Ls=t("__VUE_SSR_SETTERS__",n=>rn=n)}const sn=e=>{const t=ue;return Nn(e),e.scope.on(),()=>{e.scope.off(),Nn(t)}},Fr=()=>{ue&&ue.scope.off(),Nn(null)};function To(e){return e.vnode.shapeFlag&4}let rn=!1;function Zc(e,t=!1,n=!1){t&&Ls(t);const{props:s,children:r}=e.vnode,i=To(e);Rc(e,s,i,t),Ic(e,r,n);const o=i?ea(e,t):void 0;return t&&Ls(!1),o}function ea(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,vc);const{setup:s}=n;if(s){const r=e.setupContext=s.length>1?Ao(e):null,i=sn(e);it();const o=en(s,e,0,[e.props,r]);if(ot(),i(),di(o)){if(gt(e)||er(e),o.then(Fr,Fr),t)return o.then(l=>{Hr(e,l,t)}).catch(l=>{tn(l,e,0)});e.asyncDep=o}else Hr(e,o,t)}else Co(e,t)}function Hr(e,t,n){q(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ne(t)&&(e.setupState=$i(t)),Co(e,n)}let $r;function Co(e,t,n){const s=e.type;if(!e.render){if(!t&&$r&&!s.render){const r=s.template||tr(e).template;if(r){const{isCustomElement:i,compilerOptions:o}=e.appContext.config,{delimiters:l,compilerOptions:c}=s,f=fe(fe({isCustomElement:i,delimiters:l},o),c);s.render=$r(r,f)}}e.render=s.render||Ue}{const r=sn(e);it();try{_c(e)}finally{ot(),r()}}}const ta={get(e,t){return ve(e,"get",""),e[t]}};function Ao(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,ta),slots:e.slots,emit:e.emit,expose:t}}function Xn(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy($i(En(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Vt)return Vt[n](e)},has(t,n){return n in t||n in Vt}})):e.proxy}function na(e,t=!0){return q(e)?e.displayName||e.name:e.name||t&&e.__name}function sa(e){return q(e)&&"__vccOpts"in e}const ie=(e,t)=>Wl(e,t,rn);function Ns(e,t,n){const s=arguments.length;return s===2?ne(t)&&!K(t)?zt(t)?le(e,null,[t]):le(e,t):le(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&zt(n)&&(n=[n]),le(e,t,n))}const ra="3.5.10";/** +* @vue/runtime-dom v3.5.10 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Fs;const Dr=typeof window<"u"&&window.trustedTypes;if(Dr)try{Fs=Dr.createPolicy("vue",{createHTML:e=>e})}catch{}const Ro=Fs?e=>Fs.createHTML(e):e=>e,ia="http://www.w3.org/2000/svg",oa="http://www.w3.org/1998/Math/MathML",Ke=typeof document<"u"?document:null,jr=Ke&&Ke.createElement("template"),la={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?Ke.createElementNS(ia,e):t==="mathml"?Ke.createElementNS(oa,e):n?Ke.createElement(e,{is:n}):Ke.createElement(e);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>Ke.createTextNode(e),createComment:e=>Ke.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ke.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{jr.innerHTML=Ro(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const l=jr.content;if(s==="svg"||s==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},ze="transition",$t="animation",Jt=Symbol("_vtc"),Oo={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},ca=fe({},Ki,Oo),aa=e=>(e.displayName="Transition",e.props=ca,e),Kf=aa((e,{slots:t})=>Ns(nc,fa(e),t)),at=(e,t=[])=>{K(e)?e.forEach(n=>n(...t)):e&&e(...t)},Vr=e=>e?K(e)?e.some(t=>t.length>1):e.length>1:!1;function fa(e){const t={};for(const x in e)x in Oo||(t[x]=e[x]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:f=o,appearToClass:a=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:g=`${n}-leave-active`,leaveToClass:v=`${n}-leave-to`}=e,_=ua(r),S=_&&_[0],U=_&&_[1],{onBeforeEnter:N,onEnter:B,onEnterCancelled:p,onLeave:m,onLeaveCancelled:M,onBeforeAppear:F=N,onAppear:$=B,onAppearCancelled:j=p}=t,R=(x,W,se)=>{ft(x,W?a:l),ft(x,W?f:o),se&&se()},b=(x,W)=>{x._isLeaving=!1,ft(x,h),ft(x,v),ft(x,g),W&&W()},L=x=>(W,se)=>{const ce=x?$:B,V=()=>R(W,x,se);at(ce,[W,V]),Ur(()=>{ft(W,x?c:i),Je(W,x?a:l),Vr(ce)||Br(W,s,S,V)})};return fe(t,{onBeforeEnter(x){at(N,[x]),Je(x,i),Je(x,o)},onBeforeAppear(x){at(F,[x]),Je(x,c),Je(x,f)},onEnter:L(!1),onAppear:L(!0),onLeave(x,W){x._isLeaving=!0;const se=()=>b(x,W);Je(x,h),Je(x,g),pa(),Ur(()=>{x._isLeaving&&(ft(x,h),Je(x,v),Vr(m)||Br(x,s,U,se))}),at(m,[x,se])},onEnterCancelled(x){R(x,!1),at(p,[x])},onAppearCancelled(x){R(x,!0),at(j,[x])},onLeaveCancelled(x){b(x),at(M,[x])}})}function ua(e){if(e==null)return null;if(ne(e))return[cs(e.enter),cs(e.leave)];{const t=cs(e);return[t,t]}}function cs(e){return nl(e)}function Je(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Jt]||(e[Jt]=new Set)).add(t)}function ft(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[Jt];n&&(n.delete(t),n.size||(e[Jt]=void 0))}function Ur(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let da=0;function Br(e,t,n,s){const r=e._endId=++da,i=()=>{r===e._endId&&s()};if(n!=null)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=ha(e,t);if(!o)return s();const f=o+"end";let a=0;const h=()=>{e.removeEventListener(f,g),i()},g=v=>{v.target===e&&++a>=c&&h()};setTimeout(()=>{a(n[_]||"").split(", "),r=s(`${ze}Delay`),i=s(`${ze}Duration`),o=kr(r,i),l=s(`${$t}Delay`),c=s(`${$t}Duration`),f=kr(l,c);let a=null,h=0,g=0;t===ze?o>0&&(a=ze,h=o,g=i.length):t===$t?f>0&&(a=$t,h=f,g=c.length):(h=Math.max(o,f),a=h>0?o>f?ze:$t:null,g=a?a===ze?i.length:c.length:0);const v=a===ze&&/\b(transform|all)(,|$)/.test(s(`${ze}Property`).toString());return{type:a,timeout:h,propCount:g,hasTransform:v}}function kr(e,t){for(;e.lengthWr(n)+Wr(e[s])))}function Wr(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function pa(){return document.body.offsetHeight}function ga(e,t,n){const s=e[Jt];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Kr=Symbol("_vod"),ma=Symbol("_vsh"),ya=Symbol(""),va=/(^|;)\s*display\s*:/;function ba(e,t,n){const s=e.style,r=re(n);let i=!1;if(n&&!r){if(t)if(re(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&Cn(s,l,"")}else for(const o in t)n[o]==null&&Cn(s,o,"");for(const o in n)o==="display"&&(i=!0),Cn(s,o,n[o])}else if(r){if(t!==n){const o=s[ya];o&&(n+=";"+o),s.cssText=n,i=va.test(n)}}else t&&e.removeAttribute("style");Kr in e&&(e[Kr]=i?s.display:"",e[ma]&&(s.display="none"))}const qr=/\s*!important$/;function Cn(e,t,n){if(K(n))n.forEach(s=>Cn(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=_a(e,t);qr.test(n)?e.setProperty(rt(s),n.replace(qr,""),"important"):e[s]=n}}const Gr=["Webkit","Moz","ms"],as={};function _a(e,t){const n=as[t];if(n)return n;let s=Ie(t);if(s!=="filter"&&s in e)return as[t]=s;s=$n(s);for(let r=0;rfs||(xa.then(()=>fs=0),fs=Date.now());function Ca(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;Fe(Aa(s,n.value),t,5,[s])};return n.value=e,n.attached=Ta(),n}function Aa(e,t){if(K(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const Zr=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Ra=(e,t,n,s,r,i)=>{const o=r==="svg";t==="class"?ga(e,s,o):t==="style"?ba(e,n,s):Zt(t)?$s(t)||Sa(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Oa(e,t,s,o))?(zr(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Xr(e,t,s,o,i,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!re(s))?zr(e,Ie(t),s):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Xr(e,t,s,o))};function Oa(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&Zr(t)&&q(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return Zr(t)&&re(n)?!1:t in e}const ei=e=>{const t=e.props["onUpdate:modelValue"]||!1;return K(t)?n=>Sn(t,n):t};function Ma(e){e.target.composing=!0}function ti(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const us=Symbol("_assign"),qf={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e[us]=ei(r);const i=s||r.props&&r.props.type==="number";Et(e,t?"change":"input",o=>{if(o.target.composing)return;let l=e.value;n&&(l=l.trim()),i&&(l=ws(l)),e[us](l)}),n&&Et(e,"change",()=>{e.value=e.value.trim()}),t||(Et(e,"compositionstart",Ma),Et(e,"compositionend",ti),Et(e,"change",ti))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:r,number:i}},o){if(e[us]=ei(o),e.composing)return;const l=(i||e.type==="number")&&!/^0\d/.test(e.value)?ws(e.value):e.value,c=t??"";l!==c&&(document.activeElement===e&&e.type!=="range"&&(s&&t===n||r&&e.value.trim()===c)||(e.value=c))}},Pa=["ctrl","shift","alt","meta"],Ia={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Pa.some(n=>e[`${n}Key`]&&!t.includes(n))},Gf=(e,t)=>{const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(r,...i)=>{for(let o=0;o{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=r=>{if(!("key"in r))return;const i=rt(r.key);if(t.some(o=>o===i||La[o]===i))return e(r)})},Mo=fe({patchProp:Ra},la);let kt,ni=!1;function Na(){return kt||(kt=Nc(Mo))}function Fa(){return kt=ni?kt:Fc(Mo),ni=!0,kt}const Xf=(...e)=>{const t=Na().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Io(s);if(!r)return;const i=t._component;!q(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent="");const o=n(r,!1,Po(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),o},t},zf=(...e)=>{const t=Fa().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Io(s);if(r)return n(r,!0,Po(r))},t};function Po(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Io(e){return re(e)?document.querySelector(e):e}const Jf=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},Ha=window.__VP_SITE_DATA__;function or(e){return _i()?(ul(e),!0):!1}function ke(e){return typeof e=="function"?e():Hi(e)}const Lo=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const Qf=e=>e!=null,$a=Object.prototype.toString,Da=e=>$a.call(e)==="[object Object]",Qt=()=>{},si=ja();function ja(){var e,t;return Lo&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window==null?void 0:window.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function Va(e,t){function n(...s){return new Promise((r,i)=>{Promise.resolve(e(()=>t.apply(this,s),{fn:t,thisArg:this,args:s})).then(r).catch(i)})}return n}const No=e=>e();function Ua(e,t={}){let n,s,r=Qt;const i=l=>{clearTimeout(l),r(),r=Qt};return l=>{const c=ke(e),f=ke(t.maxWait);return n&&i(n),c<=0||f!==void 0&&f<=0?(s&&(i(s),s=null),Promise.resolve(l())):new Promise((a,h)=>{r=t.rejectOnCancel?h:a,f&&!s&&(s=setTimeout(()=>{n&&i(n),s=null,a(l())},f)),n=setTimeout(()=>{s&&i(s),s=null,a(l())},c)})}}function Ba(e=No){const t=oe(!0);function n(){t.value=!1}function s(){t.value=!0}const r=(...i)=>{t.value&&e(...i)};return{isActive:Bn(t),pause:n,resume:s,eventFilter:r}}function ka(e){return Yn()}function Fo(...e){if(e.length!==1)return Ul(...e);const t=e[0];return typeof t=="function"?Bn(Dl(()=>({get:t,set:Qt}))):oe(t)}function Ho(e,t,n={}){const{eventFilter:s=No,...r}=n;return Be(e,Va(s,t),r)}function Wa(e,t,n={}){const{eventFilter:s,...r}=n,{eventFilter:i,pause:o,resume:l,isActive:c}=Ba(s);return{stop:Ho(e,t,{...r,eventFilter:i}),pause:o,resume:l,isActive:c}}function lr(e,t=!0,n){ka()?Lt(e,n):t?e():kn(e)}function Zf(e,t,n={}){const{debounce:s=0,maxWait:r=void 0,...i}=n;return Ho(e,t,{...i,eventFilter:Ua(s,{maxWait:r})})}function eu(e,t,n){let s;ae(n)?s={evaluating:n}:s={};const{lazy:r=!1,evaluating:i=void 0,shallow:o=!0,onError:l=Qt}=s,c=oe(!r),f=o?zs(t):oe(t);let a=0;return rr(async h=>{if(!c.value)return;a++;const g=a;let v=!1;i&&Promise.resolve().then(()=>{i.value=!0});try{const _=await e(S=>{h(()=>{i&&(i.value=!1),v||S()})});g===a&&(f.value=_)}catch(_){l(_)}finally{i&&g===a&&(i.value=!1),v=!0}}),r?ie(()=>(c.value=!0,f.value)):f}const He=Lo?window:void 0;function $o(e){var t;const n=ke(e);return(t=n==null?void 0:n.$el)!=null?t:n}function It(...e){let t,n,s,r;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,s,r]=e,t=He):[t,n,s,r]=e,!t)return Qt;Array.isArray(n)||(n=[n]),Array.isArray(s)||(s=[s]);const i=[],o=()=>{i.forEach(a=>a()),i.length=0},l=(a,h,g,v)=>(a.addEventListener(h,g,v),()=>a.removeEventListener(h,g,v)),c=Be(()=>[$o(t),ke(r)],([a,h])=>{if(o(),!a)return;const g=Da(h)?{...h}:h;i.push(...n.flatMap(v=>s.map(_=>l(a,v,_,g))))},{immediate:!0,flush:"post"}),f=()=>{c(),o()};return or(f),f}function Ka(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function tu(...e){let t,n,s={};e.length===3?(t=e[0],n=e[1],s=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],s=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:r=He,eventName:i="keydown",passive:o=!1,dedupe:l=!1}=s,c=Ka(t);return It(r,i,a=>{a.repeat&&ke(l)||c(a)&&n(a)},o)}function qa(){const e=oe(!1),t=Yn();return t&&Lt(()=>{e.value=!0},t),e}function Ga(e){const t=qa();return ie(()=>(t.value,!!e()))}function Do(e,t={}){const{window:n=He}=t,s=Ga(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let r;const i=oe(!1),o=f=>{i.value=f.matches},l=()=>{r&&("removeEventListener"in r?r.removeEventListener("change",o):r.removeListener(o))},c=rr(()=>{s.value&&(l(),r=n.matchMedia(ke(e)),"addEventListener"in r?r.addEventListener("change",o):r.addListener(o),i.value=r.matches)});return or(()=>{c(),l(),r=void 0}),i}const vn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},bn="__vueuse_ssr_handlers__",Ya=Xa();function Xa(){return bn in vn||(vn[bn]=vn[bn]||{}),vn[bn]}function jo(e,t){return Ya[e]||t}function Vo(e){return Do("(prefers-color-scheme: dark)",e)}function za(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const Ja={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},ri="vueuse-storage";function cr(e,t,n,s={}){var r;const{flush:i="pre",deep:o=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:f=!1,shallow:a,window:h=He,eventFilter:g,onError:v=b=>{console.error(b)},initOnMounted:_}=s,S=(a?zs:oe)(typeof t=="function"?t():t);if(!n)try{n=jo("getDefaultStorage",()=>{var b;return(b=He)==null?void 0:b.localStorage})()}catch(b){v(b)}if(!n)return S;const U=ke(t),N=za(U),B=(r=s.serializer)!=null?r:Ja[N],{pause:p,resume:m}=Wa(S,()=>F(S.value),{flush:i,deep:o,eventFilter:g});h&&l&&lr(()=>{n instanceof Storage?It(h,"storage",j):It(h,ri,R),_&&j()}),_||j();function M(b,L){if(h){const x={key:e,oldValue:b,newValue:L,storageArea:n};h.dispatchEvent(n instanceof Storage?new StorageEvent("storage",x):new CustomEvent(ri,{detail:x}))}}function F(b){try{const L=n.getItem(e);if(b==null)M(L,null),n.removeItem(e);else{const x=B.write(b);L!==x&&(n.setItem(e,x),M(L,x))}}catch(L){v(L)}}function $(b){const L=b?b.newValue:n.getItem(e);if(L==null)return c&&U!=null&&n.setItem(e,B.write(U)),U;if(!b&&f){const x=B.read(L);return typeof f=="function"?f(x,U):N==="object"&&!Array.isArray(x)?{...U,...x}:x}else return typeof L!="string"?L:B.read(L)}function j(b){if(!(b&&b.storageArea!==n)){if(b&&b.key==null){S.value=U;return}if(!(b&&b.key!==e)){p();try{(b==null?void 0:b.newValue)!==B.write(S.value)&&(S.value=$(b))}catch(L){v(L)}finally{b?kn(m):m()}}}}function R(b){j(b.detail)}return S}const Qa="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";function Za(e={}){const{selector:t="html",attribute:n="class",initialValue:s="auto",window:r=He,storage:i,storageKey:o="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:f,disableTransition:a=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},g=Vo({window:r}),v=ie(()=>g.value?"dark":"light"),_=c||(o==null?Fo(s):cr(o,s,i,{window:r,listenToStorageChanges:l})),S=ie(()=>_.value==="auto"?v.value:_.value),U=jo("updateHTMLAttrs",(m,M,F)=>{const $=typeof m=="string"?r==null?void 0:r.document.querySelector(m):$o(m);if(!$)return;const j=new Set,R=new Set;let b=null;if(M==="class"){const x=F.split(/\s/g);Object.values(h).flatMap(W=>(W||"").split(/\s/g)).filter(Boolean).forEach(W=>{x.includes(W)?j.add(W):R.add(W)})}else b={key:M,value:F};if(j.size===0&&R.size===0&&b===null)return;let L;a&&(L=r.document.createElement("style"),L.appendChild(document.createTextNode(Qa)),r.document.head.appendChild(L));for(const x of j)$.classList.add(x);for(const x of R)$.classList.remove(x);b&&$.setAttribute(b.key,b.value),a&&(r.getComputedStyle(L).opacity,document.head.removeChild(L))});function N(m){var M;U(t,n,(M=h[m])!=null?M:m)}function B(m){e.onChanged?e.onChanged(m,N):N(m)}Be(S,B,{flush:"post",immediate:!0}),lr(()=>B(S.value));const p=ie({get(){return f?_.value:S.value},set(m){_.value=m}});try{return Object.assign(p,{store:_,system:v,state:S})}catch{return p}}function ef(e={}){const{valueDark:t="dark",valueLight:n="",window:s=He}=e,r=Za({...e,onChanged:(l,c)=>{var f;e.onChanged?(f=e.onChanged)==null||f.call(e,l==="dark",c,l):c(l)},modes:{dark:t,light:n}}),i=ie(()=>r.system?r.system.value:Vo({window:s}).value?"dark":"light");return ie({get(){return r.value==="dark"},set(l){const c=l?"dark":"light";i.value===c?r.value="auto":r.value=c}})}function ds(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}function nu(e,t,n={}){const{window:s=He}=n;return cr(e,t,s==null?void 0:s.localStorage,n)}function Uo(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const hs=new WeakMap;function su(e,t=!1){const n=oe(t);let s=null,r="";Be(Fo(e),l=>{const c=ds(ke(l));if(c){const f=c;if(hs.get(f)||hs.set(f,f.style.overflow),f.style.overflow!=="hidden"&&(r=f.style.overflow),f.style.overflow==="hidden")return n.value=!0;if(n.value)return f.style.overflow="hidden"}},{immediate:!0});const i=()=>{const l=ds(ke(e));!l||n.value||(si&&(s=It(l,"touchmove",c=>{tf(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},o=()=>{const l=ds(ke(e));!l||!n.value||(si&&(s==null||s()),l.style.overflow=r,hs.delete(l),n.value=!1)};return or(o),ie({get(){return n.value},set(l){l?i():o()}})}function ru(e,t,n={}){const{window:s=He}=n;return cr(e,t,s==null?void 0:s.sessionStorage,n)}function iu(e={}){const{window:t=He,behavior:n="auto"}=e;if(!t)return{x:oe(0),y:oe(0)};const s=oe(t.scrollX),r=oe(t.scrollY),i=ie({get(){return s.value},set(l){scrollTo({left:l,behavior:n})}}),o=ie({get(){return r.value},set(l){scrollTo({top:l,behavior:n})}});return It(t,"scroll",()=>{s.value=t.scrollX,r.value=t.scrollY},{capture:!1,passive:!0}),{x:i,y:o}}function ou(e={}){const{window:t=He,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:s=Number.POSITIVE_INFINITY,listenOrientation:r=!0,includeScrollbar:i=!0,type:o="inner"}=e,l=oe(n),c=oe(s),f=()=>{t&&(o==="outer"?(l.value=t.outerWidth,c.value=t.outerHeight):i?(l.value=t.innerWidth,c.value=t.innerHeight):(l.value=t.document.documentElement.clientWidth,c.value=t.document.documentElement.clientHeight))};if(f(),lr(f),It("resize",f,{passive:!0}),r){const a=Do("(orientation: portrait)");Be(a,()=>f())}return{width:l,height:c}}const ps={BASE_URL:"/dev/",DEV:!1,MODE:"production",PROD:!0,SSR:!1};var gs={};const Bo=/^(?:[a-z]+:|\/\/)/i,nf="vitepress-theme-appearance",sf=/#.*$/,rf=/[?#].*$/,of=/(?:(^|\/)index)?\.(?:md|html)$/,ge=typeof document<"u",ko={relativePath:"404.md",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function lf(e,t,n=!1){if(t===void 0)return!1;if(e=ii(`/${e}`),n)return new RegExp(t).test(e);if(ii(t)!==e)return!1;const s=t.match(sf);return s?(ge?location.hash:"")===s[0]:!0}function ii(e){return decodeURI(e).replace(rf,"").replace(of,"$1")}function cf(e){return Bo.test(e)}function af(e,t){return Object.keys((e==null?void 0:e.locales)||{}).find(n=>n!=="root"&&!cf(n)&&lf(t,`/${n}/`,!0))||"root"}function ff(e,t){var s,r,i,o,l,c,f;const n=af(e,t);return Object.assign({},e,{localeIndex:n,lang:((s=e.locales[n])==null?void 0:s.lang)??e.lang,dir:((r=e.locales[n])==null?void 0:r.dir)??e.dir,title:((i=e.locales[n])==null?void 0:i.title)??e.title,titleTemplate:((o=e.locales[n])==null?void 0:o.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:Ko(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(f=e.locales[n])==null?void 0:f.themeConfig}})}function Wo(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const r=uf(e.title,s);return n===r.slice(3)?n:`${n}${r}`}function uf(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function df(e,t){const[n,s]=t;if(n!=="meta")return!1;const r=Object.entries(s)[0];return r==null?!1:e.some(([i,o])=>i===n&&o[r[0]]===r[1])}function Ko(e,t){return[...e.filter(n=>!df(t,n)),...t]}const hf=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,pf=/^[a-z]:/i;function oi(e){const t=pf.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(hf,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const ms=new Set;function gf(e){if(ms.size===0){const n=typeof process=="object"&&(gs==null?void 0:gs.VITE_EXTRA_EXTENSIONS)||(ps==null?void 0:ps.VITE_EXTRA_EXTENSIONS)||"";("3g2,3gp,aac,ai,apng,au,avif,bin,bmp,cer,class,conf,crl,css,csv,dll,doc,eps,epub,exe,gif,gz,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,m4a,man,mid,midi,mjs,mov,mp2,mp3,mp4,mpe,mpeg,mpg,mpp,oga,ogg,ogv,ogx,opus,otf,p10,p7c,p7m,p7s,pdf,png,ps,qt,roff,rtf,rtx,ser,svg,t,tif,tiff,tr,ts,tsv,ttf,txt,vtt,wav,weba,webm,webp,woff,woff2,xhtml,xml,yaml,yml,zip"+(n&&typeof n=="string"?","+n:"")).split(",").forEach(s=>ms.add(s))}const t=e.split(".").pop();return t==null||!ms.has(t.toLowerCase())}function lu(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}const mf=Symbol(),yt=zs(Ha);function cu(e){const t=ie(()=>ff(yt.value,e.data.relativePath)),n=t.value.appearance,s=n==="force-dark"?oe(!0):n?ef({storageKey:nf,initialValue:()=>n==="dark"?"dark":"auto",...typeof n=="object"?n:{}}):oe(!1),r=oe(ge?location.hash:"");return ge&&window.addEventListener("hashchange",()=>{r.value=location.hash}),Be(()=>e.data,()=>{r.value=ge?location.hash:""}),{site:t,theme:ie(()=>t.value.themeConfig),page:ie(()=>e.data),frontmatter:ie(()=>e.data.frontmatter),params:ie(()=>e.data.params),lang:ie(()=>t.value.lang),dir:ie(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:ie(()=>t.value.localeIndex||"root"),title:ie(()=>Wo(t.value,e.data)),description:ie(()=>e.data.description||t.value.description),isDark:s,hash:ie(()=>r.value)}}function yf(){const e=Pt(mf);if(!e)throw new Error("vitepress data not properly injected in app");return e}function vf(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function li(e){return Bo.test(e)||!e.startsWith("/")?e:vf(yt.value.base,e)}function bf(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),ge){const n="/dev/";t=oi(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];if(s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),!s)return null;t=`${n}assets/${t}.${s}.js`}else t=`./${oi(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let An=[];function au(e){An.push(e),Kn(()=>{An=An.filter(t=>t!==e)})}function _f(){let e=yt.value.scrollOffset,t=0,n=24;if(typeof e=="object"&&"padding"in e&&(n=e.padding,e=e.selector),typeof e=="number")t=e;else if(typeof e=="string")t=ci(e,n);else if(Array.isArray(e))for(const s of e){const r=ci(s,n);if(r){t=r;break}}return t}function ci(e,t){const n=document.querySelector(e);if(!n)return 0;const s=n.getBoundingClientRect().bottom;return s<0?0:s+t}const wf=Symbol(),qo="http://a.com",Sf=()=>({path:"/",component:null,data:ko});function fu(e,t){const n=Un(Sf()),s={route:n,go:r};async function r(l=ge?location.href:"/"){var c,f;l=ys(l),await((c=s.onBeforeRouteChange)==null?void 0:c.call(s,l))!==!1&&(ge&&l!==ys(location.href)&&(history.replaceState({scrollPosition:window.scrollY},""),history.pushState({},"",l)),await o(l),await((f=s.onAfterRouteChanged)==null?void 0:f.call(s,l)))}let i=null;async function o(l,c=0,f=!1){var g;if(await((g=s.onBeforePageLoad)==null?void 0:g.call(s,l))===!1)return;const a=new URL(l,qo),h=i=a.pathname;try{let v=await e(h);if(!v)throw new Error(`Page not found: ${h}`);if(i===h){i=null;const{default:_,__pageData:S}=v;if(!_)throw new Error(`Invalid route component: ${_}`);n.path=ge?h:li(h),n.component=En(_),n.data=En(S),ge&&kn(()=>{let U=yt.value.base+S.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!yt.value.cleanUrls&&!U.endsWith("/")&&(U+=".html"),U!==a.pathname&&(a.pathname=U,l=U+a.search+a.hash,history.replaceState({},"",l)),a.hash&&!c){let N=null;try{N=document.getElementById(decodeURIComponent(a.hash).slice(1))}catch(B){console.warn(B)}if(N){ai(N,a.hash);return}}window.scrollTo(0,c)})}}catch(v){if(!/fetch|Page not found/.test(v.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(v),!f)try{const _=await fetch(yt.value.base+"hashmap.json");window.__VP_HASH_MAP__=await _.json(),await o(l,c,!0);return}catch{}if(i===h){i=null,n.path=ge?h:li(h),n.component=t?En(t):null;const _=ge?h.replace(/(^|\/)$/,"$1index").replace(/(\.html)?$/,".md").replace(/^\//,""):"404.md";n.data={...ko,relativePath:_}}}}return ge&&(history.state===null&&history.replaceState({},""),window.addEventListener("click",l=>{if(l.defaultPrevented||!(l.target instanceof Element)||l.target.closest("button")||l.button!==0||l.ctrlKey||l.shiftKey||l.altKey||l.metaKey)return;const c=l.target.closest("a");if(!c||c.closest(".vp-raw")||c.hasAttribute("download")||c.hasAttribute("target"))return;const f=c.getAttribute("href")??(c instanceof SVGAElement?c.getAttribute("xlink:href"):null);if(f==null)return;const{href:a,origin:h,pathname:g,hash:v,search:_}=new URL(f,c.baseURI),S=new URL(location.href);h===S.origin&&gf(g)&&(l.preventDefault(),g===S.pathname&&_===S.search?(v!==S.hash&&(history.pushState({},"",a),window.dispatchEvent(new HashChangeEvent("hashchange",{oldURL:S.href,newURL:a}))),v?ai(c,v,c.classList.contains("header-anchor")):window.scrollTo(0,0)):r(a))},{capture:!0}),window.addEventListener("popstate",async l=>{var c;l.state!==null&&(await o(ys(location.href),l.state&&l.state.scrollPosition||0),(c=s.onAfterRouteChanged)==null||c.call(s,location.href))}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function Ef(){const e=Pt(wf);if(!e)throw new Error("useRouter() is called without provider.");return e}function Go(){return Ef().route}function ai(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(r){console.warn(r)}if(s){let r=function(){!n||Math.abs(o-window.scrollY)>window.innerHeight?window.scrollTo(0,o):window.scrollTo({left:0,top:o,behavior:"smooth"})};const i=parseInt(window.getComputedStyle(s).paddingTop,10),o=window.scrollY+s.getBoundingClientRect().top-_f()+i;requestAnimationFrame(r)}}function ys(e){const t=new URL(e,qo);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),yt.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const vs=()=>An.forEach(e=>e()),uu=Zs({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=Go(),{site:n}=yf();return()=>Ns(e.as,n.value.contentProps??{style:{position:"relative"}},[t.component?Ns(t.component,{onVnodeMounted:vs,onVnodeUpdated:vs,onVnodeUnmounted:vs}):"404 Page Not Found"])}}),xf="modulepreload",Tf=function(e){return"/dev/"+e},fi={},du=function(t,n,s){let r=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),l=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));r=Promise.allSettled(n.map(c=>{if(c=Tf(c),c in fi)return;fi[c]=!0;const f=c.endsWith(".css"),a=f?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${a}`))return;const h=document.createElement("link");if(h.rel=f?"stylesheet":xf,f||(h.as="script"),h.crossOrigin="",h.href=c,l&&h.setAttribute("nonce",l),document.head.appendChild(h),f)return new Promise((g,v)=>{h.addEventListener("load",g),h.addEventListener("error",()=>v(new Error(`Unable to preload CSS for ${c}`)))})}))}function i(o){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=o,window.dispatchEvent(l),!l.defaultPrevented)throw o}return r.then(o=>{for(const l of o||[])l.status==="rejected"&&i(l.reason);return t().catch(i)})},hu=Zs({setup(e,{slots:t}){const n=oe(!1);return Lt(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function pu(){ge&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const s=(n=t.parentElement)==null?void 0:n.parentElement;if(!s)return;const r=Array.from(s.querySelectorAll("input")).indexOf(t);if(r<0)return;const i=s.querySelector(".blocks");if(!i)return;const o=Array.from(i.children).find(f=>f.classList.contains("active"));if(!o)return;const l=i.children[r];if(!l||o===l)return;o.classList.remove("active"),l.classList.add("active");const c=s==null?void 0:s.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function gu(){if(ge){const e=new WeakMap;window.addEventListener("click",t=>{var s;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const r=n.parentElement,i=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!r||!i)return;const o=/language-(shellscript|shell|bash|sh|zsh)/.test(r.className),l=[".vp-copy-ignore",".diff.remove"],c=i.cloneNode(!0);c.querySelectorAll(l.join(",")).forEach(a=>a.remove());let f=c.textContent||"";o&&(f=f.replace(/^ *(\$|>) /gm,"").trim()),Cf(f).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const a=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,a)})}})}}async function Cf(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const s=document.getSelection(),r=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),r&&(s.removeAllRanges(),s.addRange(r)),n&&n.focus()}}function mu(e,t){let n=!0,s=[];const r=i=>{if(n){n=!1,i.forEach(l=>{const c=bs(l);for(const f of document.head.children)if(f.isEqualNode(c)){s.push(f);return}});return}const o=i.map(bs);s.forEach((l,c)=>{const f=o.findIndex(a=>a==null?void 0:a.isEqualNode(l??null));f!==-1?delete o[f]:(l==null||l.remove(),delete s[c])}),o.forEach(l=>l&&document.head.appendChild(l)),s=[...s,...o].filter(Boolean)};rr(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[],f=Wo(o,i);f!==document.title&&(document.title=f);const a=l||o.description;let h=document.querySelector("meta[name=description]");h?h.getAttribute("content")!==a&&h.setAttribute("content",a):bs(["meta",{name:"description",content:a}]),r(Ko(o.head,Rf(c)))})}function bs([e,t,n]){const s=document.createElement(e);for(const r in t)s.setAttribute(r,t[r]);return n&&(s.innerHTML=n),e==="script"&&!t.async&&(s.async=!1),s}function Af(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Rf(e){return e.filter(t=>!Af(t))}const _s=new Set,Yo=()=>document.createElement("link"),Of=e=>{const t=Yo();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Mf=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let _n;const Pf=ge&&(_n=Yo())&&_n.relList&&_n.relList.supports&&_n.relList.supports("prefetch")?Of:Mf;function yu(){if(!ge||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const s=()=>{n&&n.disconnect(),n=new IntersectionObserver(i=>{i.forEach(o=>{if(o.isIntersecting){const l=o.target;n.unobserve(l);const{pathname:c}=l;if(!_s.has(c)){_s.add(c);const f=bf(c);f&&Pf(f)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{hostname:o,pathname:l}=new URL(i.href instanceof SVGAnimatedString?i.href.animVal:i.href,i.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||i.target!=="_blank"&&o===location.hostname&&(l!==location.pathname?n.observe(i):_s.add(l))})})};Lt(s);const r=Go();Be(()=>r.path,s),Kn(()=>{n&&n.disconnect()})}export{Ji as $,_f as A,Ff as B,$f as C,zs as D,au as E,Se as F,le as G,Hf as H,Bo as I,Go as J,Xc as K,Pt as L,ou as M,Vs as N,tu as O,kn as P,iu as Q,ge as R,Bn as S,Kf as T,Nf as U,du as V,su as W,Ac as X,Yf as Y,jf as Z,Jf as _,xo as a,Gf as a0,Vf as a1,Un as a2,Ul as a3,Ns as a4,kf as a5,mu as a6,wf as a7,cu as a8,mf as a9,uu as aa,hu as ab,yt as ac,zf as ad,fu as ae,bf as af,yu as ag,gu as ah,pu as ai,ke as aj,$o as ak,Qf as al,or as am,eu as an,ru as ao,nu as ap,Zf as aq,Ef as ar,It as as,If as at,qf as au,ae as av,Lf as aw,En as ax,Xf as ay,lu as az,Is as b,Bf as c,Zs as d,Wf as e,gf as f,li as g,ie as h,cf as i,Eo as j,Hi as k,lf as l,Do as m,Us as n,Ps as o,oe as p,Be as q,Df as r,rr as s,al as t,yf as u,Lt as v,zl as w,Kn as x,Uf as y,hc as z}; diff --git a/dev/assets/chunks/theme.BIQLsjK8.js b/dev/assets/chunks/theme.BIQLsjK8.js new file mode 100644 index 0000000..570b727 --- /dev/null +++ b/dev/assets/chunks/theme.BIQLsjK8.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPLocalSearchBox.B4ckM-ik.js","assets/chunks/framework.CJakPlgM.js"])))=>i.map(i=>d[i]); +import{d as m,o as a,c as u,r as c,n as I,a as O,t as w,b as g,w as f,e as h,T as de,_ as $,u as je,i as Ge,f as ze,g as ve,h as y,j as p,k as r,l as K,m as re,p as T,q as F,s as Z,v as z,x as pe,y as fe,z as Ke,A as Re,B as R,F as M,C as B,D as Ve,E as x,G as k,H as E,I as Le,J as ee,K as G,L as q,M as We,N as Te,O as ie,P as Ne,Q as we,R as te,S as qe,U as Je,V as Ye,W as Ie,X as he,Y as Xe,Z as Qe,$ as Ze,a0 as xe,a1 as Me,a2 as et,a3 as tt,a4 as nt}from"./framework.CJakPlgM.js";const st=m({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(o){return(e,t)=>(a(),u("span",{class:I(["VPBadge",e.type])},[c(e.$slots,"default",{},()=>[O(w(e.text),1)])],2))}}),ot={key:0,class:"VPBackdrop"},at=m({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(o){return(e,t)=>(a(),g(de,{name:"fade"},{default:f(()=>[e.show?(a(),u("div",ot)):h("",!0)]),_:1}))}}),rt=$(at,[["__scopeId","data-v-b06cdb19"]]),L=je;function it(o,e){let t,s=!1;return()=>{t&&clearTimeout(t),s?t=setTimeout(o,e):(o(),(s=!0)&&setTimeout(()=>s=!1,e))}}function le(o){return/^\//.test(o)?o:`/${o}`}function me(o){const{pathname:e,search:t,hash:s,protocol:n}=new URL(o,"http://a.com");if(Ge(o)||o.startsWith("#")||!n.startsWith("http")||!ze(e))return o;const{site:i}=L(),l=e.endsWith("/")||e.endsWith(".html")?o:o.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,i.value.cleanUrls?"":".html")}${t}${s}`);return ve(l)}function Y({correspondingLink:o=!1}={}){const{site:e,localeIndex:t,page:s,theme:n,hash:i}=L(),l=y(()=>{var d,_;return{label:(d=e.value.locales[t.value])==null?void 0:d.label,link:((_=e.value.locales[t.value])==null?void 0:_.link)||(t.value==="root"?"/":`/${t.value}/`)}});return{localeLinks:y(()=>Object.entries(e.value.locales).flatMap(([d,_])=>l.value.label===_.label?[]:{text:_.label,link:lt(_.link||(d==="root"?"/":`/${d}/`),n.value.i18nRouting!==!1&&o,s.value.relativePath.slice(l.value.link.length-1),!e.value.cleanUrls)+i.value})),currentLang:l}}function lt(o,e,t,s){return e?o.replace(/\/$/,"")+le(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,s?".html":"")):o}const ct={class:"NotFound"},ut={class:"code"},dt={class:"title"},vt={class:"quote"},pt={class:"action"},ft=["href","aria-label"],ht=m({__name:"NotFound",setup(o){const{theme:e}=L(),{currentLang:t}=Y();return(s,n)=>{var i,l,v,d,_;return a(),u("div",ct,[p("p",ut,w(((i=r(e).notFound)==null?void 0:i.code)??"404"),1),p("h1",dt,w(((l=r(e).notFound)==null?void 0:l.title)??"PAGE NOT FOUND"),1),n[0]||(n[0]=p("div",{class:"divider"},null,-1)),p("blockquote",vt,w(((v=r(e).notFound)==null?void 0:v.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),p("div",pt,[p("a",{class:"link",href:r(ve)(r(t).link),"aria-label":((d=r(e).notFound)==null?void 0:d.linkLabel)??"go to home"},w(((_=r(e).notFound)==null?void 0:_.linkText)??"Take me home"),9,ft)])])}}}),mt=$(ht,[["__scopeId","data-v-951cab6c"]]);function Ae(o,e){if(Array.isArray(o))return X(o);if(o==null)return[];e=le(e);const t=Object.keys(o).sort((n,i)=>i.split("/").length-n.split("/").length).find(n=>e.startsWith(le(n))),s=t?o[t]:[];return Array.isArray(s)?X(s):X(s.items,s.base)}function _t(o){const e=[];let t=0;for(const s in o){const n=o[s];if(n.items){t=e.push(n);continue}e[t]||e.push({items:[]}),e[t].items.push(n)}return e}function bt(o){const e=[];function t(s){for(const n of s)n.text&&n.link&&e.push({text:n.text,link:n.link,docFooterText:n.docFooterText}),n.items&&t(n.items)}return t(o),e}function ce(o,e){return Array.isArray(e)?e.some(t=>ce(o,t)):K(o,e.link)?!0:e.items?ce(o,e.items):!1}function X(o,e){return[...o].map(t=>{const s={...t},n=s.base||e;return n&&s.link&&(s.link=n+s.link),s.items&&(s.items=X(s.items,n)),s})}function U(){const{frontmatter:o,page:e,theme:t}=L(),s=re("(min-width: 960px)"),n=T(!1),i=y(()=>{const C=t.value.sidebar,N=e.value.relativePath;return C?Ae(C,N):[]}),l=T(i.value);F(i,(C,N)=>{JSON.stringify(C)!==JSON.stringify(N)&&(l.value=i.value)});const v=y(()=>o.value.sidebar!==!1&&l.value.length>0&&o.value.layout!=="home"),d=y(()=>_?o.value.aside==null?t.value.aside==="left":o.value.aside==="left":!1),_=y(()=>o.value.layout==="home"?!1:o.value.aside!=null?!!o.value.aside:t.value.aside!==!1),V=y(()=>v.value&&s.value),b=y(()=>v.value?_t(l.value):[]);function P(){n.value=!0}function S(){n.value=!1}function A(){n.value?S():P()}return{isOpen:n,sidebar:l,sidebarGroups:b,hasSidebar:v,hasAside:_,leftAside:d,isSidebarEnabled:V,open:P,close:S,toggle:A}}function kt(o,e){let t;Z(()=>{t=o.value?document.activeElement:void 0}),z(()=>{window.addEventListener("keyup",s)}),pe(()=>{window.removeEventListener("keyup",s)});function s(n){n.key==="Escape"&&o.value&&(e(),t==null||t.focus())}}function gt(o){const{page:e,hash:t}=L(),s=T(!1),n=y(()=>o.value.collapsed!=null),i=y(()=>!!o.value.link),l=T(!1),v=()=>{l.value=K(e.value.relativePath,o.value.link)};F([e,o,t],v),z(v);const d=y(()=>l.value?!0:o.value.items?ce(e.value.relativePath,o.value.items):!1),_=y(()=>!!(o.value.items&&o.value.items.length));Z(()=>{s.value=!!(n.value&&o.value.collapsed)}),fe(()=>{(l.value||d.value)&&(s.value=!1)});function V(){n.value&&(s.value=!s.value)}return{collapsed:s,collapsible:n,isLink:i,isActiveLink:l,hasActiveLink:d,hasChildren:_,toggle:V}}function $t(){const{hasSidebar:o}=U(),e=re("(min-width: 960px)"),t=re("(min-width: 1280px)");return{isAsideEnabled:y(()=>!t.value&&!e.value?!1:o.value?t.value:e.value)}}const ue=[];function Ce(o){return typeof o.outline=="object"&&!Array.isArray(o.outline)&&o.outline.label||o.outlineTitle||"On this page"}function _e(o){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const s=Number(t.tagName[1]);return{element:t,title:yt(t),link:"#"+t.id,level:s}});return Pt(e,o)}function yt(o){let e="";for(const t of o.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor")||t.classList.contains("ignore-header"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function Pt(o,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[s,n]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;o=o.filter(l=>l.level>=s&&l.level<=n),ue.length=0;for(const{element:l,link:v}of o)ue.push({element:l,link:v});const i=[];e:for(let l=0;l=0;d--){const _=o[d];if(_.level{requestAnimationFrame(i),window.addEventListener("scroll",s)}),Ke(()=>{l(location.hash)}),pe(()=>{window.removeEventListener("scroll",s)});function i(){if(!t.value)return;const v=window.scrollY,d=window.innerHeight,_=document.body.offsetHeight,V=Math.abs(v+d-_)<1,b=ue.map(({element:S,link:A})=>({link:A,top:Vt(S)})).filter(({top:S})=>!Number.isNaN(S)).sort((S,A)=>S.top-A.top);if(!b.length){l(null);return}if(v<1){l(null);return}if(V){l(b[b.length-1].link);return}let P=null;for(const{link:S,top:A}of b){if(A>v+Re()+4)break;P=S}l(P)}function l(v){n&&n.classList.remove("active"),v==null?n=null:n=o.value.querySelector(`a[href="${decodeURIComponent(v)}"]`);const d=n;d?(d.classList.add("active"),e.value.style.top=d.offsetTop+39+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function Vt(o){let e=0;for(;o!==document.body;){if(o===null)return NaN;e+=o.offsetTop,o=o.offsetParent}return e}const Lt=["href","title"],Tt=m({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(o){function e({target:t}){const s=t.href.split("#")[1],n=document.getElementById(decodeURIComponent(s));n==null||n.focus({preventScroll:!0})}return(t,s)=>{const n=R("VPDocOutlineItem",!0);return a(),u("ul",{class:I(["VPDocOutlineItem",t.root?"root":"nested"])},[(a(!0),u(M,null,B(t.headers,({children:i,link:l,title:v})=>(a(),u("li",null,[p("a",{class:"outline-link",href:l,onClick:e,title:v},w(v),9,Lt),i!=null&&i.length?(a(),g(n,{key:0,headers:i},null,8,["headers"])):h("",!0)]))),256))],2)}}}),Be=$(Tt,[["__scopeId","data-v-3f927ebe"]]),Nt={class:"content"},wt={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},It=m({__name:"VPDocAsideOutline",setup(o){const{frontmatter:e,theme:t}=L(),s=Ve([]);x(()=>{s.value=_e(e.value.outline??t.value.outline)});const n=T(),i=T();return St(n,i),(l,v)=>(a(),u("nav",{"aria-labelledby":"doc-outline-aria-label",class:I(["VPDocAsideOutline",{"has-outline":s.value.length>0}]),ref_key:"container",ref:n},[p("div",Nt,[p("div",{class:"outline-marker",ref_key:"marker",ref:i},null,512),p("div",wt,w(r(Ce)(r(t))),1),k(Be,{headers:s.value,root:!0},null,8,["headers"])])],2))}}),Mt=$(It,[["__scopeId","data-v-b38bf2ff"]]),At={class:"VPDocAsideCarbonAds"},Ct=m({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(o){const e=()=>null;return(t,s)=>(a(),u("div",At,[k(r(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),Bt={class:"VPDocAside"},Ht=m({__name:"VPDocAside",setup(o){const{theme:e}=L();return(t,s)=>(a(),u("div",Bt,[c(t.$slots,"aside-top",{},void 0,!0),c(t.$slots,"aside-outline-before",{},void 0,!0),k(Mt),c(t.$slots,"aside-outline-after",{},void 0,!0),s[0]||(s[0]=p("div",{class:"spacer"},null,-1)),c(t.$slots,"aside-ads-before",{},void 0,!0),r(e).carbonAds?(a(),g(Ct,{key:0,"carbon-ads":r(e).carbonAds},null,8,["carbon-ads"])):h("",!0),c(t.$slots,"aside-ads-after",{},void 0,!0),c(t.$slots,"aside-bottom",{},void 0,!0)]))}}),Et=$(Ht,[["__scopeId","data-v-6d7b3c46"]]);function Dt(){const{theme:o,page:e}=L();return y(()=>{const{text:t="Edit this page",pattern:s=""}=o.value.editLink||{};let n;return typeof s=="function"?n=s(e.value):n=s.replace(/:path/g,e.value.filePath),{url:n,text:t}})}function Ft(){const{page:o,theme:e,frontmatter:t}=L();return y(()=>{var _,V,b,P,S,A,C,N;const s=Ae(e.value.sidebar,o.value.relativePath),n=bt(s),i=Ot(n,H=>H.link.replace(/[?#].*$/,"")),l=i.findIndex(H=>K(o.value.relativePath,H.link)),v=((_=e.value.docFooter)==null?void 0:_.prev)===!1&&!t.value.prev||t.value.prev===!1,d=((V=e.value.docFooter)==null?void 0:V.next)===!1&&!t.value.next||t.value.next===!1;return{prev:v?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((b=i[l-1])==null?void 0:b.docFooterText)??((P=i[l-1])==null?void 0:P.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((S=i[l-1])==null?void 0:S.link)},next:d?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((A=i[l+1])==null?void 0:A.docFooterText)??((C=i[l+1])==null?void 0:C.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((N=i[l+1])==null?void 0:N.link)}}})}function Ot(o,e){const t=new Set;return o.filter(s=>{const n=e(s);return t.has(n)?!1:t.add(n)})}const D=m({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(o){const e=o,t=y(()=>e.tag??(e.href?"a":"span")),s=y(()=>e.href&&Le.test(e.href)||e.target==="_blank");return(n,i)=>(a(),g(E(t.value),{class:I(["VPLink",{link:n.href,"vp-external-link-icon":s.value,"no-icon":n.noIcon}]),href:n.href?r(me)(n.href):void 0,target:n.target??(s.value?"_blank":void 0),rel:n.rel??(s.value?"noreferrer":void 0)},{default:f(()=>[c(n.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Ut={class:"VPLastUpdated"},jt=["datetime"],Gt=m({__name:"VPDocFooterLastUpdated",setup(o){const{theme:e,page:t,lang:s}=L(),n=y(()=>new Date(t.value.lastUpdated)),i=y(()=>n.value.toISOString()),l=T("");return z(()=>{Z(()=>{var v,d,_;l.value=new Intl.DateTimeFormat((d=(v=e.value.lastUpdated)==null?void 0:v.formatOptions)!=null&&d.forceLocale?s.value:void 0,((_=e.value.lastUpdated)==null?void 0:_.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(n.value)})}),(v,d)=>{var _;return a(),u("p",Ut,[O(w(((_=r(e).lastUpdated)==null?void 0:_.text)||r(e).lastUpdatedText||"Last updated")+": ",1),p("time",{datetime:i.value},w(l.value),9,jt)])}}}),zt=$(Gt,[["__scopeId","data-v-475f71b8"]]),Kt={key:0,class:"VPDocFooter"},Rt={key:0,class:"edit-info"},Wt={key:0,class:"edit-link"},qt={key:1,class:"last-updated"},Jt={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},Yt={class:"pager"},Xt=["innerHTML"],Qt=["innerHTML"],Zt={class:"pager"},xt=["innerHTML"],en=["innerHTML"],tn=m({__name:"VPDocFooter",setup(o){const{theme:e,page:t,frontmatter:s}=L(),n=Dt(),i=Ft(),l=y(()=>e.value.editLink&&s.value.editLink!==!1),v=y(()=>t.value.lastUpdated),d=y(()=>l.value||v.value||i.value.prev||i.value.next);return(_,V)=>{var b,P,S,A;return d.value?(a(),u("footer",Kt,[c(_.$slots,"doc-footer-before",{},void 0,!0),l.value||v.value?(a(),u("div",Rt,[l.value?(a(),u("div",Wt,[k(D,{class:"edit-link-button",href:r(n).url,"no-icon":!0},{default:f(()=>[V[0]||(V[0]=p("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),O(" "+w(r(n).text),1)]),_:1},8,["href"])])):h("",!0),v.value?(a(),u("div",qt,[k(zt)])):h("",!0)])):h("",!0),(b=r(i).prev)!=null&&b.link||(P=r(i).next)!=null&&P.link?(a(),u("nav",Jt,[V[1]||(V[1]=p("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),p("div",Yt,[(S=r(i).prev)!=null&&S.link?(a(),g(D,{key:0,class:"pager-link prev",href:r(i).prev.link},{default:f(()=>{var C;return[p("span",{class:"desc",innerHTML:((C=r(e).docFooter)==null?void 0:C.prev)||"Previous page"},null,8,Xt),p("span",{class:"title",innerHTML:r(i).prev.text},null,8,Qt)]}),_:1},8,["href"])):h("",!0)]),p("div",Zt,[(A=r(i).next)!=null&&A.link?(a(),g(D,{key:0,class:"pager-link next",href:r(i).next.link},{default:f(()=>{var C;return[p("span",{class:"desc",innerHTML:((C=r(e).docFooter)==null?void 0:C.next)||"Next page"},null,8,xt),p("span",{class:"title",innerHTML:r(i).next.text},null,8,en)]}),_:1},8,["href"])):h("",!0)])])):h("",!0)])):h("",!0)}}}),nn=$(tn,[["__scopeId","data-v-4f9813fa"]]),sn={class:"container"},on={class:"aside-container"},an={class:"aside-content"},rn={class:"content"},ln={class:"content-container"},cn={class:"main"},un=m({__name:"VPDoc",setup(o){const{theme:e}=L(),t=ee(),{hasSidebar:s,hasAside:n,leftAside:i}=U(),l=y(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(v,d)=>{const _=R("Content");return a(),u("div",{class:I(["VPDoc",{"has-sidebar":r(s),"has-aside":r(n)}])},[c(v.$slots,"doc-top",{},void 0,!0),p("div",sn,[r(n)?(a(),u("div",{key:0,class:I(["aside",{"left-aside":r(i)}])},[d[0]||(d[0]=p("div",{class:"aside-curtain"},null,-1)),p("div",on,[p("div",an,[k(Et,null,{"aside-top":f(()=>[c(v.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":f(()=>[c(v.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":f(()=>[c(v.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[c(v.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[c(v.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[c(v.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):h("",!0),p("div",rn,[p("div",ln,[c(v.$slots,"doc-before",{},void 0,!0),p("main",cn,[k(_,{class:I(["vp-doc",[l.value,r(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),k(nn,null,{"doc-footer-before":f(()=>[c(v.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),c(v.$slots,"doc-after",{},void 0,!0)])])]),c(v.$slots,"doc-bottom",{},void 0,!0)],2)}}}),dn=$(un,[["__scopeId","data-v-83890dd9"]]),vn=m({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(o){const e=o,t=y(()=>e.href&&Le.test(e.href)),s=y(()=>e.tag||e.href?"a":"button");return(n,i)=>(a(),g(E(s.value),{class:I(["VPButton",[n.size,n.theme]]),href:n.href?r(me)(n.href):void 0,target:e.target??(t.value?"_blank":void 0),rel:e.rel??(t.value?"noreferrer":void 0)},{default:f(()=>[O(w(n.text),1)]),_:1},8,["class","href","target","rel"]))}}),pn=$(vn,[["__scopeId","data-v-14206e74"]]),fn=["src","alt"],hn=m({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(o){return(e,t)=>{const s=R("VPImage",!0);return e.image?(a(),u(M,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),u("img",G({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:r(ve)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,fn)):(a(),u(M,{key:1},[k(s,G({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),k(s,G({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):h("",!0)}}}),Q=$(hn,[["__scopeId","data-v-35a7d0b8"]]),mn={class:"container"},_n={class:"main"},bn={key:0,class:"name"},kn=["innerHTML"],gn=["innerHTML"],$n=["innerHTML"],yn={key:0,class:"actions"},Pn={key:0,class:"image"},Sn={class:"image-container"},Vn=m({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(o){const e=q("hero-image-slot-exists");return(t,s)=>(a(),u("div",{class:I(["VPHero",{"has-image":t.image||r(e)}])},[p("div",mn,[p("div",_n,[c(t.$slots,"home-hero-info-before",{},void 0,!0),c(t.$slots,"home-hero-info",{},()=>[t.name?(a(),u("h1",bn,[p("span",{innerHTML:t.name,class:"clip"},null,8,kn)])):h("",!0),t.text?(a(),u("p",{key:1,innerHTML:t.text,class:"text"},null,8,gn)):h("",!0),t.tagline?(a(),u("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,$n)):h("",!0)],!0),c(t.$slots,"home-hero-info-after",{},void 0,!0),t.actions?(a(),u("div",yn,[(a(!0),u(M,null,B(t.actions,n=>(a(),u("div",{key:n.link,class:"action"},[k(pn,{tag:"a",size:"medium",theme:n.theme,text:n.text,href:n.link,target:n.target,rel:n.rel},null,8,["theme","text","href","target","rel"])]))),128))])):h("",!0),c(t.$slots,"home-hero-actions-after",{},void 0,!0)]),t.image||r(e)?(a(),u("div",Pn,[p("div",Sn,[s[0]||(s[0]=p("div",{class:"image-bg"},null,-1)),c(t.$slots,"home-hero-image",{},()=>[t.image?(a(),g(Q,{key:0,class:"image-src",image:t.image},null,8,["image"])):h("",!0)],!0)])])):h("",!0)])],2))}}),Ln=$(Vn,[["__scopeId","data-v-955009fc"]]),Tn=m({__name:"VPHomeHero",setup(o){const{frontmatter:e}=L();return(t,s)=>r(e).hero?(a(),g(Ln,{key:0,class:"VPHomeHero",name:r(e).hero.name,text:r(e).hero.text,tagline:r(e).hero.tagline,image:r(e).hero.image,actions:r(e).hero.actions},{"home-hero-info-before":f(()=>[c(t.$slots,"home-hero-info-before")]),"home-hero-info":f(()=>[c(t.$slots,"home-hero-info")]),"home-hero-info-after":f(()=>[c(t.$slots,"home-hero-info-after")]),"home-hero-actions-after":f(()=>[c(t.$slots,"home-hero-actions-after")]),"home-hero-image":f(()=>[c(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):h("",!0)}}),Nn={class:"box"},wn={key:0,class:"icon"},In=["innerHTML"],Mn=["innerHTML"],An=["innerHTML"],Cn={key:4,class:"link-text"},Bn={class:"link-text-value"},Hn=m({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(o){return(e,t)=>(a(),g(D,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:f(()=>[p("article",Nn,[typeof e.icon=="object"&&e.icon.wrap?(a(),u("div",wn,[k(Q,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(a(),g(Q,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(a(),u("div",{key:2,class:"icon",innerHTML:e.icon},null,8,In)):h("",!0),p("h2",{class:"title",innerHTML:e.title},null,8,Mn),e.details?(a(),u("p",{key:3,class:"details",innerHTML:e.details},null,8,An)):h("",!0),e.linkText?(a(),u("div",Cn,[p("p",Bn,[O(w(e.linkText)+" ",1),t[0]||(t[0]=p("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):h("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),En=$(Hn,[["__scopeId","data-v-f5e9645b"]]),Dn={key:0,class:"VPFeatures"},Fn={class:"container"},On={class:"items"},Un=m({__name:"VPFeatures",props:{features:{}},setup(o){const e=o,t=y(()=>{const s=e.features.length;if(s){if(s===2)return"grid-2";if(s===3)return"grid-3";if(s%3===0)return"grid-6";if(s>3)return"grid-4"}else return});return(s,n)=>s.features?(a(),u("div",Dn,[p("div",Fn,[p("div",On,[(a(!0),u(M,null,B(s.features,i=>(a(),u("div",{key:i.title,class:I(["item",[t.value]])},[k(En,{icon:i.icon,title:i.title,details:i.details,link:i.link,"link-text":i.linkText,rel:i.rel,target:i.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):h("",!0)}}),jn=$(Un,[["__scopeId","data-v-d0a190d7"]]),Gn=m({__name:"VPHomeFeatures",setup(o){const{frontmatter:e}=L();return(t,s)=>r(e).features?(a(),g(jn,{key:0,class:"VPHomeFeatures",features:r(e).features},null,8,["features"])):h("",!0)}}),zn=m({__name:"VPHomeContent",setup(o){const{width:e}=We({initialWidth:0,includeScrollbar:!1});return(t,s)=>(a(),u("div",{class:"vp-doc container",style:Te(r(e)?{"--vp-offset":`calc(50% - ${r(e)/2}px)`}:{})},[c(t.$slots,"default",{},void 0,!0)],4))}}),Kn=$(zn,[["__scopeId","data-v-7a48a447"]]),Rn={class:"VPHome"},Wn=m({__name:"VPHome",setup(o){const{frontmatter:e}=L();return(t,s)=>{const n=R("Content");return a(),u("div",Rn,[c(t.$slots,"home-hero-before",{},void 0,!0),k(Tn,null,{"home-hero-info-before":f(()=>[c(t.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[c(t.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[c(t.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[c(t.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[c(t.$slots,"home-hero-image",{},void 0,!0)]),_:3}),c(t.$slots,"home-hero-after",{},void 0,!0),c(t.$slots,"home-features-before",{},void 0,!0),k(Gn),c(t.$slots,"home-features-after",{},void 0,!0),r(e).markdownStyles!==!1?(a(),g(Kn,{key:0},{default:f(()=>[k(n)]),_:1})):(a(),g(n,{key:1}))])}}}),qn=$(Wn,[["__scopeId","data-v-cbb6ec48"]]),Jn={},Yn={class:"VPPage"};function Xn(o,e){const t=R("Content");return a(),u("div",Yn,[c(o.$slots,"page-top"),k(t),c(o.$slots,"page-bottom")])}const Qn=$(Jn,[["render",Xn]]),Zn=m({__name:"VPContent",setup(o){const{page:e,frontmatter:t}=L(),{hasSidebar:s}=U();return(n,i)=>(a(),u("div",{class:I(["VPContent",{"has-sidebar":r(s),"is-home":r(t).layout==="home"}]),id:"VPContent"},[r(e).isNotFound?c(n.$slots,"not-found",{key:0},()=>[k(mt)],!0):r(t).layout==="page"?(a(),g(Qn,{key:1},{"page-top":f(()=>[c(n.$slots,"page-top",{},void 0,!0)]),"page-bottom":f(()=>[c(n.$slots,"page-bottom",{},void 0,!0)]),_:3})):r(t).layout==="home"?(a(),g(qn,{key:2},{"home-hero-before":f(()=>[c(n.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":f(()=>[c(n.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[c(n.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[c(n.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[c(n.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[c(n.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":f(()=>[c(n.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":f(()=>[c(n.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":f(()=>[c(n.$slots,"home-features-after",{},void 0,!0)]),_:3})):r(t).layout&&r(t).layout!=="doc"?(a(),g(E(r(t).layout),{key:3})):(a(),g(dn,{key:4},{"doc-top":f(()=>[c(n.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":f(()=>[c(n.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":f(()=>[c(n.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":f(()=>[c(n.$slots,"doc-before",{},void 0,!0)]),"doc-after":f(()=>[c(n.$slots,"doc-after",{},void 0,!0)]),"aside-top":f(()=>[c(n.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":f(()=>[c(n.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[c(n.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[c(n.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[c(n.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":f(()=>[c(n.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),xn=$(Zn,[["__scopeId","data-v-91765379"]]),es={class:"container"},ts=["innerHTML"],ns=["innerHTML"],ss=m({__name:"VPFooter",setup(o){const{theme:e,frontmatter:t}=L(),{hasSidebar:s}=U();return(n,i)=>r(e).footer&&r(t).footer!==!1?(a(),u("footer",{key:0,class:I(["VPFooter",{"has-sidebar":r(s)}])},[p("div",es,[r(e).footer.message?(a(),u("p",{key:0,class:"message",innerHTML:r(e).footer.message},null,8,ts)):h("",!0),r(e).footer.copyright?(a(),u("p",{key:1,class:"copyright",innerHTML:r(e).footer.copyright},null,8,ns)):h("",!0)])],2)):h("",!0)}}),os=$(ss,[["__scopeId","data-v-c970a860"]]);function as(){const{theme:o,frontmatter:e}=L(),t=Ve([]),s=y(()=>t.value.length>0);return x(()=>{t.value=_e(e.value.outline??o.value.outline)}),{headers:t,hasLocalNav:s}}const rs={class:"menu-text"},is={class:"header"},ls={class:"outline"},cs=m({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(o){const e=o,{theme:t}=L(),s=T(!1),n=T(0),i=T(),l=T();function v(b){var P;(P=i.value)!=null&&P.contains(b.target)||(s.value=!1)}F(s,b=>{if(b){document.addEventListener("click",v);return}document.removeEventListener("click",v)}),ie("Escape",()=>{s.value=!1}),x(()=>{s.value=!1});function d(){s.value=!s.value,n.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function _(b){b.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Ne(()=>{s.value=!1}))}function V(){s.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(b,P)=>(a(),u("div",{class:"VPLocalNavOutlineDropdown",style:Te({"--vp-vh":n.value+"px"}),ref_key:"main",ref:i},[b.headers.length>0?(a(),u("button",{key:0,onClick:d,class:I({open:s.value})},[p("span",rs,w(r(Ce)(r(t))),1),P[0]||(P[0]=p("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(a(),u("button",{key:1,onClick:V},w(r(t).returnToTopLabel||"Return to top"),1)),k(de,{name:"flyout"},{default:f(()=>[s.value?(a(),u("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:_},[p("div",is,[p("a",{class:"top-link",href:"#",onClick:V},w(r(t).returnToTopLabel||"Return to top"),1)]),p("div",ls,[k(Be,{headers:b.headers},null,8,["headers"])])],512)):h("",!0)]),_:1})],4))}}),us=$(cs,[["__scopeId","data-v-bc9dc845"]]),ds={class:"container"},vs=["aria-expanded"],ps={class:"menu-text"},fs=m({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(o){const{theme:e,frontmatter:t}=L(),{hasSidebar:s}=U(),{headers:n}=as(),{y:i}=we(),l=T(0);z(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),x(()=>{n.value=_e(t.value.outline??e.value.outline)});const v=y(()=>n.value.length===0),d=y(()=>v.value&&!s.value),_=y(()=>({VPLocalNav:!0,"has-sidebar":s.value,empty:v.value,fixed:d.value}));return(V,b)=>r(t).layout!=="home"&&(!d.value||r(i)>=l.value)?(a(),u("div",{key:0,class:I(_.value)},[p("div",ds,[r(s)?(a(),u("button",{key:0,class:"menu","aria-expanded":V.open,"aria-controls":"VPSidebarNav",onClick:b[0]||(b[0]=P=>V.$emit("open-menu"))},[b[1]||(b[1]=p("span",{class:"vpi-align-left menu-icon"},null,-1)),p("span",ps,w(r(e).sidebarMenuLabel||"Menu"),1)],8,vs)):h("",!0),k(us,{headers:r(n),navHeight:l.value},null,8,["headers","navHeight"])])],2)):h("",!0)}}),hs=$(fs,[["__scopeId","data-v-070ab83d"]]);function ms(){const o=T(!1);function e(){o.value=!0,window.addEventListener("resize",n)}function t(){o.value=!1,window.removeEventListener("resize",n)}function s(){o.value?t():e()}function n(){window.outerWidth>=768&&t()}const i=ee();return F(()=>i.path,t),{isScreenOpen:o,openScreen:e,closeScreen:t,toggleScreen:s}}const _s={},bs={class:"VPSwitch",type:"button",role:"switch"},ks={class:"check"},gs={key:0,class:"icon"};function $s(o,e){return a(),u("button",bs,[p("span",ks,[o.$slots.default?(a(),u("span",gs,[c(o.$slots,"default",{},void 0,!0)])):h("",!0)])])}const ys=$(_s,[["render",$s],["__scopeId","data-v-4a1c76db"]]),Ps=m({__name:"VPSwitchAppearance",setup(o){const{isDark:e,theme:t}=L(),s=q("toggle-appearance",()=>{e.value=!e.value}),n=T("");return fe(()=>{n.value=e.value?t.value.lightModeSwitchTitle||"Switch to light theme":t.value.darkModeSwitchTitle||"Switch to dark theme"}),(i,l)=>(a(),g(ys,{title:n.value,class:"VPSwitchAppearance","aria-checked":r(e),onClick:r(s)},{default:f(()=>l[0]||(l[0]=[p("span",{class:"vpi-sun sun"},null,-1),p("span",{class:"vpi-moon moon"},null,-1)])),_:1},8,["title","aria-checked","onClick"]))}}),be=$(Ps,[["__scopeId","data-v-e40a8bb6"]]),Ss={key:0,class:"VPNavBarAppearance"},Vs=m({__name:"VPNavBarAppearance",setup(o){const{site:e}=L();return(t,s)=>r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),u("div",Ss,[k(be)])):h("",!0)}}),Ls=$(Vs,[["__scopeId","data-v-af096f4a"]]),ke=T();let He=!1,ae=0;function Ts(o){const e=T(!1);if(te){!He&&Ns(),ae++;const t=F(ke,s=>{var n,i,l;s===o.el.value||(n=o.el.value)!=null&&n.contains(s)?(e.value=!0,(i=o.onFocus)==null||i.call(o)):(e.value=!1,(l=o.onBlur)==null||l.call(o))});pe(()=>{t(),ae--,ae||ws()})}return qe(e)}function Ns(){document.addEventListener("focusin",Ee),He=!0,ke.value=document.activeElement}function ws(){document.removeEventListener("focusin",Ee)}function Ee(){ke.value=document.activeElement}const Is={class:"VPMenuLink"},Ms=m({__name:"VPMenuLink",props:{item:{}},setup(o){const{page:e}=L();return(t,s)=>(a(),u("div",Is,[k(D,{class:I({active:r(K)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:f(()=>[O(w(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}}),ne=$(Ms,[["__scopeId","data-v-8b74d055"]]),As={class:"VPMenuGroup"},Cs={key:0,class:"title"},Bs=m({__name:"VPMenuGroup",props:{text:{},items:{}},setup(o){return(e,t)=>(a(),u("div",As,[e.text?(a(),u("p",Cs,w(e.text),1)):h("",!0),(a(!0),u(M,null,B(e.items,s=>(a(),u(M,null,["link"in s?(a(),g(ne,{key:0,item:s},null,8,["item"])):h("",!0)],64))),256))]))}}),Hs=$(Bs,[["__scopeId","data-v-48c802d0"]]),Es={class:"VPMenu"},Ds={key:0,class:"items"},Fs=m({__name:"VPMenu",props:{items:{}},setup(o){return(e,t)=>(a(),u("div",Es,[e.items?(a(),u("div",Ds,[(a(!0),u(M,null,B(e.items,s=>(a(),u(M,{key:JSON.stringify(s)},["link"in s?(a(),g(ne,{key:0,item:s},null,8,["item"])):"component"in s?(a(),g(E(s.component),G({key:1,ref_for:!0},s.props),null,16)):(a(),g(Hs,{key:2,text:s.text,items:s.items},null,8,["text","items"]))],64))),128))])):h("",!0),c(e.$slots,"default",{},void 0,!0)]))}}),Os=$(Fs,[["__scopeId","data-v-7dd3104a"]]),Us=["aria-expanded","aria-label"],js={key:0,class:"text"},Gs=["innerHTML"],zs={key:1,class:"vpi-more-horizontal icon"},Ks={class:"menu"},Rs=m({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(o){const e=T(!1),t=T();Ts({el:t,onBlur:s});function s(){e.value=!1}return(n,i)=>(a(),u("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:i[1]||(i[1]=l=>e.value=!0),onMouseleave:i[2]||(i[2]=l=>e.value=!1)},[p("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":n.label,onClick:i[0]||(i[0]=l=>e.value=!e.value)},[n.button||n.icon?(a(),u("span",js,[n.icon?(a(),u("span",{key:0,class:I([n.icon,"option-icon"])},null,2)):h("",!0),n.button?(a(),u("span",{key:1,innerHTML:n.button},null,8,Gs)):h("",!0),i[3]||(i[3]=p("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(a(),u("span",zs))],8,Us),p("div",Ks,[k(Os,{items:n.items},{default:f(()=>[c(n.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),ge=$(Rs,[["__scopeId","data-v-e5380155"]]),Ws=["href","aria-label","innerHTML"],qs=m({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(o){const e=o,t=y(()=>typeof e.icon=="object"?e.icon.svg:``);return(s,n)=>(a(),u("a",{class:"VPSocialLink no-icon",href:s.link,"aria-label":s.ariaLabel??(typeof s.icon=="string"?s.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,Ws))}}),Js=$(qs,[["__scopeId","data-v-717b8b75"]]),Ys={class:"VPSocialLinks"},Xs=m({__name:"VPSocialLinks",props:{links:{}},setup(o){return(e,t)=>(a(),u("div",Ys,[(a(!0),u(M,null,B(e.links,({link:s,icon:n,ariaLabel:i})=>(a(),g(Js,{key:s,icon:n,link:s,ariaLabel:i},null,8,["icon","link","ariaLabel"]))),128))]))}}),$e=$(Xs,[["__scopeId","data-v-ee7a9424"]]),Qs={key:0,class:"group translations"},Zs={class:"trans-title"},xs={key:1,class:"group"},eo={class:"item appearance"},to={class:"label"},no={class:"appearance-action"},so={key:2,class:"group"},oo={class:"item social-links"},ao=m({__name:"VPNavBarExtra",setup(o){const{site:e,theme:t}=L(),{localeLinks:s,currentLang:n}=Y({correspondingLink:!0}),i=y(()=>s.value.length&&n.value.label||e.value.appearance||t.value.socialLinks);return(l,v)=>i.value?(a(),g(ge,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:f(()=>[r(s).length&&r(n).label?(a(),u("div",Qs,[p("p",Zs,w(r(n).label),1),(a(!0),u(M,null,B(r(s),d=>(a(),g(ne,{key:d.link,item:d},null,8,["item"]))),128))])):h("",!0),r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),u("div",xs,[p("div",eo,[p("p",to,w(r(t).darkModeSwitchLabel||"Appearance"),1),p("div",no,[k(be)])])])):h("",!0),r(t).socialLinks?(a(),u("div",so,[p("div",oo,[k($e,{class:"social-links-list",links:r(t).socialLinks},null,8,["links"])])])):h("",!0)]),_:1})):h("",!0)}}),ro=$(ao,[["__scopeId","data-v-925effce"]]),io=["aria-expanded"],lo=m({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(o){return(e,t)=>(a(),u("button",{type:"button",class:I(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=s=>e.$emit("click"))},t[1]||(t[1]=[p("span",{class:"container"},[p("span",{class:"top"}),p("span",{class:"middle"}),p("span",{class:"bottom"})],-1)]),10,io))}}),co=$(lo,[["__scopeId","data-v-5dea55bf"]]),uo=["innerHTML"],vo=m({__name:"VPNavBarMenuLink",props:{item:{}},setup(o){const{page:e}=L();return(t,s)=>(a(),g(D,{class:I({VPNavBarMenuLink:!0,active:r(K)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,noIcon:t.item.noIcon,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:f(()=>[p("span",{innerHTML:t.item.text},null,8,uo)]),_:1},8,["class","href","noIcon","target","rel"]))}}),po=$(vo,[["__scopeId","data-v-ed5ac1f6"]]),fo=m({__name:"VPNavBarMenuGroup",props:{item:{}},setup(o){const e=o,{page:t}=L(),s=i=>"component"in i?!1:"link"in i?K(t.value.relativePath,i.link,!!e.item.activeMatch):i.items.some(s),n=y(()=>s(e.item));return(i,l)=>(a(),g(ge,{class:I({VPNavBarMenuGroup:!0,active:r(K)(r(t).relativePath,i.item.activeMatch,!!i.item.activeMatch)||n.value}),button:i.item.text,items:i.item.items},null,8,["class","button","items"]))}}),ho={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},mo=m({__name:"VPNavBarMenu",setup(o){const{theme:e}=L();return(t,s)=>r(e).nav?(a(),u("nav",ho,[s[0]||(s[0]=p("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(a(!0),u(M,null,B(r(e).nav,n=>(a(),u(M,{key:JSON.stringify(n)},["link"in n?(a(),g(po,{key:0,item:n},null,8,["item"])):"component"in n?(a(),g(E(n.component),G({key:1,ref_for:!0},n.props),null,16)):(a(),g(fo,{key:2,item:n},null,8,["item"]))],64))),128))])):h("",!0)}}),_o=$(mo,[["__scopeId","data-v-e6d46098"]]);function bo(o){const{localeIndex:e,theme:t}=L();function s(n){var A,C,N;const i=n.split("."),l=(A=t.value.search)==null?void 0:A.options,v=l&&typeof l=="object",d=v&&((N=(C=l.locales)==null?void 0:C[e.value])==null?void 0:N.translations)||null,_=v&&l.translations||null;let V=d,b=_,P=o;const S=i.pop();for(const H of i){let j=null;const W=P==null?void 0:P[H];W&&(j=P=W);const se=b==null?void 0:b[H];se&&(j=b=se);const oe=V==null?void 0:V[H];oe&&(j=V=oe),W||(P=j),se||(b=j),oe||(V=j)}return(V==null?void 0:V[S])??(b==null?void 0:b[S])??(P==null?void 0:P[S])??""}return s}const ko=["aria-label"],go={class:"DocSearch-Button-Container"},$o={class:"DocSearch-Button-Placeholder"},ye=m({__name:"VPNavBarSearchButton",setup(o){const t=bo({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(s,n)=>(a(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":r(t)("button.buttonAriaLabel")},[p("span",go,[n[0]||(n[0]=p("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1)),p("span",$o,w(r(t)("button.buttonText")),1)]),n[1]||(n[1]=p("span",{class:"DocSearch-Button-Keys"},[p("kbd",{class:"DocSearch-Button-Key"}),p("kbd",{class:"DocSearch-Button-Key"},"K")],-1))],8,ko))}}),yo={class:"VPNavBarSearch"},Po={id:"local-search"},So={key:1,id:"docsearch"},Vo=m({__name:"VPNavBarSearch",setup(o){const e=Je(()=>Ye(()=>import("./VPLocalSearchBox.B4ckM-ik.js"),__vite__mapDeps([0,1]))),t=()=>null,{theme:s}=L(),n=T(!1),i=T(!1);z(()=>{});function l(){n.value||(n.value=!0,setTimeout(v,16))}function v(){const b=new Event("keydown");b.key="k",b.metaKey=!0,window.dispatchEvent(b),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||v()},16)}function d(b){const P=b.target,S=P.tagName;return P.isContentEditable||S==="INPUT"||S==="SELECT"||S==="TEXTAREA"}const _=T(!1);ie("k",b=>{(b.ctrlKey||b.metaKey)&&(b.preventDefault(),_.value=!0)}),ie("/",b=>{d(b)||(b.preventDefault(),_.value=!0)});const V="local";return(b,P)=>{var S;return a(),u("div",yo,[r(V)==="local"?(a(),u(M,{key:0},[_.value?(a(),g(r(e),{key:0,onClose:P[0]||(P[0]=A=>_.value=!1)})):h("",!0),p("div",Po,[k(ye,{onClick:P[1]||(P[1]=A=>_.value=!0)})])],64)):r(V)==="algolia"?(a(),u(M,{key:1},[n.value?(a(),g(r(t),{key:0,algolia:((S=r(s).search)==null?void 0:S.options)??r(s).algolia,onVnodeBeforeMount:P[2]||(P[2]=A=>i.value=!0)},null,8,["algolia"])):h("",!0),i.value?h("",!0):(a(),u("div",So,[k(ye,{onClick:l})]))],64)):h("",!0)])}}}),Lo=m({__name:"VPNavBarSocialLinks",setup(o){const{theme:e}=L();return(t,s)=>r(e).socialLinks?(a(),g($e,{key:0,class:"VPNavBarSocialLinks",links:r(e).socialLinks},null,8,["links"])):h("",!0)}}),To=$(Lo,[["__scopeId","data-v-164c457f"]]),No=["href","rel","target"],wo={key:1},Io={key:2},Mo=m({__name:"VPNavBarTitle",setup(o){const{site:e,theme:t}=L(),{hasSidebar:s}=U(),{currentLang:n}=Y(),i=y(()=>{var d;return typeof t.value.logoLink=="string"?t.value.logoLink:(d=t.value.logoLink)==null?void 0:d.link}),l=y(()=>{var d;return typeof t.value.logoLink=="string"||(d=t.value.logoLink)==null?void 0:d.rel}),v=y(()=>{var d;return typeof t.value.logoLink=="string"||(d=t.value.logoLink)==null?void 0:d.target});return(d,_)=>(a(),u("div",{class:I(["VPNavBarTitle",{"has-sidebar":r(s)}])},[p("a",{class:"title",href:i.value??r(me)(r(n).link),rel:l.value,target:v.value},[c(d.$slots,"nav-bar-title-before",{},void 0,!0),r(t).logo?(a(),g(Q,{key:0,class:"logo",image:r(t).logo},null,8,["image"])):h("",!0),r(t).siteTitle?(a(),u("span",wo,w(r(t).siteTitle),1)):r(t).siteTitle===void 0?(a(),u("span",Io,w(r(e).title),1)):h("",!0),c(d.$slots,"nav-bar-title-after",{},void 0,!0)],8,No)],2))}}),Ao=$(Mo,[["__scopeId","data-v-28a961f9"]]),Co={class:"items"},Bo={class:"title"},Ho=m({__name:"VPNavBarTranslations",setup(o){const{theme:e}=L(),{localeLinks:t,currentLang:s}=Y({correspondingLink:!0});return(n,i)=>r(t).length&&r(s).label?(a(),g(ge,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:r(e).langMenuLabel||"Change language"},{default:f(()=>[p("div",Co,[p("p",Bo,w(r(s).label),1),(a(!0),u(M,null,B(r(t),l=>(a(),g(ne,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):h("",!0)}}),Eo=$(Ho,[["__scopeId","data-v-c80d9ad0"]]),Do={class:"wrapper"},Fo={class:"container"},Oo={class:"title"},Uo={class:"content"},jo={class:"content-body"},Go=m({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(o){const e=o,{y:t}=we(),{hasSidebar:s}=U(),{frontmatter:n}=L(),i=T({});return fe(()=>{i.value={"has-sidebar":s.value,home:n.value.layout==="home",top:t.value===0,"screen-open":e.isScreenOpen}}),(l,v)=>(a(),u("div",{class:I(["VPNavBar",i.value])},[p("div",Do,[p("div",Fo,[p("div",Oo,[k(Ao,null,{"nav-bar-title-before":f(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),p("div",Uo,[p("div",jo,[c(l.$slots,"nav-bar-content-before",{},void 0,!0),k(Vo,{class:"search"}),k(_o,{class:"menu"}),k(Eo,{class:"translations"}),k(Ls,{class:"appearance"}),k(To,{class:"social-links"}),k(ro,{class:"extra"}),c(l.$slots,"nav-bar-content-after",{},void 0,!0),k(co,{class:"hamburger",active:l.isScreenOpen,onClick:v[0]||(v[0]=d=>l.$emit("toggle-screen"))},null,8,["active"])])])])]),v[1]||(v[1]=p("div",{class:"divider"},[p("div",{class:"divider-line"})],-1))],2))}}),zo=$(Go,[["__scopeId","data-v-822684d1"]]),Ko={key:0,class:"VPNavScreenAppearance"},Ro={class:"text"},Wo=m({__name:"VPNavScreenAppearance",setup(o){const{site:e,theme:t}=L();return(s,n)=>r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),u("div",Ko,[p("p",Ro,w(r(t).darkModeSwitchLabel||"Appearance"),1),k(be)])):h("",!0)}}),qo=$(Wo,[["__scopeId","data-v-ffb44008"]]),Jo=m({__name:"VPNavScreenMenuLink",props:{item:{}},setup(o){const e=q("close-screen");return(t,s)=>(a(),g(D,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e),innerHTML:t.item.text},null,8,["href","target","rel","onClick","innerHTML"]))}}),Yo=$(Jo,[["__scopeId","data-v-27d04aeb"]]),Xo=m({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(o){const e=q("close-screen");return(t,s)=>(a(),g(D,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e)},{default:f(()=>[O(w(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),De=$(Xo,[["__scopeId","data-v-7179dbb7"]]),Qo={class:"VPNavScreenMenuGroupSection"},Zo={key:0,class:"title"},xo=m({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(o){return(e,t)=>(a(),u("div",Qo,[e.text?(a(),u("p",Zo,w(e.text),1)):h("",!0),(a(!0),u(M,null,B(e.items,s=>(a(),g(De,{key:s.text,item:s},null,8,["item"]))),128))]))}}),ea=$(xo,[["__scopeId","data-v-4b8941ac"]]),ta=["aria-controls","aria-expanded"],na=["innerHTML"],sa=["id"],oa={key:0,class:"item"},aa={key:1,class:"item"},ra={key:2,class:"group"},ia=m({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(o){const e=o,t=T(!1),s=y(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function n(){t.value=!t.value}return(i,l)=>(a(),u("div",{class:I(["VPNavScreenMenuGroup",{open:t.value}])},[p("button",{class:"button","aria-controls":s.value,"aria-expanded":t.value,onClick:n},[p("span",{class:"button-text",innerHTML:i.text},null,8,na),l[0]||(l[0]=p("span",{class:"vpi-plus button-icon"},null,-1))],8,ta),p("div",{id:s.value,class:"items"},[(a(!0),u(M,null,B(i.items,v=>(a(),u(M,{key:JSON.stringify(v)},["link"in v?(a(),u("div",oa,[k(De,{item:v},null,8,["item"])])):"component"in v?(a(),u("div",aa,[(a(),g(E(v.component),G({ref_for:!0},v.props,{"screen-menu":""}),null,16))])):(a(),u("div",ra,[k(ea,{text:v.text,items:v.items},null,8,["text","items"])]))],64))),128))],8,sa)],2))}}),la=$(ia,[["__scopeId","data-v-875057a5"]]),ca={key:0,class:"VPNavScreenMenu"},ua=m({__name:"VPNavScreenMenu",setup(o){const{theme:e}=L();return(t,s)=>r(e).nav?(a(),u("nav",ca,[(a(!0),u(M,null,B(r(e).nav,n=>(a(),u(M,{key:JSON.stringify(n)},["link"in n?(a(),g(Yo,{key:0,item:n},null,8,["item"])):"component"in n?(a(),g(E(n.component),G({key:1,ref_for:!0},n.props,{"screen-menu":""}),null,16)):(a(),g(la,{key:2,text:n.text||"",items:n.items},null,8,["text","items"]))],64))),128))])):h("",!0)}}),da=m({__name:"VPNavScreenSocialLinks",setup(o){const{theme:e}=L();return(t,s)=>r(e).socialLinks?(a(),g($e,{key:0,class:"VPNavScreenSocialLinks",links:r(e).socialLinks},null,8,["links"])):h("",!0)}}),va={class:"list"},pa=m({__name:"VPNavScreenTranslations",setup(o){const{localeLinks:e,currentLang:t}=Y({correspondingLink:!0}),s=T(!1);function n(){s.value=!s.value}return(i,l)=>r(e).length&&r(t).label?(a(),u("div",{key:0,class:I(["VPNavScreenTranslations",{open:s.value}])},[p("button",{class:"title",onClick:n},[l[0]||(l[0]=p("span",{class:"vpi-languages icon lang"},null,-1)),O(" "+w(r(t).label)+" ",1),l[1]||(l[1]=p("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),p("ul",va,[(a(!0),u(M,null,B(r(e),v=>(a(),u("li",{key:v.link,class:"item"},[k(D,{class:"link",href:v.link},{default:f(()=>[O(w(v.text),1)]),_:2},1032,["href"])]))),128))])],2)):h("",!0)}}),fa=$(pa,[["__scopeId","data-v-362991c2"]]),ha={class:"container"},ma=m({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(o){const e=T(null),t=Ie(te?document.body:null);return(s,n)=>(a(),g(de,{name:"fade",onEnter:n[0]||(n[0]=i=>t.value=!0),onAfterLeave:n[1]||(n[1]=i=>t.value=!1)},{default:f(()=>[s.open?(a(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[p("div",ha,[c(s.$slots,"nav-screen-content-before",{},void 0,!0),k(ua,{class:"menu"}),k(fa,{class:"translations"}),k(qo,{class:"appearance"}),k(da,{class:"social-links"}),c(s.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):h("",!0)]),_:3}))}}),_a=$(ma,[["__scopeId","data-v-833aabba"]]),ba={key:0,class:"VPNav"},ka=m({__name:"VPNav",setup(o){const{isScreenOpen:e,closeScreen:t,toggleScreen:s}=ms(),{frontmatter:n}=L(),i=y(()=>n.value.navbar!==!1);return he("close-screen",t),Z(()=>{te&&document.documentElement.classList.toggle("hide-nav",!i.value)}),(l,v)=>i.value?(a(),u("header",ba,[k(zo,{"is-screen-open":r(e),onToggleScreen:r(s)},{"nav-bar-title-before":f(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":f(()=>[c(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":f(()=>[c(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),k(_a,{open:r(e)},{"nav-screen-content-before":f(()=>[c(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":f(()=>[c(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):h("",!0)}}),ga=$(ka,[["__scopeId","data-v-f1e365da"]]),$a=["role","tabindex"],ya={key:1,class:"items"},Pa=m({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(o){const e=o,{collapsed:t,collapsible:s,isLink:n,isActiveLink:i,hasActiveLink:l,hasChildren:v,toggle:d}=gt(y(()=>e.item)),_=y(()=>v.value?"section":"div"),V=y(()=>n.value?"a":"div"),b=y(()=>v.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),P=y(()=>n.value?void 0:"button"),S=y(()=>[[`level-${e.depth}`],{collapsible:s.value},{collapsed:t.value},{"is-link":n.value},{"is-active":i.value},{"has-active":l.value}]);function A(N){"key"in N&&N.key!=="Enter"||!e.item.link&&d()}function C(){e.item.link&&d()}return(N,H)=>{const j=R("VPSidebarItem",!0);return a(),g(E(_.value),{class:I(["VPSidebarItem",S.value])},{default:f(()=>[N.item.text?(a(),u("div",G({key:0,class:"item",role:P.value},Qe(N.item.items?{click:A,keydown:A}:{},!0),{tabindex:N.item.items&&0}),[H[1]||(H[1]=p("div",{class:"indicator"},null,-1)),N.item.link?(a(),g(D,{key:0,tag:V.value,class:"link",href:N.item.link,rel:N.item.rel,target:N.item.target},{default:f(()=>[(a(),g(E(b.value),{class:"text",innerHTML:N.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),g(E(b.value),{key:1,class:"text",innerHTML:N.item.text},null,8,["innerHTML"])),N.item.collapsed!=null&&N.item.items&&N.item.items.length?(a(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:C,onKeydown:Xe(C,["enter"]),tabindex:"0"},H[0]||(H[0]=[p("span",{class:"vpi-chevron-right caret-icon"},null,-1)]),32)):h("",!0)],16,$a)):h("",!0),N.item.items&&N.item.items.length?(a(),u("div",ya,[N.depth<5?(a(!0),u(M,{key:0},B(N.item.items,W=>(a(),g(j,{key:W.text,item:W,depth:N.depth+1},null,8,["item","depth"]))),128)):h("",!0)])):h("",!0)]),_:1},8,["class"])}}}),Sa=$(Pa,[["__scopeId","data-v-196b2e5f"]]),Va=m({__name:"VPSidebarGroup",props:{items:{}},setup(o){const e=T(!0);let t=null;return z(()=>{t=setTimeout(()=>{t=null,e.value=!1},300)}),Ze(()=>{t!=null&&(clearTimeout(t),t=null)}),(s,n)=>(a(!0),u(M,null,B(s.items,i=>(a(),u("div",{key:i.text,class:I(["group",{"no-transition":e.value}])},[k(Sa,{item:i,depth:0},null,8,["item"])],2))),128))}}),La=$(Va,[["__scopeId","data-v-9e426adc"]]),Ta={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Na=m({__name:"VPSidebar",props:{open:{type:Boolean}},setup(o){const{sidebarGroups:e,hasSidebar:t}=U(),s=o,n=T(null),i=Ie(te?document.body:null);F([s,n],()=>{var v;s.open?(i.value=!0,(v=n.value)==null||v.focus()):i.value=!1},{immediate:!0,flush:"post"});const l=T(0);return F(e,()=>{l.value+=1},{deep:!0}),(v,d)=>r(t)?(a(),u("aside",{key:0,class:I(["VPSidebar",{open:v.open}]),ref_key:"navEl",ref:n,onClick:d[0]||(d[0]=xe(()=>{},["stop"]))},[d[2]||(d[2]=p("div",{class:"curtain"},null,-1)),p("nav",Ta,[d[1]||(d[1]=p("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),c(v.$slots,"sidebar-nav-before",{},void 0,!0),(a(),g(La,{items:r(e),key:l.value},null,8,["items"])),c(v.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):h("",!0)}}),wa=$(Na,[["__scopeId","data-v-18756405"]]),Ia=m({__name:"VPSkipLink",setup(o){const e=ee(),t=T();F(()=>e.path,()=>t.value.focus());function s({target:n}){const i=document.getElementById(decodeURIComponent(n.hash).slice(1));if(i){const l=()=>{i.removeAttribute("tabindex"),i.removeEventListener("blur",l)};i.setAttribute("tabindex","-1"),i.addEventListener("blur",l),i.focus(),window.scrollTo(0,0)}}return(n,i)=>(a(),u(M,null,[p("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),p("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:s}," Skip to content ")],64))}}),Ma=$(Ia,[["__scopeId","data-v-c3508ec8"]]),Aa=m({__name:"Layout",setup(o){const{isOpen:e,open:t,close:s}=U(),n=ee();F(()=>n.path,s),kt(e,s);const{frontmatter:i}=L(),l=Me(),v=y(()=>!!l["home-hero-image"]);return he("hero-image-slot-exists",v),(d,_)=>{const V=R("Content");return r(i).layout!==!1?(a(),u("div",{key:0,class:I(["Layout",r(i).pageClass])},[c(d.$slots,"layout-top",{},void 0,!0),k(Ma),k(rt,{class:"backdrop",show:r(e),onClick:r(s)},null,8,["show","onClick"]),k(ga,null,{"nav-bar-title-before":f(()=>[c(d.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[c(d.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":f(()=>[c(d.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":f(()=>[c(d.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":f(()=>[c(d.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":f(()=>[c(d.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),k(hs,{open:r(e),onOpenMenu:r(t)},null,8,["open","onOpenMenu"]),k(wa,{open:r(e)},{"sidebar-nav-before":f(()=>[c(d.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":f(()=>[c(d.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),k(xn,null,{"page-top":f(()=>[c(d.$slots,"page-top",{},void 0,!0)]),"page-bottom":f(()=>[c(d.$slots,"page-bottom",{},void 0,!0)]),"not-found":f(()=>[c(d.$slots,"not-found",{},void 0,!0)]),"home-hero-before":f(()=>[c(d.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":f(()=>[c(d.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[c(d.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[c(d.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[c(d.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[c(d.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":f(()=>[c(d.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":f(()=>[c(d.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":f(()=>[c(d.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":f(()=>[c(d.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":f(()=>[c(d.$slots,"doc-before",{},void 0,!0)]),"doc-after":f(()=>[c(d.$slots,"doc-after",{},void 0,!0)]),"doc-top":f(()=>[c(d.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":f(()=>[c(d.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":f(()=>[c(d.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":f(()=>[c(d.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":f(()=>[c(d.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[c(d.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[c(d.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[c(d.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),k(os),c(d.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),g(V,{key:1}))}}}),Ca=$(Aa,[["__scopeId","data-v-a9a9e638"]]),Pe={Layout:Ca,enhanceApp:({app:o})=>{o.component("Badge",st)}},Ba=o=>{if(typeof document>"u")return{stabilizeScrollPosition:n=>async(...i)=>n(...i)};const e=document.documentElement;return{stabilizeScrollPosition:s=>async(...n)=>{const i=s(...n),l=o.value;if(!l)return i;const v=l.offsetTop-e.scrollTop;return await Ne(),e.scrollTop=l.offsetTop-v,i}}},Fe="vitepress:tabSharedState",J=typeof localStorage<"u"?localStorage:null,Oe="vitepress:tabsSharedState",Ha=()=>{const o=J==null?void 0:J.getItem(Oe);if(o)try{return JSON.parse(o)}catch{}return{}},Ea=o=>{J&&J.setItem(Oe,JSON.stringify(o))},Da=o=>{const e=et({});F(()=>e.content,(t,s)=>{t&&s&&Ea(t)},{deep:!0}),o.provide(Fe,e)},Fa=(o,e)=>{const t=q(Fe);if(!t)throw new Error("[vitepress-plugin-tabs] TabsSharedState should be injected");z(()=>{t.content||(t.content=Ha())});const s=T(),n=y({get(){var d;const l=e.value,v=o.value;if(l){const _=(d=t.content)==null?void 0:d[l];if(_&&v.includes(_))return _}else{const _=s.value;if(_)return _}return v[0]},set(l){const v=e.value;v?t.content&&(t.content[v]=l):s.value=l}});return{selected:n,select:l=>{n.value=l}}};let Se=0;const Oa=()=>(Se++,""+Se);function Ua(){const o=Me();return y(()=>{var s;const t=(s=o.default)==null?void 0:s.call(o);return t?t.filter(n=>typeof n.type=="object"&&"__name"in n.type&&n.type.__name==="PluginTabsTab"&&n.props).map(n=>{var i;return(i=n.props)==null?void 0:i.label}):[]})}const Ue="vitepress:tabSingleState",ja=o=>{he(Ue,o)},Ga=()=>{const o=q(Ue);if(!o)throw new Error("[vitepress-plugin-tabs] TabsSingleState should be injected");return o},za={class:"plugin-tabs"},Ka=["id","aria-selected","aria-controls","tabindex","onClick"],Ra=m({__name:"PluginTabs",props:{sharedStateKey:{}},setup(o){const e=o,t=Ua(),{selected:s,select:n}=Fa(t,tt(e,"sharedStateKey")),i=T(),{stabilizeScrollPosition:l}=Ba(i),v=l(n),d=T([]),_=b=>{var A;const P=t.value.indexOf(s.value);let S;b.key==="ArrowLeft"?S=P>=1?P-1:t.value.length-1:b.key==="ArrowRight"&&(S=P(a(),u("div",za,[p("div",{ref_key:"tablist",ref:i,class:"plugin-tabs--tab-list",role:"tablist",onKeydown:_},[(a(!0),u(M,null,B(r(t),S=>(a(),u("button",{id:`tab-${S}-${r(V)}`,ref_for:!0,ref_key:"buttonRefs",ref:d,key:S,role:"tab",class:"plugin-tabs--tab","aria-selected":S===r(s),"aria-controls":`panel-${S}-${r(V)}`,tabindex:S===r(s)?0:-1,onClick:()=>r(v)(S)},w(S),9,Ka))),128))],544),c(b.$slots,"default")]))}}),Wa=["id","aria-labelledby"],qa=m({__name:"PluginTabsTab",props:{label:{}},setup(o){const{uid:e,selected:t}=Ga();return(s,n)=>r(t)===s.label?(a(),u("div",{key:0,id:`panel-${s.label}-${r(e)}`,class:"plugin-tabs--content",role:"tabpanel",tabindex:"0","aria-labelledby":`tab-${s.label}-${r(e)}`},[c(s.$slots,"default",{},void 0,!0)],8,Wa)):h("",!0)}}),Ja=$(qa,[["__scopeId","data-v-9b0d03d2"]]),Ya=o=>{Da(o),o.component("PluginTabs",Ra),o.component("PluginTabsTab",Ja)},Qa={extends:Pe,Layout(){return nt(Pe.Layout,null,{})},enhanceApp({app:o,router:e,siteData:t}){Ya(o)}};export{Qa as R,bo as c,L as u}; diff --git a/dev/assets/chunks/theme.CtZIydQx.js b/dev/assets/chunks/theme.CtZIydQx.js deleted file mode 100644 index 53b25c8..0000000 --- a/dev/assets/chunks/theme.CtZIydQx.js +++ /dev/null @@ -1,2 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPLocalSearchBox.DJfC04nF.js","assets/chunks/framework.CBLuZwrP.js"])))=>i.map(i=>d[i]); -import{d as _,o as a,c as u,r as c,n as N,a as j,t as I,b as $,w as f,e as h,T as pe,_ as g,u as Je,i as Ye,f as Xe,g as fe,h as y,j as p,k as r,p as B,l as H,m as q,q as le,s as T,v as O,x as ee,y as R,z as he,A as _e,B as Qe,C as Ze,D as W,F as M,E,G as Te,H as te,I as k,J as D,K as we,L as ne,M as K,N as Y,O as xe,P as Ie,Q as ce,R as Ne,S as Me,U as oe,V as et,W as tt,X as nt,Y as Ae,Z as me,$ as ot,a0 as st,a1 as at,a2 as rt,a3 as Ce,a4 as it,a5 as lt,a6 as ct}from"./framework.CBLuZwrP.js";const ut=_({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(n){return(e,t)=>(a(),u("span",{class:N(["VPBadge",e.type])},[c(e.$slots,"default",{},()=>[j(I(e.text),1)])],2))}}),dt={key:0,class:"VPBackdrop"},vt=_({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(n){return(e,t)=>(a(),$(pe,{name:"fade"},{default:f(()=>[e.show?(a(),u("div",dt)):h("",!0)]),_:1}))}}),pt=g(vt,[["__scopeId","data-v-b06cdb19"]]),V=Je;function ft(n,e){let t,s=!1;return()=>{t&&clearTimeout(t),s?t=setTimeout(n,e):(n(),(s=!0)&&setTimeout(()=>s=!1,e))}}function ue(n){return/^\//.test(n)?n:`/${n}`}function be(n){const{pathname:e,search:t,hash:s,protocol:o}=new URL(n,"http://a.com");if(Ye(n)||n.startsWith("#")||!o.startsWith("http")||!Xe(e))return n;const{site:i}=V(),l=e.endsWith("/")||e.endsWith(".html")?n:n.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,i.value.cleanUrls?"":".html")}${t}${s}`);return fe(l)}function Q({correspondingLink:n=!1}={}){const{site:e,localeIndex:t,page:s,theme:o,hash:i}=V(),l=y(()=>{var v,m;return{label:(v=e.value.locales[t.value])==null?void 0:v.label,link:((m=e.value.locales[t.value])==null?void 0:m.link)||(t.value==="root"?"/":`/${t.value}/`)}});return{localeLinks:y(()=>Object.entries(e.value.locales).flatMap(([v,m])=>l.value.label===m.label?[]:{text:m.label,link:ht(m.link||(v==="root"?"/":`/${v}/`),o.value.i18nRouting!==!1&&n,s.value.relativePath.slice(l.value.link.length-1),!e.value.cleanUrls)+i.value})),currentLang:l}}function ht(n,e,t,s){return e?n.replace(/\/$/,"")+ue(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,s?".html":"")):n}const _t=n=>(B("data-v-951cab6c"),n=n(),H(),n),mt={class:"NotFound"},bt={class:"code"},kt={class:"title"},$t=_t(()=>p("div",{class:"divider"},null,-1)),gt={class:"quote"},yt={class:"action"},Pt=["href","aria-label"],St=_({__name:"NotFound",setup(n){const{theme:e}=V(),{currentLang:t}=Q();return(s,o)=>{var i,l,d,v,m;return a(),u("div",mt,[p("p",bt,I(((i=r(e).notFound)==null?void 0:i.code)??"404"),1),p("h1",kt,I(((l=r(e).notFound)==null?void 0:l.title)??"PAGE NOT FOUND"),1),$t,p("blockquote",gt,I(((d=r(e).notFound)==null?void 0:d.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),p("div",yt,[p("a",{class:"link",href:r(fe)(r(t).link),"aria-label":((v=r(e).notFound)==null?void 0:v.linkLabel)??"go to home"},I(((m=r(e).notFound)==null?void 0:m.linkText)??"Take me home"),9,Pt)])])}}}),Vt=g(St,[["__scopeId","data-v-951cab6c"]]);function Be(n,e){if(Array.isArray(n))return Z(n);if(n==null)return[];e=ue(e);const t=Object.keys(n).sort((o,i)=>i.split("/").length-o.split("/").length).find(o=>e.startsWith(ue(o))),s=t?n[t]:[];return Array.isArray(s)?Z(s):Z(s.items,s.base)}function Lt(n){const e=[];let t=0;for(const s in n){const o=n[s];if(o.items){t=e.push(o);continue}e[t]||e.push({items:[]}),e[t].items.push(o)}return e}function Tt(n){const e=[];function t(s){for(const o of s)o.text&&o.link&&e.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&t(o.items)}return t(n),e}function de(n,e){return Array.isArray(e)?e.some(t=>de(n,t)):q(n,e.link)?!0:e.items?de(n,e.items):!1}function Z(n,e){return[...n].map(t=>{const s={...t},o=s.base||e;return o&&s.link&&(s.link=o+s.link),s.items&&(s.items=Z(s.items,o)),s})}function U(){const{frontmatter:n,page:e,theme:t}=V(),s=le("(min-width: 960px)"),o=T(!1),i=y(()=>{const C=t.value.sidebar,w=e.value.relativePath;return C?Be(C,w):[]}),l=T(i.value);O(i,(C,w)=>{JSON.stringify(C)!==JSON.stringify(w)&&(l.value=i.value)});const d=y(()=>n.value.sidebar!==!1&&l.value.length>0&&n.value.layout!=="home"),v=y(()=>m?n.value.aside==null?t.value.aside==="left":n.value.aside==="left":!1),m=y(()=>n.value.layout==="home"?!1:n.value.aside!=null?!!n.value.aside:t.value.aside!==!1),L=y(()=>d.value&&s.value),b=y(()=>d.value?Lt(l.value):[]);function P(){o.value=!0}function S(){o.value=!1}function A(){o.value?S():P()}return{isOpen:o,sidebar:l,sidebarGroups:b,hasSidebar:d,hasAside:m,leftAside:v,isSidebarEnabled:L,open:P,close:S,toggle:A}}function wt(n,e){let t;ee(()=>{t=n.value?document.activeElement:void 0}),R(()=>{window.addEventListener("keyup",s)}),he(()=>{window.removeEventListener("keyup",s)});function s(o){o.key==="Escape"&&n.value&&(e(),t==null||t.focus())}}function It(n){const{page:e,hash:t}=V(),s=T(!1),o=y(()=>n.value.collapsed!=null),i=y(()=>!!n.value.link),l=T(!1),d=()=>{l.value=q(e.value.relativePath,n.value.link)};O([e,n,t],d),R(d);const v=y(()=>l.value?!0:n.value.items?de(e.value.relativePath,n.value.items):!1),m=y(()=>!!(n.value.items&&n.value.items.length));ee(()=>{s.value=!!(o.value&&n.value.collapsed)}),_e(()=>{(l.value||v.value)&&(s.value=!1)});function L(){o.value&&(s.value=!s.value)}return{collapsed:s,collapsible:o,isLink:i,isActiveLink:l,hasActiveLink:v,hasChildren:m,toggle:L}}function Nt(){const{hasSidebar:n}=U(),e=le("(min-width: 960px)"),t=le("(min-width: 1280px)");return{isAsideEnabled:y(()=>!t.value&&!e.value?!1:n.value?t.value:e.value)}}const ve=[];function He(n){return typeof n.outline=="object"&&!Array.isArray(n.outline)&&n.outline.label||n.outlineTitle||"On this page"}function ke(n){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const s=Number(t.tagName[1]);return{element:t,title:Mt(t),link:"#"+t.id,level:s}});return At(e,n)}function Mt(n){let e="";for(const t of n.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor")||t.classList.contains("ignore-header"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function At(n,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[s,o]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;n=n.filter(l=>l.level>=s&&l.level<=o),ve.length=0;for(const{element:l,link:d}of n)ve.push({element:l,link:d});const i=[];e:for(let l=0;l=0;v--){const m=n[v];if(m.level{requestAnimationFrame(i),window.addEventListener("scroll",s)}),Qe(()=>{l(location.hash)}),he(()=>{window.removeEventListener("scroll",s)});function i(){if(!t.value)return;const d=window.scrollY,v=window.innerHeight,m=document.body.offsetHeight,L=Math.abs(d+v-m)<1,b=ve.map(({element:S,link:A})=>({link:A,top:Bt(S)})).filter(({top:S})=>!Number.isNaN(S)).sort((S,A)=>S.top-A.top);if(!b.length){l(null);return}if(d<1){l(null);return}if(L){l(b[b.length-1].link);return}let P=null;for(const{link:S,top:A}of b){if(A>d+Ze()+4)break;P=S}l(P)}function l(d){o&&o.classList.remove("active"),d==null?o=null:o=n.value.querySelector(`a[href="${decodeURIComponent(d)}"]`);const v=o;v?(v.classList.add("active"),e.value.style.top=v.offsetTop+39+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function Bt(n){let e=0;for(;n!==document.body;){if(n===null)return NaN;e+=n.offsetTop,n=n.offsetParent}return e}const Ht=["href","title"],Et=_({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(n){function e({target:t}){const s=t.href.split("#")[1],o=document.getElementById(decodeURIComponent(s));o==null||o.focus({preventScroll:!0})}return(t,s)=>{const o=W("VPDocOutlineItem",!0);return a(),u("ul",{class:N(["VPDocOutlineItem",t.root?"root":"nested"])},[(a(!0),u(M,null,E(t.headers,({children:i,link:l,title:d})=>(a(),u("li",null,[p("a",{class:"outline-link",href:l,onClick:e,title:d},I(d),9,Ht),i!=null&&i.length?(a(),$(o,{key:0,headers:i},null,8,["headers"])):h("",!0)]))),256))],2)}}}),Ee=g(Et,[["__scopeId","data-v-3f927ebe"]]),Dt={class:"content"},Ft={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},Ot=_({__name:"VPDocAsideOutline",setup(n){const{frontmatter:e,theme:t}=V(),s=Te([]);te(()=>{s.value=ke(e.value.outline??t.value.outline)});const o=T(),i=T();return Ct(o,i),(l,d)=>(a(),u("nav",{"aria-labelledby":"doc-outline-aria-label",class:N(["VPDocAsideOutline",{"has-outline":s.value.length>0}]),ref_key:"container",ref:o},[p("div",Dt,[p("div",{class:"outline-marker",ref_key:"marker",ref:i},null,512),p("div",Ft,I(r(He)(r(t))),1),k(Ee,{headers:s.value,root:!0},null,8,["headers"])])],2))}}),jt=g(Ot,[["__scopeId","data-v-b38bf2ff"]]),Ut={class:"VPDocAsideCarbonAds"},Gt=_({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(n){const e=()=>null;return(t,s)=>(a(),u("div",Ut,[k(r(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),zt=n=>(B("data-v-6d7b3c46"),n=n(),H(),n),Kt={class:"VPDocAside"},Rt=zt(()=>p("div",{class:"spacer"},null,-1)),qt=_({__name:"VPDocAside",setup(n){const{theme:e}=V();return(t,s)=>(a(),u("div",Kt,[c(t.$slots,"aside-top",{},void 0,!0),c(t.$slots,"aside-outline-before",{},void 0,!0),k(jt),c(t.$slots,"aside-outline-after",{},void 0,!0),Rt,c(t.$slots,"aside-ads-before",{},void 0,!0),r(e).carbonAds?(a(),$(Gt,{key:0,"carbon-ads":r(e).carbonAds},null,8,["carbon-ads"])):h("",!0),c(t.$slots,"aside-ads-after",{},void 0,!0),c(t.$slots,"aside-bottom",{},void 0,!0)]))}}),Wt=g(qt,[["__scopeId","data-v-6d7b3c46"]]);function Jt(){const{theme:n,page:e}=V();return y(()=>{const{text:t="Edit this page",pattern:s=""}=n.value.editLink||{};let o;return typeof s=="function"?o=s(e.value):o=s.replace(/:path/g,e.value.filePath),{url:o,text:t}})}function Yt(){const{page:n,theme:e,frontmatter:t}=V();return y(()=>{var m,L,b,P,S,A,C,w;const s=Be(e.value.sidebar,n.value.relativePath),o=Tt(s),i=Xt(o,G=>G.link.replace(/[?#].*$/,"")),l=i.findIndex(G=>q(n.value.relativePath,G.link)),d=((m=e.value.docFooter)==null?void 0:m.prev)===!1&&!t.value.prev||t.value.prev===!1,v=((L=e.value.docFooter)==null?void 0:L.next)===!1&&!t.value.next||t.value.next===!1;return{prev:d?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((b=i[l-1])==null?void 0:b.docFooterText)??((P=i[l-1])==null?void 0:P.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((S=i[l-1])==null?void 0:S.link)},next:v?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((A=i[l+1])==null?void 0:A.docFooterText)??((C=i[l+1])==null?void 0:C.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((w=i[l+1])==null?void 0:w.link)}}})}function Xt(n,e){const t=new Set;return n.filter(s=>{const o=e(s);return t.has(o)?!1:t.add(o)})}const F=_({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(n){const e=n,t=y(()=>e.tag??(e.href?"a":"span")),s=y(()=>e.href&&we.test(e.href)||e.target==="_blank");return(o,i)=>(a(),$(D(t.value),{class:N(["VPLink",{link:o.href,"vp-external-link-icon":s.value,"no-icon":o.noIcon}]),href:o.href?r(be)(o.href):void 0,target:o.target??(s.value?"_blank":void 0),rel:o.rel??(s.value?"noreferrer":void 0)},{default:f(()=>[c(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Qt={class:"VPLastUpdated"},Zt=["datetime"],xt=_({__name:"VPDocFooterLastUpdated",setup(n){const{theme:e,page:t,lang:s}=V(),o=y(()=>new Date(t.value.lastUpdated)),i=y(()=>o.value.toISOString()),l=T("");return R(()=>{ee(()=>{var d,v,m;l.value=new Intl.DateTimeFormat((v=(d=e.value.lastUpdated)==null?void 0:d.formatOptions)!=null&&v.forceLocale?s.value:void 0,((m=e.value.lastUpdated)==null?void 0:m.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(o.value)})}),(d,v)=>{var m;return a(),u("p",Qt,[j(I(((m=r(e).lastUpdated)==null?void 0:m.text)||r(e).lastUpdatedText||"Last updated")+": ",1),p("time",{datetime:i.value},I(l.value),9,Zt)])}}}),en=g(xt,[["__scopeId","data-v-475f71b8"]]),De=n=>(B("data-v-4f9813fa"),n=n(),H(),n),tn={key:0,class:"VPDocFooter"},nn={key:0,class:"edit-info"},on={key:0,class:"edit-link"},sn=De(()=>p("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),an={key:1,class:"last-updated"},rn={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},ln=De(()=>p("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),cn={class:"pager"},un=["innerHTML"],dn=["innerHTML"],vn={class:"pager"},pn=["innerHTML"],fn=["innerHTML"],hn=_({__name:"VPDocFooter",setup(n){const{theme:e,page:t,frontmatter:s}=V(),o=Jt(),i=Yt(),l=y(()=>e.value.editLink&&s.value.editLink!==!1),d=y(()=>t.value.lastUpdated),v=y(()=>l.value||d.value||i.value.prev||i.value.next);return(m,L)=>{var b,P,S,A;return v.value?(a(),u("footer",tn,[c(m.$slots,"doc-footer-before",{},void 0,!0),l.value||d.value?(a(),u("div",nn,[l.value?(a(),u("div",on,[k(F,{class:"edit-link-button",href:r(o).url,"no-icon":!0},{default:f(()=>[sn,j(" "+I(r(o).text),1)]),_:1},8,["href"])])):h("",!0),d.value?(a(),u("div",an,[k(en)])):h("",!0)])):h("",!0),(b=r(i).prev)!=null&&b.link||(P=r(i).next)!=null&&P.link?(a(),u("nav",rn,[ln,p("div",cn,[(S=r(i).prev)!=null&&S.link?(a(),$(F,{key:0,class:"pager-link prev",href:r(i).prev.link},{default:f(()=>{var C;return[p("span",{class:"desc",innerHTML:((C=r(e).docFooter)==null?void 0:C.prev)||"Previous page"},null,8,un),p("span",{class:"title",innerHTML:r(i).prev.text},null,8,dn)]}),_:1},8,["href"])):h("",!0)]),p("div",vn,[(A=r(i).next)!=null&&A.link?(a(),$(F,{key:0,class:"pager-link next",href:r(i).next.link},{default:f(()=>{var C;return[p("span",{class:"desc",innerHTML:((C=r(e).docFooter)==null?void 0:C.next)||"Next page"},null,8,pn),p("span",{class:"title",innerHTML:r(i).next.text},null,8,fn)]}),_:1},8,["href"])):h("",!0)])])):h("",!0)])):h("",!0)}}}),_n=g(hn,[["__scopeId","data-v-4f9813fa"]]),mn=n=>(B("data-v-83890dd9"),n=n(),H(),n),bn={class:"container"},kn=mn(()=>p("div",{class:"aside-curtain"},null,-1)),$n={class:"aside-container"},gn={class:"aside-content"},yn={class:"content"},Pn={class:"content-container"},Sn={class:"main"},Vn=_({__name:"VPDoc",setup(n){const{theme:e}=V(),t=ne(),{hasSidebar:s,hasAside:o,leftAside:i}=U(),l=y(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(d,v)=>{const m=W("Content");return a(),u("div",{class:N(["VPDoc",{"has-sidebar":r(s),"has-aside":r(o)}])},[c(d.$slots,"doc-top",{},void 0,!0),p("div",bn,[r(o)?(a(),u("div",{key:0,class:N(["aside",{"left-aside":r(i)}])},[kn,p("div",$n,[p("div",gn,[k(Wt,null,{"aside-top":f(()=>[c(d.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":f(()=>[c(d.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":f(()=>[c(d.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[c(d.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[c(d.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[c(d.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):h("",!0),p("div",yn,[p("div",Pn,[c(d.$slots,"doc-before",{},void 0,!0),p("main",Sn,[k(m,{class:N(["vp-doc",[l.value,r(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),k(_n,null,{"doc-footer-before":f(()=>[c(d.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),c(d.$slots,"doc-after",{},void 0,!0)])])]),c(d.$slots,"doc-bottom",{},void 0,!0)],2)}}}),Ln=g(Vn,[["__scopeId","data-v-83890dd9"]]),Tn=_({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(n){const e=n,t=y(()=>e.href&&we.test(e.href)),s=y(()=>e.tag||e.href?"a":"button");return(o,i)=>(a(),$(D(s.value),{class:N(["VPButton",[o.size,o.theme]]),href:o.href?r(be)(o.href):void 0,target:e.target??(t.value?"_blank":void 0),rel:e.rel??(t.value?"noreferrer":void 0)},{default:f(()=>[j(I(o.text),1)]),_:1},8,["class","href","target","rel"]))}}),wn=g(Tn,[["__scopeId","data-v-14206e74"]]),In=["src","alt"],Nn=_({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(n){return(e,t)=>{const s=W("VPImage",!0);return e.image?(a(),u(M,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),u("img",K({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:r(fe)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,In)):(a(),u(M,{key:1},[k(s,K({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),k(s,K({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):h("",!0)}}}),x=g(Nn,[["__scopeId","data-v-35a7d0b8"]]),Mn=n=>(B("data-v-955009fc"),n=n(),H(),n),An={class:"container"},Cn={class:"main"},Bn={key:0,class:"name"},Hn=["innerHTML"],En=["innerHTML"],Dn=["innerHTML"],Fn={key:0,class:"actions"},On={key:0,class:"image"},jn={class:"image-container"},Un=Mn(()=>p("div",{class:"image-bg"},null,-1)),Gn=_({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(n){const e=Y("hero-image-slot-exists");return(t,s)=>(a(),u("div",{class:N(["VPHero",{"has-image":t.image||r(e)}])},[p("div",An,[p("div",Cn,[c(t.$slots,"home-hero-info-before",{},void 0,!0),c(t.$slots,"home-hero-info",{},()=>[t.name?(a(),u("h1",Bn,[p("span",{innerHTML:t.name,class:"clip"},null,8,Hn)])):h("",!0),t.text?(a(),u("p",{key:1,innerHTML:t.text,class:"text"},null,8,En)):h("",!0),t.tagline?(a(),u("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,Dn)):h("",!0)],!0),c(t.$slots,"home-hero-info-after",{},void 0,!0),t.actions?(a(),u("div",Fn,[(a(!0),u(M,null,E(t.actions,o=>(a(),u("div",{key:o.link,class:"action"},[k(wn,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link,target:o.target,rel:o.rel},null,8,["theme","text","href","target","rel"])]))),128))])):h("",!0),c(t.$slots,"home-hero-actions-after",{},void 0,!0)]),t.image||r(e)?(a(),u("div",On,[p("div",jn,[Un,c(t.$slots,"home-hero-image",{},()=>[t.image?(a(),$(x,{key:0,class:"image-src",image:t.image},null,8,["image"])):h("",!0)],!0)])])):h("",!0)])],2))}}),zn=g(Gn,[["__scopeId","data-v-955009fc"]]),Kn=_({__name:"VPHomeHero",setup(n){const{frontmatter:e}=V();return(t,s)=>r(e).hero?(a(),$(zn,{key:0,class:"VPHomeHero",name:r(e).hero.name,text:r(e).hero.text,tagline:r(e).hero.tagline,image:r(e).hero.image,actions:r(e).hero.actions},{"home-hero-info-before":f(()=>[c(t.$slots,"home-hero-info-before")]),"home-hero-info":f(()=>[c(t.$slots,"home-hero-info")]),"home-hero-info-after":f(()=>[c(t.$slots,"home-hero-info-after")]),"home-hero-actions-after":f(()=>[c(t.$slots,"home-hero-actions-after")]),"home-hero-image":f(()=>[c(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):h("",!0)}}),Rn=n=>(B("data-v-f5e9645b"),n=n(),H(),n),qn={class:"box"},Wn={key:0,class:"icon"},Jn=["innerHTML"],Yn=["innerHTML"],Xn=["innerHTML"],Qn={key:4,class:"link-text"},Zn={class:"link-text-value"},xn=Rn(()=>p("span",{class:"vpi-arrow-right link-text-icon"},null,-1)),eo=_({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(n){return(e,t)=>(a(),$(F,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:f(()=>[p("article",qn,[typeof e.icon=="object"&&e.icon.wrap?(a(),u("div",Wn,[k(x,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(a(),$(x,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(a(),u("div",{key:2,class:"icon",innerHTML:e.icon},null,8,Jn)):h("",!0),p("h2",{class:"title",innerHTML:e.title},null,8,Yn),e.details?(a(),u("p",{key:3,class:"details",innerHTML:e.details},null,8,Xn)):h("",!0),e.linkText?(a(),u("div",Qn,[p("p",Zn,[j(I(e.linkText)+" ",1),xn])])):h("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),to=g(eo,[["__scopeId","data-v-f5e9645b"]]),no={key:0,class:"VPFeatures"},oo={class:"container"},so={class:"items"},ao=_({__name:"VPFeatures",props:{features:{}},setup(n){const e=n,t=y(()=>{const s=e.features.length;if(s){if(s===2)return"grid-2";if(s===3)return"grid-3";if(s%3===0)return"grid-6";if(s>3)return"grid-4"}else return});return(s,o)=>s.features?(a(),u("div",no,[p("div",oo,[p("div",so,[(a(!0),u(M,null,E(s.features,i=>(a(),u("div",{key:i.title,class:N(["item",[t.value]])},[k(to,{icon:i.icon,title:i.title,details:i.details,link:i.link,"link-text":i.linkText,rel:i.rel,target:i.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):h("",!0)}}),ro=g(ao,[["__scopeId","data-v-d0a190d7"]]),io=_({__name:"VPHomeFeatures",setup(n){const{frontmatter:e}=V();return(t,s)=>r(e).features?(a(),$(ro,{key:0,class:"VPHomeFeatures",features:r(e).features},null,8,["features"])):h("",!0)}}),lo=_({__name:"VPHomeContent",setup(n){const{width:e}=xe({initialWidth:0,includeScrollbar:!1});return(t,s)=>(a(),u("div",{class:"vp-doc container",style:Ie(r(e)?{"--vp-offset":`calc(50% - ${r(e)/2}px)`}:{})},[c(t.$slots,"default",{},void 0,!0)],4))}}),co=g(lo,[["__scopeId","data-v-7a48a447"]]),uo={class:"VPHome"},vo=_({__name:"VPHome",setup(n){const{frontmatter:e}=V();return(t,s)=>{const o=W("Content");return a(),u("div",uo,[c(t.$slots,"home-hero-before",{},void 0,!0),k(Kn,null,{"home-hero-info-before":f(()=>[c(t.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[c(t.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[c(t.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[c(t.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[c(t.$slots,"home-hero-image",{},void 0,!0)]),_:3}),c(t.$slots,"home-hero-after",{},void 0,!0),c(t.$slots,"home-features-before",{},void 0,!0),k(io),c(t.$slots,"home-features-after",{},void 0,!0),r(e).markdownStyles!==!1?(a(),$(co,{key:0},{default:f(()=>[k(o)]),_:1})):(a(),$(o,{key:1}))])}}}),po=g(vo,[["__scopeId","data-v-cbb6ec48"]]),fo={},ho={class:"VPPage"};function _o(n,e){const t=W("Content");return a(),u("div",ho,[c(n.$slots,"page-top"),k(t),c(n.$slots,"page-bottom")])}const mo=g(fo,[["render",_o]]),bo=_({__name:"VPContent",setup(n){const{page:e,frontmatter:t}=V(),{hasSidebar:s}=U();return(o,i)=>(a(),u("div",{class:N(["VPContent",{"has-sidebar":r(s),"is-home":r(t).layout==="home"}]),id:"VPContent"},[r(e).isNotFound?c(o.$slots,"not-found",{key:0},()=>[k(Vt)],!0):r(t).layout==="page"?(a(),$(mo,{key:1},{"page-top":f(()=>[c(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":f(()=>[c(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):r(t).layout==="home"?(a(),$(po,{key:2},{"home-hero-before":f(()=>[c(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":f(()=>[c(o.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[c(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[c(o.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[c(o.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[c(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":f(()=>[c(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":f(()=>[c(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":f(()=>[c(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):r(t).layout&&r(t).layout!=="doc"?(a(),$(D(r(t).layout),{key:3})):(a(),$(Ln,{key:4},{"doc-top":f(()=>[c(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":f(()=>[c(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":f(()=>[c(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":f(()=>[c(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":f(()=>[c(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":f(()=>[c(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":f(()=>[c(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[c(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[c(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[c(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":f(()=>[c(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),ko=g(bo,[["__scopeId","data-v-91765379"]]),$o={class:"container"},go=["innerHTML"],yo=["innerHTML"],Po=_({__name:"VPFooter",setup(n){const{theme:e,frontmatter:t}=V(),{hasSidebar:s}=U();return(o,i)=>r(e).footer&&r(t).footer!==!1?(a(),u("footer",{key:0,class:N(["VPFooter",{"has-sidebar":r(s)}])},[p("div",$o,[r(e).footer.message?(a(),u("p",{key:0,class:"message",innerHTML:r(e).footer.message},null,8,go)):h("",!0),r(e).footer.copyright?(a(),u("p",{key:1,class:"copyright",innerHTML:r(e).footer.copyright},null,8,yo)):h("",!0)])],2)):h("",!0)}}),So=g(Po,[["__scopeId","data-v-c970a860"]]);function Vo(){const{theme:n,frontmatter:e}=V(),t=Te([]),s=y(()=>t.value.length>0);return te(()=>{t.value=ke(e.value.outline??n.value.outline)}),{headers:t,hasLocalNav:s}}const Lo=n=>(B("data-v-bc9dc845"),n=n(),H(),n),To={class:"menu-text"},wo=Lo(()=>p("span",{class:"vpi-chevron-right icon"},null,-1)),Io={class:"header"},No={class:"outline"},Mo=_({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(n){const e=n,{theme:t}=V(),s=T(!1),o=T(0),i=T(),l=T();function d(b){var P;(P=i.value)!=null&&P.contains(b.target)||(s.value=!1)}O(s,b=>{if(b){document.addEventListener("click",d);return}document.removeEventListener("click",d)}),ce("Escape",()=>{s.value=!1}),te(()=>{s.value=!1});function v(){s.value=!s.value,o.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function m(b){b.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Ne(()=>{s.value=!1}))}function L(){s.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(b,P)=>(a(),u("div",{class:"VPLocalNavOutlineDropdown",style:Ie({"--vp-vh":o.value+"px"}),ref_key:"main",ref:i},[b.headers.length>0?(a(),u("button",{key:0,onClick:v,class:N({open:s.value})},[p("span",To,I(r(He)(r(t))),1),wo],2)):(a(),u("button",{key:1,onClick:L},I(r(t).returnToTopLabel||"Return to top"),1)),k(pe,{name:"flyout"},{default:f(()=>[s.value?(a(),u("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:m},[p("div",Io,[p("a",{class:"top-link",href:"#",onClick:L},I(r(t).returnToTopLabel||"Return to top"),1)]),p("div",No,[k(Ee,{headers:b.headers},null,8,["headers"])])],512)):h("",!0)]),_:1})],4))}}),Ao=g(Mo,[["__scopeId","data-v-bc9dc845"]]),Co=n=>(B("data-v-070ab83d"),n=n(),H(),n),Bo={class:"container"},Ho=["aria-expanded"],Eo=Co(()=>p("span",{class:"vpi-align-left menu-icon"},null,-1)),Do={class:"menu-text"},Fo=_({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(n){const{theme:e,frontmatter:t}=V(),{hasSidebar:s}=U(),{headers:o}=Vo(),{y:i}=Me(),l=T(0);R(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),te(()=>{o.value=ke(t.value.outline??e.value.outline)});const d=y(()=>o.value.length===0),v=y(()=>d.value&&!s.value),m=y(()=>({VPLocalNav:!0,"has-sidebar":s.value,empty:d.value,fixed:v.value}));return(L,b)=>r(t).layout!=="home"&&(!v.value||r(i)>=l.value)?(a(),u("div",{key:0,class:N(m.value)},[p("div",Bo,[r(s)?(a(),u("button",{key:0,class:"menu","aria-expanded":L.open,"aria-controls":"VPSidebarNav",onClick:b[0]||(b[0]=P=>L.$emit("open-menu"))},[Eo,p("span",Do,I(r(e).sidebarMenuLabel||"Menu"),1)],8,Ho)):h("",!0),k(Ao,{headers:r(o),navHeight:l.value},null,8,["headers","navHeight"])])],2)):h("",!0)}}),Oo=g(Fo,[["__scopeId","data-v-070ab83d"]]);function jo(){const n=T(!1);function e(){n.value=!0,window.addEventListener("resize",o)}function t(){n.value=!1,window.removeEventListener("resize",o)}function s(){n.value?t():e()}function o(){window.outerWidth>=768&&t()}const i=ne();return O(()=>i.path,t),{isScreenOpen:n,openScreen:e,closeScreen:t,toggleScreen:s}}const Uo={},Go={class:"VPSwitch",type:"button",role:"switch"},zo={class:"check"},Ko={key:0,class:"icon"};function Ro(n,e){return a(),u("button",Go,[p("span",zo,[n.$slots.default?(a(),u("span",Ko,[c(n.$slots,"default",{},void 0,!0)])):h("",!0)])])}const qo=g(Uo,[["render",Ro],["__scopeId","data-v-4a1c76db"]]),Fe=n=>(B("data-v-e40a8bb6"),n=n(),H(),n),Wo=Fe(()=>p("span",{class:"vpi-sun sun"},null,-1)),Jo=Fe(()=>p("span",{class:"vpi-moon moon"},null,-1)),Yo=_({__name:"VPSwitchAppearance",setup(n){const{isDark:e,theme:t}=V(),s=Y("toggle-appearance",()=>{e.value=!e.value}),o=T("");return _e(()=>{o.value=e.value?t.value.lightModeSwitchTitle||"Switch to light theme":t.value.darkModeSwitchTitle||"Switch to dark theme"}),(i,l)=>(a(),$(qo,{title:o.value,class:"VPSwitchAppearance","aria-checked":r(e),onClick:r(s)},{default:f(()=>[Wo,Jo]),_:1},8,["title","aria-checked","onClick"]))}}),$e=g(Yo,[["__scopeId","data-v-e40a8bb6"]]),Xo={key:0,class:"VPNavBarAppearance"},Qo=_({__name:"VPNavBarAppearance",setup(n){const{site:e}=V();return(t,s)=>r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),u("div",Xo,[k($e)])):h("",!0)}}),Zo=g(Qo,[["__scopeId","data-v-af096f4a"]]),ge=T();let Oe=!1,ie=0;function xo(n){const e=T(!1);if(oe){!Oe&&es(),ie++;const t=O(ge,s=>{var o,i,l;s===n.el.value||(o=n.el.value)!=null&&o.contains(s)?(e.value=!0,(i=n.onFocus)==null||i.call(n)):(e.value=!1,(l=n.onBlur)==null||l.call(n))});he(()=>{t(),ie--,ie||ts()})}return et(e)}function es(){document.addEventListener("focusin",je),Oe=!0,ge.value=document.activeElement}function ts(){document.removeEventListener("focusin",je)}function je(){ge.value=document.activeElement}const ns={class:"VPMenuLink"},os=_({__name:"VPMenuLink",props:{item:{}},setup(n){const{page:e}=V();return(t,s)=>(a(),u("div",ns,[k(F,{class:N({active:r(q)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:f(()=>[j(I(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}}),se=g(os,[["__scopeId","data-v-8b74d055"]]),ss={class:"VPMenuGroup"},as={key:0,class:"title"},rs=_({__name:"VPMenuGroup",props:{text:{},items:{}},setup(n){return(e,t)=>(a(),u("div",ss,[e.text?(a(),u("p",as,I(e.text),1)):h("",!0),(a(!0),u(M,null,E(e.items,s=>(a(),u(M,null,["link"in s?(a(),$(se,{key:0,item:s},null,8,["item"])):h("",!0)],64))),256))]))}}),is=g(rs,[["__scopeId","data-v-48c802d0"]]),ls={class:"VPMenu"},cs={key:0,class:"items"},us=_({__name:"VPMenu",props:{items:{}},setup(n){return(e,t)=>(a(),u("div",ls,[e.items?(a(),u("div",cs,[(a(!0),u(M,null,E(e.items,s=>(a(),u(M,{key:JSON.stringify(s)},["link"in s?(a(),$(se,{key:0,item:s},null,8,["item"])):"component"in s?(a(),$(D(s.component),K({key:1,ref_for:!0},s.props),null,16)):(a(),$(is,{key:2,text:s.text,items:s.items},null,8,["text","items"]))],64))),128))])):h("",!0),c(e.$slots,"default",{},void 0,!0)]))}}),ds=g(us,[["__scopeId","data-v-7dd3104a"]]),vs=n=>(B("data-v-e5380155"),n=n(),H(),n),ps=["aria-expanded","aria-label"],fs={key:0,class:"text"},hs=["innerHTML"],_s=vs(()=>p("span",{class:"vpi-chevron-down text-icon"},null,-1)),ms={key:1,class:"vpi-more-horizontal icon"},bs={class:"menu"},ks=_({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(n){const e=T(!1),t=T();xo({el:t,onBlur:s});function s(){e.value=!1}return(o,i)=>(a(),u("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:i[1]||(i[1]=l=>e.value=!0),onMouseleave:i[2]||(i[2]=l=>e.value=!1)},[p("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":o.label,onClick:i[0]||(i[0]=l=>e.value=!e.value)},[o.button||o.icon?(a(),u("span",fs,[o.icon?(a(),u("span",{key:0,class:N([o.icon,"option-icon"])},null,2)):h("",!0),o.button?(a(),u("span",{key:1,innerHTML:o.button},null,8,hs)):h("",!0),_s])):(a(),u("span",ms))],8,ps),p("div",bs,[k(ds,{items:o.items},{default:f(()=>[c(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),ye=g(ks,[["__scopeId","data-v-e5380155"]]),$s=["href","aria-label","innerHTML"],gs=_({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(n){const e=n,t=y(()=>typeof e.icon=="object"?e.icon.svg:``);return(s,o)=>(a(),u("a",{class:"VPSocialLink no-icon",href:s.link,"aria-label":s.ariaLabel??(typeof s.icon=="string"?s.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,$s))}}),ys=g(gs,[["__scopeId","data-v-717b8b75"]]),Ps={class:"VPSocialLinks"},Ss=_({__name:"VPSocialLinks",props:{links:{}},setup(n){return(e,t)=>(a(),u("div",Ps,[(a(!0),u(M,null,E(e.links,({link:s,icon:o,ariaLabel:i})=>(a(),$(ys,{key:s,icon:o,link:s,ariaLabel:i},null,8,["icon","link","ariaLabel"]))),128))]))}}),Pe=g(Ss,[["__scopeId","data-v-ee7a9424"]]),Vs={key:0,class:"group translations"},Ls={class:"trans-title"},Ts={key:1,class:"group"},ws={class:"item appearance"},Is={class:"label"},Ns={class:"appearance-action"},Ms={key:2,class:"group"},As={class:"item social-links"},Cs=_({__name:"VPNavBarExtra",setup(n){const{site:e,theme:t}=V(),{localeLinks:s,currentLang:o}=Q({correspondingLink:!0}),i=y(()=>s.value.length&&o.value.label||e.value.appearance||t.value.socialLinks);return(l,d)=>i.value?(a(),$(ye,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:f(()=>[r(s).length&&r(o).label?(a(),u("div",Vs,[p("p",Ls,I(r(o).label),1),(a(!0),u(M,null,E(r(s),v=>(a(),$(se,{key:v.link,item:v},null,8,["item"]))),128))])):h("",!0),r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),u("div",Ts,[p("div",ws,[p("p",Is,I(r(t).darkModeSwitchLabel||"Appearance"),1),p("div",Ns,[k($e)])])])):h("",!0),r(t).socialLinks?(a(),u("div",Ms,[p("div",As,[k(Pe,{class:"social-links-list",links:r(t).socialLinks},null,8,["links"])])])):h("",!0)]),_:1})):h("",!0)}}),Bs=g(Cs,[["__scopeId","data-v-925effce"]]),Hs=n=>(B("data-v-5dea55bf"),n=n(),H(),n),Es=["aria-expanded"],Ds=Hs(()=>p("span",{class:"container"},[p("span",{class:"top"}),p("span",{class:"middle"}),p("span",{class:"bottom"})],-1)),Fs=[Ds],Os=_({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(n){return(e,t)=>(a(),u("button",{type:"button",class:N(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=s=>e.$emit("click"))},Fs,10,Es))}}),js=g(Os,[["__scopeId","data-v-5dea55bf"]]),Us=["innerHTML"],Gs=_({__name:"VPNavBarMenuLink",props:{item:{}},setup(n){const{page:e}=V();return(t,s)=>(a(),$(F,{class:N({VPNavBarMenuLink:!0,active:r(q)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,noIcon:t.item.noIcon,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:f(()=>[p("span",{innerHTML:t.item.text},null,8,Us)]),_:1},8,["class","href","noIcon","target","rel"]))}}),zs=g(Gs,[["__scopeId","data-v-ed5ac1f6"]]),Ks=_({__name:"VPNavBarMenuGroup",props:{item:{}},setup(n){const e=n,{page:t}=V(),s=i=>"component"in i?!1:"link"in i?q(t.value.relativePath,i.link,!!e.item.activeMatch):i.items.some(s),o=y(()=>s(e.item));return(i,l)=>(a(),$(ye,{class:N({VPNavBarMenuGroup:!0,active:r(q)(r(t).relativePath,i.item.activeMatch,!!i.item.activeMatch)||o.value}),button:i.item.text,items:i.item.items},null,8,["class","button","items"]))}}),Rs=n=>(B("data-v-e6d46098"),n=n(),H(),n),qs={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},Ws=Rs(()=>p("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),Js=_({__name:"VPNavBarMenu",setup(n){const{theme:e}=V();return(t,s)=>r(e).nav?(a(),u("nav",qs,[Ws,(a(!0),u(M,null,E(r(e).nav,o=>(a(),u(M,{key:JSON.stringify(o)},["link"in o?(a(),$(zs,{key:0,item:o},null,8,["item"])):"component"in o?(a(),$(D(o.component),K({key:1,ref_for:!0},o.props),null,16)):(a(),$(Ks,{key:2,item:o},null,8,["item"]))],64))),128))])):h("",!0)}}),Ys=g(Js,[["__scopeId","data-v-e6d46098"]]);function Xs(n){const{localeIndex:e,theme:t}=V();function s(o){var A,C,w;const i=o.split("."),l=(A=t.value.search)==null?void 0:A.options,d=l&&typeof l=="object",v=d&&((w=(C=l.locales)==null?void 0:C[e.value])==null?void 0:w.translations)||null,m=d&&l.translations||null;let L=v,b=m,P=n;const S=i.pop();for(const G of i){let z=null;const J=P==null?void 0:P[G];J&&(z=P=J);const ae=b==null?void 0:b[G];ae&&(z=b=ae);const re=L==null?void 0:L[G];re&&(z=L=re),J||(P=z),ae||(b=z),re||(L=z)}return(L==null?void 0:L[S])??(b==null?void 0:b[S])??(P==null?void 0:P[S])??""}return s}const Qs=["aria-label"],Zs={class:"DocSearch-Button-Container"},xs=p("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1),ea={class:"DocSearch-Button-Placeholder"},ta=p("span",{class:"DocSearch-Button-Keys"},[p("kbd",{class:"DocSearch-Button-Key"}),p("kbd",{class:"DocSearch-Button-Key"},"K")],-1),Se=_({__name:"VPNavBarSearchButton",setup(n){const t=Xs({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(s,o)=>(a(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":r(t)("button.buttonAriaLabel")},[p("span",Zs,[xs,p("span",ea,I(r(t)("button.buttonText")),1)]),ta],8,Qs))}}),na={class:"VPNavBarSearch"},oa={id:"local-search"},sa={key:1,id:"docsearch"},aa=_({__name:"VPNavBarSearch",setup(n){const e=tt(()=>nt(()=>import("./VPLocalSearchBox.DJfC04nF.js"),__vite__mapDeps([0,1]))),t=()=>null,{theme:s}=V(),o=T(!1),i=T(!1);R(()=>{});function l(){o.value||(o.value=!0,setTimeout(d,16))}function d(){const b=new Event("keydown");b.key="k",b.metaKey=!0,window.dispatchEvent(b),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||d()},16)}function v(b){const P=b.target,S=P.tagName;return P.isContentEditable||S==="INPUT"||S==="SELECT"||S==="TEXTAREA"}const m=T(!1);ce("k",b=>{(b.ctrlKey||b.metaKey)&&(b.preventDefault(),m.value=!0)}),ce("/",b=>{v(b)||(b.preventDefault(),m.value=!0)});const L="local";return(b,P)=>{var S;return a(),u("div",na,[r(L)==="local"?(a(),u(M,{key:0},[m.value?(a(),$(r(e),{key:0,onClose:P[0]||(P[0]=A=>m.value=!1)})):h("",!0),p("div",oa,[k(Se,{onClick:P[1]||(P[1]=A=>m.value=!0)})])],64)):r(L)==="algolia"?(a(),u(M,{key:1},[o.value?(a(),$(r(t),{key:0,algolia:((S=r(s).search)==null?void 0:S.options)??r(s).algolia,onVnodeBeforeMount:P[2]||(P[2]=A=>i.value=!0)},null,8,["algolia"])):h("",!0),i.value?h("",!0):(a(),u("div",sa,[k(Se,{onClick:l})]))],64)):h("",!0)])}}}),ra=_({__name:"VPNavBarSocialLinks",setup(n){const{theme:e}=V();return(t,s)=>r(e).socialLinks?(a(),$(Pe,{key:0,class:"VPNavBarSocialLinks",links:r(e).socialLinks},null,8,["links"])):h("",!0)}}),ia=g(ra,[["__scopeId","data-v-164c457f"]]),la=["href","rel","target"],ca={key:1},ua={key:2},da=_({__name:"VPNavBarTitle",setup(n){const{site:e,theme:t}=V(),{hasSidebar:s}=U(),{currentLang:o}=Q(),i=y(()=>{var v;return typeof t.value.logoLink=="string"?t.value.logoLink:(v=t.value.logoLink)==null?void 0:v.link}),l=y(()=>{var v;return typeof t.value.logoLink=="string"||(v=t.value.logoLink)==null?void 0:v.rel}),d=y(()=>{var v;return typeof t.value.logoLink=="string"||(v=t.value.logoLink)==null?void 0:v.target});return(v,m)=>(a(),u("div",{class:N(["VPNavBarTitle",{"has-sidebar":r(s)}])},[p("a",{class:"title",href:i.value??r(be)(r(o).link),rel:l.value,target:d.value},[c(v.$slots,"nav-bar-title-before",{},void 0,!0),r(t).logo?(a(),$(x,{key:0,class:"logo",image:r(t).logo},null,8,["image"])):h("",!0),r(t).siteTitle?(a(),u("span",ca,I(r(t).siteTitle),1)):r(t).siteTitle===void 0?(a(),u("span",ua,I(r(e).title),1)):h("",!0),c(v.$slots,"nav-bar-title-after",{},void 0,!0)],8,la)],2))}}),va=g(da,[["__scopeId","data-v-28a961f9"]]),pa={class:"items"},fa={class:"title"},ha=_({__name:"VPNavBarTranslations",setup(n){const{theme:e}=V(),{localeLinks:t,currentLang:s}=Q({correspondingLink:!0});return(o,i)=>r(t).length&&r(s).label?(a(),$(ye,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:r(e).langMenuLabel||"Change language"},{default:f(()=>[p("div",pa,[p("p",fa,I(r(s).label),1),(a(!0),u(M,null,E(r(t),l=>(a(),$(se,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):h("",!0)}}),_a=g(ha,[["__scopeId","data-v-c80d9ad0"]]),ma=n=>(B("data-v-822684d1"),n=n(),H(),n),ba={class:"wrapper"},ka={class:"container"},$a={class:"title"},ga={class:"content"},ya={class:"content-body"},Pa=ma(()=>p("div",{class:"divider"},[p("div",{class:"divider-line"})],-1)),Sa=_({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(n){const e=n,{y:t}=Me(),{hasSidebar:s}=U(),{frontmatter:o}=V(),i=T({});return _e(()=>{i.value={"has-sidebar":s.value,home:o.value.layout==="home",top:t.value===0,"screen-open":e.isScreenOpen}}),(l,d)=>(a(),u("div",{class:N(["VPNavBar",i.value])},[p("div",ba,[p("div",ka,[p("div",$a,[k(va,null,{"nav-bar-title-before":f(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),p("div",ga,[p("div",ya,[c(l.$slots,"nav-bar-content-before",{},void 0,!0),k(aa,{class:"search"}),k(Ys,{class:"menu"}),k(_a,{class:"translations"}),k(Zo,{class:"appearance"}),k(ia,{class:"social-links"}),k(Bs,{class:"extra"}),c(l.$slots,"nav-bar-content-after",{},void 0,!0),k(js,{class:"hamburger",active:l.isScreenOpen,onClick:d[0]||(d[0]=v=>l.$emit("toggle-screen"))},null,8,["active"])])])])]),Pa],2))}}),Va=g(Sa,[["__scopeId","data-v-822684d1"]]),La={key:0,class:"VPNavScreenAppearance"},Ta={class:"text"},wa=_({__name:"VPNavScreenAppearance",setup(n){const{site:e,theme:t}=V();return(s,o)=>r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),u("div",La,[p("p",Ta,I(r(t).darkModeSwitchLabel||"Appearance"),1),k($e)])):h("",!0)}}),Ia=g(wa,[["__scopeId","data-v-ffb44008"]]),Na=_({__name:"VPNavScreenMenuLink",props:{item:{}},setup(n){const e=Y("close-screen");return(t,s)=>(a(),$(F,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e),innerHTML:t.item.text},null,8,["href","target","rel","onClick","innerHTML"]))}}),Ma=g(Na,[["__scopeId","data-v-27d04aeb"]]),Aa=_({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(n){const e=Y("close-screen");return(t,s)=>(a(),$(F,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e)},{default:f(()=>[j(I(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),Ue=g(Aa,[["__scopeId","data-v-7179dbb7"]]),Ca={class:"VPNavScreenMenuGroupSection"},Ba={key:0,class:"title"},Ha=_({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(n){return(e,t)=>(a(),u("div",Ca,[e.text?(a(),u("p",Ba,I(e.text),1)):h("",!0),(a(!0),u(M,null,E(e.items,s=>(a(),$(Ue,{key:s.text,item:s},null,8,["item"]))),128))]))}}),Ea=g(Ha,[["__scopeId","data-v-4b8941ac"]]),Da=n=>(B("data-v-875057a5"),n=n(),H(),n),Fa=["aria-controls","aria-expanded"],Oa=["innerHTML"],ja=Da(()=>p("span",{class:"vpi-plus button-icon"},null,-1)),Ua=["id"],Ga={key:0,class:"item"},za={key:1,class:"item"},Ka={key:2,class:"group"},Ra=_({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(n){const e=n,t=T(!1),s=y(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function o(){t.value=!t.value}return(i,l)=>(a(),u("div",{class:N(["VPNavScreenMenuGroup",{open:t.value}])},[p("button",{class:"button","aria-controls":s.value,"aria-expanded":t.value,onClick:o},[p("span",{class:"button-text",innerHTML:i.text},null,8,Oa),ja],8,Fa),p("div",{id:s.value,class:"items"},[(a(!0),u(M,null,E(i.items,d=>(a(),u(M,{key:JSON.stringify(d)},["link"in d?(a(),u("div",Ga,[k(Ue,{item:d},null,8,["item"])])):"component"in d?(a(),u("div",za,[(a(),$(D(d.component),K({ref_for:!0},d.props,{"screen-menu":""}),null,16))])):(a(),u("div",Ka,[k(Ea,{text:d.text,items:d.items},null,8,["text","items"])]))],64))),128))],8,Ua)],2))}}),qa=g(Ra,[["__scopeId","data-v-875057a5"]]),Wa={key:0,class:"VPNavScreenMenu"},Ja=_({__name:"VPNavScreenMenu",setup(n){const{theme:e}=V();return(t,s)=>r(e).nav?(a(),u("nav",Wa,[(a(!0),u(M,null,E(r(e).nav,o=>(a(),u(M,{key:JSON.stringify(o)},["link"in o?(a(),$(Ma,{key:0,item:o},null,8,["item"])):"component"in o?(a(),$(D(o.component),K({key:1,ref_for:!0},o.props,{"screen-menu":""}),null,16)):(a(),$(qa,{key:2,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):h("",!0)}}),Ya=_({__name:"VPNavScreenSocialLinks",setup(n){const{theme:e}=V();return(t,s)=>r(e).socialLinks?(a(),$(Pe,{key:0,class:"VPNavScreenSocialLinks",links:r(e).socialLinks},null,8,["links"])):h("",!0)}}),Ge=n=>(B("data-v-362991c2"),n=n(),H(),n),Xa=Ge(()=>p("span",{class:"vpi-languages icon lang"},null,-1)),Qa=Ge(()=>p("span",{class:"vpi-chevron-down icon chevron"},null,-1)),Za={class:"list"},xa=_({__name:"VPNavScreenTranslations",setup(n){const{localeLinks:e,currentLang:t}=Q({correspondingLink:!0}),s=T(!1);function o(){s.value=!s.value}return(i,l)=>r(e).length&&r(t).label?(a(),u("div",{key:0,class:N(["VPNavScreenTranslations",{open:s.value}])},[p("button",{class:"title",onClick:o},[Xa,j(" "+I(r(t).label)+" ",1),Qa]),p("ul",Za,[(a(!0),u(M,null,E(r(e),d=>(a(),u("li",{key:d.link,class:"item"},[k(F,{class:"link",href:d.link},{default:f(()=>[j(I(d.text),1)]),_:2},1032,["href"])]))),128))])],2)):h("",!0)}}),er=g(xa,[["__scopeId","data-v-362991c2"]]),tr={class:"container"},nr=_({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(n){const e=T(null),t=Ae(oe?document.body:null);return(s,o)=>(a(),$(pe,{name:"fade",onEnter:o[0]||(o[0]=i=>t.value=!0),onAfterLeave:o[1]||(o[1]=i=>t.value=!1)},{default:f(()=>[s.open?(a(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[p("div",tr,[c(s.$slots,"nav-screen-content-before",{},void 0,!0),k(Ja,{class:"menu"}),k(er,{class:"translations"}),k(Ia,{class:"appearance"}),k(Ya,{class:"social-links"}),c(s.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):h("",!0)]),_:3}))}}),or=g(nr,[["__scopeId","data-v-833aabba"]]),sr={key:0,class:"VPNav"},ar=_({__name:"VPNav",setup(n){const{isScreenOpen:e,closeScreen:t,toggleScreen:s}=jo(),{frontmatter:o}=V(),i=y(()=>o.value.navbar!==!1);return me("close-screen",t),ee(()=>{oe&&document.documentElement.classList.toggle("hide-nav",!i.value)}),(l,d)=>i.value?(a(),u("header",sr,[k(Va,{"is-screen-open":r(e),onToggleScreen:r(s)},{"nav-bar-title-before":f(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":f(()=>[c(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":f(()=>[c(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),k(or,{open:r(e)},{"nav-screen-content-before":f(()=>[c(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":f(()=>[c(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):h("",!0)}}),rr=g(ar,[["__scopeId","data-v-f1e365da"]]),ze=n=>(B("data-v-196b2e5f"),n=n(),H(),n),ir=["role","tabindex"],lr=ze(()=>p("div",{class:"indicator"},null,-1)),cr=ze(()=>p("span",{class:"vpi-chevron-right caret-icon"},null,-1)),ur=[cr],dr={key:1,class:"items"},vr=_({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(n){const e=n,{collapsed:t,collapsible:s,isLink:o,isActiveLink:i,hasActiveLink:l,hasChildren:d,toggle:v}=It(y(()=>e.item)),m=y(()=>d.value?"section":"div"),L=y(()=>o.value?"a":"div"),b=y(()=>d.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),P=y(()=>o.value?void 0:"button"),S=y(()=>[[`level-${e.depth}`],{collapsible:s.value},{collapsed:t.value},{"is-link":o.value},{"is-active":i.value},{"has-active":l.value}]);function A(w){"key"in w&&w.key!=="Enter"||!e.item.link&&v()}function C(){e.item.link&&v()}return(w,G)=>{const z=W("VPSidebarItem",!0);return a(),$(D(m.value),{class:N(["VPSidebarItem",S.value])},{default:f(()=>[w.item.text?(a(),u("div",K({key:0,class:"item",role:P.value},st(w.item.items?{click:A,keydown:A}:{},!0),{tabindex:w.item.items&&0}),[lr,w.item.link?(a(),$(F,{key:0,tag:L.value,class:"link",href:w.item.link,rel:w.item.rel,target:w.item.target},{default:f(()=>[(a(),$(D(b.value),{class:"text",innerHTML:w.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),$(D(b.value),{key:1,class:"text",innerHTML:w.item.text},null,8,["innerHTML"])),w.item.collapsed!=null&&w.item.items&&w.item.items.length?(a(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:C,onKeydown:ot(C,["enter"]),tabindex:"0"},ur,32)):h("",!0)],16,ir)):h("",!0),w.item.items&&w.item.items.length?(a(),u("div",dr,[w.depth<5?(a(!0),u(M,{key:0},E(w.item.items,J=>(a(),$(z,{key:J.text,item:J,depth:w.depth+1},null,8,["item","depth"]))),128)):h("",!0)])):h("",!0)]),_:1},8,["class"])}}}),pr=g(vr,[["__scopeId","data-v-196b2e5f"]]),fr=_({__name:"VPSidebarGroup",props:{items:{}},setup(n){const e=T(!0);let t=null;return R(()=>{t=setTimeout(()=>{t=null,e.value=!1},300)}),at(()=>{t!=null&&(clearTimeout(t),t=null)}),(s,o)=>(a(!0),u(M,null,E(s.items,i=>(a(),u("div",{key:i.text,class:N(["group",{"no-transition":e.value}])},[k(pr,{item:i,depth:0},null,8,["item"])],2))),128))}}),hr=g(fr,[["__scopeId","data-v-9e426adc"]]),Ke=n=>(B("data-v-18756405"),n=n(),H(),n),_r=Ke(()=>p("div",{class:"curtain"},null,-1)),mr={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},br=Ke(()=>p("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),kr=_({__name:"VPSidebar",props:{open:{type:Boolean}},setup(n){const{sidebarGroups:e,hasSidebar:t}=U(),s=n,o=T(null),i=Ae(oe?document.body:null);O([s,o],()=>{var d;s.open?(i.value=!0,(d=o.value)==null||d.focus()):i.value=!1},{immediate:!0,flush:"post"});const l=T(0);return O(e,()=>{l.value+=1},{deep:!0}),(d,v)=>r(t)?(a(),u("aside",{key:0,class:N(["VPSidebar",{open:d.open}]),ref_key:"navEl",ref:o,onClick:v[0]||(v[0]=rt(()=>{},["stop"]))},[_r,p("nav",mr,[br,c(d.$slots,"sidebar-nav-before",{},void 0,!0),(a(),$(hr,{items:r(e),key:l.value},null,8,["items"])),c(d.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):h("",!0)}}),$r=g(kr,[["__scopeId","data-v-18756405"]]),gr=_({__name:"VPSkipLink",setup(n){const e=ne(),t=T();O(()=>e.path,()=>t.value.focus());function s({target:o}){const i=document.getElementById(decodeURIComponent(o.hash).slice(1));if(i){const l=()=>{i.removeAttribute("tabindex"),i.removeEventListener("blur",l)};i.setAttribute("tabindex","-1"),i.addEventListener("blur",l),i.focus(),window.scrollTo(0,0)}}return(o,i)=>(a(),u(M,null,[p("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),p("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:s}," Skip to content ")],64))}}),yr=g(gr,[["__scopeId","data-v-c3508ec8"]]),Pr=_({__name:"Layout",setup(n){const{isOpen:e,open:t,close:s}=U(),o=ne();O(()=>o.path,s),wt(e,s);const{frontmatter:i}=V(),l=Ce(),d=y(()=>!!l["home-hero-image"]);return me("hero-image-slot-exists",d),(v,m)=>{const L=W("Content");return r(i).layout!==!1?(a(),u("div",{key:0,class:N(["Layout",r(i).pageClass])},[c(v.$slots,"layout-top",{},void 0,!0),k(yr),k(pt,{class:"backdrop",show:r(e),onClick:r(s)},null,8,["show","onClick"]),k(rr,null,{"nav-bar-title-before":f(()=>[c(v.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[c(v.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":f(()=>[c(v.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":f(()=>[c(v.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":f(()=>[c(v.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":f(()=>[c(v.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),k(Oo,{open:r(e),onOpenMenu:r(t)},null,8,["open","onOpenMenu"]),k($r,{open:r(e)},{"sidebar-nav-before":f(()=>[c(v.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":f(()=>[c(v.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),k(ko,null,{"page-top":f(()=>[c(v.$slots,"page-top",{},void 0,!0)]),"page-bottom":f(()=>[c(v.$slots,"page-bottom",{},void 0,!0)]),"not-found":f(()=>[c(v.$slots,"not-found",{},void 0,!0)]),"home-hero-before":f(()=>[c(v.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":f(()=>[c(v.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[c(v.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[c(v.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[c(v.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[c(v.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":f(()=>[c(v.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":f(()=>[c(v.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":f(()=>[c(v.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":f(()=>[c(v.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":f(()=>[c(v.$slots,"doc-before",{},void 0,!0)]),"doc-after":f(()=>[c(v.$slots,"doc-after",{},void 0,!0)]),"doc-top":f(()=>[c(v.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":f(()=>[c(v.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":f(()=>[c(v.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":f(()=>[c(v.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":f(()=>[c(v.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[c(v.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[c(v.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[c(v.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),k(So),c(v.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),$(L,{key:1}))}}}),Sr=g(Pr,[["__scopeId","data-v-a9a9e638"]]),Ve={Layout:Sr,enhanceApp:({app:n})=>{n.component("Badge",ut)}},Vr=n=>{if(typeof document>"u")return{stabilizeScrollPosition:o=>async(...i)=>o(...i)};const e=document.documentElement;return{stabilizeScrollPosition:s=>async(...o)=>{const i=s(...o),l=n.value;if(!l)return i;const d=l.offsetTop-e.scrollTop;return await Ne(),e.scrollTop=l.offsetTop-d,i}}},Re="vitepress:tabSharedState",X=typeof localStorage<"u"?localStorage:null,qe="vitepress:tabsSharedState",Lr=()=>{const n=X==null?void 0:X.getItem(qe);if(n)try{return JSON.parse(n)}catch{}return{}},Tr=n=>{X&&X.setItem(qe,JSON.stringify(n))},wr=n=>{const e=it({});O(()=>e.content,(t,s)=>{t&&s&&Tr(t)},{deep:!0}),n.provide(Re,e)},Ir=(n,e)=>{const t=Y(Re);if(!t)throw new Error("[vitepress-plugin-tabs] TabsSharedState should be injected");R(()=>{t.content||(t.content=Lr())});const s=T(),o=y({get(){var v;const l=e.value,d=n.value;if(l){const m=(v=t.content)==null?void 0:v[l];if(m&&d.includes(m))return m}else{const m=s.value;if(m)return m}return d[0]},set(l){const d=e.value;d?t.content&&(t.content[d]=l):s.value=l}});return{selected:o,select:l=>{o.value=l}}};let Le=0;const Nr=()=>(Le++,""+Le);function Mr(){const n=Ce();return y(()=>{var s;const t=(s=n.default)==null?void 0:s.call(n);return t?t.filter(o=>typeof o.type=="object"&&"__name"in o.type&&o.type.__name==="PluginTabsTab"&&o.props).map(o=>{var i;return(i=o.props)==null?void 0:i.label}):[]})}const We="vitepress:tabSingleState",Ar=n=>{me(We,n)},Cr=()=>{const n=Y(We);if(!n)throw new Error("[vitepress-plugin-tabs] TabsSingleState should be injected");return n},Br={class:"plugin-tabs"},Hr=["id","aria-selected","aria-controls","tabindex","onClick"],Er=_({__name:"PluginTabs",props:{sharedStateKey:{}},setup(n){const e=n,t=Mr(),{selected:s,select:o}=Ir(t,lt(e,"sharedStateKey")),i=T(),{stabilizeScrollPosition:l}=Vr(i),d=l(o),v=T([]),m=b=>{var A;const P=t.value.indexOf(s.value);let S;b.key==="ArrowLeft"?S=P>=1?P-1:t.value.length-1:b.key==="ArrowRight"&&(S=P(a(),u("div",Br,[p("div",{ref_key:"tablist",ref:i,class:"plugin-tabs--tab-list",role:"tablist",onKeydown:m},[(a(!0),u(M,null,E(r(t),S=>(a(),u("button",{id:`tab-${S}-${r(L)}`,ref_for:!0,ref_key:"buttonRefs",ref:v,key:S,role:"tab",class:"plugin-tabs--tab","aria-selected":S===r(s),"aria-controls":`panel-${S}-${r(L)}`,tabindex:S===r(s)?0:-1,onClick:()=>r(d)(S)},I(S),9,Hr))),128))],544),c(b.$slots,"default")]))}}),Dr=["id","aria-labelledby"],Fr=_({__name:"PluginTabsTab",props:{label:{}},setup(n){const{uid:e,selected:t}=Cr();return(s,o)=>r(t)===s.label?(a(),u("div",{key:0,id:`panel-${s.label}-${r(e)}`,class:"plugin-tabs--content",role:"tabpanel",tabindex:"0","aria-labelledby":`tab-${s.label}-${r(e)}`},[c(s.$slots,"default",{},void 0,!0)],8,Dr)):h("",!0)}}),Or=g(Fr,[["__scopeId","data-v-9b0d03d2"]]),jr=n=>{wr(n),n.component("PluginTabs",Er),n.component("PluginTabsTab",Or)},Gr={extends:Ve,Layout(){return ct(Ve.Layout,null,{})},enhanceApp({app:n,router:e,siteData:t}){jr(n)}};export{Gr as R,Xs as c,V as u}; diff --git a/dev/assets/constraints_00_intro.md.BK4czCKw.js b/dev/assets/constraints_00_intro.md.BK4czCKw.js deleted file mode 100644 index cefbec4..0000000 --- a/dev/assets/constraints_00_intro.md.BK4czCKw.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as n,c as o,j as t,a as e,a7 as s,o as a}from"./chunks/framework.CBLuZwrP.js";const H3=JSON.parse('{"title":"Introduction to basics constraint-based modeling tools","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/00_intro.md","filePath":"constraints/00_intro.md","lastUpdated":null}'),i={name:"constraints/00_intro.md"},l=s('

Introduction to basics constraint-based modeling tools

Constraint programming (CP) is a high-level paradigm for solving combinatorial problems, and Julia Constraints provides an efficient and flexible framework for developing constraint-based models.

All along this documentation, we will present code example base on the syntaxes of Julia Constraints internals (JC-API), of Julia for Mathematical Programming (JuMP ), of MathOptInterface (MOI), and, when relevant, of other standards such as XCSP.

Terminology

Warning

Terminology in Optimization varies strongly between different methods and communities. In this doc we try to be consistent with the following principles (in bold).

  • Constraint: A general mathematical predicate involving variables.

  • Constraint Instantiation: The application of a constraint to specific variables.

  • Configuration: A specific assignment of values to the variables.

  • Constraint Satisfaction/Violation: Whether a configuration meets or fails a constraint.

Constraint

Definition: A constraint is a formal mathematical statement that expresses a condition or a relation between a set of variables. It can be seen as a predicate that the variables must satisfy.

',7),Q=t("strong",null,"Example:",-1),r={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},T={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.448ex",height:"1.971ex",role:"img",focusable:"false",viewBox:"0 -666 4618 871","aria-hidden":"true"},d=s('',1),h=[d],c=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"+"),t("mi",null,"y"),t("mo",null,"≤"),t("mn",null,"10")])],-1),m={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},p={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},x=t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D465",d:"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z",style:{"stroke-width":"3"}})])])],-1),u=[x],g=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x")])],-1),_={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},w={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.109ex",height:"1.464ex",role:"img",focusable:"false",viewBox:"0 -442 490 647","aria-hidden":"true"},f=t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D466",d:"M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1),b=[f],v=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"y")])],-1),H={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.262ex",height:"1.557ex",role:"img",focusable:"false",viewBox:"0 -666 1000 688","aria-hidden":"true"},y=s('',1),V=[y],M=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"10")])],-1),L=t("h3",{id:"Constraint-Instantiation",tabindex:"-1"},[e("Constraint Instantiation "),t("a",{class:"header-anchor",href:"#Constraint-Instantiation","aria-label":'Permalink to "Constraint Instantiation {#Constraint-Instantiation}"'},"​")],-1),C=t("p",null,[t("strong",null,"Definition:"),e(" A constraint instantiation refers to a specific application of a generic constraint to a particular subset of variables from a problem. It is essentially the constraint applied with the actual variables of the problem.")],-1),Z=t("strong",null,"Example:",-1),S={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.448ex",height:"1.971ex",role:"img",focusable:"false",viewBox:"0 -666 4618 871","aria-hidden":"true"},I=s('',1),j=[I],P=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"+"),t("mi",null,"y"),t("mo",null,"≤"),t("mn",null,"10")])],-1),D={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},B={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.282ex",height:"1.339ex",role:"img",focusable:"false",viewBox:"0 -442 1008.6 592","aria-hidden":"true"},J=s('',1),E=[J],z=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"x"),t("mn",null,"1")])])],-1),G={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},N={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.282ex",height:"1.339ex",role:"img",focusable:"false",viewBox:"0 -442 1008.6 592","aria-hidden":"true"},R=s('',1),q=[R],O=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"x"),t("mn",null,"2")])])],-1),$={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},W={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"12.609ex",height:"1.846ex",role:"img",focusable:"false",viewBox:"0 -666 5573.1 816","aria-hidden":"true"},X=s('',1),F=[X],U=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"x"),t("mn",null,"1")]),t("mo",null,"+"),t("msub",null,[t("mi",null,"x"),t("mn",null,"2")]),t("mo",null,"≤"),t("mn",null,"10")])],-1),K=t("h3",{id:"configuration",tabindex:"-1"},[e("Configuration "),t("a",{class:"header-anchor",href:"#configuration","aria-label":'Permalink to "Configuration"'},"​")],-1),Y=t("p",null,[t("strong",null,"Definition:"),e(" A configuration, also known as an assignment, is a specific set of values assigned to the variables in their respective domains. It represents a possible state of the variables.")],-1),t1=t("strong",null,"Example:",-1),e1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},a1=t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D465",d:"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z",style:{"stroke-width":"3"}})])])],-1),s1=[a1],n1=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x")])],-1),i1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},l1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.109ex",height:"1.464ex",role:"img",focusable:"false",viewBox:"0 -442 490 647","aria-hidden":"true"},Q1=t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D466",d:"M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1),r1=[Q1],T1=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"y")])],-1),d1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},h1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.658ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2500.7 1000","aria-hidden":"true"},c1=s('',1),m1=[c1],p1=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mo",{stretchy:"false"},"["),t("mn",null,"0"),t("mo",null,","),t("mn",null,"10"),t("mo",{stretchy:"false"},"]")])],-1),x1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.442ex",height:"1.69ex",role:"img",focusable:"false",viewBox:"0 -665 2405.6 747","aria-hidden":"true"},g1=s('',1),_1=[g1],w1=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"="),t("mn",null,"3")])],-1),f1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.257ex",height:"1.971ex",role:"img",focusable:"false",viewBox:"0 -666 2323.6 871","aria-hidden":"true"},v1=s('',1),H1=[v1],k1=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"y"),t("mo",null,"="),t("mn",null,"2")])],-1),y1=t("h3",{id:"Constraint-Satisfaction-or-Violation-by-a-Configuration",tabindex:"-1"},[e("Constraint Satisfaction or Violation by a Configuration "),t("a",{class:"header-anchor",href:"#Constraint-Satisfaction-or-Violation-by-a-Configuration","aria-label":'Permalink to "Constraint Satisfaction or Violation by a Configuration {#Constraint-Satisfaction-or-Violation-by-a-Configuration}"'},"​")],-1),V1=t("p",null,[t("strong",null,"Definition:"),e(" This refers to whether a specific configuration (set of variable assignments) satisfies or violates a given constraint instantiation. A constraint is satisfied if the configuration makes the constraint "),t("code",null,"true"),e("; otherwise, it is violated ("),t("code",null,"false"),e(").")],-1),M1=t("strong",null,"Example:",-1),L1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},C1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.448ex",height:"1.971ex",role:"img",focusable:"false",viewBox:"0 -666 4618 871","aria-hidden":"true"},Z1=s('',1),S1=[Z1],A1=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"+"),t("mi",null,"y"),t("mo",null,"≤"),t("mn",null,"10")])],-1),I1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},j1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.442ex",height:"1.69ex",role:"img",focusable:"false",viewBox:"0 -665 2405.6 747","aria-hidden":"true"},P1=s('',1),D1=[P1],B1=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"="),t("mn",null,"3")])],-1),J1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},E1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.257ex",height:"1.971ex",role:"img",focusable:"false",viewBox:"0 -666 2323.6 871","aria-hidden":"true"},z1=s('',1),G1=[z1],N1=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"y"),t("mo",null,"="),t("mn",null,"2")])],-1),R1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},q1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"9.176ex",height:"1.692ex",role:"img",focusable:"false",viewBox:"0 -666 4056 748","aria-hidden":"true"},O1=s('',1),$1=[O1],W1=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"3"),t("mo",null,"+"),t("mn",null,"2"),t("mo",null,"="),t("mn",null,"5")])],-1),X1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},F1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.442ex",height:"1.692ex",role:"img",focusable:"false",viewBox:"0 -666 2405.6 748","aria-hidden":"true"},U1=s('',1),K1=[U1],Y1=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"="),t("mn",null,"6")])],-1),t3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},e3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.257ex",height:"1.971ex",role:"img",focusable:"false",viewBox:"0 -666 2323.6 871","aria-hidden":"true"},o3=s('',1),a3=[o3],s3=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"y"),t("mo",null,"="),t("mn",null,"5")])],-1),n3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},i3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.308ex",height:"1.692ex",role:"img",focusable:"false",viewBox:"0 -666 4556 748","aria-hidden":"true"},l3=s('',1),Q3=[l3],r3=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"6"),t("mo",null,"+"),t("mn",null,"5"),t("mo",null,"="),t("mn",null,"11")])],-1),T3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.262ex",height:"1.557ex",role:"img",focusable:"false",viewBox:"0 -666 1000 688","aria-hidden":"true"},h3=s('',1),c3=[h3],m3=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"10")])],-1),p3=s('

Domain-defined variables

In CP, variables are defined through their domain. ConstraintDomains.jl supports various types of domains such as discrete ones (sets, range, etc.), or continuous intervals, and custom domains.

A versatile constraints' API

Constraints.jl implements a wide range of generic and core constraints, ensuring compatibility with XCSP3-core standards and providing a user-friendly interface. It includes features extracted from the learning blocks of Julia Constraints to leverage most of each constraint characteristics.

A collection of models

The ConstraintModels.jl catalog offers a collection of predefined models and templates for constructing complex constraint satisfaction problems (CSPs) and optimization models. This resource provides reusable components to streamline the modeling process.

Contributions with new models are more than welcome!

Internal Aspects

Several internal components are crucial for the efficient functioning of Julia Constraints. ConstraintCommons.jl provides shared functionalities and utilities used across different parts of the framework, contributing to its robust performance and extensibility. However, it is unlikely to be of direct use to most users.

',9);function x3(u3,g3,_3,w3,f3,b3){return a(),o("div",null,[l,t("p",null,[Q,e(" Consider the constraint "),t("mjx-container",r,[(a(),o("svg",T,h)),c]),e(". This constraint involves two variables, "),t("mjx-container",m,[(a(),o("svg",p,u)),g]),e(" and "),t("mjx-container",_,[(a(),o("svg",w,b)),v]),e(", and specifies that their sum must not exceed "),t("mjx-container",H,[(a(),o("svg",k,V)),M]),e(".")]),L,C,t("p",null,[Z,e(" Given the generic constraint "),t("mjx-container",S,[(a(),o("svg",A,j)),P]),e(", if we have variables "),t("mjx-container",D,[(a(),o("svg",B,E)),z]),e(" and "),t("mjx-container",G,[(a(),o("svg",N,q)),O]),e(" in our problem, then the instantiated constraint would be "),t("mjx-container",$,[(a(),o("svg",W,F)),U]),e(".")]),K,Y,t("p",null,[t1,e(" For variables "),t("mjx-container",e1,[(a(),o("svg",o1,s1)),n1]),e(" and "),t("mjx-container",i1,[(a(),o("svg",l1,r1)),T1]),e(" with domains "),t("mjx-container",d1,[(a(),o("svg",h1,m1)),p1]),e(", a configuration could be "),t("mjx-container",x1,[(a(),o("svg",u1,_1)),w1]),e(" and "),t("mjx-container",f1,[(a(),o("svg",b1,H1)),k1]),e(".")]),y1,V1,t("p",null,[M1,e(" Given the constraint instantiation "),t("mjx-container",L1,[(a(),o("svg",C1,S1)),A1]),e(" and the configuration "),t("mjx-container",I1,[(a(),o("svg",j1,D1)),B1]),e(" and "),t("mjx-container",J1,[(a(),o("svg",E1,G1)),N1]),e(", the constraint is satisfied because "),t("mjx-container",R1,[(a(),o("svg",q1,$1)),W1]),e(", which is less than or equal to 10. However, for the configuration "),t("mjx-container",X1,[(a(),o("svg",F1,K1)),Y1]),e(" and "),t("mjx-container",t3,[(a(),o("svg",e3,a3)),s3]),e(", the constraint is violated because "),t("mjx-container",n3,[(a(),o("svg",i3,Q3)),r3]),e(", which exceeds "),t("mjx-container",T3,[(a(),o("svg",d3,c3)),m3]),e(".")]),p3])}const k3=n(i,[["render",x3]]);export{H3 as __pageData,k3 as default}; diff --git a/dev/assets/constraints_00_intro.md.BK4czCKw.lean.js b/dev/assets/constraints_00_intro.md.BK4czCKw.lean.js deleted file mode 100644 index 8f223b5..0000000 --- a/dev/assets/constraints_00_intro.md.BK4czCKw.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as n,c as o,j as t,a as e,a7 as s,o as a}from"./chunks/framework.CBLuZwrP.js";const H3=JSON.parse('{"title":"Introduction to basics constraint-based modeling tools","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/00_intro.md","filePath":"constraints/00_intro.md","lastUpdated":null}'),i={name:"constraints/00_intro.md"},l=s("",7),Q=t("strong",null,"Example:",-1),r={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},T={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.448ex",height:"1.971ex",role:"img",focusable:"false",viewBox:"0 -666 4618 871","aria-hidden":"true"},d=s("",1),h=[d],c=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"+"),t("mi",null,"y"),t("mo",null,"≤"),t("mn",null,"10")])],-1),m={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},p={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},x=t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D465",d:"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z",style:{"stroke-width":"3"}})])])],-1),u=[x],g=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x")])],-1),_={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},w={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.109ex",height:"1.464ex",role:"img",focusable:"false",viewBox:"0 -442 490 647","aria-hidden":"true"},f=t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D466",d:"M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1),b=[f],v=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"y")])],-1),H={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.262ex",height:"1.557ex",role:"img",focusable:"false",viewBox:"0 -666 1000 688","aria-hidden":"true"},y=s("",1),V=[y],M=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"10")])],-1),L=t("h3",{id:"Constraint-Instantiation",tabindex:"-1"},[e("Constraint Instantiation "),t("a",{class:"header-anchor",href:"#Constraint-Instantiation","aria-label":'Permalink to "Constraint Instantiation {#Constraint-Instantiation}"'},"​")],-1),C=t("p",null,[t("strong",null,"Definition:"),e(" A constraint instantiation refers to a specific application of a generic constraint to a particular subset of variables from a problem. It is essentially the constraint applied with the actual variables of the problem.")],-1),Z=t("strong",null,"Example:",-1),S={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.448ex",height:"1.971ex",role:"img",focusable:"false",viewBox:"0 -666 4618 871","aria-hidden":"true"},I=s("",1),j=[I],P=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"+"),t("mi",null,"y"),t("mo",null,"≤"),t("mn",null,"10")])],-1),D={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},B={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.282ex",height:"1.339ex",role:"img",focusable:"false",viewBox:"0 -442 1008.6 592","aria-hidden":"true"},J=s("",1),E=[J],z=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"x"),t("mn",null,"1")])])],-1),G={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},N={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.282ex",height:"1.339ex",role:"img",focusable:"false",viewBox:"0 -442 1008.6 592","aria-hidden":"true"},R=s("",1),q=[R],O=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"x"),t("mn",null,"2")])])],-1),$={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},W={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"12.609ex",height:"1.846ex",role:"img",focusable:"false",viewBox:"0 -666 5573.1 816","aria-hidden":"true"},X=s("",1),F=[X],U=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"x"),t("mn",null,"1")]),t("mo",null,"+"),t("msub",null,[t("mi",null,"x"),t("mn",null,"2")]),t("mo",null,"≤"),t("mn",null,"10")])],-1),K=t("h3",{id:"configuration",tabindex:"-1"},[e("Configuration "),t("a",{class:"header-anchor",href:"#configuration","aria-label":'Permalink to "Configuration"'},"​")],-1),Y=t("p",null,[t("strong",null,"Definition:"),e(" A configuration, also known as an assignment, is a specific set of values assigned to the variables in their respective domains. It represents a possible state of the variables.")],-1),t1=t("strong",null,"Example:",-1),e1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},a1=t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D465",d:"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z",style:{"stroke-width":"3"}})])])],-1),s1=[a1],n1=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x")])],-1),i1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},l1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.109ex",height:"1.464ex",role:"img",focusable:"false",viewBox:"0 -442 490 647","aria-hidden":"true"},Q1=t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D466",d:"M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1),r1=[Q1],T1=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"y")])],-1),d1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},h1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.658ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2500.7 1000","aria-hidden":"true"},c1=s("",1),m1=[c1],p1=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mo",{stretchy:"false"},"["),t("mn",null,"0"),t("mo",null,","),t("mn",null,"10"),t("mo",{stretchy:"false"},"]")])],-1),x1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.442ex",height:"1.69ex",role:"img",focusable:"false",viewBox:"0 -665 2405.6 747","aria-hidden":"true"},g1=s("",1),_1=[g1],w1=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"="),t("mn",null,"3")])],-1),f1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.257ex",height:"1.971ex",role:"img",focusable:"false",viewBox:"0 -666 2323.6 871","aria-hidden":"true"},v1=s("",1),H1=[v1],k1=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"y"),t("mo",null,"="),t("mn",null,"2")])],-1),y1=t("h3",{id:"Constraint-Satisfaction-or-Violation-by-a-Configuration",tabindex:"-1"},[e("Constraint Satisfaction or Violation by a Configuration "),t("a",{class:"header-anchor",href:"#Constraint-Satisfaction-or-Violation-by-a-Configuration","aria-label":'Permalink to "Constraint Satisfaction or Violation by a Configuration {#Constraint-Satisfaction-or-Violation-by-a-Configuration}"'},"​")],-1),V1=t("p",null,[t("strong",null,"Definition:"),e(" This refers to whether a specific configuration (set of variable assignments) satisfies or violates a given constraint instantiation. A constraint is satisfied if the configuration makes the constraint "),t("code",null,"true"),e("; otherwise, it is violated ("),t("code",null,"false"),e(").")],-1),M1=t("strong",null,"Example:",-1),L1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},C1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.448ex",height:"1.971ex",role:"img",focusable:"false",viewBox:"0 -666 4618 871","aria-hidden":"true"},Z1=s("",1),S1=[Z1],A1=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"+"),t("mi",null,"y"),t("mo",null,"≤"),t("mn",null,"10")])],-1),I1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},j1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.442ex",height:"1.69ex",role:"img",focusable:"false",viewBox:"0 -665 2405.6 747","aria-hidden":"true"},P1=s("",1),D1=[P1],B1=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"="),t("mn",null,"3")])],-1),J1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},E1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.257ex",height:"1.971ex",role:"img",focusable:"false",viewBox:"0 -666 2323.6 871","aria-hidden":"true"},z1=s("",1),G1=[z1],N1=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"y"),t("mo",null,"="),t("mn",null,"2")])],-1),R1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},q1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"9.176ex",height:"1.692ex",role:"img",focusable:"false",viewBox:"0 -666 4056 748","aria-hidden":"true"},O1=s("",1),$1=[O1],W1=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"3"),t("mo",null,"+"),t("mn",null,"2"),t("mo",null,"="),t("mn",null,"5")])],-1),X1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},F1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.442ex",height:"1.692ex",role:"img",focusable:"false",viewBox:"0 -666 2405.6 748","aria-hidden":"true"},U1=s("",1),K1=[U1],Y1=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"="),t("mn",null,"6")])],-1),t3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},e3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.257ex",height:"1.971ex",role:"img",focusable:"false",viewBox:"0 -666 2323.6 871","aria-hidden":"true"},o3=s("",1),a3=[o3],s3=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"y"),t("mo",null,"="),t("mn",null,"5")])],-1),n3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},i3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.308ex",height:"1.692ex",role:"img",focusable:"false",viewBox:"0 -666 4556 748","aria-hidden":"true"},l3=s("",1),Q3=[l3],r3=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"6"),t("mo",null,"+"),t("mn",null,"5"),t("mo",null,"="),t("mn",null,"11")])],-1),T3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.262ex",height:"1.557ex",role:"img",focusable:"false",viewBox:"0 -666 1000 688","aria-hidden":"true"},h3=s("",1),c3=[h3],m3=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"10")])],-1),p3=s("",9);function x3(u3,g3,_3,w3,f3,b3){return a(),o("div",null,[l,t("p",null,[Q,e(" Consider the constraint "),t("mjx-container",r,[(a(),o("svg",T,h)),c]),e(". This constraint involves two variables, "),t("mjx-container",m,[(a(),o("svg",p,u)),g]),e(" and "),t("mjx-container",_,[(a(),o("svg",w,b)),v]),e(", and specifies that their sum must not exceed "),t("mjx-container",H,[(a(),o("svg",k,V)),M]),e(".")]),L,C,t("p",null,[Z,e(" Given the generic constraint "),t("mjx-container",S,[(a(),o("svg",A,j)),P]),e(", if we have variables "),t("mjx-container",D,[(a(),o("svg",B,E)),z]),e(" and "),t("mjx-container",G,[(a(),o("svg",N,q)),O]),e(" in our problem, then the instantiated constraint would be "),t("mjx-container",$,[(a(),o("svg",W,F)),U]),e(".")]),K,Y,t("p",null,[t1,e(" For variables "),t("mjx-container",e1,[(a(),o("svg",o1,s1)),n1]),e(" and "),t("mjx-container",i1,[(a(),o("svg",l1,r1)),T1]),e(" with domains "),t("mjx-container",d1,[(a(),o("svg",h1,m1)),p1]),e(", a configuration could be "),t("mjx-container",x1,[(a(),o("svg",u1,_1)),w1]),e(" and "),t("mjx-container",f1,[(a(),o("svg",b1,H1)),k1]),e(".")]),y1,V1,t("p",null,[M1,e(" Given the constraint instantiation "),t("mjx-container",L1,[(a(),o("svg",C1,S1)),A1]),e(" and the configuration "),t("mjx-container",I1,[(a(),o("svg",j1,D1)),B1]),e(" and "),t("mjx-container",J1,[(a(),o("svg",E1,G1)),N1]),e(", the constraint is satisfied because "),t("mjx-container",R1,[(a(),o("svg",q1,$1)),W1]),e(", which is less than or equal to 10. However, for the configuration "),t("mjx-container",X1,[(a(),o("svg",F1,K1)),Y1]),e(" and "),t("mjx-container",t3,[(a(),o("svg",e3,a3)),s3]),e(", the constraint is violated because "),t("mjx-container",n3,[(a(),o("svg",i3,Q3)),r3]),e(", which exceeds "),t("mjx-container",T3,[(a(),o("svg",d3,c3)),m3]),e(".")]),p3])}const k3=n(i,[["render",x3]]);export{H3 as __pageData,k3 as default}; diff --git a/dev/assets/constraints_00_intro.md.wE3p7Yn4.js b/dev/assets/constraints_00_intro.md.wE3p7Yn4.js new file mode 100644 index 0000000..77c94ad --- /dev/null +++ b/dev/assets/constraints_00_intro.md.wE3p7Yn4.js @@ -0,0 +1 @@ +import{_ as l,c as a,a5 as s,j as t,a as o,o as n}from"./chunks/framework.CJakPlgM.js";const a1=JSON.parse('{"title":"Introduction to basics constraint-based modeling tools","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/00_intro.md","filePath":"constraints/00_intro.md","lastUpdated":null}'),i={name:"constraints/00_intro.md"},Q={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},r={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.448ex",height:"1.971ex",role:"img",focusable:"false",viewBox:"0 -666 4618 871","aria-hidden":"true"},T={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},m={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},p={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.109ex",height:"1.464ex",role:"img",focusable:"false",viewBox:"0 -442 490 647","aria-hidden":"true"},h={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},x={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.262ex",height:"1.557ex",role:"img",focusable:"false",viewBox:"0 -666 1000 688","aria-hidden":"true"},u={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.448ex",height:"1.971ex",role:"img",focusable:"false",viewBox:"0 -666 4618 871","aria-hidden":"true"},w={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.282ex",height:"1.339ex",role:"img",focusable:"false",viewBox:"0 -442 1008.6 592","aria-hidden":"true"},f={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.282ex",height:"1.339ex",role:"img",focusable:"false",viewBox:"0 -442 1008.6 592","aria-hidden":"true"},v={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},H={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"12.609ex",height:"1.846ex",role:"img",focusable:"false",viewBox:"0 -666 5573.1 816","aria-hidden":"true"},k={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},y={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},M={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},V={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.109ex",height:"1.464ex",role:"img",focusable:"false",viewBox:"0 -442 490 647","aria-hidden":"true"},L={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Z={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.658ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2500.7 1000","aria-hidden":"true"},C={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},j={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.442ex",height:"1.69ex",role:"img",focusable:"false",viewBox:"0 -665 2405.6 747","aria-hidden":"true"},D={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},S={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.257ex",height:"1.971ex",role:"img",focusable:"false",viewBox:"0 -666 2323.6 871","aria-hidden":"true"},B={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},I={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.448ex",height:"1.971ex",role:"img",focusable:"false",viewBox:"0 -666 4618 871","aria-hidden":"true"},J={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.442ex",height:"1.69ex",role:"img",focusable:"false",viewBox:"0 -665 2405.6 747","aria-hidden":"true"},P={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},z={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.257ex",height:"1.971ex",role:"img",focusable:"false",viewBox:"0 -666 2323.6 871","aria-hidden":"true"},G={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},q={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"9.176ex",height:"1.692ex",role:"img",focusable:"false",viewBox:"0 -666 4056 748","aria-hidden":"true"},E={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},N={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.442ex",height:"1.692ex",role:"img",focusable:"false",viewBox:"0 -666 2405.6 748","aria-hidden":"true"},O={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},$={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.257ex",height:"1.971ex",role:"img",focusable:"false",viewBox:"0 -666 2323.6 871","aria-hidden":"true"},W={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},X={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.308ex",height:"1.692ex",role:"img",focusable:"false",viewBox:"0 -666 4556 748","aria-hidden":"true"},F={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},U={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.262ex",height:"1.557ex",role:"img",focusable:"false",viewBox:"0 -666 1000 688","aria-hidden":"true"};function K(R,e,Y,_,t1,e1){return n(),a("div",null,[e[71]||(e[71]=s('

Introduction to basics constraint-based modeling tools

Constraint programming (CP) is a high-level paradigm for solving combinatorial problems, and Julia Constraints provides an efficient and flexible framework for developing constraint-based models.

All along this documentation, we will present code example base on the syntaxes of Julia Constraints internals (JC-API), of Julia for Mathematical Programming (JuMP ), of MathOptInterface (MOI), and, when relevant, of other standards such as XCSP.

Terminology

Warning

Terminology in Optimization varies strongly between different methods and communities. In this doc we try to be consistent with the following principles (in bold).

  • Constraint: A general mathematical predicate involving variables.

  • Constraint Instantiation: The application of a constraint to specific variables.

  • Configuration: A specific assignment of values to the variables.

  • Constraint Satisfaction/Violation: Whether a configuration meets or fails a constraint.

Constraint

Definition: A constraint is a formal mathematical statement that expresses a condition or a relation between a set of variables. It can be seen as a predicate that the variables must satisfy.

',7)),t("p",null,[e[8]||(e[8]=t("strong",null,"Example:",-1)),e[9]||(e[9]=o(" Consider the constraint ")),t("mjx-container",Q,[(n(),a("svg",r,e[0]||(e[0]=[s('',1)]))),e[1]||(e[1]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"+"),t("mi",null,"y"),t("mo",null,"≤"),t("mn",null,"10")])],-1))]),e[10]||(e[10]=o(". This constraint involves two variables, ")),t("mjx-container",T,[(n(),a("svg",d,e[2]||(e[2]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D465",d:"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z",style:{"stroke-width":"3"}})])])],-1)]))),e[3]||(e[3]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x")])],-1))]),e[11]||(e[11]=o(" and ")),t("mjx-container",m,[(n(),a("svg",p,e[4]||(e[4]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D466",d:"M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),e[5]||(e[5]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"y")])],-1))]),e[12]||(e[12]=o(", and specifies that their sum must not exceed ")),t("mjx-container",h,[(n(),a("svg",x,e[6]||(e[6]=[s('',1)]))),e[7]||(e[7]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"10")])],-1))]),e[13]||(e[13]=o("."))]),e[72]||(e[72]=t("h3",{id:"Constraint-Instantiation",tabindex:"-1"},[o("Constraint Instantiation "),t("a",{class:"header-anchor",href:"#Constraint-Instantiation","aria-label":'Permalink to "Constraint Instantiation {#Constraint-Instantiation}"'},"​")],-1)),e[73]||(e[73]=t("p",null,[t("strong",null,"Definition:"),o(" A constraint instantiation refers to a specific application of a generic constraint to a particular subset of variables from a problem. It is essentially the constraint applied with the actual variables of the problem.")],-1)),t("p",null,[e[22]||(e[22]=t("strong",null,"Example:",-1)),e[23]||(e[23]=o(" Given the generic constraint ")),t("mjx-container",u,[(n(),a("svg",g,e[14]||(e[14]=[s('',1)]))),e[15]||(e[15]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"+"),t("mi",null,"y"),t("mo",null,"≤"),t("mn",null,"10")])],-1))]),e[24]||(e[24]=o(", if we have variables ")),t("mjx-container",w,[(n(),a("svg",c,e[16]||(e[16]=[s('',1)]))),e[17]||(e[17]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"x"),t("mn",null,"1")])])],-1))]),e[25]||(e[25]=o(" and ")),t("mjx-container",f,[(n(),a("svg",b,e[18]||(e[18]=[s('',1)]))),e[19]||(e[19]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"x"),t("mn",null,"2")])])],-1))]),e[26]||(e[26]=o(" in our problem, then the instantiated constraint would be ")),t("mjx-container",v,[(n(),a("svg",H,e[20]||(e[20]=[s('',1)]))),e[21]||(e[21]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"x"),t("mn",null,"1")]),t("mo",null,"+"),t("msub",null,[t("mi",null,"x"),t("mn",null,"2")]),t("mo",null,"≤"),t("mn",null,"10")])],-1))]),e[27]||(e[27]=o("."))]),e[74]||(e[74]=t("h3",{id:"configuration",tabindex:"-1"},[o("Configuration "),t("a",{class:"header-anchor",href:"#configuration","aria-label":'Permalink to "Configuration"'},"​")],-1)),e[75]||(e[75]=t("p",null,[t("strong",null,"Definition:"),o(" A configuration, also known as an assignment, is a specific set of values assigned to the variables in their respective domains. It represents a possible state of the variables.")],-1)),t("p",null,[e[38]||(e[38]=t("strong",null,"Example:",-1)),e[39]||(e[39]=o(" For variables ")),t("mjx-container",k,[(n(),a("svg",y,e[28]||(e[28]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D465",d:"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z",style:{"stroke-width":"3"}})])])],-1)]))),e[29]||(e[29]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x")])],-1))]),e[40]||(e[40]=o(" and ")),t("mjx-container",M,[(n(),a("svg",V,e[30]||(e[30]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D466",d:"M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),e[31]||(e[31]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"y")])],-1))]),e[41]||(e[41]=o(" with domains ")),t("mjx-container",L,[(n(),a("svg",Z,e[32]||(e[32]=[s('',1)]))),e[33]||(e[33]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mo",{stretchy:"false"},"["),t("mn",null,"0"),t("mo",null,","),t("mn",null,"10"),t("mo",{stretchy:"false"},"]")])],-1))]),e[42]||(e[42]=o(", a configuration could be ")),t("mjx-container",C,[(n(),a("svg",j,e[34]||(e[34]=[s('',1)]))),e[35]||(e[35]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"="),t("mn",null,"3")])],-1))]),e[43]||(e[43]=o(" and ")),t("mjx-container",D,[(n(),a("svg",S,e[36]||(e[36]=[s('',1)]))),e[37]||(e[37]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"y"),t("mo",null,"="),t("mn",null,"2")])],-1))]),e[44]||(e[44]=o("."))]),e[76]||(e[76]=t("h3",{id:"Constraint-Satisfaction-or-Violation-by-a-Configuration",tabindex:"-1"},[o("Constraint Satisfaction or Violation by a Configuration "),t("a",{class:"header-anchor",href:"#Constraint-Satisfaction-or-Violation-by-a-Configuration","aria-label":'Permalink to "Constraint Satisfaction or Violation by a Configuration {#Constraint-Satisfaction-or-Violation-by-a-Configuration}"'},"​")],-1)),e[77]||(e[77]=t("p",null,[t("strong",null,"Definition:"),o(" This refers to whether a specific configuration (set of variable assignments) satisfies or violates a given constraint instantiation. A constraint is satisfied if the configuration makes the constraint "),t("code",null,"true"),o("; otherwise, it is violated ("),t("code",null,"false"),o(").")],-1)),t("p",null,[e[61]||(e[61]=t("strong",null,"Example:",-1)),e[62]||(e[62]=o(" Given the constraint instantiation ")),t("mjx-container",B,[(n(),a("svg",I,e[45]||(e[45]=[s('',1)]))),e[46]||(e[46]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"+"),t("mi",null,"y"),t("mo",null,"≤"),t("mn",null,"10")])],-1))]),e[63]||(e[63]=o(" and the configuration ")),t("mjx-container",J,[(n(),a("svg",A,e[47]||(e[47]=[s('',1)]))),e[48]||(e[48]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"="),t("mn",null,"3")])],-1))]),e[64]||(e[64]=o(" and ")),t("mjx-container",P,[(n(),a("svg",z,e[49]||(e[49]=[s('',1)]))),e[50]||(e[50]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"y"),t("mo",null,"="),t("mn",null,"2")])],-1))]),e[65]||(e[65]=o(", the constraint is satisfied because ")),t("mjx-container",G,[(n(),a("svg",q,e[51]||(e[51]=[s('',1)]))),e[52]||(e[52]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"3"),t("mo",null,"+"),t("mn",null,"2"),t("mo",null,"="),t("mn",null,"5")])],-1))]),e[66]||(e[66]=o(", which is less than or equal to 10. However, for the configuration ")),t("mjx-container",E,[(n(),a("svg",N,e[53]||(e[53]=[s('',1)]))),e[54]||(e[54]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"="),t("mn",null,"6")])],-1))]),e[67]||(e[67]=o(" and ")),t("mjx-container",O,[(n(),a("svg",$,e[55]||(e[55]=[s('',1)]))),e[56]||(e[56]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"y"),t("mo",null,"="),t("mn",null,"5")])],-1))]),e[68]||(e[68]=o(", the constraint is violated because ")),t("mjx-container",W,[(n(),a("svg",X,e[57]||(e[57]=[s('',1)]))),e[58]||(e[58]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"6"),t("mo",null,"+"),t("mn",null,"5"),t("mo",null,"="),t("mn",null,"11")])],-1))]),e[69]||(e[69]=o(", which exceeds ")),t("mjx-container",F,[(n(),a("svg",U,e[59]||(e[59]=[s('',1)]))),e[60]||(e[60]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"10")])],-1))]),e[70]||(e[70]=o("."))]),e[78]||(e[78]=s('

Domain-defined variables

In CP, variables are defined through their domain. ConstraintDomains.jl supports various types of domains such as discrete ones (sets, range, etc.), or continuous intervals, and custom domains.

A versatile constraints' API

Constraints.jl implements a wide range of generic and core constraints, ensuring compatibility with XCSP3-core standards and providing a user-friendly interface. It includes features extracted from the learning blocks of Julia Constraints to leverage most of each constraint characteristics.

A collection of models

The ConstraintModels.jl catalog offers a collection of predefined models and templates for constructing complex constraint satisfaction problems (CSPs) and optimization models. This resource provides reusable components to streamline the modeling process.

Contributions with new models are more than welcome!

Internal Aspects

Several internal components are crucial for the efficient functioning of Julia Constraints. ConstraintCommons.jl provides shared functionalities and utilities used across different parts of the framework, contributing to its robust performance and extensibility. However, it is unlikely to be of direct use to most users.

',9))])}const n1=l(i,[["render",K]]);export{a1 as __pageData,n1 as default}; diff --git a/dev/assets/constraints_00_intro.md.wE3p7Yn4.lean.js b/dev/assets/constraints_00_intro.md.wE3p7Yn4.lean.js new file mode 100644 index 0000000..77c94ad --- /dev/null +++ b/dev/assets/constraints_00_intro.md.wE3p7Yn4.lean.js @@ -0,0 +1 @@ +import{_ as l,c as a,a5 as s,j as t,a as o,o as n}from"./chunks/framework.CJakPlgM.js";const a1=JSON.parse('{"title":"Introduction to basics constraint-based modeling tools","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/00_intro.md","filePath":"constraints/00_intro.md","lastUpdated":null}'),i={name:"constraints/00_intro.md"},Q={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},r={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.448ex",height:"1.971ex",role:"img",focusable:"false",viewBox:"0 -666 4618 871","aria-hidden":"true"},T={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},m={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},p={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.109ex",height:"1.464ex",role:"img",focusable:"false",viewBox:"0 -442 490 647","aria-hidden":"true"},h={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},x={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.262ex",height:"1.557ex",role:"img",focusable:"false",viewBox:"0 -666 1000 688","aria-hidden":"true"},u={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.448ex",height:"1.971ex",role:"img",focusable:"false",viewBox:"0 -666 4618 871","aria-hidden":"true"},w={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.282ex",height:"1.339ex",role:"img",focusable:"false",viewBox:"0 -442 1008.6 592","aria-hidden":"true"},f={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.282ex",height:"1.339ex",role:"img",focusable:"false",viewBox:"0 -442 1008.6 592","aria-hidden":"true"},v={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},H={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"12.609ex",height:"1.846ex",role:"img",focusable:"false",viewBox:"0 -666 5573.1 816","aria-hidden":"true"},k={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},y={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},M={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},V={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.109ex",height:"1.464ex",role:"img",focusable:"false",viewBox:"0 -442 490 647","aria-hidden":"true"},L={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Z={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.658ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2500.7 1000","aria-hidden":"true"},C={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},j={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.442ex",height:"1.69ex",role:"img",focusable:"false",viewBox:"0 -665 2405.6 747","aria-hidden":"true"},D={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},S={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.257ex",height:"1.971ex",role:"img",focusable:"false",viewBox:"0 -666 2323.6 871","aria-hidden":"true"},B={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},I={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.448ex",height:"1.971ex",role:"img",focusable:"false",viewBox:"0 -666 4618 871","aria-hidden":"true"},J={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.442ex",height:"1.69ex",role:"img",focusable:"false",viewBox:"0 -665 2405.6 747","aria-hidden":"true"},P={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},z={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.257ex",height:"1.971ex",role:"img",focusable:"false",viewBox:"0 -666 2323.6 871","aria-hidden":"true"},G={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},q={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"9.176ex",height:"1.692ex",role:"img",focusable:"false",viewBox:"0 -666 4056 748","aria-hidden":"true"},E={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},N={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.442ex",height:"1.692ex",role:"img",focusable:"false",viewBox:"0 -666 2405.6 748","aria-hidden":"true"},O={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},$={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.257ex",height:"1.971ex",role:"img",focusable:"false",viewBox:"0 -666 2323.6 871","aria-hidden":"true"},W={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},X={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.308ex",height:"1.692ex",role:"img",focusable:"false",viewBox:"0 -666 4556 748","aria-hidden":"true"},F={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},U={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.262ex",height:"1.557ex",role:"img",focusable:"false",viewBox:"0 -666 1000 688","aria-hidden":"true"};function K(R,e,Y,_,t1,e1){return n(),a("div",null,[e[71]||(e[71]=s('

Introduction to basics constraint-based modeling tools

Constraint programming (CP) is a high-level paradigm for solving combinatorial problems, and Julia Constraints provides an efficient and flexible framework for developing constraint-based models.

All along this documentation, we will present code example base on the syntaxes of Julia Constraints internals (JC-API), of Julia for Mathematical Programming (JuMP ), of MathOptInterface (MOI), and, when relevant, of other standards such as XCSP.

Terminology

Warning

Terminology in Optimization varies strongly between different methods and communities. In this doc we try to be consistent with the following principles (in bold).

  • Constraint: A general mathematical predicate involving variables.

  • Constraint Instantiation: The application of a constraint to specific variables.

  • Configuration: A specific assignment of values to the variables.

  • Constraint Satisfaction/Violation: Whether a configuration meets or fails a constraint.

Constraint

Definition: A constraint is a formal mathematical statement that expresses a condition or a relation between a set of variables. It can be seen as a predicate that the variables must satisfy.

',7)),t("p",null,[e[8]||(e[8]=t("strong",null,"Example:",-1)),e[9]||(e[9]=o(" Consider the constraint ")),t("mjx-container",Q,[(n(),a("svg",r,e[0]||(e[0]=[s('',1)]))),e[1]||(e[1]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"+"),t("mi",null,"y"),t("mo",null,"≤"),t("mn",null,"10")])],-1))]),e[10]||(e[10]=o(". This constraint involves two variables, ")),t("mjx-container",T,[(n(),a("svg",d,e[2]||(e[2]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D465",d:"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z",style:{"stroke-width":"3"}})])])],-1)]))),e[3]||(e[3]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x")])],-1))]),e[11]||(e[11]=o(" and ")),t("mjx-container",m,[(n(),a("svg",p,e[4]||(e[4]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D466",d:"M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),e[5]||(e[5]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"y")])],-1))]),e[12]||(e[12]=o(", and specifies that their sum must not exceed ")),t("mjx-container",h,[(n(),a("svg",x,e[6]||(e[6]=[s('',1)]))),e[7]||(e[7]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"10")])],-1))]),e[13]||(e[13]=o("."))]),e[72]||(e[72]=t("h3",{id:"Constraint-Instantiation",tabindex:"-1"},[o("Constraint Instantiation "),t("a",{class:"header-anchor",href:"#Constraint-Instantiation","aria-label":'Permalink to "Constraint Instantiation {#Constraint-Instantiation}"'},"​")],-1)),e[73]||(e[73]=t("p",null,[t("strong",null,"Definition:"),o(" A constraint instantiation refers to a specific application of a generic constraint to a particular subset of variables from a problem. It is essentially the constraint applied with the actual variables of the problem.")],-1)),t("p",null,[e[22]||(e[22]=t("strong",null,"Example:",-1)),e[23]||(e[23]=o(" Given the generic constraint ")),t("mjx-container",u,[(n(),a("svg",g,e[14]||(e[14]=[s('',1)]))),e[15]||(e[15]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"+"),t("mi",null,"y"),t("mo",null,"≤"),t("mn",null,"10")])],-1))]),e[24]||(e[24]=o(", if we have variables ")),t("mjx-container",w,[(n(),a("svg",c,e[16]||(e[16]=[s('',1)]))),e[17]||(e[17]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"x"),t("mn",null,"1")])])],-1))]),e[25]||(e[25]=o(" and ")),t("mjx-container",f,[(n(),a("svg",b,e[18]||(e[18]=[s('',1)]))),e[19]||(e[19]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"x"),t("mn",null,"2")])])],-1))]),e[26]||(e[26]=o(" in our problem, then the instantiated constraint would be ")),t("mjx-container",v,[(n(),a("svg",H,e[20]||(e[20]=[s('',1)]))),e[21]||(e[21]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"x"),t("mn",null,"1")]),t("mo",null,"+"),t("msub",null,[t("mi",null,"x"),t("mn",null,"2")]),t("mo",null,"≤"),t("mn",null,"10")])],-1))]),e[27]||(e[27]=o("."))]),e[74]||(e[74]=t("h3",{id:"configuration",tabindex:"-1"},[o("Configuration "),t("a",{class:"header-anchor",href:"#configuration","aria-label":'Permalink to "Configuration"'},"​")],-1)),e[75]||(e[75]=t("p",null,[t("strong",null,"Definition:"),o(" A configuration, also known as an assignment, is a specific set of values assigned to the variables in their respective domains. It represents a possible state of the variables.")],-1)),t("p",null,[e[38]||(e[38]=t("strong",null,"Example:",-1)),e[39]||(e[39]=o(" For variables ")),t("mjx-container",k,[(n(),a("svg",y,e[28]||(e[28]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D465",d:"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z",style:{"stroke-width":"3"}})])])],-1)]))),e[29]||(e[29]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x")])],-1))]),e[40]||(e[40]=o(" and ")),t("mjx-container",M,[(n(),a("svg",V,e[30]||(e[30]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D466",d:"M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),e[31]||(e[31]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"y")])],-1))]),e[41]||(e[41]=o(" with domains ")),t("mjx-container",L,[(n(),a("svg",Z,e[32]||(e[32]=[s('',1)]))),e[33]||(e[33]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mo",{stretchy:"false"},"["),t("mn",null,"0"),t("mo",null,","),t("mn",null,"10"),t("mo",{stretchy:"false"},"]")])],-1))]),e[42]||(e[42]=o(", a configuration could be ")),t("mjx-container",C,[(n(),a("svg",j,e[34]||(e[34]=[s('',1)]))),e[35]||(e[35]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"="),t("mn",null,"3")])],-1))]),e[43]||(e[43]=o(" and ")),t("mjx-container",D,[(n(),a("svg",S,e[36]||(e[36]=[s('',1)]))),e[37]||(e[37]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"y"),t("mo",null,"="),t("mn",null,"2")])],-1))]),e[44]||(e[44]=o("."))]),e[76]||(e[76]=t("h3",{id:"Constraint-Satisfaction-or-Violation-by-a-Configuration",tabindex:"-1"},[o("Constraint Satisfaction or Violation by a Configuration "),t("a",{class:"header-anchor",href:"#Constraint-Satisfaction-or-Violation-by-a-Configuration","aria-label":'Permalink to "Constraint Satisfaction or Violation by a Configuration {#Constraint-Satisfaction-or-Violation-by-a-Configuration}"'},"​")],-1)),e[77]||(e[77]=t("p",null,[t("strong",null,"Definition:"),o(" This refers to whether a specific configuration (set of variable assignments) satisfies or violates a given constraint instantiation. A constraint is satisfied if the configuration makes the constraint "),t("code",null,"true"),o("; otherwise, it is violated ("),t("code",null,"false"),o(").")],-1)),t("p",null,[e[61]||(e[61]=t("strong",null,"Example:",-1)),e[62]||(e[62]=o(" Given the constraint instantiation ")),t("mjx-container",B,[(n(),a("svg",I,e[45]||(e[45]=[s('',1)]))),e[46]||(e[46]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"+"),t("mi",null,"y"),t("mo",null,"≤"),t("mn",null,"10")])],-1))]),e[63]||(e[63]=o(" and the configuration ")),t("mjx-container",J,[(n(),a("svg",A,e[47]||(e[47]=[s('',1)]))),e[48]||(e[48]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"="),t("mn",null,"3")])],-1))]),e[64]||(e[64]=o(" and ")),t("mjx-container",P,[(n(),a("svg",z,e[49]||(e[49]=[s('',1)]))),e[50]||(e[50]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"y"),t("mo",null,"="),t("mn",null,"2")])],-1))]),e[65]||(e[65]=o(", the constraint is satisfied because ")),t("mjx-container",G,[(n(),a("svg",q,e[51]||(e[51]=[s('',1)]))),e[52]||(e[52]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"3"),t("mo",null,"+"),t("mn",null,"2"),t("mo",null,"="),t("mn",null,"5")])],-1))]),e[66]||(e[66]=o(", which is less than or equal to 10. However, for the configuration ")),t("mjx-container",E,[(n(),a("svg",N,e[53]||(e[53]=[s('',1)]))),e[54]||(e[54]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"="),t("mn",null,"6")])],-1))]),e[67]||(e[67]=o(" and ")),t("mjx-container",O,[(n(),a("svg",$,e[55]||(e[55]=[s('',1)]))),e[56]||(e[56]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"y"),t("mo",null,"="),t("mn",null,"5")])],-1))]),e[68]||(e[68]=o(", the constraint is violated because ")),t("mjx-container",W,[(n(),a("svg",X,e[57]||(e[57]=[s('',1)]))),e[58]||(e[58]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"6"),t("mo",null,"+"),t("mn",null,"5"),t("mo",null,"="),t("mn",null,"11")])],-1))]),e[69]||(e[69]=o(", which exceeds ")),t("mjx-container",F,[(n(),a("svg",U,e[59]||(e[59]=[s('',1)]))),e[60]||(e[60]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"10")])],-1))]),e[70]||(e[70]=o("."))]),e[78]||(e[78]=s('

Domain-defined variables

In CP, variables are defined through their domain. ConstraintDomains.jl supports various types of domains such as discrete ones (sets, range, etc.), or continuous intervals, and custom domains.

A versatile constraints' API

Constraints.jl implements a wide range of generic and core constraints, ensuring compatibility with XCSP3-core standards and providing a user-friendly interface. It includes features extracted from the learning blocks of Julia Constraints to leverage most of each constraint characteristics.

A collection of models

The ConstraintModels.jl catalog offers a collection of predefined models and templates for constructing complex constraint satisfaction problems (CSPs) and optimization models. This resource provides reusable components to streamline the modeling process.

Contributions with new models are more than welcome!

Internal Aspects

Several internal components are crucial for the efficient functioning of Julia Constraints. ConstraintCommons.jl provides shared functionalities and utilities used across different parts of the framework, contributing to its robust performance and extensibility. However, it is unlikely to be of direct use to most users.

',9))])}const n1=l(i,[["render",K]]);export{a1 as __pageData,n1 as default}; diff --git a/dev/assets/constraints_10_variables_and_domains.md.BQBZY0dG.lean.js b/dev/assets/constraints_10_variables_and_domains.md.BQBZY0dG.lean.js deleted file mode 100644 index e9eb668..0000000 --- a/dev/assets/constraints_10_variables_and_domains.md.BQBZY0dG.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,c as a,j as s,a as i,a7 as t,o as n}from"./chunks/framework.CBLuZwrP.js";const f=JSON.parse('{"title":"Defining Variables and Exploring Domains","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/10_variables_and_domains.md","filePath":"constraints/10_variables_and_domains.md","lastUpdated":null}'),l={name:"constraints/10_variables_and_domains.md"},h=t("",4),p=s("em",null,"ConstraintDomains.jl",-1),k=s("code",null,"AbstractDomain",-1),d=s("code",null,"AbstractDomain",-1),r={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.509ex",height:"1.312ex",role:"img",focusable:"false",viewBox:"0 -540 667 580","aria-hidden":"true"},E=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mo"},[s("path",{"data-c":"2208",d:"M84 250Q84 372 166 450T360 539Q361 539 377 539T419 540T469 540H568Q583 532 583 520Q583 511 570 501L466 500Q355 499 329 494Q280 482 242 458T183 409T147 354T129 306T124 272V270H568Q583 262 583 250T568 230H124V228Q124 207 134 177T167 112T231 48T328 7Q355 1 466 0H570Q583 -10 583 -20Q583 -32 568 -40H471Q464 -40 446 -40T417 -41Q262 -41 172 45Q84 127 84 250Z",style:{"stroke-width":"3"}})])])],-1),g=[E],c=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mo",null,"∈")])],-1),y=s("code",null,"rand",-1),m=s("code",null,"length",-1),C=t("",16);function F(u,b,D,v,A,B){return n(),a("div",null,[h,s("p",null,[i("At the foundation of "),p,i(" is the "),k,i(" type, an abstract supertype for all domain types. Implementations of "),d,i(" must provide methods for checking membership ("),s("mjx-container",r,[(n(),a("svg",o,g)),c]),i("), generating random elements ("),y,i("), and determining the domain's size or range ("),m,i("). These functionalities are essential for defining the behavior and properties of variable domains within constraint models.")]),C])}const x=e(l,[["render",F]]);export{f as __pageData,x as default}; diff --git a/dev/assets/constraints_10_variables_and_domains.md.BQBZY0dG.js b/dev/assets/constraints_10_variables_and_domains.md.DZUAY6r3.js similarity index 74% rename from dev/assets/constraints_10_variables_and_domains.md.BQBZY0dG.js rename to dev/assets/constraints_10_variables_and_domains.md.DZUAY6r3.js index 1ca1a8a..1b7ec51 100644 --- a/dev/assets/constraints_10_variables_and_domains.md.BQBZY0dG.js +++ b/dev/assets/constraints_10_variables_and_domains.md.DZUAY6r3.js @@ -1,4 +1,4 @@ -import{_ as e,c as a,j as s,a as i,a7 as t,o as n}from"./chunks/framework.CBLuZwrP.js";const f=JSON.parse('{"title":"Defining Variables and Exploring Domains","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/10_variables_and_domains.md","filePath":"constraints/10_variables_and_domains.md","lastUpdated":null}'),l={name:"constraints/10_variables_and_domains.md"},h=t('

Defining Variables and Exploring Domains

ConstraintDomains.jl stands as the standard way to define variables and explore domains within the Julia Constraints ecosystem. This package provides the infrastructure necessary for specifying both discrete and continuous domains. Explorations features are mainly related to the learning about constraints aspect and will be detailed in that chapter.

Variables and their domains can also be defined through MOI and JuMP syntaxes in their respective models.

Implementing the AbstractDomain Interface

',4),p=s("em",null,"ConstraintDomains.jl",-1),k=s("code",null,"AbstractDomain",-1),d=s("code",null,"AbstractDomain",-1),r={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.509ex",height:"1.312ex",role:"img",focusable:"false",viewBox:"0 -540 667 580","aria-hidden":"true"},E=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mo"},[s("path",{"data-c":"2208",d:"M84 250Q84 372 166 450T360 539Q361 539 377 539T419 540T469 540H568Q583 532 583 520Q583 511 570 501L466 500Q355 499 329 494Q280 482 242 458T183 409T147 354T129 306T124 272V270H568Q583 262 583 250T568 230H124V228Q124 207 134 177T167 112T231 48T328 7Q355 1 466 0H570Q583 -10 583 -20Q583 -32 568 -40H471Q464 -40 446 -40T417 -41Q262 -41 172 45Q84 127 84 250Z",style:{"stroke-width":"3"}})])])],-1),g=[E],c=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mo",null,"∈")])],-1),y=s("code",null,"rand",-1),m=s("code",null,"length",-1),C=t(`
# ConstraintDomains.AbstractDomainType.
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

  • Base.∈(val, ::D)

  • Base.rand(::D)

  • Base.length(::D) that is the number of elements in a discrete domain, and the distance between bounds or similar for a continuous domain

Additionally, if the domain is used in a dynamic context, it can extend

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source


Discrete Domains

Optimization in discrete spaces has been the core of Constraint Programming since its inception. We provide three kinds of discrete domains.

SetDomain

A SetDomain is simply a Set of unordered numerical values.

julia
using ConstraintDomains
+import{_ as h,c as t,a5 as n,j as i,a,G as p,B as k,o as e}from"./chunks/framework.CJakPlgM.js";const b=JSON.parse('{"title":"Defining Variables and Exploring Domains","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/10_variables_and_domains.md","filePath":"constraints/10_variables_and_domains.md","lastUpdated":null}'),r={name:"constraints/10_variables_and_domains.md"},d={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.509ex",height:"1.312ex",role:"img",focusable:"false",viewBox:"0 -540 667 580","aria-hidden":"true"},E={class:"jldocstring custom-block",open:""};function g(y,s,c,m,C,F){const l=k("Badge");return e(),t("div",null,[s[17]||(s[17]=n('

Defining Variables and Exploring Domains

ConstraintDomains.jl stands as the standard way to define variables and explore domains within the Julia Constraints ecosystem. This package provides the infrastructure necessary for specifying both discrete and continuous domains. Explorations features are mainly related to the learning about constraints aspect and will be detailed in that chapter.

Variables and their domains can also be defined through MOI and JuMP syntaxes in their respective models.

Implementing the AbstractDomain Interface

',4)),i("p",null,[s[2]||(s[2]=a("At the foundation of ")),s[3]||(s[3]=i("em",null,"ConstraintDomains.jl",-1)),s[4]||(s[4]=a(" is the ")),s[5]||(s[5]=i("code",null,"AbstractDomain",-1)),s[6]||(s[6]=a(" type, an abstract supertype for all domain types. Implementations of ")),s[7]||(s[7]=i("code",null,"AbstractDomain",-1)),s[8]||(s[8]=a(" must provide methods for checking membership (")),i("mjx-container",d,[(e(),t("svg",o,s[0]||(s[0]=[i("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[i("g",{"data-mml-node":"math"},[i("g",{"data-mml-node":"mo"},[i("path",{"data-c":"2208",d:"M84 250Q84 372 166 450T360 539Q361 539 377 539T419 540T469 540H568Q583 532 583 520Q583 511 570 501L466 500Q355 499 329 494Q280 482 242 458T183 409T147 354T129 306T124 272V270H568Q583 262 583 250T568 230H124V228Q124 207 134 177T167 112T231 48T328 7Q355 1 466 0H570Q583 -10 583 -20Q583 -32 568 -40H471Q464 -40 446 -40T417 -41Q262 -41 172 45Q84 127 84 250Z",style:{"stroke-width":"3"}})])])],-1)]))),s[1]||(s[1]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mo",null,"∈")])],-1))]),s[9]||(s[9]=a("), generating random elements (")),s[10]||(s[10]=i("code",null,"rand",-1)),s[11]||(s[11]=a("), and determining the domain's size or range (")),s[12]||(s[12]=i("code",null,"length",-1)),s[13]||(s[13]=a("). These functionalities are essential for defining the behavior and properties of variable domains within constraint models."))]),i("details",E,[i("summary",null,[s[14]||(s[14]=i("a",{id:"ConstraintDomains.AbstractDomain-constraints-10_variables_and_domains",href:"#ConstraintDomains.AbstractDomain-constraints-10_variables_and_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.AbstractDomain")],-1)),s[15]||(s[15]=a()),p(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[16]||(s[16]=n('
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

  • Base.∈(val, ::D)

  • Base.rand(::D)

  • Base.length(::D) that is the number of elements in a discrete domain, and the distance between bounds or similar for a continuous domain

Additionally, if the domain is used in a dynamic context, it can extend

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source

',7))]),s[18]||(s[18]=n(`

Discrete Domains

Optimization in discrete spaces has been the core of Constraint Programming since its inception. We provide three kinds of discrete domains.

SetDomain

A SetDomain is simply a Set of unordered numerical values.

julia
using ConstraintDomains
 
 d1 = domain([53.69, 89.2, 0.12])
 d2 = domain([2//3, 89//123])
@@ -25,7 +25,7 @@ import{_ as e,c as a,j as s,a as i,a7 as t,o as n}from"./chunks/framework.CBLuZw
 MOI.add_constraint(optimizer, v3, CBLS.DiscreteSet(4.3))
 
 v4 = MOI.add_variable(optimizer)
-MOI.add_constraint(optimizer, v4, CBLS.DiscreteSet([1, 42, 3.14]))

RangeDomain

A range domain allows for minimal storage and more efficient operation on discrete sets defined as Range in Julia. It is not recommended for dynamic domains (it will be replaced with SetDomain as soon as a non-extremal element is removed).

julia
using ConstraintDomains
+MOI.add_constraint(optimizer, v4, CBLS.DiscreteSet([1, 42, 3.14]))

RangeDomain

A range domain allows for minimal storage and more efficient operation on discrete sets defined as Range in Julia. It is not recommended for dynamic domains (it will be replaced with SetDomain as soon as a non-extremal element is removed).

julia
using ConstraintDomains
 
 d1 = domain(1:5)
 d2 = domain(0.4:0.1:1.3)
julia
## To be implemented
@@ -45,8 +45,8 @@ import{_ as e,c as a,j as s,a as i,a7 as t,o as n}from"./chunks/framework.CBLuZw
 
 # v2 = MOI.add_variable(optimizer)
 
-# MOI.add_constraint(optimizer, v1, MOI.RangeSet(0.4:0.1:1.3))

Arbitrary Domains

As odd as it may sound, we provide a constructor for sets of elements making up arbitrary, possibly non-numerical, domains.

Until some practical examples are implemented, this structure will mainly be a placeholder with default behavior.

Continuous Domains

Numerous problems cannot be challenged without expressing at least part of their domains as continuous variables. In Julia Constraints we provide such domains as (set of) intervals.

julia
using ConstraintDomains, Intervals
+# MOI.add_constraint(optimizer, v1, MOI.RangeSet(0.4:0.1:1.3))

Arbitrary Domains

As odd as it may sound, we provide a constructor for sets of elements making up arbitrary, possibly non-numerical, domains.

Until some practical examples are implemented, this structure will mainly be a placeholder with default behavior.

Continuous Domains

Numerous problems cannot be challenged without expressing at least part of their domains as continuous variables. In Julia Constraints we provide such domains as (set of) intervals.

julia
using ConstraintDomains, Intervals
 
 d1 = domain(Interval{Open,Closed}(3.2, true), (42, false))
 d2 = domain(3.2..42)
-d3 = domain([3.2..42, 63.2..324.1])
julia
## see MOI.Interval
julia
## see MOI.Interval
`,16);function F(u,b,D,v,A,B){return n(),a("div",null,[h,s("p",null,[i("At the foundation of "),p,i(" is the "),k,i(" type, an abstract supertype for all domain types. Implementations of "),d,i(" must provide methods for checking membership ("),s("mjx-container",r,[(n(),a("svg",o,g)),c]),i("), generating random elements ("),y,i("), and determining the domain's size or range ("),m,i("). These functionalities are essential for defining the behavior and properties of variable domains within constraint models.")]),C])}const x=e(l,[["render",F]]);export{f as __pageData,x as default}; +d3 = domain([3.2..42, 63.2..324.1])
julia
## see MOI.Interval
julia
## see MOI.Interval
`,14))])}const D=h(r,[["render",g]]);export{b as __pageData,D as default}; diff --git a/dev/assets/constraints_10_variables_and_domains.md.DZUAY6r3.lean.js b/dev/assets/constraints_10_variables_and_domains.md.DZUAY6r3.lean.js new file mode 100644 index 0000000..1b7ec51 --- /dev/null +++ b/dev/assets/constraints_10_variables_and_domains.md.DZUAY6r3.lean.js @@ -0,0 +1,52 @@ +import{_ as h,c as t,a5 as n,j as i,a,G as p,B as k,o as e}from"./chunks/framework.CJakPlgM.js";const b=JSON.parse('{"title":"Defining Variables and Exploring Domains","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/10_variables_and_domains.md","filePath":"constraints/10_variables_and_domains.md","lastUpdated":null}'),r={name:"constraints/10_variables_and_domains.md"},d={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.509ex",height:"1.312ex",role:"img",focusable:"false",viewBox:"0 -540 667 580","aria-hidden":"true"},E={class:"jldocstring custom-block",open:""};function g(y,s,c,m,C,F){const l=k("Badge");return e(),t("div",null,[s[17]||(s[17]=n('

Defining Variables and Exploring Domains

ConstraintDomains.jl stands as the standard way to define variables and explore domains within the Julia Constraints ecosystem. This package provides the infrastructure necessary for specifying both discrete and continuous domains. Explorations features are mainly related to the learning about constraints aspect and will be detailed in that chapter.

Variables and their domains can also be defined through MOI and JuMP syntaxes in their respective models.

Implementing the AbstractDomain Interface

',4)),i("p",null,[s[2]||(s[2]=a("At the foundation of ")),s[3]||(s[3]=i("em",null,"ConstraintDomains.jl",-1)),s[4]||(s[4]=a(" is the ")),s[5]||(s[5]=i("code",null,"AbstractDomain",-1)),s[6]||(s[6]=a(" type, an abstract supertype for all domain types. Implementations of ")),s[7]||(s[7]=i("code",null,"AbstractDomain",-1)),s[8]||(s[8]=a(" must provide methods for checking membership (")),i("mjx-container",d,[(e(),t("svg",o,s[0]||(s[0]=[i("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[i("g",{"data-mml-node":"math"},[i("g",{"data-mml-node":"mo"},[i("path",{"data-c":"2208",d:"M84 250Q84 372 166 450T360 539Q361 539 377 539T419 540T469 540H568Q583 532 583 520Q583 511 570 501L466 500Q355 499 329 494Q280 482 242 458T183 409T147 354T129 306T124 272V270H568Q583 262 583 250T568 230H124V228Q124 207 134 177T167 112T231 48T328 7Q355 1 466 0H570Q583 -10 583 -20Q583 -32 568 -40H471Q464 -40 446 -40T417 -41Q262 -41 172 45Q84 127 84 250Z",style:{"stroke-width":"3"}})])])],-1)]))),s[1]||(s[1]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mo",null,"∈")])],-1))]),s[9]||(s[9]=a("), generating random elements (")),s[10]||(s[10]=i("code",null,"rand",-1)),s[11]||(s[11]=a("), and determining the domain's size or range (")),s[12]||(s[12]=i("code",null,"length",-1)),s[13]||(s[13]=a("). These functionalities are essential for defining the behavior and properties of variable domains within constraint models."))]),i("details",E,[i("summary",null,[s[14]||(s[14]=i("a",{id:"ConstraintDomains.AbstractDomain-constraints-10_variables_and_domains",href:"#ConstraintDomains.AbstractDomain-constraints-10_variables_and_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.AbstractDomain")],-1)),s[15]||(s[15]=a()),p(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[16]||(s[16]=n('
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

  • Base.∈(val, ::D)

  • Base.rand(::D)

  • Base.length(::D) that is the number of elements in a discrete domain, and the distance between bounds or similar for a continuous domain

Additionally, if the domain is used in a dynamic context, it can extend

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source

',7))]),s[18]||(s[18]=n(`

Discrete Domains

Optimization in discrete spaces has been the core of Constraint Programming since its inception. We provide three kinds of discrete domains.

SetDomain

A SetDomain is simply a Set of unordered numerical values.

julia
using ConstraintDomains
+
+d1 = domain([53.69, 89.2, 0.12])
+d2 = domain([2//3, 89//123])
+d3 = domain(4.3)
+d4 = domain(1, 42, 3.14)
julia
using CBLS, JuMP
+
+m = JuMP.Model(CBLS.Optimizer)
+
+@variable(m, x1 in DiscreteSet([53.69, 89.2, 0.12]))
+@variable(m, x2 in DiscreteSet([2//3, 89//123]))
+@variable(m, x3 in DiscreteSet(4.3))
+@variable(m, x4 in DiscreteSet([1, 42, 3.14]))
julia
using CBLS
+import MathOptInterface as MOI
+
+optimizer = CBLS.Optimizer()
+
+v1 = MOI.add_variable(optimizer)
+MOI.add_constraint(optimizer, v1, CBLS.DiscreteSet([53.69, 89.2, 0.12]))
+
+v2 = MOI.add_variable(optimizer)
+MOI.add_constraint(optimizer, v2, CBLS.DiscreteSet([2//3, 89//123]))
+
+v3 = MOI.add_variable(optimizer)
+MOI.add_constraint(optimizer, v3, CBLS.DiscreteSet(4.3))
+
+v4 = MOI.add_variable(optimizer)
+MOI.add_constraint(optimizer, v4, CBLS.DiscreteSet([1, 42, 3.14]))

RangeDomain

A range domain allows for minimal storage and more efficient operation on discrete sets defined as Range in Julia. It is not recommended for dynamic domains (it will be replaced with SetDomain as soon as a non-extremal element is removed).

julia
using ConstraintDomains
+
+d1 = domain(1:5)
+d2 = domain(0.4:0.1:1.3)
julia
## To be implemented
+# using CBLS, JuMP
+
+# m = JuMP.Model(CBLS.Optimizer)
+
+# @variable(m, 1 ≤ x1 ≤ 5, Int) # Consecutive integers are interpreted as range
+# @variable(m, x2 in RangeSet(0.4:0.1:1.3))
julia
## To be implemented
+# using CBLS
+# import MathOptInterface as MOI
+
+# optimizer = CBLS.Optimizer()
+
+# v1 = MOI.add_variable(optimizer)
+# MOI.add_constraint(optimizer, v1, MOI.RangeSet(1:5))
+
+# v2 = MOI.add_variable(optimizer)
+
+# MOI.add_constraint(optimizer, v1, MOI.RangeSet(0.4:0.1:1.3))

Arbitrary Domains

As odd as it may sound, we provide a constructor for sets of elements making up arbitrary, possibly non-numerical, domains.

Until some practical examples are implemented, this structure will mainly be a placeholder with default behavior.

Continuous Domains

Numerous problems cannot be challenged without expressing at least part of their domains as continuous variables. In Julia Constraints we provide such domains as (set of) intervals.

julia
using ConstraintDomains, Intervals
+
+d1 = domain(Interval{Open,Closed}(3.2, true), (42, false))
+d2 = domain(3.2..42)
+d3 = domain([3.2..42, 63.2..324.1])
julia
## see MOI.Interval
julia
## see MOI.Interval
`,14))])}const D=h(r,[["render",g]]);export{b as __pageData,D as default}; diff --git a/dev/assets/constraints_20_constraints.md.CtnoiJ3Z.js b/dev/assets/constraints_20_constraints.md.CtnoiJ3Z.js deleted file mode 100644 index 20d5efe..0000000 --- a/dev/assets/constraints_20_constraints.md.CtnoiJ3Z.js +++ /dev/null @@ -1,10 +0,0 @@ -import{_ as n,c as a,j as s,a as i,a7 as t,o as e}from"./chunks/framework.CBLuZwrP.js";const S=JSON.parse('{"title":"Interacting with Constraints in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/20_constraints.md","filePath":"constraints/20_constraints.md","lastUpdated":null}'),r={name:"constraints/20_constraints.md"},o=t(`

Interacting with Constraints in Julia

Constraints.jl is designed to facilitate the definition, manipulation, and application of constraints in constraint programming (CP).

Note

It also acts as a catalog of various information and features learned about constraints by the learning part of the ecosystem. Per design, we only store the practical information extracted by those tools (such as CompositionalNetworks or QUBOConstraints) and not the heavy machinery (ConstraintLearning).

Usual Constraints and Parameters

The usual constraints of Julia Constraints are heavily inspired by the core constraints of the XCSP3-core standard. The main difference lies in the name chosen to describe the different parameters those core constraints can have.

In XCSP3, the parameters are described based on their roles, which the user can find as keyword argument in the xcsp_ prefixed collection of constraints (for instance xcsp_all_different). In our the Julia Constraints API (JC-API), the keyword arguments correspond to the nature of each parameter.

# ConstraintCommons.USUAL_CONSTRAINT_PARAMETERSConstant.
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
-    :bool, # boolean parameter
-    :dim, # dimension, an integer parameter used along the pair_vars or vals parameters
-    :id, # index to target one variable in the input vector
-    :language, # describe a regular language such as an automaton or a MDD
-    :op, # an operator such as comparison or arithmetic operator
-    :pair_vars, # a list of parameters that are paired with each variable in the input vector
-    :val, # one scalar value
-    :vals, # a list of scalar values (independent of the input vector size)
-]

source


We provide a couple of methods to navigate the usual constraints extracted from XCSP3-Core.

# Constraints.USUAL_CONSTRAINTSConstant.
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source


# Constraints.describeFunction.
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

  • constraints::Dict{Symbol,Constraint}: dictionary of constraints to describe. Default is USUAL_CONSTRAINTS.

  • width::Int: width of the table.

Example

julia
describe()

source


# Constraints.constraints_parametersFunction.
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_parameters()

source


# Constraints.constraints_descriptionsFunction.
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_descriptions()

source


Concepts, Error Functions, and QUBO matrices

One major use of this collection of usual constraint is to extract the concept or the error function (error_f) of a given constraint.

# Constraints.conceptFunction.
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source

julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

  • s::Symbol: the constraint name.

  • args...: the arguments to apply the concept to.

  • kargs...: the keyword arguments to apply the concept to.

Example

julia
concept(:all_different, [1, 2, 3])

source


`,21),l=s("code",null,"error_f",-1),p={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},h={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.76ex",height:"1.557ex",role:"img",focusable:"false",viewBox:"0 -666 778 688","aria-hidden":"true"},c=t('',1),d=[c],k=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"0.")])],-1),g={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.76ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 778 666","aria-hidden":"true"},b=t('',1),C=[b],m=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"1.")])],-1),E=t('

Efficient versions of error_f are either hand-coded or generated through CompositionalNetworks.jl.

# Constraints.error_fFunction.
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source


Finally, another use is to provide QUBO matrices of those usual constraints through QUBOConstraints.jl. The syntax and interface for this feature are still a work in progress.

',4);function y(_,v,f,x,A,T){return e(),a("div",null,[o,s("p",null,[i("Note that the error function is a finer estimation of how much a constraint is violated or not. By default, the "),l,i(" method simply return "),s("mjx-container",p,[(e(),a("svg",h,d)),k]),i(" if the constraint is satisfied or "),s("mjx-container",g,[(e(),a("svg",u,C)),m]),i(" otherwise.")]),E])}const w=n(r,[["render",y]]);export{S as __pageData,w as default}; diff --git a/dev/assets/constraints_20_constraints.md.CtnoiJ3Z.lean.js b/dev/assets/constraints_20_constraints.md.CtnoiJ3Z.lean.js deleted file mode 100644 index b0bf0b7..0000000 --- a/dev/assets/constraints_20_constraints.md.CtnoiJ3Z.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as n,c as a,j as s,a as i,a7 as t,o as e}from"./chunks/framework.CBLuZwrP.js";const S=JSON.parse('{"title":"Interacting with Constraints in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/20_constraints.md","filePath":"constraints/20_constraints.md","lastUpdated":null}'),r={name:"constraints/20_constraints.md"},o=t("",21),l=s("code",null,"error_f",-1),p={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},h={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.76ex",height:"1.557ex",role:"img",focusable:"false",viewBox:"0 -666 778 688","aria-hidden":"true"},c=t("",1),d=[c],k=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"0.")])],-1),g={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.76ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 778 666","aria-hidden":"true"},b=t("",1),C=[b],m=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"1.")])],-1),E=t("",4);function y(_,v,f,x,A,T){return e(),a("div",null,[o,s("p",null,[i("Note that the error function is a finer estimation of how much a constraint is violated or not. By default, the "),l,i(" method simply return "),s("mjx-container",p,[(e(),a("svg",h,d)),k]),i(" if the constraint is satisfied or "),s("mjx-container",g,[(e(),a("svg",u,C)),m]),i(" otherwise.")]),E])}const w=n(r,[["render",y]]);export{S as __pageData,w as default}; diff --git a/dev/assets/constraints_20_constraints.md.D3n0An0S.js b/dev/assets/constraints_20_constraints.md.D3n0An0S.js new file mode 100644 index 0000000..dc85ae7 --- /dev/null +++ b/dev/assets/constraints_20_constraints.md.D3n0An0S.js @@ -0,0 +1,10 @@ +import{_ as r,c as o,a5 as a,j as t,a as i,G as e,B as p,o as l}from"./chunks/framework.CJakPlgM.js";const S=JSON.parse('{"title":"Interacting with Constraints in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/20_constraints.md","filePath":"constraints/20_constraints.md","lastUpdated":null}'),h={name:"constraints/20_constraints.md"},d={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},C={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},y={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.76ex",height:"1.557ex",role:"img",focusable:"false",viewBox:"0 -666 778 688","aria-hidden":"true"},E={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.76ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 778 666","aria-hidden":"true"},f={class:"jldocstring custom-block",open:""};function v(F,s,x,j,A,T){const n=p("Badge");return l(),o("div",null,[s[30]||(s[30]=a('

Interacting with Constraints in Julia

Constraints.jl is designed to facilitate the definition, manipulation, and application of constraints in constraint programming (CP).

Note

It also acts as a catalog of various information and features learned about constraints by the learning part of the ecosystem. Per design, we only store the practical information extracted by those tools (such as CompositionalNetworks or QUBOConstraints) and not the heavy machinery (ConstraintLearning).

Usual Constraints and Parameters

The usual constraints of Julia Constraints are heavily inspired by the core constraints of the XCSP3-core standard. The main difference lies in the name chosen to describe the different parameters those core constraints can have.

In XCSP3, the parameters are described based on their roles, which the user can find as keyword argument in the xcsp_ prefixed collection of constraints (for instance xcsp_all_different). In our the Julia Constraints API (JC-API), the keyword arguments correspond to the nature of each parameter.

',6)),t("details",d,[t("summary",null,[s[0]||(s[0]=t("a",{id:"ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS-constraints-20_constraints",href:"#ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS-constraints-20_constraints"},[t("span",{class:"jlbinding"},"ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS")],-1)),s[1]||(s[1]=i()),e(n,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[2]||(s[2]=a(`
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
+    :bool, # boolean parameter
+    :dim, # dimension, an integer parameter used along the pair_vars or vals parameters
+    :id, # index to target one variable in the input vector
+    :language, # describe a regular language such as an automaton or a MDD
+    :op, # an operator such as comparison or arithmetic operator
+    :pair_vars, # a list of parameters that are paired with each variable in the input vector
+    :val, # one scalar value
+    :vals, # a list of scalar values (independent of the input vector size)
+]

source

`,4))]),s[31]||(s[31]=t("p",null,[i("We provide a couple of methods to navigate the usual constraints extracted from "),t("em",null,"XCSP3-Core"),i(".")],-1)),t("details",c,[t("summary",null,[s[3]||(s[3]=t("a",{id:"Constraints.USUAL_CONSTRAINTS-constraints-20_constraints",href:"#Constraints.USUAL_CONSTRAINTS-constraints-20_constraints"},[t("span",{class:"jlbinding"},"Constraints.USUAL_CONSTRAINTS")],-1)),s[4]||(s[4]=i()),e(n,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[5]||(s[5]=a('
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source

',6))]),t("details",k,[t("summary",null,[s[6]||(s[6]=t("a",{id:"Constraints.describe-constraints-20_constraints",href:"#Constraints.describe-constraints-20_constraints"},[t("span",{class:"jlbinding"},"Constraints.describe")],-1)),s[7]||(s[7]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[8]||(s[8]=a('
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

  • constraints::Dict{Symbol,Constraint}: dictionary of constraints to describe. Default is USUAL_CONSTRAINTS.

  • width::Int: width of the table.

Example

julia
describe()

source

',7))]),t("details",u,[t("summary",null,[s[9]||(s[9]=t("a",{id:"Constraints.constraints_parameters-constraints-20_constraints",href:"#Constraints.constraints_parameters-constraints-20_constraints"},[t("span",{class:"jlbinding"},"Constraints.constraints_parameters")],-1)),s[10]||(s[10]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[11]||(s[11]=a('
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_parameters()

source

',7))]),t("details",g,[t("summary",null,[s[12]||(s[12]=t("a",{id:"Constraints.constraints_descriptions-constraints-20_constraints",href:"#Constraints.constraints_descriptions-constraints-20_constraints"},[t("span",{class:"jlbinding"},"Constraints.constraints_descriptions")],-1)),s[13]||(s[13]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[14]||(s[14]=a('
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_descriptions()

source

',7))]),s[32]||(s[32]=t("h2",{id:"Concepts,-Error-Functions,-and-QUBO-matrices",tabindex:"-1"},[i("Concepts, Error Functions, and QUBO matrices "),t("a",{class:"header-anchor",href:"#Concepts,-Error-Functions,-and-QUBO-matrices","aria-label":'Permalink to "Concepts, Error Functions, and QUBO matrices {#Concepts,-Error-Functions,-and-QUBO-matrices}"'},"​")],-1)),s[33]||(s[33]=t("p",null,[i("One major use of this collection of usual constraint is to extract the "),t("code",null,"concept"),i(" or the error function ("),t("code",null,"error_f"),i(") of a given constraint.")],-1)),t("details",m,[t("summary",null,[s[15]||(s[15]=t("a",{id:"Constraints.concept-constraints-20_constraints",href:"#Constraints.concept-constraints-20_constraints"},[t("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[16]||(s[16]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=a('
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source

julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

  • s::Symbol: the constraint name.

  • args...: the arguments to apply the concept to.

  • kargs...: the keyword arguments to apply the concept to.

Example

julia
concept(:all_different, [1, 2, 3])

source

',10))]),t("p",null,[s[22]||(s[22]=i("Note that the error function is a finer estimation of how much a constraint is violated or not. By default, the ")),s[23]||(s[23]=t("code",null,"error_f",-1)),s[24]||(s[24]=i(" method simply return ")),t("mjx-container",C,[(l(),o("svg",y,s[18]||(s[18]=[a('',1)]))),s[19]||(s[19]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"0.")])],-1))]),s[25]||(s[25]=i(" if the constraint is satisfied or ")),t("mjx-container",E,[(l(),o("svg",b,s[20]||(s[20]=[a('',1)]))),s[21]||(s[21]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"1.")])],-1))]),s[26]||(s[26]=i(" otherwise."))]),s[34]||(s[34]=t("p",null,[i("Efficient versions of "),t("code",null,"error_f"),i(" are either hand-coded or generated through "),t("code",null,"CompositionalNetworks.jl"),i(".")],-1)),t("details",f,[t("summary",null,[s[27]||(s[27]=t("a",{id:"Constraints.error_f-constraints-20_constraints",href:"#Constraints.error_f-constraints-20_constraints"},[t("span",{class:"jlbinding"},"Constraints.error_f")],-1)),s[28]||(s[28]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[29]||(s[29]=a('
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source

',3))]),s[35]||(s[35]=t("p",null,[i("Finally, another use is to provide "),t("code",null,"QUBO"),i(" matrices of those usual constraints through "),t("code",null,"QUBOConstraints.jl"),i(". The syntax and interface for this feature are still a work in progress.")],-1))])}const B=r(h,[["render",v]]);export{S as __pageData,B as default}; diff --git a/dev/assets/constraints_20_constraints.md.D3n0An0S.lean.js b/dev/assets/constraints_20_constraints.md.D3n0An0S.lean.js new file mode 100644 index 0000000..dc85ae7 --- /dev/null +++ b/dev/assets/constraints_20_constraints.md.D3n0An0S.lean.js @@ -0,0 +1,10 @@ +import{_ as r,c as o,a5 as a,j as t,a as i,G as e,B as p,o as l}from"./chunks/framework.CJakPlgM.js";const S=JSON.parse('{"title":"Interacting with Constraints in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/20_constraints.md","filePath":"constraints/20_constraints.md","lastUpdated":null}'),h={name:"constraints/20_constraints.md"},d={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},C={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},y={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.76ex",height:"1.557ex",role:"img",focusable:"false",viewBox:"0 -666 778 688","aria-hidden":"true"},E={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.76ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 778 666","aria-hidden":"true"},f={class:"jldocstring custom-block",open:""};function v(F,s,x,j,A,T){const n=p("Badge");return l(),o("div",null,[s[30]||(s[30]=a('

Interacting with Constraints in Julia

Constraints.jl is designed to facilitate the definition, manipulation, and application of constraints in constraint programming (CP).

Note

It also acts as a catalog of various information and features learned about constraints by the learning part of the ecosystem. Per design, we only store the practical information extracted by those tools (such as CompositionalNetworks or QUBOConstraints) and not the heavy machinery (ConstraintLearning).

Usual Constraints and Parameters

The usual constraints of Julia Constraints are heavily inspired by the core constraints of the XCSP3-core standard. The main difference lies in the name chosen to describe the different parameters those core constraints can have.

In XCSP3, the parameters are described based on their roles, which the user can find as keyword argument in the xcsp_ prefixed collection of constraints (for instance xcsp_all_different). In our the Julia Constraints API (JC-API), the keyword arguments correspond to the nature of each parameter.

',6)),t("details",d,[t("summary",null,[s[0]||(s[0]=t("a",{id:"ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS-constraints-20_constraints",href:"#ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS-constraints-20_constraints"},[t("span",{class:"jlbinding"},"ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS")],-1)),s[1]||(s[1]=i()),e(n,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[2]||(s[2]=a(`
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
+    :bool, # boolean parameter
+    :dim, # dimension, an integer parameter used along the pair_vars or vals parameters
+    :id, # index to target one variable in the input vector
+    :language, # describe a regular language such as an automaton or a MDD
+    :op, # an operator such as comparison or arithmetic operator
+    :pair_vars, # a list of parameters that are paired with each variable in the input vector
+    :val, # one scalar value
+    :vals, # a list of scalar values (independent of the input vector size)
+]

source

`,4))]),s[31]||(s[31]=t("p",null,[i("We provide a couple of methods to navigate the usual constraints extracted from "),t("em",null,"XCSP3-Core"),i(".")],-1)),t("details",c,[t("summary",null,[s[3]||(s[3]=t("a",{id:"Constraints.USUAL_CONSTRAINTS-constraints-20_constraints",href:"#Constraints.USUAL_CONSTRAINTS-constraints-20_constraints"},[t("span",{class:"jlbinding"},"Constraints.USUAL_CONSTRAINTS")],-1)),s[4]||(s[4]=i()),e(n,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[5]||(s[5]=a('
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source

',6))]),t("details",k,[t("summary",null,[s[6]||(s[6]=t("a",{id:"Constraints.describe-constraints-20_constraints",href:"#Constraints.describe-constraints-20_constraints"},[t("span",{class:"jlbinding"},"Constraints.describe")],-1)),s[7]||(s[7]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[8]||(s[8]=a('
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

  • constraints::Dict{Symbol,Constraint}: dictionary of constraints to describe. Default is USUAL_CONSTRAINTS.

  • width::Int: width of the table.

Example

julia
describe()

source

',7))]),t("details",u,[t("summary",null,[s[9]||(s[9]=t("a",{id:"Constraints.constraints_parameters-constraints-20_constraints",href:"#Constraints.constraints_parameters-constraints-20_constraints"},[t("span",{class:"jlbinding"},"Constraints.constraints_parameters")],-1)),s[10]||(s[10]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[11]||(s[11]=a('
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_parameters()

source

',7))]),t("details",g,[t("summary",null,[s[12]||(s[12]=t("a",{id:"Constraints.constraints_descriptions-constraints-20_constraints",href:"#Constraints.constraints_descriptions-constraints-20_constraints"},[t("span",{class:"jlbinding"},"Constraints.constraints_descriptions")],-1)),s[13]||(s[13]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[14]||(s[14]=a('
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_descriptions()

source

',7))]),s[32]||(s[32]=t("h2",{id:"Concepts,-Error-Functions,-and-QUBO-matrices",tabindex:"-1"},[i("Concepts, Error Functions, and QUBO matrices "),t("a",{class:"header-anchor",href:"#Concepts,-Error-Functions,-and-QUBO-matrices","aria-label":'Permalink to "Concepts, Error Functions, and QUBO matrices {#Concepts,-Error-Functions,-and-QUBO-matrices}"'},"​")],-1)),s[33]||(s[33]=t("p",null,[i("One major use of this collection of usual constraint is to extract the "),t("code",null,"concept"),i(" or the error function ("),t("code",null,"error_f"),i(") of a given constraint.")],-1)),t("details",m,[t("summary",null,[s[15]||(s[15]=t("a",{id:"Constraints.concept-constraints-20_constraints",href:"#Constraints.concept-constraints-20_constraints"},[t("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[16]||(s[16]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=a('
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source

julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

  • s::Symbol: the constraint name.

  • args...: the arguments to apply the concept to.

  • kargs...: the keyword arguments to apply the concept to.

Example

julia
concept(:all_different, [1, 2, 3])

source

',10))]),t("p",null,[s[22]||(s[22]=i("Note that the error function is a finer estimation of how much a constraint is violated or not. By default, the ")),s[23]||(s[23]=t("code",null,"error_f",-1)),s[24]||(s[24]=i(" method simply return ")),t("mjx-container",C,[(l(),o("svg",y,s[18]||(s[18]=[a('',1)]))),s[19]||(s[19]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"0.")])],-1))]),s[25]||(s[25]=i(" if the constraint is satisfied or ")),t("mjx-container",E,[(l(),o("svg",b,s[20]||(s[20]=[a('',1)]))),s[21]||(s[21]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"1.")])],-1))]),s[26]||(s[26]=i(" otherwise."))]),s[34]||(s[34]=t("p",null,[i("Efficient versions of "),t("code",null,"error_f"),i(" are either hand-coded or generated through "),t("code",null,"CompositionalNetworks.jl"),i(".")],-1)),t("details",f,[t("summary",null,[s[27]||(s[27]=t("a",{id:"Constraints.error_f-constraints-20_constraints",href:"#Constraints.error_f-constraints-20_constraints"},[t("span",{class:"jlbinding"},"Constraints.error_f")],-1)),s[28]||(s[28]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[29]||(s[29]=a('
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source

',3))]),s[35]||(s[35]=t("p",null,[i("Finally, another use is to provide "),t("code",null,"QUBO"),i(" matrices of those usual constraints through "),t("code",null,"QUBOConstraints.jl"),i(". The syntax and interface for this feature are still a work in progress.")],-1))])}const B=r(h,[["render",v]]);export{S as __pageData,B as default}; diff --git a/dev/assets/constraints_21_generic_constraints.md.BrP43zj-.js b/dev/assets/constraints_21_generic_constraints.md.BrP43zj-.js deleted file mode 100644 index fd01e6b..0000000 --- a/dev/assets/constraints_21_generic_constraints.md.BrP43zj-.js +++ /dev/null @@ -1,90 +0,0 @@ -import{_ as e,c as a,j as s,a as i,a7 as n,o as t}from"./chunks/framework.CBLuZwrP.js";const vs=JSON.parse('{"title":"Generic Constraints","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/21_generic_constraints.md","filePath":"constraints/21_generic_constraints.md","lastUpdated":null}'),l={name:"constraints/21_generic_constraints.md"},h=n('

Generic Constraints

In the XCSP³-core standard, generic constraints are categorized into two main types: intention and extension constraints.

Intention Constraints

',3),p={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},r=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D465",d:"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z",style:{"stroke-width":"3"}})])])],-1),d=[r],o=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x")])],-1),g={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},T={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.109ex",height:"1.464ex",role:"img",focusable:"false",viewBox:"0 -442 490 647","aria-hidden":"true"},E=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D466",d:"M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1),c=[E],Q=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"y")])],-1),y={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},m={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.42ex",height:"1.686ex",role:"img",focusable:"false",viewBox:"0 -540 2395.6 745","aria-hidden":"true"},C=n('',1),u=[C],F=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x"),s("mo",null,"<"),s("mi",null,"y")])],-1),x=n('

Note that the intention constraint is not directly available through the JC-API in Constraints.jl. It is designed as such since defining a constraint through a predicate is the natural way.

We provide a straightforward example through the :dist_different constraint on how to define and add such a constraint in the USUAL_CONSTRAINTS collection.

Higher level modeling languages such as JuMP should provide a Intention interface.

Defining an intention constraint in JC-API

',4),w=s("code",null,"dist_different",-1),_=s("em",null,"Constraints.jl",-1),f=s("code",null,"dist_different",-1),b={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},v={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},H=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D465",d:"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z",style:{"stroke-width":"3"}})])])],-1),D=[H],B=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x")])],-1),A={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},V={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"25.797ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 11402.4 1000","aria-hidden":"true"},M=n('',1),L=[M],Z=s("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"1"),s("mo",{stretchy:"false"},"]"),s("mo",null,"−"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"2"),s("mo",{stretchy:"false"},"]"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mo",null,"≠"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"3"),s("mo",{stretchy:"false"},"]"),s("mo",null,"−"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"4"),s("mo",{stretchy:"false"},"]"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])],-1),j=n(`

The constraint is then added to the usual constraints collection.

julia
const description_dist_different = """
-Ensures that the distances between marks on the ruler are unique.
-"""
-
-# Define the predicate
-predicate_dist_different(x) = abs(x[1] - x[2])  abs(x[3] - x[4])
-
-# Add it to usual constraints
-@usual concept_dist_different(x) = xcsp_intention(
-    list = x,
-    predicate = predicate_dist_different
-)

Please check the section dedicated to the Golomb Ruler problem to see a use for this constraint. <!– TODO: Golomb Ruler –>

APIs

Note that the intention constraint is not directly available through the JC-API in Constraints.jl. It is designed as such since defining a constraint through a predicate is the natural way.

We provide here a usage example for the :dist_different constraint, previously added to the USUAL_CONSTRAINTS collection.

Higher level modeling language such as JuMP should provide an Intention interface.

julia
using Constraints
-
-concept(:dist_different, x)
-concept(:dist_different)(x)
julia
# Defines the DistDifferent constraint
-using Constraints
-
-c = x -> xcsp_intention(
-    list = x,
-    predicate = y -> abs(y[1] - y[2])  abs(y[3] - y[4])
-)
-
-c([1, 2, 3, 3]) # true
-c([1, 2, 3, 4]) # false
julia
using CBLS, JuMP
-
-model = Model(CBLS.Optimizer)
-
-# Using build-in DistDifferent
-@variable(model, 0 <= X[1:4] <= 10, Int)
-@constraint(model, X in DistDifferent())
-
-# Alternatively
-@variable(model, 0 <= Y[1:4] <= 10, Int)
-@constraint(model, Y in Intention(y -> abs(y[1] - y[2])  abs(y[3] - y[4])))
-
-optimize!(model)
-
-@info value.(X)
-@info value.(Y)
julia
using CBLS
-import MathOptInterface as MOI
-
-optimizer = CBLS.Optimizer()
-
-x = MOI.add_variables(optimizer, 4)
-for xi in x
-    # Missing RangeDomain currently in CBLS
-    MOI.add_constraint(optimizer, xi, CBLS.DiscreteSet(collect[1:10]))
-end
-MOI.add_constraint(optimizer, x, CBLS.Intention(y -> abs(y[1] - y[2])  abs(y[3] - y[4])))
-
-MOI.optimize!(optimizer)

Extension Constraints

`,9),S={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},I={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.928ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 852 683","aria-hidden":"true"},P=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D44B",d:"M42 0H40Q26 0 26 11Q26 15 29 27Q33 41 36 43T55 46Q141 49 190 98Q200 108 306 224T411 342Q302 620 297 625Q288 636 234 637H206Q200 643 200 645T202 664Q206 677 212 683H226Q260 681 347 681Q380 681 408 681T453 682T473 682Q490 682 490 671Q490 670 488 658Q484 643 481 640T465 637Q434 634 411 620L488 426L541 485Q646 598 646 610Q646 628 622 635Q617 635 609 637Q594 637 594 648Q594 650 596 664Q600 677 606 683H618Q619 683 643 683T697 681T738 680Q828 680 837 683H845Q852 676 852 672Q850 647 840 637H824Q790 636 763 628T722 611T698 593L687 584Q687 585 592 480L505 384Q505 383 536 304T601 142T638 56Q648 47 699 46Q734 46 734 37Q734 35 732 23Q728 7 725 4T711 1Q708 1 678 1T589 2Q528 2 496 2T461 1Q444 1 444 10Q444 11 446 25Q448 35 450 39T455 44T464 46T480 47T506 54Q523 62 523 64Q522 64 476 181L429 299Q241 95 236 84Q232 76 232 72Q232 53 261 47Q262 47 267 47T273 46Q276 46 277 46T280 45T283 42T284 35Q284 26 282 19Q279 6 276 4T261 1Q258 1 243 1T201 2T142 2Q64 2 42 0Z",style:{"stroke-width":"3"}})])])],-1),z=[P],O=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"X")])],-1),J={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},N={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 500 666","aria-hidden":"true"},G=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"31",d:"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z",style:{"stroke-width":"3"}})])])],-1),R=[G],q=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"1")])],-1),X={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},U={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 500 666","aria-hidden":"true"},Y=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"32",d:"M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z",style:{"stroke-width":"3"}})])])],-1),K=[Y],$=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"2")])],-1),W={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},ss={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.726ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 763 683","aria-hidden":"true"},is=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D44C",d:"M66 637Q54 637 49 637T39 638T32 641T30 647T33 664T42 682Q44 683 56 683Q104 680 165 680Q288 680 306 683H316Q322 677 322 674T320 656Q316 643 310 637H298Q242 637 242 624Q242 619 292 477T343 333L346 336Q350 340 358 349T379 373T411 410T454 461Q546 568 561 587T577 618Q577 634 545 637Q528 637 528 647Q528 649 530 661Q533 676 535 679T549 683Q551 683 578 682T657 680Q684 680 713 681T746 682Q763 682 763 673Q763 669 760 657T755 643Q753 637 734 637Q662 632 617 587Q608 578 477 424L348 273L322 169Q295 62 295 57Q295 46 363 46Q379 46 384 45T390 35Q390 33 388 23Q384 6 382 4T366 1Q361 1 324 1T232 2Q170 2 138 2T102 1Q84 1 84 9Q84 14 87 24Q88 27 89 30T90 35T91 39T93 42T96 44T101 45T107 45T116 46T129 46Q168 47 180 50T198 63Q201 68 227 171L252 274L129 623Q128 624 127 625T125 627T122 629T118 631T113 633T105 634T96 635T83 636T66 637Z",style:{"stroke-width":"3"}})])])],-1),as=[is],ts=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"Y")])],-1),ns={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},es={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.554ex",role:"img",focusable:"false",viewBox:"0 -665 500 687","aria-hidden":"true"},ls=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"33",d:"M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z",style:{"stroke-width":"3"}})])])],-1),hs=[ls],ps=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"3")])],-1),ks={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},rs={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.532ex",role:"img",focusable:"false",viewBox:"0 -677 500 677","aria-hidden":"true"},ds=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"34",d:"M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z",style:{"stroke-width":"3"}})])])],-1),os=[ds],gs=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"4")])],-1),Ts={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Es={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"23.762ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 10502.7 1000","aria-hidden":"true"},cs=n('',1),Qs=[cs],ys=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mrow",{"data-mjx-texclass":"ORD"},[s("mo",{stretchy:"false"},"("),s("mn",null,"1"),s("mo",null,","),s("mn",null,"3"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mo",{stretchy:"false"},"("),s("mn",null,"1"),s("mo",null,","),s("mn",null,"4"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mo",{stretchy:"false"},"("),s("mn",null,"2"),s("mo",null,","),s("mn",null,"3"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mo",{stretchy:"false"},"("),s("mn",null,"2"),s("mo",null,","),s("mn",null,"4"),s("mo",{stretchy:"false"},")")]),s("mo",null,".")])],-1),ms=n(`

These two types of constraints provide a flexible way to define complex relationships between variables in constraint programming.

julia
using Constraints
-
-concept(:dist_different, x)
-concept(:dist_different)(x)
julia
# Defines the DistDifferent constraint
-using Constraints
-
-c = x -> xcsp_intention(
-    list = x,
-    predicate = y -> abs(y[1] - y[2])  abs(y[3] - y[4])
-)
-
-c([1, 2, 3, 3]) # true
-c([1, 2, 3, 4]) # false
julia
using CBLS, JuMP
-
-model = Model(CBLS.Optimizer)
-
-# Using build-in DistDifferent
-@variable(model, 0 <= X[1:4] <= 10, Int)
-@constraint(model, X in DistDifferent())
-
-# Alternatively
-@variable(model, 0 <= Y[1:4] <= 10, Int)
-@constraint(model, Y in Intention(y -> abs(y[1] - y[2])  abs(y[3] - y[4])))
-
-optimize!(model)
-
-@info value.(X)
-@info value.(Y)
julia
using CBLS
-import MathOptInterface as MOI
-
-optimizer = CBLS.Optimizer()
-
-x = MOI.add_variables(optimizer, 4)
-for xi in x
-    # Missing RangeDomain currently in CBLS
-    MOI.add_constraint(optimizer, xi, CBLS.DiscreteSet(collect[1:10]))
-end
-MOI.add_constraint(optimizer, x, CBLS.Intention(y -> abs(y[1] - y[2])  abs(y[3] - y[4])))
-
-MOI.optimize!(optimizer)
`,2);function Cs(us,Fs,xs,ws,_s,fs){return t(),a("div",null,[h,s("p",null,[i("These are constraints that are defined by a logical expression or a function. They are called intentional because they are defined by the property they satisfy. For example, a constraint that specifies that a variable "),s("mjx-container",p,[(t(),a("svg",k,d)),o]),i(" must be less than a variable "),s("mjx-container",g,[(t(),a("svg",T,c)),Q]),i(" could be defined intentionally as "),s("mjx-container",y,[(t(),a("svg",m,u)),F]),i(".")]),x,s("p",null,[i("We use the "),w,i(" constraint to illustrate how to define an intention constraint in "),_,i(". The "),f,i(" constraint ensures that the distances between marks "),s("mjx-container",b,[(t(),a("svg",v,D)),B]),i(" on a ruler are unique.")]),s("mjx-container",A,[(t(),a("svg",V,L)),Z]),j,s("p",null,[i("These are constraints that are defined by explicitly listing all the tuples of values that satisfy the constraint. They are called extensional because they are defined by the set of values they allow. For example, a binary constraint that specifies that a variable "),s("mjx-container",S,[(t(),a("svg",I,z)),O]),i(" must be either "),s("mjx-container",J,[(t(),a("svg",N,R)),q]),i(" or "),s("mjx-container",X,[(t(),a("svg",U,K)),$]),i(" and a variable "),s("mjx-container",W,[(t(),a("svg",ss,as)),ts]),i(" must be either "),s("mjx-container",ns,[(t(),a("svg",es,hs)),ps]),i(" or "),s("mjx-container",ks,[(t(),a("svg",rs,os)),gs]),i(" could be defined extensionally by the set of tuples "),s("mjx-container",Ts,[(t(),a("svg",Es,Qs)),ys])]),ms])}const Hs=e(l,[["render",Cs]]);export{vs as __pageData,Hs as default}; diff --git a/dev/assets/constraints_21_generic_constraints.md.BrP43zj-.lean.js b/dev/assets/constraints_21_generic_constraints.md.BrP43zj-.lean.js deleted file mode 100644 index dde7d34..0000000 --- a/dev/assets/constraints_21_generic_constraints.md.BrP43zj-.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,c as a,j as s,a as i,a7 as n,o as t}from"./chunks/framework.CBLuZwrP.js";const vs=JSON.parse('{"title":"Generic Constraints","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/21_generic_constraints.md","filePath":"constraints/21_generic_constraints.md","lastUpdated":null}'),l={name:"constraints/21_generic_constraints.md"},h=n("",3),p={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},r=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D465",d:"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z",style:{"stroke-width":"3"}})])])],-1),d=[r],o=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x")])],-1),g={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},T={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.109ex",height:"1.464ex",role:"img",focusable:"false",viewBox:"0 -442 490 647","aria-hidden":"true"},E=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D466",d:"M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1),c=[E],Q=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"y")])],-1),y={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},m={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.42ex",height:"1.686ex",role:"img",focusable:"false",viewBox:"0 -540 2395.6 745","aria-hidden":"true"},C=n("",1),u=[C],F=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x"),s("mo",null,"<"),s("mi",null,"y")])],-1),x=n("",4),w=s("code",null,"dist_different",-1),_=s("em",null,"Constraints.jl",-1),f=s("code",null,"dist_different",-1),b={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},v={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},H=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D465",d:"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z",style:{"stroke-width":"3"}})])])],-1),D=[H],B=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x")])],-1),A={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},V={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"25.797ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 11402.4 1000","aria-hidden":"true"},M=n("",1),L=[M],Z=s("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"1"),s("mo",{stretchy:"false"},"]"),s("mo",null,"−"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"2"),s("mo",{stretchy:"false"},"]"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mo",null,"≠"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"3"),s("mo",{stretchy:"false"},"]"),s("mo",null,"−"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"4"),s("mo",{stretchy:"false"},"]"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])],-1),j=n("",9),S={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},I={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.928ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 852 683","aria-hidden":"true"},P=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D44B",d:"M42 0H40Q26 0 26 11Q26 15 29 27Q33 41 36 43T55 46Q141 49 190 98Q200 108 306 224T411 342Q302 620 297 625Q288 636 234 637H206Q200 643 200 645T202 664Q206 677 212 683H226Q260 681 347 681Q380 681 408 681T453 682T473 682Q490 682 490 671Q490 670 488 658Q484 643 481 640T465 637Q434 634 411 620L488 426L541 485Q646 598 646 610Q646 628 622 635Q617 635 609 637Q594 637 594 648Q594 650 596 664Q600 677 606 683H618Q619 683 643 683T697 681T738 680Q828 680 837 683H845Q852 676 852 672Q850 647 840 637H824Q790 636 763 628T722 611T698 593L687 584Q687 585 592 480L505 384Q505 383 536 304T601 142T638 56Q648 47 699 46Q734 46 734 37Q734 35 732 23Q728 7 725 4T711 1Q708 1 678 1T589 2Q528 2 496 2T461 1Q444 1 444 10Q444 11 446 25Q448 35 450 39T455 44T464 46T480 47T506 54Q523 62 523 64Q522 64 476 181L429 299Q241 95 236 84Q232 76 232 72Q232 53 261 47Q262 47 267 47T273 46Q276 46 277 46T280 45T283 42T284 35Q284 26 282 19Q279 6 276 4T261 1Q258 1 243 1T201 2T142 2Q64 2 42 0Z",style:{"stroke-width":"3"}})])])],-1),z=[P],O=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"X")])],-1),J={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},N={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 500 666","aria-hidden":"true"},G=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"31",d:"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z",style:{"stroke-width":"3"}})])])],-1),R=[G],q=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"1")])],-1),X={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},U={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 500 666","aria-hidden":"true"},Y=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"32",d:"M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z",style:{"stroke-width":"3"}})])])],-1),K=[Y],$=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"2")])],-1),W={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},ss={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.726ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 763 683","aria-hidden":"true"},is=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D44C",d:"M66 637Q54 637 49 637T39 638T32 641T30 647T33 664T42 682Q44 683 56 683Q104 680 165 680Q288 680 306 683H316Q322 677 322 674T320 656Q316 643 310 637H298Q242 637 242 624Q242 619 292 477T343 333L346 336Q350 340 358 349T379 373T411 410T454 461Q546 568 561 587T577 618Q577 634 545 637Q528 637 528 647Q528 649 530 661Q533 676 535 679T549 683Q551 683 578 682T657 680Q684 680 713 681T746 682Q763 682 763 673Q763 669 760 657T755 643Q753 637 734 637Q662 632 617 587Q608 578 477 424L348 273L322 169Q295 62 295 57Q295 46 363 46Q379 46 384 45T390 35Q390 33 388 23Q384 6 382 4T366 1Q361 1 324 1T232 2Q170 2 138 2T102 1Q84 1 84 9Q84 14 87 24Q88 27 89 30T90 35T91 39T93 42T96 44T101 45T107 45T116 46T129 46Q168 47 180 50T198 63Q201 68 227 171L252 274L129 623Q128 624 127 625T125 627T122 629T118 631T113 633T105 634T96 635T83 636T66 637Z",style:{"stroke-width":"3"}})])])],-1),as=[is],ts=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"Y")])],-1),ns={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},es={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.554ex",role:"img",focusable:"false",viewBox:"0 -665 500 687","aria-hidden":"true"},ls=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"33",d:"M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z",style:{"stroke-width":"3"}})])])],-1),hs=[ls],ps=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"3")])],-1),ks={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},rs={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.532ex",role:"img",focusable:"false",viewBox:"0 -677 500 677","aria-hidden":"true"},ds=s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"34",d:"M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z",style:{"stroke-width":"3"}})])])],-1),os=[ds],gs=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"4")])],-1),Ts={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Es={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"23.762ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 10502.7 1000","aria-hidden":"true"},cs=n("",1),Qs=[cs],ys=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mrow",{"data-mjx-texclass":"ORD"},[s("mo",{stretchy:"false"},"("),s("mn",null,"1"),s("mo",null,","),s("mn",null,"3"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mo",{stretchy:"false"},"("),s("mn",null,"1"),s("mo",null,","),s("mn",null,"4"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mo",{stretchy:"false"},"("),s("mn",null,"2"),s("mo",null,","),s("mn",null,"3"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mo",{stretchy:"false"},"("),s("mn",null,"2"),s("mo",null,","),s("mn",null,"4"),s("mo",{stretchy:"false"},")")]),s("mo",null,".")])],-1),ms=n("",2);function Cs(us,Fs,xs,ws,_s,fs){return t(),a("div",null,[h,s("p",null,[i("These are constraints that are defined by a logical expression or a function. They are called intentional because they are defined by the property they satisfy. For example, a constraint that specifies that a variable "),s("mjx-container",p,[(t(),a("svg",k,d)),o]),i(" must be less than a variable "),s("mjx-container",g,[(t(),a("svg",T,c)),Q]),i(" could be defined intentionally as "),s("mjx-container",y,[(t(),a("svg",m,u)),F]),i(".")]),x,s("p",null,[i("We use the "),w,i(" constraint to illustrate how to define an intention constraint in "),_,i(". The "),f,i(" constraint ensures that the distances between marks "),s("mjx-container",b,[(t(),a("svg",v,D)),B]),i(" on a ruler are unique.")]),s("mjx-container",A,[(t(),a("svg",V,L)),Z]),j,s("p",null,[i("These are constraints that are defined by explicitly listing all the tuples of values that satisfy the constraint. They are called extensional because they are defined by the set of values they allow. For example, a binary constraint that specifies that a variable "),s("mjx-container",S,[(t(),a("svg",I,z)),O]),i(" must be either "),s("mjx-container",J,[(t(),a("svg",N,R)),q]),i(" or "),s("mjx-container",X,[(t(),a("svg",U,K)),$]),i(" and a variable "),s("mjx-container",W,[(t(),a("svg",ss,as)),ts]),i(" must be either "),s("mjx-container",ns,[(t(),a("svg",es,hs)),ps]),i(" or "),s("mjx-container",ks,[(t(),a("svg",rs,os)),gs]),i(" could be defined extensionally by the set of tuples "),s("mjx-container",Ts,[(t(),a("svg",Es,Qs)),ys])]),ms])}const Hs=e(l,[["render",Cs]]);export{vs as __pageData,Hs as default}; diff --git a/dev/assets/constraints_21_generic_constraints.md.nEZ1rbmN.js b/dev/assets/constraints_21_generic_constraints.md.nEZ1rbmN.js new file mode 100644 index 0000000..26785a6 --- /dev/null +++ b/dev/assets/constraints_21_generic_constraints.md.nEZ1rbmN.js @@ -0,0 +1,90 @@ +import{_ as l,c as t,a5 as e,j as s,a,o as n}from"./chunks/framework.CJakPlgM.js";const O=JSON.parse('{"title":"Generic Constraints","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/21_generic_constraints.md","filePath":"constraints/21_generic_constraints.md","lastUpdated":null}'),h={name:"constraints/21_generic_constraints.md"},p={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},r={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.109ex",height:"1.464ex",role:"img",focusable:"false",viewBox:"0 -442 490 647","aria-hidden":"true"},o={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.42ex",height:"1.686ex",role:"img",focusable:"false",viewBox:"0 -540 2395.6 745","aria-hidden":"true"},E={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},T={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},Q={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},y={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"25.797ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 11402.4 1000","aria-hidden":"true"},m={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.928ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 852 683","aria-hidden":"true"},u={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},F={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 500 666","aria-hidden":"true"},C={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},x={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 500 666","aria-hidden":"true"},w={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},f={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.726ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 763 683","aria-hidden":"true"},b={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},v={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.554ex",role:"img",focusable:"false",viewBox:"0 -665 500 687","aria-hidden":"true"},H={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},B={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.532ex",role:"img",focusable:"false",viewBox:"0 -677 500 677","aria-hidden":"true"},D={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"23.762ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 10502.7 1000","aria-hidden":"true"};function V(M,i,L,Z,j,I){return n(),t("div",null,[i[43]||(i[43]=e('

Generic Constraints

In the XCSP³-core standard, generic constraints are categorized into two main types: intention and extension constraints.

Intention Constraints

',3)),s("p",null,[i[6]||(i[6]=a("These are constraints that are defined by a logical expression or a function. They are called intentional because they are defined by the property they satisfy. For example, a constraint that specifies that a variable ")),s("mjx-container",p,[(n(),t("svg",k,i[0]||(i[0]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D465",d:"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z",style:{"stroke-width":"3"}})])])],-1)]))),i[1]||(i[1]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x")])],-1))]),i[7]||(i[7]=a(" must be less than a variable ")),s("mjx-container",r,[(n(),t("svg",d,i[2]||(i[2]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D466",d:"M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),i[3]||(i[3]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"y")])],-1))]),i[8]||(i[8]=a(" could be defined intentionally as ")),s("mjx-container",o,[(n(),t("svg",g,i[4]||(i[4]=[e('',1)]))),i[5]||(i[5]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x"),s("mo",null,"<"),s("mi",null,"y")])],-1))]),i[9]||(i[9]=a("."))]),i[44]||(i[44]=e('

Note that the intention constraint is not directly available through the JC-API in Constraints.jl. It is designed as such since defining a constraint through a predicate is the natural way.

We provide a straightforward example through the :dist_different constraint on how to define and add such a constraint in the USUAL_CONSTRAINTS collection.

Higher level modeling languages such as JuMP should provide a Intention interface.

Defining an intention constraint in JC-API

',4)),s("p",null,[i[12]||(i[12]=a("We use the ")),i[13]||(i[13]=s("code",null,"dist_different",-1)),i[14]||(i[14]=a(" constraint to illustrate how to define an intention constraint in ")),i[15]||(i[15]=s("em",null,"Constraints.jl",-1)),i[16]||(i[16]=a(". The ")),i[17]||(i[17]=s("code",null,"dist_different",-1)),i[18]||(i[18]=a(" constraint ensures that the distances between marks ")),s("mjx-container",E,[(n(),t("svg",T,i[10]||(i[10]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D465",d:"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z",style:{"stroke-width":"3"}})])])],-1)]))),i[11]||(i[11]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x")])],-1))]),i[19]||(i[19]=a(" on a ruler are unique."))]),s("mjx-container",Q,[(n(),t("svg",y,i[20]||(i[20]=[e('',1)]))),i[21]||(i[21]=s("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"1"),s("mo",{stretchy:"false"},"]"),s("mo",null,"−"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"2"),s("mo",{stretchy:"false"},"]"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mo",null,"≠"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"3"),s("mo",{stretchy:"false"},"]"),s("mo",null,"−"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"4"),s("mo",{stretchy:"false"},"]"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])],-1))]),i[45]||(i[45]=e(`

The constraint is then added to the usual constraints collection.

julia
const description_dist_different = """
+Ensures that the distances between marks on the ruler are unique.
+"""
+
+# Define the predicate
+predicate_dist_different(x) = abs(x[1] - x[2])  abs(x[3] - x[4])
+
+# Add it to usual constraints
+@usual concept_dist_different(x) = xcsp_intention(
+    list = x,
+    predicate = predicate_dist_different
+)

Please check the section dedicated to the Golomb Ruler problem to see a use for this constraint. <!– TODO: Golomb Ruler –>

APIs

Note that the intention constraint is not directly available through the JC-API in Constraints.jl. It is designed as such since defining a constraint through a predicate is the natural way.

We provide here a usage example for the :dist_different constraint, previously added to the USUAL_CONSTRAINTS collection.

Higher level modeling language such as JuMP should provide an Intention interface.

julia
using Constraints
+
+concept(:dist_different, x)
+concept(:dist_different)(x)
julia
# Defines the DistDifferent constraint
+using Constraints
+
+c = x -> xcsp_intention(
+    list = x,
+    predicate = y -> abs(y[1] - y[2])  abs(y[3] - y[4])
+)
+
+c([1, 2, 3, 3]) # true
+c([1, 2, 3, 4]) # false
julia
using CBLS, JuMP
+
+model = Model(CBLS.Optimizer)
+
+# Using build-in DistDifferent
+@variable(model, 0 <= X[1:4] <= 10, Int)
+@constraint(model, X in DistDifferent())
+
+# Alternatively
+@variable(model, 0 <= Y[1:4] <= 10, Int)
+@constraint(model, Y in Intention(y -> abs(y[1] - y[2])  abs(y[3] - y[4])))
+
+optimize!(model)
+
+@info value.(X)
+@info value.(Y)
julia
using CBLS
+import MathOptInterface as MOI
+
+optimizer = CBLS.Optimizer()
+
+x = MOI.add_variables(optimizer, 4)
+for xi in x
+    # Missing RangeDomain currently in CBLS
+    MOI.add_constraint(optimizer, xi, CBLS.DiscreteSet(collect[1:10]))
+end
+MOI.add_constraint(optimizer, x, CBLS.Intention(y -> abs(y[1] - y[2])  abs(y[3] - y[4])))
+
+MOI.optimize!(optimizer)

Extension Constraints

`,9)),s("p",null,[i[36]||(i[36]=a("These are constraints that are defined by explicitly listing all the tuples of values that satisfy the constraint. They are called extensional because they are defined by the set of values they allow. For example, a binary constraint that specifies that a variable ")),s("mjx-container",m,[(n(),t("svg",c,i[22]||(i[22]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D44B",d:"M42 0H40Q26 0 26 11Q26 15 29 27Q33 41 36 43T55 46Q141 49 190 98Q200 108 306 224T411 342Q302 620 297 625Q288 636 234 637H206Q200 643 200 645T202 664Q206 677 212 683H226Q260 681 347 681Q380 681 408 681T453 682T473 682Q490 682 490 671Q490 670 488 658Q484 643 481 640T465 637Q434 634 411 620L488 426L541 485Q646 598 646 610Q646 628 622 635Q617 635 609 637Q594 637 594 648Q594 650 596 664Q600 677 606 683H618Q619 683 643 683T697 681T738 680Q828 680 837 683H845Q852 676 852 672Q850 647 840 637H824Q790 636 763 628T722 611T698 593L687 584Q687 585 592 480L505 384Q505 383 536 304T601 142T638 56Q648 47 699 46Q734 46 734 37Q734 35 732 23Q728 7 725 4T711 1Q708 1 678 1T589 2Q528 2 496 2T461 1Q444 1 444 10Q444 11 446 25Q448 35 450 39T455 44T464 46T480 47T506 54Q523 62 523 64Q522 64 476 181L429 299Q241 95 236 84Q232 76 232 72Q232 53 261 47Q262 47 267 47T273 46Q276 46 277 46T280 45T283 42T284 35Q284 26 282 19Q279 6 276 4T261 1Q258 1 243 1T201 2T142 2Q64 2 42 0Z",style:{"stroke-width":"3"}})])])],-1)]))),i[23]||(i[23]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"X")])],-1))]),i[37]||(i[37]=a(" must be either ")),s("mjx-container",u,[(n(),t("svg",F,i[24]||(i[24]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"31",d:"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z",style:{"stroke-width":"3"}})])])],-1)]))),i[25]||(i[25]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"1")])],-1))]),i[38]||(i[38]=a(" or ")),s("mjx-container",C,[(n(),t("svg",x,i[26]||(i[26]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"32",d:"M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z",style:{"stroke-width":"3"}})])])],-1)]))),i[27]||(i[27]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"2")])],-1))]),i[39]||(i[39]=a(" and a variable ")),s("mjx-container",w,[(n(),t("svg",f,i[28]||(i[28]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D44C",d:"M66 637Q54 637 49 637T39 638T32 641T30 647T33 664T42 682Q44 683 56 683Q104 680 165 680Q288 680 306 683H316Q322 677 322 674T320 656Q316 643 310 637H298Q242 637 242 624Q242 619 292 477T343 333L346 336Q350 340 358 349T379 373T411 410T454 461Q546 568 561 587T577 618Q577 634 545 637Q528 637 528 647Q528 649 530 661Q533 676 535 679T549 683Q551 683 578 682T657 680Q684 680 713 681T746 682Q763 682 763 673Q763 669 760 657T755 643Q753 637 734 637Q662 632 617 587Q608 578 477 424L348 273L322 169Q295 62 295 57Q295 46 363 46Q379 46 384 45T390 35Q390 33 388 23Q384 6 382 4T366 1Q361 1 324 1T232 2Q170 2 138 2T102 1Q84 1 84 9Q84 14 87 24Q88 27 89 30T90 35T91 39T93 42T96 44T101 45T107 45T116 46T129 46Q168 47 180 50T198 63Q201 68 227 171L252 274L129 623Q128 624 127 625T125 627T122 629T118 631T113 633T105 634T96 635T83 636T66 637Z",style:{"stroke-width":"3"}})])])],-1)]))),i[29]||(i[29]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"Y")])],-1))]),i[40]||(i[40]=a(" must be either ")),s("mjx-container",b,[(n(),t("svg",v,i[30]||(i[30]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"33",d:"M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z",style:{"stroke-width":"3"}})])])],-1)]))),i[31]||(i[31]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"3")])],-1))]),i[41]||(i[41]=a(" or ")),s("mjx-container",H,[(n(),t("svg",B,i[32]||(i[32]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"34",d:"M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z",style:{"stroke-width":"3"}})])])],-1)]))),i[33]||(i[33]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"4")])],-1))]),i[42]||(i[42]=a(" could be defined extensionally by the set of tuples ")),s("mjx-container",D,[(n(),t("svg",A,i[34]||(i[34]=[e('',1)]))),i[35]||(i[35]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mrow",{"data-mjx-texclass":"ORD"},[s("mo",{stretchy:"false"},"("),s("mn",null,"1"),s("mo",null,","),s("mn",null,"3"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mo",{stretchy:"false"},"("),s("mn",null,"1"),s("mo",null,","),s("mn",null,"4"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mo",{stretchy:"false"},"("),s("mn",null,"2"),s("mo",null,","),s("mn",null,"3"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mo",{stretchy:"false"},"("),s("mn",null,"2"),s("mo",null,","),s("mn",null,"4"),s("mo",{stretchy:"false"},")")]),s("mo",null,".")])],-1))])]),i[46]||(i[46]=e(`

These two types of constraints provide a flexible way to define complex relationships between variables in constraint programming.

julia
using Constraints
+
+concept(:dist_different, x)
+concept(:dist_different)(x)
julia
# Defines the DistDifferent constraint
+using Constraints
+
+c = x -> xcsp_intention(
+    list = x,
+    predicate = y -> abs(y[1] - y[2])  abs(y[3] - y[4])
+)
+
+c([1, 2, 3, 3]) # true
+c([1, 2, 3, 4]) # false
julia
using CBLS, JuMP
+
+model = Model(CBLS.Optimizer)
+
+# Using build-in DistDifferent
+@variable(model, 0 <= X[1:4] <= 10, Int)
+@constraint(model, X in DistDifferent())
+
+# Alternatively
+@variable(model, 0 <= Y[1:4] <= 10, Int)
+@constraint(model, Y in Intention(y -> abs(y[1] - y[2])  abs(y[3] - y[4])))
+
+optimize!(model)
+
+@info value.(X)
+@info value.(Y)
julia
using CBLS
+import MathOptInterface as MOI
+
+optimizer = CBLS.Optimizer()
+
+x = MOI.add_variables(optimizer, 4)
+for xi in x
+    # Missing RangeDomain currently in CBLS
+    MOI.add_constraint(optimizer, xi, CBLS.DiscreteSet(collect[1:10]))
+end
+MOI.add_constraint(optimizer, x, CBLS.Intention(y -> abs(y[1] - y[2])  abs(y[3] - y[4])))
+
+MOI.optimize!(optimizer)
`,2))])}const z=l(h,[["render",V]]);export{O as __pageData,z as default}; diff --git a/dev/assets/constraints_21_generic_constraints.md.nEZ1rbmN.lean.js b/dev/assets/constraints_21_generic_constraints.md.nEZ1rbmN.lean.js new file mode 100644 index 0000000..26785a6 --- /dev/null +++ b/dev/assets/constraints_21_generic_constraints.md.nEZ1rbmN.lean.js @@ -0,0 +1,90 @@ +import{_ as l,c as t,a5 as e,j as s,a,o as n}from"./chunks/framework.CJakPlgM.js";const O=JSON.parse('{"title":"Generic Constraints","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/21_generic_constraints.md","filePath":"constraints/21_generic_constraints.md","lastUpdated":null}'),h={name:"constraints/21_generic_constraints.md"},p={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},r={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.109ex",height:"1.464ex",role:"img",focusable:"false",viewBox:"0 -442 490 647","aria-hidden":"true"},o={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.42ex",height:"1.686ex",role:"img",focusable:"false",viewBox:"0 -540 2395.6 745","aria-hidden":"true"},E={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},T={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},Q={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},y={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"25.797ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 11402.4 1000","aria-hidden":"true"},m={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.928ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 852 683","aria-hidden":"true"},u={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},F={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 500 666","aria-hidden":"true"},C={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},x={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 500 666","aria-hidden":"true"},w={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},f={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.726ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 763 683","aria-hidden":"true"},b={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},v={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.554ex",role:"img",focusable:"false",viewBox:"0 -665 500 687","aria-hidden":"true"},H={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},B={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.532ex",role:"img",focusable:"false",viewBox:"0 -677 500 677","aria-hidden":"true"},D={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"23.762ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 10502.7 1000","aria-hidden":"true"};function V(M,i,L,Z,j,I){return n(),t("div",null,[i[43]||(i[43]=e('

Generic Constraints

In the XCSP³-core standard, generic constraints are categorized into two main types: intention and extension constraints.

Intention Constraints

',3)),s("p",null,[i[6]||(i[6]=a("These are constraints that are defined by a logical expression or a function. They are called intentional because they are defined by the property they satisfy. For example, a constraint that specifies that a variable ")),s("mjx-container",p,[(n(),t("svg",k,i[0]||(i[0]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D465",d:"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z",style:{"stroke-width":"3"}})])])],-1)]))),i[1]||(i[1]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x")])],-1))]),i[7]||(i[7]=a(" must be less than a variable ")),s("mjx-container",r,[(n(),t("svg",d,i[2]||(i[2]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D466",d:"M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),i[3]||(i[3]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"y")])],-1))]),i[8]||(i[8]=a(" could be defined intentionally as ")),s("mjx-container",o,[(n(),t("svg",g,i[4]||(i[4]=[e('',1)]))),i[5]||(i[5]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x"),s("mo",null,"<"),s("mi",null,"y")])],-1))]),i[9]||(i[9]=a("."))]),i[44]||(i[44]=e('

Note that the intention constraint is not directly available through the JC-API in Constraints.jl. It is designed as such since defining a constraint through a predicate is the natural way.

We provide a straightforward example through the :dist_different constraint on how to define and add such a constraint in the USUAL_CONSTRAINTS collection.

Higher level modeling languages such as JuMP should provide a Intention interface.

Defining an intention constraint in JC-API

',4)),s("p",null,[i[12]||(i[12]=a("We use the ")),i[13]||(i[13]=s("code",null,"dist_different",-1)),i[14]||(i[14]=a(" constraint to illustrate how to define an intention constraint in ")),i[15]||(i[15]=s("em",null,"Constraints.jl",-1)),i[16]||(i[16]=a(". The ")),i[17]||(i[17]=s("code",null,"dist_different",-1)),i[18]||(i[18]=a(" constraint ensures that the distances between marks ")),s("mjx-container",E,[(n(),t("svg",T,i[10]||(i[10]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D465",d:"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z",style:{"stroke-width":"3"}})])])],-1)]))),i[11]||(i[11]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x")])],-1))]),i[19]||(i[19]=a(" on a ruler are unique."))]),s("mjx-container",Q,[(n(),t("svg",y,i[20]||(i[20]=[e('',1)]))),i[21]||(i[21]=s("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"1"),s("mo",{stretchy:"false"},"]"),s("mo",null,"−"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"2"),s("mo",{stretchy:"false"},"]"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mo",null,"≠"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"3"),s("mo",{stretchy:"false"},"]"),s("mo",null,"−"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"4"),s("mo",{stretchy:"false"},"]"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])],-1))]),i[45]||(i[45]=e(`

The constraint is then added to the usual constraints collection.

julia
const description_dist_different = """
+Ensures that the distances between marks on the ruler are unique.
+"""
+
+# Define the predicate
+predicate_dist_different(x) = abs(x[1] - x[2])  abs(x[3] - x[4])
+
+# Add it to usual constraints
+@usual concept_dist_different(x) = xcsp_intention(
+    list = x,
+    predicate = predicate_dist_different
+)

Please check the section dedicated to the Golomb Ruler problem to see a use for this constraint. <!– TODO: Golomb Ruler –>

APIs

Note that the intention constraint is not directly available through the JC-API in Constraints.jl. It is designed as such since defining a constraint through a predicate is the natural way.

We provide here a usage example for the :dist_different constraint, previously added to the USUAL_CONSTRAINTS collection.

Higher level modeling language such as JuMP should provide an Intention interface.

julia
using Constraints
+
+concept(:dist_different, x)
+concept(:dist_different)(x)
julia
# Defines the DistDifferent constraint
+using Constraints
+
+c = x -> xcsp_intention(
+    list = x,
+    predicate = y -> abs(y[1] - y[2])  abs(y[3] - y[4])
+)
+
+c([1, 2, 3, 3]) # true
+c([1, 2, 3, 4]) # false
julia
using CBLS, JuMP
+
+model = Model(CBLS.Optimizer)
+
+# Using build-in DistDifferent
+@variable(model, 0 <= X[1:4] <= 10, Int)
+@constraint(model, X in DistDifferent())
+
+# Alternatively
+@variable(model, 0 <= Y[1:4] <= 10, Int)
+@constraint(model, Y in Intention(y -> abs(y[1] - y[2])  abs(y[3] - y[4])))
+
+optimize!(model)
+
+@info value.(X)
+@info value.(Y)
julia
using CBLS
+import MathOptInterface as MOI
+
+optimizer = CBLS.Optimizer()
+
+x = MOI.add_variables(optimizer, 4)
+for xi in x
+    # Missing RangeDomain currently in CBLS
+    MOI.add_constraint(optimizer, xi, CBLS.DiscreteSet(collect[1:10]))
+end
+MOI.add_constraint(optimizer, x, CBLS.Intention(y -> abs(y[1] - y[2])  abs(y[3] - y[4])))
+
+MOI.optimize!(optimizer)

Extension Constraints

`,9)),s("p",null,[i[36]||(i[36]=a("These are constraints that are defined by explicitly listing all the tuples of values that satisfy the constraint. They are called extensional because they are defined by the set of values they allow. For example, a binary constraint that specifies that a variable ")),s("mjx-container",m,[(n(),t("svg",c,i[22]||(i[22]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D44B",d:"M42 0H40Q26 0 26 11Q26 15 29 27Q33 41 36 43T55 46Q141 49 190 98Q200 108 306 224T411 342Q302 620 297 625Q288 636 234 637H206Q200 643 200 645T202 664Q206 677 212 683H226Q260 681 347 681Q380 681 408 681T453 682T473 682Q490 682 490 671Q490 670 488 658Q484 643 481 640T465 637Q434 634 411 620L488 426L541 485Q646 598 646 610Q646 628 622 635Q617 635 609 637Q594 637 594 648Q594 650 596 664Q600 677 606 683H618Q619 683 643 683T697 681T738 680Q828 680 837 683H845Q852 676 852 672Q850 647 840 637H824Q790 636 763 628T722 611T698 593L687 584Q687 585 592 480L505 384Q505 383 536 304T601 142T638 56Q648 47 699 46Q734 46 734 37Q734 35 732 23Q728 7 725 4T711 1Q708 1 678 1T589 2Q528 2 496 2T461 1Q444 1 444 10Q444 11 446 25Q448 35 450 39T455 44T464 46T480 47T506 54Q523 62 523 64Q522 64 476 181L429 299Q241 95 236 84Q232 76 232 72Q232 53 261 47Q262 47 267 47T273 46Q276 46 277 46T280 45T283 42T284 35Q284 26 282 19Q279 6 276 4T261 1Q258 1 243 1T201 2T142 2Q64 2 42 0Z",style:{"stroke-width":"3"}})])])],-1)]))),i[23]||(i[23]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"X")])],-1))]),i[37]||(i[37]=a(" must be either ")),s("mjx-container",u,[(n(),t("svg",F,i[24]||(i[24]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"31",d:"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z",style:{"stroke-width":"3"}})])])],-1)]))),i[25]||(i[25]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"1")])],-1))]),i[38]||(i[38]=a(" or ")),s("mjx-container",C,[(n(),t("svg",x,i[26]||(i[26]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"32",d:"M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z",style:{"stroke-width":"3"}})])])],-1)]))),i[27]||(i[27]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"2")])],-1))]),i[39]||(i[39]=a(" and a variable ")),s("mjx-container",w,[(n(),t("svg",f,i[28]||(i[28]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D44C",d:"M66 637Q54 637 49 637T39 638T32 641T30 647T33 664T42 682Q44 683 56 683Q104 680 165 680Q288 680 306 683H316Q322 677 322 674T320 656Q316 643 310 637H298Q242 637 242 624Q242 619 292 477T343 333L346 336Q350 340 358 349T379 373T411 410T454 461Q546 568 561 587T577 618Q577 634 545 637Q528 637 528 647Q528 649 530 661Q533 676 535 679T549 683Q551 683 578 682T657 680Q684 680 713 681T746 682Q763 682 763 673Q763 669 760 657T755 643Q753 637 734 637Q662 632 617 587Q608 578 477 424L348 273L322 169Q295 62 295 57Q295 46 363 46Q379 46 384 45T390 35Q390 33 388 23Q384 6 382 4T366 1Q361 1 324 1T232 2Q170 2 138 2T102 1Q84 1 84 9Q84 14 87 24Q88 27 89 30T90 35T91 39T93 42T96 44T101 45T107 45T116 46T129 46Q168 47 180 50T198 63Q201 68 227 171L252 274L129 623Q128 624 127 625T125 627T122 629T118 631T113 633T105 634T96 635T83 636T66 637Z",style:{"stroke-width":"3"}})])])],-1)]))),i[29]||(i[29]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"Y")])],-1))]),i[40]||(i[40]=a(" must be either ")),s("mjx-container",b,[(n(),t("svg",v,i[30]||(i[30]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"33",d:"M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z",style:{"stroke-width":"3"}})])])],-1)]))),i[31]||(i[31]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"3")])],-1))]),i[41]||(i[41]=a(" or ")),s("mjx-container",H,[(n(),t("svg",B,i[32]||(i[32]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"34",d:"M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z",style:{"stroke-width":"3"}})])])],-1)]))),i[33]||(i[33]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"4")])],-1))]),i[42]||(i[42]=a(" could be defined extensionally by the set of tuples ")),s("mjx-container",D,[(n(),t("svg",A,i[34]||(i[34]=[e('',1)]))),i[35]||(i[35]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mrow",{"data-mjx-texclass":"ORD"},[s("mo",{stretchy:"false"},"("),s("mn",null,"1"),s("mo",null,","),s("mn",null,"3"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mo",{stretchy:"false"},"("),s("mn",null,"1"),s("mo",null,","),s("mn",null,"4"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mo",{stretchy:"false"},"("),s("mn",null,"2"),s("mo",null,","),s("mn",null,"3"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mo",{stretchy:"false"},"("),s("mn",null,"2"),s("mo",null,","),s("mn",null,"4"),s("mo",{stretchy:"false"},")")]),s("mo",null,".")])],-1))])]),i[46]||(i[46]=e(`

These two types of constraints provide a flexible way to define complex relationships between variables in constraint programming.

julia
using Constraints
+
+concept(:dist_different, x)
+concept(:dist_different)(x)
julia
# Defines the DistDifferent constraint
+using Constraints
+
+c = x -> xcsp_intention(
+    list = x,
+    predicate = y -> abs(y[1] - y[2])  abs(y[3] - y[4])
+)
+
+c([1, 2, 3, 3]) # true
+c([1, 2, 3, 4]) # false
julia
using CBLS, JuMP
+
+model = Model(CBLS.Optimizer)
+
+# Using build-in DistDifferent
+@variable(model, 0 <= X[1:4] <= 10, Int)
+@constraint(model, X in DistDifferent())
+
+# Alternatively
+@variable(model, 0 <= Y[1:4] <= 10, Int)
+@constraint(model, Y in Intention(y -> abs(y[1] - y[2])  abs(y[3] - y[4])))
+
+optimize!(model)
+
+@info value.(X)
+@info value.(Y)
julia
using CBLS
+import MathOptInterface as MOI
+
+optimizer = CBLS.Optimizer()
+
+x = MOI.add_variables(optimizer, 4)
+for xi in x
+    # Missing RangeDomain currently in CBLS
+    MOI.add_constraint(optimizer, xi, CBLS.DiscreteSet(collect[1:10]))
+end
+MOI.add_constraint(optimizer, x, CBLS.Intention(y -> abs(y[1] - y[2])  abs(y[3] - y[4])))
+
+MOI.optimize!(optimizer)
`,2))])}const z=l(h,[["render",V]]);export{O as __pageData,z as default}; diff --git a/dev/assets/constraints_22_language_constraints.md.CUmApMGU.lean.js b/dev/assets/constraints_22_language_constraints.md.CUmApMGU.lean.js deleted file mode 100644 index a317a18..0000000 --- a/dev/assets/constraints_22_language_constraints.md.CUmApMGU.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const o=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/22_language_constraints.md","filePath":"constraints/22_language_constraints.md","lastUpdated":null}'),t={name:"constraints/22_language_constraints.md"},h=n("",6),l=[h];function k(p,e,E,r,d,g){return a(),i("div",null,l)}const F=s(t,[["render",k]]);export{o as __pageData,F as default}; diff --git a/dev/assets/constraints_22_language_constraints.md.CUmApMGU.js b/dev/assets/constraints_22_language_constraints.md.DjiODENs.js similarity index 77% rename from dev/assets/constraints_22_language_constraints.md.CUmApMGU.js rename to dev/assets/constraints_22_language_constraints.md.DjiODENs.js index e84a0e8..05fd27f 100644 --- a/dev/assets/constraints_22_language_constraints.md.CUmApMGU.js +++ b/dev/assets/constraints_22_language_constraints.md.DjiODENs.js @@ -1,6 +1,4 @@ -import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const o=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/22_language_constraints.md","filePath":"constraints/22_language_constraints.md","lastUpdated":null}'),t={name:"constraints/22_language_constraints.md"},h=n(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

Constraints defined from Languages

# Constraints.xcsp_regularFunction.
julia
xcsp_regular(; list, automaton)
-
-Ensures that a sequence \`x\` (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of \`x\` with the language rules encoded within the \`automaton\` parameter, which must be an instance of \`<:AbstractAutomaton\`.

Arguments

  • list::Vector{Int}: A list of variables

  • automaton<:AbstractAutomaton: An automaton representing the regular language

Variants

  • :regular: Ensures that a sequence x (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of x with the language rules encoded within the automaton parameter, which must be an instance of <:AbstractAutomaton.
julia
concept(:regular, x; language)
+import{_ as l,c as k,j as i,a,G as t,a5 as h,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const B=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/22_language_constraints.md","filePath":"constraints/22_language_constraints.md","lastUpdated":null}'),E={name:"constraints/22_language_constraints.md"},r={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""};function g(y,s,o,C,F,c){const n=p("Badge");return e(),k("div",null,[s[6]||(s[6]=i("h1",{id:"Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia",tabindex:"-1"},[a("Constraints.jl: Streamlining Constraint Definition and Integration in Julia "),i("a",{class:"header-anchor",href:"#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","aria-label":'Permalink to "Constraints.jl: Streamlining Constraint Definition and Integration in Julia {#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia}"'},"​")],-1)),s[7]||(s[7]=i("h3",{id:"Constraints-defined-from-Languages",tabindex:"-1"},[a("Constraints defined from Languages "),i("a",{class:"header-anchor",href:"#Constraints-defined-from-Languages","aria-label":'Permalink to "Constraints defined from Languages {#Constraints-defined-from-Languages}"'},"​")],-1)),i("details",r,[i("summary",null,[s[0]||(s[0]=i("a",{id:"Constraints.xcsp_regular-constraints-22_language_constraints",href:"#Constraints.xcsp_regular-constraints-22_language_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_regular")],-1)),s[1]||(s[1]=a()),t(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=h(`
julia
xcsp_regular(; list, automaton)

Ensures that a sequence x (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of x with the language rules encoded within the automaton parameter, which must be an instance of <:AbstractAutomaton.

Arguments

  • list::Vector{Int}: A list of variables

  • automaton<:AbstractAutomaton: An automaton representing the regular language

Variants

  • :regular: Ensures that a sequence x (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of x with the language rules encoded within the automaton parameter, which must be an instance of <:AbstractAutomaton.
julia
concept(:regular, x; language)
 concept(:regular)(x; language)

Examples

julia
c = concept(:regular)
 
 states = Dict(
@@ -18,7 +16,7 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const o
 a = Automaton(states, start, finish)
 
 c([0,0,1,1,0,0,1,0,0]; language = a)
-c([1,1,1,0,1]; language = a)

source


# Constraints.xcsp_mddFunction.
julia
xcsp_mdd(; list, diagram)

Return a function that checks if the list of values list satisfies the MDD diagram.

Arguments

  • list::Vector{Int}: list of values to check.

  • diagram::MDD: MDD to check.

Variants

  • :mdd: Multi-valued Decision Diagram (MDD) constraint. The MDD constraint is a constraint that can be used to model a wide range of problems. It is a directed graph where each node is labeled with a value and each edge is labeled with a value. The constraint is satisfied if there is a path from the first node to the last node such that the sequence of edge labels is a valid sequence of the value labels.
julia
concept(:mdd, x; language)
+c([1,1,1,0,1]; language = a)

source

`,10))]),i("details",d,[i("summary",null,[s[3]||(s[3]=i("a",{id:"Constraints.xcsp_mdd-constraints-22_language_constraints",href:"#Constraints.xcsp_mdd-constraints-22_language_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_mdd")],-1)),s[4]||(s[4]=a()),t(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=h(`
julia
xcsp_mdd(; list, diagram)

Return a function that checks if the list of values list satisfies the MDD diagram.

Arguments

  • list::Vector{Int}: list of values to check.

  • diagram::MDD: MDD to check.

Variants

  • :mdd: Multi-valued Decision Diagram (MDD) constraint.

The MDD constraint is a constraint that can be used to model a wide range of problems. It is a directed graph where each node is labeled with a value and each edge is labeled with a value. The constraint is satisfied if there is a path from the first node to the last node such that the sequence of edge labels is a valid sequence of the value labels.

julia
concept(:mdd, x; language)
 concept(:mdd)(x; language)

Examples

julia
c = concept(:mdd)
 
 states = [
@@ -45,4 +43,4 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const o
 c([2,0,0]; language = a)
 c([2,1,2]; language = a)
 c([1,0,2]; language = a)
-c([0,1,2]; language = a)

source


`,6),l=[h];function k(p,e,E,r,d,g){return a(),i("div",null,l)}const F=s(t,[["render",k]]);export{o as __pageData,F as default}; +c([0,1,2]; language = a)

source

`,11))])])}const m=l(E,[["render",g]]);export{B as __pageData,m as default}; diff --git a/dev/assets/constraints_22_language_constraints.md.DjiODENs.lean.js b/dev/assets/constraints_22_language_constraints.md.DjiODENs.lean.js new file mode 100644 index 0000000..05fd27f --- /dev/null +++ b/dev/assets/constraints_22_language_constraints.md.DjiODENs.lean.js @@ -0,0 +1,46 @@ +import{_ as l,c as k,j as i,a,G as t,a5 as h,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const B=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/22_language_constraints.md","filePath":"constraints/22_language_constraints.md","lastUpdated":null}'),E={name:"constraints/22_language_constraints.md"},r={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""};function g(y,s,o,C,F,c){const n=p("Badge");return e(),k("div",null,[s[6]||(s[6]=i("h1",{id:"Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia",tabindex:"-1"},[a("Constraints.jl: Streamlining Constraint Definition and Integration in Julia "),i("a",{class:"header-anchor",href:"#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","aria-label":'Permalink to "Constraints.jl: Streamlining Constraint Definition and Integration in Julia {#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia}"'},"​")],-1)),s[7]||(s[7]=i("h3",{id:"Constraints-defined-from-Languages",tabindex:"-1"},[a("Constraints defined from Languages "),i("a",{class:"header-anchor",href:"#Constraints-defined-from-Languages","aria-label":'Permalink to "Constraints defined from Languages {#Constraints-defined-from-Languages}"'},"​")],-1)),i("details",r,[i("summary",null,[s[0]||(s[0]=i("a",{id:"Constraints.xcsp_regular-constraints-22_language_constraints",href:"#Constraints.xcsp_regular-constraints-22_language_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_regular")],-1)),s[1]||(s[1]=a()),t(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=h(`
julia
xcsp_regular(; list, automaton)

Ensures that a sequence x (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of x with the language rules encoded within the automaton parameter, which must be an instance of <:AbstractAutomaton.

Arguments

  • list::Vector{Int}: A list of variables

  • automaton<:AbstractAutomaton: An automaton representing the regular language

Variants

  • :regular: Ensures that a sequence x (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of x with the language rules encoded within the automaton parameter, which must be an instance of <:AbstractAutomaton.
julia
concept(:regular, x; language)
+concept(:regular)(x; language)

Examples

julia
c = concept(:regular)
+
+states = Dict(
+    (:a, 0) => :a,
+    (:a, 1) => :b,
+    (:b, 1) => :c,
+    (:c, 0) => :d,
+    (:d, 0) => :d,
+    (:d, 1) => :e,
+    (:e, 0) => :e,
+)
+start = :a
+finish = :e
+
+a = Automaton(states, start, finish)
+
+c([0,0,1,1,0,0,1,0,0]; language = a)
+c([1,1,1,0,1]; language = a)

source

`,10))]),i("details",d,[i("summary",null,[s[3]||(s[3]=i("a",{id:"Constraints.xcsp_mdd-constraints-22_language_constraints",href:"#Constraints.xcsp_mdd-constraints-22_language_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_mdd")],-1)),s[4]||(s[4]=a()),t(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=h(`
julia
xcsp_mdd(; list, diagram)

Return a function that checks if the list of values list satisfies the MDD diagram.

Arguments

  • list::Vector{Int}: list of values to check.

  • diagram::MDD: MDD to check.

Variants

  • :mdd: Multi-valued Decision Diagram (MDD) constraint.

The MDD constraint is a constraint that can be used to model a wide range of problems. It is a directed graph where each node is labeled with a value and each edge is labeled with a value. The constraint is satisfied if there is a path from the first node to the last node such that the sequence of edge labels is a valid sequence of the value labels.

julia
concept(:mdd, x; language)
+concept(:mdd)(x; language)

Examples

julia
c = concept(:mdd)
+
+states = [
+    Dict( # level x1
+        (:r, 0) => :n1,
+        (:r, 1) => :n2,
+        (:r, 2) => :n3,
+    ),
+    Dict( # level x2
+        (:n1, 2) => :n4,
+        (:n2, 2) => :n4,
+        (:n3, 0) => :n5,
+    ),
+    Dict( # level x3
+        (:n4, 0) => :t,
+        (:n5, 0) => :t,
+    ),
+]
+
+a = MDD(states)
+
+c([0,2,0]; language = a)
+c([1,2,0]; language = a)
+c([2,0,0]; language = a)
+c([2,1,2]; language = a)
+c([1,0,2]; language = a)
+c([0,1,2]; language = a)

source

`,11))])])}const m=l(E,[["render",g]]);export{B as __pageData,m as default}; diff --git a/dev/assets/constraints_23_comparison_constraints.md.ZkJcXQIT.js b/dev/assets/constraints_23_comparison_constraints.md.D9f4GIqO.js similarity index 85% rename from dev/assets/constraints_23_comparison_constraints.md.ZkJcXQIT.js rename to dev/assets/constraints_23_comparison_constraints.md.D9f4GIqO.js index c9c93c1..fc871ce 100644 --- a/dev/assets/constraints_23_comparison_constraints.md.ZkJcXQIT.js +++ b/dev/assets/constraints_23_comparison_constraints.md.D9f4GIqO.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const o=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/23_comparison_constraints.md","filePath":"constraints/23_comparison_constraints.md","lastUpdated":null}'),h={name:"constraints/23_comparison_constraints.md"},l=n(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
+import{_ as l,c as k,a5 as a,j as i,a as h,G as t,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const b=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/23_comparison_constraints.md","filePath":"constraints/23_comparison_constraints.md","lastUpdated":null}'),E={name:"constraints/23_comparison_constraints.md"},r={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""};function y(o,s,F,C,c,u){const n=p("Badge");return e(),k("div",null,[s[9]||(s[9]=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
 
 concept(:all_different, [1,1,1,2]) # false
 concept(:all_different, [1,9,3,2]) # true
julia
using Constraints
@@ -17,7 +17,7 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const o
 JuMP.optimize!(model)
 @info "All Different" value.(X) value.(Y)
 
-# Note that this example gives a solution for the all_different constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+# Note that this example gives a solution for the all_different constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 concept(:all_equal, [1,1,1,2]) #false
 concept(:all_equal, [1,1,1,1]) #true
julia
using Constraints
@@ -35,7 +35,7 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const o
 JuMP.optimize!(model)
 @info "All Equal" value.(X)
 
-# Note that this example gives a solution for the all_equal constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+# Note that this example gives a solution for the all_equal constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 @info concept(:ordered, [1, 2, 3, 4, 4]; op=≤)
 @info concept(:ordered, [1, 2, 3, 3, 5]; op=<)
@@ -55,13 +55,13 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const o
 @constraint(model, X in Ordered())
 @constraint(model, Y in Ordered(; op = <))
 JuMP.optimize!(model)
-@info "Ordered" value.(X) value.(Y)
julia
# TODO: How to handle intention in JuMP/MOI

Comparison-based Constraints

# Constraints.xcsp_all_differentFunction.
julia
xcsp_all_different(list::Vector{Int})

Return true if all the values of list are different, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

Variants

  • :all_different: Global constraint ensuring that all the values of x are all different.
julia
concept(:all_different, x; vals)
+@info "Ordered" value.(X) value.(Y)
julia
# TODO: How to handle intention in JuMP/MOI

Comparison-based Constraints

`,5)),i("details",r,[i("summary",null,[s[0]||(s[0]=i("a",{id:"Constraints.xcsp_all_different-constraints-23_comparison_constraints",href:"#Constraints.xcsp_all_different-constraints-23_comparison_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_all_different")],-1)),s[1]||(s[1]=h()),t(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=a(`
julia
xcsp_all_different(list::Vector{Int})

Return true if all the values of list are different, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

Variants

  • :all_different: Global constraint ensuring that the values in x are all different.
julia
concept(:all_different, x; vals)
 concept(:all_different)(x; vals)

Examples

julia
c = concept(:all_different)
 
 c([1, 2, 3, 4])
 c([1, 2, 3, 1])
 c([1, 0, 0, 4]; vals=[0])
-c([1, 0, 0, 1]; vals=[0])

source


# Constraints.xcsp_all_equalFunction.
julia
xcsp_all_equal(list::Vector{Int}, val::Int)

Return true if all the values of list are equal to val, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • val::Int: value to compare to.

Variants

  • :all_equal: Global constraint ensuring that all the values of x are all equal.
julia
concept(:all_equal, x; val=nothing, pair_vars=zeros(x), op=+)
+c([1, 0, 0, 1]; vals=[0])

source

`,10))]),i("details",d,[i("summary",null,[s[3]||(s[3]=i("a",{id:"Constraints.xcsp_all_equal-constraints-23_comparison_constraints",href:"#Constraints.xcsp_all_equal-constraints-23_comparison_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_all_equal")],-1)),s[4]||(s[4]=h()),t(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=a(`
julia
xcsp_all_equal(list::Vector{Int}, val::Int)

Return true if all the values of list are equal to val, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • val::Int: value to compare to.

Variants

  • :all_equal: Global constraint ensuring that the values in x are all equal.
julia
concept(:all_equal, x; val=nothing, pair_vars=zeros(x), op=+)
 concept(:all_equal)(x; val=nothing, pair_vars=zeros(x), op=+)

Examples

julia
c = concept(:all_equal)
 
 c([0, 0, 0, 0])
@@ -69,7 +69,7 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const o
 c([3, 2, 1, 0]; pair_vars=[0, 1, 2, 3])
 c([0, 1, 2, 3]; pair_vars=[0, 1, 2, 3])
 c([1, 2, 3, 4]; op=/, val=1, pair_vars=[1, 2, 3, 4])
-c([1, 2, 3, 4]; op=*, val=1, pair_vars=[1, 2, 3, 4])

source


# Constraints.xcsp_orderedFunction.
julia
xcsp_ordered(list::Vector{Int}, operator, lengths)

Return true if all the values of list are in an increasing order, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • operator: comparison operator to use.

  • lengths: list of lengths to use. Defaults to nothing.

Variants

  • :ordered: Global constraint ensuring that all the values of x are in an increasing order.
julia
concept(:ordered, x; op=≤, pair_vars=nothing)
+c([1, 2, 3, 4]; op=*, val=1, pair_vars=[1, 2, 3, 4])

source

`,10))]),i("details",g,[i("summary",null,[s[6]||(s[6]=i("a",{id:"Constraints.xcsp_ordered-constraints-23_comparison_constraints",href:"#Constraints.xcsp_ordered-constraints-23_comparison_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_ordered")],-1)),s[7]||(s[7]=h()),t(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[8]||(s[8]=a(`
julia
xcsp_ordered(list::Vector{Int}, operator, lengths)

Return true if all the values of list are in an increasing order, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • operator: comparison operator to use.

  • lengths: list of lengths to use. Defaults to nothing.

Variants

  • :ordered: Global constraint ensuring that all the values of x are in a total order defined by a comparison operator.
julia
concept(:ordered, x; op=≤, pair_vars=nothing)
 concept(:ordered)(x; op=≤, pair_vars=nothing)
  • :increasing: Global constraint ensuring that all the values of x are in an increasing order.
julia
concept(:increasing, x; op=≤, pair_vars=nothing)
 concept(:increasing)(x; op=≤, pair_vars=nothing)
  • :decreasing: Global constraint ensuring that all the values of x are in a decreasing order.
julia
concept(:decreasing, x; op=≥, pair_vars=nothing)
 concept(:decreasing)(x; op=≥, pair_vars=nothing)
  • :strictly_increasing: Global constraint ensuring that all the values of x are in a strictly increasing order.
julia
concept(:strictly_increasing, x; op=<, pair_vars=nothing)
@@ -79,4 +79,4 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const o
 c([1, 2, 3, 4, 4]; op=≤)
 c([1, 2, 3, 4, 5]; op=<)
 !c([1, 2, 3, 4, 3]; op=≤)
-!c([1, 2, 3, 4, 3]; op=<)

source


`,11),t=[l];function k(p,e,E,r,d,g){return a(),i("div",null,t)}const F=s(h,[["render",k]]);export{o as __pageData,F as default}; +!c([1, 2, 3, 4, 3]; op=<)

source

`,18))])])}const v=l(E,[["render",y]]);export{b as __pageData,v as default}; diff --git a/dev/assets/constraints_23_comparison_constraints.md.D9f4GIqO.lean.js b/dev/assets/constraints_23_comparison_constraints.md.D9f4GIqO.lean.js new file mode 100644 index 0000000..fc871ce --- /dev/null +++ b/dev/assets/constraints_23_comparison_constraints.md.D9f4GIqO.lean.js @@ -0,0 +1,82 @@ +import{_ as l,c as k,a5 as a,j as i,a as h,G as t,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const b=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/23_comparison_constraints.md","filePath":"constraints/23_comparison_constraints.md","lastUpdated":null}'),E={name:"constraints/23_comparison_constraints.md"},r={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""};function y(o,s,F,C,c,u){const n=p("Badge");return e(),k("div",null,[s[9]||(s[9]=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
+
+concept(:all_different, [1,1,1,2]) # false
+concept(:all_different, [1,9,3,2]) # true
julia
using Constraints
+
+c = x -> Constraints.xcsp_all_different(
+    list = x
+)
+@info c([1, 2, 3, 3]) # false
+@info c([1, 2, 3, 4]) # true
julia
using CBLS, JuMP
+
+model = Model(CBLS.Optimizer)
+@variable(model, 1X[1:4]4, Int)
+@variable(model, 0Y[1:4]2, Int)
+@constraint(model, X in AllDifferent())
+@constraint(model, Y in AllDifferent(; vals = [0]))
+JuMP.optimize!(model)
+@info "All Different" value.(X) value.(Y)
+
+# Note that this example gives a solution for the all_different constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+
+concept(:all_equal, [1,1,1,2]) #false
+concept(:all_equal, [1,1,1,1]) #true
julia
using Constraints
+
+c = x -> Constraints.xcsp_all_equal(
+    list = x
+)
+
+@info c([1, 1, 1, 1]) # false
+@info c([1, 2, 3, 4]) # true
julia
using JuMP, CBLS
+
+model = Model(CBLS.Optimizer)
+@variable(model, 0X[1:4]4, Int)
+@constraint(model, X in AllEqual())
+JuMP.optimize!(model)
+@info "All Equal" value.(X)
+
+# Note that this example gives a solution for the all_equal constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+
+@info concept(:ordered, [1, 2, 3, 4, 4]; op=≤)
+@info concept(:ordered, [1, 2, 3, 3, 5]; op=<)
+@info concept(:increasing, [1,2,2,3])
julia
using Constraints
+
+c = x -> Constraints.xcsp_ordered(
+   	list = x,
+	operator =
+)
+
+@info c([1, 1, 1, 1])
+@info c([9, 3, 6, 8])
julia
using CBLS, JuMP
+
+model = Model(CBLS.Optimizer)
+@variable(model, 1X[1:5]5, Int)
+@variable(model, 1Y[1:5]5, Int)
+@constraint(model, X in Ordered())
+@constraint(model, Y in Ordered(; op = <))
+JuMP.optimize!(model)
+@info "Ordered" value.(X) value.(Y)
julia
# TODO: How to handle intention in JuMP/MOI

Comparison-based Constraints

`,5)),i("details",r,[i("summary",null,[s[0]||(s[0]=i("a",{id:"Constraints.xcsp_all_different-constraints-23_comparison_constraints",href:"#Constraints.xcsp_all_different-constraints-23_comparison_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_all_different")],-1)),s[1]||(s[1]=h()),t(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=a(`
julia
xcsp_all_different(list::Vector{Int})

Return true if all the values of list are different, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

Variants

  • :all_different: Global constraint ensuring that the values in x are all different.
julia
concept(:all_different, x; vals)
+concept(:all_different)(x; vals)

Examples

julia
c = concept(:all_different)
+
+c([1, 2, 3, 4])
+c([1, 2, 3, 1])
+c([1, 0, 0, 4]; vals=[0])
+c([1, 0, 0, 1]; vals=[0])

source

`,10))]),i("details",d,[i("summary",null,[s[3]||(s[3]=i("a",{id:"Constraints.xcsp_all_equal-constraints-23_comparison_constraints",href:"#Constraints.xcsp_all_equal-constraints-23_comparison_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_all_equal")],-1)),s[4]||(s[4]=h()),t(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=a(`
julia
xcsp_all_equal(list::Vector{Int}, val::Int)

Return true if all the values of list are equal to val, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • val::Int: value to compare to.

Variants

  • :all_equal: Global constraint ensuring that the values in x are all equal.
julia
concept(:all_equal, x; val=nothing, pair_vars=zeros(x), op=+)
+concept(:all_equal)(x; val=nothing, pair_vars=zeros(x), op=+)

Examples

julia
c = concept(:all_equal)
+
+c([0, 0, 0, 0])
+c([1, 2, 3, 4])
+c([3, 2, 1, 0]; pair_vars=[0, 1, 2, 3])
+c([0, 1, 2, 3]; pair_vars=[0, 1, 2, 3])
+c([1, 2, 3, 4]; op=/, val=1, pair_vars=[1, 2, 3, 4])
+c([1, 2, 3, 4]; op=*, val=1, pair_vars=[1, 2, 3, 4])

source

`,10))]),i("details",g,[i("summary",null,[s[6]||(s[6]=i("a",{id:"Constraints.xcsp_ordered-constraints-23_comparison_constraints",href:"#Constraints.xcsp_ordered-constraints-23_comparison_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_ordered")],-1)),s[7]||(s[7]=h()),t(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[8]||(s[8]=a(`
julia
xcsp_ordered(list::Vector{Int}, operator, lengths)

Return true if all the values of list are in an increasing order, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • operator: comparison operator to use.

  • lengths: list of lengths to use. Defaults to nothing.

Variants

  • :ordered: Global constraint ensuring that all the values of x are in a total order defined by a comparison operator.
julia
concept(:ordered, x; op=≤, pair_vars=nothing)
+concept(:ordered)(x; op=≤, pair_vars=nothing)
  • :increasing: Global constraint ensuring that all the values of x are in an increasing order.
julia
concept(:increasing, x; op=≤, pair_vars=nothing)
+concept(:increasing)(x; op=≤, pair_vars=nothing)
  • :decreasing: Global constraint ensuring that all the values of x are in a decreasing order.
julia
concept(:decreasing, x; op=≥, pair_vars=nothing)
+concept(:decreasing)(x; op=≥, pair_vars=nothing)
  • :strictly_increasing: Global constraint ensuring that all the values of x are in a strictly increasing order.
julia
concept(:strictly_increasing, x; op=<, pair_vars=nothing)
+concept(:strictly_increasing)(x; op=<, pair_vars=nothing)
  • :strictly_decreasing: Global constraint ensuring that all the values of x are in a strictly decreasing order.
julia
concept(:strictly_decreasing, x; op=>, pair_vars=nothing)
+concept(:strictly_decreasing)(x; op=>, pair_vars=nothing)

Examples

julia
c = concept(:ordered)
+
+c([1, 2, 3, 4, 4]; op=≤)
+c([1, 2, 3, 4, 5]; op=<)
+!c([1, 2, 3, 4, 3]; op=≤)
+!c([1, 2, 3, 4, 3]; op=<)

source

`,18))])])}const v=l(E,[["render",y]]);export{b as __pageData,v as default}; diff --git a/dev/assets/constraints_23_comparison_constraints.md.ZkJcXQIT.lean.js b/dev/assets/constraints_23_comparison_constraints.md.ZkJcXQIT.lean.js deleted file mode 100644 index e5fef41..0000000 --- a/dev/assets/constraints_23_comparison_constraints.md.ZkJcXQIT.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const o=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/23_comparison_constraints.md","filePath":"constraints/23_comparison_constraints.md","lastUpdated":null}'),h={name:"constraints/23_comparison_constraints.md"},l=n("",11),t=[l];function k(p,e,E,r,d,g){return a(),i("div",null,t)}const F=s(h,[["render",k]]);export{o as __pageData,F as default}; diff --git a/dev/assets/constraints_24_counting_summing_constraints.md.CMf8YC_O.lean.js b/dev/assets/constraints_24_counting_summing_constraints.md.CMf8YC_O.lean.js deleted file mode 100644 index b9e9f16..0000000 --- a/dev/assets/constraints_24_counting_summing_constraints.md.CMf8YC_O.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,c as i,o as a,a7 as h}from"./chunks/framework.CBLuZwrP.js";const F=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/24_counting_summing_constraints.md","filePath":"constraints/24_counting_summing_constraints.md","lastUpdated":null}'),k={name:"constraints/24_counting_summing_constraints.md"},n=h("",14),t=[n];function l(p,e,E,d,r,g){return a(),i("div",null,t)}const C=s(k,[["render",l]]);export{F as __pageData,C as default}; diff --git a/dev/assets/constraints_24_counting_summing_constraints.md.CMf8YC_O.js b/dev/assets/constraints_24_counting_summing_constraints.md.NT49jSaK.js similarity index 91% rename from dev/assets/constraints_24_counting_summing_constraints.md.CMf8YC_O.js rename to dev/assets/constraints_24_counting_summing_constraints.md.NT49jSaK.js index cd68a5d..33c0973 100644 --- a/dev/assets/constraints_24_counting_summing_constraints.md.CMf8YC_O.js +++ b/dev/assets/constraints_24_counting_summing_constraints.md.NT49jSaK.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,a7 as h}from"./chunks/framework.CBLuZwrP.js";const F=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/24_counting_summing_constraints.md","filePath":"constraints/24_counting_summing_constraints.md","lastUpdated":null}'),k={name:"constraints/24_counting_summing_constraints.md"},n=h(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
+import{_ as l,c as t,a5 as a,j as i,a as k,G as n,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const b=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/24_counting_summing_constraints.md","filePath":"constraints/24_counting_summing_constraints.md","lastUpdated":null}'),E={name:"constraints/24_counting_summing_constraints.md"},d={class:"jldocstring custom-block",open:""},r={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""};function F(C,s,o,c,B,u){const h=p("Badge");return e(),t("div",null,[s[12]||(s[12]=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
 
 @info concept(:sum, [1, 2, 3, 4, 5]; op = ==, val=15)
 @info concept(:sum, [1, 2, 3, 4, 5]; op = ==, val=2)
@@ -20,7 +20,7 @@ import{_ as s,c as i,o as a,a7 as h}from"./chunks/framework.CBLuZwrP.js";const F
 @constraint(model, X in Sum(; op = ==, val = 15))
 @constraint(model, Y in Sum(; op = <=, val = 10))
 JuMP.optimize!(model)
-@info "Sum" value.(X) value.(Y)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "Sum" value.(X) value.(Y)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 concept(:count, [1,1,1,2], vals = [1, 1, 1, 2], op = ==, val = 4) # true
 concept(:count, [1,1,1,2], vals = [1, 1, 1, 2], op = ==, val = 5) # false
@@ -54,7 +54,7 @@ import{_ as s,c as i,o as a,a7 as h}from"./chunks/framework.CBLuZwrP.js";const F
 @constraint(model, X_at_most in AtMost(vals = [1, 2], val = 1))
 @constraint(model, X_exactly in Exactly(vals = [1, 2], val = 2))
 JuMP.optimize!(model)
-@info "Count" value.(X) value.(X_at_least) value.(X_at_most) value.(X_exactly)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "Count" value.(X) value.(X_at_least) value.(X_at_most) value.(X_exactly)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 @info concept(:nvalues, [1, 2, 3, 4, 5]; op = ==, val = 5)
 @info concept(:nvalues, [1, 2, 3, 4, 5]; op = ==, val = 2)
@@ -78,7 +78,7 @@ import{_ as s,c as i,o as a,a7 as h}from"./chunks/framework.CBLuZwrP.js";const F
 @constraint(model, Y in NValues(; op = ==, val = 2))
 @constraint(model, Z in NValues(; op = <=, val = 5, vals = [1, 2]))
 JuMP.optimize!(model)
-@info "NValues" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "NValues" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 # [v1, v2, v3], [v1, a1, a2; v2, b1, b2; v3, c1, c2] means v1 occurs between a1 and a2 times in the first array, similar for v2 and v3.
 
@@ -105,13 +105,13 @@ import{_ as s,c as i,o as a,a7 as h}from"./chunks/framework.CBLuZwrP.js";const F
 @constraint(model, Y in CardinalityOpen(; vals = [2 0 1; 5 1 3; 10 2 3]))
 @constraint(model, Z in CardinalityClosed(; vals = [2 0 1; 5 1 3; 10 2 3]))
 JuMP.optimize!(model)
-@info "Cardinality" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI

Counting and Summing Constraints

# Constraints.xcsp_sumFunction.
julia
xcsp_sum(list, coeffs, condition)

Return true if the sum of the variables in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • coeffs::Vector{Int}: list of coefficients to use.

  • condition: condition to satisfy.

Variants

  • :sum: Global constraint ensuring that the sum of the variables in x satisfies a given condition.
julia
concept(:sum, x; op===, pair_vars=ones(x), val)
+@info "Cardinality" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI

Counting and Summing Constraints

`,6)),i("details",d,[i("summary",null,[s[0]||(s[0]=i("a",{id:"Constraints.xcsp_sum-constraints-24_counting_summing_constraints",href:"#Constraints.xcsp_sum-constraints-24_counting_summing_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_sum")],-1)),s[1]||(s[1]=k()),n(h,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=a(`
julia
xcsp_sum(list, coeffs, condition)

Return true if the sum of the variables in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • coeffs::Vector{Int}: list of coefficients to use.

  • condition: condition to satisfy.

Variants

  • :sum: Global constraint ensuring that the sum of the variables in x satisfies a given numerical condition.
julia
concept(:sum, x; op===, pair_vars=ones(x), val)
 concept(:sum)(x; op===, pair_vars=ones(x), val)

Examples

julia
c = concept(:sum)
 
 c([1, 2, 3, 4, 5]; op===, val=15)
 c([1, 2, 3, 4, 5]; op===, val=2)
 c([1, 2, 3, 4, 3]; op=≤, val=15)
-c([1, 2, 3, 4, 3]; op=≤, val=3)

source


# Constraints.xcsp_countFunction.
julia
xcsp_count(list, values, condition)

Return true if the number of occurrences of the values in values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • values::Vector{Int}: list of values to check.

  • condition: condition to satisfy.

Variants

  • :count: Constraint ensuring that the number of occurrences of the values in vals in x satisfies the given condition.
julia
concept(:count, x; vals, op, val)
+c([1, 2, 3, 4, 3]; op=≤, val=3)

source

`,10))]),i("details",r,[i("summary",null,[s[3]||(s[3]=i("a",{id:"Constraints.xcsp_count-constraints-24_counting_summing_constraints",href:"#Constraints.xcsp_count-constraints-24_counting_summing_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_count")],-1)),s[4]||(s[4]=k()),n(h,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=a(`
julia
xcsp_count(list, values, condition)

Return true if the number of occurrences of the values in values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • values::Vector{Int}: list of values to check.

  • condition: condition to satisfy.

Variants

  • :count: Constraint ensuring that the number of occurrences of the values in vals in x satisfies the given condition.
julia
concept(:count, x; vals, op, val)
 concept(:count)(x; vals, op, val)
  • :at_least: Constraint ensuring that the number of occurrences of the values in vals in x is at least val.
julia
concept(:at_least, x; vals, val)
 concept(:at_least)(x; vals, val)
  • :at_most: Constraint ensuring that the number of occurrences of the values in vals in x is at most val.
julia
concept(:at_most, x; vals, val)
 concept(:at_most)(x; vals, val)
  • :exactly: Constraint ensuring that the number of occurrences of the values in vals in x is exactly val.
julia
concept(:exactly, x; vals, val)
@@ -119,15 +119,15 @@ import{_ as s,c as i,o as a,a7 as h}from"./chunks/framework.CBLuZwrP.js";const F
 
 c([2, 1, 4, 3]; vals=[1, 2, 3, 4], op=≥, val=2)
 c([1, 2, 3, 4]; vals=[1, 2], op==, val=2)
-c([2, 1, 4, 3]; vals=[1, 2], op=≤, val=1)

source


# Constraints.xcsp_nvaluesFunction.
julia
xcsp_nvalues(list, condition, except)

Return true if the number of distinct values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • condition: condition to satisfy.

  • except::Union{Nothing, Vector{Int}}: list of values to exclude. Default is nothing.

Variants

  • :nvalues: The nValues constraint specifies that the number of distinct values in the list of variables x is equal to a given value. The constraint is defined by the following expression: nValues(x, op, val) where x is a list of variables, op is a comparison operator, and val is an integer value.
julia
concept(:nvalues, x; op, val)
+c([2, 1, 4, 3]; vals=[1, 2], op=≤, val=1)

source

`,16))]),i("details",g,[i("summary",null,[s[6]||(s[6]=i("a",{id:"Constraints.xcsp_nvalues-constraints-24_counting_summing_constraints",href:"#Constraints.xcsp_nvalues-constraints-24_counting_summing_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_nvalues")],-1)),s[7]||(s[7]=k()),n(h,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[8]||(s[8]=a(`
julia
xcsp_nvalues(list, condition, except)

Return true if the number of distinct values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • condition: condition to satisfy.

  • except::Union{Nothing, Vector{Int}}: list of values to exclude. Default is nothing.

Variants

  • :nvalues: Ensures that the number of distinct values in x satisfies a given numerical condition.

The constraint is defined by the following expression: nValues(x, op, val) where x is a list of variables, op is a comparison operator, and val is an integer value.

julia
concept(:nvalues, x; op, val)
 concept(:nvalues)(x; op, val)

Examples

julia
c = concept(:nvalues)
 
 c([1, 2, 3, 4, 5]; op = ==, val = 5)
 c([1, 2, 3, 4, 5]; op = ==, val = 2)
 c([1, 2, 3, 4, 3]; op = <=, val = 5)
-c([1, 2, 3, 4, 3]; op = <=, val = 3)

source


# Constraints.xcsp_cardinalityFunction.
julia
xcsp_cardinality(list, values, occurs, closed)

Return true if the number of occurrences of the values in values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • values::Vector{Int}: list of values to check.

  • occurs::Vector{Int}: list of occurrences to check.

  • closed::Bool: whether the constraint is closed or not.

Variants

  • :cardinality: The cardinality constraint, also known as the global cardinality constraint (GCC), is a constraint in constraint programming that restricts the number of times a value can appear in a set of variables.
julia
concept(:cardinality, x; bool=false, vals)
-concept(:cardinality)(x; bool=false, vals)
  • :cardinality_closed: The closed cardinality constraint, also known as the global cardinality constraint (GCC), is a constraint in constraint programming that restricts the number of times a value can appear in a set of variables. It is closed, meaning that all values in the domain of the variables must be considered.
julia
concept(:cardinality_closed, x; vals)
-concept(:cardinality_closed)(x; vals)
  • :cardinality_open: The open cardinality constraint, also known as the global cardinality constraint (GCC), is a constraint in constraint programming that restricts the number of times a value can appear in a set of variables. It is open, meaning that only the values in the list of values must be considered.
julia
concept(:cardinality_open, x; vals)
+c([1, 2, 3, 4, 3]; op = <=, val = 3)

source

`,11))]),i("details",y,[i("summary",null,[s[9]||(s[9]=i("a",{id:"Constraints.xcsp_cardinality-constraints-24_counting_summing_constraints",href:"#Constraints.xcsp_cardinality-constraints-24_counting_summing_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_cardinality")],-1)),s[10]||(s[10]=k()),n(h,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[11]||(s[11]=a(`
julia
xcsp_cardinality(list, values, occurs, closed)

Return true if the number of occurrences of the values in values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • values::Vector{Int}: list of values to check.

  • occurs::Vector{Int}: list of occurrences to check.

  • closed::Bool: whether the constraint is closed or not.

Variants

  • :cardinality: Global constraint that restricts the number of times specific values in a list values can appear in x.
julia
concept(:cardinality, x; bool=false, vals)
+concept(:cardinality)(x; bool=false, vals)
  • :cardinality_closed: Global constraint that restricts the number of times in a list values can appear in x. It is closed, meaning that the variables in x cannot have values outside the ones in list.
julia
concept(:cardinality_closed, x; vals)
+concept(:cardinality_closed)(x; vals)
  • :cardinality_open: Global constraint that restricts the number of times in a list values can appear in x. It is open, meaning that the variables in x can have values outside the ones in list.
julia
concept(:cardinality_open, x; vals)
 concept(:cardinality_open)(x; vals)

Examples

julia
c = concept(:cardinality)
 
 c([2, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])
@@ -143,4 +143,4 @@ import{_ as s,c as i,o as a,a7 as h}from"./chunks/framework.CBLuZwrP.js";const F
 cc([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])
 
 co = concept(:cardinality_open)
-co([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])

source


`,14),t=[n];function l(p,e,E,d,r,g){return a(),i("div",null,t)}const C=s(k,[["render",l]]);export{F as __pageData,C as default}; +co([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])

source

`,14))])])}const D=l(E,[["render",F]]);export{b as __pageData,D as default}; diff --git a/dev/assets/constraints_24_counting_summing_constraints.md.NT49jSaK.lean.js b/dev/assets/constraints_24_counting_summing_constraints.md.NT49jSaK.lean.js new file mode 100644 index 0000000..33c0973 --- /dev/null +++ b/dev/assets/constraints_24_counting_summing_constraints.md.NT49jSaK.lean.js @@ -0,0 +1,146 @@ +import{_ as l,c as t,a5 as a,j as i,a as k,G as n,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const b=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/24_counting_summing_constraints.md","filePath":"constraints/24_counting_summing_constraints.md","lastUpdated":null}'),E={name:"constraints/24_counting_summing_constraints.md"},d={class:"jldocstring custom-block",open:""},r={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""};function F(C,s,o,c,B,u){const h=p("Badge");return e(),t("div",null,[s[12]||(s[12]=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
+
+@info concept(:sum, [1, 2, 3, 4, 5]; op = ==, val=15)
+@info concept(:sum, [1, 2, 3, 4, 5]; op = ==, val=2)
+@info concept(:sum, [1, 2, 3, 4, 3]; op =, val=15)
+@info concept(:sum, [1, 2, 3, 4, 3]; op =, val=3)
julia
using Constraints
+
+c = x -> Constraints.xcsp_sum(
+    list = x,
+    condition = (>, 4),
+    coeffs = [1,2,3,4]
+)
+
+@info c([1, 1, 1, 1])
+@info c([0, 1, 0, 0])
julia
using CBLS, JuMP
+
+model = Model(CBLS.Optimizer)
+@variable(model, 1X[1:5]5, Int)
+@variable(model, 1Y[1:5]5, Int)
+@constraint(model, X in Sum(; op = ==, val = 15))
+@constraint(model, Y in Sum(; op = <=, val = 10))
+JuMP.optimize!(model)
+@info "Sum" value.(X) value.(Y)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+
+concept(:count, [1,1,1,2], vals = [1, 1, 1, 2], op = ==, val = 4) # true
+concept(:count, [1,1,1,2], vals = [1, 1, 1, 2], op = ==, val = 5) # false
+concept(:count, [2, 1, 4, 3]; vals=[1, 2, 3, 4], op=≥, val=2) # true
+concept(:at_least, [1,1,1,2], vals = [1, 1, 1, 2], val = 4) # true
+concept(:at_least, [1,1,1,2], vals = [1, 2], val = 4) # true
+concept(:at_least, [1,1,1,2], vals = [1, 3], val = 4) # false
+concept(:at_most, [1,1,1,2], vals = [1, 1, 1, 2], val = 4) # true
+concept(:at_most, [1,1,1,2], vals = [2, 5, 3], val = 2) #true
+concept(:at_most, [1,1,1,2], vals = [1, 1, 1, 3], val = 3) # true
+concept(:exactly, [1,1,1,2], vals = [1, 3, 4, 2], val = 4) # true
+concept(:exactly, [1,1,1,2], vals = [1, 1, 2, 3], val = 4) # true
+concept(:exactly, [1,1,1,2], vals = [1, 1, 1, 3], val = 4) # false
julia
using Constraints
+
+c_count = x -> Constraints.xcsp_count(
+    list = x,
+		condition = (, 4),
+		values = [1, 2, 3]
+)
+
+@info c_count([1, 1, 1, 1, 5]) # true
+@info c_count([0, 2, 3, 8]) # false
julia
using CBLS, JuMP
+
+model = Model(CBLS.Optimizer)
+@variable(model, 1X[1:4]4, Int)
+@variable(model, 1X_at_least[1:4]4, Int)
+@variable(model, 1X_at_most[1:4]4, Int)
+@variable(model, 1X_exactly[1:4]4, Int)
+@constraint(model, X in Count(vals = [1, 2, 3, 4], op =, val = 2))
+@constraint(model, X_at_least in AtLeast(vals = [1, 2, 3, 4], val = 2))
+@constraint(model, X_at_most in AtMost(vals = [1, 2], val = 1))
+@constraint(model, X_exactly in Exactly(vals = [1, 2], val = 2))
+JuMP.optimize!(model)
+@info "Count" value.(X) value.(X_at_least) value.(X_at_most) value.(X_exactly)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+
+@info concept(:nvalues, [1, 2, 3, 4, 5]; op = ==, val = 5)
+@info concept(:nvalues, [1, 2, 3, 4, 5]; op = ==, val = 2)
+@info concept(:nvalues, [1, 2, 3, 4, 3]; op = <=, val = 5)
+@info concept(:nvalues, [1, 2, 3, 4, 3]; op = <=, val = 3)
julia
using Constraints
+
+c = x -> Constraints.xcsp_nvalues(
+   	list = x,
+		condition = (, 3),
+		except = [1,2,3,4]
+)
+
+@info c([1, 1, 1, 1])
+@info c([9, 3, 6, 8])
julia
using CBLS, JuMP
+
+model = Model(CBLS.Optimizer)
+@variable(model, 1X[1:5]5, Int)
+@variable(model, 1Y[1:5]5, Int)
+@variable(model, 1Z[1:5]5, Int)
+@constraint(model, X in NValues(; op = ==, val = 5))
+@constraint(model, Y in NValues(; op = ==, val = 2))
+@constraint(model, Z in NValues(; op = <=, val = 5, vals = [1, 2]))
+JuMP.optimize!(model)
+@info "NValues" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+
+# [v1, v2, v3], [v1, a1, a2; v2, b1, b2; v3, c1, c2] means v1 occurs between a1 and a2 times in the first array, similar for v2 and v3.
+
+@info concept(:cardinality, [2, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])
+@info concept(:cardinality, [8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3], bool=false)
+@info concept(:cardinality, [8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3], bool=true)
+@info concept(:cardinality, [2, 5, 10, 10]; vals=[2 1; 5 1; 10 2])
+@info concept(:cardinality_closed, [8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])
+@info concept(:cardinality_open, [8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])
julia
using Constraints
+
+c = x -> Constraints.xcsp_cardinality(
+   	list = x,
+		values = [1, 2],
+		occurs = [2 3; 1 5]
+)
+
+@info c([1, 2, 1, 2])
julia
using CBLS, JuMP
+
+model = Model(CBLS.Optimizer)
+@variable(model, 1X[1:4]10, Int)
+@variable(model, 1Y[1:4]10, Int)
+@variable(model, 1Z[1:4]10, Int)
+@constraint(model, X in Cardinality(; vals = [2 0 1; 5 1 3; 10 2 3]))
+@constraint(model, Y in CardinalityOpen(; vals = [2 0 1; 5 1 3; 10 2 3]))
+@constraint(model, Z in CardinalityClosed(; vals = [2 0 1; 5 1 3; 10 2 3]))
+JuMP.optimize!(model)
+@info "Cardinality" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI

Counting and Summing Constraints

`,6)),i("details",d,[i("summary",null,[s[0]||(s[0]=i("a",{id:"Constraints.xcsp_sum-constraints-24_counting_summing_constraints",href:"#Constraints.xcsp_sum-constraints-24_counting_summing_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_sum")],-1)),s[1]||(s[1]=k()),n(h,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=a(`
julia
xcsp_sum(list, coeffs, condition)

Return true if the sum of the variables in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • coeffs::Vector{Int}: list of coefficients to use.

  • condition: condition to satisfy.

Variants

  • :sum: Global constraint ensuring that the sum of the variables in x satisfies a given numerical condition.
julia
concept(:sum, x; op===, pair_vars=ones(x), val)
+concept(:sum)(x; op===, pair_vars=ones(x), val)

Examples

julia
c = concept(:sum)
+
+c([1, 2, 3, 4, 5]; op===, val=15)
+c([1, 2, 3, 4, 5]; op===, val=2)
+c([1, 2, 3, 4, 3]; op=≤, val=15)
+c([1, 2, 3, 4, 3]; op=≤, val=3)

source

`,10))]),i("details",r,[i("summary",null,[s[3]||(s[3]=i("a",{id:"Constraints.xcsp_count-constraints-24_counting_summing_constraints",href:"#Constraints.xcsp_count-constraints-24_counting_summing_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_count")],-1)),s[4]||(s[4]=k()),n(h,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=a(`
julia
xcsp_count(list, values, condition)

Return true if the number of occurrences of the values in values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • values::Vector{Int}: list of values to check.

  • condition: condition to satisfy.

Variants

  • :count: Constraint ensuring that the number of occurrences of the values in vals in x satisfies the given condition.
julia
concept(:count, x; vals, op, val)
+concept(:count)(x; vals, op, val)
  • :at_least: Constraint ensuring that the number of occurrences of the values in vals in x is at least val.
julia
concept(:at_least, x; vals, val)
+concept(:at_least)(x; vals, val)
  • :at_most: Constraint ensuring that the number of occurrences of the values in vals in x is at most val.
julia
concept(:at_most, x; vals, val)
+concept(:at_most)(x; vals, val)
  • :exactly: Constraint ensuring that the number of occurrences of the values in vals in x is exactly val.
julia
concept(:exactly, x; vals, val)
+concept(:exactly)(x; vals, val)

Examples

julia
c = concept(:count)
+
+c([2, 1, 4, 3]; vals=[1, 2, 3, 4], op=≥, val=2)
+c([1, 2, 3, 4]; vals=[1, 2], op==, val=2)
+c([2, 1, 4, 3]; vals=[1, 2], op=≤, val=1)

source

`,16))]),i("details",g,[i("summary",null,[s[6]||(s[6]=i("a",{id:"Constraints.xcsp_nvalues-constraints-24_counting_summing_constraints",href:"#Constraints.xcsp_nvalues-constraints-24_counting_summing_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_nvalues")],-1)),s[7]||(s[7]=k()),n(h,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[8]||(s[8]=a(`
julia
xcsp_nvalues(list, condition, except)

Return true if the number of distinct values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • condition: condition to satisfy.

  • except::Union{Nothing, Vector{Int}}: list of values to exclude. Default is nothing.

Variants

  • :nvalues: Ensures that the number of distinct values in x satisfies a given numerical condition.

The constraint is defined by the following expression: nValues(x, op, val) where x is a list of variables, op is a comparison operator, and val is an integer value.

julia
concept(:nvalues, x; op, val)
+concept(:nvalues)(x; op, val)

Examples

julia
c = concept(:nvalues)
+
+c([1, 2, 3, 4, 5]; op = ==, val = 5)
+c([1, 2, 3, 4, 5]; op = ==, val = 2)
+c([1, 2, 3, 4, 3]; op = <=, val = 5)
+c([1, 2, 3, 4, 3]; op = <=, val = 3)

source

`,11))]),i("details",y,[i("summary",null,[s[9]||(s[9]=i("a",{id:"Constraints.xcsp_cardinality-constraints-24_counting_summing_constraints",href:"#Constraints.xcsp_cardinality-constraints-24_counting_summing_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_cardinality")],-1)),s[10]||(s[10]=k()),n(h,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[11]||(s[11]=a(`
julia
xcsp_cardinality(list, values, occurs, closed)

Return true if the number of occurrences of the values in values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • values::Vector{Int}: list of values to check.

  • occurs::Vector{Int}: list of occurrences to check.

  • closed::Bool: whether the constraint is closed or not.

Variants

  • :cardinality: Global constraint that restricts the number of times specific values in a list values can appear in x.
julia
concept(:cardinality, x; bool=false, vals)
+concept(:cardinality)(x; bool=false, vals)
  • :cardinality_closed: Global constraint that restricts the number of times in a list values can appear in x. It is closed, meaning that the variables in x cannot have values outside the ones in list.
julia
concept(:cardinality_closed, x; vals)
+concept(:cardinality_closed)(x; vals)
  • :cardinality_open: Global constraint that restricts the number of times in a list values can appear in x. It is open, meaning that the variables in x can have values outside the ones in list.
julia
concept(:cardinality_open, x; vals)
+concept(:cardinality_open)(x; vals)

Examples

julia
c = concept(:cardinality)
+
+c([2, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])
+c([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3], bool=false)
+c([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3], bool=true)
+c([2, 5, 10, 10]; vals=[2 1; 5 1; 10 2])
+c([2, 5, 10, 10]; vals=[2 0 1 42; 5 1 3 7; 10 2 3 -4])
+c([2, 5, 5, 10]; vals=[2 0 1; 5 1 3; 10 2 3])
+c([2, 5, 10, 8]; vals=[2 1; 5 1; 10 2])
+c([5, 5, 5, 10]; vals=[2 0 1 42; 5 1 3 7; 10 2 3 -4])
+
+cc = concept(:cardinality_closed)
+cc([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])
+
+co = concept(:cardinality_open)
+co([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])

source

`,14))])])}const D=l(E,[["render",F]]);export{b as __pageData,D as default}; diff --git a/dev/assets/constraints_25_connection_constraints.md.B7lGKa5q.lean.js b/dev/assets/constraints_25_connection_constraints.md.B7lGKa5q.lean.js deleted file mode 100644 index 565e4ca..0000000 --- a/dev/assets/constraints_25_connection_constraints.md.B7lGKa5q.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const F=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/25_connection_constraints.md","filePath":"constraints/25_connection_constraints.md","lastUpdated":null}'),h={name:"constraints/25_connection_constraints.md"},k=n("",14),t=[k];function l(p,e,E,d,r,g){return a(),i("div",null,t)}const C=s(h,[["render",l]]);export{F as __pageData,C as default}; diff --git a/dev/assets/constraints_25_connection_constraints.md.B7lGKa5q.js b/dev/assets/constraints_25_connection_constraints.md.BT5VQBAx.js similarity index 86% rename from dev/assets/constraints_25_connection_constraints.md.B7lGKa5q.js rename to dev/assets/constraints_25_connection_constraints.md.BT5VQBAx.js index 19dbb90..cffe99e 100644 --- a/dev/assets/constraints_25_connection_constraints.md.B7lGKa5q.js +++ b/dev/assets/constraints_25_connection_constraints.md.BT5VQBAx.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const F=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/25_connection_constraints.md","filePath":"constraints/25_connection_constraints.md","lastUpdated":null}'),h={name:"constraints/25_connection_constraints.md"},k=n(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
+import{_ as t,c as l,a5 as a,j as i,a as h,G as k,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const b=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/25_connection_constraints.md","filePath":"constraints/25_connection_constraints.md","lastUpdated":null}'),E={name:"constraints/25_connection_constraints.md"},d={class:"jldocstring custom-block",open:""},r={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""};function F(C,s,o,c,u,B){const n=p("Badge");return e(),l("div",null,[s[12]||(s[12]=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
 
 concept(:maximum, [1,1,1,2], val = 2, op = ==) # true
 concept(:maximum, [1,2,4,4], val = 2, op = ==) # false
julia
using Constraints
@@ -15,7 +15,7 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const F
 @variable(model, 1X[1:5]5, Int)
 @constraint(model, X in Maximum(; op = ==, val = 5))
 optimize!(model)
-@info "Maximum" value.(X)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "Maximum" value.(X)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 concept(:minimum, [1,1,1,2], val = 1, op = ==) # true
 concept(:minimum, [1,2,4,4], val = 2, op = ==) # false
julia
using Constraints
@@ -34,7 +34,7 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const F
 JuMP.optimize!(model)
 @info "Minimum" value.(X)
 
-# Note that this example gives a solution for the minimum constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+# Note that this example gives a solution for the minimum constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 @info concept(:element, [1, 2, 3, 4, 5]; id=1, val=1)
 @info concept(:element, [1, 2, 3, 4, 5]; id=1, val=2)
@@ -58,7 +58,7 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const F
 @constraint(model, Y in Element(; id = 1, val = 1))
 @constraint(model, Z in Element(; id = 2, val = 2))
 JuMP.optimize!(model)
-@info "Element" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "Element" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 @info concept(:channel, [2, 1, 4, 3])
 @info concept(:channel, [1, 2, 3, 4])
@@ -83,21 +83,21 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const F
 @constraint(model, Y in CBLS.Channel(; dim = 2))
 @constraint(model, Z in CBLS.Channel(; id = 3))
 JuMP.optimize!(model)
-@info "Channel" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI

Connection Constraints

# Constraints.xcsp_maximumFunction.
julia
xcsp_maximum(; list, condition)

Return true if the maximum constraint is satisfied, false otherwise. The maximum constraint is a global constraint used in constraint programming that specifies that a certain condition should hold for the maximum value in a list of variables.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • condition::Tuple: condition to check.

Variants

  • :maximum: The maximum constraint is a global constraint used in constraint programming that specifies that a certain condition should hold for the maximum value in a list of variables.
julia
concept(:maximum, x; op, val)
+@info "Channel" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI

Connection Constraints

`,6)),i("details",d,[i("summary",null,[s[0]||(s[0]=i("a",{id:"Constraints.xcsp_maximum-constraints-25_connection_constraints",href:"#Constraints.xcsp_maximum-constraints-25_connection_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_maximum")],-1)),s[1]||(s[1]=h()),k(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=a(`
julia
xcsp_maximum(; list, condition)

Return true if the maximum constraint is satisfied, false otherwise. The maximum constraint is a global constraint specifying that a certain condition should hold for the maximum value in a list of variables.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • condition::Tuple: condition to check.

Variants

  • :maximum: Global constraint ensuring that a certain numerical condition holds for the maximum value in x.
julia
concept(:maximum, x; op, val)
 concept(:maximum)(x; op, val)

Examples

julia
c = concept(:maximum)
 
 c([1, 2, 3, 4, 5]; op = ==, val = 5)
-c([1, 2, 3, 4, 5]; op = ==, val = 6)

source


# Constraints.xcsp_minimumFunction.
julia
xcsp_minimum(; list, condition)

Return true if the minimum constraint is satisfied, false otherwise. The minimum constraint is a global constraint used in constraint programming that specifies that a certain condition should hold for the minimum value in a list of variables.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • condition::Tuple: condition to check.

Variants

  • :minimum: The minimum constraint is a global constraint used in constraint programming that specifies that a certain condition should hold for the minimum value in a list of variables.
julia
concept(:minimum, x; op, val)
+c([1, 2, 3, 4, 5]; op = ==, val = 6)

source

`,10))]),i("details",r,[i("summary",null,[s[3]||(s[3]=i("a",{id:"Constraints.xcsp_minimum-constraints-25_connection_constraints",href:"#Constraints.xcsp_minimum-constraints-25_connection_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_minimum")],-1)),s[4]||(s[4]=h()),k(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=a(`
julia
xcsp_minimum(; list, condition)

Return true if the minimum constraint is satisfied, false otherwise. The minimum constraint is a global constraint specifying that a certain condition should hold for the minimum value in a list of variables.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • condition::Tuple: condition to check.

Variants

  • :minimum: Global constraint ensuring that a certain numerical condition holds for the minimum value in x.
julia
concept(:minimum, x; op, val)
 concept(:minimum)(x; op, val)

Examples

julia
c = concept(:minimum)
 
 c([1, 2, 3, 4, 5]; op = ==, val = 1)
-c([1, 2, 3, 4, 5]; op = ==, val = 0)

source


# Constraints.xcsp_elementFunction.
julia
xcsp_element(; list, index, condition)

Return true if the element constraint is satisfied, false otherwise. The element constraint is a global constraint used in constraint programming that specifies that the value of a variable should be equal to the value of another variable indexed by a third variable.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • index::Int: index of the value to check.

  • condition::Tuple: condition to check.

Variants

  • :element: The element constraint is a global constraint used in constraint programming that specifies that the value of a variable should be equal to the value of another variable indexed by a third variable.
julia
concept(:element, x; id=nothing, op===, val=nothing)
+c([1, 2, 3, 4, 5]; op = ==, val = 0)

source

`,10))]),i("details",g,[i("summary",null,[s[6]||(s[6]=i("a",{id:"Constraints.xcsp_element-constraints-25_connection_constraints",href:"#Constraints.xcsp_element-constraints-25_connection_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_element")],-1)),s[7]||(s[7]=h()),k(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[8]||(s[8]=a(`
julia
xcsp_element(; list, index, condition)

Return true if the element constraint is satisfied, false otherwise. The element constraint is a global constraint specifying that a variable in x indexed by id should be equal to a value.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • index::Int: index of the value to check.

  • condition::Tuple: condition to check.

Variants

  • :element: Global constraint specifying that a variable in x indexed by id should be equal to a value.
julia
concept(:element, x; id=nothing, op===, val=nothing)
 concept(:element)(x; id=nothing, op===, val=nothing)

Examples

julia
c = concept(:element)
 
 c([1, 2, 3, 4, 5]; id=1, val=1)
 c([1, 2, 3, 4, 5]; id=1, val=2)
 c([1, 2, 3, 4, 2])
-c([1, 2, 3, 4, 1])

source


# Constraints.xcsp_channelFunction.
julia
xcsp_channel(; list)

Return true if the channel constraint is satisfied, false otherwise. The channel constraint establishes a bijective correspondence between two sets of variables. This means that each value in the first set of variables corresponds to a unique value in the second set, and vice versa.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

Variants

  • :channel: The channel constraint establishes a bijective correspondence between two sets of variables. This means that each value in the first set of variables corresponds to a unique value in the second set, and vice versa.
julia
concept(:channel, x; dim=1, id=nothing)
+c([1, 2, 3, 4, 1])

source

`,10))]),i("details",y,[i("summary",null,[s[9]||(s[9]=i("a",{id:"Constraints.xcsp_channel-constraints-25_connection_constraints",href:"#Constraints.xcsp_channel-constraints-25_connection_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_channel")],-1)),s[10]||(s[10]=h()),k(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[11]||(s[11]=a(`
julia
xcsp_channel(; list)

Return true if the channel constraint is satisfied, false otherwise. The channel constraint ensures that if the i-th element of list is assigned the value j, then the j-th element of list must be assigned the value i.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

Variants

  • :channel: Ensures that if the i-th element of x is assigned the value j, then the j-th element of x must be assigned the value i.
julia
concept(:channel, x; dim=1, id=nothing)
 concept(:channel)(x; dim=1, id=nothing)

Examples

julia
c = concept(:channel)
 
 c([2, 1, 4, 3])
@@ -106,4 +106,4 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const F
 c([2, 1, 5, 3, 4, 2, 1, 4, 5, 3]; dim=2)
 c([2, 1, 4, 3, 5, 2, 1, 4, 5, 3]; dim=2)
 c([false, false, true, false]; id=3)
-c([false, false, true, false]; id=1)

source


`,14),t=[k];function l(p,e,E,d,r,g){return a(),i("div",null,t)}const C=s(h,[["render",l]]);export{F as __pageData,C as default}; +c([false, false, true, false]; id=1)

source

`,10))])])}const v=t(E,[["render",F]]);export{b as __pageData,v as default}; diff --git a/dev/assets/constraints_25_connection_constraints.md.BT5VQBAx.lean.js b/dev/assets/constraints_25_connection_constraints.md.BT5VQBAx.lean.js new file mode 100644 index 0000000..cffe99e --- /dev/null +++ b/dev/assets/constraints_25_connection_constraints.md.BT5VQBAx.lean.js @@ -0,0 +1,109 @@ +import{_ as t,c as l,a5 as a,j as i,a as h,G as k,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const b=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/25_connection_constraints.md","filePath":"constraints/25_connection_constraints.md","lastUpdated":null}'),E={name:"constraints/25_connection_constraints.md"},d={class:"jldocstring custom-block",open:""},r={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""};function F(C,s,o,c,u,B){const n=p("Badge");return e(),l("div",null,[s[12]||(s[12]=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
+
+concept(:maximum, [1,1,1,2], val = 2, op = ==) # true
+concept(:maximum, [1,2,4,4], val = 2, op = ==) # false
julia
using Constraints
+
+c = x -> Constraints.xcsp_maximum(
+    list = x,
+		condition = (==, 4)
+)
+
+@info c([1, 1, 4, 1]) # true
+@info c([1, 2, 3, 8]) # false
julia
using CBLS, JuMP
+
+model = Model(CBLS.Optimizer)
+@variable(model, 1X[1:5]5, Int)
+@constraint(model, X in Maximum(; op = ==, val = 5))
+optimize!(model)
+@info "Maximum" value.(X)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+
+concept(:minimum, [1,1,1,2], val = 1, op = ==) # true
+concept(:minimum, [1,2,4,4], val = 2, op = ==) # false
julia
using Constraints
+
+c = x -> Constraints.xcsp_minimum(
+    list = x,
+    condition = (==, 1)
+)
+
+@info c([1, 1, 4, 1])
+@info c([0, 2, 3, 8])
julia
using CBLS, JuMP
+
+model = Model(CBLS.Optimizer)
+@variable(model, 1X[1:5]5, Int)
+@constraint(model, X in Minimum(; op = ==, val = 3))
+JuMP.optimize!(model)
+@info "Minimum" value.(X)
+
+# Note that this example gives a solution for the minimum constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+
+@info concept(:element, [1, 2, 3, 4, 5]; id=1, val=1)
+@info concept(:element, [1, 2, 3, 4, 5]; id=1, val=2)
+@info concept(:element, [1, 2, 3, 4, 2])
+@info concept(:element, [1, 2, 3, 4, 1])
julia
using Constraints
+
+c = x -> Constraints.xcsp_element(
+	list = x,
+	index = 1,
+	condition = (==, 3)
+)
+
+@info c([3, 3, 10])
+@info c([1, 1, 4, 3])
julia
using CBLS, JuMP
+
+model = Model(CBLS.Optimizer)
+@variable(model, 1X[1:5]5, Int)
+@variable(model, 1Y[1:5]5, Int)
+@variable(model, 0Z[1:5]5, Int)
+@constraint(model, X in Element())
+@constraint(model, Y in Element(; id = 1, val = 1))
+@constraint(model, Z in Element(; id = 2, val = 2))
+JuMP.optimize!(model)
+@info "Element" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+
+@info concept(:channel, [2, 1, 4, 3])
+@info concept(:channel, [1, 2, 3, 4])
+@info concept(:channel, [2, 3, 1, 4])
+@info concept(:channel, [2, 1, 5, 3, 4, 2, 1, 4, 5, 3]; dim=2)
+@info concept(:channel, [2, 1, 4, 3, 5, 2, 1, 4, 5, 3]; dim=2)
+@info concept(:channel, [false, false, true, false]; id=3)
+@info concept(:channel, [false, false, true, false]; id=1)
julia
using Constraints
+
+c = x -> Constraints.xcsp_channel(
+	list = x
+)
+
+@info c([2, 1, 4, 3])
+@info c([2, 3, 1, 4])
julia
using CBLS, JuMP
+
+model = Model(CBLS.Optimizer)
+@variable(model, 1X[1:4]4, Int)
+@variable(model, 1Y[1:10]5, Int)
+@variable(model, 0Z[1:4]1, Int)
+@constraint(model, X in CBLS.Channel())
+@constraint(model, Y in CBLS.Channel(; dim = 2))
+@constraint(model, Z in CBLS.Channel(; id = 3))
+JuMP.optimize!(model)
+@info "Channel" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI

Connection Constraints

`,6)),i("details",d,[i("summary",null,[s[0]||(s[0]=i("a",{id:"Constraints.xcsp_maximum-constraints-25_connection_constraints",href:"#Constraints.xcsp_maximum-constraints-25_connection_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_maximum")],-1)),s[1]||(s[1]=h()),k(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=a(`
julia
xcsp_maximum(; list, condition)

Return true if the maximum constraint is satisfied, false otherwise. The maximum constraint is a global constraint specifying that a certain condition should hold for the maximum value in a list of variables.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • condition::Tuple: condition to check.

Variants

  • :maximum: Global constraint ensuring that a certain numerical condition holds for the maximum value in x.
julia
concept(:maximum, x; op, val)
+concept(:maximum)(x; op, val)

Examples

julia
c = concept(:maximum)
+
+c([1, 2, 3, 4, 5]; op = ==, val = 5)
+c([1, 2, 3, 4, 5]; op = ==, val = 6)

source

`,10))]),i("details",r,[i("summary",null,[s[3]||(s[3]=i("a",{id:"Constraints.xcsp_minimum-constraints-25_connection_constraints",href:"#Constraints.xcsp_minimum-constraints-25_connection_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_minimum")],-1)),s[4]||(s[4]=h()),k(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=a(`
julia
xcsp_minimum(; list, condition)

Return true if the minimum constraint is satisfied, false otherwise. The minimum constraint is a global constraint specifying that a certain condition should hold for the minimum value in a list of variables.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • condition::Tuple: condition to check.

Variants

  • :minimum: Global constraint ensuring that a certain numerical condition holds for the minimum value in x.
julia
concept(:minimum, x; op, val)
+concept(:minimum)(x; op, val)

Examples

julia
c = concept(:minimum)
+
+c([1, 2, 3, 4, 5]; op = ==, val = 1)
+c([1, 2, 3, 4, 5]; op = ==, val = 0)

source

`,10))]),i("details",g,[i("summary",null,[s[6]||(s[6]=i("a",{id:"Constraints.xcsp_element-constraints-25_connection_constraints",href:"#Constraints.xcsp_element-constraints-25_connection_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_element")],-1)),s[7]||(s[7]=h()),k(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[8]||(s[8]=a(`
julia
xcsp_element(; list, index, condition)

Return true if the element constraint is satisfied, false otherwise. The element constraint is a global constraint specifying that a variable in x indexed by id should be equal to a value.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • index::Int: index of the value to check.

  • condition::Tuple: condition to check.

Variants

  • :element: Global constraint specifying that a variable in x indexed by id should be equal to a value.
julia
concept(:element, x; id=nothing, op===, val=nothing)
+concept(:element)(x; id=nothing, op===, val=nothing)

Examples

julia
c = concept(:element)
+
+c([1, 2, 3, 4, 5]; id=1, val=1)
+c([1, 2, 3, 4, 5]; id=1, val=2)
+c([1, 2, 3, 4, 2])
+c([1, 2, 3, 4, 1])

source

`,10))]),i("details",y,[i("summary",null,[s[9]||(s[9]=i("a",{id:"Constraints.xcsp_channel-constraints-25_connection_constraints",href:"#Constraints.xcsp_channel-constraints-25_connection_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_channel")],-1)),s[10]||(s[10]=h()),k(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[11]||(s[11]=a(`
julia
xcsp_channel(; list)

Return true if the channel constraint is satisfied, false otherwise. The channel constraint ensures that if the i-th element of list is assigned the value j, then the j-th element of list must be assigned the value i.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

Variants

  • :channel: Ensures that if the i-th element of x is assigned the value j, then the j-th element of x must be assigned the value i.
julia
concept(:channel, x; dim=1, id=nothing)
+concept(:channel)(x; dim=1, id=nothing)

Examples

julia
c = concept(:channel)
+
+c([2, 1, 4, 3])
+c([1, 2, 3, 4])
+c([2, 3, 1, 4])
+c([2, 1, 5, 3, 4, 2, 1, 4, 5, 3]; dim=2)
+c([2, 1, 4, 3, 5, 2, 1, 4, 5, 3]; dim=2)
+c([false, false, true, false]; id=3)
+c([false, false, true, false]; id=1)

source

`,10))])])}const v=t(E,[["render",F]]);export{b as __pageData,v as default}; diff --git a/dev/assets/constraints_26_packing_scheduling_constraints.md.3lrce7Bz.lean.js b/dev/assets/constraints_26_packing_scheduling_constraints.md.3lrce7Bz.lean.js deleted file mode 100644 index 59a3c6a..0000000 --- a/dev/assets/constraints_26_packing_scheduling_constraints.md.3lrce7Bz.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,c as i,o as a,a7 as h}from"./chunks/framework.CBLuZwrP.js";const F=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/26_packing_scheduling_constraints.md","filePath":"constraints/26_packing_scheduling_constraints.md","lastUpdated":null}'),k={name:"constraints/26_packing_scheduling_constraints.md"},n=h("",8),t=[n];function l(p,e,E,r,d,g){return a(),i("div",null,t)}const C=s(k,[["render",l]]);export{F as __pageData,C as default}; diff --git a/dev/assets/constraints_26_packing_scheduling_constraints.md.3lrce7Bz.js b/dev/assets/constraints_26_packing_scheduling_constraints.md.DcwNvTzZ.js similarity index 87% rename from dev/assets/constraints_26_packing_scheduling_constraints.md.3lrce7Bz.js rename to dev/assets/constraints_26_packing_scheduling_constraints.md.DcwNvTzZ.js index c61b5ba..960ae95 100644 --- a/dev/assets/constraints_26_packing_scheduling_constraints.md.3lrce7Bz.js +++ b/dev/assets/constraints_26_packing_scheduling_constraints.md.DcwNvTzZ.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,a7 as h}from"./chunks/framework.CBLuZwrP.js";const F=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/26_packing_scheduling_constraints.md","filePath":"constraints/26_packing_scheduling_constraints.md","lastUpdated":null}'),k={name:"constraints/26_packing_scheduling_constraints.md"},n=h(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
+import{_ as t,c as l,a5 as a,j as i,a as k,G as n,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const u=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/26_packing_scheduling_constraints.md","filePath":"constraints/26_packing_scheduling_constraints.md","lastUpdated":null}'),E={name:"constraints/26_packing_scheduling_constraints.md"},r={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""};function g(y,s,F,C,o,c){const h=p("Badge");return e(),l("div",null,[s[6]||(s[6]=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
 
 @info concept(:cumulative, [1, 2, 3, 4, 5]; val = 1)
 @info concept(:cumulative, [1, 2, 2, 4, 5]; val = 1)
@@ -25,7 +25,7 @@ import{_ as s,c as i,o as a,a7 as h}from"./chunks/framework.CBLuZwrP.js";const F
 @constraint(model,
     Z in Cumulative(; pair_vars = [3 2 5 4 2; 1 2 1 1 3], op = <, val = 5))
 JuMP.optimize!(model)
-@info "Cumulative" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "Cumulative" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 @info concept(:no_overlap, [1, 2, 3, 4, 5])
 @info concept(:no_overlap, [1, 2, 3, 4, 1])
@@ -51,15 +51,15 @@ import{_ as s,c as i,o as a,a7 as h}from"./chunks/framework.CBLuZwrP.js";const F
 @constraint(model,
     Z in NoOverlap(; pair_vars = [2, 4, 1, 4, 2, 3, 5, 1, 2, 3, 3, 2], dim = 3))
 JuMP.optimize!(model)
-@info "NoOverlap" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI

Packing and Scheduling Constraints

# Constraints.xcsp_cumulativeFunction.
julia
xcsp_cumulative(; origins, lengths, heights, condition)

Return true if the cumulative constraint is satisfied, false otherwise. The cumulative constraint is a global constraint used in constraint programming that is often used in scheduling problems. It ensures that for any point in time, the sum of the "heights" of tasks that are ongoing at that time does not exceed a certain limit.

Arguments

  • origins::AbstractVector: list of origins of the tasks.

  • lengths::AbstractVector: list of lengths of the tasks.

  • heights::AbstractVector: list of heights of the tasks.

  • condition::Tuple: condition to check.

Variants

  • :cumulative: The cumulative constraint is a global constraint used in constraint programming that is often used in scheduling problems. It ensures that for any point in time, the sum of the "heights" of tasks that are ongoing at that time does not exceed a certain limit.
julia
concept(:cumulative, x; pair_vars, op, val)
+@info "NoOverlap" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI

Packing and Scheduling Constraints

`,4)),i("details",r,[i("summary",null,[s[0]||(s[0]=i("a",{id:"Constraints.xcsp_cumulative-constraints-26_packing_scheduling_constraints",href:"#Constraints.xcsp_cumulative-constraints-26_packing_scheduling_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_cumulative")],-1)),s[1]||(s[1]=k()),n(h,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=a(`
julia
xcsp_cumulative(; origins, lengths, heights, condition)

Return true if the cumulative constraint is satisfied, false otherwise. The cumulative constraint is a global constraint operating on a set of tasks, defined by origin (starting times), length, and height. This constraint ensures that, at each point in time, the sum of the height of tasks that overlap that point, respects a numerical condition.

Arguments

  • origins::AbstractVector: list of origins of the tasks.

  • lengths::AbstractVector: list of lengths of the tasks.

  • heights::AbstractVector: list of heights of the tasks.

  • condition::Tuple: condition to check.

Variants

  • :cumulative: Global constraint operating on a set of tasks, defined by origin (starting times), length, and height. This constraint ensures that, at each point in time, the sum of the height of tasks that overlap that point, respects a numerical condition.
julia
concept(:cumulative, x; pair_vars, op, val)
 concept(:cumulative)(x; pair_vars, op, val)

Examples

julia
c = concept(:cumulative)
 
 c([1, 2, 3, 4, 5]; val = 1)
 c([1, 2, 2, 4, 5]; val = 1)
 c([1, 2, 3, 4, 5]; pair_vars = [3 2 5 4 2; 1 2 1 1 3], op =, val = 5)
-c([1, 2, 3, 4, 5]; pair_vars = [3 2 5 4 2; 1 2 1 1 3], op = <, val = 5)

source


# Constraints.xcsp_no_overlapFunction.
julia
xcsp_no_overlap(; origins, lengths, zero_ignored)

Return true if the no_overlap constraint is satisfied, false otherwise. The no_overlap constraint is a global constraint used in constraint programming, often in scheduling problems. It ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts.

Arguments

  • origins::AbstractVector: list of origins of the tasks.

  • lengths::AbstractVector: list of lengths of the tasks.

  • zero_ignored::Bool: whether to ignore zero-length tasks.

Variants

  • :no_overlap: The no_overlap constraint is a global constraint used in constraint programming, often in scheduling problems. It ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts.
julia
concept(:no_overlap, x; pair_vars, bool)
-concept(:no_overlap)(x; pair_vars, bool)
  • :no_overlap_no_zero: The no_overlap constraint is a global constraint used in constraint programming, often in scheduling problems. It ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts. This variant ignores zero-length tasks.
julia
concept(:no_overlap_no_zero, x; pair_vars)
-concept(:no_overlap_no_zero)(x; pair_vars)
  • :no_overlap_with_zero: The no_overlap constraint is a global constraint used in constraint programming, often in scheduling problems. It ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts. This variant includes zero-length tasks.
julia
concept(:no_overlap_with_zero, x; pair_vars)
+c([1, 2, 3, 4, 5]; pair_vars = [3 2 5 4 2; 1 2 1 1 3], op = <, val = 5)

source

`,10))]),i("details",d,[i("summary",null,[s[3]||(s[3]=i("a",{id:"Constraints.xcsp_no_overlap-constraints-26_packing_scheduling_constraints",href:"#Constraints.xcsp_no_overlap-constraints-26_packing_scheduling_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_no_overlap")],-1)),s[4]||(s[4]=k()),n(h,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=a(`
julia
xcsp_no_overlap(; origins, lengths, zero_ignored)

Return true if the no_overlap constraint is satisfied, false otherwise. The no_overlap constraint is a global constraint used in constraint programming, often in scheduling problems. It ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts.

Arguments

  • origins::AbstractVector: list of origins of the tasks.

  • lengths::AbstractVector: list of lengths of the tasks.

  • zero_ignored::Bool: whether to ignore zero-length tasks.

Variants

  • :no_overlap: Global constraint operating on a set of tasks, defined by origin (starting times), and length. This constraint ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts. Often used in scheduling problems.
julia
concept(:no_overlap, x; pair_vars, bool)
+concept(:no_overlap)(x; pair_vars, bool)
  • :no_overlap_no_zero: Global constraint operating on a set of tasks, defined by origin (starting times), and length. This constraint ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts. This variant ignores zero-length tasks. Often used in scheduling problems.
julia
concept(:no_overlap_no_zero, x; pair_vars)
+concept(:no_overlap_no_zero)(x; pair_vars)
  • :no_overlap_with_zero: Global constraint operating on a set of tasks, defined by origin (starting times), and length. This constraint ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts. This variant includes zero-length tasks. Often used in scheduling problems.
julia
concept(:no_overlap_with_zero, x; pair_vars)
 concept(:no_overlap_with_zero)(x; pair_vars)

Examples

julia
c = concept(:no_overlap)
 
 c([1, 2, 3, 4, 5])
@@ -68,4 +68,4 @@ import{_ as s,c as i,o as a,a7 as h}from"./chunks/framework.CBLuZwrP.js";const F
 c([1, 2, 4, 6, 3]; pair_vars = [1, 1, 1, 3, 1])
 c([1, 2, 4, 6, 3]; pair_vars = [1, 1, 3, 1, 1])
 c([1, 1, 1, 3, 5, 2, 7, 7, 5, 12, 8, 7]; pair_vars = [2, 4, 1, 4 ,2 ,3, 5, 1, 2, 3, 3, 2], dim = 3)
-c([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]; pair_vars = [2, 4, 1, 4 ,2 ,3, 5, 1, 2, 3, 3, 2], dim = 3)

source


`,8),t=[n];function l(p,e,E,r,d,g){return a(),i("div",null,t)}const C=s(k,[["render",l]]);export{F as __pageData,C as default}; +c([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]; pair_vars = [2, 4, 1, 4 ,2 ,3, 5, 1, 2, 3, 3, 2], dim = 3)

source

`,14))])])}const v=t(E,[["render",g]]);export{u as __pageData,v as default}; diff --git a/dev/assets/constraints_26_packing_scheduling_constraints.md.DcwNvTzZ.lean.js b/dev/assets/constraints_26_packing_scheduling_constraints.md.DcwNvTzZ.lean.js new file mode 100644 index 0000000..960ae95 --- /dev/null +++ b/dev/assets/constraints_26_packing_scheduling_constraints.md.DcwNvTzZ.lean.js @@ -0,0 +1,71 @@ +import{_ as t,c as l,a5 as a,j as i,a as k,G as n,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const u=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/26_packing_scheduling_constraints.md","filePath":"constraints/26_packing_scheduling_constraints.md","lastUpdated":null}'),E={name:"constraints/26_packing_scheduling_constraints.md"},r={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""};function g(y,s,F,C,o,c){const h=p("Badge");return e(),l("div",null,[s[6]||(s[6]=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
+
+@info concept(:cumulative, [1, 2, 3, 4, 5]; val = 1)
+@info concept(:cumulative, [1, 2, 2, 4, 5]; val = 1)
+@info concept(:cumulative, [1, 2, 3, 4, 5]; pair_vars = [3 2 5 4 2; 1 2 1 1 3], op =, val = 5)
+@info concept(:cumulative, [1, 2, 3, 4, 5]; pair_vars = [3 2 5 4 2; 1 2 1 1 3], op = <, val = 5)
julia
using Constraints
+
+c = x -> Constraints.xcsp_cumulative(
+	origins = x,
+	lengths = [3, 2, 5, 4, 2],
+	heights = [1, 2, 1, 1, 3],
+	condition = (, 5)
+)
+
+@info c([1, 2, 3, 4, 5])
+@info c([1, 1, 1, 2, 2])
julia
using CBLS, JuMP
+
+model = Model(CBLS.Optimizer)
+@variable(model, 1X[1:5]5, Int)
+@variable(model, 1Y[1:5]5, Int)
+@variable(model, 1Z[1:5]5, Int)
+@constraint(model, X in Cumulative(; val = 1))
+@constraint(model,
+    Y in Cumulative(; pair_vars = [3 2 5 4 2; 1 2 1 1 3], op =, val = 5))
+@constraint(model,
+    Z in Cumulative(; pair_vars = [3 2 5 4 2; 1 2 1 1 3], op = <, val = 5))
+JuMP.optimize!(model)
+@info "Cumulative" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+
+@info concept(:no_overlap, [1, 2, 3, 4, 5])
+@info concept(:no_overlap, [1, 2, 3, 4, 1])
+@info concept(:no_overlap, [1, 2, 4, 6, 3]; pair_vars = [1, 1, 1, 1, 1])
+@info concept(:no_overlap, [1, 2, 4, 6, 3]; pair_vars = [1, 1, 1, 3, 1])
+@info concept(:no_overlap, [1, 2, 4, 6, 3]; pair_vars = [1, 1, 3, 1, 1])
julia
using Constraints
+
+c = x -> Constraints.xcsp_no_overlap(
+	origins = x,
+	lengths = [1, 4, 10],
+	zero_ignored = true
+)
+
+@info c([1, 3, 10])
+@info c([2, 1, 4, 3])
julia
using CBLS, JuMP
+
+model = Model(CBLS.Optimizer)
+@variable(model, 1X[1:5]5, Int)
+@variable(model, 1Y[1:5]6, Int)
+@variable(model, 1Z[1:12]12, Int)
+@constraint(model, X in NoOverlap())
+@constraint(model, Y in NoOverlap(; pair_vars = [1, 1, 1, 1, 1]))
+@constraint(model,
+    Z in NoOverlap(; pair_vars = [2, 4, 1, 4, 2, 3, 5, 1, 2, 3, 3, 2], dim = 3))
+JuMP.optimize!(model)
+@info "NoOverlap" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI

Packing and Scheduling Constraints

`,4)),i("details",r,[i("summary",null,[s[0]||(s[0]=i("a",{id:"Constraints.xcsp_cumulative-constraints-26_packing_scheduling_constraints",href:"#Constraints.xcsp_cumulative-constraints-26_packing_scheduling_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_cumulative")],-1)),s[1]||(s[1]=k()),n(h,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=a(`
julia
xcsp_cumulative(; origins, lengths, heights, condition)

Return true if the cumulative constraint is satisfied, false otherwise. The cumulative constraint is a global constraint operating on a set of tasks, defined by origin (starting times), length, and height. This constraint ensures that, at each point in time, the sum of the height of tasks that overlap that point, respects a numerical condition.

Arguments

  • origins::AbstractVector: list of origins of the tasks.

  • lengths::AbstractVector: list of lengths of the tasks.

  • heights::AbstractVector: list of heights of the tasks.

  • condition::Tuple: condition to check.

Variants

  • :cumulative: Global constraint operating on a set of tasks, defined by origin (starting times), length, and height. This constraint ensures that, at each point in time, the sum of the height of tasks that overlap that point, respects a numerical condition.
julia
concept(:cumulative, x; pair_vars, op, val)
+concept(:cumulative)(x; pair_vars, op, val)

Examples

julia
c = concept(:cumulative)
+
+c([1, 2, 3, 4, 5]; val = 1)
+c([1, 2, 2, 4, 5]; val = 1)
+c([1, 2, 3, 4, 5]; pair_vars = [3 2 5 4 2; 1 2 1 1 3], op =, val = 5)
+c([1, 2, 3, 4, 5]; pair_vars = [3 2 5 4 2; 1 2 1 1 3], op = <, val = 5)

source

`,10))]),i("details",d,[i("summary",null,[s[3]||(s[3]=i("a",{id:"Constraints.xcsp_no_overlap-constraints-26_packing_scheduling_constraints",href:"#Constraints.xcsp_no_overlap-constraints-26_packing_scheduling_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_no_overlap")],-1)),s[4]||(s[4]=k()),n(h,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=a(`
julia
xcsp_no_overlap(; origins, lengths, zero_ignored)

Return true if the no_overlap constraint is satisfied, false otherwise. The no_overlap constraint is a global constraint used in constraint programming, often in scheduling problems. It ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts.

Arguments

  • origins::AbstractVector: list of origins of the tasks.

  • lengths::AbstractVector: list of lengths of the tasks.

  • zero_ignored::Bool: whether to ignore zero-length tasks.

Variants

  • :no_overlap: Global constraint operating on a set of tasks, defined by origin (starting times), and length. This constraint ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts. Often used in scheduling problems.
julia
concept(:no_overlap, x; pair_vars, bool)
+concept(:no_overlap)(x; pair_vars, bool)
  • :no_overlap_no_zero: Global constraint operating on a set of tasks, defined by origin (starting times), and length. This constraint ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts. This variant ignores zero-length tasks. Often used in scheduling problems.
julia
concept(:no_overlap_no_zero, x; pair_vars)
+concept(:no_overlap_no_zero)(x; pair_vars)
  • :no_overlap_with_zero: Global constraint operating on a set of tasks, defined by origin (starting times), and length. This constraint ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts. This variant includes zero-length tasks. Often used in scheduling problems.
julia
concept(:no_overlap_with_zero, x; pair_vars)
+concept(:no_overlap_with_zero)(x; pair_vars)

Examples

julia
c = concept(:no_overlap)
+
+c([1, 2, 3, 4, 5])
+c([1, 2, 3, 4, 1])
+c([1, 2, 4, 6, 3]; pair_vars = [1, 1, 1, 1, 1])
+c([1, 2, 4, 6, 3]; pair_vars = [1, 1, 1, 3, 1])
+c([1, 2, 4, 6, 3]; pair_vars = [1, 1, 3, 1, 1])
+c([1, 1, 1, 3, 5, 2, 7, 7, 5, 12, 8, 7]; pair_vars = [2, 4, 1, 4 ,2 ,3, 5, 1, 2, 3, 3, 2], dim = 3)
+c([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]; pair_vars = [2, 4, 1, 4 ,2 ,3, 5, 1, 2, 3, 3, 2], dim = 3)

source

`,14))])])}const v=t(E,[["render",g]]);export{u as __pageData,v as default}; diff --git a/dev/assets/constraints_27_graph_constraints.md.pFqKPWqH.js b/dev/assets/constraints_27_graph_constraints.md.BA3dAj1n.js similarity index 56% rename from dev/assets/constraints_27_graph_constraints.md.pFqKPWqH.js rename to dev/assets/constraints_27_graph_constraints.md.BA3dAj1n.js index 4bd52db..f48be8a 100644 --- a/dev/assets/constraints_27_graph_constraints.md.pFqKPWqH.js +++ b/dev/assets/constraints_27_graph_constraints.md.BA3dAj1n.js @@ -1,7 +1,7 @@ -import{_ as i,c as s,o as a,a7 as t}from"./chunks/framework.CBLuZwrP.js";const g=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/27_graph_constraints.md","filePath":"constraints/27_graph_constraints.md","lastUpdated":null}'),n={name:"constraints/27_graph_constraints.md"},e=t(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

Constraints on Graphs

# Constraints.xcsp_circuitFunction.
julia
xcsp_circuit(; list, size)

Return true if the circuit constraint is satisfied, false otherwise. The circuit constraint is a global constraint used in constraint programming, often in routing problems. It ensures that the values of a list of variables form a circuit, i.e., a sequence where each value is the index of the next value in the sequence, and the sequence eventually loops back to the start.

Arguments

  • list::AbstractVector: list of values to check.

  • size::Int: size of the circuit.

Variants

  • :circuit: The circuit constraint is a global constraint used in constraint programming, often in routing problems. It ensures that the values of a list of variables form a circuit, i.e., a sequence where each value is the index of the next value in the sequence, and the sequence eventually loops back to the start.
julia
concept(:circuit, x; op, val)
+import{_ as n,c as e,j as i,a,G as l,a5 as h,B as p,o as k}from"./chunks/framework.CJakPlgM.js";const F=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/27_graph_constraints.md","filePath":"constraints/27_graph_constraints.md","lastUpdated":null}'),r={name:"constraints/27_graph_constraints.md"},o={class:"jldocstring custom-block",open:""};function d(c,s,E,g,C,u){const t=p("Badge");return k(),e("div",null,[s[3]||(s[3]=i("h1",{id:"Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia",tabindex:"-1"},[a("Constraints.jl: Streamlining Constraint Definition and Integration in Julia "),i("a",{class:"header-anchor",href:"#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","aria-label":'Permalink to "Constraints.jl: Streamlining Constraint Definition and Integration in Julia {#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia}"'},"​")],-1)),s[4]||(s[4]=i("h3",{id:"Constraints-on-Graphs",tabindex:"-1"},[a("Constraints on Graphs "),i("a",{class:"header-anchor",href:"#Constraints-on-Graphs","aria-label":'Permalink to "Constraints on Graphs {#Constraints-on-Graphs}"'},"​")],-1)),i("details",o,[i("summary",null,[s[0]||(s[0]=i("a",{id:"Constraints.xcsp_circuit-constraints-27_graph_constraints",href:"#Constraints.xcsp_circuit-constraints-27_graph_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_circuit")],-1)),s[1]||(s[1]=a()),l(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=h(`
julia
xcsp_circuit(; list, size)

Return true if the circuit constraint is satisfied, false otherwise. The circuit constraint is a global constraint ensuring that the values of x form a circuit, i.e., a sequence where each value is the index of the next value in the sequence, and the sequence eventually loops back to the start.

Arguments

  • list::AbstractVector: list of values to check.

  • size::Int: size of the circuit.

Variants

  • :circuit: Global constraint ensuring that the values of x form a circuit, i.e., a sequence where each value is the index of the next value in the sequence, and the sequence eventually loops back to the start. Often used for routing problems.
julia
concept(:circuit, x; op, val)
 concept(:circuit)(x; op, val)

Examples

julia
c = concept(:circuit)
 
 c([1, 2, 3, 4])
 c([2, 3, 4, 1])
 c([2, 3, 1, 4]; op = ==, val = 3)
-c([4, 3, 1, 3]; op = >, val = 0)

source


`,4),h=[e];function l(p,r,k,o,d,c){return a(),s("div",null,h)}const C=i(n,[["render",l]]);export{g as __pageData,C as default}; +c([4, 3, 1, 3]; op = >, val = 0)

source

`,10))])])}const B=n(r,[["render",d]]);export{F as __pageData,B as default}; diff --git a/dev/assets/constraints_27_graph_constraints.md.BA3dAj1n.lean.js b/dev/assets/constraints_27_graph_constraints.md.BA3dAj1n.lean.js new file mode 100644 index 0000000..f48be8a --- /dev/null +++ b/dev/assets/constraints_27_graph_constraints.md.BA3dAj1n.lean.js @@ -0,0 +1,7 @@ +import{_ as n,c as e,j as i,a,G as l,a5 as h,B as p,o as k}from"./chunks/framework.CJakPlgM.js";const F=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/27_graph_constraints.md","filePath":"constraints/27_graph_constraints.md","lastUpdated":null}'),r={name:"constraints/27_graph_constraints.md"},o={class:"jldocstring custom-block",open:""};function d(c,s,E,g,C,u){const t=p("Badge");return k(),e("div",null,[s[3]||(s[3]=i("h1",{id:"Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia",tabindex:"-1"},[a("Constraints.jl: Streamlining Constraint Definition and Integration in Julia "),i("a",{class:"header-anchor",href:"#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","aria-label":'Permalink to "Constraints.jl: Streamlining Constraint Definition and Integration in Julia {#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia}"'},"​")],-1)),s[4]||(s[4]=i("h3",{id:"Constraints-on-Graphs",tabindex:"-1"},[a("Constraints on Graphs "),i("a",{class:"header-anchor",href:"#Constraints-on-Graphs","aria-label":'Permalink to "Constraints on Graphs {#Constraints-on-Graphs}"'},"​")],-1)),i("details",o,[i("summary",null,[s[0]||(s[0]=i("a",{id:"Constraints.xcsp_circuit-constraints-27_graph_constraints",href:"#Constraints.xcsp_circuit-constraints-27_graph_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_circuit")],-1)),s[1]||(s[1]=a()),l(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=h(`
julia
xcsp_circuit(; list, size)

Return true if the circuit constraint is satisfied, false otherwise. The circuit constraint is a global constraint ensuring that the values of x form a circuit, i.e., a sequence where each value is the index of the next value in the sequence, and the sequence eventually loops back to the start.

Arguments

  • list::AbstractVector: list of values to check.

  • size::Int: size of the circuit.

Variants

  • :circuit: Global constraint ensuring that the values of x form a circuit, i.e., a sequence where each value is the index of the next value in the sequence, and the sequence eventually loops back to the start. Often used for routing problems.
julia
concept(:circuit, x; op, val)
+concept(:circuit)(x; op, val)

Examples

julia
c = concept(:circuit)
+
+c([1, 2, 3, 4])
+c([2, 3, 4, 1])
+c([2, 3, 1, 4]; op = ==, val = 3)
+c([4, 3, 1, 3]; op = >, val = 0)

source

`,10))])])}const B=n(r,[["render",d]]);export{F as __pageData,B as default}; diff --git a/dev/assets/constraints_27_graph_constraints.md.pFqKPWqH.lean.js b/dev/assets/constraints_27_graph_constraints.md.pFqKPWqH.lean.js deleted file mode 100644 index 27c7915..0000000 --- a/dev/assets/constraints_27_graph_constraints.md.pFqKPWqH.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as s,o as a,a7 as t}from"./chunks/framework.CBLuZwrP.js";const g=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/27_graph_constraints.md","filePath":"constraints/27_graph_constraints.md","lastUpdated":null}'),n={name:"constraints/27_graph_constraints.md"},e=t("",4),h=[e];function l(p,r,k,o,d,c){return a(),s("div",null,h)}const C=i(n,[["render",l]]);export{g as __pageData,C as default}; diff --git a/dev/assets/constraints_28_elementary_constraints.md.DWoH9ubp.js b/dev/assets/constraints_28_elementary_constraints.md.D420JMw0.js similarity index 56% rename from dev/assets/constraints_28_elementary_constraints.md.DWoH9ubp.js rename to dev/assets/constraints_28_elementary_constraints.md.D420JMw0.js index 4a3996f..34edf16 100644 --- a/dev/assets/constraints_28_elementary_constraints.md.DWoH9ubp.js +++ b/dev/assets/constraints_28_elementary_constraints.md.D420JMw0.js @@ -1,5 +1,5 @@ -import{_ as i,c as s,o as a,a7 as t}from"./chunks/framework.CBLuZwrP.js";const g=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/28_elementary_constraints.md","filePath":"constraints/28_elementary_constraints.md","lastUpdated":null}'),n={name:"constraints/28_elementary_constraints.md"},e=t(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

Elementary Constraints

# Constraints.xcsp_instantiationFunction.
julia
xcsp_instantiation(; list, values)

Return true if the instantiation constraint is satisfied, false otherwise. The instantiation constraint is a global constraint used in constraint programming that ensures that a list of variables takes on a specific set of values in a specific order.

Arguments

  • list::AbstractVector: list of values to check.

  • values::AbstractVector: list of values to check against.

Variants

  • :instantiation: The instantiation constraint is a global constraint used in constraint programming that ensures that a list of variables takes on a specific set of values in a specific order.
julia
concept(:instantiation, x; pair_vars)
+import{_ as t,c as e,j as i,a,G as l,a5 as h,B as p,o as k}from"./chunks/framework.CJakPlgM.js";const u=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/28_elementary_constraints.md","filePath":"constraints/28_elementary_constraints.md","lastUpdated":null}'),r={name:"constraints/28_elementary_constraints.md"},o={class:"jldocstring custom-block",open:""};function d(E,s,c,g,C,y){const n=p("Badge");return k(),e("div",null,[s[3]||(s[3]=i("h1",{id:"Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia",tabindex:"-1"},[a("Constraints.jl: Streamlining Constraint Definition and Integration in Julia "),i("a",{class:"header-anchor",href:"#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","aria-label":'Permalink to "Constraints.jl: Streamlining Constraint Definition and Integration in Julia {#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia}"'},"​")],-1)),s[4]||(s[4]=i("h3",{id:"Elementary-Constraints",tabindex:"-1"},[a("Elementary Constraints "),i("a",{class:"header-anchor",href:"#Elementary-Constraints","aria-label":'Permalink to "Elementary Constraints {#Elementary-Constraints}"'},"​")],-1)),i("details",o,[i("summary",null,[s[0]||(s[0]=i("a",{id:"Constraints.xcsp_instantiation-constraints-28_elementary_constraints",href:"#Constraints.xcsp_instantiation-constraints-28_elementary_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_instantiation")],-1)),s[1]||(s[1]=a()),l(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=h(`
julia
xcsp_instantiation(; list, values)

Return true if the instantiation constraint is satisfied, false otherwise. The instantiation constraint is a global constraint ensuring that x takes on a specific set of values in a specific order.

Arguments

  • list::AbstractVector: list of values to check.

  • values::AbstractVector: list of values to check against.

Variants

  • :instantiation: Global constraint ensuring that x takes on a specific set of values in a specific order.
julia
concept(:instantiation, x; pair_vars)
 concept(:instantiation)(x; pair_vars)

Examples

julia
c = concept(:instantiation)
 
 c([1, 2, 3, 4, 5]; pair_vars=[1, 2, 3, 4, 5])
-c([1, 2, 3, 4, 5]; pair_vars=[1, 2, 3, 4, 6])

source


`,4),l=[e];function h(r,p,k,o,d,E){return a(),s("div",null,l)}const C=i(n,[["render",h]]);export{g as __pageData,C as default}; +c([1, 2, 3, 4, 5]; pair_vars=[1, 2, 3, 4, 6])

source

`,10))])])}const m=t(r,[["render",d]]);export{u as __pageData,m as default}; diff --git a/dev/assets/constraints_28_elementary_constraints.md.D420JMw0.lean.js b/dev/assets/constraints_28_elementary_constraints.md.D420JMw0.lean.js new file mode 100644 index 0000000..34edf16 --- /dev/null +++ b/dev/assets/constraints_28_elementary_constraints.md.D420JMw0.lean.js @@ -0,0 +1,5 @@ +import{_ as t,c as e,j as i,a,G as l,a5 as h,B as p,o as k}from"./chunks/framework.CJakPlgM.js";const u=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/28_elementary_constraints.md","filePath":"constraints/28_elementary_constraints.md","lastUpdated":null}'),r={name:"constraints/28_elementary_constraints.md"},o={class:"jldocstring custom-block",open:""};function d(E,s,c,g,C,y){const n=p("Badge");return k(),e("div",null,[s[3]||(s[3]=i("h1",{id:"Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia",tabindex:"-1"},[a("Constraints.jl: Streamlining Constraint Definition and Integration in Julia "),i("a",{class:"header-anchor",href:"#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","aria-label":'Permalink to "Constraints.jl: Streamlining Constraint Definition and Integration in Julia {#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia}"'},"​")],-1)),s[4]||(s[4]=i("h3",{id:"Elementary-Constraints",tabindex:"-1"},[a("Elementary Constraints "),i("a",{class:"header-anchor",href:"#Elementary-Constraints","aria-label":'Permalink to "Elementary Constraints {#Elementary-Constraints}"'},"​")],-1)),i("details",o,[i("summary",null,[s[0]||(s[0]=i("a",{id:"Constraints.xcsp_instantiation-constraints-28_elementary_constraints",href:"#Constraints.xcsp_instantiation-constraints-28_elementary_constraints"},[i("span",{class:"jlbinding"},"Constraints.xcsp_instantiation")],-1)),s[1]||(s[1]=a()),l(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=h(`
julia
xcsp_instantiation(; list, values)

Return true if the instantiation constraint is satisfied, false otherwise. The instantiation constraint is a global constraint ensuring that x takes on a specific set of values in a specific order.

Arguments

  • list::AbstractVector: list of values to check.

  • values::AbstractVector: list of values to check against.

Variants

  • :instantiation: Global constraint ensuring that x takes on a specific set of values in a specific order.
julia
concept(:instantiation, x; pair_vars)
+concept(:instantiation)(x; pair_vars)

Examples

julia
c = concept(:instantiation)
+
+c([1, 2, 3, 4, 5]; pair_vars=[1, 2, 3, 4, 5])
+c([1, 2, 3, 4, 5]; pair_vars=[1, 2, 3, 4, 6])

source

`,10))])])}const m=t(r,[["render",d]]);export{u as __pageData,m as default}; diff --git a/dev/assets/constraints_28_elementary_constraints.md.DWoH9ubp.lean.js b/dev/assets/constraints_28_elementary_constraints.md.DWoH9ubp.lean.js deleted file mode 100644 index f2a97f8..0000000 --- a/dev/assets/constraints_28_elementary_constraints.md.DWoH9ubp.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as s,o as a,a7 as t}from"./chunks/framework.CBLuZwrP.js";const g=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/28_elementary_constraints.md","filePath":"constraints/28_elementary_constraints.md","lastUpdated":null}'),n={name:"constraints/28_elementary_constraints.md"},e=t("",4),l=[e];function h(r,p,k,o,d,E){return a(),s("div",null,l)}const C=i(n,[["render",h]]);export{g as __pageData,C as default}; diff --git a/dev/assets/constraints_40_constraint_models.md.Dv2qEx3_.js b/dev/assets/constraints_40_constraint_models.md.Dv2qEx3_.js new file mode 100644 index 0000000..f347261 --- /dev/null +++ b/dev/assets/constraints_40_constraint_models.md.Dv2qEx3_.js @@ -0,0 +1,30 @@ +import{_ as h,c as l,j as i,a,G as e,a5 as t,B as o,o as p}from"./chunks/framework.CJakPlgM.js";const P=JSON.parse('{"title":"ConstraintModels.jl","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/40_constraint_models.md","filePath":"constraints/40_constraint_models.md","lastUpdated":null}'),k={name:"constraints/40_constraint_models.md"},d={class:"jldocstring custom-block",open:""},r={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},g={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.481ex",height:"1.136ex",role:"img",focusable:"false",viewBox:"0 -491 2422.4 502","aria-hidden":"true"},y={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},M={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""};function Q(w,s,L,I,S,J){const n=o("Badge");return p(),l("div",null,[s[59]||(s[59]=i("h1",{id:"constraintmodels-jl",tabindex:"-1"},[a("ConstraintModels.jl "),i("a",{class:"header-anchor",href:"#constraintmodels-jl","aria-label":'Permalink to "ConstraintModels.jl"'},"​")],-1)),s[60]||(s[60]=i("p",null,[a("Documentation for "),i("code",null,"ConstraintModels.jl"),a(".")],-1)),i("details",d,[i("summary",null,[s[0]||(s[0]=i("a",{id:"ConstraintModels.SudokuInstance",href:"#ConstraintModels.SudokuInstance"},[i("span",{class:"jlbinding"},"ConstraintModels.SudokuInstance")],-1)),s[1]||(s[1]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=t(`
julia
mutable struct SudokuInstance{T <: Integer} <: AbstractMatrix{T}

A struct for SudokuInstances, which is a subtype of AbstractMatrix.

julia
SudokuInstance(A::AbstractMatrix{T})
+SudokuInstance(::Type{T}, n::Int) # fill in blank sudoku of type T
+SudokuInstance(n::Int) # fill in blank sudoku of type Int
+SudokuInstance(::Type{T}) # fill in "standard" 9×9 sudoku of type T
+SudokuInstance() # fill in "standard" 9×9 sudoku of type Int
+SudokuInstance(n::Int, P::Pair{Tuple{Int, Int}, T}...) where {T <: Integer} # construct a sudoku given pairs of coordinates and values
+SudokuInstance(P::Pair{Tuple{Int, Int}, T}...) # again, default to 9×9 sudoku, constructing given pairs

Constructor functions for the SudokuInstance struct.

source

`,5))]),i("details",r,[i("summary",null,[s[3]||(s[3]=i("a",{id:"ConstraintModels.SudokuInstance-Tuple{Dictionaries.Dictionary}",href:"#ConstraintModels.SudokuInstance-Tuple{Dictionaries.Dictionary}"},[i("span",{class:"jlbinding"},"ConstraintModels.SudokuInstance")],-1)),s[4]||(s[4]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[5]||(s[5]=t('
julia
SudokuInstance(X::Dictionary)

Construct a SudokuInstance with the values X of a solver as input.

source

',3))]),i("details",u,[i("summary",null,[s[6]||(s[6]=i("a",{id:"Base.Multimedia.display-Tuple{Any, ConstraintModels.SudokuInstance}",href:"#Base.Multimedia.display-Tuple{Any, ConstraintModels.SudokuInstance}"},[i("span",{class:"jlbinding"},"Base.Multimedia.display")],-1)),s[7]||(s[7]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[12]||(s[12]=t(`
julia
display(io::IO, S::SudokuInstance)
+display(S::SudokuInstance) # default to stdout
`,1)),i("p",null,[s[10]||(s[10]=a("Displays an ")),i("mjx-container",g,[(p(),l("svg",c,s[8]||(s[8]=[t('',1)]))),s[9]||(s[9]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"n"),i("mo",null,"×"),i("mi",null,"n")])],-1))]),s[11]||(s[11]=a(" SudokuInstance."))]),s[13]||(s[13]=i("p",null,[i("a",{href:"https://github.com/JuliaConstraints/ConstraintModels.jl/blob/v0.3.0/src/sudoku.jl#L312-L318",target:"_blank",rel:"noreferrer"},"source")],-1))]),i("details",y,[i("summary",null,[s[14]||(s[14]=i("a",{id:"Base.Multimedia.display-Tuple{Any, Val{:sudoku}}",href:"#Base.Multimedia.display-Tuple{Any, Val{:sudoku}}"},[i("span",{class:"jlbinding"},"Base.Multimedia.display")],-1)),s[15]||(s[15]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[16]||(s[16]=t('
julia
Base.display(X, Val(:sudoku))

Extends Base.display to a sudoku configuration.

source

',3))]),i("details",C,[i("summary",null,[s[17]||(s[17]=i("a",{id:"Base.Multimedia.display-Tuple{ConstraintModels.SudokuInstance}",href:"#Base.Multimedia.display-Tuple{ConstraintModels.SudokuInstance}"},[i("span",{class:"jlbinding"},"Base.Multimedia.display")],-1)),s[18]||(s[18]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[19]||(s[19]=t('
julia
Base.display(S::SudokuInstance)

Extends Base.display to SudokuInstance.

source

',3))]),i("details",F,[i("summary",null,[s[20]||(s[20]=i("a",{id:"Base.Multimedia.display-Tuple{Dictionaries.Dictionary}",href:"#Base.Multimedia.display-Tuple{Dictionaries.Dictionary}"},[i("span",{class:"jlbinding"},"Base.Multimedia.display")],-1)),s[21]||(s[21]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[22]||(s[22]=t('
julia
Base.display(X::Dictionary)

Extends Base.display to a sudoku configuration.

source

',3))]),i("details",E,[i("summary",null,[s[23]||(s[23]=i("a",{id:"Base.size-Tuple{ConstraintModels.SudokuInstance}",href:"#Base.size-Tuple{ConstraintModels.SudokuInstance}"},[i("span",{class:"jlbinding"},"Base.size")],-1)),s[24]||(s[24]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[25]||(s[25]=t('
julia
Base.size(S::SudokuInstance)

Extends Base.size for SudokuInstance.

source

',3))]),i("details",m,[i("summary",null,[s[26]||(s[26]=i("a",{id:"ConstraintModels._format_line-Tuple{Any, Any}",href:"#ConstraintModels._format_line-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"ConstraintModels._format_line")],-1)),s[27]||(s[27]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[28]||(s[28]=t('
julia
_format_line(r, M)

Format line of a sudoku grid.

source

',3))]),i("details",b,[i("summary",null,[s[29]||(s[29]=i("a",{id:"ConstraintModels._format_line_segment-Tuple{Any, Any, Any}",href:"#ConstraintModels._format_line_segment-Tuple{Any, Any, Any}"},[i("span",{class:"jlbinding"},"ConstraintModels._format_line_segment")],-1)),s[30]||(s[30]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[31]||(s[31]=t('
julia
_format_line_segment(r, col_pos, M)

Format line segment of a sudoku grid.

source

',3))]),i("details",f,[i("summary",null,[s[32]||(s[32]=i("a",{id:"ConstraintModels._format_val-Tuple{Any}",href:"#ConstraintModels._format_val-Tuple{Any}"},[i("span",{class:"jlbinding"},"ConstraintModels._format_val")],-1)),s[33]||(s[33]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[34]||(s[34]=t('
julia
_format_val(a)

Format an integer a into a string for SudokuInstance.

source

',3))]),i("details",j,[i("summary",null,[s[35]||(s[35]=i("a",{id:"ConstraintModels._get_sep_line-Tuple{Any, Any, Any}",href:"#ConstraintModels._get_sep_line-Tuple{Any, Any, Any}"},[i("span",{class:"jlbinding"},"ConstraintModels._get_sep_line")],-1)),s[36]||(s[36]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[37]||(s[37]=t('
julia
_get_sep_line(s, pos_row, M)

Return a line separator.

source

',3))]),i("details",B,[i("summary",null,[s[38]||(s[38]=i("a",{id:"ConstraintModels.chemical_equilibrium-Tuple{Any, Any, Any}",href:"#ConstraintModels.chemical_equilibrium-Tuple{Any, Any, Any}"},[i("span",{class:"jlbinding"},"ConstraintModels.chemical_equilibrium")],-1)),s[39]||(s[39]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[40]||(s[40]=t('
julia
chemical_equilibrium(atoms_compounds, elements_weights, standard_free_energy; modeler = :JuMP)

Warning

Even the structure to model problems with continuous domains is available, the default solver is not yet equiped to solve such problems efficiently.

From Wikipedia

In a chemical reaction, chemical equilibrium is the state in which both the reactants and products are present in concentrations which have no further tendency to change with time, so that there is no observable change in the properties of the system. This state results when the forward reaction proceeds at the same rate as the reverse reaction. The reaction rates of the forward and backward reactions are generally not zero, but they are equal. Thus, there are no net changes in the concentrations of the reactants and products. Such a state is known as dynamic equilibrium.

source

',5))]),i("details",v,[i("summary",null,[s[41]||(s[41]=i("a",{id:"ConstraintModels.golomb",href:"#ConstraintModels.golomb"},[i("span",{class:"jlbinding"},"ConstraintModels.golomb")],-1)),s[42]||(s[42]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[43]||(s[43]=t('
julia
golomb(n, L=n²)

Model the Golomb problem of n marks on the ruler 0:L. The modeler argument accepts :raw, and :JuMP (default), which refer respectively to the solver internal model, the MathOptInterface model, and the JuMP model.

source

',3))]),i("details",M,[i("summary",null,[s[44]||(s[44]=i("a",{id:"ConstraintModels.magic_square-Tuple{Any}",href:"#ConstraintModels.magic_square-Tuple{Any}"},[i("span",{class:"jlbinding"},"ConstraintModels.magic_square")],-1)),s[45]||(s[45]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[46]||(s[46]=t('
julia
magic_square(n; modeler = :JuMP)

Create a model for the magic square problem of order n. The modeler argument accepts :JuMP (default), which refer to the solver the JuMP model.

source

',3))]),i("details",T,[i("summary",null,[s[47]||(s[47]=i("a",{id:"ConstraintModels.mincut-Tuple{Any}",href:"#ConstraintModels.mincut-Tuple{Any}"},[i("span",{class:"jlbinding"},"ConstraintModels.mincut")],-1)),s[48]||(s[48]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[49]||(s[49]=t('
julia
mincut(graph; source, sink, interdiction =0, modeler = :JuMP)

Compute the minimum cut of a graph.

Arguments:

  • graph: Any matrix <: AbstractMatrix that describes the capacities of the graph

  • source: Id of the source node; must be set

  • sink: Id of the sink node; must be set

  • interdiction: indicates the number of forbidden links

  • modeler: Default to :JuMP.

source

',5))]),i("details",A,[i("summary",null,[s[50]||(s[50]=i("a",{id:"ConstraintModels.n_queens-Tuple{Any}",href:"#ConstraintModels.n_queens-Tuple{Any}"},[i("span",{class:"jlbinding"},"ConstraintModels.n_queens")],-1)),s[51]||(s[51]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[52]||(s[52]=t('
julia
n_queens(n; modeler = :JuMP)

Create a model for the n-queens problem with n queens. The modeler argument accepts :JuMP (default), which refer to the JuMP model.

source

',3))]),i("details",D,[i("summary",null,[s[53]||(s[53]=i("a",{id:"ConstraintModels.qap-Tuple{Any, Any, Any}",href:"#ConstraintModels.qap-Tuple{Any, Any, Any}"},[i("span",{class:"jlbinding"},"ConstraintModels.qap")],-1)),s[54]||(s[54]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[55]||(s[55]=t('
julia
qap(n, weigths, distances; modeler = :JuMP)

Modelize an instance of the Quadractic Assignment Problem with

  • n: number of both facilities and locations

  • weights: Matrix of the weights of each pair of facilities

  • distances: Matrix of distances between locations

  • modeler: Default to :JuMP. No other modeler available for now.

From Wikipedia

There are a set of n facilities and a set of n locations. For each pair of locations, a distance is specified and for each pair of facilities a weight or flow is specified (e.g., the amount of supplies transported between the two facilities). The problem is to assign all facilities to different locations with the goal of minimizing the sum of the distances multiplied by the corresponding flows.

source

',6))]),i("details",x,[i("summary",null,[s[56]||(s[56]=i("a",{id:"ConstraintModels.sudoku-Tuple{Any}",href:"#ConstraintModels.sudoku-Tuple{Any}"},[i("span",{class:"jlbinding"},"ConstraintModels.sudoku")],-1)),s[57]||(s[57]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[58]||(s[58]=t(`
julia
sudoku(n; start= Dictionary{Int, Int}(), modeler = :JuMP)

Create a model for the sudoku problem of domain 1:n² with optional starting values. The modeler argument accepts :raw, :MOI, and :JuMP (default), which refer respectively to the solver internal model, the MathOptInterface model, and the JuMP model.

julia
# Construct a JuMP model \`m\` and its associated matrix \`grid\` for sudoku 9×9
+m, grid = sudoku(3)
+
+# Same with a starting instance
+instance = [
+    9  3  0  0  0  0  0  4  0
+    0  0  0  0  4  2  0  9  0
+    8  0  0  1  9  6  7  0  0
+    0  0  0  4  7  0  0  0  0
+    0  2  0  0  0  0  0  6  0
+    0  0  0  0  2  3  0  0  0
+    0  0  8  5  3  1  0  0  2
+    0  9  0  2  8  0  0  0  0
+    0  7  0  0  0  0  0  5  3
+]
+m, grid = sudoku(3, start = instance)
+
+# Run the solver
+optimize!(m)
+
+# Retrieve and display the values
+solution = value.(grid)
+display(solution, Val(:sudoku))

source

`,4))])])}const O=h(k,[["render",Q]]);export{P as __pageData,O as default}; diff --git a/dev/assets/constraints_40_constraint_models.md.Dv2qEx3_.lean.js b/dev/assets/constraints_40_constraint_models.md.Dv2qEx3_.lean.js new file mode 100644 index 0000000..f347261 --- /dev/null +++ b/dev/assets/constraints_40_constraint_models.md.Dv2qEx3_.lean.js @@ -0,0 +1,30 @@ +import{_ as h,c as l,j as i,a,G as e,a5 as t,B as o,o as p}from"./chunks/framework.CJakPlgM.js";const P=JSON.parse('{"title":"ConstraintModels.jl","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/40_constraint_models.md","filePath":"constraints/40_constraint_models.md","lastUpdated":null}'),k={name:"constraints/40_constraint_models.md"},d={class:"jldocstring custom-block",open:""},r={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},g={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.481ex",height:"1.136ex",role:"img",focusable:"false",viewBox:"0 -491 2422.4 502","aria-hidden":"true"},y={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},M={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""};function Q(w,s,L,I,S,J){const n=o("Badge");return p(),l("div",null,[s[59]||(s[59]=i("h1",{id:"constraintmodels-jl",tabindex:"-1"},[a("ConstraintModels.jl "),i("a",{class:"header-anchor",href:"#constraintmodels-jl","aria-label":'Permalink to "ConstraintModels.jl"'},"​")],-1)),s[60]||(s[60]=i("p",null,[a("Documentation for "),i("code",null,"ConstraintModels.jl"),a(".")],-1)),i("details",d,[i("summary",null,[s[0]||(s[0]=i("a",{id:"ConstraintModels.SudokuInstance",href:"#ConstraintModels.SudokuInstance"},[i("span",{class:"jlbinding"},"ConstraintModels.SudokuInstance")],-1)),s[1]||(s[1]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=t(`
julia
mutable struct SudokuInstance{T <: Integer} <: AbstractMatrix{T}

A struct for SudokuInstances, which is a subtype of AbstractMatrix.

julia
SudokuInstance(A::AbstractMatrix{T})
+SudokuInstance(::Type{T}, n::Int) # fill in blank sudoku of type T
+SudokuInstance(n::Int) # fill in blank sudoku of type Int
+SudokuInstance(::Type{T}) # fill in "standard" 9×9 sudoku of type T
+SudokuInstance() # fill in "standard" 9×9 sudoku of type Int
+SudokuInstance(n::Int, P::Pair{Tuple{Int, Int}, T}...) where {T <: Integer} # construct a sudoku given pairs of coordinates and values
+SudokuInstance(P::Pair{Tuple{Int, Int}, T}...) # again, default to 9×9 sudoku, constructing given pairs

Constructor functions for the SudokuInstance struct.

source

`,5))]),i("details",r,[i("summary",null,[s[3]||(s[3]=i("a",{id:"ConstraintModels.SudokuInstance-Tuple{Dictionaries.Dictionary}",href:"#ConstraintModels.SudokuInstance-Tuple{Dictionaries.Dictionary}"},[i("span",{class:"jlbinding"},"ConstraintModels.SudokuInstance")],-1)),s[4]||(s[4]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[5]||(s[5]=t('
julia
SudokuInstance(X::Dictionary)

Construct a SudokuInstance with the values X of a solver as input.

source

',3))]),i("details",u,[i("summary",null,[s[6]||(s[6]=i("a",{id:"Base.Multimedia.display-Tuple{Any, ConstraintModels.SudokuInstance}",href:"#Base.Multimedia.display-Tuple{Any, ConstraintModels.SudokuInstance}"},[i("span",{class:"jlbinding"},"Base.Multimedia.display")],-1)),s[7]||(s[7]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[12]||(s[12]=t(`
julia
display(io::IO, S::SudokuInstance)
+display(S::SudokuInstance) # default to stdout
`,1)),i("p",null,[s[10]||(s[10]=a("Displays an ")),i("mjx-container",g,[(p(),l("svg",c,s[8]||(s[8]=[t('',1)]))),s[9]||(s[9]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"n"),i("mo",null,"×"),i("mi",null,"n")])],-1))]),s[11]||(s[11]=a(" SudokuInstance."))]),s[13]||(s[13]=i("p",null,[i("a",{href:"https://github.com/JuliaConstraints/ConstraintModels.jl/blob/v0.3.0/src/sudoku.jl#L312-L318",target:"_blank",rel:"noreferrer"},"source")],-1))]),i("details",y,[i("summary",null,[s[14]||(s[14]=i("a",{id:"Base.Multimedia.display-Tuple{Any, Val{:sudoku}}",href:"#Base.Multimedia.display-Tuple{Any, Val{:sudoku}}"},[i("span",{class:"jlbinding"},"Base.Multimedia.display")],-1)),s[15]||(s[15]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[16]||(s[16]=t('
julia
Base.display(X, Val(:sudoku))

Extends Base.display to a sudoku configuration.

source

',3))]),i("details",C,[i("summary",null,[s[17]||(s[17]=i("a",{id:"Base.Multimedia.display-Tuple{ConstraintModels.SudokuInstance}",href:"#Base.Multimedia.display-Tuple{ConstraintModels.SudokuInstance}"},[i("span",{class:"jlbinding"},"Base.Multimedia.display")],-1)),s[18]||(s[18]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[19]||(s[19]=t('
julia
Base.display(S::SudokuInstance)

Extends Base.display to SudokuInstance.

source

',3))]),i("details",F,[i("summary",null,[s[20]||(s[20]=i("a",{id:"Base.Multimedia.display-Tuple{Dictionaries.Dictionary}",href:"#Base.Multimedia.display-Tuple{Dictionaries.Dictionary}"},[i("span",{class:"jlbinding"},"Base.Multimedia.display")],-1)),s[21]||(s[21]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[22]||(s[22]=t('
julia
Base.display(X::Dictionary)

Extends Base.display to a sudoku configuration.

source

',3))]),i("details",E,[i("summary",null,[s[23]||(s[23]=i("a",{id:"Base.size-Tuple{ConstraintModels.SudokuInstance}",href:"#Base.size-Tuple{ConstraintModels.SudokuInstance}"},[i("span",{class:"jlbinding"},"Base.size")],-1)),s[24]||(s[24]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[25]||(s[25]=t('
julia
Base.size(S::SudokuInstance)

Extends Base.size for SudokuInstance.

source

',3))]),i("details",m,[i("summary",null,[s[26]||(s[26]=i("a",{id:"ConstraintModels._format_line-Tuple{Any, Any}",href:"#ConstraintModels._format_line-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"ConstraintModels._format_line")],-1)),s[27]||(s[27]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[28]||(s[28]=t('
julia
_format_line(r, M)

Format line of a sudoku grid.

source

',3))]),i("details",b,[i("summary",null,[s[29]||(s[29]=i("a",{id:"ConstraintModels._format_line_segment-Tuple{Any, Any, Any}",href:"#ConstraintModels._format_line_segment-Tuple{Any, Any, Any}"},[i("span",{class:"jlbinding"},"ConstraintModels._format_line_segment")],-1)),s[30]||(s[30]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[31]||(s[31]=t('
julia
_format_line_segment(r, col_pos, M)

Format line segment of a sudoku grid.

source

',3))]),i("details",f,[i("summary",null,[s[32]||(s[32]=i("a",{id:"ConstraintModels._format_val-Tuple{Any}",href:"#ConstraintModels._format_val-Tuple{Any}"},[i("span",{class:"jlbinding"},"ConstraintModels._format_val")],-1)),s[33]||(s[33]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[34]||(s[34]=t('
julia
_format_val(a)

Format an integer a into a string for SudokuInstance.

source

',3))]),i("details",j,[i("summary",null,[s[35]||(s[35]=i("a",{id:"ConstraintModels._get_sep_line-Tuple{Any, Any, Any}",href:"#ConstraintModels._get_sep_line-Tuple{Any, Any, Any}"},[i("span",{class:"jlbinding"},"ConstraintModels._get_sep_line")],-1)),s[36]||(s[36]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[37]||(s[37]=t('
julia
_get_sep_line(s, pos_row, M)

Return a line separator.

source

',3))]),i("details",B,[i("summary",null,[s[38]||(s[38]=i("a",{id:"ConstraintModels.chemical_equilibrium-Tuple{Any, Any, Any}",href:"#ConstraintModels.chemical_equilibrium-Tuple{Any, Any, Any}"},[i("span",{class:"jlbinding"},"ConstraintModels.chemical_equilibrium")],-1)),s[39]||(s[39]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[40]||(s[40]=t('
julia
chemical_equilibrium(atoms_compounds, elements_weights, standard_free_energy; modeler = :JuMP)

Warning

Even the structure to model problems with continuous domains is available, the default solver is not yet equiped to solve such problems efficiently.

From Wikipedia

In a chemical reaction, chemical equilibrium is the state in which both the reactants and products are present in concentrations which have no further tendency to change with time, so that there is no observable change in the properties of the system. This state results when the forward reaction proceeds at the same rate as the reverse reaction. The reaction rates of the forward and backward reactions are generally not zero, but they are equal. Thus, there are no net changes in the concentrations of the reactants and products. Such a state is known as dynamic equilibrium.

source

',5))]),i("details",v,[i("summary",null,[s[41]||(s[41]=i("a",{id:"ConstraintModels.golomb",href:"#ConstraintModels.golomb"},[i("span",{class:"jlbinding"},"ConstraintModels.golomb")],-1)),s[42]||(s[42]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[43]||(s[43]=t('
julia
golomb(n, L=n²)

Model the Golomb problem of n marks on the ruler 0:L. The modeler argument accepts :raw, and :JuMP (default), which refer respectively to the solver internal model, the MathOptInterface model, and the JuMP model.

source

',3))]),i("details",M,[i("summary",null,[s[44]||(s[44]=i("a",{id:"ConstraintModels.magic_square-Tuple{Any}",href:"#ConstraintModels.magic_square-Tuple{Any}"},[i("span",{class:"jlbinding"},"ConstraintModels.magic_square")],-1)),s[45]||(s[45]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[46]||(s[46]=t('
julia
magic_square(n; modeler = :JuMP)

Create a model for the magic square problem of order n. The modeler argument accepts :JuMP (default), which refer to the solver the JuMP model.

source

',3))]),i("details",T,[i("summary",null,[s[47]||(s[47]=i("a",{id:"ConstraintModels.mincut-Tuple{Any}",href:"#ConstraintModels.mincut-Tuple{Any}"},[i("span",{class:"jlbinding"},"ConstraintModels.mincut")],-1)),s[48]||(s[48]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[49]||(s[49]=t('
julia
mincut(graph; source, sink, interdiction =0, modeler = :JuMP)

Compute the minimum cut of a graph.

Arguments:

  • graph: Any matrix <: AbstractMatrix that describes the capacities of the graph

  • source: Id of the source node; must be set

  • sink: Id of the sink node; must be set

  • interdiction: indicates the number of forbidden links

  • modeler: Default to :JuMP.

source

',5))]),i("details",A,[i("summary",null,[s[50]||(s[50]=i("a",{id:"ConstraintModels.n_queens-Tuple{Any}",href:"#ConstraintModels.n_queens-Tuple{Any}"},[i("span",{class:"jlbinding"},"ConstraintModels.n_queens")],-1)),s[51]||(s[51]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[52]||(s[52]=t('
julia
n_queens(n; modeler = :JuMP)

Create a model for the n-queens problem with n queens. The modeler argument accepts :JuMP (default), which refer to the JuMP model.

source

',3))]),i("details",D,[i("summary",null,[s[53]||(s[53]=i("a",{id:"ConstraintModels.qap-Tuple{Any, Any, Any}",href:"#ConstraintModels.qap-Tuple{Any, Any, Any}"},[i("span",{class:"jlbinding"},"ConstraintModels.qap")],-1)),s[54]||(s[54]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[55]||(s[55]=t('
julia
qap(n, weigths, distances; modeler = :JuMP)

Modelize an instance of the Quadractic Assignment Problem with

  • n: number of both facilities and locations

  • weights: Matrix of the weights of each pair of facilities

  • distances: Matrix of distances between locations

  • modeler: Default to :JuMP. No other modeler available for now.

From Wikipedia

There are a set of n facilities and a set of n locations. For each pair of locations, a distance is specified and for each pair of facilities a weight or flow is specified (e.g., the amount of supplies transported between the two facilities). The problem is to assign all facilities to different locations with the goal of minimizing the sum of the distances multiplied by the corresponding flows.

source

',6))]),i("details",x,[i("summary",null,[s[56]||(s[56]=i("a",{id:"ConstraintModels.sudoku-Tuple{Any}",href:"#ConstraintModels.sudoku-Tuple{Any}"},[i("span",{class:"jlbinding"},"ConstraintModels.sudoku")],-1)),s[57]||(s[57]=a()),e(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[58]||(s[58]=t(`
julia
sudoku(n; start= Dictionary{Int, Int}(), modeler = :JuMP)

Create a model for the sudoku problem of domain 1:n² with optional starting values. The modeler argument accepts :raw, :MOI, and :JuMP (default), which refer respectively to the solver internal model, the MathOptInterface model, and the JuMP model.

julia
# Construct a JuMP model \`m\` and its associated matrix \`grid\` for sudoku 9×9
+m, grid = sudoku(3)
+
+# Same with a starting instance
+instance = [
+    9  3  0  0  0  0  0  4  0
+    0  0  0  0  4  2  0  9  0
+    8  0  0  1  9  6  7  0  0
+    0  0  0  4  7  0  0  0  0
+    0  2  0  0  0  0  0  6  0
+    0  0  0  0  2  3  0  0  0
+    0  0  8  5  3  1  0  0  2
+    0  9  0  2  8  0  0  0  0
+    0  7  0  0  0  0  0  5  3
+]
+m, grid = sudoku(3, start = instance)
+
+# Run the solver
+optimize!(m)
+
+# Retrieve and display the values
+solution = value.(grid)
+display(solution, Val(:sudoku))

source

`,4))])])}const O=h(k,[["render",Q]]);export{P as __pageData,O as default}; diff --git a/dev/assets/constraints_40_constraint_models.md.qY8cIswx.js b/dev/assets/constraints_40_constraint_models.md.qY8cIswx.js deleted file mode 100644 index 8858c3a..0000000 --- a/dev/assets/constraints_40_constraint_models.md.qY8cIswx.js +++ /dev/null @@ -1,30 +0,0 @@ -import{_ as n,c as t,j as s,a as i,a7 as a,o as e}from"./chunks/framework.CBLuZwrP.js";const T=JSON.parse('{"title":"ConstraintModels.jl","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/40_constraint_models.md","filePath":"constraints/40_constraint_models.md","lastUpdated":null}'),l={name:"constraints/40_constraint_models.md"},h=a(`

ConstraintModels.jl

Documentation for ConstraintModels.jl.

# ConstraintModels.SudokuInstanceType.
julia
mutable struct SudokuInstance{T <: Integer} <: AbstractMatrix{T}

A struct for SudokuInstances, which is a subtype of AbstractMatrix.

julia
SudokuInstance(A::AbstractMatrix{T})
-SudokuInstance(::Type{T}, n::Int) # fill in blank sudoku of type T
-SudokuInstance(n::Int) # fill in blank sudoku of type Int
-SudokuInstance(::Type{T}) # fill in "standard" 9×9 sudoku of type T
-SudokuInstance() # fill in "standard" 9×9 sudoku of type Int
-SudokuInstance(n::Int, P::Pair{Tuple{Int, Int}, T}...) where {T <: Integer} # construct a sudoku given pairs of coordinates and values
-SudokuInstance(P::Pair{Tuple{Int, Int}, T}...) # again, default to 9×9 sudoku, constructing given pairs

Constructor functions for the SudokuInstance struct.

source


# ConstraintModels.SudokuInstanceMethod.
julia
SudokuInstance(X::Dictionary)

Construct a SudokuInstance with the values X of a solver as input.

source


`,6),p={style:{"border-width":"1px","border-style":"solid","border-color":"black",padding:"1em","border-radius":"25px"}},r=s("a",{id:"Base.Multimedia.display-Tuple{Any, ConstraintModels.SudokuInstance}",href:"#Base.Multimedia.display-Tuple{Any, ConstraintModels.SudokuInstance}"},"#",-1),d=s("b",null,[s("u",null,"Base.Multimedia.display")],-1),o=s("i",null,"Method",-1),k=a(`
julia
display(io::IO, S::SudokuInstance)
-display(S::SudokuInstance) # default to stdout
`,1),c={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.481ex",height:"1.136ex",role:"img",focusable:"false",viewBox:"0 -491 2422.4 502","aria-hidden":"true"},g=a('',1),y=[g],C=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"n"),s("mo",null,"×"),s("mi",null,"n")])],-1),b=s("p",null,[s("a",{href:"https://github.com/JuliaConstraints/ConstraintModels.jl/blob/v0.3.0/src/sudoku.jl#L312-L318",target:"_blank",rel:"noreferrer"},"source")],-1),F=a(`
# Base.Multimedia.displayMethod.
julia
Base.display(X, Val(:sudoku))

Extends Base.display to a sudoku configuration.

source


# Base.Multimedia.displayMethod.
julia
Base.display(S::SudokuInstance)

Extends Base.display to SudokuInstance.

source


# Base.Multimedia.displayMethod.
julia
Base.display(X::Dictionary)

Extends Base.display to a sudoku configuration.

source


# Base.sizeMethod.
julia
Base.size(S::SudokuInstance)

Extends Base.size for SudokuInstance.

source


# ConstraintModels._format_lineMethod.
julia
_format_line(r, M)

Format line of a sudoku grid.

source


# ConstraintModels._format_line_segmentMethod.
julia
_format_line_segment(r, col_pos, M)

Format line segment of a sudoku grid.

source


# ConstraintModels._format_valMethod.
julia
_format_val(a)

Format an integer a into a string for SudokuInstance.

source


# ConstraintModels._get_sep_lineMethod.
julia
_get_sep_line(s, pos_row, M)

Return a line separator.

source


# ConstraintModels.chemical_equilibriumMethod.
julia
chemical_equilibrium(atoms_compounds, elements_weights, standard_free_energy; modeler = :JuMP)

Warning

Even the structure to model problems with continuous domains is available, the default solver is not yet equiped to solve such problems efficiently.

From Wikipedia

In a chemical reaction, chemical equilibrium is the state in which both the reactants and products are present in concentrations which have no further tendency to change with time, so that there is no observable change in the properties of the system. This state results when the forward reaction proceeds at the same rate as the reverse reaction. The reaction rates of the forward and backward reactions are generally not zero, but they are equal. Thus, there are no net changes in the concentrations of the reactants and products. Such a state is known as dynamic equilibrium.

source


# ConstraintModels.golombFunction.
julia
golomb(n, L=n²)

Model the Golomb problem of n marks on the ruler 0:L. The modeler argument accepts :raw, and :JuMP (default), which refer respectively to the solver internal model, the MathOptInterface model, and the JuMP model.

source


# ConstraintModels.magic_squareMethod.
julia
magic_square(n; modeler = :JuMP)

Create a model for the magic square problem of order n. The modeler argument accepts :JuMP (default), which refer to the solver the JuMP model.

source


# ConstraintModels.mincutMethod.
julia
mincut(graph; source, sink, interdiction =0, modeler = :JuMP)

Compute the minimum cut of a graph.

Arguments:

  • graph: Any matrix <: AbstractMatrix that describes the capacities of the graph

  • source: Id of the source node; must be set

  • sink: Id of the sink node; must be set

  • interdiction: indicates the number of forbidden links

  • modeler: Default to :JuMP.

source


# ConstraintModels.n_queensMethod.
julia
n_queens(n; modeler = :JuMP)

Create a model for the n-queens problem with n queens. The modeler argument accepts :JuMP (default), which refer to the JuMP model.

source


# ConstraintModels.qapMethod.
julia
qap(n, weigths, distances; modeler = :JuMP)

Modelize an instance of the Quadractic Assignment Problem with

  • n: number of both facilities and locations

  • weights: Matrix of the weights of each pair of facilities

  • distances: Matrix of distances between locations

  • modeler: Default to :JuMP. No other modeler available for now.

From Wikipedia

There are a set of n facilities and a set of n locations. For each pair of locations, a distance is specified and for each pair of facilities a weight or flow is specified (e.g., the amount of supplies transported between the two facilities). The problem is to assign all facilities to different locations with the goal of minimizing the sum of the distances multiplied by the corresponding flows.

source


# ConstraintModels.sudokuMethod.
julia
sudoku(n; start= Dictionary{Int, Int}(), modeler = :JuMP)

Create a model for the sudoku problem of domain 1:n² with optional starting values. The modeler argument accepts :raw, :MOI, and :JuMP (default), which refer respectively to the solver internal model, the MathOptInterface model, and the JuMP model.

julia
# Construct a JuMP model \`m\` and its associated matrix \`grid\` for sudoku 9×9
-m, grid = sudoku(3)
-
-# Same with a starting instance
-instance = [
-    9  3  0  0  0  0  0  4  0
-    0  0  0  0  4  2  0  9  0
-    8  0  0  1  9  6  7  0  0
-    0  0  0  4  7  0  0  0  0
-    0  2  0  0  0  0  0  6  0
-    0  0  0  0  2  3  0  0  0
-    0  0  8  5  3  1  0  0  2
-    0  9  0  2  8  0  0  0  0
-    0  7  0  0  0  0  0  5  3
-]
-m, grid = sudoku(3, start = instance)
-
-# Run the solver
-optimize!(m)
-
-# Retrieve and display the values
-solution = value.(grid)
-display(solution, Val(:sudoku))

source


`,31);function E(m,v,_,B,f,M){return e(),t("div",null,[h,s("div",p,[r,i(" "),d,i(" — "),o,i(". "),k,s("p",null,[i("Displays an "),s("mjx-container",c,[(e(),t("svg",u,y)),C]),i(" SudokuInstance.")]),b]),F])}const x=n(l,[["render",E]]);export{T as __pageData,x as default}; diff --git a/dev/assets/constraints_40_constraint_models.md.qY8cIswx.lean.js b/dev/assets/constraints_40_constraint_models.md.qY8cIswx.lean.js deleted file mode 100644 index b7345f4..0000000 --- a/dev/assets/constraints_40_constraint_models.md.qY8cIswx.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as n,c as t,j as s,a as i,a7 as a,o as e}from"./chunks/framework.CBLuZwrP.js";const T=JSON.parse('{"title":"ConstraintModels.jl","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/40_constraint_models.md","filePath":"constraints/40_constraint_models.md","lastUpdated":null}'),l={name:"constraints/40_constraint_models.md"},h=a("",6),p={style:{"border-width":"1px","border-style":"solid","border-color":"black",padding:"1em","border-radius":"25px"}},r=s("a",{id:"Base.Multimedia.display-Tuple{Any, ConstraintModels.SudokuInstance}",href:"#Base.Multimedia.display-Tuple{Any, ConstraintModels.SudokuInstance}"},"#",-1),d=s("b",null,[s("u",null,"Base.Multimedia.display")],-1),o=s("i",null,"Method",-1),k=a("",1),c={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.481ex",height:"1.136ex",role:"img",focusable:"false",viewBox:"0 -491 2422.4 502","aria-hidden":"true"},g=a("",1),y=[g],C=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"n"),s("mo",null,"×"),s("mi",null,"n")])],-1),b=s("p",null,[s("a",{href:"https://github.com/JuliaConstraints/ConstraintModels.jl/blob/v0.3.0/src/sudoku.jl#L312-L318",target:"_blank",rel:"noreferrer"},"source")],-1),F=a("",31);function E(m,v,_,B,f,M){return e(),t("div",null,[h,s("div",p,[r,i(" "),d,i(" — "),o,i(". "),k,s("p",null,[i("Displays an "),s("mjx-container",c,[(e(),t("svg",u,y)),C]),i(" SudokuInstance.")]),b]),F])}const x=n(l,[["render",E]]);export{T as __pageData,x as default}; diff --git a/dev/assets/constraints_60_constraint_commons.md.CTOeYxK8.js b/dev/assets/constraints_60_constraint_commons.md.CTOeYxK8.js new file mode 100644 index 0000000..aa90dab --- /dev/null +++ b/dev/assets/constraints_60_constraint_commons.md.CTOeYxK8.js @@ -0,0 +1,10 @@ +import{_ as o,c as l,a5 as i,j as t,a as n,G as e,B as r,o as p}from"./chunks/framework.CJakPlgM.js";const T=JSON.parse('{"title":"ConstraintCommons.jl","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/60_constraint_commons.md","filePath":"constraints/60_constraint_commons.md","lastUpdated":null}'),h={name:"constraints/60_constraint_commons.md"},c={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""};function A(x,s,_,D,B,w){const a=r("Badge");return p(),l("div",null,[s[42]||(s[42]=i('

ConstraintCommons.jl

ConstraintCommons.jl is an essential package within the Julia Constraints ecosystem designed to facilitate the development and interoperability of constraint programming solutions in Julia. It serves as a foundational layer that provides shared structures, abstract types, functions, and generic methods utilized by both basic feature packages and learning-oriented packages.

Only advanced users or package developers are likely to use it. The package covers parameters, (regular) languages, Core or Base methods extensions, sampling, extrema, and dictionaries.

Parameters

This section of the package list or extract parameters based on the XCSP3-core specifications. Note that, for the foreseeable future, the default constraints specification will follow these specifications.

',5)),t("details",c,[t("summary",null,[s[0]||(s[0]=t("a",{id:"ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS-constraints-60_constraint_commons",href:"#ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS")],-1)),s[1]||(s[1]=n()),e(a,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[2]||(s[2]=i(`
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
+    :bool, # boolean parameter
+    :dim, # dimension, an integer parameter used along the pair_vars or vals parameters
+    :id, # index to target one variable in the input vector
+    :language, # describe a regular language such as an automaton or a MDD
+    :op, # an operator such as comparison or arithmetic operator
+    :pair_vars, # a list of parameters that are paired with each variable in the input vector
+    :val, # one scalar value
+    :vals, # a list of scalar values (independent of the input vector size)
+]

source

`,4))]),t("details",d,[t("summary",null,[s[3]||(s[3]=t("a",{id:"ConstraintCommons.extract_parameters-constraints-60_constraint_commons",href:"#ConstraintCommons.extract_parameters-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.extract_parameters")],-1)),s[4]||(s[4]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=i('
julia
extract_parameters(m::Union{Method, Function}; parameters)

Extracts the intersection between the kargs of m and parameters (defaults to USUAL_CONSTRAINT_PARAMETERS).

source

julia
extract_parameters(s::Symbol, constraints_dict=USUAL_CONSTRAINTS; parameters=ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS)

Return the parameters of the constraint s in constraints_dict.

Arguments

  • s::Symbol: the constraint name.

  • constraints_dict::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

  • parameters::Vector{Symbol}: vector of parameters. Default is ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS.

Example

julia
extract_parameters(:all_different)

source

',10))]),s[43]||(s[43]=i('

Performances

Bench Evolution ParametersChair Evolution Parameters

Languages

XCSP3 considers two kinds of structure to recognize languages as core constraints: Automata, Multivalued Decision Diagrams (MMDs).

',4)),t("details",m,[t("summary",null,[s[6]||(s[6]=t("a",{id:"ConstraintCommons.AbstractMultivaluedDecisionDiagram-constraints-60_constraint_commons",href:"#ConstraintCommons.AbstractMultivaluedDecisionDiagram-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.AbstractMultivaluedDecisionDiagram")],-1)),s[7]||(s[7]=n()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[8]||(s[8]=i('
julia
AbstractMultivaluedDecisionDiagram

An abstract interface for Multivalued Decision Diagrams (MDD) used in Julia Constraints packages. Requirements:

  • accept(a<:AbstractMultivaluedDecisionDiagram, word): return true if a accepts word.

source

',4))]),t("details",u,[t("summary",null,[s[9]||(s[9]=t("a",{id:"ConstraintCommons.MDD-constraints-60_constraint_commons",href:"#ConstraintCommons.MDD-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.MDD")],-1)),s[10]||(s[10]=n()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[11]||(s[11]=i('
julia
MDD{S,T} <: AbstractMultivaluedDecisionDiagram

A minimal implementation of a multivalued decision diagram structure.

source

',3))]),t("details",k,[t("summary",null,[s[12]||(s[12]=t("a",{id:"ConstraintCommons.AbstractAutomaton-constraints-60_constraint_commons",href:"#ConstraintCommons.AbstractAutomaton-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.AbstractAutomaton")],-1)),s[13]||(s[13]=n()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[14]||(s[14]=i('
julia
AbstractAutomaton

An abstract interface for automata used in Julia Constraints packages. Requirements:

  • accept(a<:AbstractAutomaton, word): return true if a accepts word.

source

',4))]),t("details",g,[t("summary",null,[s[15]||(s[15]=t("a",{id:"ConstraintCommons.Automaton-constraints-60_constraint_commons",href:"#ConstraintCommons.Automaton-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.Automaton")],-1)),s[16]||(s[16]=n()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[17]||(s[17]=i('
julia
Automaton{S, T, F <: Union{S, Vector{S}, Set{S}}} <: AbstractAutomaton

A minimal implementation of a deterministic automaton structure.

source

',3))]),t("details",b,[t("summary",null,[s[18]||(s[18]=t("a",{id:"ConstraintCommons.accept-constraints-60_constraint_commons",href:"#ConstraintCommons.accept-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.accept")],-1)),s[19]||(s[19]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[20]||(s[20]=i('
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

',6))]),t("details",C,[t("summary",null,[s[21]||(s[21]=t("a",{id:"ConstraintCommons.at_end-constraints-60_constraint_commons",href:"#ConstraintCommons.at_end-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.at_end")],-1)),s[22]||(s[22]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[23]||(s[23]=i('
julia
at_end(a::Automaton, s)

Internal method used by accept with Automaton.

source

',3))]),s[44]||(s[44]=i('

Performances

Bench Evolution Automata
Chair Evolution Automata
Bench Evolution Diagrams
Chair Evolution Diagrams

Extensions

We extend some operations for Nothing and Symbol.

',4)),t("details",y,[t("summary",null,[s[24]||(s[24]=t("a",{id:"ConstraintCommons.symcon-constraints-60_constraint_commons",href:"#ConstraintCommons.symcon-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.symcon")],-1)),s[25]||(s[25]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=i('
julia
symcon(s1::Symbol, s2::Symbol, connector::AbstractString="_")

Extends * to Symbols multiplication by connecting the symbols by an _.

source

',3))]),t("details",E,[t("summary",null,[s[27]||(s[27]=t("a",{id:"ConstraintCommons.consin-constraints-60_constraint_commons",href:"#ConstraintCommons.consin-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.consin")],-1)),s[28]||(s[28]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[29]||(s[29]=i('
julia
consin(::Any, ::Nothing)

Extends Base.in (or ) when the set is nothing. Returns false.

source

',3))]),t("details",v,[t("summary",null,[s[30]||(s[30]=t("a",{id:"ConstraintCommons.consisempty-constraints-60_constraint_commons",href:"#ConstraintCommons.consisempty-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.consisempty")],-1)),s[31]||(s[31]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[32]||(s[32]=i('
julia
consisempty(::Nothing)

Extends Base.isempty when the set is nothing. Returns true.

source

',3))]),s[45]||(s[45]=i('

Performances

Bench Evolution Nothing
Chair Evolution Nothing
Bench Evolution Symbols
Chair Evolution Symbols

Sampling

During our constraint learning processes, we use sampling to efficiently make partial exploration of search spaces. The following are some examples of sampling utilities.

',4)),t("details",f,[t("summary",null,[s[33]||(s[33]=t("a",{id:"ConstraintCommons.oversample-constraints-60_constraint_commons",href:"#ConstraintCommons.oversample-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.oversample")],-1)),s[34]||(s[34]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[35]||(s[35]=i('
julia
oversample(X, f)

Oversample elements of X until the boolean function f has as many true and false configurations.

source

',3))]),s[46]||(s[46]=i('

Performances

Bench EvolutionChair Evolution

Extrema

We need to compute the difference between extrema of various kind of collections in several situations.

',4)),t("details",j,[t("summary",null,[s[36]||(s[36]=t("a",{id:"ConstraintCommons.δ_extrema-constraints-60_constraint_commons",href:"#ConstraintCommons.δ_extrema-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.δ_extrema")],-1)),s[37]||(s[37]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[38]||(s[38]=i('
julia
δ_extrema(X...)

Compute both the difference between the maximum and the minimum of over all the collections of X.

source

',3))]),s[47]||(s[47]=i('

Performances

Bench EvolutionChair Evolution

Dictionaries

We provide the ever-useful incsert! function for dictionaries.

',4)),t("details",F,[t("summary",null,[s[39]||(s[39]=t("a",{id:"ConstraintCommons.incsert!-constraints-60_constraint_commons",href:"#ConstraintCommons.incsert!-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.incsert!")],-1)),s[40]||(s[40]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[41]||(s[41]=i('
julia
incsert!(d::Union{AbstractDict, AbstractDictionary}, ind, val = 1)

Increase or insert a counter in a dictionary-based collection. The counter insertion defaults to val = 1.

source

',3))]),s[48]||(s[48]=i('

Performances

Bench EvolutionChair Evolution
',2))])}const S=o(h,[["render",A]]);export{T as __pageData,S as default}; diff --git a/dev/assets/constraints_60_constraint_commons.md.CTOeYxK8.lean.js b/dev/assets/constraints_60_constraint_commons.md.CTOeYxK8.lean.js new file mode 100644 index 0000000..aa90dab --- /dev/null +++ b/dev/assets/constraints_60_constraint_commons.md.CTOeYxK8.lean.js @@ -0,0 +1,10 @@ +import{_ as o,c as l,a5 as i,j as t,a as n,G as e,B as r,o as p}from"./chunks/framework.CJakPlgM.js";const T=JSON.parse('{"title":"ConstraintCommons.jl","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/60_constraint_commons.md","filePath":"constraints/60_constraint_commons.md","lastUpdated":null}'),h={name:"constraints/60_constraint_commons.md"},c={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""};function A(x,s,_,D,B,w){const a=r("Badge");return p(),l("div",null,[s[42]||(s[42]=i('

ConstraintCommons.jl

ConstraintCommons.jl is an essential package within the Julia Constraints ecosystem designed to facilitate the development and interoperability of constraint programming solutions in Julia. It serves as a foundational layer that provides shared structures, abstract types, functions, and generic methods utilized by both basic feature packages and learning-oriented packages.

Only advanced users or package developers are likely to use it. The package covers parameters, (regular) languages, Core or Base methods extensions, sampling, extrema, and dictionaries.

Parameters

This section of the package list or extract parameters based on the XCSP3-core specifications. Note that, for the foreseeable future, the default constraints specification will follow these specifications.

',5)),t("details",c,[t("summary",null,[s[0]||(s[0]=t("a",{id:"ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS-constraints-60_constraint_commons",href:"#ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS")],-1)),s[1]||(s[1]=n()),e(a,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[2]||(s[2]=i(`
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
+    :bool, # boolean parameter
+    :dim, # dimension, an integer parameter used along the pair_vars or vals parameters
+    :id, # index to target one variable in the input vector
+    :language, # describe a regular language such as an automaton or a MDD
+    :op, # an operator such as comparison or arithmetic operator
+    :pair_vars, # a list of parameters that are paired with each variable in the input vector
+    :val, # one scalar value
+    :vals, # a list of scalar values (independent of the input vector size)
+]

source

`,4))]),t("details",d,[t("summary",null,[s[3]||(s[3]=t("a",{id:"ConstraintCommons.extract_parameters-constraints-60_constraint_commons",href:"#ConstraintCommons.extract_parameters-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.extract_parameters")],-1)),s[4]||(s[4]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=i('
julia
extract_parameters(m::Union{Method, Function}; parameters)

Extracts the intersection between the kargs of m and parameters (defaults to USUAL_CONSTRAINT_PARAMETERS).

source

julia
extract_parameters(s::Symbol, constraints_dict=USUAL_CONSTRAINTS; parameters=ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS)

Return the parameters of the constraint s in constraints_dict.

Arguments

  • s::Symbol: the constraint name.

  • constraints_dict::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

  • parameters::Vector{Symbol}: vector of parameters. Default is ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS.

Example

julia
extract_parameters(:all_different)

source

',10))]),s[43]||(s[43]=i('

Performances

Bench Evolution ParametersChair Evolution Parameters

Languages

XCSP3 considers two kinds of structure to recognize languages as core constraints: Automata, Multivalued Decision Diagrams (MMDs).

',4)),t("details",m,[t("summary",null,[s[6]||(s[6]=t("a",{id:"ConstraintCommons.AbstractMultivaluedDecisionDiagram-constraints-60_constraint_commons",href:"#ConstraintCommons.AbstractMultivaluedDecisionDiagram-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.AbstractMultivaluedDecisionDiagram")],-1)),s[7]||(s[7]=n()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[8]||(s[8]=i('
julia
AbstractMultivaluedDecisionDiagram

An abstract interface for Multivalued Decision Diagrams (MDD) used in Julia Constraints packages. Requirements:

  • accept(a<:AbstractMultivaluedDecisionDiagram, word): return true if a accepts word.

source

',4))]),t("details",u,[t("summary",null,[s[9]||(s[9]=t("a",{id:"ConstraintCommons.MDD-constraints-60_constraint_commons",href:"#ConstraintCommons.MDD-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.MDD")],-1)),s[10]||(s[10]=n()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[11]||(s[11]=i('
julia
MDD{S,T} <: AbstractMultivaluedDecisionDiagram

A minimal implementation of a multivalued decision diagram structure.

source

',3))]),t("details",k,[t("summary",null,[s[12]||(s[12]=t("a",{id:"ConstraintCommons.AbstractAutomaton-constraints-60_constraint_commons",href:"#ConstraintCommons.AbstractAutomaton-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.AbstractAutomaton")],-1)),s[13]||(s[13]=n()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[14]||(s[14]=i('
julia
AbstractAutomaton

An abstract interface for automata used in Julia Constraints packages. Requirements:

  • accept(a<:AbstractAutomaton, word): return true if a accepts word.

source

',4))]),t("details",g,[t("summary",null,[s[15]||(s[15]=t("a",{id:"ConstraintCommons.Automaton-constraints-60_constraint_commons",href:"#ConstraintCommons.Automaton-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.Automaton")],-1)),s[16]||(s[16]=n()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[17]||(s[17]=i('
julia
Automaton{S, T, F <: Union{S, Vector{S}, Set{S}}} <: AbstractAutomaton

A minimal implementation of a deterministic automaton structure.

source

',3))]),t("details",b,[t("summary",null,[s[18]||(s[18]=t("a",{id:"ConstraintCommons.accept-constraints-60_constraint_commons",href:"#ConstraintCommons.accept-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.accept")],-1)),s[19]||(s[19]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[20]||(s[20]=i('
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

',6))]),t("details",C,[t("summary",null,[s[21]||(s[21]=t("a",{id:"ConstraintCommons.at_end-constraints-60_constraint_commons",href:"#ConstraintCommons.at_end-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.at_end")],-1)),s[22]||(s[22]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[23]||(s[23]=i('
julia
at_end(a::Automaton, s)

Internal method used by accept with Automaton.

source

',3))]),s[44]||(s[44]=i('

Performances

Bench Evolution Automata
Chair Evolution Automata
Bench Evolution Diagrams
Chair Evolution Diagrams

Extensions

We extend some operations for Nothing and Symbol.

',4)),t("details",y,[t("summary",null,[s[24]||(s[24]=t("a",{id:"ConstraintCommons.symcon-constraints-60_constraint_commons",href:"#ConstraintCommons.symcon-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.symcon")],-1)),s[25]||(s[25]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=i('
julia
symcon(s1::Symbol, s2::Symbol, connector::AbstractString="_")

Extends * to Symbols multiplication by connecting the symbols by an _.

source

',3))]),t("details",E,[t("summary",null,[s[27]||(s[27]=t("a",{id:"ConstraintCommons.consin-constraints-60_constraint_commons",href:"#ConstraintCommons.consin-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.consin")],-1)),s[28]||(s[28]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[29]||(s[29]=i('
julia
consin(::Any, ::Nothing)

Extends Base.in (or ) when the set is nothing. Returns false.

source

',3))]),t("details",v,[t("summary",null,[s[30]||(s[30]=t("a",{id:"ConstraintCommons.consisempty-constraints-60_constraint_commons",href:"#ConstraintCommons.consisempty-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.consisempty")],-1)),s[31]||(s[31]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[32]||(s[32]=i('
julia
consisempty(::Nothing)

Extends Base.isempty when the set is nothing. Returns true.

source

',3))]),s[45]||(s[45]=i('

Performances

Bench Evolution Nothing
Chair Evolution Nothing
Bench Evolution Symbols
Chair Evolution Symbols

Sampling

During our constraint learning processes, we use sampling to efficiently make partial exploration of search spaces. The following are some examples of sampling utilities.

',4)),t("details",f,[t("summary",null,[s[33]||(s[33]=t("a",{id:"ConstraintCommons.oversample-constraints-60_constraint_commons",href:"#ConstraintCommons.oversample-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.oversample")],-1)),s[34]||(s[34]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[35]||(s[35]=i('
julia
oversample(X, f)

Oversample elements of X until the boolean function f has as many true and false configurations.

source

',3))]),s[46]||(s[46]=i('

Performances

Bench EvolutionChair Evolution

Extrema

We need to compute the difference between extrema of various kind of collections in several situations.

',4)),t("details",j,[t("summary",null,[s[36]||(s[36]=t("a",{id:"ConstraintCommons.δ_extrema-constraints-60_constraint_commons",href:"#ConstraintCommons.δ_extrema-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.δ_extrema")],-1)),s[37]||(s[37]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[38]||(s[38]=i('
julia
δ_extrema(X...)

Compute both the difference between the maximum and the minimum of over all the collections of X.

source

',3))]),s[47]||(s[47]=i('

Performances

Bench EvolutionChair Evolution

Dictionaries

We provide the ever-useful incsert! function for dictionaries.

',4)),t("details",F,[t("summary",null,[s[39]||(s[39]=t("a",{id:"ConstraintCommons.incsert!-constraints-60_constraint_commons",href:"#ConstraintCommons.incsert!-constraints-60_constraint_commons"},[t("span",{class:"jlbinding"},"ConstraintCommons.incsert!")],-1)),s[40]||(s[40]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[41]||(s[41]=i('
julia
incsert!(d::Union{AbstractDict, AbstractDictionary}, ind, val = 1)

Increase or insert a counter in a dictionary-based collection. The counter insertion defaults to val = 1.

source

',3))]),s[48]||(s[48]=i('

Performances

Bench EvolutionChair Evolution
',2))])}const S=o(h,[["render",A]]);export{T as __pageData,S as default}; diff --git a/dev/assets/constraints_60_constraint_commons.md.CeqfEZxo.js b/dev/assets/constraints_60_constraint_commons.md.CeqfEZxo.js deleted file mode 100644 index 5a76187..0000000 --- a/dev/assets/constraints_60_constraint_commons.md.CeqfEZxo.js +++ /dev/null @@ -1,10 +0,0 @@ -import{_ as s,c as a,o as i,a7 as t}from"./chunks/framework.CBLuZwrP.js";const k=JSON.parse('{"title":"ConstraintCommons.jl","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/60_constraint_commons.md","filePath":"constraints/60_constraint_commons.md","lastUpdated":null}'),n={name:"constraints/60_constraint_commons.md"},e=t(`

ConstraintCommons.jl

ConstraintCommons.jl is an essential package within the Julia Constraints ecosystem designed to facilitate the development and interoperability of constraint programming solutions in Julia. It serves as a foundational layer that provides shared structures, abstract types, functions, and generic methods utilized by both basic feature packages and learning-oriented packages.

Only advanced users or package developers are likely to use it. The package covers parameters, (regular) languages, Core or Base methods extensions, sampling, extrema, and dictionaries.

Parameters

This section of the package list or extract parameters based on the XCSP3-core specifications. Note that, for the foreseeable future, the default constraints specification will follow these specifications.

# ConstraintCommons.USUAL_CONSTRAINT_PARAMETERSConstant.
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
-    :bool, # boolean parameter
-    :dim, # dimension, an integer parameter used along the pair_vars or vals parameters
-    :id, # index to target one variable in the input vector
-    :language, # describe a regular language such as an automaton or a MDD
-    :op, # an operator such as comparison or arithmetic operator
-    :pair_vars, # a list of parameters that are paired with each variable in the input vector
-    :val, # one scalar value
-    :vals, # a list of scalar values (independent of the input vector size)
-]

source


# ConstraintCommons.extract_parametersFunction.
julia
extract_parameters(m::Union{Method, Function}; parameters)

Extracts the intersection between the kargs of m and parameters (defaults to USUAL_CONSTRAINT_PARAMETERS).

source

julia
extract_parameters(s::Symbol, constraints_dict=USUAL_CONSTRAINTS; parameters=ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS)

Return the parameters of the constraint s in constraints_dict.

Arguments

  • s::Symbol: the constraint name.

  • constraints_dict::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

  • parameters::Vector{Symbol}: vector of parameters. Default is ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS.

Example

julia
extract_parameters(:all_different)

source


Performances

Bench Evolution ParametersChair Evolution Parameters

Languages

XCSP3 considers two kinds of structure to recognize languages as core constraints: Automata, Multivalued Decision Diagrams (MMDs).

# ConstraintCommons.AbstractMultivaluedDecisionDiagramType.
julia
AbstractMultivaluedDecisionDiagram

An abstract interface for Multivalued Decision Diagrams (MDD) used in Julia Constraints packages. Requirements:

  • accept(a<:AbstractMultivaluedDecisionDiagram, word): return true if a accepts word.

source


# ConstraintCommons.MDDType.
julia
MDD{S,T} <: AbstractMultivaluedDecisionDiagram

A minimal implementation of a multivalued decision diagram structure.

source


# ConstraintCommons.AbstractAutomatonType.
julia
AbstractAutomaton

An abstract interface for automata used in Julia Constraints packages. Requirements:

  • accept(a<:AbstractAutomaton, word): return true if a accepts word.

source


# ConstraintCommons.AutomatonType.
julia
Automaton{S, T, F <: Union{S, Vector{S}, Set{S}}} <: AbstractAutomaton

A minimal implementation of a deterministic automaton structure.

source


# ConstraintCommons.acceptFunction.
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source


# ConstraintCommons.at_endFunction.
julia
at_end(a::Automaton, s)

Internal method used by accept with Automaton.

source


Performances

Bench Evolution Automata
Chair Evolution Automata
Bench Evolution Diagrams
Chair Evolution Diagrams

Extensions

We extend some operations for Nothing and Symbol.

# ConstraintCommons.symconFunction.
julia
symcon(s1::Symbol, s2::Symbol, connector::AbstractString="_")

Extends * to Symbols multiplication by connecting the symbols by an _.

source


# ConstraintCommons.consinFunction.
julia
consin(::Any, ::Nothing)

Extends Base.in (or ) when the set is nothing. Returns false.

source


# ConstraintCommons.consisemptyFunction.
julia
consisempty(::Nothing)

Extends Base.isempty when the set is nothing. Returns true.

source


Performances

Bench Evolution Nothing
Chair Evolution Nothing
Bench Evolution Symbols
Chair Evolution Symbols

Sampling

During our constraint learning processes, we use sampling to efficiently make partial exploration of search spaces. The following are some examples of sampling utilities.

# ConstraintCommons.oversampleFunction.
julia
oversample(X, f)

Oversample elements of X until the boolean function f has as many true and false configurations.

source


Performances

Bench EvolutionChair Evolution

Extrema

We need to compute the difference between extrema of various kind of collections in several situations.

# ConstraintCommons.δ_extremaFunction.
julia
δ_extrema(X...)

Compute both the difference between the maximum and the minimum of over all the collections of X.

source


Performances

Bench EvolutionChair Evolution

Dictionaries

We provide the ever-useful incsert! function for dictionaries.

# ConstraintCommons.incsert!Function.
julia
incsert!(d::Union{AbstractDict, AbstractDictionary}, ind, val = 1)

Increase or insert a counter in a dictionary-based collection. The counter insertion defaults to val = 1.

source


Performances

Bench EvolutionChair Evolution
`,55),o=[e];function r(l,h,c,p,d,m){return i(),a("div",null,o)}const g=s(n,[["render",r]]);export{k as __pageData,g as default}; diff --git a/dev/assets/constraints_60_constraint_commons.md.CeqfEZxo.lean.js b/dev/assets/constraints_60_constraint_commons.md.CeqfEZxo.lean.js deleted file mode 100644 index ba804ef..0000000 --- a/dev/assets/constraints_60_constraint_commons.md.CeqfEZxo.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,c as a,o as i,a7 as t}from"./chunks/framework.CBLuZwrP.js";const k=JSON.parse('{"title":"ConstraintCommons.jl","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/60_constraint_commons.md","filePath":"constraints/60_constraint_commons.md","lastUpdated":null}'),n={name:"constraints/60_constraint_commons.md"},e=t("",55),o=[e];function r(l,h,c,p,d,m){return i(),a("div",null,o)}const g=s(n,[["render",r]]);export{k as __pageData,g as default}; diff --git a/dev/assets/constraints_61_constraint_domains.md.BIH3fSw6.js b/dev/assets/constraints_61_constraint_domains.md.BIH3fSw6.js new file mode 100644 index 0000000..649ce35 --- /dev/null +++ b/dev/assets/constraints_61_constraint_domains.md.BIH3fSw6.js @@ -0,0 +1,31 @@ +import{_ as l,c as p,j as i,a,G as e,a5 as t,B as o,o as h}from"./chunks/framework.CJakPlgM.js";const Cs=JSON.parse('{"title":"ConstraintDomains.jl: Defining Variables and Exploring Domains","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/61_constraint_domains.md","filePath":"constraints/61_constraint_domains.md","lastUpdated":null}'),r={name:"constraints/61_constraint_domains.md"},k={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},L={class:"jldocstring custom-block",open:""},_={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},J={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""},I={class:"jldocstring custom-block",open:""},P={class:"jldocstring custom-block",open:""},O={class:"jldocstring custom-block",open:""},R={class:"jldocstring custom-block",open:""},S={class:"jldocstring custom-block",open:""},V={class:"jldocstring custom-block",open:""},z={class:"jldocstring custom-block",open:""},q={class:"jldocstring custom-block",open:""},N={class:"jldocstring custom-block",open:""},U={class:"jldocstring custom-block",open:""},M={class:"jldocstring custom-block",open:""},G={class:"jldocstring custom-block",open:""},$={class:"jldocstring custom-block",open:""},H={class:"jldocstring custom-block",open:""},K={class:"jldocstring custom-block",open:""},Q={class:"jldocstring custom-block",open:""},W={class:"jldocstring custom-block",open:""},X={class:"jldocstring custom-block",open:""},Y={class:"jldocstring custom-block",open:""},Z={class:"jldocstring custom-block",open:""},ss={class:"jldocstring custom-block",open:""},is={class:"jldocstring custom-block",open:""},as={class:"jldocstring custom-block",open:""},ts={class:"jldocstring custom-block",open:""},ns={class:"jldocstring custom-block",open:""},es={class:"jldocstring custom-block",open:""},ls={class:"jldocstring custom-block",open:""},ps={class:"jldocstring custom-block",open:""},os={class:"jldocstring custom-block",open:""},hs={class:"jldocstring custom-block",open:""},rs={class:"jldocstring custom-block",open:""},ks={class:"jldocstring custom-block",open:""},ds={class:"jldocstring custom-block",open:""};function cs(gs,s,us,Es,ms,ys){const n=o("Badge");return h(),p("div",null,[s[168]||(s[168]=i("h1",{id:"ConstraintDomains.jl:-Defining-Variables-and-Exploring-Domains",tabindex:"-1"},[a("ConstraintDomains.jl: Defining Variables and Exploring Domains "),i("a",{class:"header-anchor",href:"#ConstraintDomains.jl:-Defining-Variables-and-Exploring-Domains","aria-label":'Permalink to "ConstraintDomains.jl: Defining Variables and Exploring Domains {#ConstraintDomains.jl:-Defining-Variables-and-Exploring-Domains}"'},"​")],-1)),s[169]||(s[169]=i("p",null,[i("em",null,"ConstraintDomains.jl"),a(" is the standard way to define variables and explore domains in the "),i("em",null,"Julia Constraints"),a(" ecosystem. This package can be used to specify both discrete and continuous domains. Explorations features are primarily related to learning about constraints, aka constraint learning.")],-1)),s[170]||(s[170]=i("p",null,"Most users should use it through JuMP/MOI interfaces.",-1)),s[171]||(s[171]=i("h2",{id:"commons",tabindex:"-1"},[a("Commons "),i("a",{class:"header-anchor",href:"#commons","aria-label":'Permalink to "Commons"'},"​")],-1)),i("details",k,[i("summary",null,[s[0]||(s[0]=i("a",{id:"ConstraintDomains.AbstractDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.AbstractDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.AbstractDomain")],-1)),s[1]||(s[1]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=t('
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

  • Base.∈(val, ::D)

  • Base.rand(::D)

  • Base.length(::D) that is the number of elements in a discrete domain, and the distance between bounds or similar for a continuous domain

Additionally, if the domain is used in a dynamic context, it can extend

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source

',7))]),i("details",d,[i("summary",null,[s[3]||(s[3]=i("a",{id:"ConstraintDomains.EmptyDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.EmptyDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.EmptyDomain")],-1)),s[4]||(s[4]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[5]||(s[5]=t('
julia
EmptyDomain

A struct to handle yet to be defined domains.

source

',3))]),i("details",c,[i("summary",null,[s[6]||(s[6]=i("a",{id:"ConstraintDomains.domain-constraints-61_constraint_domains",href:"#ConstraintDomains.domain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[7]||(s[7]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[8]||(s[8]=t(`
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

julia
domain(values)
+domain(range::R) where {T <: Real, R <: AbstractRange{T}}

Construct either a SetDomain or a RangeDomain.

julia
d1 = domain(1:5)
+d2 = domain([53.69, 89.2, 0.12])
+d3 = domain([2//3, 89//123])
+d4 = domain(4.3)
+d5 = domain(1,42,86.9)

source

`,10))]),i("details",g,[i("summary",null,[s[9]||(s[9]=i("a",{id:"ConstraintDomains.domain_size-constraints-61_constraint_domains",href:"#ConstraintDomains.domain_size-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[10]||(s[10]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[11]||(s[11]=t('
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',9))]),i("details",u,[i("summary",null,[s[12]||(s[12]=i("a",{id:"ConstraintDomains.get_domain-constraints-61_constraint_domains",href:"#ConstraintDomains.get_domain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.get_domain")],-1)),s[13]||(s[13]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[14]||(s[14]=t('
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

',3))]),i("details",E,[i("summary",null,[s[15]||(s[15]=i("a",{id:"ConstraintDomains.to_domains-constraints-61_constraint_domains",href:"#ConstraintDomains.to_domains-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.to_domains")],-1)),s[16]||(s[16]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=t('
julia
to_domains(args...)

Convert various arguments into valid domains format.

source

',3))]),s[172]||(s[172]=i("h3",{id:"Extension-to-Base-module",tabindex:"-1"},[a("Extension to Base module "),i("a",{class:"header-anchor",href:"#Extension-to-Base-module","aria-label":'Permalink to "Extension to Base module {#Extension-to-Base-module}"'},"​")],-1)),i("details",m,[i("summary",null,[s[18]||(s[18]=i("a",{id:"Base.in-constraints-61_constraint_domains",href:"#Base.in-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[19]||(s[19]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[20]||(s[20]=t('
julia
x::Variable constraint\nvalue  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source

',15))]),i("details",y,[i("summary",null,[s[21]||(s[21]=i("a",{id:"Base.rand-constraints-61_constraint_domains",href:"#Base.rand-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[22]||(s[22]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[23]||(s[23]=t(`
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

`,12))]),i("details",b,[i("summary",null,[s[24]||(s[24]=i("a",{id:"Base.isempty-constraints-61_constraint_domains",href:"#Base.isempty-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.isempty")],-1)),s[25]||(s[25]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=t('
julia
Base.isempty(d <: AbstractDomain)

Fallback method for isempty(d) that return length(d) == 0 which default to 0.

source

',3))]),i("details",C,[i("summary",null,[s[27]||(s[27]=i("a",{id:"Base.rand-constraints-61_constraint_domains-2",href:"#Base.rand-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[28]||(s[28]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[29]||(s[29]=t(`
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

`,12))]),i("details",F,[i("summary",null,[s[30]||(s[30]=i("a",{id:"Base.string-constraints-61_constraint_domains",href:"#Base.string-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.string")],-1)),s[31]||(s[31]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[32]||(s[32]=t(`
julia
Base.string(D::Vector{<:AbstractDomain})
+Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source

`,3))]),s[173]||(s[173]=t('

Performances

Bench Evolution CommonChair Evolution Common

Continuous

',3)),i("details",v,[i("summary",null,[s[33]||(s[33]=i("a",{id:"ConstraintDomains.ContinuousDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.ContinuousDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ContinuousDomain")],-1)),s[34]||(s[34]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[35]||(s[35]=t('
julia
ContinuousDomain{T <: Real} <: AbstractDomain

An abstract supertype for all continuous domains.

source

',3))]),i("details",D,[i("summary",null,[s[36]||(s[36]=i("a",{id:"ConstraintDomains.Intervals-constraints-61_constraint_domains",href:"#ConstraintDomains.Intervals-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.Intervals")],-1)),s[37]||(s[37]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[38]||(s[38]=t('
julia
Intervals{T <: Real} <: ContinuousDomain{T}

An encapsuler to store a vector of PatternFolds.Interval. Dynamic changes to Intervals are not handled yet.

source

',3))]),i("details",j,[i("summary",null,[s[39]||(s[39]=i("a",{id:"ConstraintDomains.domain-constraints-61_constraint_domains-2",href:"#ConstraintDomains.domain-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[40]||(s[40]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[41]||(s[41]=t(`
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

julia
domain(values)
+domain(range::R) where {T <: Real, R <: AbstractRange{T}}

Construct either a SetDomain or a RangeDomain.

julia
d1 = domain(1:5)
+d2 = domain([53.69, 89.2, 0.12])
+d3 = domain([2//3, 89//123])
+d4 = domain(4.3)
+d5 = domain(1,42,86.9)

source

`,10))]),i("details",f,[i("summary",null,[s[42]||(s[42]=i("a",{id:"ConstraintDomains.domain_size-constraints-61_constraint_domains-2",href:"#ConstraintDomains.domain_size-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[43]||(s[43]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[44]||(s[44]=t('
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',9))]),i("details",B,[i("summary",null,[s[45]||(s[45]=i("a",{id:"ConstraintDomains.merge_domains-constraints-61_constraint_domains",href:"#ConstraintDomains.merge_domains-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.merge_domains")],-1)),s[46]||(s[46]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[47]||(s[47]=t('
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source

',3))]),i("details",A,[i("summary",null,[s[48]||(s[48]=i("a",{id:"ConstraintDomains.intersect_domains-constraints-61_constraint_domains",href:"#ConstraintDomains.intersect_domains-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains")],-1)),s[49]||(s[49]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[50]||(s[50]=t('
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

',3))]),i("details",x,[i("summary",null,[s[51]||(s[51]=i("a",{id:"ConstraintDomains.intersect_domains!-constraints-61_constraint_domains",href:"#ConstraintDomains.intersect_domains!-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains!")],-1)),s[52]||(s[52]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[53]||(s[53]=t('
julia
intersect_domains!(is, i, new_itvls)

Compute the intersections of a domain with an interval and store the results in new_itvls.

Arguments

  • is::IS: a collection of intervals.

  • i::I: an interval.

  • new_itvls::Vector{I}: a vector to store the results.

source

',5))]),i("details",L,[i("summary",null,[s[54]||(s[54]=i("a",{id:"ConstraintDomains.size-constraints-61_constraint_domains",href:"#ConstraintDomains.size-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.size")],-1)),s[55]||(s[55]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[56]||(s[56]=t('
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source

',3))]),s[174]||(s[174]=i("h3",{id:"Extension-to-Base-module-2",tabindex:"-1"},[a("Extension to Base module "),i("a",{class:"header-anchor",href:"#Extension-to-Base-module-2","aria-label":'Permalink to "Extension to Base module {#Extension-to-Base-module-2}"'},"​")],-1)),i("details",_,[i("summary",null,[s[57]||(s[57]=i("a",{id:"Base.length-constraints-61_constraint_domains",href:"#Base.length-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.length")],-1)),s[58]||(s[58]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[59]||(s[59]=t('
julia
length(layer)

Return the number of operations in a layer.

source

julia
Base.length(icn)

Return the total number of operations of an ICN.

source

julia
Base.rand(d <: AbstractDomain)

Fallback method for length(d) that return 0.

source

julia
Base.length(itv::Intervals)

Return the sum of the length of each interval in itv.

source

julia
Base.length(d::D) where D <: DiscreteDomain

Return the number of points in d.

source

',15))]),i("details",T,[i("summary",null,[s[60]||(s[60]=i("a",{id:"Base.rand-constraints-61_constraint_domains-3",href:"#Base.rand-constraints-61_constraint_domains-3"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[61]||(s[61]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[62]||(s[62]=t(`
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

`,12))]),i("details",J,[i("summary",null,[s[63]||(s[63]=i("a",{id:"Base.in-constraints-61_constraint_domains-2",href:"#Base.in-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[64]||(s[64]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[65]||(s[65]=t('
julia
x::Variable constraint\nvalue  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source

',15))]),i("details",w,[i("summary",null,[s[66]||(s[66]=i("a",{id:"Base.string-constraints-61_constraint_domains-2",href:"#Base.string-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"Base.string")],-1)),s[67]||(s[67]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[68]||(s[68]=t(`
julia
Base.string(D::Vector{<:AbstractDomain})
+Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source

`,3))]),s[175]||(s[175]=t('

Performances

Bench Evolution ContinuousChair Evolution Continuous

Discrete

',3)),i("details",I,[i("summary",null,[s[69]||(s[69]=i("a",{id:"ConstraintDomains.DiscreteDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.DiscreteDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.DiscreteDomain")],-1)),s[70]||(s[70]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[71]||(s[71]=t('
julia
DiscreteDomain{T <: Number} <: AbstractDomain

An abstract supertype for discrete domains (set, range).

source

',3))]),i("details",P,[i("summary",null,[s[72]||(s[72]=i("a",{id:"ConstraintDomains.SetDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.SetDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.SetDomain")],-1)),s[73]||(s[73]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[74]||(s[74]=t('
julia
SetDomain{T <: Number} <: DiscreteDomain{T}

Domain that stores discrete values as a set of (unordered) points.

source

',3))]),i("details",O,[i("summary",null,[s[75]||(s[75]=i("a",{id:"ConstraintDomains.RangeDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.RangeDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.RangeDomain")],-1)),s[76]||(s[76]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[77]||(s[77]=t('
julia
RangeDomain

A discrete domain defined by a range <: AbstractRange{Real}. As ranges are immutable in Julia, changes in RangeDomain must use set_domain!.

source

',3))]),i("details",R,[i("summary",null,[s[78]||(s[78]=i("a",{id:"ConstraintDomains.ArbitraryDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.ArbitraryDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ArbitraryDomain")],-1)),s[79]||(s[79]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[80]||(s[80]=t('
julia
ArbitraryDomain{T} <: DiscreteDomain{T}

A domain type that stores arbitrary values, possibly non numeric, of type T.

source

',3))]),i("details",S,[i("summary",null,[s[81]||(s[81]=i("a",{id:"ConstraintDomains.domain-constraints-61_constraint_domains-3",href:"#ConstraintDomains.domain-constraints-61_constraint_domains-3"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[82]||(s[82]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[83]||(s[83]=t(`
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

julia
domain(values)
+domain(range::R) where {T <: Real, R <: AbstractRange{T}}

Construct either a SetDomain or a RangeDomain.

julia
d1 = domain(1:5)
+d2 = domain([53.69, 89.2, 0.12])
+d3 = domain([2//3, 89//123])
+d4 = domain(4.3)
+d5 = domain(1,42,86.9)

source

`,10))]),i("details",V,[i("summary",null,[s[84]||(s[84]=i("a",{id:"ConstraintDomains.domain_size-constraints-61_constraint_domains-3",href:"#ConstraintDomains.domain_size-constraints-61_constraint_domains-3"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[85]||(s[85]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[86]||(s[86]=t('
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',9))]),i("details",z,[i("summary",null,[s[87]||(s[87]=i("a",{id:"ConstraintDomains.add!-constraints-61_constraint_domains",href:"#ConstraintDomains.add!-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.add!")],-1)),s[88]||(s[88]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[89]||(s[89]=t('
julia
add!(d::SetDomain, value)

Add value to the list of points in d.

source

',3))]),i("details",q,[i("summary",null,[s[90]||(s[90]=i("a",{id:"ConstraintDomains.merge_domains-constraints-61_constraint_domains-2",href:"#ConstraintDomains.merge_domains-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.merge_domains")],-1)),s[91]||(s[91]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[92]||(s[92]=t('
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source

',3))]),i("details",N,[i("summary",null,[s[93]||(s[93]=i("a",{id:"ConstraintDomains.intersect_domains-constraints-61_constraint_domains-2",href:"#ConstraintDomains.intersect_domains-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains")],-1)),s[94]||(s[94]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[95]||(s[95]=t('
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

',3))]),i("details",U,[i("summary",null,[s[96]||(s[96]=i("a",{id:"ConstraintDomains.size-constraints-61_constraint_domains-2",href:"#ConstraintDomains.size-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.size")],-1)),s[97]||(s[97]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[98]||(s[98]=t('
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source

',3))]),s[176]||(s[176]=i("h3",{id:"Extension-to-Base-module-3",tabindex:"-1"},[a("Extension to Base module "),i("a",{class:"header-anchor",href:"#Extension-to-Base-module-3","aria-label":'Permalink to "Extension to Base module {#Extension-to-Base-module-3}"'},"​")],-1)),i("details",M,[i("summary",null,[s[99]||(s[99]=i("a",{id:"Base.delete!-constraints-61_constraint_domains",href:"#Base.delete!-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.delete!")],-1)),s[100]||(s[100]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[101]||(s[101]=t('
julia
Base.delete!(d::SetDomain, value)(d::SetDomain, value)

Delete value from the list of points in d.

source

',3))]),i("details",G,[i("summary",null,[s[102]||(s[102]=i("a",{id:"Base.length-constraints-61_constraint_domains-2",href:"#Base.length-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"Base.length")],-1)),s[103]||(s[103]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[104]||(s[104]=t('
julia
length(layer)

Return the number of operations in a layer.

source

julia
Base.length(icn)

Return the total number of operations of an ICN.

source

julia
Base.rand(d <: AbstractDomain)

Fallback method for length(d) that return 0.

source

julia
Base.length(itv::Intervals)

Return the sum of the length of each interval in itv.

source

julia
Base.length(d::D) where D <: DiscreteDomain

Return the number of points in d.

source

',15))]),i("details",$,[i("summary",null,[s[105]||(s[105]=i("a",{id:"Base.rand-constraints-61_constraint_domains-4",href:"#Base.rand-constraints-61_constraint_domains-4"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[106]||(s[106]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[107]||(s[107]=t(`
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

`,12))]),i("details",H,[i("summary",null,[s[108]||(s[108]=i("a",{id:"Base.in-constraints-61_constraint_domains-3",href:"#Base.in-constraints-61_constraint_domains-3"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[109]||(s[109]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[110]||(s[110]=t('
julia
x::Variable constraint\nvalue  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source

',15))]),i("details",K,[i("summary",null,[s[111]||(s[111]=i("a",{id:"Base.string-constraints-61_constraint_domains-3",href:"#Base.string-constraints-61_constraint_domains-3"},[i("span",{class:"jlbinding"},"Base.string")],-1)),s[112]||(s[112]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[113]||(s[113]=t(`
julia
Base.string(D::Vector{<:AbstractDomain})
+Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source

`,3))]),s[177]||(s[177]=t('

Performances

Bench Evolution DiscreteChair Evolution Discrete

General

',3)),i("details",Q,[i("summary",null,[s[114]||(s[114]=i("a",{id:"Base.eltype-constraints-61_constraint_domains",href:"#Base.eltype-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.eltype")],-1)),s[115]||(s[115]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[116]||(s[116]=t('
julia
Base.eltype(::AbstractDomain)

Extend eltype for domains.

source

',3))]),i("details",W,[i("summary",null,[s[117]||(s[117]=i("a",{id:"Base.convert-constraints-61_constraint_domains",href:"#Base.convert-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.convert")],-1)),s[118]||(s[118]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[119]||(s[119]=t('
julia
Base.convert(::Type{Union{Intervals, RangeDomain}}, d::Union{Intervals, RangeDomain})

Extends Base.convert for domains.

source

',3))]),s[178]||(s[178]=i("h2",{id:"exploration",tabindex:"-1"},[a("Exploration "),i("a",{class:"header-anchor",href:"#exploration","aria-label":'Permalink to "Exploration"'},"​")],-1)),i("details",X,[i("summary",null,[s[120]||(s[120]=i("a",{id:"ConstraintDomains.ExploreSettings-constraints-61_constraint_domains",href:"#ConstraintDomains.ExploreSettings-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ExploreSettings")],-1)),s[121]||(s[121]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[122]||(s[122]=t(`
julia
ExploreSettings(domains; 
+                complete_search_limit = 10^6, 
+                max_samplings = sum(domain_size, domains), 
+                search = :flexible, 
+                solutions_limit = floor(Int, sqrt(max_samplings)))

Create an ExploreSettings object to configure the exploration of a search space composed of a collection of domains.

Arguments

  • domains: A collection of domains to be explored.

  • complete_search_limit: An integer specifying the maximum limit for complete search iterations. Default is 10^6.

  • max_samplings: An integer specifying the maximum number of samplings. Default is the sum of domain sizes.

  • search: A symbol indicating the type of search to perform. Default is :flexible.

  • solutions_limit: An integer specifying the limit on the number of solutions. Default is the floor of the square root of max_samplings.

Returns

  • ExploreSettings object with the specified settings.

source

`,7))]),i("details",Y,[i("summary",null,[s[123]||(s[123]=i("a",{id:"ConstraintDomains._explore-constraints-61_constraint_domains",href:"#ConstraintDomains._explore-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains._explore")],-1)),s[124]||(s[124]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[125]||(s[125]=t('
julia
_explore(args...)

Internals of the explore function. Behavior is automatically adjusted on the kind of exploration: :flexible, :complete, :partial.

source

',3))]),i("details",Z,[i("summary",null,[s[126]||(s[126]=i("a",{id:"ConstraintDomains.explore-constraints-61_constraint_domains",href:"#ConstraintDomains.explore-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.explore")],-1)),s[127]||(s[127]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[128]||(s[128]=t('
julia
explore(domains, concept; settings = ExploreSettings(domains), parameters...)

Search (a part of) a search space and return a pair of vectors of configurations: (solutions, non_solutions). The exploration behavior is determined based on the settings.

Arguments

  • domains: A collection of domains to be explored.

  • concept: The concept representing the constraint to be targeted.

  • settings: An optional ExploreSettings object to configure the exploration. Default is ExploreSettings(domains).

  • parameters...: Additional parameters for the concept.

Returns

  • A tuple of sets: (solutions, non_solutions).

source

',7))]),s[179]||(s[179]=t('

Performances

Bench Evolution ExplorationChair Evolution Exploration

Parameters

',3)),i("details",ss,[i("summary",null,[s[129]||(s[129]=i("a",{id:"ConstraintDomains.BoolParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.BoolParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.BoolParameterDomain")],-1)),s[130]||(s[130]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[131]||(s[131]=t('
julia
BoolParameterDomain <: AbstractDomain

A domain to store boolean values. It is used to generate random parameters.

source

',3))]),i("details",is,[i("summary",null,[s[132]||(s[132]=i("a",{id:"ConstraintDomains.DimParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.DimParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.DimParameterDomain")],-1)),s[133]||(s[133]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[134]||(s[134]=t('
julia
DimParameterDomain <: AbstractDomain

A domain to store dimensions. It is used to generate random parameters.

source

',3))]),i("details",as,[i("summary",null,[s[135]||(s[135]=i("a",{id:"ConstraintDomains.IdParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.IdParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.IdParameterDomain")],-1)),s[136]||(s[136]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[137]||(s[137]=t('
julia
IdParameterDomain <: AbstractDomain

A domain to store ids. It is used to generate random parameters.

source

',3))]),i("details",ts,[i("summary",null,[s[138]||(s[138]=i("a",{id:"ConstraintDomains.FakeAutomaton-constraints-61_constraint_domains",href:"#ConstraintDomains.FakeAutomaton-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.FakeAutomaton")],-1)),s[139]||(s[139]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[140]||(s[140]=t('
julia
FakeAutomaton{T} <: ConstraintCommons.AbstractAutomaton

A structure to generate pseudo automaton enough for parameter exploration.

source

',3))]),i("details",ns,[i("summary",null,[s[141]||(s[141]=i("a",{id:"ConstraintCommons.accept-constraints-61_constraint_domains",href:"#ConstraintCommons.accept-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintCommons.accept")],-1)),s[142]||(s[142]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[143]||(s[143]=t('
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

',6))]),i("details",es,[i("summary",null,[s[144]||(s[144]=i("a",{id:"ConstraintDomains.fake_automaton-constraints-61_constraint_domains",href:"#ConstraintDomains.fake_automaton-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.fake_automaton")],-1)),s[145]||(s[145]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[146]||(s[146]=t('
julia
fake_automaton(d)

Construct a FakeAutomaton.

source

',3))]),i("details",ls,[i("summary",null,[s[147]||(s[147]=i("a",{id:"ConstraintDomains.LanguageParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.LanguageParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.LanguageParameterDomain")],-1)),s[148]||(s[148]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[149]||(s[149]=t('
julia
LanguageParameterDomain <: AbstractDomain

A domain to store languages. It is used to generate random parameters.

source

',3))]),i("details",ps,[i("summary",null,[s[150]||(s[150]=i("a",{id:"ConstraintDomains.OpParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.OpParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.OpParameterDomain")],-1)),s[151]||(s[151]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[152]||(s[152]=t('
julia
OpParameterDomain{T} <: AbstractDomain

A domain to store operators. It is used to generate random parameters.

source

',3))]),i("details",os,[i("summary",null,[s[153]||(s[153]=i("a",{id:"ConstraintDomains.PairVarsParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.PairVarsParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.PairVarsParameterDomain")],-1)),s[154]||(s[154]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[155]||(s[155]=t('
julia
PairVarsParameterDomain{T} <: AbstractDomain

A domain to store values paired with variables. It is used to generate random parameters.

source

',3))]),i("details",hs,[i("summary",null,[s[156]||(s[156]=i("a",{id:"ConstraintDomains.ValParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.ValParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ValParameterDomain")],-1)),s[157]||(s[157]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[158]||(s[158]=t('
julia
ValParameterDomain{T} <: AbstractDomain

A domain to store one value. It is used to generate random parameters.

source

',3))]),i("details",rs,[i("summary",null,[s[159]||(s[159]=i("a",{id:"ConstraintDomains.ValsParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.ValsParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ValsParameterDomain")],-1)),s[160]||(s[160]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[161]||(s[161]=t('
julia
ValsParameterDomain{T} <: AbstractDomain

A domain to store values. It is used to generate random parameters.

source

',3))]),i("details",ks,[i("summary",null,[s[162]||(s[162]=i("a",{id:"Base.rand-constraints-61_constraint_domains-5",href:"#Base.rand-constraints-61_constraint_domains-5"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[163]||(s[163]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[164]||(s[164]=t(`
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

`,12))]),i("details",ds,[i("summary",null,[s[165]||(s[165]=i("a",{id:"ConstraintDomains.generate_parameters-constraints-61_constraint_domains",href:"#ConstraintDomains.generate_parameters-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.generate_parameters")],-1)),s[166]||(s[166]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[167]||(s[167]=t('
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source

',3))])])}const Fs=l(r,[["render",cs]]);export{Cs as __pageData,Fs as default}; diff --git a/dev/assets/constraints_61_constraint_domains.md.BIH3fSw6.lean.js b/dev/assets/constraints_61_constraint_domains.md.BIH3fSw6.lean.js new file mode 100644 index 0000000..649ce35 --- /dev/null +++ b/dev/assets/constraints_61_constraint_domains.md.BIH3fSw6.lean.js @@ -0,0 +1,31 @@ +import{_ as l,c as p,j as i,a,G as e,a5 as t,B as o,o as h}from"./chunks/framework.CJakPlgM.js";const Cs=JSON.parse('{"title":"ConstraintDomains.jl: Defining Variables and Exploring Domains","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/61_constraint_domains.md","filePath":"constraints/61_constraint_domains.md","lastUpdated":null}'),r={name:"constraints/61_constraint_domains.md"},k={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},L={class:"jldocstring custom-block",open:""},_={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},J={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""},I={class:"jldocstring custom-block",open:""},P={class:"jldocstring custom-block",open:""},O={class:"jldocstring custom-block",open:""},R={class:"jldocstring custom-block",open:""},S={class:"jldocstring custom-block",open:""},V={class:"jldocstring custom-block",open:""},z={class:"jldocstring custom-block",open:""},q={class:"jldocstring custom-block",open:""},N={class:"jldocstring custom-block",open:""},U={class:"jldocstring custom-block",open:""},M={class:"jldocstring custom-block",open:""},G={class:"jldocstring custom-block",open:""},$={class:"jldocstring custom-block",open:""},H={class:"jldocstring custom-block",open:""},K={class:"jldocstring custom-block",open:""},Q={class:"jldocstring custom-block",open:""},W={class:"jldocstring custom-block",open:""},X={class:"jldocstring custom-block",open:""},Y={class:"jldocstring custom-block",open:""},Z={class:"jldocstring custom-block",open:""},ss={class:"jldocstring custom-block",open:""},is={class:"jldocstring custom-block",open:""},as={class:"jldocstring custom-block",open:""},ts={class:"jldocstring custom-block",open:""},ns={class:"jldocstring custom-block",open:""},es={class:"jldocstring custom-block",open:""},ls={class:"jldocstring custom-block",open:""},ps={class:"jldocstring custom-block",open:""},os={class:"jldocstring custom-block",open:""},hs={class:"jldocstring custom-block",open:""},rs={class:"jldocstring custom-block",open:""},ks={class:"jldocstring custom-block",open:""},ds={class:"jldocstring custom-block",open:""};function cs(gs,s,us,Es,ms,ys){const n=o("Badge");return h(),p("div",null,[s[168]||(s[168]=i("h1",{id:"ConstraintDomains.jl:-Defining-Variables-and-Exploring-Domains",tabindex:"-1"},[a("ConstraintDomains.jl: Defining Variables and Exploring Domains "),i("a",{class:"header-anchor",href:"#ConstraintDomains.jl:-Defining-Variables-and-Exploring-Domains","aria-label":'Permalink to "ConstraintDomains.jl: Defining Variables and Exploring Domains {#ConstraintDomains.jl:-Defining-Variables-and-Exploring-Domains}"'},"​")],-1)),s[169]||(s[169]=i("p",null,[i("em",null,"ConstraintDomains.jl"),a(" is the standard way to define variables and explore domains in the "),i("em",null,"Julia Constraints"),a(" ecosystem. This package can be used to specify both discrete and continuous domains. Explorations features are primarily related to learning about constraints, aka constraint learning.")],-1)),s[170]||(s[170]=i("p",null,"Most users should use it through JuMP/MOI interfaces.",-1)),s[171]||(s[171]=i("h2",{id:"commons",tabindex:"-1"},[a("Commons "),i("a",{class:"header-anchor",href:"#commons","aria-label":'Permalink to "Commons"'},"​")],-1)),i("details",k,[i("summary",null,[s[0]||(s[0]=i("a",{id:"ConstraintDomains.AbstractDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.AbstractDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.AbstractDomain")],-1)),s[1]||(s[1]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=t('
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

  • Base.∈(val, ::D)

  • Base.rand(::D)

  • Base.length(::D) that is the number of elements in a discrete domain, and the distance between bounds or similar for a continuous domain

Additionally, if the domain is used in a dynamic context, it can extend

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source

',7))]),i("details",d,[i("summary",null,[s[3]||(s[3]=i("a",{id:"ConstraintDomains.EmptyDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.EmptyDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.EmptyDomain")],-1)),s[4]||(s[4]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[5]||(s[5]=t('
julia
EmptyDomain

A struct to handle yet to be defined domains.

source

',3))]),i("details",c,[i("summary",null,[s[6]||(s[6]=i("a",{id:"ConstraintDomains.domain-constraints-61_constraint_domains",href:"#ConstraintDomains.domain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[7]||(s[7]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[8]||(s[8]=t(`
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

julia
domain(values)
+domain(range::R) where {T <: Real, R <: AbstractRange{T}}

Construct either a SetDomain or a RangeDomain.

julia
d1 = domain(1:5)
+d2 = domain([53.69, 89.2, 0.12])
+d3 = domain([2//3, 89//123])
+d4 = domain(4.3)
+d5 = domain(1,42,86.9)

source

`,10))]),i("details",g,[i("summary",null,[s[9]||(s[9]=i("a",{id:"ConstraintDomains.domain_size-constraints-61_constraint_domains",href:"#ConstraintDomains.domain_size-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[10]||(s[10]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[11]||(s[11]=t('
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',9))]),i("details",u,[i("summary",null,[s[12]||(s[12]=i("a",{id:"ConstraintDomains.get_domain-constraints-61_constraint_domains",href:"#ConstraintDomains.get_domain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.get_domain")],-1)),s[13]||(s[13]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[14]||(s[14]=t('
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

',3))]),i("details",E,[i("summary",null,[s[15]||(s[15]=i("a",{id:"ConstraintDomains.to_domains-constraints-61_constraint_domains",href:"#ConstraintDomains.to_domains-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.to_domains")],-1)),s[16]||(s[16]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=t('
julia
to_domains(args...)

Convert various arguments into valid domains format.

source

',3))]),s[172]||(s[172]=i("h3",{id:"Extension-to-Base-module",tabindex:"-1"},[a("Extension to Base module "),i("a",{class:"header-anchor",href:"#Extension-to-Base-module","aria-label":'Permalink to "Extension to Base module {#Extension-to-Base-module}"'},"​")],-1)),i("details",m,[i("summary",null,[s[18]||(s[18]=i("a",{id:"Base.in-constraints-61_constraint_domains",href:"#Base.in-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[19]||(s[19]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[20]||(s[20]=t('
julia
x::Variable constraint\nvalue  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source

',15))]),i("details",y,[i("summary",null,[s[21]||(s[21]=i("a",{id:"Base.rand-constraints-61_constraint_domains",href:"#Base.rand-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[22]||(s[22]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[23]||(s[23]=t(`
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

`,12))]),i("details",b,[i("summary",null,[s[24]||(s[24]=i("a",{id:"Base.isempty-constraints-61_constraint_domains",href:"#Base.isempty-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.isempty")],-1)),s[25]||(s[25]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=t('
julia
Base.isempty(d <: AbstractDomain)

Fallback method for isempty(d) that return length(d) == 0 which default to 0.

source

',3))]),i("details",C,[i("summary",null,[s[27]||(s[27]=i("a",{id:"Base.rand-constraints-61_constraint_domains-2",href:"#Base.rand-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[28]||(s[28]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[29]||(s[29]=t(`
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

`,12))]),i("details",F,[i("summary",null,[s[30]||(s[30]=i("a",{id:"Base.string-constraints-61_constraint_domains",href:"#Base.string-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.string")],-1)),s[31]||(s[31]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[32]||(s[32]=t(`
julia
Base.string(D::Vector{<:AbstractDomain})
+Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source

`,3))]),s[173]||(s[173]=t('

Performances

Bench Evolution CommonChair Evolution Common

Continuous

',3)),i("details",v,[i("summary",null,[s[33]||(s[33]=i("a",{id:"ConstraintDomains.ContinuousDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.ContinuousDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ContinuousDomain")],-1)),s[34]||(s[34]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[35]||(s[35]=t('
julia
ContinuousDomain{T <: Real} <: AbstractDomain

An abstract supertype for all continuous domains.

source

',3))]),i("details",D,[i("summary",null,[s[36]||(s[36]=i("a",{id:"ConstraintDomains.Intervals-constraints-61_constraint_domains",href:"#ConstraintDomains.Intervals-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.Intervals")],-1)),s[37]||(s[37]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[38]||(s[38]=t('
julia
Intervals{T <: Real} <: ContinuousDomain{T}

An encapsuler to store a vector of PatternFolds.Interval. Dynamic changes to Intervals are not handled yet.

source

',3))]),i("details",j,[i("summary",null,[s[39]||(s[39]=i("a",{id:"ConstraintDomains.domain-constraints-61_constraint_domains-2",href:"#ConstraintDomains.domain-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[40]||(s[40]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[41]||(s[41]=t(`
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

julia
domain(values)
+domain(range::R) where {T <: Real, R <: AbstractRange{T}}

Construct either a SetDomain or a RangeDomain.

julia
d1 = domain(1:5)
+d2 = domain([53.69, 89.2, 0.12])
+d3 = domain([2//3, 89//123])
+d4 = domain(4.3)
+d5 = domain(1,42,86.9)

source

`,10))]),i("details",f,[i("summary",null,[s[42]||(s[42]=i("a",{id:"ConstraintDomains.domain_size-constraints-61_constraint_domains-2",href:"#ConstraintDomains.domain_size-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[43]||(s[43]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[44]||(s[44]=t('
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',9))]),i("details",B,[i("summary",null,[s[45]||(s[45]=i("a",{id:"ConstraintDomains.merge_domains-constraints-61_constraint_domains",href:"#ConstraintDomains.merge_domains-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.merge_domains")],-1)),s[46]||(s[46]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[47]||(s[47]=t('
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source

',3))]),i("details",A,[i("summary",null,[s[48]||(s[48]=i("a",{id:"ConstraintDomains.intersect_domains-constraints-61_constraint_domains",href:"#ConstraintDomains.intersect_domains-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains")],-1)),s[49]||(s[49]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[50]||(s[50]=t('
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

',3))]),i("details",x,[i("summary",null,[s[51]||(s[51]=i("a",{id:"ConstraintDomains.intersect_domains!-constraints-61_constraint_domains",href:"#ConstraintDomains.intersect_domains!-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains!")],-1)),s[52]||(s[52]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[53]||(s[53]=t('
julia
intersect_domains!(is, i, new_itvls)

Compute the intersections of a domain with an interval and store the results in new_itvls.

Arguments

  • is::IS: a collection of intervals.

  • i::I: an interval.

  • new_itvls::Vector{I}: a vector to store the results.

source

',5))]),i("details",L,[i("summary",null,[s[54]||(s[54]=i("a",{id:"ConstraintDomains.size-constraints-61_constraint_domains",href:"#ConstraintDomains.size-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.size")],-1)),s[55]||(s[55]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[56]||(s[56]=t('
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source

',3))]),s[174]||(s[174]=i("h3",{id:"Extension-to-Base-module-2",tabindex:"-1"},[a("Extension to Base module "),i("a",{class:"header-anchor",href:"#Extension-to-Base-module-2","aria-label":'Permalink to "Extension to Base module {#Extension-to-Base-module-2}"'},"​")],-1)),i("details",_,[i("summary",null,[s[57]||(s[57]=i("a",{id:"Base.length-constraints-61_constraint_domains",href:"#Base.length-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.length")],-1)),s[58]||(s[58]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[59]||(s[59]=t('
julia
length(layer)

Return the number of operations in a layer.

source

julia
Base.length(icn)

Return the total number of operations of an ICN.

source

julia
Base.rand(d <: AbstractDomain)

Fallback method for length(d) that return 0.

source

julia
Base.length(itv::Intervals)

Return the sum of the length of each interval in itv.

source

julia
Base.length(d::D) where D <: DiscreteDomain

Return the number of points in d.

source

',15))]),i("details",T,[i("summary",null,[s[60]||(s[60]=i("a",{id:"Base.rand-constraints-61_constraint_domains-3",href:"#Base.rand-constraints-61_constraint_domains-3"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[61]||(s[61]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[62]||(s[62]=t(`
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

`,12))]),i("details",J,[i("summary",null,[s[63]||(s[63]=i("a",{id:"Base.in-constraints-61_constraint_domains-2",href:"#Base.in-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[64]||(s[64]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[65]||(s[65]=t('
julia
x::Variable constraint\nvalue  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source

',15))]),i("details",w,[i("summary",null,[s[66]||(s[66]=i("a",{id:"Base.string-constraints-61_constraint_domains-2",href:"#Base.string-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"Base.string")],-1)),s[67]||(s[67]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[68]||(s[68]=t(`
julia
Base.string(D::Vector{<:AbstractDomain})
+Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source

`,3))]),s[175]||(s[175]=t('

Performances

Bench Evolution ContinuousChair Evolution Continuous

Discrete

',3)),i("details",I,[i("summary",null,[s[69]||(s[69]=i("a",{id:"ConstraintDomains.DiscreteDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.DiscreteDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.DiscreteDomain")],-1)),s[70]||(s[70]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[71]||(s[71]=t('
julia
DiscreteDomain{T <: Number} <: AbstractDomain

An abstract supertype for discrete domains (set, range).

source

',3))]),i("details",P,[i("summary",null,[s[72]||(s[72]=i("a",{id:"ConstraintDomains.SetDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.SetDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.SetDomain")],-1)),s[73]||(s[73]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[74]||(s[74]=t('
julia
SetDomain{T <: Number} <: DiscreteDomain{T}

Domain that stores discrete values as a set of (unordered) points.

source

',3))]),i("details",O,[i("summary",null,[s[75]||(s[75]=i("a",{id:"ConstraintDomains.RangeDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.RangeDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.RangeDomain")],-1)),s[76]||(s[76]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[77]||(s[77]=t('
julia
RangeDomain

A discrete domain defined by a range <: AbstractRange{Real}. As ranges are immutable in Julia, changes in RangeDomain must use set_domain!.

source

',3))]),i("details",R,[i("summary",null,[s[78]||(s[78]=i("a",{id:"ConstraintDomains.ArbitraryDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.ArbitraryDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ArbitraryDomain")],-1)),s[79]||(s[79]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[80]||(s[80]=t('
julia
ArbitraryDomain{T} <: DiscreteDomain{T}

A domain type that stores arbitrary values, possibly non numeric, of type T.

source

',3))]),i("details",S,[i("summary",null,[s[81]||(s[81]=i("a",{id:"ConstraintDomains.domain-constraints-61_constraint_domains-3",href:"#ConstraintDomains.domain-constraints-61_constraint_domains-3"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[82]||(s[82]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[83]||(s[83]=t(`
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

julia
domain(values)
+domain(range::R) where {T <: Real, R <: AbstractRange{T}}

Construct either a SetDomain or a RangeDomain.

julia
d1 = domain(1:5)
+d2 = domain([53.69, 89.2, 0.12])
+d3 = domain([2//3, 89//123])
+d4 = domain(4.3)
+d5 = domain(1,42,86.9)

source

`,10))]),i("details",V,[i("summary",null,[s[84]||(s[84]=i("a",{id:"ConstraintDomains.domain_size-constraints-61_constraint_domains-3",href:"#ConstraintDomains.domain_size-constraints-61_constraint_domains-3"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[85]||(s[85]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[86]||(s[86]=t('
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',9))]),i("details",z,[i("summary",null,[s[87]||(s[87]=i("a",{id:"ConstraintDomains.add!-constraints-61_constraint_domains",href:"#ConstraintDomains.add!-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.add!")],-1)),s[88]||(s[88]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[89]||(s[89]=t('
julia
add!(d::SetDomain, value)

Add value to the list of points in d.

source

',3))]),i("details",q,[i("summary",null,[s[90]||(s[90]=i("a",{id:"ConstraintDomains.merge_domains-constraints-61_constraint_domains-2",href:"#ConstraintDomains.merge_domains-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.merge_domains")],-1)),s[91]||(s[91]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[92]||(s[92]=t('
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source

',3))]),i("details",N,[i("summary",null,[s[93]||(s[93]=i("a",{id:"ConstraintDomains.intersect_domains-constraints-61_constraint_domains-2",href:"#ConstraintDomains.intersect_domains-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains")],-1)),s[94]||(s[94]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[95]||(s[95]=t('
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

',3))]),i("details",U,[i("summary",null,[s[96]||(s[96]=i("a",{id:"ConstraintDomains.size-constraints-61_constraint_domains-2",href:"#ConstraintDomains.size-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.size")],-1)),s[97]||(s[97]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[98]||(s[98]=t('
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source

',3))]),s[176]||(s[176]=i("h3",{id:"Extension-to-Base-module-3",tabindex:"-1"},[a("Extension to Base module "),i("a",{class:"header-anchor",href:"#Extension-to-Base-module-3","aria-label":'Permalink to "Extension to Base module {#Extension-to-Base-module-3}"'},"​")],-1)),i("details",M,[i("summary",null,[s[99]||(s[99]=i("a",{id:"Base.delete!-constraints-61_constraint_domains",href:"#Base.delete!-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.delete!")],-1)),s[100]||(s[100]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[101]||(s[101]=t('
julia
Base.delete!(d::SetDomain, value)(d::SetDomain, value)

Delete value from the list of points in d.

source

',3))]),i("details",G,[i("summary",null,[s[102]||(s[102]=i("a",{id:"Base.length-constraints-61_constraint_domains-2",href:"#Base.length-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"Base.length")],-1)),s[103]||(s[103]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[104]||(s[104]=t('
julia
length(layer)

Return the number of operations in a layer.

source

julia
Base.length(icn)

Return the total number of operations of an ICN.

source

julia
Base.rand(d <: AbstractDomain)

Fallback method for length(d) that return 0.

source

julia
Base.length(itv::Intervals)

Return the sum of the length of each interval in itv.

source

julia
Base.length(d::D) where D <: DiscreteDomain

Return the number of points in d.

source

',15))]),i("details",$,[i("summary",null,[s[105]||(s[105]=i("a",{id:"Base.rand-constraints-61_constraint_domains-4",href:"#Base.rand-constraints-61_constraint_domains-4"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[106]||(s[106]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[107]||(s[107]=t(`
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

`,12))]),i("details",H,[i("summary",null,[s[108]||(s[108]=i("a",{id:"Base.in-constraints-61_constraint_domains-3",href:"#Base.in-constraints-61_constraint_domains-3"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[109]||(s[109]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[110]||(s[110]=t('
julia
x::Variable constraint\nvalue  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source

',15))]),i("details",K,[i("summary",null,[s[111]||(s[111]=i("a",{id:"Base.string-constraints-61_constraint_domains-3",href:"#Base.string-constraints-61_constraint_domains-3"},[i("span",{class:"jlbinding"},"Base.string")],-1)),s[112]||(s[112]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[113]||(s[113]=t(`
julia
Base.string(D::Vector{<:AbstractDomain})
+Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source

`,3))]),s[177]||(s[177]=t('

Performances

Bench Evolution DiscreteChair Evolution Discrete

General

',3)),i("details",Q,[i("summary",null,[s[114]||(s[114]=i("a",{id:"Base.eltype-constraints-61_constraint_domains",href:"#Base.eltype-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.eltype")],-1)),s[115]||(s[115]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[116]||(s[116]=t('
julia
Base.eltype(::AbstractDomain)

Extend eltype for domains.

source

',3))]),i("details",W,[i("summary",null,[s[117]||(s[117]=i("a",{id:"Base.convert-constraints-61_constraint_domains",href:"#Base.convert-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.convert")],-1)),s[118]||(s[118]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[119]||(s[119]=t('
julia
Base.convert(::Type{Union{Intervals, RangeDomain}}, d::Union{Intervals, RangeDomain})

Extends Base.convert for domains.

source

',3))]),s[178]||(s[178]=i("h2",{id:"exploration",tabindex:"-1"},[a("Exploration "),i("a",{class:"header-anchor",href:"#exploration","aria-label":'Permalink to "Exploration"'},"​")],-1)),i("details",X,[i("summary",null,[s[120]||(s[120]=i("a",{id:"ConstraintDomains.ExploreSettings-constraints-61_constraint_domains",href:"#ConstraintDomains.ExploreSettings-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ExploreSettings")],-1)),s[121]||(s[121]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[122]||(s[122]=t(`
julia
ExploreSettings(domains; 
+                complete_search_limit = 10^6, 
+                max_samplings = sum(domain_size, domains), 
+                search = :flexible, 
+                solutions_limit = floor(Int, sqrt(max_samplings)))

Create an ExploreSettings object to configure the exploration of a search space composed of a collection of domains.

Arguments

  • domains: A collection of domains to be explored.

  • complete_search_limit: An integer specifying the maximum limit for complete search iterations. Default is 10^6.

  • max_samplings: An integer specifying the maximum number of samplings. Default is the sum of domain sizes.

  • search: A symbol indicating the type of search to perform. Default is :flexible.

  • solutions_limit: An integer specifying the limit on the number of solutions. Default is the floor of the square root of max_samplings.

Returns

  • ExploreSettings object with the specified settings.

source

`,7))]),i("details",Y,[i("summary",null,[s[123]||(s[123]=i("a",{id:"ConstraintDomains._explore-constraints-61_constraint_domains",href:"#ConstraintDomains._explore-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains._explore")],-1)),s[124]||(s[124]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[125]||(s[125]=t('
julia
_explore(args...)

Internals of the explore function. Behavior is automatically adjusted on the kind of exploration: :flexible, :complete, :partial.

source

',3))]),i("details",Z,[i("summary",null,[s[126]||(s[126]=i("a",{id:"ConstraintDomains.explore-constraints-61_constraint_domains",href:"#ConstraintDomains.explore-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.explore")],-1)),s[127]||(s[127]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[128]||(s[128]=t('
julia
explore(domains, concept; settings = ExploreSettings(domains), parameters...)

Search (a part of) a search space and return a pair of vectors of configurations: (solutions, non_solutions). The exploration behavior is determined based on the settings.

Arguments

  • domains: A collection of domains to be explored.

  • concept: The concept representing the constraint to be targeted.

  • settings: An optional ExploreSettings object to configure the exploration. Default is ExploreSettings(domains).

  • parameters...: Additional parameters for the concept.

Returns

  • A tuple of sets: (solutions, non_solutions).

source

',7))]),s[179]||(s[179]=t('

Performances

Bench Evolution ExplorationChair Evolution Exploration

Parameters

',3)),i("details",ss,[i("summary",null,[s[129]||(s[129]=i("a",{id:"ConstraintDomains.BoolParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.BoolParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.BoolParameterDomain")],-1)),s[130]||(s[130]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[131]||(s[131]=t('
julia
BoolParameterDomain <: AbstractDomain

A domain to store boolean values. It is used to generate random parameters.

source

',3))]),i("details",is,[i("summary",null,[s[132]||(s[132]=i("a",{id:"ConstraintDomains.DimParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.DimParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.DimParameterDomain")],-1)),s[133]||(s[133]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[134]||(s[134]=t('
julia
DimParameterDomain <: AbstractDomain

A domain to store dimensions. It is used to generate random parameters.

source

',3))]),i("details",as,[i("summary",null,[s[135]||(s[135]=i("a",{id:"ConstraintDomains.IdParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.IdParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.IdParameterDomain")],-1)),s[136]||(s[136]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[137]||(s[137]=t('
julia
IdParameterDomain <: AbstractDomain

A domain to store ids. It is used to generate random parameters.

source

',3))]),i("details",ts,[i("summary",null,[s[138]||(s[138]=i("a",{id:"ConstraintDomains.FakeAutomaton-constraints-61_constraint_domains",href:"#ConstraintDomains.FakeAutomaton-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.FakeAutomaton")],-1)),s[139]||(s[139]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[140]||(s[140]=t('
julia
FakeAutomaton{T} <: ConstraintCommons.AbstractAutomaton

A structure to generate pseudo automaton enough for parameter exploration.

source

',3))]),i("details",ns,[i("summary",null,[s[141]||(s[141]=i("a",{id:"ConstraintCommons.accept-constraints-61_constraint_domains",href:"#ConstraintCommons.accept-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintCommons.accept")],-1)),s[142]||(s[142]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[143]||(s[143]=t('
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

',6))]),i("details",es,[i("summary",null,[s[144]||(s[144]=i("a",{id:"ConstraintDomains.fake_automaton-constraints-61_constraint_domains",href:"#ConstraintDomains.fake_automaton-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.fake_automaton")],-1)),s[145]||(s[145]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[146]||(s[146]=t('
julia
fake_automaton(d)

Construct a FakeAutomaton.

source

',3))]),i("details",ls,[i("summary",null,[s[147]||(s[147]=i("a",{id:"ConstraintDomains.LanguageParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.LanguageParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.LanguageParameterDomain")],-1)),s[148]||(s[148]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[149]||(s[149]=t('
julia
LanguageParameterDomain <: AbstractDomain

A domain to store languages. It is used to generate random parameters.

source

',3))]),i("details",ps,[i("summary",null,[s[150]||(s[150]=i("a",{id:"ConstraintDomains.OpParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.OpParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.OpParameterDomain")],-1)),s[151]||(s[151]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[152]||(s[152]=t('
julia
OpParameterDomain{T} <: AbstractDomain

A domain to store operators. It is used to generate random parameters.

source

',3))]),i("details",os,[i("summary",null,[s[153]||(s[153]=i("a",{id:"ConstraintDomains.PairVarsParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.PairVarsParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.PairVarsParameterDomain")],-1)),s[154]||(s[154]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[155]||(s[155]=t('
julia
PairVarsParameterDomain{T} <: AbstractDomain

A domain to store values paired with variables. It is used to generate random parameters.

source

',3))]),i("details",hs,[i("summary",null,[s[156]||(s[156]=i("a",{id:"ConstraintDomains.ValParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.ValParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ValParameterDomain")],-1)),s[157]||(s[157]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[158]||(s[158]=t('
julia
ValParameterDomain{T} <: AbstractDomain

A domain to store one value. It is used to generate random parameters.

source

',3))]),i("details",rs,[i("summary",null,[s[159]||(s[159]=i("a",{id:"ConstraintDomains.ValsParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.ValsParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ValsParameterDomain")],-1)),s[160]||(s[160]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[161]||(s[161]=t('
julia
ValsParameterDomain{T} <: AbstractDomain

A domain to store values. It is used to generate random parameters.

source

',3))]),i("details",ks,[i("summary",null,[s[162]||(s[162]=i("a",{id:"Base.rand-constraints-61_constraint_domains-5",href:"#Base.rand-constraints-61_constraint_domains-5"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[163]||(s[163]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[164]||(s[164]=t(`
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

`,12))]),i("details",ds,[i("summary",null,[s[165]||(s[165]=i("a",{id:"ConstraintDomains.generate_parameters-constraints-61_constraint_domains",href:"#ConstraintDomains.generate_parameters-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.generate_parameters")],-1)),s[166]||(s[166]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[167]||(s[167]=t('
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source

',3))])])}const Fs=l(r,[["render",cs]]);export{Cs as __pageData,Fs as default}; diff --git a/dev/assets/constraints_61_constraint_domains.md.RArUieSY.js b/dev/assets/constraints_61_constraint_domains.md.RArUieSY.js deleted file mode 100644 index be04a7f..0000000 --- a/dev/assets/constraints_61_constraint_domains.md.RArUieSY.js +++ /dev/null @@ -1,34 +0,0 @@ -import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.CBLuZwrP.js";const u=JSON.parse('{"title":"ConstraintDomains.jl: Defining Variables and Exploring Domains","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/61_constraint_domains.md","filePath":"constraints/61_constraint_domains.md","lastUpdated":null}'),n={name:"constraints/61_constraint_domains.md"},e=t(`

ConstraintDomains.jl: Defining Variables and Exploring Domains

ConstraintDomains.jl is the standard way to define variables and explore domains in the Julia Constraints ecosystem. This package can be used to specify both discrete and continuous domains. Explorations features are primarily related to learning about constraints, aka constraint learning.

Most users should use it through JuMP/MOI interfaces.

Commons

# ConstraintDomains.AbstractDomainType.
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

  • Base.∈(val, ::D)

  • Base.rand(::D)

  • Base.length(::D) that is the number of elements in a discrete domain, and the distance between bounds or similar for a continuous domain

Additionally, if the domain is used in a dynamic context, it can extend

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source


# ConstraintDomains.EmptyDomainType.
julia
EmptyDomain

A struct to handle yet to be defined domains.

source


# ConstraintDomains.domainFunction.
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
-domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

julia
domain(values)
-domain(range::R) where {T <: Real, R <: AbstractRange{T}}

Construct either a SetDomain or a RangeDomain.

julia
d1 = domain(1:5)
-d2 = domain([53.69, 89.2, 0.12])
-d3 = domain([2//3, 89//123])
-d4 = domain(4.3)
-d5 = domain(1,42,86.9)

source


# ConstraintDomains.domain_sizeFunction.
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source


# ConstraintDomains.get_domainFunction.
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source


# ConstraintDomains.to_domainsFunction.
julia
to_domains(args...)

Convert various arguments into valid domains format.

source


Extension to Base module

# Base.inFunction.
julia
x::Variable constraint
-value  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I\` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source


# Base.randFunction.
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source


# Base.isemptyFunction.
julia
Base.isempty(d <: AbstractDomain)

Fallback method for isempty(d) that return length(d) == 0 which default to 0.

source


# Base.randFunction.
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source


# Base.stringFunction.
julia
Base.string(D::Vector{<:AbstractDomain})
-Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source


Performances

Bench Evolution CommonChair Evolution Common

Continuous

# ConstraintDomains.ContinuousDomainType.
julia
ContinuousDomain{T <: Real} <: AbstractDomain

An abstract supertype for all continuous domains.

source


# ConstraintDomains.IntervalsType.
julia
Intervals{T <: Real} <: ContinuousDomain{T}

An encapsuler to store a vector of PatternFolds.Interval. Dynamic changes to Intervals are not handled yet.

source


# ConstraintDomains.domainFunction.
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
-domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

julia
domain(values)
-domain(range::R) where {T <: Real, R <: AbstractRange{T}}

Construct either a SetDomain or a RangeDomain.

julia
d1 = domain(1:5)
-d2 = domain([53.69, 89.2, 0.12])
-d3 = domain([2//3, 89//123])
-d4 = domain(4.3)
-d5 = domain(1,42,86.9)

source


# ConstraintDomains.domain_sizeFunction.
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source


# ConstraintDomains.merge_domainsFunction.
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source


# ConstraintDomains.intersect_domainsFunction.
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source


# ConstraintDomains.intersect_domains!Function.
julia
intersect_domains!(is, i, new_itvls)

Compute the intersections of a domain with an interval and store the results in new_itvls.

Arguments

  • is::IS: a collection of intervals.

  • i::I: an interval.

  • new_itvls::Vector{I}: a vector to store the results.

source


# ConstraintDomains.sizeFunction.
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source


Extension to Base module

# Base.lengthFunction.
julia
length(layer)

Return the number of operations in a layer.

source

julia
Base.length(icn)

Return the total number of operations of an ICN.

source

julia
Base.rand(d <: AbstractDomain)

Fallback method for length(d) that return 0.

source

julia
Base.length(itv::Intervals)

Return the sum of the length of each interval in itv.

source

julia
Base.length(d::D) where D <: DiscreteDomain

Return the number of points in d.

source


# Base.randFunction.
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source


# Base.inFunction.
julia
x::Variable constraint
-value  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I\` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source


# Base.stringFunction.
julia
Base.string(D::Vector{<:AbstractDomain})
-Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source


Performances

Bench Evolution ContinuousChair Evolution Continuous

Discrete

# ConstraintDomains.DiscreteDomainType.
julia
DiscreteDomain{T <: Number} <: AbstractDomain

An abstract supertype for discrete domains (set, range).

source


# ConstraintDomains.SetDomainType.
julia
SetDomain{T <: Number} <: DiscreteDomain{T}

Domain that stores discrete values as a set of (unordered) points.

source


# ConstraintDomains.RangeDomainType.
julia
RangeDomain

A discrete domain defined by a range <: AbstractRange{Real}. As ranges are immutable in Julia, changes in RangeDomain must use set_domain!.

source


# ConstraintDomains.ArbitraryDomainFunction.
julia
ArbitraryDomain{T} <: DiscreteDomain{T}

A domain type that stores arbitrary values, possibly non numeric, of type T.

source


# ConstraintDomains.domainFunction.
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
-domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

julia
domain(values)
-domain(range::R) where {T <: Real, R <: AbstractRange{T}}

Construct either a SetDomain or a RangeDomain.

julia
d1 = domain(1:5)
-d2 = domain([53.69, 89.2, 0.12])
-d3 = domain([2//3, 89//123])
-d4 = domain(4.3)
-d5 = domain(1,42,86.9)

source


# ConstraintDomains.domain_sizeFunction.
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source


# ConstraintDomains.add!Function.
julia
add!(d::SetDomain, value)

Add value to the list of points in d.

source


# ConstraintDomains.merge_domainsFunction.
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source


# ConstraintDomains.intersect_domainsFunction.
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source


# ConstraintDomains.sizeFunction.
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source


Extension to Base module

# Base.delete!Function.
julia
Base.delete!(d::SetDomain, value)(d::SetDomain, value)

Delete value from the list of points in d.

source


# Base.lengthFunction.
julia
length(layer)

Return the number of operations in a layer.

source

julia
Base.length(icn)

Return the total number of operations of an ICN.

source

julia
Base.rand(d <: AbstractDomain)

Fallback method for length(d) that return 0.

source

julia
Base.length(itv::Intervals)

Return the sum of the length of each interval in itv.

source

julia
Base.length(d::D) where D <: DiscreteDomain

Return the number of points in d.

source


# Base.randFunction.
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source


# Base.inFunction.
julia
x::Variable constraint
-value  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I\` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source


# Base.stringFunction.
julia
Base.string(D::Vector{<:AbstractDomain})
-Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source


Performances

Bench Evolution DiscreteChair Evolution Discrete

General

# Base.eltypeFunction.
julia
Base.eltype(::AbstractDomain)

Extend eltype for domains.

source


# Base.convertFunction.
julia
Base.convert(::Type{Union{Intervals, RangeDomain}}, d::Union{Intervals, RangeDomain})

Extends Base.convert for domains.

source


Exploration

# ConstraintDomains.ExploreSettingsType.
julia
ExploreSettings(domains; 
-                complete_search_limit = 10^6, 
-                max_samplings = sum(domain_size, domains), 
-                search = :flexible, 
-                solutions_limit = floor(Int, sqrt(max_samplings)))

Create an ExploreSettings object to configure the exploration of a search space composed of a collection of domains.

Arguments

  • domains: A collection of domains to be explored.

  • complete_search_limit: An integer specifying the maximum limit for complete search iterations. Default is 10^6.

  • max_samplings: An integer specifying the maximum number of samplings. Default is the sum of domain sizes.

  • search: A symbol indicating the type of search to perform. Default is :flexible.

  • solutions_limit: An integer specifying the limit on the number of solutions. Default is the floor of the square root of max_samplings.

Returns

  • ExploreSettings object with the specified settings.

source


# ConstraintDomains._exploreFunction.
julia
_explore(args...)

Internals of the explore function. Behavior is automatically adjusted on the kind of exploration: :flexible, :complete, :partial.

source


# ConstraintDomains.exploreFunction.
julia
explore(domains, concept; settings = ExploreSettings(domains), parameters...)

Search (a part of) a search space and return a pair of vectors of configurations: (solutions, non_solutions). The exploration behavior is determined based on the settings.

Arguments

  • domains: A collection of domains to be explored.

  • concept: The concept representing the constraint to be targeted.

  • settings: An optional ExploreSettings object to configure the exploration. Default is ExploreSettings(domains).

  • parameters...: Additional parameters for the concept.

Returns

  • A tuple of sets: (solutions, non_solutions).

source


Performances

Bench Evolution ExplorationChair Evolution Exploration

Parameters

# ConstraintDomains.BoolParameterDomainType.
julia
BoolParameterDomain <: AbstractDomain

A domain to store boolean values. It is used to generate random parameters.

source


# ConstraintDomains.DimParameterDomainType.
julia
DimParameterDomain <: AbstractDomain

A domain to store dimensions. It is used to generate random parameters.

source


# ConstraintDomains.IdParameterDomainType.
julia
IdParameterDomain <: AbstractDomain

A domain to store ids. It is used to generate random parameters.

source


# ConstraintDomains.FakeAutomatonType.
julia
FakeAutomaton{T} <: ConstraintCommons.AbstractAutomaton

A structure to generate pseudo automaton enough for parameter exploration.

source


# ConstraintCommons.acceptFunction.
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source


# ConstraintDomains.fake_automatonFunction.
julia
fake_automaton(d)

Construct a FakeAutomaton.

source


# ConstraintDomains.LanguageParameterDomainType.
julia
LanguageParameterDomain <: AbstractDomain

A domain to store languages. It is used to generate random parameters.

source


# ConstraintDomains.OpParameterDomainType.
julia
OpParameterDomain{T} <: AbstractDomain

A domain to store operators. It is used to generate random parameters.

source


# ConstraintDomains.PairVarsParameterDomainType.
julia
PairVarsParameterDomain{T} <: AbstractDomain

A domain to store values paired with variables. It is used to generate random parameters.

source


# ConstraintDomains.ValParameterDomainType.
julia
ValParameterDomain{T} <: AbstractDomain

A domain to store one value. It is used to generate random parameters.

source


# ConstraintDomains.ValsParameterDomainType.
julia
ValsParameterDomain{T} <: AbstractDomain

A domain to store values. It is used to generate random parameters.

source


# Base.randFunction.
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source


# ConstraintDomains.generate_parametersFunction.
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source


`,132),l=[e];function r(h,p,o,d,k,c){return a(),i("div",null,l)}const E=s(n,[["render",r]]);export{u as __pageData,E as default}; diff --git a/dev/assets/constraints_61_constraint_domains.md.RArUieSY.lean.js b/dev/assets/constraints_61_constraint_domains.md.RArUieSY.lean.js deleted file mode 100644 index 8460d79..0000000 --- a/dev/assets/constraints_61_constraint_domains.md.RArUieSY.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.CBLuZwrP.js";const u=JSON.parse('{"title":"ConstraintDomains.jl: Defining Variables and Exploring Domains","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/61_constraint_domains.md","filePath":"constraints/61_constraint_domains.md","lastUpdated":null}'),n={name:"constraints/61_constraint_domains.md"},e=t("",132),l=[e];function r(h,p,o,d,k,c){return a(),i("div",null,l)}const E=s(n,[["render",r]]);export{u as __pageData,E as default}; diff --git a/dev/assets/constraints_62_constraints_jl.md.D9UaSr-v.js b/dev/assets/constraints_62_constraints_jl.md.D9UaSr-v.js deleted file mode 100644 index d9f797a..0000000 --- a/dev/assets/constraints_62_constraints_jl.md.D9UaSr-v.js +++ /dev/null @@ -1,10 +0,0 @@ -import{_ as n,c as a,j as s,a as i,a7 as t,o as e}from"./chunks/framework.CBLuZwrP.js";const S=JSON.parse('{"title":"Interacting with Constraints in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/62_constraints_jl.md","filePath":"constraints/62_constraints_jl.md","lastUpdated":null}'),r={name:"constraints/62_constraints_jl.md"},o=t(`

Interacting with Constraints in Julia

Constraints.jl is a pivotal package within Julia Constraints, designed to facilitate the definition, manipulation, and application of constraints in constraint programming (CP).

It also acts as a catalog of various information and features learned about constraints by the learning part of the ecosystem. Per design, we only store the practical information extracted by those tools and not the heavy machinery.

Usual Parameters

The usual constraints of Julia Constraints are heavily inspired by the core constraints of the XCSP3-core standard. The main difference lies in the name chosen to describe the different parameters those core constraints can have.

In XCSP3, the parameters are described based on their roles, which the user can find as keyword argument in the xcsp_ prefixed collection of constraints (for instance xcsp_all_different). In our the Julia Constraints API (JC-API), the keyword arguments correspond to the nature of each parameter.

# ConstraintCommons.USUAL_CONSTRAINT_PARAMETERSConstant.
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
-    :bool, # boolean parameter
-    :dim, # dimension, an integer parameter used along the pair_vars or vals parameters
-    :id, # index to target one variable in the input vector
-    :language, # describe a regular language such as an automaton or a MDD
-    :op, # an operator such as comparison or arithmetic operator
-    :pair_vars, # a list of parameters that are paired with each variable in the input vector
-    :val, # one scalar value
-    :vals, # a list of scalar values (independent of the input vector size)
-]

source


Concepts, Error Functions, and QUBO matrices

One major use of this collection of usual constraint is to extract the concept or the error function (error_f) of a given constraint.

# Constraints.conceptFunction.
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source

julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

  • s::Symbol: the constraint name.

  • args...: the arguments to apply the concept to.

  • kargs...: the keyword arguments to apply the concept to.

Example

julia
concept(:all_different, [1, 2, 3])

source


`,12),l=s("code",null,"error_f",-1),p={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},h={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.76ex",height:"1.557ex",role:"img",focusable:"false",viewBox:"0 -666 778 688","aria-hidden":"true"},c=t('',1),d=[c],k=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"0.")])],-1),u={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.76ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 778 666","aria-hidden":"true"},b=t('',1),C=[b],m=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"1.")])],-1),E=t('

Efficient versions of error_r are either hand-coded or generated through CompositionalNetworks.jl.

# Constraints.error_fFunction.
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source


Finally, another use is to provide QUBO matrices of those usual constraints through QUBOConstraints.jl. The syntax and interface for this feature are still a work in progress.

Usual Constraints

We provide a couple of methods to navigate the usual constraints extracted from XCSP3-Core.

# Constraints.USUAL_CONSTRAINTSConstant.
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source


# Constraints.describeFunction.
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

  • constraints::Dict{Symbol,Constraint}: dictionary of constraints to describe. Default is USUAL_CONSTRAINTS.

  • width::Int: width of the table.

Example

julia
describe()

source


# Constraints.constraints_parametersFunction.
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_parameters()

source


# Constraints.constraints_descriptionsFunction.
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_descriptions()

source


',14);function y(_,v,f,x,A,T){return e(),a("div",null,[o,s("p",null,[i("Note that the error function is a finer estimation of how much a constraint is violated or not. By default, the "),l,i(" method simply return "),s("mjx-container",p,[(e(),a("svg",h,d)),k]),i(" if the constraint is satisfied or "),s("mjx-container",u,[(e(),a("svg",g,C)),m]),i(" otherwise.")]),E])}const j=n(r,[["render",y]]);export{S as __pageData,j as default}; diff --git a/dev/assets/constraints_62_constraints_jl.md.D9UaSr-v.lean.js b/dev/assets/constraints_62_constraints_jl.md.D9UaSr-v.lean.js deleted file mode 100644 index 8db3343..0000000 --- a/dev/assets/constraints_62_constraints_jl.md.D9UaSr-v.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as n,c as a,j as s,a as i,a7 as t,o as e}from"./chunks/framework.CBLuZwrP.js";const S=JSON.parse('{"title":"Interacting with Constraints in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/62_constraints_jl.md","filePath":"constraints/62_constraints_jl.md","lastUpdated":null}'),r={name:"constraints/62_constraints_jl.md"},o=t("",12),l=s("code",null,"error_f",-1),p={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},h={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.76ex",height:"1.557ex",role:"img",focusable:"false",viewBox:"0 -666 778 688","aria-hidden":"true"},c=t("",1),d=[c],k=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"0.")])],-1),u={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.76ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 778 666","aria-hidden":"true"},b=t("",1),C=[b],m=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"1.")])],-1),E=t("",14);function y(_,v,f,x,A,T){return e(),a("div",null,[o,s("p",null,[i("Note that the error function is a finer estimation of how much a constraint is violated or not. By default, the "),l,i(" method simply return "),s("mjx-container",p,[(e(),a("svg",h,d)),k]),i(" if the constraint is satisfied or "),s("mjx-container",u,[(e(),a("svg",g,C)),m]),i(" otherwise.")]),E])}const j=n(r,[["render",y]]);export{S as __pageData,j as default}; diff --git a/dev/assets/constraints_62_constraints_jl.md.DDHT3MAz.js b/dev/assets/constraints_62_constraints_jl.md.DDHT3MAz.js new file mode 100644 index 0000000..ad6ca53 --- /dev/null +++ b/dev/assets/constraints_62_constraints_jl.md.DDHT3MAz.js @@ -0,0 +1,10 @@ +import{_ as r,c as l,a5 as a,j as t,a as i,G as e,B as p,o}from"./chunks/framework.CJakPlgM.js";const S=JSON.parse('{"title":"Interacting with Constraints in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/62_constraints_jl.md","filePath":"constraints/62_constraints_jl.md","lastUpdated":null}'),h={name:"constraints/62_constraints_jl.md"},d={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},k={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.76ex",height:"1.557ex",role:"img",focusable:"false",viewBox:"0 -666 778 688","aria-hidden":"true"},g={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},m={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.76ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 778 666","aria-hidden":"true"},C={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""};function v(j,s,F,x,A,T){const n=p("Badge");return o(),l("div",null,[s[30]||(s[30]=a('

Interacting with Constraints in Julia

Constraints.jl is a pivotal package within Julia Constraints, designed to facilitate the definition, manipulation, and application of constraints in constraint programming (CP).

It also acts as a catalog of various information and features learned about constraints by the learning part of the ecosystem. Per design, we only store the practical information extracted by those tools and not the heavy machinery.

Usual Parameters

The usual constraints of Julia Constraints are heavily inspired by the core constraints of the XCSP3-core standard. The main difference lies in the name chosen to describe the different parameters those core constraints can have.

In XCSP3, the parameters are described based on their roles, which the user can find as keyword argument in the xcsp_ prefixed collection of constraints (for instance xcsp_all_different). In our the Julia Constraints API (JC-API), the keyword arguments correspond to the nature of each parameter.

',6)),t("details",d,[t("summary",null,[s[0]||(s[0]=t("a",{id:"ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS-constraints-62_constraints_jl",href:"#ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS")],-1)),s[1]||(s[1]=i()),e(n,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[2]||(s[2]=a(`
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
+    :bool, # boolean parameter
+    :dim, # dimension, an integer parameter used along the pair_vars or vals parameters
+    :id, # index to target one variable in the input vector
+    :language, # describe a regular language such as an automaton or a MDD
+    :op, # an operator such as comparison or arithmetic operator
+    :pair_vars, # a list of parameters that are paired with each variable in the input vector
+    :val, # one scalar value
+    :vals, # a list of scalar values (independent of the input vector size)
+]

source

`,4))]),s[31]||(s[31]=t("h2",{id:"Concepts,-Error-Functions,-and-QUBO-matrices",tabindex:"-1"},[i("Concepts, Error Functions, and QUBO matrices "),t("a",{class:"header-anchor",href:"#Concepts,-Error-Functions,-and-QUBO-matrices","aria-label":'Permalink to "Concepts, Error Functions, and QUBO matrices {#Concepts,-Error-Functions,-and-QUBO-matrices}"'},"​")],-1)),s[32]||(s[32]=t("p",null,[i("One major use of this collection of usual constraint is to extract the "),t("code",null,"concept"),i(" or the error function ("),t("code",null,"error_f"),i(") of a given constraint.")],-1)),t("details",c,[t("summary",null,[s[3]||(s[3]=t("a",{id:"Constraints.concept-constraints-62_constraints_jl",href:"#Constraints.concept-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[4]||(s[4]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=a('
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source

julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

  • s::Symbol: the constraint name.

  • args...: the arguments to apply the concept to.

  • kargs...: the keyword arguments to apply the concept to.

Example

julia
concept(:all_different, [1, 2, 3])

source

',10))]),t("p",null,[s[10]||(s[10]=i("Note that the error function is a finer estimation of how much a constraint is violated or not. By default, the ")),s[11]||(s[11]=t("code",null,"error_f",-1)),s[12]||(s[12]=i(" method simply return ")),t("mjx-container",k,[(o(),l("svg",u,s[6]||(s[6]=[a('',1)]))),s[7]||(s[7]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"0.")])],-1))]),s[13]||(s[13]=i(" if the constraint is satisfied or ")),t("mjx-container",g,[(o(),l("svg",m,s[8]||(s[8]=[a('',1)]))),s[9]||(s[9]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"1.")])],-1))]),s[14]||(s[14]=i(" otherwise."))]),s[33]||(s[33]=t("p",null,[i("Efficient versions of "),t("code",null,"error_r"),i(" are either hand-coded or generated through "),t("code",null,"CompositionalNetworks.jl"),i(".")],-1)),t("details",C,[t("summary",null,[s[15]||(s[15]=t("a",{id:"Constraints.error_f-constraints-62_constraints_jl",href:"#Constraints.error_f-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.error_f")],-1)),s[16]||(s[16]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=a('
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source

',3))]),s[34]||(s[34]=t("p",null,[i("Finally, another use is to provide "),t("code",null,"QUBO"),i(" matrices of those usual constraints through "),t("code",null,"QUBOConstraints.jl"),i(". The syntax and interface for this feature are still a work in progress.")],-1)),s[35]||(s[35]=t("h2",{id:"Usual-Constraints",tabindex:"-1"},[i("Usual Constraints "),t("a",{class:"header-anchor",href:"#Usual-Constraints","aria-label":'Permalink to "Usual Constraints {#Usual-Constraints}"'},"​")],-1)),s[36]||(s[36]=t("p",null,[i("We provide a couple of methods to navigate the usual constraints extracted from "),t("em",null,"XCSP3-Core"),i(".")],-1)),t("details",y,[t("summary",null,[s[18]||(s[18]=t("a",{id:"Constraints.USUAL_CONSTRAINTS-constraints-62_constraints_jl",href:"#Constraints.USUAL_CONSTRAINTS-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.USUAL_CONSTRAINTS")],-1)),s[19]||(s[19]=i()),e(n,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[20]||(s[20]=a('
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source

',6))]),t("details",E,[t("summary",null,[s[21]||(s[21]=t("a",{id:"Constraints.describe-constraints-62_constraints_jl",href:"#Constraints.describe-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.describe")],-1)),s[22]||(s[22]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[23]||(s[23]=a('
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

  • constraints::Dict{Symbol,Constraint}: dictionary of constraints to describe. Default is USUAL_CONSTRAINTS.

  • width::Int: width of the table.

Example

julia
describe()

source

',7))]),t("details",b,[t("summary",null,[s[24]||(s[24]=t("a",{id:"Constraints.constraints_parameters-constraints-62_constraints_jl",href:"#Constraints.constraints_parameters-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.constraints_parameters")],-1)),s[25]||(s[25]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=a('
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_parameters()

source

',7))]),t("details",f,[t("summary",null,[s[27]||(s[27]=t("a",{id:"Constraints.constraints_descriptions-constraints-62_constraints_jl",href:"#Constraints.constraints_descriptions-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.constraints_descriptions")],-1)),s[28]||(s[28]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[29]||(s[29]=a('
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_descriptions()

source

',7))])])}const _=r(h,[["render",v]]);export{S as __pageData,_ as default}; diff --git a/dev/assets/constraints_62_constraints_jl.md.DDHT3MAz.lean.js b/dev/assets/constraints_62_constraints_jl.md.DDHT3MAz.lean.js new file mode 100644 index 0000000..ad6ca53 --- /dev/null +++ b/dev/assets/constraints_62_constraints_jl.md.DDHT3MAz.lean.js @@ -0,0 +1,10 @@ +import{_ as r,c as l,a5 as a,j as t,a as i,G as e,B as p,o}from"./chunks/framework.CJakPlgM.js";const S=JSON.parse('{"title":"Interacting with Constraints in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/62_constraints_jl.md","filePath":"constraints/62_constraints_jl.md","lastUpdated":null}'),h={name:"constraints/62_constraints_jl.md"},d={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},k={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.76ex",height:"1.557ex",role:"img",focusable:"false",viewBox:"0 -666 778 688","aria-hidden":"true"},g={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},m={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.76ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 778 666","aria-hidden":"true"},C={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""};function v(j,s,F,x,A,T){const n=p("Badge");return o(),l("div",null,[s[30]||(s[30]=a('

Interacting with Constraints in Julia

Constraints.jl is a pivotal package within Julia Constraints, designed to facilitate the definition, manipulation, and application of constraints in constraint programming (CP).

It also acts as a catalog of various information and features learned about constraints by the learning part of the ecosystem. Per design, we only store the practical information extracted by those tools and not the heavy machinery.

Usual Parameters

The usual constraints of Julia Constraints are heavily inspired by the core constraints of the XCSP3-core standard. The main difference lies in the name chosen to describe the different parameters those core constraints can have.

In XCSP3, the parameters are described based on their roles, which the user can find as keyword argument in the xcsp_ prefixed collection of constraints (for instance xcsp_all_different). In our the Julia Constraints API (JC-API), the keyword arguments correspond to the nature of each parameter.

',6)),t("details",d,[t("summary",null,[s[0]||(s[0]=t("a",{id:"ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS-constraints-62_constraints_jl",href:"#ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS")],-1)),s[1]||(s[1]=i()),e(n,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[2]||(s[2]=a(`
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
+    :bool, # boolean parameter
+    :dim, # dimension, an integer parameter used along the pair_vars or vals parameters
+    :id, # index to target one variable in the input vector
+    :language, # describe a regular language such as an automaton or a MDD
+    :op, # an operator such as comparison or arithmetic operator
+    :pair_vars, # a list of parameters that are paired with each variable in the input vector
+    :val, # one scalar value
+    :vals, # a list of scalar values (independent of the input vector size)
+]

source

`,4))]),s[31]||(s[31]=t("h2",{id:"Concepts,-Error-Functions,-and-QUBO-matrices",tabindex:"-1"},[i("Concepts, Error Functions, and QUBO matrices "),t("a",{class:"header-anchor",href:"#Concepts,-Error-Functions,-and-QUBO-matrices","aria-label":'Permalink to "Concepts, Error Functions, and QUBO matrices {#Concepts,-Error-Functions,-and-QUBO-matrices}"'},"​")],-1)),s[32]||(s[32]=t("p",null,[i("One major use of this collection of usual constraint is to extract the "),t("code",null,"concept"),i(" or the error function ("),t("code",null,"error_f"),i(") of a given constraint.")],-1)),t("details",c,[t("summary",null,[s[3]||(s[3]=t("a",{id:"Constraints.concept-constraints-62_constraints_jl",href:"#Constraints.concept-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[4]||(s[4]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=a('
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source

julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

  • s::Symbol: the constraint name.

  • args...: the arguments to apply the concept to.

  • kargs...: the keyword arguments to apply the concept to.

Example

julia
concept(:all_different, [1, 2, 3])

source

',10))]),t("p",null,[s[10]||(s[10]=i("Note that the error function is a finer estimation of how much a constraint is violated or not. By default, the ")),s[11]||(s[11]=t("code",null,"error_f",-1)),s[12]||(s[12]=i(" method simply return ")),t("mjx-container",k,[(o(),l("svg",u,s[6]||(s[6]=[a('',1)]))),s[7]||(s[7]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"0.")])],-1))]),s[13]||(s[13]=i(" if the constraint is satisfied or ")),t("mjx-container",g,[(o(),l("svg",m,s[8]||(s[8]=[a('',1)]))),s[9]||(s[9]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"1.")])],-1))]),s[14]||(s[14]=i(" otherwise."))]),s[33]||(s[33]=t("p",null,[i("Efficient versions of "),t("code",null,"error_r"),i(" are either hand-coded or generated through "),t("code",null,"CompositionalNetworks.jl"),i(".")],-1)),t("details",C,[t("summary",null,[s[15]||(s[15]=t("a",{id:"Constraints.error_f-constraints-62_constraints_jl",href:"#Constraints.error_f-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.error_f")],-1)),s[16]||(s[16]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=a('
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source

',3))]),s[34]||(s[34]=t("p",null,[i("Finally, another use is to provide "),t("code",null,"QUBO"),i(" matrices of those usual constraints through "),t("code",null,"QUBOConstraints.jl"),i(". The syntax and interface for this feature are still a work in progress.")],-1)),s[35]||(s[35]=t("h2",{id:"Usual-Constraints",tabindex:"-1"},[i("Usual Constraints "),t("a",{class:"header-anchor",href:"#Usual-Constraints","aria-label":'Permalink to "Usual Constraints {#Usual-Constraints}"'},"​")],-1)),s[36]||(s[36]=t("p",null,[i("We provide a couple of methods to navigate the usual constraints extracted from "),t("em",null,"XCSP3-Core"),i(".")],-1)),t("details",y,[t("summary",null,[s[18]||(s[18]=t("a",{id:"Constraints.USUAL_CONSTRAINTS-constraints-62_constraints_jl",href:"#Constraints.USUAL_CONSTRAINTS-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.USUAL_CONSTRAINTS")],-1)),s[19]||(s[19]=i()),e(n,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[20]||(s[20]=a('
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source

',6))]),t("details",E,[t("summary",null,[s[21]||(s[21]=t("a",{id:"Constraints.describe-constraints-62_constraints_jl",href:"#Constraints.describe-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.describe")],-1)),s[22]||(s[22]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[23]||(s[23]=a('
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

  • constraints::Dict{Symbol,Constraint}: dictionary of constraints to describe. Default is USUAL_CONSTRAINTS.

  • width::Int: width of the table.

Example

julia
describe()

source

',7))]),t("details",b,[t("summary",null,[s[24]||(s[24]=t("a",{id:"Constraints.constraints_parameters-constraints-62_constraints_jl",href:"#Constraints.constraints_parameters-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.constraints_parameters")],-1)),s[25]||(s[25]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=a('
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_parameters()

source

',7))]),t("details",f,[t("summary",null,[s[27]||(s[27]=t("a",{id:"Constraints.constraints_descriptions-constraints-62_constraints_jl",href:"#Constraints.constraints_descriptions-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.constraints_descriptions")],-1)),s[28]||(s[28]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[29]||(s[29]=a('
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_descriptions()

source

',7))])])}const _=r(h,[["render",v]]);export{S as __pageData,_ as default}; diff --git a/dev/assets/cp_00_intro.md.CsgSXI99.js b/dev/assets/cp_00_intro.md.CsgSXI99.js new file mode 100644 index 0000000..b6cb860 --- /dev/null +++ b/dev/assets/cp_00_intro.md.CsgSXI99.js @@ -0,0 +1 @@ +import{_ as a,c as o,j as t,a as n,o as r}from"./chunks/framework.CJakPlgM.js";const h=JSON.parse('{"title":"Welcome to Julia Constraints","description":"","frontmatter":{},"headers":[],"relativePath":"cp/00_intro.md","filePath":"cp/00_intro.md","lastUpdated":null}'),i={name:"cp/00_intro.md"};function s(l,e,c,d,m,p){return r(),o("div",null,e[0]||(e[0]=[t("h1",{id:"Welcome-to-Julia-Constraints",tabindex:"-1"},[n("Welcome to Julia Constraints "),t("a",{class:"header-anchor",href:"#Welcome-to-Julia-Constraints","aria-label":'Permalink to "Welcome to Julia Constraints {#Welcome-to-Julia-Constraints}"'},"​")],-1),t("p",null,"An introductory post/chapter that provides an overview of the JuliaConstraint organization, its mission, and what readers can expect to learn from the content. Highlight the importance of Constraint Programming (CP) and optimization in solving real-world problems.",-1)]))}const _=a(i,[["render",s]]);export{h as __pageData,_ as default}; diff --git a/dev/assets/cp_00_intro.md.CsgSXI99.lean.js b/dev/assets/cp_00_intro.md.CsgSXI99.lean.js new file mode 100644 index 0000000..b6cb860 --- /dev/null +++ b/dev/assets/cp_00_intro.md.CsgSXI99.lean.js @@ -0,0 +1 @@ +import{_ as a,c as o,j as t,a as n,o as r}from"./chunks/framework.CJakPlgM.js";const h=JSON.parse('{"title":"Welcome to Julia Constraints","description":"","frontmatter":{},"headers":[],"relativePath":"cp/00_intro.md","filePath":"cp/00_intro.md","lastUpdated":null}'),i={name:"cp/00_intro.md"};function s(l,e,c,d,m,p){return r(),o("div",null,e[0]||(e[0]=[t("h1",{id:"Welcome-to-Julia-Constraints",tabindex:"-1"},[n("Welcome to Julia Constraints "),t("a",{class:"header-anchor",href:"#Welcome-to-Julia-Constraints","aria-label":'Permalink to "Welcome to Julia Constraints {#Welcome-to-Julia-Constraints}"'},"​")],-1),t("p",null,"An introductory post/chapter that provides an overview of the JuliaConstraint organization, its mission, and what readers can expect to learn from the content. Highlight the importance of Constraint Programming (CP) and optimization in solving real-world problems.",-1)]))}const _=a(i,[["render",s]]);export{h as __pageData,_ as default}; diff --git a/dev/assets/cp_00_intro.md.Mkmho_dM.js b/dev/assets/cp_00_intro.md.Mkmho_dM.js deleted file mode 100644 index 4cebd65..0000000 --- a/dev/assets/cp_00_intro.md.Mkmho_dM.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,c as o,o as a,j as t,a as n}from"./chunks/framework.CBLuZwrP.js";const C=JSON.parse('{"title":"Welcome to Julia Constraints","description":"","frontmatter":{},"headers":[],"relativePath":"cp/00_intro.md","filePath":"cp/00_intro.md","lastUpdated":null}'),i={name:"cp/00_intro.md"},r=t("h1",{id:"Welcome-to-Julia-Constraints",tabindex:"-1"},[n("Welcome to Julia Constraints "),t("a",{class:"header-anchor",href:"#Welcome-to-Julia-Constraints","aria-label":'Permalink to "Welcome to Julia Constraints {#Welcome-to-Julia-Constraints}"'},"​")],-1),s=t("p",null,"An introductory post/chapter that provides an overview of the JuliaConstraint organization, its mission, and what readers can expect to learn from the content. Highlight the importance of Constraint Programming (CP) and optimization in solving real-world problems.",-1),c=[r,s];function l(d,m,p,_,h,u){return a(),o("div",null,c)}const J=e(i,[["render",l]]);export{C as __pageData,J as default}; diff --git a/dev/assets/cp_00_intro.md.Mkmho_dM.lean.js b/dev/assets/cp_00_intro.md.Mkmho_dM.lean.js deleted file mode 100644 index 4cebd65..0000000 --- a/dev/assets/cp_00_intro.md.Mkmho_dM.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,c as o,o as a,j as t,a as n}from"./chunks/framework.CBLuZwrP.js";const C=JSON.parse('{"title":"Welcome to Julia Constraints","description":"","frontmatter":{},"headers":[],"relativePath":"cp/00_intro.md","filePath":"cp/00_intro.md","lastUpdated":null}'),i={name:"cp/00_intro.md"},r=t("h1",{id:"Welcome-to-Julia-Constraints",tabindex:"-1"},[n("Welcome to Julia Constraints "),t("a",{class:"header-anchor",href:"#Welcome-to-Julia-Constraints","aria-label":'Permalink to "Welcome to Julia Constraints {#Welcome-to-Julia-Constraints}"'},"​")],-1),s=t("p",null,"An introductory post/chapter that provides an overview of the JuliaConstraint organization, its mission, and what readers can expect to learn from the content. Highlight the importance of Constraint Programming (CP) and optimization in solving real-world problems.",-1),c=[r,s];function l(d,m,p,_,h,u){return a(),o("div",null,c)}const J=e(i,[["render",l]]);export{C as __pageData,J as default}; diff --git a/dev/assets/cp_10_cp101.md.B-tHlXuM.js b/dev/assets/cp_10_cp101.md.B-tHlXuM.js new file mode 100644 index 0000000..41a9e9b --- /dev/null +++ b/dev/assets/cp_10_cp101.md.B-tHlXuM.js @@ -0,0 +1 @@ +import{_ as i,c as t,a5 as o,o as n}from"./chunks/framework.CJakPlgM.js";const g=JSON.parse('{"title":"Constraint Programming 101","description":"","frontmatter":{},"headers":[],"relativePath":"cp/10_cp101.md","filePath":"cp/10_cp101.md","lastUpdated":null}'),r={name:"cp/10_cp101.md"};function e(s,a,m,c,l,h){return n(),t("div",null,a[0]||(a[0]=[o('

Constraint Programming 101

What is Constraint Programming?

  • Define CP and its significance in solving combinatorial problems.

Basic Concepts and Terminology

  • Introduce key concepts such as constraints, domains, and variables.

How CP differs from other optimization techniques

  • Contrast with other methods like linear programming and metaheuristics.
',7)]))}const p=i(r,[["render",e]]);export{g as __pageData,p as default}; diff --git a/dev/assets/cp_10_cp101.md.B-tHlXuM.lean.js b/dev/assets/cp_10_cp101.md.B-tHlXuM.lean.js new file mode 100644 index 0000000..41a9e9b --- /dev/null +++ b/dev/assets/cp_10_cp101.md.B-tHlXuM.lean.js @@ -0,0 +1 @@ +import{_ as i,c as t,a5 as o,o as n}from"./chunks/framework.CJakPlgM.js";const g=JSON.parse('{"title":"Constraint Programming 101","description":"","frontmatter":{},"headers":[],"relativePath":"cp/10_cp101.md","filePath":"cp/10_cp101.md","lastUpdated":null}'),r={name:"cp/10_cp101.md"};function e(s,a,m,c,l,h){return n(),t("div",null,a[0]||(a[0]=[o('

Constraint Programming 101

What is Constraint Programming?

  • Define CP and its significance in solving combinatorial problems.

Basic Concepts and Terminology

  • Introduce key concepts such as constraints, domains, and variables.

How CP differs from other optimization techniques

  • Contrast with other methods like linear programming and metaheuristics.
',7)]))}const p=i(r,[["render",e]]);export{g as __pageData,p as default}; diff --git a/dev/assets/cp_10_cp101.md.BgtkSTPx.js b/dev/assets/cp_10_cp101.md.BgtkSTPx.js deleted file mode 100644 index f2d5133..0000000 --- a/dev/assets/cp_10_cp101.md.BgtkSTPx.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as i,o as t,a7 as o}from"./chunks/framework.CBLuZwrP.js";const _=JSON.parse('{"title":"Constraint Programming 101","description":"","frontmatter":{},"headers":[],"relativePath":"cp/10_cp101.md","filePath":"cp/10_cp101.md","lastUpdated":null}'),n={name:"cp/10_cp101.md"},r=o('

Constraint Programming 101

What is Constraint Programming?

  • Define CP and its significance in solving combinatorial problems.

Basic Concepts and Terminology

  • Introduce key concepts such as constraints, domains, and variables.

How CP differs from other optimization techniques

  • Contrast with other methods like linear programming and metaheuristics.
',7),e=[r];function s(c,m,l,h,d,g){return t(),i("div",null,e)}const f=a(n,[["render",s]]);export{_ as __pageData,f as default}; diff --git a/dev/assets/cp_10_cp101.md.BgtkSTPx.lean.js b/dev/assets/cp_10_cp101.md.BgtkSTPx.lean.js deleted file mode 100644 index 14067e5..0000000 --- a/dev/assets/cp_10_cp101.md.BgtkSTPx.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as i,o as t,a7 as o}from"./chunks/framework.CBLuZwrP.js";const _=JSON.parse('{"title":"Constraint Programming 101","description":"","frontmatter":{},"headers":[],"relativePath":"cp/10_cp101.md","filePath":"cp/10_cp101.md","lastUpdated":null}'),n={name:"cp/10_cp101.md"},r=o("",7),e=[r];function s(c,m,l,h,d,g){return t(),i("div",null,e)}const f=a(n,[["render",s]]);export{_ as __pageData,f as default}; diff --git a/dev/assets/cp_20_opt.md.C0pIlKYp.js b/dev/assets/cp_20_opt.md.C0pIlKYp.js new file mode 100644 index 0000000..d78a9ec --- /dev/null +++ b/dev/assets/cp_20_opt.md.C0pIlKYp.js @@ -0,0 +1 @@ +import{_ as a,c as t,a5 as e,o as n}from"./chunks/framework.CJakPlgM.js";const h=JSON.parse('{"title":"Dive into Optimization","description":"","frontmatter":{},"headers":[],"relativePath":"cp/20_opt.md","filePath":"cp/20_opt.md","lastUpdated":null}'),o={name:"cp/20_opt.md"};function r(s,i,l,m,c,d){return n(),t("div",null,i[0]||(i[0]=[e('

Dive into Optimization

Understanding Optimization

  • Explanation of optimization, types of optimization problems (e.g., linear, nonlinear, integer programming).

Metaheuristics Overview

  • Introduce concepts like Genetic Algorithms, Simulated Annealing, and Tabu Search.

Mathematical Programming Basics

  • Cover the fundamentals of mathematical programming and its role in optimization.
',7)]))}const u=a(o,[["render",r]]);export{h as __pageData,u as default}; diff --git a/dev/assets/cp_20_opt.md.C0pIlKYp.lean.js b/dev/assets/cp_20_opt.md.C0pIlKYp.lean.js new file mode 100644 index 0000000..d78a9ec --- /dev/null +++ b/dev/assets/cp_20_opt.md.C0pIlKYp.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,a5 as e,o as n}from"./chunks/framework.CJakPlgM.js";const h=JSON.parse('{"title":"Dive into Optimization","description":"","frontmatter":{},"headers":[],"relativePath":"cp/20_opt.md","filePath":"cp/20_opt.md","lastUpdated":null}'),o={name:"cp/20_opt.md"};function r(s,i,l,m,c,d){return n(),t("div",null,i[0]||(i[0]=[e('

Dive into Optimization

Understanding Optimization

  • Explanation of optimization, types of optimization problems (e.g., linear, nonlinear, integer programming).

Metaheuristics Overview

  • Introduce concepts like Genetic Algorithms, Simulated Annealing, and Tabu Search.

Mathematical Programming Basics

  • Cover the fundamentals of mathematical programming and its role in optimization.
',7)]))}const u=a(o,[["render",r]]);export{h as __pageData,u as default}; diff --git a/dev/assets/cp_20_opt.md.Dt2oxPiG.js b/dev/assets/cp_20_opt.md.Dt2oxPiG.js deleted file mode 100644 index b678908..0000000 --- a/dev/assets/cp_20_opt.md.Dt2oxPiG.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as a,o as t,a7 as e}from"./chunks/framework.CBLuZwrP.js";const u=JSON.parse('{"title":"Dive into Optimization","description":"","frontmatter":{},"headers":[],"relativePath":"cp/20_opt.md","filePath":"cp/20_opt.md","lastUpdated":null}'),n={name:"cp/20_opt.md"},o=e('

Dive into Optimization

Understanding Optimization

  • Explanation of optimization, types of optimization problems (e.g., linear, nonlinear, integer programming).

Metaheuristics Overview

  • Introduce concepts like Genetic Algorithms, Simulated Annealing, and Tabu Search.

Mathematical Programming Basics

  • Cover the fundamentals of mathematical programming and its role in optimization.
',7),r=[o];function s(l,m,c,d,h,p){return t(),a("div",null,r)}const g=i(n,[["render",s]]);export{u as __pageData,g as default}; diff --git a/dev/assets/cp_20_opt.md.Dt2oxPiG.lean.js b/dev/assets/cp_20_opt.md.Dt2oxPiG.lean.js deleted file mode 100644 index b972b90..0000000 --- a/dev/assets/cp_20_opt.md.Dt2oxPiG.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as a,o as t,a7 as e}from"./chunks/framework.CBLuZwrP.js";const u=JSON.parse('{"title":"Dive into Optimization","description":"","frontmatter":{},"headers":[],"relativePath":"cp/20_opt.md","filePath":"cp/20_opt.md","lastUpdated":null}'),n={name:"cp/20_opt.md"},o=e("",7),r=[o];function s(l,m,c,d,h,p){return t(),a("div",null,r)}const g=i(n,[["render",s]]);export{u as __pageData,g as default}; diff --git a/dev/assets/cp_30_getting_started.md.2ReSYTYy.js b/dev/assets/cp_30_getting_started.md.2ReSYTYy.js new file mode 100644 index 0000000..2b48cef --- /dev/null +++ b/dev/assets/cp_30_getting_started.md.2ReSYTYy.js @@ -0,0 +1,9 @@ +import{_ as n,c as e,a5 as a,j as i,a as t,o as l}from"./chunks/framework.CJakPlgM.js";const y=JSON.parse('{"title":"Getting Started with Julia for CP and Optimization","description":"","frontmatter":{},"headers":[],"relativePath":"cp/30_getting_started.md","filePath":"cp/30_getting_started.md","lastUpdated":null}'),h={name:"cp/30_getting_started.md"},p={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.867ex",height:"1.984ex",role:"img",focusable:"false",viewBox:"0 -683 7013.4 877","aria-hidden":"true"},d={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},r={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.148ex",height:"2.034ex",role:"img",focusable:"false",viewBox:"0 -705 6695.4 899","aria-hidden":"true"},k={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Q={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.928ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 852 683","aria-hidden":"true"};function g(c,s,u,T,m,v){return l(),e("div",null,[s[11]||(s[11]=a('

Getting Started with Julia for CP and Optimization

Why Julia?

  • Discuss the advantages of Julia for computational science and optimization, highlighting its performance and ease of use.

Setting Up Your Julia Environment

We encourage users to install Julia through juliaup, a version manager for the Julia language. Please look at the official Julia language download page for further information. Once installed, Julia can be used through various editors (Visual Studio Code), notebooks (Pluto.jl), or command-line (REPL).

Although a part of the CP solvers available within the Julia ecosystem have their own interface, we encourage users to use the JuMP modeling language if possible.

Julia Constraints host several solvers(' interfaces). Due to its flexibility in modeling and solving, we will use LocalSearchSolvers.jl through its JuMP interface CBLS.jl as the basic example. Note that depending on the targeted instances, available hardware, and expectations, it is not necessarily the best choice.

All along the documentation, we will try to provide syntax examples for different setup.

julia
using LocalSearchSolvers
julia
using JuMP, CBLS
julia
# TODO: Add other solvers

Your First Julia CP Model

We will start with a classic puzzle game and some of its not that simple variants: the Sudoku.

(From Wikipedia) In classic Sudoku, the objective is to fill a 9 × 9 grid with digits so that each column, each row, and each of the nine 3 × 3 subgrids that compose the grid (also called "boxes", "blocks", or "regions") contains all of the digits from 1 to 9. The puzzle setter provides a partially completed grid, which for a well-posed puzzle has a single solution.

Constraint Programming follows the model-and-solve approach. We first need to model our Sudoku problem.

julia
m = JuMP.Model(CBLS.Optimizer)
julia
# TODO: Add other solvers

But what are the basis of CP models? It is quite simple:

',15)),i("ol",null,[i("li",null,[s[2]||(s[2]=t("A collection ")),i("mjx-container",p,[(l(),e("svg",o,s[0]||(s[0]=[a('',1)]))),s[1]||(s[1]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"X"),i("mo",null,"="),i("msub",null,[i("mi",null,"X"),i("mn",null,"1")]),i("mo",null,","),i("mo",null,"⋯"),i("mo",null,","),i("msub",null,[i("mi",null,"X"),i("mi",null,"n")])])],-1))]),s[3]||(s[3]=t(" of variables with each an associated domain."))])]),s[12]||(s[12]=a('
julia
@variable(m, 1 X[1:9, 1:9]  9, Int)
julia
# TODO: Add other solvers
',1)),i("ol",null,[i("li",null,[s[8]||(s[8]=t("A collection of predicates (called constraints) ")),i("mjx-container",d,[(l(),e("svg",r,s[4]||(s[4]=[a('',1)]))),s[5]||(s[5]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"C"),i("mo",null,"="),i("msub",null,[i("mi",null,"C"),i("mn",null,"1")]),i("mo",null,","),i("mo",null,"⋯"),i("mo",null,","),i("msub",null,[i("mi",null,"C"),i("mi",null,"n")])])],-1))]),s[9]||(s[9]=t(" over (subsets of) ")),i("mjx-container",k,[(l(),e("svg",Q,s[6]||(s[6]=[i("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[i("g",{"data-mml-node":"math"},[i("g",{"data-mml-node":"mi"},[i("path",{"data-c":"1D44B",d:"M42 0H40Q26 0 26 11Q26 15 29 27Q33 41 36 43T55 46Q141 49 190 98Q200 108 306 224T411 342Q302 620 297 625Q288 636 234 637H206Q200 643 200 645T202 664Q206 677 212 683H226Q260 681 347 681Q380 681 408 681T453 682T473 682Q490 682 490 671Q490 670 488 658Q484 643 481 640T465 637Q434 634 411 620L488 426L541 485Q646 598 646 610Q646 628 622 635Q617 635 609 637Q594 637 594 648Q594 650 596 664Q600 677 606 683H618Q619 683 643 683T697 681T738 680Q828 680 837 683H845Q852 676 852 672Q850 647 840 637H824Q790 636 763 628T722 611T698 593L687 584Q687 585 592 480L505 384Q505 383 536 304T601 142T638 56Q648 47 699 46Q734 46 734 37Q734 35 732 23Q728 7 725 4T711 1Q708 1 678 1T589 2Q528 2 496 2T461 1Q444 1 444 10Q444 11 446 25Q448 35 450 39T455 44T464 46T480 47T506 54Q523 62 523 64Q522 64 476 181L429 299Q241 95 236 84Q232 76 232 72Q232 53 261 47Q262 47 267 47T273 46Q276 46 277 46T280 45T283 42T284 35Q284 26 282 19Q279 6 276 4T261 1Q258 1 243 1T201 2T142 2Q64 2 42 0Z",style:{"stroke-width":"3"}})])])],-1)]))),s[7]||(s[7]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"X")])],-1))]),s[10]||(s[10]=t("."))])]),s[13]||(s[13]=a(`

When modeling problems as CP, one might define and use their own predicates. However, a large collection of already defined constraints exists. One, if not the most, iconic global constraint is called AllDifferent. It ensures that all variables take distinct values.

Sudoku puzzles can be defined using only this one constraint applied to different subsets of variables.

julia
for i in 1:9
+        @constraint(m, X[i,:] in AllDifferent()) # rows
+        @constraint(m, X[:,i] in AllDifferent()) # columns
+end
julia
# TODO: Add other solvers

The last series of AllDifferent constraint is less straight forward. We need to ensure that each 3 × 3 subgrid (block) is filled with distinct values.

julia
for i in 0:2, j in 0:2 # blocks
+    @constraint(
+        m,
+        vec(X[(3i+1):(3(i+1)), (3j+1):(3(j+1))]) in AllDifferent(),
+    )
+end
julia
# TODO: Add other solvers

We can now simply run our solver to look for a feasible solution.

julia
optimize!(m)

Note that this is heuristic solver, we might not get a feasible solution! Let's check it out. The value function print the value of a JuMP variable. We can cast it over a collection with the value. syntax.

julia
value.(X)
`,9))])}const E=n(h,[["render",g]]);export{y as __pageData,E as default}; diff --git a/dev/assets/cp_30_getting_started.md.2ReSYTYy.lean.js b/dev/assets/cp_30_getting_started.md.2ReSYTYy.lean.js new file mode 100644 index 0000000..2b48cef --- /dev/null +++ b/dev/assets/cp_30_getting_started.md.2ReSYTYy.lean.js @@ -0,0 +1,9 @@ +import{_ as n,c as e,a5 as a,j as i,a as t,o as l}from"./chunks/framework.CJakPlgM.js";const y=JSON.parse('{"title":"Getting Started with Julia for CP and Optimization","description":"","frontmatter":{},"headers":[],"relativePath":"cp/30_getting_started.md","filePath":"cp/30_getting_started.md","lastUpdated":null}'),h={name:"cp/30_getting_started.md"},p={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.867ex",height:"1.984ex",role:"img",focusable:"false",viewBox:"0 -683 7013.4 877","aria-hidden":"true"},d={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},r={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.148ex",height:"2.034ex",role:"img",focusable:"false",viewBox:"0 -705 6695.4 899","aria-hidden":"true"},k={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Q={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.928ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 852 683","aria-hidden":"true"};function g(c,s,u,T,m,v){return l(),e("div",null,[s[11]||(s[11]=a('

Getting Started with Julia for CP and Optimization

Why Julia?

  • Discuss the advantages of Julia for computational science and optimization, highlighting its performance and ease of use.

Setting Up Your Julia Environment

We encourage users to install Julia through juliaup, a version manager for the Julia language. Please look at the official Julia language download page for further information. Once installed, Julia can be used through various editors (Visual Studio Code), notebooks (Pluto.jl), or command-line (REPL).

Although a part of the CP solvers available within the Julia ecosystem have their own interface, we encourage users to use the JuMP modeling language if possible.

Julia Constraints host several solvers(' interfaces). Due to its flexibility in modeling and solving, we will use LocalSearchSolvers.jl through its JuMP interface CBLS.jl as the basic example. Note that depending on the targeted instances, available hardware, and expectations, it is not necessarily the best choice.

All along the documentation, we will try to provide syntax examples for different setup.

julia
using LocalSearchSolvers
julia
using JuMP, CBLS
julia
# TODO: Add other solvers

Your First Julia CP Model

We will start with a classic puzzle game and some of its not that simple variants: the Sudoku.

(From Wikipedia) In classic Sudoku, the objective is to fill a 9 × 9 grid with digits so that each column, each row, and each of the nine 3 × 3 subgrids that compose the grid (also called "boxes", "blocks", or "regions") contains all of the digits from 1 to 9. The puzzle setter provides a partially completed grid, which for a well-posed puzzle has a single solution.

Constraint Programming follows the model-and-solve approach. We first need to model our Sudoku problem.

julia
m = JuMP.Model(CBLS.Optimizer)
julia
# TODO: Add other solvers

But what are the basis of CP models? It is quite simple:

',15)),i("ol",null,[i("li",null,[s[2]||(s[2]=t("A collection ")),i("mjx-container",p,[(l(),e("svg",o,s[0]||(s[0]=[a('',1)]))),s[1]||(s[1]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"X"),i("mo",null,"="),i("msub",null,[i("mi",null,"X"),i("mn",null,"1")]),i("mo",null,","),i("mo",null,"⋯"),i("mo",null,","),i("msub",null,[i("mi",null,"X"),i("mi",null,"n")])])],-1))]),s[3]||(s[3]=t(" of variables with each an associated domain."))])]),s[12]||(s[12]=a('
julia
@variable(m, 1 X[1:9, 1:9]  9, Int)
julia
# TODO: Add other solvers
',1)),i("ol",null,[i("li",null,[s[8]||(s[8]=t("A collection of predicates (called constraints) ")),i("mjx-container",d,[(l(),e("svg",r,s[4]||(s[4]=[a('',1)]))),s[5]||(s[5]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"C"),i("mo",null,"="),i("msub",null,[i("mi",null,"C"),i("mn",null,"1")]),i("mo",null,","),i("mo",null,"⋯"),i("mo",null,","),i("msub",null,[i("mi",null,"C"),i("mi",null,"n")])])],-1))]),s[9]||(s[9]=t(" over (subsets of) ")),i("mjx-container",k,[(l(),e("svg",Q,s[6]||(s[6]=[i("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[i("g",{"data-mml-node":"math"},[i("g",{"data-mml-node":"mi"},[i("path",{"data-c":"1D44B",d:"M42 0H40Q26 0 26 11Q26 15 29 27Q33 41 36 43T55 46Q141 49 190 98Q200 108 306 224T411 342Q302 620 297 625Q288 636 234 637H206Q200 643 200 645T202 664Q206 677 212 683H226Q260 681 347 681Q380 681 408 681T453 682T473 682Q490 682 490 671Q490 670 488 658Q484 643 481 640T465 637Q434 634 411 620L488 426L541 485Q646 598 646 610Q646 628 622 635Q617 635 609 637Q594 637 594 648Q594 650 596 664Q600 677 606 683H618Q619 683 643 683T697 681T738 680Q828 680 837 683H845Q852 676 852 672Q850 647 840 637H824Q790 636 763 628T722 611T698 593L687 584Q687 585 592 480L505 384Q505 383 536 304T601 142T638 56Q648 47 699 46Q734 46 734 37Q734 35 732 23Q728 7 725 4T711 1Q708 1 678 1T589 2Q528 2 496 2T461 1Q444 1 444 10Q444 11 446 25Q448 35 450 39T455 44T464 46T480 47T506 54Q523 62 523 64Q522 64 476 181L429 299Q241 95 236 84Q232 76 232 72Q232 53 261 47Q262 47 267 47T273 46Q276 46 277 46T280 45T283 42T284 35Q284 26 282 19Q279 6 276 4T261 1Q258 1 243 1T201 2T142 2Q64 2 42 0Z",style:{"stroke-width":"3"}})])])],-1)]))),s[7]||(s[7]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"X")])],-1))]),s[10]||(s[10]=t("."))])]),s[13]||(s[13]=a(`

When modeling problems as CP, one might define and use their own predicates. However, a large collection of already defined constraints exists. One, if not the most, iconic global constraint is called AllDifferent. It ensures that all variables take distinct values.

Sudoku puzzles can be defined using only this one constraint applied to different subsets of variables.

julia
for i in 1:9
+        @constraint(m, X[i,:] in AllDifferent()) # rows
+        @constraint(m, X[:,i] in AllDifferent()) # columns
+end
julia
# TODO: Add other solvers

The last series of AllDifferent constraint is less straight forward. We need to ensure that each 3 × 3 subgrid (block) is filled with distinct values.

julia
for i in 0:2, j in 0:2 # blocks
+    @constraint(
+        m,
+        vec(X[(3i+1):(3(i+1)), (3j+1):(3(j+1))]) in AllDifferent(),
+    )
+end
julia
# TODO: Add other solvers

We can now simply run our solver to look for a feasible solution.

julia
optimize!(m)

Note that this is heuristic solver, we might not get a feasible solution! Let's check it out. The value function print the value of a JuMP variable. We can cast it over a collection with the value. syntax.

julia
value.(X)
`,9))])}const E=n(h,[["render",g]]);export{y as __pageData,E as default}; diff --git a/dev/assets/cp_30_getting_started.md.C5h4OWH5.js b/dev/assets/cp_30_getting_started.md.C5h4OWH5.js deleted file mode 100644 index ad325e3..0000000 --- a/dev/assets/cp_30_getting_started.md.C5h4OWH5.js +++ /dev/null @@ -1,9 +0,0 @@ -import{_ as l,c as t,j as i,a as s,a7 as a,o as e}from"./chunks/framework.CBLuZwrP.js";const H=JSON.parse('{"title":"Getting Started with Julia for CP and Optimization","description":"","frontmatter":{},"headers":[],"relativePath":"cp/30_getting_started.md","filePath":"cp/30_getting_started.md","lastUpdated":null}'),n={name:"cp/30_getting_started.md"},h=a('

Getting Started with Julia for CP and Optimization

Why Julia?

  • Discuss the advantages of Julia for computational science and optimization, highlighting its performance and ease of use.

Setting Up Your Julia Environment

We encourage users to install Julia through juliaup, a version manager for the Julia language. Please look at the official Julia language download page for further information. Once installed, Julia can be used through various editors (Visual Studio Code), notebooks (Pluto.jl), or command-line (REPL).

Although a part of the CP solvers available within the Julia ecosystem have their own interface, we encourage users to use the JuMP modeling language if possible.

Julia Constraints host several solvers(' interfaces). Due to its flexibility in modeling and solving, we will use LocalSearchSolvers.jl through its JuMP interface CBLS.jl as the basic example. Note that depending on the targeted instances, available hardware, and expectations, it is not necessarily the best choice.

All along the documentation, we will try to provide syntax examples for different setup.

julia
using LocalSearchSolvers
julia
using JuMP, CBLS
julia
# TODO: Add other solvers

Your First Julia CP Model

We will start with a classic puzzle game and some of its not that simple variants: the Sudoku.

(From Wikipedia) In classic Sudoku, the objective is to fill a 9 × 9 grid with digits so that each column, each row, and each of the nine 3 × 3 subgrids that compose the grid (also called "boxes", "blocks", or "regions") contains all of the digits from 1 to 9. The puzzle setter provides a partially completed grid, which for a well-posed puzzle has a single solution.

Constraint Programming follows the model-and-solve approach. We first need to model our Sudoku problem.

julia
m = JuMP.Model(CBLS.Optimizer)
julia
# TODO: Add other solvers

But what are the basis of CP models? It is quite simple:

',15),o={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},p={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.867ex",height:"1.984ex",role:"img",focusable:"false",viewBox:"0 -683 7013.4 877","aria-hidden":"true"},d=a('',1),r=[d],k=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"X"),i("mo",null,"="),i("msub",null,[i("mi",null,"X"),i("mn",null,"1")]),i("mo",null,","),i("mo",null,"⋯"),i("mo",null,","),i("msub",null,[i("mi",null,"X"),i("mi",null,"n")])])],-1),c=a('
julia
@variable(m, 1 X[1:9, 1:9]  9, Int)
julia
# TODO: Add other solvers
',1),Q={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.148ex",height:"2.034ex",role:"img",focusable:"false",viewBox:"0 -705 6695.4 899","aria-hidden":"true"},T=a('',1),u=[T],m=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"C"),i("mo",null,"="),i("msub",null,[i("mi",null,"C"),i("mn",null,"1")]),i("mo",null,","),i("mo",null,"⋯"),i("mo",null,","),i("msub",null,[i("mi",null,"C"),i("mi",null,"n")])])],-1),v={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.928ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 852 683","aria-hidden":"true"},y=i("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[i("g",{"data-mml-node":"math"},[i("g",{"data-mml-node":"mi"},[i("path",{"data-c":"1D44B",d:"M42 0H40Q26 0 26 11Q26 15 29 27Q33 41 36 43T55 46Q141 49 190 98Q200 108 306 224T411 342Q302 620 297 625Q288 636 234 637H206Q200 643 200 645T202 664Q206 677 212 683H226Q260 681 347 681Q380 681 408 681T453 682T473 682Q490 682 490 671Q490 670 488 658Q484 643 481 640T465 637Q434 634 411 620L488 426L541 485Q646 598 646 610Q646 628 622 635Q617 635 609 637Q594 637 594 648Q594 650 596 664Q600 677 606 683H618Q619 683 643 683T697 681T738 680Q828 680 837 683H845Q852 676 852 672Q850 647 840 637H824Q790 636 763 628T722 611T698 593L687 584Q687 585 592 480L505 384Q505 383 536 304T601 142T638 56Q648 47 699 46Q734 46 734 37Q734 35 732 23Q728 7 725 4T711 1Q708 1 678 1T589 2Q528 2 496 2T461 1Q444 1 444 10Q444 11 446 25Q448 35 450 39T455 44T464 46T480 47T506 54Q523 62 523 64Q522 64 476 181L429 299Q241 95 236 84Q232 76 232 72Q232 53 261 47Q262 47 267 47T273 46Q276 46 277 46T280 45T283 42T284 35Q284 26 282 19Q279 6 276 4T261 1Q258 1 243 1T201 2T142 2Q64 2 42 0Z",style:{"stroke-width":"3"}})])])],-1),E=[y],C=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"X")])],-1),f=a(`

When modeling problems as CP, one might define and use their own predicates. However, a large collection of already defined constraints exists. One, if not the most, iconic global constraint is called AllDifferent. It ensures that all variables take distinct values.

Sudoku puzzles can be defined using only this one constraint applied to different subsets of variables.

julia
for i in 1:9
-        @constraint(m, X[i,:] in AllDifferent()) # rows
-        @constraint(m, X[:,i] in AllDifferent()) # columns
-end
julia
# TODO: Add other solvers

The last series of AllDifferent constraint is less straight forward. We need to ensure that each 3 × 3 subgrid (block) is filled with distinct values.

julia
for i in 0:2, j in 0:2 # blocks
-    @constraint(
-        m,
-        vec(X[(3i+1):(3(i+1)), (3j+1):(3(j+1))]) in AllDifferent(),
-    )
-end
julia
# TODO: Add other solvers

We can now simply run our solver to look for a feasible solution.

julia
optimize!(m)

Note that this is heuristic solver, we might not get a feasible solution! Let's check it out. The value function print the value of a JuMP variable. We can cast it over a collection with the value. syntax.

julia
value.(X)
`,9);function _(w,F,x,D,A,L){return e(),t("div",null,[h,i("ol",null,[i("li",null,[s("A collection "),i("mjx-container",o,[(e(),t("svg",p,r)),k]),s(" of variables with each an associated domain.")])]),c,i("ol",null,[i("li",null,[s("A collection of predicates (called constraints) "),i("mjx-container",Q,[(e(),t("svg",g,u)),m]),s(" over (subsets of) "),i("mjx-container",v,[(e(),t("svg",b,E)),C]),s(".")])]),f])}const S=l(n,[["render",_]]);export{H as __pageData,S as default}; diff --git a/dev/assets/cp_30_getting_started.md.C5h4OWH5.lean.js b/dev/assets/cp_30_getting_started.md.C5h4OWH5.lean.js deleted file mode 100644 index 068a221..0000000 --- a/dev/assets/cp_30_getting_started.md.C5h4OWH5.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as l,c as t,j as i,a as s,a7 as a,o as e}from"./chunks/framework.CBLuZwrP.js";const H=JSON.parse('{"title":"Getting Started with Julia for CP and Optimization","description":"","frontmatter":{},"headers":[],"relativePath":"cp/30_getting_started.md","filePath":"cp/30_getting_started.md","lastUpdated":null}'),n={name:"cp/30_getting_started.md"},h=a("",15),o={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},p={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.867ex",height:"1.984ex",role:"img",focusable:"false",viewBox:"0 -683 7013.4 877","aria-hidden":"true"},d=a("",1),r=[d],k=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"X"),i("mo",null,"="),i("msub",null,[i("mi",null,"X"),i("mn",null,"1")]),i("mo",null,","),i("mo",null,"⋯"),i("mo",null,","),i("msub",null,[i("mi",null,"X"),i("mi",null,"n")])])],-1),c=a("",1),Q={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.148ex",height:"2.034ex",role:"img",focusable:"false",viewBox:"0 -705 6695.4 899","aria-hidden":"true"},T=a("",1),u=[T],m=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"C"),i("mo",null,"="),i("msub",null,[i("mi",null,"C"),i("mn",null,"1")]),i("mo",null,","),i("mo",null,"⋯"),i("mo",null,","),i("msub",null,[i("mi",null,"C"),i("mi",null,"n")])])],-1),v={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.928ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 852 683","aria-hidden":"true"},y=i("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[i("g",{"data-mml-node":"math"},[i("g",{"data-mml-node":"mi"},[i("path",{"data-c":"1D44B",d:"M42 0H40Q26 0 26 11Q26 15 29 27Q33 41 36 43T55 46Q141 49 190 98Q200 108 306 224T411 342Q302 620 297 625Q288 636 234 637H206Q200 643 200 645T202 664Q206 677 212 683H226Q260 681 347 681Q380 681 408 681T453 682T473 682Q490 682 490 671Q490 670 488 658Q484 643 481 640T465 637Q434 634 411 620L488 426L541 485Q646 598 646 610Q646 628 622 635Q617 635 609 637Q594 637 594 648Q594 650 596 664Q600 677 606 683H618Q619 683 643 683T697 681T738 680Q828 680 837 683H845Q852 676 852 672Q850 647 840 637H824Q790 636 763 628T722 611T698 593L687 584Q687 585 592 480L505 384Q505 383 536 304T601 142T638 56Q648 47 699 46Q734 46 734 37Q734 35 732 23Q728 7 725 4T711 1Q708 1 678 1T589 2Q528 2 496 2T461 1Q444 1 444 10Q444 11 446 25Q448 35 450 39T455 44T464 46T480 47T506 54Q523 62 523 64Q522 64 476 181L429 299Q241 95 236 84Q232 76 232 72Q232 53 261 47Q262 47 267 47T273 46Q276 46 277 46T280 45T283 42T284 35Q284 26 282 19Q279 6 276 4T261 1Q258 1 243 1T201 2T142 2Q64 2 42 0Z",style:{"stroke-width":"3"}})])])],-1),E=[y],C=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"X")])],-1),f=a("",9);function _(w,F,x,D,A,L){return e(),t("div",null,[h,i("ol",null,[i("li",null,[s("A collection "),i("mjx-container",o,[(e(),t("svg",p,r)),k]),s(" of variables with each an associated domain.")])]),c,i("ol",null,[i("li",null,[s("A collection of predicates (called constraints) "),i("mjx-container",Q,[(e(),t("svg",g,u)),m]),s(" over (subsets of) "),i("mjx-container",v,[(e(),t("svg",b,E)),C]),s(".")])]),f])}const S=l(n,[["render",_]]);export{H as __pageData,S as default}; diff --git a/dev/assets/cp_40_ecosystem.md.B2yVE7ha.js b/dev/assets/cp_40_ecosystem.md.B2yVE7ha.js deleted file mode 100644 index 4a84ee8..0000000 --- a/dev/assets/cp_40_ecosystem.md.B2yVE7ha.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as t,o as e,a7 as i}from"./chunks/framework.CBLuZwrP.js";const h=JSON.parse('{"title":"Exploring JuliaConstraint Packages","description":"","frontmatter":{},"headers":[],"relativePath":"cp/40_ecosystem.md","filePath":"cp/40_ecosystem.md","lastUpdated":null}'),n={name:"cp/40_ecosystem.md"},s=i('

Exploring JuliaConstraint Packages

Package Overviews

  • Introduce each package within the JuliaConstraint organization, its purpose, and primary features.

Installation and Getting Started Guides

  • Provide step-by-step instructions for installing and getting started with each package.
',5),r=[s];function o(l,c,d,u,_,g){return e(),t("div",null,r)}const P=a(n,[["render",o]]);export{h as __pageData,P as default}; diff --git a/dev/assets/cp_40_ecosystem.md.B2yVE7ha.lean.js b/dev/assets/cp_40_ecosystem.md.B2yVE7ha.lean.js deleted file mode 100644 index 941215d..0000000 --- a/dev/assets/cp_40_ecosystem.md.B2yVE7ha.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as t,o as e,a7 as i}from"./chunks/framework.CBLuZwrP.js";const h=JSON.parse('{"title":"Exploring JuliaConstraint Packages","description":"","frontmatter":{},"headers":[],"relativePath":"cp/40_ecosystem.md","filePath":"cp/40_ecosystem.md","lastUpdated":null}'),n={name:"cp/40_ecosystem.md"},s=i("",5),r=[s];function o(l,c,d,u,_,g){return e(),t("div",null,r)}const P=a(n,[["render",o]]);export{h as __pageData,P as default}; diff --git a/dev/assets/cp_40_ecosystem.md.YmIJU8G_.js b/dev/assets/cp_40_ecosystem.md.YmIJU8G_.js new file mode 100644 index 0000000..25edac8 --- /dev/null +++ b/dev/assets/cp_40_ecosystem.md.YmIJU8G_.js @@ -0,0 +1 @@ +import{_ as t,c as e,a5 as i,o as n}from"./chunks/framework.CJakPlgM.js";const p=JSON.parse('{"title":"Exploring JuliaConstraint Packages","description":"","frontmatter":{},"headers":[],"relativePath":"cp/40_ecosystem.md","filePath":"cp/40_ecosystem.md","lastUpdated":null}'),s={name:"cp/40_ecosystem.md"};function r(o,a,l,c,d,u){return n(),e("div",null,a[0]||(a[0]=[i('

Exploring JuliaConstraint Packages

Package Overviews

  • Introduce each package within the JuliaConstraint organization, its purpose, and primary features.

Installation and Getting Started Guides

  • Provide step-by-step instructions for installing and getting started with each package.
',5)]))}const h=t(s,[["render",r]]);export{p as __pageData,h as default}; diff --git a/dev/assets/cp_40_ecosystem.md.YmIJU8G_.lean.js b/dev/assets/cp_40_ecosystem.md.YmIJU8G_.lean.js new file mode 100644 index 0000000..25edac8 --- /dev/null +++ b/dev/assets/cp_40_ecosystem.md.YmIJU8G_.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,a5 as i,o as n}from"./chunks/framework.CJakPlgM.js";const p=JSON.parse('{"title":"Exploring JuliaConstraint Packages","description":"","frontmatter":{},"headers":[],"relativePath":"cp/40_ecosystem.md","filePath":"cp/40_ecosystem.md","lastUpdated":null}'),s={name:"cp/40_ecosystem.md"};function r(o,a,l,c,d,u){return n(),e("div",null,a[0]||(a[0]=[i('

Exploring JuliaConstraint Packages

Package Overviews

  • Introduce each package within the JuliaConstraint organization, its purpose, and primary features.

Installation and Getting Started Guides

  • Provide step-by-step instructions for installing and getting started with each package.
',5)]))}const h=t(s,[["render",r]]);export{p as __pageData,h as default}; diff --git a/dev/assets/cp_50_advanced.md.CJxpgFIM.js b/dev/assets/cp_50_advanced.md.CJxpgFIM.js new file mode 100644 index 0000000..057ff74 --- /dev/null +++ b/dev/assets/cp_50_advanced.md.CJxpgFIM.js @@ -0,0 +1 @@ +import{_ as e,c as n,a5 as t,o as i}from"./chunks/framework.CJakPlgM.js";const p=JSON.parse('{"title":"Advanced Constraint Programming Techniques","description":"","frontmatter":{},"headers":[],"relativePath":"cp/50_advanced.md","filePath":"cp/50_advanced.md","lastUpdated":null}'),r={name:"cp/50_advanced.md"};function s(o,a,d,l,c,h){return i(),n("div",null,a[0]||(a[0]=[t('

Advanced Constraint Programming Techniques

Global Constraints and Their Uses

  • Dive deeper into global constraints and how they simplify complex problems.

Search Strategies and Optimization

  • Discuss various search strategies and their impact on solving CP problems.
',5)]))}const u=e(r,[["render",s]]);export{p as __pageData,u as default}; diff --git a/dev/assets/cp_50_advanced.md.CJxpgFIM.lean.js b/dev/assets/cp_50_advanced.md.CJxpgFIM.lean.js new file mode 100644 index 0000000..057ff74 --- /dev/null +++ b/dev/assets/cp_50_advanced.md.CJxpgFIM.lean.js @@ -0,0 +1 @@ +import{_ as e,c as n,a5 as t,o as i}from"./chunks/framework.CJakPlgM.js";const p=JSON.parse('{"title":"Advanced Constraint Programming Techniques","description":"","frontmatter":{},"headers":[],"relativePath":"cp/50_advanced.md","filePath":"cp/50_advanced.md","lastUpdated":null}'),r={name:"cp/50_advanced.md"};function s(o,a,d,l,c,h){return i(),n("div",null,a[0]||(a[0]=[t('

Advanced Constraint Programming Techniques

Global Constraints and Their Uses

  • Dive deeper into global constraints and how they simplify complex problems.

Search Strategies and Optimization

  • Discuss various search strategies and their impact on solving CP problems.
',5)]))}const u=e(r,[["render",s]]);export{p as __pageData,u as default}; diff --git a/dev/assets/cp_50_advanced.md.DQAz-Dcd.js b/dev/assets/cp_50_advanced.md.DQAz-Dcd.js deleted file mode 100644 index cc1f90c..0000000 --- a/dev/assets/cp_50_advanced.md.DQAz-Dcd.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as e,o as t,a7 as n}from"./chunks/framework.CBLuZwrP.js";const u=JSON.parse('{"title":"Advanced Constraint Programming Techniques","description":"","frontmatter":{},"headers":[],"relativePath":"cp/50_advanced.md","filePath":"cp/50_advanced.md","lastUpdated":null}'),i={name:"cp/50_advanced.md"},r=n('

Advanced Constraint Programming Techniques

Global Constraints and Their Uses

  • Dive deeper into global constraints and how they simplify complex problems.

Search Strategies and Optimization

  • Discuss various search strategies and their impact on solving CP problems.
',5),s=[r];function o(d,c,l,h,m,_){return t(),e("div",null,s)}const g=a(i,[["render",o]]);export{u as __pageData,g as default}; diff --git a/dev/assets/cp_50_advanced.md.DQAz-Dcd.lean.js b/dev/assets/cp_50_advanced.md.DQAz-Dcd.lean.js deleted file mode 100644 index 6f29c63..0000000 --- a/dev/assets/cp_50_advanced.md.DQAz-Dcd.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as e,o as t,a7 as n}from"./chunks/framework.CBLuZwrP.js";const u=JSON.parse('{"title":"Advanced Constraint Programming Techniques","description":"","frontmatter":{},"headers":[],"relativePath":"cp/50_advanced.md","filePath":"cp/50_advanced.md","lastUpdated":null}'),i={name:"cp/50_advanced.md"},r=n("",5),s=[r];function o(d,c,l,h,m,_){return t(),e("div",null,s)}const g=a(i,[["render",o]]);export{u as __pageData,g as default}; diff --git a/dev/assets/cp_60_applications.md.BUP9L55l.js b/dev/assets/cp_60_applications.md.BUP9L55l.js deleted file mode 100644 index 99ef43f..0000000 --- a/dev/assets/cp_60_applications.md.BUP9L55l.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as e,o as t,a7 as i}from"./chunks/framework.CBLuZwrP.js";const u=JSON.parse('{"title":"Applying Optimization Methods","description":"","frontmatter":{},"headers":[],"relativePath":"cp/60_applications.md","filePath":"cp/60_applications.md","lastUpdated":null}'),o={name:"cp/60_applications.md"},l=i('

Applying Optimization Methods

Case Studies and Real-World Applications

  • Showcase studies where CP and optimization have been successfully applied.

From Theory to Practice

  • Guide readers through the process of formulating and solving an optimization problem from a real-world scenario.
',5),r=[l];function s(n,p,c,d,h,_){return t(),e("div",null,r)}const f=a(o,[["render",s]]);export{u as __pageData,f as default}; diff --git a/dev/assets/cp_60_applications.md.BUP9L55l.lean.js b/dev/assets/cp_60_applications.md.BUP9L55l.lean.js deleted file mode 100644 index 8239e65..0000000 --- a/dev/assets/cp_60_applications.md.BUP9L55l.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as e,o as t,a7 as i}from"./chunks/framework.CBLuZwrP.js";const u=JSON.parse('{"title":"Applying Optimization Methods","description":"","frontmatter":{},"headers":[],"relativePath":"cp/60_applications.md","filePath":"cp/60_applications.md","lastUpdated":null}'),o={name:"cp/60_applications.md"},l=i("",5),r=[l];function s(n,p,c,d,h,_){return t(),e("div",null,r)}const f=a(o,[["render",s]]);export{u as __pageData,f as default}; diff --git a/dev/assets/cp_60_applications.md.CA8-f1fu.js b/dev/assets/cp_60_applications.md.CA8-f1fu.js new file mode 100644 index 0000000..3ce2e1e --- /dev/null +++ b/dev/assets/cp_60_applications.md.CA8-f1fu.js @@ -0,0 +1 @@ +import{_ as e,c as t,a5 as i,o}from"./chunks/framework.CJakPlgM.js";const m=JSON.parse('{"title":"Applying Optimization Methods","description":"","frontmatter":{},"headers":[],"relativePath":"cp/60_applications.md","filePath":"cp/60_applications.md","lastUpdated":null}'),l={name:"cp/60_applications.md"};function r(n,a,s,p,d,c){return o(),t("div",null,a[0]||(a[0]=[i('

Applying Optimization Methods

Case Studies and Real-World Applications

  • Showcase studies where CP and optimization have been successfully applied.

From Theory to Practice

  • Guide readers through the process of formulating and solving an optimization problem from a real-world scenario.
',5)]))}const u=e(l,[["render",r]]);export{m as __pageData,u as default}; diff --git a/dev/assets/cp_60_applications.md.CA8-f1fu.lean.js b/dev/assets/cp_60_applications.md.CA8-f1fu.lean.js new file mode 100644 index 0000000..3ce2e1e --- /dev/null +++ b/dev/assets/cp_60_applications.md.CA8-f1fu.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,a5 as i,o}from"./chunks/framework.CJakPlgM.js";const m=JSON.parse('{"title":"Applying Optimization Methods","description":"","frontmatter":{},"headers":[],"relativePath":"cp/60_applications.md","filePath":"cp/60_applications.md","lastUpdated":null}'),l={name:"cp/60_applications.md"};function r(n,a,s,p,d,c){return o(),t("div",null,a[0]||(a[0]=[i('

Applying Optimization Methods

Case Studies and Real-World Applications

  • Showcase studies where CP and optimization have been successfully applied.

From Theory to Practice

  • Guide readers through the process of formulating and solving an optimization problem from a real-world scenario.
',5)]))}const u=e(l,[["render",r]]);export{m as __pageData,u as default}; diff --git a/dev/assets/cp_70_models.md.1-J7V95h.js b/dev/assets/cp_70_models.md.1-J7V95h.js new file mode 100644 index 0000000..3794a9d --- /dev/null +++ b/dev/assets/cp_70_models.md.1-J7V95h.js @@ -0,0 +1 @@ +import{_ as a,c as n,a5 as i,o as l}from"./chunks/framework.CJakPlgM.js";const u=JSON.parse('{"title":"Building and Analyzing Models","description":"","frontmatter":{},"headers":[],"relativePath":"cp/70_models.md","filePath":"cp/70_models.md","lastUpdated":null}'),o={name:"cp/70_models.md"};function t(d,e,r,s,c,m){return l(),n("div",null,e[0]||(e[0]=[i('

Building and Analyzing Models

Modeling Best Practices

  • Share best practices and tips for building efficient CP and optimization models.

Performance Analysis and Improvement

  • Teach how to analyze and improve the performance of models.
',5)]))}const f=a(o,[["render",t]]);export{u as __pageData,f as default}; diff --git a/dev/assets/cp_70_models.md.1-J7V95h.lean.js b/dev/assets/cp_70_models.md.1-J7V95h.lean.js new file mode 100644 index 0000000..3794a9d --- /dev/null +++ b/dev/assets/cp_70_models.md.1-J7V95h.lean.js @@ -0,0 +1 @@ +import{_ as a,c as n,a5 as i,o as l}from"./chunks/framework.CJakPlgM.js";const u=JSON.parse('{"title":"Building and Analyzing Models","description":"","frontmatter":{},"headers":[],"relativePath":"cp/70_models.md","filePath":"cp/70_models.md","lastUpdated":null}'),o={name:"cp/70_models.md"};function t(d,e,r,s,c,m){return l(),n("div",null,e[0]||(e[0]=[i('

Building and Analyzing Models

Modeling Best Practices

  • Share best practices and tips for building efficient CP and optimization models.

Performance Analysis and Improvement

  • Teach how to analyze and improve the performance of models.
',5)]))}const f=a(o,[["render",t]]);export{u as __pageData,f as default}; diff --git a/dev/assets/cp_70_models.md.Cn6kXaBH.js b/dev/assets/cp_70_models.md.Cn6kXaBH.js deleted file mode 100644 index 0781194..0000000 --- a/dev/assets/cp_70_models.md.Cn6kXaBH.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,c as a,o as n,a7 as i}from"./chunks/framework.CBLuZwrP.js";const u=JSON.parse('{"title":"Building and Analyzing Models","description":"","frontmatter":{},"headers":[],"relativePath":"cp/70_models.md","filePath":"cp/70_models.md","lastUpdated":null}'),o={name:"cp/70_models.md"},t=i('

Building and Analyzing Models

Modeling Best Practices

  • Share best practices and tips for building efficient CP and optimization models.

Performance Analysis and Improvement

  • Teach how to analyze and improve the performance of models.
',5),l=[t];function s(d,r,c,m,_,h){return n(),a("div",null,l)}const f=e(o,[["render",s]]);export{u as __pageData,f as default}; diff --git a/dev/assets/cp_70_models.md.Cn6kXaBH.lean.js b/dev/assets/cp_70_models.md.Cn6kXaBH.lean.js deleted file mode 100644 index a2878fc..0000000 --- a/dev/assets/cp_70_models.md.Cn6kXaBH.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,c as a,o as n,a7 as i}from"./chunks/framework.CBLuZwrP.js";const u=JSON.parse('{"title":"Building and Analyzing Models","description":"","frontmatter":{},"headers":[],"relativePath":"cp/70_models.md","filePath":"cp/70_models.md","lastUpdated":null}'),o={name:"cp/70_models.md"},t=i("",5),l=[t];function s(d,r,c,m,_,h){return n(),a("div",null,l)}const f=e(o,[["render",s]]);export{u as __pageData,f as default}; diff --git a/dev/assets/cp_80_tuto_xp.md.BBnKLYxi.js b/dev/assets/cp_80_tuto_xp.md.BBnKLYxi.js new file mode 100644 index 0000000..cc47c4f --- /dev/null +++ b/dev/assets/cp_80_tuto_xp.md.BBnKLYxi.js @@ -0,0 +1 @@ +import{_ as e,c as t,a5 as n,o as s}from"./chunks/framework.CJakPlgM.js";const m=JSON.parse('{"title":"Tutorials and Experiments","description":"","frontmatter":{},"headers":[],"relativePath":"cp/80_tuto_xp.md","filePath":"cp/80_tuto_xp.md","lastUpdated":null}'),i={name:"cp/80_tuto_xp.md"};function r(l,a,o,d,p,u){return s(),t("div",null,a[0]||(a[0]=[n('

Tutorials and Experiments

Hands-On Tutorials

  • Provide step-by-step tutorials covering various topics and complexity levels.

Experimental Analysis

  • Discuss the importance of experimental analysis in CP and how to conduct meaningful experiments.
',5)]))}const x=e(i,[["render",r]]);export{m as __pageData,x as default}; diff --git a/dev/assets/cp_80_tuto_xp.md.BBnKLYxi.lean.js b/dev/assets/cp_80_tuto_xp.md.BBnKLYxi.lean.js new file mode 100644 index 0000000..cc47c4f --- /dev/null +++ b/dev/assets/cp_80_tuto_xp.md.BBnKLYxi.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,a5 as n,o as s}from"./chunks/framework.CJakPlgM.js";const m=JSON.parse('{"title":"Tutorials and Experiments","description":"","frontmatter":{},"headers":[],"relativePath":"cp/80_tuto_xp.md","filePath":"cp/80_tuto_xp.md","lastUpdated":null}'),i={name:"cp/80_tuto_xp.md"};function r(l,a,o,d,p,u){return s(),t("div",null,a[0]||(a[0]=[n('

Tutorials and Experiments

Hands-On Tutorials

  • Provide step-by-step tutorials covering various topics and complexity levels.

Experimental Analysis

  • Discuss the importance of experimental analysis in CP and how to conduct meaningful experiments.
',5)]))}const x=e(i,[["render",r]]);export{m as __pageData,x as default}; diff --git a/dev/assets/cp_80_tuto_xp.md.D7vyaVlC.js b/dev/assets/cp_80_tuto_xp.md.D7vyaVlC.js deleted file mode 100644 index 007deba..0000000 --- a/dev/assets/cp_80_tuto_xp.md.D7vyaVlC.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as e,o as t,a7 as s}from"./chunks/framework.CBLuZwrP.js";const x=JSON.parse('{"title":"Tutorials and Experiments","description":"","frontmatter":{},"headers":[],"relativePath":"cp/80_tuto_xp.md","filePath":"cp/80_tuto_xp.md","lastUpdated":null}'),n={name:"cp/80_tuto_xp.md"},i=s('

Tutorials and Experiments

Hands-On Tutorials

  • Provide step-by-step tutorials covering various topics and complexity levels.

Experimental Analysis

  • Discuss the importance of experimental analysis in CP and how to conduct meaningful experiments.
',5),r=[i];function l(o,d,p,u,_,c){return t(),e("div",null,r)}const h=a(n,[["render",l]]);export{x as __pageData,h as default}; diff --git a/dev/assets/cp_80_tuto_xp.md.D7vyaVlC.lean.js b/dev/assets/cp_80_tuto_xp.md.D7vyaVlC.lean.js deleted file mode 100644 index 7fd2476..0000000 --- a/dev/assets/cp_80_tuto_xp.md.D7vyaVlC.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as e,o as t,a7 as s}from"./chunks/framework.CBLuZwrP.js";const x=JSON.parse('{"title":"Tutorials and Experiments","description":"","frontmatter":{},"headers":[],"relativePath":"cp/80_tuto_xp.md","filePath":"cp/80_tuto_xp.md","lastUpdated":null}'),n={name:"cp/80_tuto_xp.md"},i=s("",5),r=[i];function l(o,d,p,u,_,c){return t(),e("div",null,r)}const h=a(n,[["render",l]]);export{x as __pageData,h as default}; diff --git a/dev/assets/cp_90_contribution.md.CM5gXEgm.js b/dev/assets/cp_90_contribution.md.CM5gXEgm.js deleted file mode 100644 index 0c0f125..0000000 --- a/dev/assets/cp_90_contribution.md.CM5gXEgm.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,c as n,o as i,a7 as o}from"./chunks/framework.CBLuZwrP.js";const C=JSON.parse('{"title":"Community and Contribution","description":"","frontmatter":{},"headers":[],"relativePath":"cp/90_contribution.md","filePath":"cp/90_contribution.md","lastUpdated":null}'),a={name:"cp/90_contribution.md"},e=o('

Community and Contribution

Joining the JuliaConstraint Community

  • Encourage readers to join the community, highlighting how they can contribute and collaborate.

Future Directions

  • Share the vision for JuliaConstraint and upcoming projects or areas of research.
',5),r=[e];function u(c,s,l,m,h,d){return i(),n("div",null,r)}const b=t(a,[["render",u]]);export{C as __pageData,b as default}; diff --git a/dev/assets/cp_90_contribution.md.CM5gXEgm.lean.js b/dev/assets/cp_90_contribution.md.CM5gXEgm.lean.js deleted file mode 100644 index 772ea72..0000000 --- a/dev/assets/cp_90_contribution.md.CM5gXEgm.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,c as n,o as i,a7 as o}from"./chunks/framework.CBLuZwrP.js";const C=JSON.parse('{"title":"Community and Contribution","description":"","frontmatter":{},"headers":[],"relativePath":"cp/90_contribution.md","filePath":"cp/90_contribution.md","lastUpdated":null}'),a={name:"cp/90_contribution.md"},e=o("",5),r=[e];function u(c,s,l,m,h,d){return i(),n("div",null,r)}const b=t(a,[["render",u]]);export{C as __pageData,b as default}; diff --git a/dev/assets/cp_90_contribution.md.DOrkQHq1.js b/dev/assets/cp_90_contribution.md.DOrkQHq1.js new file mode 100644 index 0000000..bfb3283 --- /dev/null +++ b/dev/assets/cp_90_contribution.md.DOrkQHq1.js @@ -0,0 +1 @@ +import{_ as n,c as i,a5 as o,o as a}from"./chunks/framework.CJakPlgM.js";const h=JSON.parse('{"title":"Community and Contribution","description":"","frontmatter":{},"headers":[],"relativePath":"cp/90_contribution.md","filePath":"cp/90_contribution.md","lastUpdated":null}'),e={name:"cp/90_contribution.md"};function r(u,t,l,s,c,m){return a(),i("div",null,t[0]||(t[0]=[o('

Community and Contribution

Joining the JuliaConstraint Community

  • Encourage readers to join the community, highlighting how they can contribute and collaborate.

Future Directions

  • Share the vision for JuliaConstraint and upcoming projects or areas of research.
',5)]))}const C=n(e,[["render",r]]);export{h as __pageData,C as default}; diff --git a/dev/assets/cp_90_contribution.md.DOrkQHq1.lean.js b/dev/assets/cp_90_contribution.md.DOrkQHq1.lean.js new file mode 100644 index 0000000..bfb3283 --- /dev/null +++ b/dev/assets/cp_90_contribution.md.DOrkQHq1.lean.js @@ -0,0 +1 @@ +import{_ as n,c as i,a5 as o,o as a}from"./chunks/framework.CJakPlgM.js";const h=JSON.parse('{"title":"Community and Contribution","description":"","frontmatter":{},"headers":[],"relativePath":"cp/90_contribution.md","filePath":"cp/90_contribution.md","lastUpdated":null}'),e={name:"cp/90_contribution.md"};function r(u,t,l,s,c,m){return a(),i("div",null,t[0]||(t[0]=[o('

Community and Contribution

Joining the JuliaConstraint Community

  • Encourage readers to join the community, highlighting how they can contribute and collaborate.

Future Directions

  • Share the vision for JuliaConstraint and upcoming projects or areas of research.
',5)]))}const C=n(e,[["render",r]]);export{h as __pageData,C as default}; diff --git a/dev/assets/index.md.BKeG-gxU.js b/dev/assets/index.md.BKeG-gxU.js new file mode 100644 index 0000000..4d092f4 --- /dev/null +++ b/dev/assets/index.md.BKeG-gxU.js @@ -0,0 +1 @@ +import{_ as o,c as e,a5 as a,o as i}from"./chunks/framework.CJakPlgM.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Julia Constraints","text":"Model Smoothly Decide Wisely","tagline":"A Toolkit for Constraint Programming","image":{"src":"/logo.png","alt":"JuliaConstraints"},"actions":[{"theme":"brand","text":"Model, Learn, and Solve!","link":"/constraints/intro"},{"theme":"alt","text":"View on Github","link":"https://github.com/JuliaConstraints/JuliaConstraints.github.io"}]},"features":[{"icon":"\\"JuMP.jl\\"/","title":"JuMP.jl","details":"Model optimization problems via JuMP.jl!","link":"https://jump.dev/"},{"icon":"\\"PerfChecker.jl\\"/","title":"PerfChecker.jl","details":"Cross-version performance checking tool","link":"https://github.com/JuliaConstraints/PerfChecker.jl"},{"icon":"\\"Pluto.jl\\"/","title":"Pluto.jl","details":"Simple, reactive programming environment via Julia notebooks","link":"https://plutojl.org/"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":null}'),n={name:"index.md"};function s(r,t,l,h,g,u){return i(),e("div",null,t[0]||(t[0]=[a('

What is Julia Constraints?

The Julia Constraints organization serves as a hub for resources to create, understand, and solve optimization through the lens of Constraint Programming. Our goal is to make Constraint Programming accessible and efficient for users at all levels of expertise, by providing a comprehensive suite of tools.

Most tools integrate seamlessly with JuMP, a popular Julia package for mathematical optimization.

Ecosystem overview

Core Packages

The foundation of common packages that provide essential features for constraint programming ensures that users possess the fundamental tools required for their projects.

  • ConstraintCommons.jl is designed to make constraint programming solutions in Julia interoperable. It provides shared structures, abstract types, functions, and generic methods used by both basic feature packages and learning-oriented packages.
  • ConstraintDomains.jl focuses on the definition and manipulation of variable domains, which are used to solve constraint programming problems. This package provides the infrastructure needed to specify both discrete and continuous domains, allowing a wide range of constraint programming applications.
  • Constraints.jl is a key component, specifically designed to facilitate the definition, manipulation, and application of constraints in constraint programming. This package is central to handling both standard and complex constraints, making it an indispensable tool for developers and researchers working in CP.
  • ConstraintModels.jl is a package for Julia Constraints' solvers that stores Constraint Programming models.

Learning and Translation Tools

A collection that bridges the gap between the ease of modeling and computational efficacy. These tools learn from constraints or convert natural language problems into constraint programming solutions, requiring minimal input from the user beyond the model itself.

  • CompositionalNetworks.jl provides interpretable compositional networks (ICN), a combinatorial variant of neural networks that allows the user to obtain interpretable results, unlike regular artificial neural networks.
  • QUBOConstraints.jl is a package that can (automatically) learn QUBO matrices from optimization constraints.
  • ConstraintsTranslator.jl (tentative name, WIP) is a tool for converting problems expressed in natural language into optimization models.
  • ConstraintLearning.jl is a common interface that integrates the various components outlined above.

Solvers

We offer a variety of solvers, from native Julia solvers to interfaces with JuMP for external CP solvers, to cater to various problem-solving needs.

  • LocalSearchSolvers.jl is a Julia native framework to (semi-)automatically build Constraint-based Local Search solvers. It serves as a basic for the experimental design or core and learning oriented packages in Julia Constraints.
  • CBLS.jl a MOI/JuMP interface for the above framework!
  • CPLEXCP.jl a Julia interface for CPLEX CP Optimizer.
  • Chuffed.jl a wrapper for the constraint-programming solver Chuffed to Julia.
  • JaCoP.jl a Julia interface for the JaCoP constraint-programming solver.

JuMP extras

Constraint Programming is slowly making steps into the main JuMP components. However, some extra resources are available as

Meta-solving

MetaStrategist.jl is a meta-solving package in its formative stages, which aims to harness the strengths of CP and JuMP. Its goal is to formulate tailored strategies that take into consideration the unique hardware and software resources at hand, offering a new horizon in problem-solving efficiency and adaptability. Stay tuned!

Performance related tools

We've made a tool for cross-version performance checking that ensures the high efficiency and reliability of our solutions. By facilitating clear and simple performance evaluations, PerfChecker.jl enhances both development and maintenance, contributing to the overall health and progress of Julia (Constraints)'s growing library of resources.

Contributors Page

Acknowledgments

The Julia Constraints community would not be where it is today without the collective efforts of many talented individuals and organizations. We extend our heartfelt thanks to:

  • IIJ Research Lab: The driving force behind more than half of this project!
  • JuMP-dev Community: For their extensive contributions to the development of our packages.
  • Individual Contributors: Numerous developers and researchers who have dedicated their time and skills to enhance our tools.
',2)]))}const p=o(n,[["render",s]]);export{m as __pageData,p as default}; diff --git a/dev/assets/index.md.BKeG-gxU.lean.js b/dev/assets/index.md.BKeG-gxU.lean.js new file mode 100644 index 0000000..4d092f4 --- /dev/null +++ b/dev/assets/index.md.BKeG-gxU.lean.js @@ -0,0 +1 @@ +import{_ as o,c as e,a5 as a,o as i}from"./chunks/framework.CJakPlgM.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Julia Constraints","text":"Model Smoothly Decide Wisely","tagline":"A Toolkit for Constraint Programming","image":{"src":"/logo.png","alt":"JuliaConstraints"},"actions":[{"theme":"brand","text":"Model, Learn, and Solve!","link":"/constraints/intro"},{"theme":"alt","text":"View on Github","link":"https://github.com/JuliaConstraints/JuliaConstraints.github.io"}]},"features":[{"icon":"\\"JuMP.jl\\"/","title":"JuMP.jl","details":"Model optimization problems via JuMP.jl!","link":"https://jump.dev/"},{"icon":"\\"PerfChecker.jl\\"/","title":"PerfChecker.jl","details":"Cross-version performance checking tool","link":"https://github.com/JuliaConstraints/PerfChecker.jl"},{"icon":"\\"Pluto.jl\\"/","title":"Pluto.jl","details":"Simple, reactive programming environment via Julia notebooks","link":"https://plutojl.org/"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":null}'),n={name:"index.md"};function s(r,t,l,h,g,u){return i(),e("div",null,t[0]||(t[0]=[a('

What is Julia Constraints?

The Julia Constraints organization serves as a hub for resources to create, understand, and solve optimization through the lens of Constraint Programming. Our goal is to make Constraint Programming accessible and efficient for users at all levels of expertise, by providing a comprehensive suite of tools.

Most tools integrate seamlessly with JuMP, a popular Julia package for mathematical optimization.

Ecosystem overview

Core Packages

The foundation of common packages that provide essential features for constraint programming ensures that users possess the fundamental tools required for their projects.

  • ConstraintCommons.jl is designed to make constraint programming solutions in Julia interoperable. It provides shared structures, abstract types, functions, and generic methods used by both basic feature packages and learning-oriented packages.
  • ConstraintDomains.jl focuses on the definition and manipulation of variable domains, which are used to solve constraint programming problems. This package provides the infrastructure needed to specify both discrete and continuous domains, allowing a wide range of constraint programming applications.
  • Constraints.jl is a key component, specifically designed to facilitate the definition, manipulation, and application of constraints in constraint programming. This package is central to handling both standard and complex constraints, making it an indispensable tool for developers and researchers working in CP.
  • ConstraintModels.jl is a package for Julia Constraints' solvers that stores Constraint Programming models.

Learning and Translation Tools

A collection that bridges the gap between the ease of modeling and computational efficacy. These tools learn from constraints or convert natural language problems into constraint programming solutions, requiring minimal input from the user beyond the model itself.

  • CompositionalNetworks.jl provides interpretable compositional networks (ICN), a combinatorial variant of neural networks that allows the user to obtain interpretable results, unlike regular artificial neural networks.
  • QUBOConstraints.jl is a package that can (automatically) learn QUBO matrices from optimization constraints.
  • ConstraintsTranslator.jl (tentative name, WIP) is a tool for converting problems expressed in natural language into optimization models.
  • ConstraintLearning.jl is a common interface that integrates the various components outlined above.

Solvers

We offer a variety of solvers, from native Julia solvers to interfaces with JuMP for external CP solvers, to cater to various problem-solving needs.

  • LocalSearchSolvers.jl is a Julia native framework to (semi-)automatically build Constraint-based Local Search solvers. It serves as a basic for the experimental design or core and learning oriented packages in Julia Constraints.
  • CBLS.jl a MOI/JuMP interface for the above framework!
  • CPLEXCP.jl a Julia interface for CPLEX CP Optimizer.
  • Chuffed.jl a wrapper for the constraint-programming solver Chuffed to Julia.
  • JaCoP.jl a Julia interface for the JaCoP constraint-programming solver.

JuMP extras

Constraint Programming is slowly making steps into the main JuMP components. However, some extra resources are available as

Meta-solving

MetaStrategist.jl is a meta-solving package in its formative stages, which aims to harness the strengths of CP and JuMP. Its goal is to formulate tailored strategies that take into consideration the unique hardware and software resources at hand, offering a new horizon in problem-solving efficiency and adaptability. Stay tuned!

Performance related tools

We've made a tool for cross-version performance checking that ensures the high efficiency and reliability of our solutions. By facilitating clear and simple performance evaluations, PerfChecker.jl enhances both development and maintenance, contributing to the overall health and progress of Julia (Constraints)'s growing library of resources.

Contributors Page

Acknowledgments

The Julia Constraints community would not be where it is today without the collective efforts of many talented individuals and organizations. We extend our heartfelt thanks to:

  • IIJ Research Lab: The driving force behind more than half of this project!
  • JuMP-dev Community: For their extensive contributions to the development of our packages.
  • Individual Contributors: Numerous developers and researchers who have dedicated their time and skills to enhance our tools.
',2)]))}const p=o(n,[["render",s]]);export{m as __pageData,p as default}; diff --git a/dev/assets/index.md.CtETS-xm.js b/dev/assets/index.md.CtETS-xm.js deleted file mode 100644 index 7cf201a..0000000 --- a/dev/assets/index.md.CtETS-xm.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,c as o,o as e,a7 as a}from"./chunks/framework.CBLuZwrP.js";const d=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Julia Constraints","text":"Model Smoothly Decide Wisely","tagline":"A Toolkit for Constraint Programming","image":{"src":"/logo.png","alt":"JuliaConstraints"},"actions":[{"theme":"brand","text":"Model, Learn, and Solve!","link":"/constraints/intro"},{"theme":"alt","text":"View on Github","link":"https://github.com/JuliaConstraints/JuliaConstraints.github.io"}]},"features":[{"icon":"\\"JuMP.jl\\"/","title":"JuMP.jl","details":"Model optimization problems via JuMP.jl!","link":"https://jump.dev/"},{"icon":"\\"PerfChecker.jl\\"/","title":"PerfChecker.jl","details":"Cross-version performance checking tool","link":"https://github.com/JuliaConstraints/PerfChecker.jl"},{"icon":"\\"Pluto.jl\\"/","title":"Pluto.jl","details":"Simple, reactive programming environment via Julia notebooks","link":"https://plutojl.org/"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":null}'),i={name:"index.md"},n=a('

What is Julia Constraints?

The Julia Constraints organization serves as a hub for resources to create, understand, and solve optimization through the lens of Constraint Programming. Our goal is to make Constraint Programming accessible and efficient for users at all levels of expertise, by providing a comprehensive suite of tools.

Most tools integrate seamlessly with JuMP, a popular Julia package for mathematical optimization.

Ecosystem overview

Core Packages

The foundation of common packages that provide essential features for constraint programming ensures that users possess the fundamental tools required for their projects.

  • ConstraintCommons.jl is designed to make constraint programming solutions in Julia interoperable. It provides shared structures, abstract types, functions, and generic methods used by both basic feature packages and learning-oriented packages.
  • ConstraintDomains.jl focuses on the definition and manipulation of variable domains, which are used to solve constraint programming problems. This package provides the infrastructure needed to specify both discrete and continuous domains, allowing a wide range of constraint programming applications.
  • Constraints.jl is a key component, specifically designed to facilitate the definition, manipulation, and application of constraints in constraint programming. This package is central to handling both standard and complex constraints, making it an indispensable tool for developers and researchers working in CP.
  • ConstraintModels.jl is a package for Julia Constraints' solvers that stores Constraint Programming models.

Learning and Translation Tools

A collection that bridges the gap between the ease of modeling and computational efficacy. These tools learn from constraints or convert natural language problems into constraint programming solutions, requiring minimal input from the user beyond the model itself.

  • CompositionalNetworks.jl provides interpretable compositional networks (ICN), a combinatorial variant of neural networks that allows the user to obtain interpretable results, unlike regular artificial neural networks.
  • QUBOConstraints.jl is a package that can (automatically) learn QUBO matrices from optimization constraints.
  • ConstraintsTranslator.jl (tentative name, WIP) is a tool for converting problems expressed in natural language into optimization models.
  • ConstraintLearning.jl is a common interface that integrates the various components outlined above.

Solvers

We offer a variety of solvers, from native Julia solvers to interfaces with JuMP for external CP solvers, to cater to various problem-solving needs.

  • LocalSearchSolvers.jl is a Julia native framework to (semi-)automatically build Constraint-based Local Search solvers. It serves as a basic for the experimental design or core and learning oriented packages in Julia Constraints.
  • CBLS.jl a MOI/JuMP interface for the above framework!
  • CPLEXCP.jl a Julia interface for CPLEX CP Optimizer.
  • Chuffed.jl a wrapper for the constraint-programming solver Chuffed to Julia.
  • JaCoP.jl a Julia interface for the JaCoP constraint-programming solver.

JuMP extras

Constraint Programming is slowly making steps into the main JuMP components. However, some extra resources are available as

Meta-solving

MetaStrategist.jl is a meta-solving package in its formative stages, which aims to harness the strengths of CP and JuMP. Its goal is to formulate tailored strategies that take into consideration the unique hardware and software resources at hand, offering a new horizon in problem-solving efficiency and adaptability. Stay tuned!

Performance related tools

We've made a tool for cross-version performance checking that ensures the high efficiency and reliability of our solutions. By facilitating clear and simple performance evaluations, PerfChecker.jl enhances both development and maintenance, contributing to the overall health and progress of Julia (Constraints)'s growing library of resources.

Contributors Page

Acknowledgments

The Julia Constraints community would not be where it is today without the collective efforts of many talented individuals and organizations. We extend our heartfelt thanks to:

  • IIJ Research Lab: The driving force behind more than half of this project!
  • JuMP-dev Community: For their extensive contributions to the development of our packages.
  • Individual Contributors: Numerous developers and researchers who have dedicated their time and skills to enhance our tools.
',2),s=[n];function r(l,h,g,c,u,m){return e(),o("div",null,s)}const f=t(i,[["render",r]]);export{d as __pageData,f as default}; diff --git a/dev/assets/index.md.CtETS-xm.lean.js b/dev/assets/index.md.CtETS-xm.lean.js deleted file mode 100644 index 5a9f757..0000000 --- a/dev/assets/index.md.CtETS-xm.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,c as o,o as e,a7 as a}from"./chunks/framework.CBLuZwrP.js";const d=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Julia Constraints","text":"Model Smoothly Decide Wisely","tagline":"A Toolkit for Constraint Programming","image":{"src":"/logo.png","alt":"JuliaConstraints"},"actions":[{"theme":"brand","text":"Model, Learn, and Solve!","link":"/constraints/intro"},{"theme":"alt","text":"View on Github","link":"https://github.com/JuliaConstraints/JuliaConstraints.github.io"}]},"features":[{"icon":"\\"JuMP.jl\\"/","title":"JuMP.jl","details":"Model optimization problems via JuMP.jl!","link":"https://jump.dev/"},{"icon":"\\"PerfChecker.jl\\"/","title":"PerfChecker.jl","details":"Cross-version performance checking tool","link":"https://github.com/JuliaConstraints/PerfChecker.jl"},{"icon":"\\"Pluto.jl\\"/","title":"Pluto.jl","details":"Simple, reactive programming environment via Julia notebooks","link":"https://plutojl.org/"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":null}'),i={name:"index.md"},n=a("",2),s=[n];function r(l,h,g,c,u,m){return e(),o("div",null,s)}const f=t(i,[["render",r]]);export{d as __pageData,f as default}; diff --git a/dev/assets/learning_00_intro.md.D4p7HvQP.js b/dev/assets/learning_00_intro.md.D4p7HvQP.js deleted file mode 100644 index 6655087..0000000 --- a/dev/assets/learning_00_intro.md.D4p7HvQP.js +++ /dev/null @@ -1,2 +0,0 @@ -import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.CBLuZwrP.js";const u=JSON.parse('{"title":"Learning about Constraints","description":"","frontmatter":{},"headers":[],"relativePath":"learning/00_intro.md","filePath":"learning/00_intro.md","lastUpdated":null}'),e={name:"learning/00_intro.md"},n=t(`

Learning about Constraints

About learning constraints related matters.

Parameters

<!– To be moved –>

One major challenge of learning the features of constraints is exploring the domains of parameters. To tackle this issue, we provide some way to generate parameters from variables' domains.

Missing docstring.

Missing docstring for BoolParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for DimParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for IdParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FakeAutomaton. Check Documenter's build log for details.

# ConstraintCommons.acceptFunction.
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source


Missing docstring.

Missing docstring for fake_automaton. Check Documenter's build log for details.

Missing docstring.

Missing docstring for LanguageParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for OpParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for PairVarsParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for ValParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for ValsParameterDomain. Check Documenter's build log for details.

# Base.randFunction.
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source


# ConstraintDomains.generate_parametersFunction.
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source


`,21),r=[n];function o(l,p,d,h,c,k){return a(),i("div",null,r)}const m=s(e,[["render",o]]);export{u as __pageData,m as default}; diff --git a/dev/assets/learning_00_intro.md.D4p7HvQP.lean.js b/dev/assets/learning_00_intro.md.D4p7HvQP.lean.js deleted file mode 100644 index 886db3c..0000000 --- a/dev/assets/learning_00_intro.md.D4p7HvQP.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.CBLuZwrP.js";const u=JSON.parse('{"title":"Learning about Constraints","description":"","frontmatter":{},"headers":[],"relativePath":"learning/00_intro.md","filePath":"learning/00_intro.md","lastUpdated":null}'),e={name:"learning/00_intro.md"},n=t("",21),r=[n];function o(l,p,d,h,c,k){return a(),i("div",null,r)}const m=s(e,[["render",o]]);export{u as __pageData,m as default}; diff --git a/dev/assets/learning_00_intro.md.zyAZ0vEH.js b/dev/assets/learning_00_intro.md.zyAZ0vEH.js new file mode 100644 index 0000000..f126c55 --- /dev/null +++ b/dev/assets/learning_00_intro.md.zyAZ0vEH.js @@ -0,0 +1,2 @@ +import{_ as o,c as l,a5 as a,j as i,a as e,G as n,B as r,o as p}from"./chunks/framework.CJakPlgM.js";const v=JSON.parse('{"title":"Learning about Constraints","description":"","frontmatter":{},"headers":[],"relativePath":"learning/00_intro.md","filePath":"learning/00_intro.md","lastUpdated":null}'),d={name:"learning/00_intro.md"},c={class:"jldocstring custom-block",open:""},h={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""};function g(u,s,m,b,E,C){const t=r("Badge");return p(),l("div",null,[s[9]||(s[9]=a('

Learning about Constraints

About learning constraints related matters.

Parameters

<!– To be moved –>

One major challenge of learning the features of constraints is exploring the domains of parameters. To tackle this issue, we provide some way to generate parameters from variables' domains.

Missing docstring.

Missing docstring for BoolParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for DimParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for IdParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FakeAutomaton. Check Documenter's build log for details.

',9)),i("details",c,[i("summary",null,[s[0]||(s[0]=i("a",{id:"ConstraintCommons.accept-learning-00_intro",href:"#ConstraintCommons.accept-learning-00_intro"},[i("span",{class:"jlbinding"},"ConstraintCommons.accept")],-1)),s[1]||(s[1]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=a('
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

',6))]),s[10]||(s[10]=a('

Missing docstring.

Missing docstring for fake_automaton. Check Documenter's build log for details.

Missing docstring.

Missing docstring for LanguageParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for OpParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for PairVarsParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for ValParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for ValsParameterDomain. Check Documenter's build log for details.

',6)),i("details",h,[i("summary",null,[s[3]||(s[3]=i("a",{id:"Base.rand-learning-00_intro",href:"#Base.rand-learning-00_intro"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[4]||(s[4]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=a(`
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

`,12))]),i("details",k,[i("summary",null,[s[6]||(s[6]=i("a",{id:"ConstraintDomains.generate_parameters-learning-00_intro",href:"#ConstraintDomains.generate_parameters-learning-00_intro"},[i("span",{class:"jlbinding"},"ConstraintDomains.generate_parameters")],-1)),s[7]||(s[7]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[8]||(s[8]=a('
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source

',3))])])}const f=o(d,[["render",g]]);export{v as __pageData,f as default}; diff --git a/dev/assets/learning_00_intro.md.zyAZ0vEH.lean.js b/dev/assets/learning_00_intro.md.zyAZ0vEH.lean.js new file mode 100644 index 0000000..f126c55 --- /dev/null +++ b/dev/assets/learning_00_intro.md.zyAZ0vEH.lean.js @@ -0,0 +1,2 @@ +import{_ as o,c as l,a5 as a,j as i,a as e,G as n,B as r,o as p}from"./chunks/framework.CJakPlgM.js";const v=JSON.parse('{"title":"Learning about Constraints","description":"","frontmatter":{},"headers":[],"relativePath":"learning/00_intro.md","filePath":"learning/00_intro.md","lastUpdated":null}'),d={name:"learning/00_intro.md"},c={class:"jldocstring custom-block",open:""},h={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""};function g(u,s,m,b,E,C){const t=r("Badge");return p(),l("div",null,[s[9]||(s[9]=a('

Learning about Constraints

About learning constraints related matters.

Parameters

<!– To be moved –>

One major challenge of learning the features of constraints is exploring the domains of parameters. To tackle this issue, we provide some way to generate parameters from variables' domains.

Missing docstring.

Missing docstring for BoolParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for DimParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for IdParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FakeAutomaton. Check Documenter's build log for details.

',9)),i("details",c,[i("summary",null,[s[0]||(s[0]=i("a",{id:"ConstraintCommons.accept-learning-00_intro",href:"#ConstraintCommons.accept-learning-00_intro"},[i("span",{class:"jlbinding"},"ConstraintCommons.accept")],-1)),s[1]||(s[1]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=a('
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

',6))]),s[10]||(s[10]=a('

Missing docstring.

Missing docstring for fake_automaton. Check Documenter's build log for details.

Missing docstring.

Missing docstring for LanguageParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for OpParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for PairVarsParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for ValParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for ValsParameterDomain. Check Documenter's build log for details.

',6)),i("details",h,[i("summary",null,[s[3]||(s[3]=i("a",{id:"Base.rand-learning-00_intro",href:"#Base.rand-learning-00_intro"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[4]||(s[4]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=a(`
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

`,12))]),i("details",k,[i("summary",null,[s[6]||(s[6]=i("a",{id:"ConstraintDomains.generate_parameters-learning-00_intro",href:"#ConstraintDomains.generate_parameters-learning-00_intro"},[i("span",{class:"jlbinding"},"ConstraintDomains.generate_parameters")],-1)),s[7]||(s[7]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[8]||(s[8]=a('
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source

',3))])])}const f=o(d,[["render",g]]);export{v as __pageData,f as default}; diff --git a/dev/assets/learning_10_compositional_networks.md.C1bHiEgr.js b/dev/assets/learning_10_compositional_networks.md.C1bHiEgr.js deleted file mode 100644 index 736bd50..0000000 --- a/dev/assets/learning_10_compositional_networks.md.C1bHiEgr.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as s,o,a7 as a}from"./chunks/framework.CBLuZwrP.js";const u=JSON.parse('{"title":"CompositionalNetworks.jl","description":"","frontmatter":{},"headers":[],"relativePath":"learning/10_compositional_networks.md","filePath":"learning/10_compositional_networks.md","lastUpdated":null}'),t={name:"learning/10_compositional_networks.md"},e=a('

CompositionalNetworks.jl

Documentation for CompositionalNetworks.jl.

Utilities

# CompositionalNetworks.map_tr!Function.
julia
map_tr!(f, x, X, param)

Return an anonymous function that applies f to all elements of x and store the result in X, with a parameter param (which is set to nothing for function with no parameter).

source


# CompositionalNetworks.lazyFunction.
julia
lazy(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V).

source


# CompositionalNetworks.lazy_paramFunction.
julia
lazy_param(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V; param).

source


# CompositionalNetworks.as_bitvectorFunction.
julia
as_bitvector(n::Int, max_n::Int = n)

Convert an Int to a BitVector of minimal size (relatively to max_n).

source


# CompositionalNetworks.as_intFunction.
julia
as_int(v::AbstractVector)

Convert a BitVector into an Int.

source


# CompositionalNetworks.reduce_symbolsFunction.
julia
reduce_symbols(symbols, sep)

Produce a formatted string that separates the symbols by sep. Used internally for show_composition.

source


Missing docstring.

Missing docstring for CompositionalNeworks.tr_in. Check Documenter's build log for details.

Metrics

# CompositionalNetworks.hammingFunction.
julia
hamming(x, X)

Compute the hamming distance of x over a collection of solutions X, i.e. the minimal number of variables to switch in xto reach a solution.

source


# CompositionalNetworks.minkowskiFunction.
julia
minkowski(x, X, p)

source


# CompositionalNetworks.manhattanFunction.
julia
manhattan(x, X)

source


Missing docstring.

Missing docstring for weigths_bias. Check Documenter's build log for details.

',24),n=[e];function l(r,p,d,c,h,k){return o(),s("div",null,n)}const m=i(t,[["render",l]]);export{u as __pageData,m as default}; diff --git a/dev/assets/learning_10_compositional_networks.md.C1bHiEgr.lean.js b/dev/assets/learning_10_compositional_networks.md.C1bHiEgr.lean.js deleted file mode 100644 index fb37277..0000000 --- a/dev/assets/learning_10_compositional_networks.md.C1bHiEgr.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as s,o,a7 as a}from"./chunks/framework.CBLuZwrP.js";const u=JSON.parse('{"title":"CompositionalNetworks.jl","description":"","frontmatter":{},"headers":[],"relativePath":"learning/10_compositional_networks.md","filePath":"learning/10_compositional_networks.md","lastUpdated":null}'),t={name:"learning/10_compositional_networks.md"},e=a("",24),n=[e];function l(r,p,d,c,h,k){return o(),s("div",null,n)}const m=i(t,[["render",l]]);export{u as __pageData,m as default}; diff --git a/dev/assets/learning_10_compositional_networks.md.DeAhp3_R.js b/dev/assets/learning_10_compositional_networks.md.DeAhp3_R.js new file mode 100644 index 0000000..633f6ac --- /dev/null +++ b/dev/assets/learning_10_compositional_networks.md.DeAhp3_R.js @@ -0,0 +1 @@ +import{_ as e,c as l,j as i,a as t,G as n,a5 as a,B as r,o as p}from"./chunks/framework.CJakPlgM.js";const _=JSON.parse('{"title":"CompositionalNetworks.jl","description":"","frontmatter":{},"headers":[],"relativePath":"learning/10_compositional_networks.md","filePath":"learning/10_compositional_networks.md","lastUpdated":null}'),d={name:"learning/10_compositional_networks.md"},k={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},h={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""};function j(w,s,f,v,E,F){const o=r("Badge");return p(),l("div",null,[s[27]||(s[27]=i("h1",{id:"compositionalnetworks-jl",tabindex:"-1"},[t("CompositionalNetworks.jl "),i("a",{class:"header-anchor",href:"#compositionalnetworks-jl","aria-label":'Permalink to "CompositionalNetworks.jl"'},"​")],-1)),s[28]||(s[28]=i("p",null,[t("Documentation for "),i("code",null,"CompositionalNetworks.jl"),t(".")],-1)),s[29]||(s[29]=i("h2",{id:"utilities",tabindex:"-1"},[t("Utilities "),i("a",{class:"header-anchor",href:"#utilities","aria-label":'Permalink to "Utilities"'},"​")],-1)),i("details",k,[i("summary",null,[s[0]||(s[0]=i("a",{id:"CompositionalNetworks.map_tr!-learning-10_compositional_networks",href:"#CompositionalNetworks.map_tr!-learning-10_compositional_networks"},[i("span",{class:"jlbinding"},"CompositionalNetworks.map_tr!")],-1)),s[1]||(s[1]=t()),n(o,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=a('
julia
map_tr!(f, x, X, param)

Return an anonymous function that applies f to all elements of x and store the result in X, with a parameter param (which is set to nothing for function with no parameter).

source

',3))]),i("details",c,[i("summary",null,[s[3]||(s[3]=i("a",{id:"CompositionalNetworks.lazy-learning-10_compositional_networks",href:"#CompositionalNetworks.lazy-learning-10_compositional_networks"},[i("span",{class:"jlbinding"},"CompositionalNetworks.lazy")],-1)),s[4]||(s[4]=t()),n(o,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=a('
julia
lazy(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V).

source

',3))]),i("details",m,[i("summary",null,[s[6]||(s[6]=i("a",{id:"CompositionalNetworks.lazy_param-learning-10_compositional_networks",href:"#CompositionalNetworks.lazy_param-learning-10_compositional_networks"},[i("span",{class:"jlbinding"},"CompositionalNetworks.lazy_param")],-1)),s[7]||(s[7]=t()),n(o,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[8]||(s[8]=a('
julia
lazy_param(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V; param).

source

',3))]),i("details",h,[i("summary",null,[s[9]||(s[9]=i("a",{id:"CompositionalNetworks.as_bitvector-learning-10_compositional_networks",href:"#CompositionalNetworks.as_bitvector-learning-10_compositional_networks"},[i("span",{class:"jlbinding"},"CompositionalNetworks.as_bitvector")],-1)),s[10]||(s[10]=t()),n(o,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[11]||(s[11]=a('
julia
as_bitvector(n::Int, max_n::Int = n)

Convert an Int to a BitVector of minimal size (relatively to max_n).

source

',3))]),i("details",u,[i("summary",null,[s[12]||(s[12]=i("a",{id:"CompositionalNetworks.as_int-learning-10_compositional_networks",href:"#CompositionalNetworks.as_int-learning-10_compositional_networks"},[i("span",{class:"jlbinding"},"CompositionalNetworks.as_int")],-1)),s[13]||(s[13]=t()),n(o,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[14]||(s[14]=a('
julia
as_int(v::AbstractVector)

Convert a BitVector into an Int.

source

',3))]),i("details",g,[i("summary",null,[s[15]||(s[15]=i("a",{id:"CompositionalNetworks.reduce_symbols-learning-10_compositional_networks",href:"#CompositionalNetworks.reduce_symbols-learning-10_compositional_networks"},[i("span",{class:"jlbinding"},"CompositionalNetworks.reduce_symbols")],-1)),s[16]||(s[16]=t()),n(o,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=a('
julia
reduce_symbols(symbols, sep)

Produce a formatted string that separates the symbols by sep. Used internally for show_composition.

source

',3))]),s[30]||(s[30]=i("div",{class:"warning custom-block"},[i("p",{class:"custom-block-title"},"Missing docstring."),i("p",null,[t("Missing docstring for "),i("code",null,"CompositionalNeworks.tr_in"),t(". Check Documenter's build log for details.")])],-1)),s[31]||(s[31]=i("h2",{id:"metrics",tabindex:"-1"},[t("Metrics "),i("a",{class:"header-anchor",href:"#metrics","aria-label":'Permalink to "Metrics"'},"​")],-1)),i("details",b,[i("summary",null,[s[18]||(s[18]=i("a",{id:"CompositionalNetworks.hamming-learning-10_compositional_networks",href:"#CompositionalNetworks.hamming-learning-10_compositional_networks"},[i("span",{class:"jlbinding"},"CompositionalNetworks.hamming")],-1)),s[19]||(s[19]=t()),n(o,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[20]||(s[20]=a('
julia
hamming(x, X)

Compute the hamming distance of x over a collection of solutions X, i.e. the minimal number of variables to switch in xto reach a solution.

source

',3))]),i("details",C,[i("summary",null,[s[21]||(s[21]=i("a",{id:"CompositionalNetworks.minkowski-learning-10_compositional_networks",href:"#CompositionalNetworks.minkowski-learning-10_compositional_networks"},[i("span",{class:"jlbinding"},"CompositionalNetworks.minkowski")],-1)),s[22]||(s[22]=t()),n(o,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[23]||(s[23]=a('
julia
minkowski(x, X, p)

source

',2))]),i("details",y,[i("summary",null,[s[24]||(s[24]=i("a",{id:"CompositionalNetworks.manhattan-learning-10_compositional_networks",href:"#CompositionalNetworks.manhattan-learning-10_compositional_networks"},[i("span",{class:"jlbinding"},"CompositionalNetworks.manhattan")],-1)),s[25]||(s[25]=t()),n(o,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=a('
julia
manhattan(x, X)

source

',2))]),s[32]||(s[32]=i("div",{class:"warning custom-block"},[i("p",{class:"custom-block-title"},"Missing docstring."),i("p",null,[t("Missing docstring for "),i("code",null,"weigths_bias"),t(". Check Documenter's build log for details.")])],-1))])}const x=e(d,[["render",j]]);export{_ as __pageData,x as default}; diff --git a/dev/assets/learning_10_compositional_networks.md.DeAhp3_R.lean.js b/dev/assets/learning_10_compositional_networks.md.DeAhp3_R.lean.js new file mode 100644 index 0000000..633f6ac --- /dev/null +++ b/dev/assets/learning_10_compositional_networks.md.DeAhp3_R.lean.js @@ -0,0 +1 @@ +import{_ as e,c as l,j as i,a as t,G as n,a5 as a,B as r,o as p}from"./chunks/framework.CJakPlgM.js";const _=JSON.parse('{"title":"CompositionalNetworks.jl","description":"","frontmatter":{},"headers":[],"relativePath":"learning/10_compositional_networks.md","filePath":"learning/10_compositional_networks.md","lastUpdated":null}'),d={name:"learning/10_compositional_networks.md"},k={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},h={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""};function j(w,s,f,v,E,F){const o=r("Badge");return p(),l("div",null,[s[27]||(s[27]=i("h1",{id:"compositionalnetworks-jl",tabindex:"-1"},[t("CompositionalNetworks.jl "),i("a",{class:"header-anchor",href:"#compositionalnetworks-jl","aria-label":'Permalink to "CompositionalNetworks.jl"'},"​")],-1)),s[28]||(s[28]=i("p",null,[t("Documentation for "),i("code",null,"CompositionalNetworks.jl"),t(".")],-1)),s[29]||(s[29]=i("h2",{id:"utilities",tabindex:"-1"},[t("Utilities "),i("a",{class:"header-anchor",href:"#utilities","aria-label":'Permalink to "Utilities"'},"​")],-1)),i("details",k,[i("summary",null,[s[0]||(s[0]=i("a",{id:"CompositionalNetworks.map_tr!-learning-10_compositional_networks",href:"#CompositionalNetworks.map_tr!-learning-10_compositional_networks"},[i("span",{class:"jlbinding"},"CompositionalNetworks.map_tr!")],-1)),s[1]||(s[1]=t()),n(o,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=a('
julia
map_tr!(f, x, X, param)

Return an anonymous function that applies f to all elements of x and store the result in X, with a parameter param (which is set to nothing for function with no parameter).

source

',3))]),i("details",c,[i("summary",null,[s[3]||(s[3]=i("a",{id:"CompositionalNetworks.lazy-learning-10_compositional_networks",href:"#CompositionalNetworks.lazy-learning-10_compositional_networks"},[i("span",{class:"jlbinding"},"CompositionalNetworks.lazy")],-1)),s[4]||(s[4]=t()),n(o,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=a('
julia
lazy(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V).

source

',3))]),i("details",m,[i("summary",null,[s[6]||(s[6]=i("a",{id:"CompositionalNetworks.lazy_param-learning-10_compositional_networks",href:"#CompositionalNetworks.lazy_param-learning-10_compositional_networks"},[i("span",{class:"jlbinding"},"CompositionalNetworks.lazy_param")],-1)),s[7]||(s[7]=t()),n(o,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[8]||(s[8]=a('
julia
lazy_param(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V; param).

source

',3))]),i("details",h,[i("summary",null,[s[9]||(s[9]=i("a",{id:"CompositionalNetworks.as_bitvector-learning-10_compositional_networks",href:"#CompositionalNetworks.as_bitvector-learning-10_compositional_networks"},[i("span",{class:"jlbinding"},"CompositionalNetworks.as_bitvector")],-1)),s[10]||(s[10]=t()),n(o,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[11]||(s[11]=a('
julia
as_bitvector(n::Int, max_n::Int = n)

Convert an Int to a BitVector of minimal size (relatively to max_n).

source

',3))]),i("details",u,[i("summary",null,[s[12]||(s[12]=i("a",{id:"CompositionalNetworks.as_int-learning-10_compositional_networks",href:"#CompositionalNetworks.as_int-learning-10_compositional_networks"},[i("span",{class:"jlbinding"},"CompositionalNetworks.as_int")],-1)),s[13]||(s[13]=t()),n(o,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[14]||(s[14]=a('
julia
as_int(v::AbstractVector)

Convert a BitVector into an Int.

source

',3))]),i("details",g,[i("summary",null,[s[15]||(s[15]=i("a",{id:"CompositionalNetworks.reduce_symbols-learning-10_compositional_networks",href:"#CompositionalNetworks.reduce_symbols-learning-10_compositional_networks"},[i("span",{class:"jlbinding"},"CompositionalNetworks.reduce_symbols")],-1)),s[16]||(s[16]=t()),n(o,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=a('
julia
reduce_symbols(symbols, sep)

Produce a formatted string that separates the symbols by sep. Used internally for show_composition.

source

',3))]),s[30]||(s[30]=i("div",{class:"warning custom-block"},[i("p",{class:"custom-block-title"},"Missing docstring."),i("p",null,[t("Missing docstring for "),i("code",null,"CompositionalNeworks.tr_in"),t(". Check Documenter's build log for details.")])],-1)),s[31]||(s[31]=i("h2",{id:"metrics",tabindex:"-1"},[t("Metrics "),i("a",{class:"header-anchor",href:"#metrics","aria-label":'Permalink to "Metrics"'},"​")],-1)),i("details",b,[i("summary",null,[s[18]||(s[18]=i("a",{id:"CompositionalNetworks.hamming-learning-10_compositional_networks",href:"#CompositionalNetworks.hamming-learning-10_compositional_networks"},[i("span",{class:"jlbinding"},"CompositionalNetworks.hamming")],-1)),s[19]||(s[19]=t()),n(o,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[20]||(s[20]=a('
julia
hamming(x, X)

Compute the hamming distance of x over a collection of solutions X, i.e. the minimal number of variables to switch in xto reach a solution.

source

',3))]),i("details",C,[i("summary",null,[s[21]||(s[21]=i("a",{id:"CompositionalNetworks.minkowski-learning-10_compositional_networks",href:"#CompositionalNetworks.minkowski-learning-10_compositional_networks"},[i("span",{class:"jlbinding"},"CompositionalNetworks.minkowski")],-1)),s[22]||(s[22]=t()),n(o,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[23]||(s[23]=a('
julia
minkowski(x, X, p)

source

',2))]),i("details",y,[i("summary",null,[s[24]||(s[24]=i("a",{id:"CompositionalNetworks.manhattan-learning-10_compositional_networks",href:"#CompositionalNetworks.manhattan-learning-10_compositional_networks"},[i("span",{class:"jlbinding"},"CompositionalNetworks.manhattan")],-1)),s[25]||(s[25]=t()),n(o,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=a('
julia
manhattan(x, X)

source

',2))]),s[32]||(s[32]=i("div",{class:"warning custom-block"},[i("p",{class:"custom-block-title"},"Missing docstring."),i("p",null,[t("Missing docstring for "),i("code",null,"weigths_bias"),t(". Check Documenter's build log for details.")])],-1))])}const x=e(d,[["render",j]]);export{_ as __pageData,x as default}; diff --git a/dev/assets/learning_11_layers.md.09f2Jdhx.js b/dev/assets/learning_11_layers.md.09f2Jdhx.js new file mode 100644 index 0000000..f8ff814 --- /dev/null +++ b/dev/assets/learning_11_layers.md.09f2Jdhx.js @@ -0,0 +1,4 @@ +import{_ as n,c as o,a5 as t,j as e,a as i,G as l,B as r,o as p}from"./chunks/framework.CJakPlgM.js";const L=JSON.parse('{"title":"A layer structure for any ICN","description":"","frontmatter":{},"headers":[],"relativePath":"learning/11_layers.md","filePath":"learning/11_layers.md","lastUpdated":null}'),u={name:"learning/11_layers.md"},d={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},h={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""};function f(w,s,N,E,x,_){const a=r("Badge");return p(),o("div",null,[s[33]||(s[33]=t('

A layer structure for any ICN

The layer.jl file defines a Layer structure and several associated functions for manipulating and interacting with this structure in the context of an Interpretable Compositional Network (ICN).

The Layer structure is used to store a LittleDict of operations that can be selected during the learning phase of an ICN. Each layer can be exclusive, meaning only one operation can be selected at a time. This is particularly useful in the context of ICNs, which are used to learn alternative expressions for highly combinatorial functions, such as those found in Constraint-based Local Search solvers.

',3)),e("details",d,[e("summary",null,[s[0]||(s[0]=e("a",{id:"CompositionalNetworks.Layer-learning-11_layers",href:"#CompositionalNetworks.Layer-learning-11_layers"},[e("span",{class:"jlbinding"},"CompositionalNetworks.Layer")],-1)),s[1]||(s[1]=i()),l(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=t('
julia
Layer

A structure to store a LittleDict of operations that can be selected during the learning phase of an ICN. If the layer is exclusive, only one operation can be selected at a time.

source

',3))]),e("details",c,[e("summary",null,[s[3]||(s[3]=e("a",{id:"CompositionalNetworks.functions-learning-11_layers",href:"#CompositionalNetworks.functions-learning-11_layers"},[e("span",{class:"jlbinding"},"CompositionalNetworks.functions")],-1)),s[4]||(s[4]=i()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=t('
julia
functions(layer)

Access the operations of a layer. The container is ordered.

source

',3))]),e("details",h,[e("summary",null,[s[6]||(s[6]=e("a",{id:"Base.length-Tuple{CompositionalNetworks.Layer}-learning-11_layers",href:"#Base.length-Tuple{CompositionalNetworks.Layer}-learning-11_layers"},[e("span",{class:"jlbinding"},"Base.length")],-1)),s[7]||(s[7]=i()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[8]||(s[8]=t('
julia
length(layer)

Return the number of operations in a layer.

source

',3))]),e("details",g,[e("summary",null,[s[9]||(s[9]=e("a",{id:"CompositionalNetworks.exclu-learning-11_layers",href:"#CompositionalNetworks.exclu-learning-11_layers"},[e("span",{class:"jlbinding"},"CompositionalNetworks.exclu")],-1)),s[10]||(s[10]=i()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[11]||(s[11]=t('
julia
exclu(layer)

Return true if the layer has mutually exclusive operations.

source

',3))]),e("details",k,[e("summary",null,[s[12]||(s[12]=e("a",{id:"CompositionalNetworks.symbol-learning-11_layers",href:"#CompositionalNetworks.symbol-learning-11_layers"},[e("span",{class:"jlbinding"},"CompositionalNetworks.symbol")],-1)),s[13]||(s[13]=i()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[14]||(s[14]=t('
julia
symbol(layer, i)

Return the i-th symbols of the operations in a given layer.

source

',3))]),e("details",y,[e("summary",null,[s[15]||(s[15]=e("a",{id:"CompositionalNetworks.nbits_exclu-learning-11_layers",href:"#CompositionalNetworks.nbits_exclu-learning-11_layers"},[e("span",{class:"jlbinding"},"CompositionalNetworks.nbits_exclu")],-1)),s[16]||(s[16]=i()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=t('
julia
nbits_exclu(layer)

Convert the length of an exclusive layer into a number of bits.

source

',3))]),e("details",b,[e("summary",null,[s[18]||(s[18]=e("a",{id:"CompositionalNetworks.show_layer-learning-11_layers",href:"#CompositionalNetworks.show_layer-learning-11_layers"},[e("span",{class:"jlbinding"},"CompositionalNetworks.show_layer")],-1)),s[19]||(s[19]=i()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[20]||(s[20]=t('
julia
show_layer(layer)

Return a string that contains the elements in a layer.

source

',3))]),e("details",m,[e("summary",null,[s[21]||(s[21]=e("a",{id:"CompositionalNetworks.selected_size-learning-11_layers",href:"#CompositionalNetworks.selected_size-learning-11_layers"},[e("span",{class:"jlbinding"},"CompositionalNetworks.selected_size")],-1)),s[22]||(s[22]=i()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[23]||(s[23]=t('
julia
selected_size(layer, layer_weights)

Return the number of operations selected by layer_weights in layer.

source

',3))]),e("details",C,[e("summary",null,[s[24]||(s[24]=e("a",{id:"CompositionalNetworks.is_viable-learning-11_layers",href:"#CompositionalNetworks.is_viable-learning-11_layers"},[e("span",{class:"jlbinding"},"CompositionalNetworks.is_viable")],-1)),s[25]||(s[25]=i()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=t(`
julia
is_viable(layer, w)
+is_viable(icn)
+is_viable(icn, w)

Assert if a pair of layer/icn and weights compose a viable pattern. If no weights are given with an icn, it will check the current internal value.

source

`,3))]),e("details",j,[e("summary",null,[s[27]||(s[27]=e("a",{id:"CompositionalNetworks.generate_inclusive_operations-learning-11_layers",href:"#CompositionalNetworks.generate_inclusive_operations-learning-11_layers"},[e("span",{class:"jlbinding"},"CompositionalNetworks.generate_inclusive_operations")],-1)),s[28]||(s[28]=i()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[29]||(s[29]=t(`
julia
generate_inclusive_operations(predicate, bits)
+generate_exclusive_operation(max_op_number)

Generates the operations (weights) of a layer with inclusive/exclusive operations.

source

`,3))]),e("details",v,[e("summary",null,[s[30]||(s[30]=e("a",{id:"CompositionalNetworks.generate_exclusive_operation-learning-11_layers",href:"#CompositionalNetworks.generate_exclusive_operation-learning-11_layers"},[e("span",{class:"jlbinding"},"CompositionalNetworks.generate_exclusive_operation")],-1)),s[31]||(s[31]=i()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[32]||(s[32]=t('
julia
generate_exclusive_operation(max_op_number)

Generates the operations (weights) of a layer with exclusive operations.

source

',3))]),s[34]||(s[34]=e("div",{class:"warning custom-block"},[e("p",{class:"custom-block-title"},"Missing docstring."),e("p",null,[i("Missing docstring for "),e("code",null,"generate_weigths"),i(". Check Documenter's build log for details.")])],-1))])}const B=n(u,[["render",f]]);export{L as __pageData,B as default}; diff --git a/dev/assets/learning_11_layers.md.09f2Jdhx.lean.js b/dev/assets/learning_11_layers.md.09f2Jdhx.lean.js new file mode 100644 index 0000000..f8ff814 --- /dev/null +++ b/dev/assets/learning_11_layers.md.09f2Jdhx.lean.js @@ -0,0 +1,4 @@ +import{_ as n,c as o,a5 as t,j as e,a as i,G as l,B as r,o as p}from"./chunks/framework.CJakPlgM.js";const L=JSON.parse('{"title":"A layer structure for any ICN","description":"","frontmatter":{},"headers":[],"relativePath":"learning/11_layers.md","filePath":"learning/11_layers.md","lastUpdated":null}'),u={name:"learning/11_layers.md"},d={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},h={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""};function f(w,s,N,E,x,_){const a=r("Badge");return p(),o("div",null,[s[33]||(s[33]=t('

A layer structure for any ICN

The layer.jl file defines a Layer structure and several associated functions for manipulating and interacting with this structure in the context of an Interpretable Compositional Network (ICN).

The Layer structure is used to store a LittleDict of operations that can be selected during the learning phase of an ICN. Each layer can be exclusive, meaning only one operation can be selected at a time. This is particularly useful in the context of ICNs, which are used to learn alternative expressions for highly combinatorial functions, such as those found in Constraint-based Local Search solvers.

',3)),e("details",d,[e("summary",null,[s[0]||(s[0]=e("a",{id:"CompositionalNetworks.Layer-learning-11_layers",href:"#CompositionalNetworks.Layer-learning-11_layers"},[e("span",{class:"jlbinding"},"CompositionalNetworks.Layer")],-1)),s[1]||(s[1]=i()),l(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=t('
julia
Layer

A structure to store a LittleDict of operations that can be selected during the learning phase of an ICN. If the layer is exclusive, only one operation can be selected at a time.

source

',3))]),e("details",c,[e("summary",null,[s[3]||(s[3]=e("a",{id:"CompositionalNetworks.functions-learning-11_layers",href:"#CompositionalNetworks.functions-learning-11_layers"},[e("span",{class:"jlbinding"},"CompositionalNetworks.functions")],-1)),s[4]||(s[4]=i()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=t('
julia
functions(layer)

Access the operations of a layer. The container is ordered.

source

',3))]),e("details",h,[e("summary",null,[s[6]||(s[6]=e("a",{id:"Base.length-Tuple{CompositionalNetworks.Layer}-learning-11_layers",href:"#Base.length-Tuple{CompositionalNetworks.Layer}-learning-11_layers"},[e("span",{class:"jlbinding"},"Base.length")],-1)),s[7]||(s[7]=i()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[8]||(s[8]=t('
julia
length(layer)

Return the number of operations in a layer.

source

',3))]),e("details",g,[e("summary",null,[s[9]||(s[9]=e("a",{id:"CompositionalNetworks.exclu-learning-11_layers",href:"#CompositionalNetworks.exclu-learning-11_layers"},[e("span",{class:"jlbinding"},"CompositionalNetworks.exclu")],-1)),s[10]||(s[10]=i()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[11]||(s[11]=t('
julia
exclu(layer)

Return true if the layer has mutually exclusive operations.

source

',3))]),e("details",k,[e("summary",null,[s[12]||(s[12]=e("a",{id:"CompositionalNetworks.symbol-learning-11_layers",href:"#CompositionalNetworks.symbol-learning-11_layers"},[e("span",{class:"jlbinding"},"CompositionalNetworks.symbol")],-1)),s[13]||(s[13]=i()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[14]||(s[14]=t('
julia
symbol(layer, i)

Return the i-th symbols of the operations in a given layer.

source

',3))]),e("details",y,[e("summary",null,[s[15]||(s[15]=e("a",{id:"CompositionalNetworks.nbits_exclu-learning-11_layers",href:"#CompositionalNetworks.nbits_exclu-learning-11_layers"},[e("span",{class:"jlbinding"},"CompositionalNetworks.nbits_exclu")],-1)),s[16]||(s[16]=i()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=t('
julia
nbits_exclu(layer)

Convert the length of an exclusive layer into a number of bits.

source

',3))]),e("details",b,[e("summary",null,[s[18]||(s[18]=e("a",{id:"CompositionalNetworks.show_layer-learning-11_layers",href:"#CompositionalNetworks.show_layer-learning-11_layers"},[e("span",{class:"jlbinding"},"CompositionalNetworks.show_layer")],-1)),s[19]||(s[19]=i()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[20]||(s[20]=t('
julia
show_layer(layer)

Return a string that contains the elements in a layer.

source

',3))]),e("details",m,[e("summary",null,[s[21]||(s[21]=e("a",{id:"CompositionalNetworks.selected_size-learning-11_layers",href:"#CompositionalNetworks.selected_size-learning-11_layers"},[e("span",{class:"jlbinding"},"CompositionalNetworks.selected_size")],-1)),s[22]||(s[22]=i()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[23]||(s[23]=t('
julia
selected_size(layer, layer_weights)

Return the number of operations selected by layer_weights in layer.

source

',3))]),e("details",C,[e("summary",null,[s[24]||(s[24]=e("a",{id:"CompositionalNetworks.is_viable-learning-11_layers",href:"#CompositionalNetworks.is_viable-learning-11_layers"},[e("span",{class:"jlbinding"},"CompositionalNetworks.is_viable")],-1)),s[25]||(s[25]=i()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=t(`
julia
is_viable(layer, w)
+is_viable(icn)
+is_viable(icn, w)

Assert if a pair of layer/icn and weights compose a viable pattern. If no weights are given with an icn, it will check the current internal value.

source

`,3))]),e("details",j,[e("summary",null,[s[27]||(s[27]=e("a",{id:"CompositionalNetworks.generate_inclusive_operations-learning-11_layers",href:"#CompositionalNetworks.generate_inclusive_operations-learning-11_layers"},[e("span",{class:"jlbinding"},"CompositionalNetworks.generate_inclusive_operations")],-1)),s[28]||(s[28]=i()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[29]||(s[29]=t(`
julia
generate_inclusive_operations(predicate, bits)
+generate_exclusive_operation(max_op_number)

Generates the operations (weights) of a layer with inclusive/exclusive operations.

source

`,3))]),e("details",v,[e("summary",null,[s[30]||(s[30]=e("a",{id:"CompositionalNetworks.generate_exclusive_operation-learning-11_layers",href:"#CompositionalNetworks.generate_exclusive_operation-learning-11_layers"},[e("span",{class:"jlbinding"},"CompositionalNetworks.generate_exclusive_operation")],-1)),s[31]||(s[31]=i()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[32]||(s[32]=t('
julia
generate_exclusive_operation(max_op_number)

Generates the operations (weights) of a layer with exclusive operations.

source

',3))]),s[34]||(s[34]=e("div",{class:"warning custom-block"},[e("p",{class:"custom-block-title"},"Missing docstring."),e("p",null,[i("Missing docstring for "),e("code",null,"generate_weigths"),i(". Check Documenter's build log for details.")])],-1))])}const B=n(u,[["render",f]]);export{L as __pageData,B as default}; diff --git a/dev/assets/learning_11_layers.md.BQudKiAI.js b/dev/assets/learning_11_layers.md.BQudKiAI.js deleted file mode 100644 index a9a91ee..0000000 --- a/dev/assets/learning_11_layers.md.BQudKiAI.js +++ /dev/null @@ -1,4 +0,0 @@ -import{_ as e,c as i,o as a,a7 as s}from"./chunks/framework.CBLuZwrP.js";const g=JSON.parse('{"title":"A layer structure for any ICN","description":"","frontmatter":{},"headers":[],"relativePath":"learning/11_layers.md","filePath":"learning/11_layers.md","lastUpdated":null}'),t={name:"learning/11_layers.md"},r=s(`

A layer structure for any ICN

The layer.jl file defines a Layer structure and several associated functions for manipulating and interacting with this structure in the context of an Interpretable Compositional Network (ICN).

The Layer structure is used to store a LittleDict of operations that can be selected during the learning phase of an ICN. Each layer can be exclusive, meaning only one operation can be selected at a time. This is particularly useful in the context of ICNs, which are used to learn alternative expressions for highly combinatorial functions, such as those found in Constraint-based Local Search solvers.

# CompositionalNetworks.LayerType.
julia
Layer

A structure to store a LittleDict of operations that can be selected during the learning phase of an ICN. If the layer is exclusive, only one operation can be selected at a time.

source


# CompositionalNetworks.functionsFunction.
julia
functions(layer)

Access the operations of a layer. The container is ordered.

source


# Base.lengthMethod.
julia
length(layer)

Return the number of operations in a layer.

source


# CompositionalNetworks.excluFunction.
julia
exclu(layer)

Return true if the layer has mutually exclusive operations.

source


# CompositionalNetworks.symbolFunction.
julia
symbol(layer, i)

Return the i-th symbols of the operations in a given layer.

source


# CompositionalNetworks.nbits_excluFunction.
julia
nbits_exclu(layer)

Convert the length of an exclusive layer into a number of bits.

source


# CompositionalNetworks.show_layerFunction.
julia
show_layer(layer)

Return a string that contains the elements in a layer.

source


# CompositionalNetworks.selected_sizeFunction.
julia
selected_size(layer, layer_weights)

Return the number of operations selected by layer_weights in layer.

source


# CompositionalNetworks.is_viableFunction.
julia
is_viable(layer, w)
-is_viable(icn)
-is_viable(icn, w)

Assert if a pair of layer/icn and weights compose a viable pattern. If no weights are given with an icn, it will check the current internal value.

source


# CompositionalNetworks.generate_inclusive_operationsFunction.
julia
generate_inclusive_operations(predicate, bits)
-generate_exclusive_operation(max_op_number)

Generates the operations (weights) of a layer with inclusive/exclusive operations.

source


# CompositionalNetworks.generate_exclusive_operationFunction.
julia
generate_exclusive_operation(max_op_number)

Generates the operations (weights) of a layer with exclusive operations.

source


Missing docstring.

Missing docstring for generate_weigths. Check Documenter's build log for details.

`,26),o=[r];function l(n,p,d,c,h,u){return a(),i("div",null,o)}const k=e(t,[["render",l]]);export{g as __pageData,k as default}; diff --git a/dev/assets/learning_11_layers.md.BQudKiAI.lean.js b/dev/assets/learning_11_layers.md.BQudKiAI.lean.js deleted file mode 100644 index 911f32a..0000000 --- a/dev/assets/learning_11_layers.md.BQudKiAI.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,c as i,o as a,a7 as s}from"./chunks/framework.CBLuZwrP.js";const g=JSON.parse('{"title":"A layer structure for any ICN","description":"","frontmatter":{},"headers":[],"relativePath":"learning/11_layers.md","filePath":"learning/11_layers.md","lastUpdated":null}'),t={name:"learning/11_layers.md"},r=s("",26),o=[r];function l(n,p,d,c,h,u){return a(),i("div",null,o)}const k=e(t,[["render",l]]);export{g as __pageData,k as default}; diff --git a/dev/assets/learning_12_transformation.md.D3UmWQzI.js b/dev/assets/learning_12_transformation.md.D3UmWQzI.js deleted file mode 100644 index 39921e9..0000000 --- a/dev/assets/learning_12_transformation.md.D3UmWQzI.js +++ /dev/null @@ -1,29 +0,0 @@ -import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.CBLuZwrP.js";const g=JSON.parse('{"title":"Transformations Layer","description":"","frontmatter":{},"headers":[],"relativePath":"learning/12_transformation.md","filePath":"learning/12_transformation.md","lastUpdated":null}'),e={name:"learning/12_transformation.md"},n=t(`

Transformations Layer

Some text to describe the transformation layer within usual ICNs.

The implementation of the transformation relies heavily on the use of the lazy function (make a ref, open an issue to make @lazy macro in front of each transformation).

List of transformations

List the possible parameters and how it affects the transformations.

Non-parametric

# CompositionalNetworks.tr_identityFunction.
julia
tr_identity(i, x)
-tr_identity(x)
-tr_identity(x, X::AbstractVector)

Identity function. Already defined in Julia as identity, specialized for vectors. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_eqFunction.
julia
tr_count_eq(i, x)
-tr_count_eq(x)
-tr_count_eq(x, X::AbstractVector)

Count the number of elements equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_eq_rightFunction.
julia
tr_count_eq_right(i, x)
-tr_count_eq_right(x)
-tr_count_eq_right(x, X::AbstractVector)

Count the number of elements to the right of and equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_eq_leftFunction.
julia
tr_count_eq_left(i, x)
-tr_count_eq_left(x)
-tr_count_eq_left(x, X::AbstractVector)

Count the number of elements to the left of and equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_greaterFunction.
julia
tr_count_greater(i, x)
-tr_count_greater(x)
-tr_count_greater(x, X::AbstractVector)

Count the number of elements greater than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_lesserFunction.
julia
tr_count_lesser(i, x)
-tr_count_lesser(x)
-tr_count_lesser(x, X::AbstractVector)

Count the number of elements lesser than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_g_leftFunction.
julia
tr_count_g_left(i, x)
-tr_count_g_left(x)
-tr_count_g_left(x, X::AbstractVector)

Count the number of elements to the left of and greater than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_g_rightFunction.
julia
tr_count_g_right(i, x)
-tr_count_g_right(x)
-tr_count_g_right(x, X::AbstractVector)

Count the number of elements to the right of and greater than x[i]. Extended method to vector with sig (x) are generated.

source


# CompositionalNetworks.tr_count_l_rightFunction.
julia
tr_count_l_right(i, x)
-tr_count_l_right(x)
-tr_count_l_right(x, X::AbstractVector)

Count the number of elements to the right of and lesser than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


Missing docstring.

Missing docstring for tr_contiguous_vals_minus. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_contiguous_vals_minus_rev. Check Documenter's build log for details.

Param: :val

Missing docstring.

Missing docstring for tr_count_eq_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_count_l_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_count_g_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_count_bounding_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_val_minus_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_param_minus_val. Check Documenter's build log for details.

Layer generation

# CompositionalNetworks.make_transformationsFunction.
julia
make_transformations(param::Symbol)

Generates a dictionary of transformation functions based on the specified parameterization. This function facilitates the creation of parametric layers for constraint transformations, allowing for flexible and dynamic constraint manipulation according to the needs of different constraint programming models.

Parameters

  • param::Symbol: Specifies the type of transformations to generate. It can be :none for basic transformations that do not depend on external parameters, or :val for transformations that operate with respect to a specific value parameter.

Returns

  • LittleDict{Symbol, Function}: A dictionary mapping transformation names (Symbol) to their corresponding functions (Function). The functions encapsulate various types of transformations, such as counting, comparison, and contiguous value processing.

Transformation Types

  • When param is :none, the following transformations are available:

    • :identity: No transformation is applied.

    • :count_eq, :count_eq_left, :count_eq_right: Count equalities under different conditions.

    • :count_greater, :count_lesser: Count values greater or lesser than a threshold.

    • :count_g_left, :count_l_left, :count_g_right, :count_l_right: Count values with greater or lesser comparisons from different directions.

    • :contiguous_vals_minus, :contiguous_vals_minus_rev: Process contiguous values with subtraction in normal and reverse order.

  • When param is :val, the transformations relate to operations involving a parameter value:

    • :count_eq_param, :count_l_param, :count_g_param: Count equalities or comparisons against a parameter value.

    • :count_bounding_param: Count values bounding a parameter value.

    • :val_minus_param, :param_minus_val: Subtract a parameter value from values or vice versa.

The function delegates to a version that uses Val(param) for dispatch, ensuring compile-time selection of the appropriate transformation set.

Examples

julia
# Get basic transformations
-basic_transforms = make_transformations(:none)
-
-# Apply an identity transformation
-identity_result = basic_transforms[:identity](data)
-
-# Get value-based transformations
-val_transforms = make_transformations(:val)
-
-# Apply a count equal to parameter transformation
-count_eq_param_result = val_transforms[:count_eq_param](data, param)

source


# CompositionalNetworks.transformation_layerFunction.
julia
transformation_layer(param = Vector{Symbol}())

Generate the layer of transformations functions of the ICN. Iff param value is non empty, also includes all the related parametric transformations.

source


`,38),o=[n];function r(l,p,d,h,c,k){return a(),i("div",null,o)}const m=s(e,[["render",r]]);export{g as __pageData,m as default}; diff --git a/dev/assets/learning_12_transformation.md.D3UmWQzI.lean.js b/dev/assets/learning_12_transformation.md.D3UmWQzI.lean.js deleted file mode 100644 index d8ebce2..0000000 --- a/dev/assets/learning_12_transformation.md.D3UmWQzI.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.CBLuZwrP.js";const g=JSON.parse('{"title":"Transformations Layer","description":"","frontmatter":{},"headers":[],"relativePath":"learning/12_transformation.md","filePath":"learning/12_transformation.md","lastUpdated":null}'),e={name:"learning/12_transformation.md"},n=t("",38),o=[n];function r(l,p,d,h,c,k){return a(),i("div",null,o)}const m=s(e,[["render",r]]);export{g as __pageData,m as default}; diff --git a/dev/assets/learning_12_transformation.md.M1sCl03X.js b/dev/assets/learning_12_transformation.md.M1sCl03X.js new file mode 100644 index 0000000..ba91ce1 --- /dev/null +++ b/dev/assets/learning_12_transformation.md.M1sCl03X.js @@ -0,0 +1,29 @@ +import{_ as o,c as l,a5 as t,j as i,a as n,G as e,B as r,o as p}from"./chunks/framework.CJakPlgM.js";const B=JSON.parse('{"title":"Transformations Layer","description":"","frontmatter":{},"headers":[],"relativePath":"learning/12_transformation.md","filePath":"learning/12_transformation.md","lastUpdated":null}'),d={name:"learning/12_transformation.md"},h={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},_={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""};function C(v,s,F,j,x,w){const a=r("Badge");return p(),l("div",null,[s[33]||(s[33]=t('

Transformations Layer

Some text to describe the transformation layer within usual ICNs.

The implementation of the transformation relies heavily on the use of the lazy function (make a ref, open an issue to make @lazy macro in front of each transformation).

List of transformations

List the possible parameters and how it affects the transformations.

Non-parametric

',6)),i("details",h,[i("summary",null,[s[0]||(s[0]=i("a",{id:"CompositionalNetworks.tr_identity-learning-12_transformation",href:"#CompositionalNetworks.tr_identity-learning-12_transformation"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_identity")],-1)),s[1]||(s[1]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=t(`
julia
tr_identity(i, x)
+tr_identity(x)
+tr_identity(x, X::AbstractVector)

Identity function. Already defined in Julia as identity, specialized for vectors. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",c,[i("summary",null,[s[3]||(s[3]=i("a",{id:"CompositionalNetworks.tr_count_eq-learning-12_transformation",href:"#CompositionalNetworks.tr_count_eq-learning-12_transformation"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_eq")],-1)),s[4]||(s[4]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=t(`
julia
tr_count_eq(i, x)
+tr_count_eq(x)
+tr_count_eq(x, X::AbstractVector)

Count the number of elements equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",k,[i("summary",null,[s[6]||(s[6]=i("a",{id:"CompositionalNetworks.tr_count_eq_right-learning-12_transformation",href:"#CompositionalNetworks.tr_count_eq_right-learning-12_transformation"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_eq_right")],-1)),s[7]||(s[7]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[8]||(s[8]=t(`
julia
tr_count_eq_right(i, x)
+tr_count_eq_right(x)
+tr_count_eq_right(x, X::AbstractVector)

Count the number of elements to the right of and equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",u,[i("summary",null,[s[9]||(s[9]=i("a",{id:"CompositionalNetworks.tr_count_eq_left-learning-12_transformation",href:"#CompositionalNetworks.tr_count_eq_left-learning-12_transformation"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_eq_left")],-1)),s[10]||(s[10]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[11]||(s[11]=t(`
julia
tr_count_eq_left(i, x)
+tr_count_eq_left(x)
+tr_count_eq_left(x, X::AbstractVector)

Count the number of elements to the left of and equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",g,[i("summary",null,[s[12]||(s[12]=i("a",{id:"CompositionalNetworks.tr_count_greater-learning-12_transformation",href:"#CompositionalNetworks.tr_count_greater-learning-12_transformation"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_greater")],-1)),s[13]||(s[13]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[14]||(s[14]=t(`
julia
tr_count_greater(i, x)
+tr_count_greater(x)
+tr_count_greater(x, X::AbstractVector)

Count the number of elements greater than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",m,[i("summary",null,[s[15]||(s[15]=i("a",{id:"CompositionalNetworks.tr_count_lesser-learning-12_transformation",href:"#CompositionalNetworks.tr_count_lesser-learning-12_transformation"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_lesser")],-1)),s[16]||(s[16]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=t(`
julia
tr_count_lesser(i, x)
+tr_count_lesser(x)
+tr_count_lesser(x, X::AbstractVector)

Count the number of elements lesser than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",f,[i("summary",null,[s[18]||(s[18]=i("a",{id:"CompositionalNetworks.tr_count_g_left-learning-12_transformation",href:"#CompositionalNetworks.tr_count_g_left-learning-12_transformation"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_g_left")],-1)),s[19]||(s[19]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[20]||(s[20]=t(`
julia
tr_count_g_left(i, x)
+tr_count_g_left(x)
+tr_count_g_left(x, X::AbstractVector)

Count the number of elements to the left of and greater than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",y,[i("summary",null,[s[21]||(s[21]=i("a",{id:"CompositionalNetworks.tr_count_g_right-learning-12_transformation",href:"#CompositionalNetworks.tr_count_g_right-learning-12_transformation"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_g_right")],-1)),s[22]||(s[22]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[23]||(s[23]=t(`
julia
tr_count_g_right(i, x)
+tr_count_g_right(x)
+tr_count_g_right(x, X::AbstractVector)

Count the number of elements to the right of and greater than x[i]. Extended method to vector with sig (x) are generated.

source

`,3))]),i("details",E,[i("summary",null,[s[24]||(s[24]=i("a",{id:"CompositionalNetworks.tr_count_l_right-learning-12_transformation",href:"#CompositionalNetworks.tr_count_l_right-learning-12_transformation"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_l_right")],-1)),s[25]||(s[25]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=t(`
julia
tr_count_l_right(i, x)
+tr_count_l_right(x)
+tr_count_l_right(x, X::AbstractVector)

Count the number of elements to the right of and lesser than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),s[34]||(s[34]=t('

Missing docstring.

Missing docstring for tr_contiguous_vals_minus. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_contiguous_vals_minus_rev. Check Documenter's build log for details.

Param: :val

Missing docstring.

Missing docstring for tr_count_eq_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_count_l_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_count_g_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_count_bounding_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_val_minus_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_param_minus_val. Check Documenter's build log for details.

Layer generation

',10)),i("details",_,[i("summary",null,[s[27]||(s[27]=i("a",{id:"CompositionalNetworks.make_transformations-learning-12_transformation",href:"#CompositionalNetworks.make_transformations-learning-12_transformation"},[i("span",{class:"jlbinding"},"CompositionalNetworks.make_transformations")],-1)),s[28]||(s[28]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[29]||(s[29]=t(`
julia
make_transformations(param::Symbol)

Generates a dictionary of transformation functions based on the specified parameterization. This function facilitates the creation of parametric layers for constraint transformations, allowing for flexible and dynamic constraint manipulation according to the needs of different constraint programming models.

Parameters

  • param::Symbol: Specifies the type of transformations to generate. It can be :none for basic transformations that do not depend on external parameters, or :val for transformations that operate with respect to a specific value parameter.

Returns

  • LittleDict{Symbol, Function}: A dictionary mapping transformation names (Symbol) to their corresponding functions (Function). The functions encapsulate various types of transformations, such as counting, comparison, and contiguous value processing.

Transformation Types

  • When param is :none, the following transformations are available:

    • :identity: No transformation is applied.

    • :count_eq, :count_eq_left, :count_eq_right: Count equalities under different conditions.

    • :count_greater, :count_lesser: Count values greater or lesser than a threshold.

    • :count_g_left, :count_l_left, :count_g_right, :count_l_right: Count values with greater or lesser comparisons from different directions.

    • :contiguous_vals_minus, :contiguous_vals_minus_rev: Process contiguous values with subtraction in normal and reverse order.

  • When param is :val, the transformations relate to operations involving a parameter value:

    • :count_eq_param, :count_l_param, :count_g_param: Count equalities or comparisons against a parameter value.

    • :count_bounding_param: Count values bounding a parameter value.

    • :val_minus_param, :param_minus_val: Subtract a parameter value from values or vice versa.

The function delegates to a version that uses Val(param) for dispatch, ensuring compile-time selection of the appropriate transformation set.

Examples

julia
# Get basic transformations
+basic_transforms = make_transformations(:none)
+
+# Apply an identity transformation
+identity_result = basic_transforms[:identity](data)
+
+# Get value-based transformations
+val_transforms = make_transformations(:val)
+
+# Apply a count equal to parameter transformation
+count_eq_param_result = val_transforms[:count_eq_param](data, param)

source

`,12))]),i("details",b,[i("summary",null,[s[30]||(s[30]=i("a",{id:"CompositionalNetworks.transformation_layer-learning-12_transformation",href:"#CompositionalNetworks.transformation_layer-learning-12_transformation"},[i("span",{class:"jlbinding"},"CompositionalNetworks.transformation_layer")],-1)),s[31]||(s[31]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[32]||(s[32]=t('
julia
transformation_layer(param = Vector{Symbol}())

Generate the layer of transformations functions of the ICN. Iff param value is non empty, also includes all the related parametric transformations.

source

',3))])])}const q=o(d,[["render",C]]);export{B as __pageData,q as default}; diff --git a/dev/assets/learning_12_transformation.md.M1sCl03X.lean.js b/dev/assets/learning_12_transformation.md.M1sCl03X.lean.js new file mode 100644 index 0000000..ba91ce1 --- /dev/null +++ b/dev/assets/learning_12_transformation.md.M1sCl03X.lean.js @@ -0,0 +1,29 @@ +import{_ as o,c as l,a5 as t,j as i,a as n,G as e,B as r,o as p}from"./chunks/framework.CJakPlgM.js";const B=JSON.parse('{"title":"Transformations Layer","description":"","frontmatter":{},"headers":[],"relativePath":"learning/12_transformation.md","filePath":"learning/12_transformation.md","lastUpdated":null}'),d={name:"learning/12_transformation.md"},h={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},_={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""};function C(v,s,F,j,x,w){const a=r("Badge");return p(),l("div",null,[s[33]||(s[33]=t('

Transformations Layer

Some text to describe the transformation layer within usual ICNs.

The implementation of the transformation relies heavily on the use of the lazy function (make a ref, open an issue to make @lazy macro in front of each transformation).

List of transformations

List the possible parameters and how it affects the transformations.

Non-parametric

',6)),i("details",h,[i("summary",null,[s[0]||(s[0]=i("a",{id:"CompositionalNetworks.tr_identity-learning-12_transformation",href:"#CompositionalNetworks.tr_identity-learning-12_transformation"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_identity")],-1)),s[1]||(s[1]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=t(`
julia
tr_identity(i, x)
+tr_identity(x)
+tr_identity(x, X::AbstractVector)

Identity function. Already defined in Julia as identity, specialized for vectors. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",c,[i("summary",null,[s[3]||(s[3]=i("a",{id:"CompositionalNetworks.tr_count_eq-learning-12_transformation",href:"#CompositionalNetworks.tr_count_eq-learning-12_transformation"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_eq")],-1)),s[4]||(s[4]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=t(`
julia
tr_count_eq(i, x)
+tr_count_eq(x)
+tr_count_eq(x, X::AbstractVector)

Count the number of elements equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",k,[i("summary",null,[s[6]||(s[6]=i("a",{id:"CompositionalNetworks.tr_count_eq_right-learning-12_transformation",href:"#CompositionalNetworks.tr_count_eq_right-learning-12_transformation"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_eq_right")],-1)),s[7]||(s[7]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[8]||(s[8]=t(`
julia
tr_count_eq_right(i, x)
+tr_count_eq_right(x)
+tr_count_eq_right(x, X::AbstractVector)

Count the number of elements to the right of and equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",u,[i("summary",null,[s[9]||(s[9]=i("a",{id:"CompositionalNetworks.tr_count_eq_left-learning-12_transformation",href:"#CompositionalNetworks.tr_count_eq_left-learning-12_transformation"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_eq_left")],-1)),s[10]||(s[10]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[11]||(s[11]=t(`
julia
tr_count_eq_left(i, x)
+tr_count_eq_left(x)
+tr_count_eq_left(x, X::AbstractVector)

Count the number of elements to the left of and equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",g,[i("summary",null,[s[12]||(s[12]=i("a",{id:"CompositionalNetworks.tr_count_greater-learning-12_transformation",href:"#CompositionalNetworks.tr_count_greater-learning-12_transformation"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_greater")],-1)),s[13]||(s[13]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[14]||(s[14]=t(`
julia
tr_count_greater(i, x)
+tr_count_greater(x)
+tr_count_greater(x, X::AbstractVector)

Count the number of elements greater than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",m,[i("summary",null,[s[15]||(s[15]=i("a",{id:"CompositionalNetworks.tr_count_lesser-learning-12_transformation",href:"#CompositionalNetworks.tr_count_lesser-learning-12_transformation"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_lesser")],-1)),s[16]||(s[16]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=t(`
julia
tr_count_lesser(i, x)
+tr_count_lesser(x)
+tr_count_lesser(x, X::AbstractVector)

Count the number of elements lesser than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",f,[i("summary",null,[s[18]||(s[18]=i("a",{id:"CompositionalNetworks.tr_count_g_left-learning-12_transformation",href:"#CompositionalNetworks.tr_count_g_left-learning-12_transformation"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_g_left")],-1)),s[19]||(s[19]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[20]||(s[20]=t(`
julia
tr_count_g_left(i, x)
+tr_count_g_left(x)
+tr_count_g_left(x, X::AbstractVector)

Count the number of elements to the left of and greater than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),i("details",y,[i("summary",null,[s[21]||(s[21]=i("a",{id:"CompositionalNetworks.tr_count_g_right-learning-12_transformation",href:"#CompositionalNetworks.tr_count_g_right-learning-12_transformation"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_g_right")],-1)),s[22]||(s[22]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[23]||(s[23]=t(`
julia
tr_count_g_right(i, x)
+tr_count_g_right(x)
+tr_count_g_right(x, X::AbstractVector)

Count the number of elements to the right of and greater than x[i]. Extended method to vector with sig (x) are generated.

source

`,3))]),i("details",E,[i("summary",null,[s[24]||(s[24]=i("a",{id:"CompositionalNetworks.tr_count_l_right-learning-12_transformation",href:"#CompositionalNetworks.tr_count_l_right-learning-12_transformation"},[i("span",{class:"jlbinding"},"CompositionalNetworks.tr_count_l_right")],-1)),s[25]||(s[25]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=t(`
julia
tr_count_l_right(i, x)
+tr_count_l_right(x)
+tr_count_l_right(x, X::AbstractVector)

Count the number of elements to the right of and lesser than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

`,3))]),s[34]||(s[34]=t('

Missing docstring.

Missing docstring for tr_contiguous_vals_minus. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_contiguous_vals_minus_rev. Check Documenter's build log for details.

Param: :val

Missing docstring.

Missing docstring for tr_count_eq_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_count_l_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_count_g_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_count_bounding_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_val_minus_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_param_minus_val. Check Documenter's build log for details.

Layer generation

',10)),i("details",_,[i("summary",null,[s[27]||(s[27]=i("a",{id:"CompositionalNetworks.make_transformations-learning-12_transformation",href:"#CompositionalNetworks.make_transformations-learning-12_transformation"},[i("span",{class:"jlbinding"},"CompositionalNetworks.make_transformations")],-1)),s[28]||(s[28]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[29]||(s[29]=t(`
julia
make_transformations(param::Symbol)

Generates a dictionary of transformation functions based on the specified parameterization. This function facilitates the creation of parametric layers for constraint transformations, allowing for flexible and dynamic constraint manipulation according to the needs of different constraint programming models.

Parameters

  • param::Symbol: Specifies the type of transformations to generate. It can be :none for basic transformations that do not depend on external parameters, or :val for transformations that operate with respect to a specific value parameter.

Returns

  • LittleDict{Symbol, Function}: A dictionary mapping transformation names (Symbol) to their corresponding functions (Function). The functions encapsulate various types of transformations, such as counting, comparison, and contiguous value processing.

Transformation Types

  • When param is :none, the following transformations are available:

    • :identity: No transformation is applied.

    • :count_eq, :count_eq_left, :count_eq_right: Count equalities under different conditions.

    • :count_greater, :count_lesser: Count values greater or lesser than a threshold.

    • :count_g_left, :count_l_left, :count_g_right, :count_l_right: Count values with greater or lesser comparisons from different directions.

    • :contiguous_vals_minus, :contiguous_vals_minus_rev: Process contiguous values with subtraction in normal and reverse order.

  • When param is :val, the transformations relate to operations involving a parameter value:

    • :count_eq_param, :count_l_param, :count_g_param: Count equalities or comparisons against a parameter value.

    • :count_bounding_param: Count values bounding a parameter value.

    • :val_minus_param, :param_minus_val: Subtract a parameter value from values or vice versa.

The function delegates to a version that uses Val(param) for dispatch, ensuring compile-time selection of the appropriate transformation set.

Examples

julia
# Get basic transformations
+basic_transforms = make_transformations(:none)
+
+# Apply an identity transformation
+identity_result = basic_transforms[:identity](data)
+
+# Get value-based transformations
+val_transforms = make_transformations(:val)
+
+# Apply a count equal to parameter transformation
+count_eq_param_result = val_transforms[:count_eq_param](data, param)

source

`,12))]),i("details",b,[i("summary",null,[s[30]||(s[30]=i("a",{id:"CompositionalNetworks.transformation_layer-learning-12_transformation",href:"#CompositionalNetworks.transformation_layer-learning-12_transformation"},[i("span",{class:"jlbinding"},"CompositionalNetworks.transformation_layer")],-1)),s[31]||(s[31]=n()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[32]||(s[32]=t('
julia
transformation_layer(param = Vector{Symbol}())

Generate the layer of transformations functions of the ICN. Iff param value is non empty, also includes all the related parametric transformations.

source

',3))])])}const q=o(d,[["render",C]]);export{B as __pageData,q as default}; diff --git a/dev/assets/learning_13_arithmetic.md.42vK0uzX.js b/dev/assets/learning_13_arithmetic.md.42vK0uzX.js new file mode 100644 index 0000000..722607d --- /dev/null +++ b/dev/assets/learning_13_arithmetic.md.42vK0uzX.js @@ -0,0 +1 @@ +import{_ as o,c as n,j as e,a as i,G as s,a5 as r,B as l,o as p}from"./chunks/framework.CJakPlgM.js";const j=JSON.parse('{"title":"Arithmetic Layer","description":"","frontmatter":{},"headers":[],"relativePath":"learning/13_arithmetic.md","filePath":"learning/13_arithmetic.md","lastUpdated":null}'),d={name:"learning/13_arithmetic.md"},c={class:"jldocstring custom-block",open:""},h={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""};function u(g,t,k,b,y,f){const a=l("Badge");return p(),n("div",null,[t[9]||(t[9]=e("h1",{id:"Arithmetic-Layer",tabindex:"-1"},[i("Arithmetic Layer "),e("a",{class:"header-anchor",href:"#Arithmetic-Layer","aria-label":'Permalink to "Arithmetic Layer {#Arithmetic-Layer}"'},"​")],-1)),t[10]||(t[10]=e("p",null,"Some text to describe the arithmetic layer within usual ICNs.",-1)),t[11]||(t[11]=e("h2",{id:"List-of-arithmetic-operations",tabindex:"-1"},[i("List of arithmetic operations "),e("a",{class:"header-anchor",href:"#List-of-arithmetic-operations","aria-label":'Permalink to "List of arithmetic operations {#List-of-arithmetic-operations}"'},"​")],-1)),e("details",c,[e("summary",null,[t[0]||(t[0]=e("a",{id:"CompositionalNetworks.ar_sum-learning-13_arithmetic",href:"#CompositionalNetworks.ar_sum-learning-13_arithmetic"},[e("span",{class:"jlbinding"},"CompositionalNetworks.ar_sum")],-1)),t[1]||(t[1]=i()),s(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),t[2]||(t[2]=r('
julia
ar_sum(x)

Reduce k = length(x) vectors through sum to a single vector.

source

',3))]),e("details",h,[e("summary",null,[t[3]||(t[3]=e("a",{id:"CompositionalNetworks.ar_prod-learning-13_arithmetic",href:"#CompositionalNetworks.ar_prod-learning-13_arithmetic"},[e("span",{class:"jlbinding"},"CompositionalNetworks.ar_prod")],-1)),t[4]||(t[4]=i()),s(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),t[5]||(t[5]=r('
julia
ar_prod(x)

Reduce k = length(x) vectors through product to a single vector.

source

',3))]),t[12]||(t[12]=e("h2",{id:"Layer-generation",tabindex:"-1"},[i("Layer generation "),e("a",{class:"header-anchor",href:"#Layer-generation","aria-label":'Permalink to "Layer generation {#Layer-generation}"'},"​")],-1)),e("details",m,[e("summary",null,[t[6]||(t[6]=e("a",{id:"CompositionalNetworks.arithmetic_layer-learning-13_arithmetic",href:"#CompositionalNetworks.arithmetic_layer-learning-13_arithmetic"},[e("span",{class:"jlbinding"},"CompositionalNetworks.arithmetic_layer")],-1)),t[7]||(t[7]=i()),s(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),t[8]||(t[8]=r('
julia
arithmetic_layer()

Generate the layer of arithmetic operations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source

',3))])])}const v=o(d,[["render",u]]);export{j as __pageData,v as default}; diff --git a/dev/assets/learning_13_arithmetic.md.42vK0uzX.lean.js b/dev/assets/learning_13_arithmetic.md.42vK0uzX.lean.js new file mode 100644 index 0000000..722607d --- /dev/null +++ b/dev/assets/learning_13_arithmetic.md.42vK0uzX.lean.js @@ -0,0 +1 @@ +import{_ as o,c as n,j as e,a as i,G as s,a5 as r,B as l,o as p}from"./chunks/framework.CJakPlgM.js";const j=JSON.parse('{"title":"Arithmetic Layer","description":"","frontmatter":{},"headers":[],"relativePath":"learning/13_arithmetic.md","filePath":"learning/13_arithmetic.md","lastUpdated":null}'),d={name:"learning/13_arithmetic.md"},c={class:"jldocstring custom-block",open:""},h={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""};function u(g,t,k,b,y,f){const a=l("Badge");return p(),n("div",null,[t[9]||(t[9]=e("h1",{id:"Arithmetic-Layer",tabindex:"-1"},[i("Arithmetic Layer "),e("a",{class:"header-anchor",href:"#Arithmetic-Layer","aria-label":'Permalink to "Arithmetic Layer {#Arithmetic-Layer}"'},"​")],-1)),t[10]||(t[10]=e("p",null,"Some text to describe the arithmetic layer within usual ICNs.",-1)),t[11]||(t[11]=e("h2",{id:"List-of-arithmetic-operations",tabindex:"-1"},[i("List of arithmetic operations "),e("a",{class:"header-anchor",href:"#List-of-arithmetic-operations","aria-label":'Permalink to "List of arithmetic operations {#List-of-arithmetic-operations}"'},"​")],-1)),e("details",c,[e("summary",null,[t[0]||(t[0]=e("a",{id:"CompositionalNetworks.ar_sum-learning-13_arithmetic",href:"#CompositionalNetworks.ar_sum-learning-13_arithmetic"},[e("span",{class:"jlbinding"},"CompositionalNetworks.ar_sum")],-1)),t[1]||(t[1]=i()),s(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),t[2]||(t[2]=r('
julia
ar_sum(x)

Reduce k = length(x) vectors through sum to a single vector.

source

',3))]),e("details",h,[e("summary",null,[t[3]||(t[3]=e("a",{id:"CompositionalNetworks.ar_prod-learning-13_arithmetic",href:"#CompositionalNetworks.ar_prod-learning-13_arithmetic"},[e("span",{class:"jlbinding"},"CompositionalNetworks.ar_prod")],-1)),t[4]||(t[4]=i()),s(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),t[5]||(t[5]=r('
julia
ar_prod(x)

Reduce k = length(x) vectors through product to a single vector.

source

',3))]),t[12]||(t[12]=e("h2",{id:"Layer-generation",tabindex:"-1"},[i("Layer generation "),e("a",{class:"header-anchor",href:"#Layer-generation","aria-label":'Permalink to "Layer generation {#Layer-generation}"'},"​")],-1)),e("details",m,[e("summary",null,[t[6]||(t[6]=e("a",{id:"CompositionalNetworks.arithmetic_layer-learning-13_arithmetic",href:"#CompositionalNetworks.arithmetic_layer-learning-13_arithmetic"},[e("span",{class:"jlbinding"},"CompositionalNetworks.arithmetic_layer")],-1)),t[7]||(t[7]=i()),s(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),t[8]||(t[8]=r('
julia
arithmetic_layer()

Generate the layer of arithmetic operations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source

',3))])])}const v=o(d,[["render",u]]);export{j as __pageData,v as default}; diff --git a/dev/assets/learning_13_arithmetic.md.CK9BAsnj.js b/dev/assets/learning_13_arithmetic.md.CK9BAsnj.js deleted file mode 100644 index 0f66084..0000000 --- a/dev/assets/learning_13_arithmetic.md.CK9BAsnj.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,c as i,o as t,a7 as a}from"./chunks/framework.CBLuZwrP.js";const b=JSON.parse('{"title":"Arithmetic Layer","description":"","frontmatter":{},"headers":[],"relativePath":"learning/13_arithmetic.md","filePath":"learning/13_arithmetic.md","lastUpdated":null}'),r={name:"learning/13_arithmetic.md"},o=a('

Arithmetic Layer

Some text to describe the arithmetic layer within usual ICNs.

List of arithmetic operations

# CompositionalNetworks.ar_sumFunction.
julia
ar_sum(x)

Reduce k = length(x) vectors through sum to a single vector.

source


# CompositionalNetworks.ar_prodFunction.
julia
ar_prod(x)

Reduce k = length(x) vectors through product to a single vector.

source


Layer generation

# CompositionalNetworks.arithmetic_layerFunction.
julia
arithmetic_layer()

Generate the layer of arithmetic operations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source


',10),s=[o];function l(n,h,c,p,d,m){return t(),i("div",null,s)}const g=e(r,[["render",l]]);export{b as __pageData,g as default}; diff --git a/dev/assets/learning_13_arithmetic.md.CK9BAsnj.lean.js b/dev/assets/learning_13_arithmetic.md.CK9BAsnj.lean.js deleted file mode 100644 index bfd3175..0000000 --- a/dev/assets/learning_13_arithmetic.md.CK9BAsnj.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,c as i,o as t,a7 as a}from"./chunks/framework.CBLuZwrP.js";const b=JSON.parse('{"title":"Arithmetic Layer","description":"","frontmatter":{},"headers":[],"relativePath":"learning/13_arithmetic.md","filePath":"learning/13_arithmetic.md","lastUpdated":null}'),r={name:"learning/13_arithmetic.md"},o=a("",10),s=[o];function l(n,h,c,p,d,m){return t(),i("div",null,s)}const g=e(r,[["render",l]]);export{b as __pageData,g as default}; diff --git a/dev/assets/learning_14_aggregation.md.V0-R09TM.js b/dev/assets/learning_14_aggregation.md.V0-R09TM.js new file mode 100644 index 0000000..641f551 --- /dev/null +++ b/dev/assets/learning_14_aggregation.md.V0-R09TM.js @@ -0,0 +1 @@ +import{_ as n,c as r,j as e,a as t,G as s,a5 as o,B as l,o as g}from"./chunks/framework.CJakPlgM.js";const j=JSON.parse('{"title":"Aggregation Layer","description":"","frontmatter":{},"headers":[],"relativePath":"learning/14_aggregation.md","filePath":"learning/14_aggregation.md","lastUpdated":null}'),p={name:"learning/14_aggregation.md"},d={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""};function h(m,a,k,b,y,f){const i=l("Badge");return g(),r("div",null,[a[9]||(a[9]=e("h1",{id:"Aggregation-Layer",tabindex:"-1"},[t("Aggregation Layer "),e("a",{class:"header-anchor",href:"#Aggregation-Layer","aria-label":'Permalink to "Aggregation Layer {#Aggregation-Layer}"'},"​")],-1)),a[10]||(a[10]=e("p",null,"Some text to describe the aggragation layer within usual ICNs.",-1)),a[11]||(a[11]=e("h2",{id:"List-of-aggregations",tabindex:"-1"},[t("List of aggregations "),e("a",{class:"header-anchor",href:"#List-of-aggregations","aria-label":'Permalink to "List of aggregations {#List-of-aggregations}"'},"​")],-1)),e("details",d,[e("summary",null,[a[0]||(a[0]=e("a",{id:"CompositionalNetworks.ag_sum-learning-14_aggregation",href:"#CompositionalNetworks.ag_sum-learning-14_aggregation"},[e("span",{class:"jlbinding"},"CompositionalNetworks.ag_sum")],-1)),a[1]||(a[1]=t()),s(i,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[2]||(a[2]=o('
julia
ag_sum(x)

Aggregate through + a vector into a single scalar.

source

',3))]),e("details",u,[e("summary",null,[a[3]||(a[3]=e("a",{id:"CompositionalNetworks.ag_count_positive-learning-14_aggregation",href:"#CompositionalNetworks.ag_count_positive-learning-14_aggregation"},[e("span",{class:"jlbinding"},"CompositionalNetworks.ag_count_positive")],-1)),a[4]||(a[4]=t()),s(i,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[5]||(a[5]=o('
julia
ag_count_positive(x)

Count the number of strictly positive elements of x.

source

',3))]),a[12]||(a[12]=e("h2",{id:"Layer-generation",tabindex:"-1"},[t("Layer generation "),e("a",{class:"header-anchor",href:"#Layer-generation","aria-label":'Permalink to "Layer generation {#Layer-generation}"'},"​")],-1)),e("details",c,[e("summary",null,[a[6]||(a[6]=e("a",{id:"CompositionalNetworks.aggregation_layer-learning-14_aggregation",href:"#CompositionalNetworks.aggregation_layer-learning-14_aggregation"},[e("span",{class:"jlbinding"},"CompositionalNetworks.aggregation_layer")],-1)),a[7]||(a[7]=t()),s(i,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[8]||(a[8]=o('
julia
aggregation_layer()

Generate the layer of aggregations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source

',3))])])}const v=n(p,[["render",h]]);export{j as __pageData,v as default}; diff --git a/dev/assets/learning_14_aggregation.md.V0-R09TM.lean.js b/dev/assets/learning_14_aggregation.md.V0-R09TM.lean.js new file mode 100644 index 0000000..641f551 --- /dev/null +++ b/dev/assets/learning_14_aggregation.md.V0-R09TM.lean.js @@ -0,0 +1 @@ +import{_ as n,c as r,j as e,a as t,G as s,a5 as o,B as l,o as g}from"./chunks/framework.CJakPlgM.js";const j=JSON.parse('{"title":"Aggregation Layer","description":"","frontmatter":{},"headers":[],"relativePath":"learning/14_aggregation.md","filePath":"learning/14_aggregation.md","lastUpdated":null}'),p={name:"learning/14_aggregation.md"},d={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""};function h(m,a,k,b,y,f){const i=l("Badge");return g(),r("div",null,[a[9]||(a[9]=e("h1",{id:"Aggregation-Layer",tabindex:"-1"},[t("Aggregation Layer "),e("a",{class:"header-anchor",href:"#Aggregation-Layer","aria-label":'Permalink to "Aggregation Layer {#Aggregation-Layer}"'},"​")],-1)),a[10]||(a[10]=e("p",null,"Some text to describe the aggragation layer within usual ICNs.",-1)),a[11]||(a[11]=e("h2",{id:"List-of-aggregations",tabindex:"-1"},[t("List of aggregations "),e("a",{class:"header-anchor",href:"#List-of-aggregations","aria-label":'Permalink to "List of aggregations {#List-of-aggregations}"'},"​")],-1)),e("details",d,[e("summary",null,[a[0]||(a[0]=e("a",{id:"CompositionalNetworks.ag_sum-learning-14_aggregation",href:"#CompositionalNetworks.ag_sum-learning-14_aggregation"},[e("span",{class:"jlbinding"},"CompositionalNetworks.ag_sum")],-1)),a[1]||(a[1]=t()),s(i,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[2]||(a[2]=o('
julia
ag_sum(x)

Aggregate through + a vector into a single scalar.

source

',3))]),e("details",u,[e("summary",null,[a[3]||(a[3]=e("a",{id:"CompositionalNetworks.ag_count_positive-learning-14_aggregation",href:"#CompositionalNetworks.ag_count_positive-learning-14_aggregation"},[e("span",{class:"jlbinding"},"CompositionalNetworks.ag_count_positive")],-1)),a[4]||(a[4]=t()),s(i,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[5]||(a[5]=o('
julia
ag_count_positive(x)

Count the number of strictly positive elements of x.

source

',3))]),a[12]||(a[12]=e("h2",{id:"Layer-generation",tabindex:"-1"},[t("Layer generation "),e("a",{class:"header-anchor",href:"#Layer-generation","aria-label":'Permalink to "Layer generation {#Layer-generation}"'},"​")],-1)),e("details",c,[e("summary",null,[a[6]||(a[6]=e("a",{id:"CompositionalNetworks.aggregation_layer-learning-14_aggregation",href:"#CompositionalNetworks.aggregation_layer-learning-14_aggregation"},[e("span",{class:"jlbinding"},"CompositionalNetworks.aggregation_layer")],-1)),a[7]||(a[7]=t()),s(i,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[8]||(a[8]=o('
julia
aggregation_layer()

Generate the layer of aggregations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source

',3))])])}const v=n(p,[["render",h]]);export{j as __pageData,v as default}; diff --git a/dev/assets/learning_14_aggregation.md.uncWDDl4.js b/dev/assets/learning_14_aggregation.md.uncWDDl4.js deleted file mode 100644 index 801e4c4..0000000 --- a/dev/assets/learning_14_aggregation.md.uncWDDl4.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as e,o as i,a7 as t}from"./chunks/framework.CBLuZwrP.js";const b=JSON.parse('{"title":"Aggregation Layer","description":"","frontmatter":{},"headers":[],"relativePath":"learning/14_aggregation.md","filePath":"learning/14_aggregation.md","lastUpdated":null}'),o={name:"learning/14_aggregation.md"},r=t('

Aggregation Layer

Some text to describe the aggragation layer within usual ICNs.

List of aggregations

# CompositionalNetworks.ag_sumFunction.
julia
ag_sum(x)

Aggregate through + a vector into a single scalar.

source


# CompositionalNetworks.ag_count_positiveFunction.
julia
ag_count_positive(x)

Count the number of strictly positive elements of x.

source


Layer generation

# CompositionalNetworks.aggregation_layerFunction.
julia
aggregation_layer()

Generate the layer of aggregations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source


',10),s=[r];function n(g,l,p,d,c,h){return i(),e("div",null,s)}const _=a(o,[["render",n]]);export{b as __pageData,_ as default}; diff --git a/dev/assets/learning_14_aggregation.md.uncWDDl4.lean.js b/dev/assets/learning_14_aggregation.md.uncWDDl4.lean.js deleted file mode 100644 index 2e6bcb2..0000000 --- a/dev/assets/learning_14_aggregation.md.uncWDDl4.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as e,o as i,a7 as t}from"./chunks/framework.CBLuZwrP.js";const b=JSON.parse('{"title":"Aggregation Layer","description":"","frontmatter":{},"headers":[],"relativePath":"learning/14_aggregation.md","filePath":"learning/14_aggregation.md","lastUpdated":null}'),o={name:"learning/14_aggregation.md"},r=t("",10),s=[r];function n(g,l,p,d,c,h){return i(),e("div",null,s)}const _=a(o,[["render",n]]);export{b as __pageData,_ as default}; diff --git a/dev/assets/learning_15_comparison.md.Cizy95BA.js b/dev/assets/learning_15_comparison.md.Cizy95BA.js deleted file mode 100644 index c61c910..0000000 --- a/dev/assets/learning_15_comparison.md.Cizy95BA.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as s,o as a,a7 as o}from"./chunks/framework.CBLuZwrP.js";const g=JSON.parse('{"title":"Comparison Layer","description":"","frontmatter":{},"headers":[],"relativePath":"learning/15_comparison.md","filePath":"learning/15_comparison.md","lastUpdated":null}'),e={name:"learning/15_comparison.md"},r=o('

Comparison Layer

Some text to describe the comparison layer within usual ICNs.

List of comparisons

List the possible parameters and how it affects the comparison.

Non-parametric

# CompositionalNetworks.co_identityFunction.
julia
co_identity(x)

Identity function. Already defined in Julia as identity, specialized for scalars in the comparison layer.

source


Missing docstring.

Missing docstring for co_euclidian. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_abs_diff_val_vars. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_val_minus_vars. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_vars_minus_val. Check Documenter's build log for details.

Param: :val

Missing docstring.

Missing docstring for co_abs_diff_val_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_val_minus_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_param_minus_val. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_euclidian_param. Check Documenter's build log for details.

Layer generation

Missing docstring.

Missing docstring for make_comparisons. Check Documenter's build log for details.

# CompositionalNetworks.comparison_layerFunction.
julia
comparison_layer(param = false)

Generate the layer of transformations functions of the ICN. Iff param value is set, also includes all the parametric comparison with that value. The operations are mutually exclusive, that is only one will be selected.

source


',20),t=[r];function n(c,l,d,p,m,h){return a(),s("div",null,t)}const b=i(e,[["render",n]]);export{g as __pageData,b as default}; diff --git a/dev/assets/learning_15_comparison.md.Cizy95BA.lean.js b/dev/assets/learning_15_comparison.md.Cizy95BA.lean.js deleted file mode 100644 index e519113..0000000 --- a/dev/assets/learning_15_comparison.md.Cizy95BA.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as s,o as a,a7 as o}from"./chunks/framework.CBLuZwrP.js";const g=JSON.parse('{"title":"Comparison Layer","description":"","frontmatter":{},"headers":[],"relativePath":"learning/15_comparison.md","filePath":"learning/15_comparison.md","lastUpdated":null}'),e={name:"learning/15_comparison.md"},r=o("",20),t=[r];function n(c,l,d,p,m,h){return a(),s("div",null,t)}const b=i(e,[["render",n]]);export{g as __pageData,b as default}; diff --git a/dev/assets/learning_15_comparison.md.f9lWeNIO.js b/dev/assets/learning_15_comparison.md.f9lWeNIO.js new file mode 100644 index 0000000..aa0afc6 --- /dev/null +++ b/dev/assets/learning_15_comparison.md.f9lWeNIO.js @@ -0,0 +1 @@ +import{_ as n,c as r,a5 as i,j as o,a as e,G as t,B as l,o as c}from"./chunks/framework.CJakPlgM.js";const y=JSON.parse('{"title":"Comparison Layer","description":"","frontmatter":{},"headers":[],"relativePath":"learning/15_comparison.md","filePath":"learning/15_comparison.md","lastUpdated":null}'),d={name:"learning/15_comparison.md"},p={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""};function u(g,s,h,k,b,f){const a=l("Badge");return c(),r("div",null,[s[6]||(s[6]=i('

Comparison Layer

Some text to describe the comparison layer within usual ICNs.

List of comparisons

List the possible parameters and how it affects the comparison.

Non-parametric

',5)),o("details",p,[o("summary",null,[s[0]||(s[0]=o("a",{id:"CompositionalNetworks.co_identity-learning-15_comparison",href:"#CompositionalNetworks.co_identity-learning-15_comparison"},[o("span",{class:"jlbinding"},"CompositionalNetworks.co_identity")],-1)),s[1]||(s[1]=e()),t(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=i('
julia
co_identity(x)

Identity function. Already defined in Julia as identity, specialized for scalars in the comparison layer.

source

',3))]),s[7]||(s[7]=i('

Missing docstring.

Missing docstring for co_euclidian. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_abs_diff_val_vars. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_val_minus_vars. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_vars_minus_val. Check Documenter's build log for details.

Param: :val

Missing docstring.

Missing docstring for co_abs_diff_val_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_val_minus_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_param_minus_val. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_euclidian_param. Check Documenter's build log for details.

Layer generation

Missing docstring.

Missing docstring for make_comparisons. Check Documenter's build log for details.

',11)),o("details",m,[o("summary",null,[s[3]||(s[3]=o("a",{id:"CompositionalNetworks.comparison_layer-learning-15_comparison",href:"#CompositionalNetworks.comparison_layer-learning-15_comparison"},[o("span",{class:"jlbinding"},"CompositionalNetworks.comparison_layer")],-1)),s[4]||(s[4]=e()),t(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=i('
julia
comparison_layer(param = false)

Generate the layer of transformations functions of the ICN. Iff param value is set, also includes all the parametric comparison with that value. The operations are mutually exclusive, that is only one will be selected.

source

',3))])])}const _=n(d,[["render",u]]);export{y as __pageData,_ as default}; diff --git a/dev/assets/learning_15_comparison.md.f9lWeNIO.lean.js b/dev/assets/learning_15_comparison.md.f9lWeNIO.lean.js new file mode 100644 index 0000000..aa0afc6 --- /dev/null +++ b/dev/assets/learning_15_comparison.md.f9lWeNIO.lean.js @@ -0,0 +1 @@ +import{_ as n,c as r,a5 as i,j as o,a as e,G as t,B as l,o as c}from"./chunks/framework.CJakPlgM.js";const y=JSON.parse('{"title":"Comparison Layer","description":"","frontmatter":{},"headers":[],"relativePath":"learning/15_comparison.md","filePath":"learning/15_comparison.md","lastUpdated":null}'),d={name:"learning/15_comparison.md"},p={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""};function u(g,s,h,k,b,f){const a=l("Badge");return c(),r("div",null,[s[6]||(s[6]=i('

Comparison Layer

Some text to describe the comparison layer within usual ICNs.

List of comparisons

List the possible parameters and how it affects the comparison.

Non-parametric

',5)),o("details",p,[o("summary",null,[s[0]||(s[0]=o("a",{id:"CompositionalNetworks.co_identity-learning-15_comparison",href:"#CompositionalNetworks.co_identity-learning-15_comparison"},[o("span",{class:"jlbinding"},"CompositionalNetworks.co_identity")],-1)),s[1]||(s[1]=e()),t(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=i('
julia
co_identity(x)

Identity function. Already defined in Julia as identity, specialized for scalars in the comparison layer.

source

',3))]),s[7]||(s[7]=i('

Missing docstring.

Missing docstring for co_euclidian. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_abs_diff_val_vars. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_val_minus_vars. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_vars_minus_val. Check Documenter's build log for details.

Param: :val

Missing docstring.

Missing docstring for co_abs_diff_val_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_val_minus_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_param_minus_val. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_euclidian_param. Check Documenter's build log for details.

Layer generation

Missing docstring.

Missing docstring for make_comparisons. Check Documenter's build log for details.

',11)),o("details",m,[o("summary",null,[s[3]||(s[3]=o("a",{id:"CompositionalNetworks.comparison_layer-learning-15_comparison",href:"#CompositionalNetworks.comparison_layer-learning-15_comparison"},[o("span",{class:"jlbinding"},"CompositionalNetworks.comparison_layer")],-1)),s[4]||(s[4]=e()),t(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=i('
julia
comparison_layer(param = false)

Generate the layer of transformations functions of the ICN. Iff param value is set, also includes all the parametric comparison with that value. The operations are mutually exclusive, that is only one will be selected.

source

',3))])])}const _=n(d,[["render",u]]);export{y as __pageData,_ as default}; diff --git a/dev/assets/learning_20_qubo_constraints.md.D_0jKThG.js b/dev/assets/learning_20_qubo_constraints.md.D_0jKThG.js deleted file mode 100644 index c6df2fe..0000000 --- a/dev/assets/learning_20_qubo_constraints.md.D_0jKThG.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as t,o as s,a7 as i}from"./chunks/framework.CBLuZwrP.js";const b=JSON.parse('{"title":"Introduction to QUBOConstraints.jl","description":"","frontmatter":{},"headers":[],"relativePath":"learning/20_qubo_constraints.md","filePath":"learning/20_qubo_constraints.md","lastUpdated":null}'),n={name:"learning/20_qubo_constraints.md"},e=i('

Introduction to QUBOConstraints.jl

Introduction to QUBOConstraints.jl.

Basic features

# QUBOConstraints.QUBO_baseFunction.
julia
QUBO_base(n, weight = 1)

A basic QUBO matrix to ensure that binarized variables keep a valid encoding.

source


# QUBOConstraints.QUBO_linear_sumFunction.
julia
QUBO_linear_sum(n, σ)

One valid QUBO matrix given n variables and parameter σ for the linear sum constraint.

source


',7),r=[e];function o(l,d,c,p,h,u){return s(),t("div",null,r)}const g=a(n,[["render",o]]);export{b as __pageData,g as default}; diff --git a/dev/assets/learning_20_qubo_constraints.md.D_0jKThG.lean.js b/dev/assets/learning_20_qubo_constraints.md.D_0jKThG.lean.js deleted file mode 100644 index 93c5689..0000000 --- a/dev/assets/learning_20_qubo_constraints.md.D_0jKThG.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as t,o as s,a7 as i}from"./chunks/framework.CBLuZwrP.js";const b=JSON.parse('{"title":"Introduction to QUBOConstraints.jl","description":"","frontmatter":{},"headers":[],"relativePath":"learning/20_qubo_constraints.md","filePath":"learning/20_qubo_constraints.md","lastUpdated":null}'),n={name:"learning/20_qubo_constraints.md"},e=i("",7),r=[e];function o(l,d,c,p,h,u){return s(),t("div",null,r)}const g=a(n,[["render",o]]);export{b as __pageData,g as default}; diff --git a/dev/assets/learning_20_qubo_constraints.md.DfeUpk7q.js b/dev/assets/learning_20_qubo_constraints.md.DfeUpk7q.js new file mode 100644 index 0000000..4a09020 --- /dev/null +++ b/dev/assets/learning_20_qubo_constraints.md.DfeUpk7q.js @@ -0,0 +1 @@ +import{_ as o,c as r,j as t,a,G as i,a5 as e,B as l,o as d}from"./chunks/framework.CJakPlgM.js";const O=JSON.parse('{"title":"Introduction to QUBOConstraints.jl","description":"","frontmatter":{},"headers":[],"relativePath":"learning/20_qubo_constraints.md","filePath":"learning/20_qubo_constraints.md","lastUpdated":null}'),p={name:"learning/20_qubo_constraints.md"},u={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""};function b(h,s,g,B,k,m){const n=l("Badge");return d(),r("div",null,[s[6]||(s[6]=t("h1",{id:"Introduction-to-QUBOConstraints.jl",tabindex:"-1"},[a("Introduction to QUBOConstraints.jl "),t("a",{class:"header-anchor",href:"#Introduction-to-QUBOConstraints.jl","aria-label":'Permalink to "Introduction to QUBOConstraints.jl {#Introduction-to-QUBOConstraints.jl}"'},"​")],-1)),s[7]||(s[7]=t("p",null,[a("Introduction to "),t("code",null,"QUBOConstraints.jl"),a(".")],-1)),s[8]||(s[8]=t("h2",{id:"Basic-features",tabindex:"-1"},[a("Basic features "),t("a",{class:"header-anchor",href:"#Basic-features","aria-label":'Permalink to "Basic features {#Basic-features}"'},"​")],-1)),t("details",u,[t("summary",null,[s[0]||(s[0]=t("a",{id:"QUBOConstraints.QUBO_base-learning-20_qubo_constraints",href:"#QUBOConstraints.QUBO_base-learning-20_qubo_constraints"},[t("span",{class:"jlbinding"},"QUBOConstraints.QUBO_base")],-1)),s[1]||(s[1]=a()),i(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=e('
julia
QUBO_base(n, weight = 1)

A basic QUBO matrix to ensure that binarized variables keep a valid encoding.

source

',3))]),t("details",c,[t("summary",null,[s[3]||(s[3]=t("a",{id:"QUBOConstraints.QUBO_linear_sum-learning-20_qubo_constraints",href:"#QUBOConstraints.QUBO_linear_sum-learning-20_qubo_constraints"},[t("span",{class:"jlbinding"},"QUBOConstraints.QUBO_linear_sum")],-1)),s[4]||(s[4]=a()),i(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=e('
julia
QUBO_linear_sum(n, σ)

One valid QUBO matrix given n variables and parameter σ for the linear sum constraint.

source

',3))])])}const C=o(p,[["render",b]]);export{O as __pageData,C as default}; diff --git a/dev/assets/learning_20_qubo_constraints.md.DfeUpk7q.lean.js b/dev/assets/learning_20_qubo_constraints.md.DfeUpk7q.lean.js new file mode 100644 index 0000000..4a09020 --- /dev/null +++ b/dev/assets/learning_20_qubo_constraints.md.DfeUpk7q.lean.js @@ -0,0 +1 @@ +import{_ as o,c as r,j as t,a,G as i,a5 as e,B as l,o as d}from"./chunks/framework.CJakPlgM.js";const O=JSON.parse('{"title":"Introduction to QUBOConstraints.jl","description":"","frontmatter":{},"headers":[],"relativePath":"learning/20_qubo_constraints.md","filePath":"learning/20_qubo_constraints.md","lastUpdated":null}'),p={name:"learning/20_qubo_constraints.md"},u={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""};function b(h,s,g,B,k,m){const n=l("Badge");return d(),r("div",null,[s[6]||(s[6]=t("h1",{id:"Introduction-to-QUBOConstraints.jl",tabindex:"-1"},[a("Introduction to QUBOConstraints.jl "),t("a",{class:"header-anchor",href:"#Introduction-to-QUBOConstraints.jl","aria-label":'Permalink to "Introduction to QUBOConstraints.jl {#Introduction-to-QUBOConstraints.jl}"'},"​")],-1)),s[7]||(s[7]=t("p",null,[a("Introduction to "),t("code",null,"QUBOConstraints.jl"),a(".")],-1)),s[8]||(s[8]=t("h2",{id:"Basic-features",tabindex:"-1"},[a("Basic features "),t("a",{class:"header-anchor",href:"#Basic-features","aria-label":'Permalink to "Basic features {#Basic-features}"'},"​")],-1)),t("details",u,[t("summary",null,[s[0]||(s[0]=t("a",{id:"QUBOConstraints.QUBO_base-learning-20_qubo_constraints",href:"#QUBOConstraints.QUBO_base-learning-20_qubo_constraints"},[t("span",{class:"jlbinding"},"QUBOConstraints.QUBO_base")],-1)),s[1]||(s[1]=a()),i(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=e('
julia
QUBO_base(n, weight = 1)

A basic QUBO matrix to ensure that binarized variables keep a valid encoding.

source

',3))]),t("details",c,[t("summary",null,[s[3]||(s[3]=t("a",{id:"QUBOConstraints.QUBO_linear_sum-learning-20_qubo_constraints",href:"#QUBOConstraints.QUBO_linear_sum-learning-20_qubo_constraints"},[t("span",{class:"jlbinding"},"QUBOConstraints.QUBO_linear_sum")],-1)),s[4]||(s[4]=a()),i(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=e('
julia
QUBO_linear_sum(n, σ)

One valid QUBO matrix given n variables and parameter σ for the linear sum constraint.

source

',3))])])}const C=o(p,[["render",b]]);export{O as __pageData,C as default}; diff --git a/dev/assets/learning_21_qubo_encoding.md.BJsv_NTS.js b/dev/assets/learning_21_qubo_encoding.md.BJsv_NTS.js deleted file mode 100644 index 566f4df..0000000 --- a/dev/assets/learning_21_qubo_encoding.md.BJsv_NTS.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as a,o as n,a7 as s}from"./chunks/framework.CBLuZwrP.js";const k=JSON.parse('{"title":"Encoding for QUBO programs","description":"","frontmatter":{},"headers":[],"relativePath":"learning/21_qubo_encoding.md","filePath":"learning/21_qubo_encoding.md","lastUpdated":null}'),e={name:"learning/21_qubo_encoding.md"},o=s('

Encoding for QUBO programs

# QUBOConstraints.is_validFunction.
julia
is_valid(x, encoding::Symbol = :none)

Check if x has a valid format for encoding.

For instance, if encoding == :one_hot, at most one bit of x can be set to 1.

source


# QUBOConstraints.binarizeFunction.
julia
binarize(x[, domain]; binarization = :one_hot)

Binarize x following the binarization encoding. If x is a vector (instead of a number per say), domain is optional.

source


# QUBOConstraints.debinarizeFunction.
julia
debinarize(x[, domain]; binarization = :one_hot)

Transform a binary vector into a number or a set of number. If domain is not given, it will compute a default value based on binarization and x.

source


',7),t=[o];function r(d,l,c,p,h,g){return n(),a("div",null,t)}const u=i(e,[["render",r]]);export{k as __pageData,u as default}; diff --git a/dev/assets/learning_21_qubo_encoding.md.BJsv_NTS.lean.js b/dev/assets/learning_21_qubo_encoding.md.BJsv_NTS.lean.js deleted file mode 100644 index ed1bd0c..0000000 --- a/dev/assets/learning_21_qubo_encoding.md.BJsv_NTS.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as a,o as n,a7 as s}from"./chunks/framework.CBLuZwrP.js";const k=JSON.parse('{"title":"Encoding for QUBO programs","description":"","frontmatter":{},"headers":[],"relativePath":"learning/21_qubo_encoding.md","filePath":"learning/21_qubo_encoding.md","lastUpdated":null}'),e={name:"learning/21_qubo_encoding.md"},o=s("",7),t=[o];function r(d,l,c,p,h,g){return n(),a("div",null,t)}const u=i(e,[["render",r]]);export{k as __pageData,u as default}; diff --git a/dev/assets/learning_21_qubo_encoding.md.U06_V_uV.js b/dev/assets/learning_21_qubo_encoding.md.U06_V_uV.js new file mode 100644 index 0000000..0f2c703 --- /dev/null +++ b/dev/assets/learning_21_qubo_encoding.md.U06_V_uV.js @@ -0,0 +1 @@ +import{_ as t,c as r,j as n,a as s,G as e,a5 as o,B as l,o as d}from"./chunks/framework.CJakPlgM.js";const v=JSON.parse('{"title":"Encoding for QUBO programs","description":"","frontmatter":{},"headers":[],"relativePath":"learning/21_qubo_encoding.md","filePath":"learning/21_qubo_encoding.md","lastUpdated":null}'),p={name:"learning/21_qubo_encoding.md"},c={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},h={class:"jldocstring custom-block",open:""};function k(b,i,u,m,f,C){const a=l("Badge");return d(),r("div",null,[i[9]||(i[9]=n("h1",{id:"Encoding-for-QUBO-programs",tabindex:"-1"},[s("Encoding for QUBO programs "),n("a",{class:"header-anchor",href:"#Encoding-for-QUBO-programs","aria-label":'Permalink to "Encoding for QUBO programs {#Encoding-for-QUBO-programs}"'},"​")],-1)),n("details",c,[n("summary",null,[i[0]||(i[0]=n("a",{id:"QUBOConstraints.is_valid-learning-21_qubo_encoding",href:"#QUBOConstraints.is_valid-learning-21_qubo_encoding"},[n("span",{class:"jlbinding"},"QUBOConstraints.is_valid")],-1)),i[1]||(i[1]=s()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),i[2]||(i[2]=o('
julia
is_valid(x, encoding::Symbol = :none)

Check if x has a valid format for encoding.

For instance, if encoding == :one_hot, at most one bit of x can be set to 1.

source

',4))]),n("details",g,[n("summary",null,[i[3]||(i[3]=n("a",{id:"QUBOConstraints.binarize-learning-21_qubo_encoding",href:"#QUBOConstraints.binarize-learning-21_qubo_encoding"},[n("span",{class:"jlbinding"},"QUBOConstraints.binarize")],-1)),i[4]||(i[4]=s()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),i[5]||(i[5]=o('
julia
binarize(x[, domain]; binarization = :one_hot)

Binarize x following the binarization encoding. If x is a vector (instead of a number per say), domain is optional.

source

',3))]),n("details",h,[n("summary",null,[i[6]||(i[6]=n("a",{id:"QUBOConstraints.debinarize-learning-21_qubo_encoding",href:"#QUBOConstraints.debinarize-learning-21_qubo_encoding"},[n("span",{class:"jlbinding"},"QUBOConstraints.debinarize")],-1)),i[7]||(i[7]=s()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),i[8]||(i[8]=o('
julia
debinarize(x[, domain]; binarization = :one_hot)

Transform a binary vector into a number or a set of number. If domain is not given, it will compute a default value based on binarization and x.

source

',3))])])}const B=t(p,[["render",k]]);export{v as __pageData,B as default}; diff --git a/dev/assets/learning_21_qubo_encoding.md.U06_V_uV.lean.js b/dev/assets/learning_21_qubo_encoding.md.U06_V_uV.lean.js new file mode 100644 index 0000000..0f2c703 --- /dev/null +++ b/dev/assets/learning_21_qubo_encoding.md.U06_V_uV.lean.js @@ -0,0 +1 @@ +import{_ as t,c as r,j as n,a as s,G as e,a5 as o,B as l,o as d}from"./chunks/framework.CJakPlgM.js";const v=JSON.parse('{"title":"Encoding for QUBO programs","description":"","frontmatter":{},"headers":[],"relativePath":"learning/21_qubo_encoding.md","filePath":"learning/21_qubo_encoding.md","lastUpdated":null}'),p={name:"learning/21_qubo_encoding.md"},c={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},h={class:"jldocstring custom-block",open:""};function k(b,i,u,m,f,C){const a=l("Badge");return d(),r("div",null,[i[9]||(i[9]=n("h1",{id:"Encoding-for-QUBO-programs",tabindex:"-1"},[s("Encoding for QUBO programs "),n("a",{class:"header-anchor",href:"#Encoding-for-QUBO-programs","aria-label":'Permalink to "Encoding for QUBO programs {#Encoding-for-QUBO-programs}"'},"​")],-1)),n("details",c,[n("summary",null,[i[0]||(i[0]=n("a",{id:"QUBOConstraints.is_valid-learning-21_qubo_encoding",href:"#QUBOConstraints.is_valid-learning-21_qubo_encoding"},[n("span",{class:"jlbinding"},"QUBOConstraints.is_valid")],-1)),i[1]||(i[1]=s()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),i[2]||(i[2]=o('
julia
is_valid(x, encoding::Symbol = :none)

Check if x has a valid format for encoding.

For instance, if encoding == :one_hot, at most one bit of x can be set to 1.

source

',4))]),n("details",g,[n("summary",null,[i[3]||(i[3]=n("a",{id:"QUBOConstraints.binarize-learning-21_qubo_encoding",href:"#QUBOConstraints.binarize-learning-21_qubo_encoding"},[n("span",{class:"jlbinding"},"QUBOConstraints.binarize")],-1)),i[4]||(i[4]=s()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),i[5]||(i[5]=o('
julia
binarize(x[, domain]; binarization = :one_hot)

Binarize x following the binarization encoding. If x is a vector (instead of a number per say), domain is optional.

source

',3))]),n("details",h,[n("summary",null,[i[6]||(i[6]=n("a",{id:"QUBOConstraints.debinarize-learning-21_qubo_encoding",href:"#QUBOConstraints.debinarize-learning-21_qubo_encoding"},[n("span",{class:"jlbinding"},"QUBOConstraints.debinarize")],-1)),i[7]||(i[7]=s()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),i[8]||(i[8]=o('
julia
debinarize(x[, domain]; binarization = :one_hot)

Transform a binary vector into a number or a set of number. If domain is not given, it will compute a default value based on binarization and x.

source

',3))])])}const B=t(p,[["render",k]]);export{v as __pageData,B as default}; diff --git a/dev/assets/learning_22_qubo_learning.md.B6T5AI0c.lean.js b/dev/assets/learning_22_qubo_learning.md.B6T5AI0c.lean.js deleted file mode 100644 index d67b6c4..0000000 --- a/dev/assets/learning_22_qubo_learning.md.B6T5AI0c.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const F=JSON.parse('{"title":"Learning QUBO matrices","description":"","frontmatter":{},"headers":[],"relativePath":"learning/22_qubo_learning.md","filePath":"learning/22_qubo_learning.md","lastUpdated":null}'),h={name:"learning/22_qubo_learning.md"},k=n("",10),l=[k];function p(t,e,E,r,d,g){return a(),i("div",null,l)}const c=s(h,[["render",p]]);export{F as __pageData,c as default}; diff --git a/dev/assets/learning_22_qubo_learning.md.B6T5AI0c.js b/dev/assets/learning_22_qubo_learning.md.CzSOBa1N.js similarity index 89% rename from dev/assets/learning_22_qubo_learning.md.B6T5AI0c.js rename to dev/assets/learning_22_qubo_learning.md.CzSOBa1N.js index d1adfa8..b411bff 100644 --- a/dev/assets/learning_22_qubo_learning.md.B6T5AI0c.js +++ b/dev/assets/learning_22_qubo_learning.md.CzSOBa1N.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const F=JSON.parse('{"title":"Learning QUBO matrices","description":"","frontmatter":{},"headers":[],"relativePath":"learning/22_qubo_learning.md","filePath":"learning/22_qubo_learning.md","lastUpdated":null}'),h={name:"learning/22_qubo_learning.md"},k=n(`

Learning QUBO matrices

Interface

# QUBOConstraints.AbstractOptimizerType.
julia
AbstractOptimizer

An abstract type (interface) used to learn QUBO matrices from constraints. Only a train method is required.

source


# QUBOConstraints.trainFunction.
julia
train(args...)

Default train method for any AbstractOptimizer.

source


Examples with various optimizers

Gradient Descent

julia
struct GradientDescentOptimizer <: QUBOConstraints.AbstractOptimizer
+import{_ as l,c as p,j as i,a,G as k,a5 as n,B as t,o as e}from"./chunks/framework.CJakPlgM.js";const B=JSON.parse('{"title":"Learning QUBO matrices","description":"","frontmatter":{},"headers":[],"relativePath":"learning/22_qubo_learning.md","filePath":"learning/22_qubo_learning.md","lastUpdated":null}'),E={name:"learning/22_qubo_learning.md"},r={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""};function g(y,s,F,c,C,o){const h=t("Badge");return e(),p("div",null,[s[6]||(s[6]=i("h1",{id:"Learning-QUBO-matrices",tabindex:"-1"},[a("Learning QUBO matrices "),i("a",{class:"header-anchor",href:"#Learning-QUBO-matrices","aria-label":'Permalink to "Learning QUBO matrices {#Learning-QUBO-matrices}"'},"​")],-1)),s[7]||(s[7]=i("h2",{id:"interface",tabindex:"-1"},[a("Interface "),i("a",{class:"header-anchor",href:"#interface","aria-label":'Permalink to "Interface"'},"​")],-1)),i("details",r,[i("summary",null,[s[0]||(s[0]=i("a",{id:"QUBOConstraints.AbstractOptimizer-learning-22_qubo_learning",href:"#QUBOConstraints.AbstractOptimizer-learning-22_qubo_learning"},[i("span",{class:"jlbinding"},"QUBOConstraints.AbstractOptimizer")],-1)),s[1]||(s[1]=a()),k(h,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=n('
julia
AbstractOptimizer

An abstract type (interface) used to learn QUBO matrices from constraints. Only a train method is required.

source

',3))]),i("details",d,[i("summary",null,[s[3]||(s[3]=i("a",{id:"QUBOConstraints.train-learning-22_qubo_learning",href:"#QUBOConstraints.train-learning-22_qubo_learning"},[i("span",{class:"jlbinding"},"QUBOConstraints.train")],-1)),s[4]||(s[4]=a()),k(h,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=n('
julia
train(args...)

Default train method for any AbstractOptimizer.

source

',3))]),s[8]||(s[8]=n(`

Examples with various optimizers

Gradient Descent

julia
struct GradientDescentOptimizer <: QUBOConstraints.AbstractOptimizer
     binarization::Symbol
     η::Float64
     precision::Int
@@ -116,4 +116,4 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const F
     X_test = X,
 )
     return train(X, penalty, to_domains(X, dom_stuff); optimizer, X_test)
-end
`,10),l=[k];function p(t,e,E,r,d,g){return a(),i("div",null,l)}const c=s(h,[["render",p]]);export{F as __pageData,c as default}; +end
`,4))])}const A=l(E,[["render",g]]);export{B as __pageData,A as default}; diff --git a/dev/assets/learning_22_qubo_learning.md.CzSOBa1N.lean.js b/dev/assets/learning_22_qubo_learning.md.CzSOBa1N.lean.js new file mode 100644 index 0000000..b411bff --- /dev/null +++ b/dev/assets/learning_22_qubo_learning.md.CzSOBa1N.lean.js @@ -0,0 +1,119 @@ +import{_ as l,c as p,j as i,a,G as k,a5 as n,B as t,o as e}from"./chunks/framework.CJakPlgM.js";const B=JSON.parse('{"title":"Learning QUBO matrices","description":"","frontmatter":{},"headers":[],"relativePath":"learning/22_qubo_learning.md","filePath":"learning/22_qubo_learning.md","lastUpdated":null}'),E={name:"learning/22_qubo_learning.md"},r={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""};function g(y,s,F,c,C,o){const h=t("Badge");return e(),p("div",null,[s[6]||(s[6]=i("h1",{id:"Learning-QUBO-matrices",tabindex:"-1"},[a("Learning QUBO matrices "),i("a",{class:"header-anchor",href:"#Learning-QUBO-matrices","aria-label":'Permalink to "Learning QUBO matrices {#Learning-QUBO-matrices}"'},"​")],-1)),s[7]||(s[7]=i("h2",{id:"interface",tabindex:"-1"},[a("Interface "),i("a",{class:"header-anchor",href:"#interface","aria-label":'Permalink to "Interface"'},"​")],-1)),i("details",r,[i("summary",null,[s[0]||(s[0]=i("a",{id:"QUBOConstraints.AbstractOptimizer-learning-22_qubo_learning",href:"#QUBOConstraints.AbstractOptimizer-learning-22_qubo_learning"},[i("span",{class:"jlbinding"},"QUBOConstraints.AbstractOptimizer")],-1)),s[1]||(s[1]=a()),k(h,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=n('
julia
AbstractOptimizer

An abstract type (interface) used to learn QUBO matrices from constraints. Only a train method is required.

source

',3))]),i("details",d,[i("summary",null,[s[3]||(s[3]=i("a",{id:"QUBOConstraints.train-learning-22_qubo_learning",href:"#QUBOConstraints.train-learning-22_qubo_learning"},[i("span",{class:"jlbinding"},"QUBOConstraints.train")],-1)),s[4]||(s[4]=a()),k(h,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=n('
julia
train(args...)

Default train method for any AbstractOptimizer.

source

',3))]),s[8]||(s[8]=n(`

Examples with various optimizers

Gradient Descent

julia
struct GradientDescentOptimizer <: QUBOConstraints.AbstractOptimizer
+    binarization::Symbol
+    η::Float64
+    precision::Int
+    oversampling::Bool
+end
+
+function GradientDescentOptimizer(;
+    binarization = :one_hot,
+    η = .001,
+    precision = 5,
+    oversampling = false,
+)
+    return GradientDescentOptimizer(binarization, η, precision, oversampling)
+end
+
+
+predict(x, Q) = transpose(x) * Q * x
+
+loss(x, y, Q) = (predict(x, Q) .-y).^2
+
+function make_df(X, Q, penalty, binarization, domains)
+    df = DataFrame()
+    for (i,x) in enumerate(X)
+        if i == 1
+            df = DataFrame(transpose(x), :auto)
+        else
+            push!(df, transpose(x))
+        end
+    end
+
+    dim = length(df[1,:])
+
+    if binarization == :none
+        df[!,:penalty] = map(r -> penalty(Vector(r)), eachrow(df))
+        df[!,:predict] = map(r -> predict(Vector(r), Q), eachrow(df[:, 1:dim]))
+    else
+        df[!,:penalty] = map(
+            r -> penalty(binarize(Vector(r), domains; binarization)),
+            eachrow(df)
+        )
+        df[!,:predict] = map(
+            r -> predict(binarize(Vector(r), domains; binarization), Q),
+            eachrow(df[:, 1:dim])
+        )
+    end
+
+    min_false = minimum(
+        filter(:penalty => >(minimum(df[:,:penalty])), df)[:,:predict];
+        init = typemax(Int)
+    )
+    df[!,:shifted] = df[:,:predict] .- min_false
+    df[!,:accurate] = df[:, :penalty] .* df[:,:shifted] .≥ 0.
+
+    return df
+end
+
+function preliminaries(X, domains, binarization)
+    if binarization==:none
+        n = length(first(X))
+        return X, zeros(n,n)
+    else
+        Y = map(x -> collect(binarize(x, domains; binarization)), X)
+        n = length(first(Y))
+        return Y, zeros(n,n)
+    end
+end
+
+function preliminaries(X, _)
+    n = length(first(X))
+    return X, zeros(n,n)
+end
+
+function train!(Q, X, penalty, η, precision, X_test, oversampling, binarization, domains)
+    θ = params(Q)
+    try
+        penalty(first(X))
+    catch e
+        if isa(e, UndefKeywordError)
+            penalty = (x; dom_size = δ_extrema(Iterators.flatten(X)))-> penalty(x; dom_size)
+        else
+            throw(e)
+        end
+    end
+    for x in (oversampling ? oversample(X, penalty) : X)
+        grads = gradient(() -> loss(x, penalty(x), Q), θ)
+        Q .-= η * grads[Q]
+    end
+
+    Q[:,:] = round.(precision*Q)
+
+    df = make_df(X_test, Q, penalty, binarization, domains)
+    return pretty_table(describe(df[!, [:penalty, :predict, :shifted, :accurate]]))
+end
+
+function train(
+    X,
+    penalty,
+    domains::Vector{D};
+    optimizer = GradientDescentOptimizer(),
+    X_test = X,
+) where {D <: DiscreteDomain}
+    Y, Q = preliminaries(X, domains, optimizer.binarization)
+    train!(
+        Q, Y, penalty, optimizer.η, optimizer.precision, X_test,
+        optimizer.oversampling, optimizer.binarization, domains
+    )
+    return Q
+end
+
+function train(
+    X,
+    penalty,
+    dom_stuff = nothing;
+    optimizer = GradientDescentOptimizer(),
+    X_test = X,
+)
+    return train(X, penalty, to_domains(X, dom_stuff); optimizer, X_test)
+end
`,4))])}const A=l(E,[["render",g]]);export{B as __pageData,A as default}; diff --git a/dev/assets/learning_30_constraints_translator.md.Ci6ltlI6.js b/dev/assets/learning_30_constraints_translator.md.Ci6ltlI6.js deleted file mode 100644 index e260798..0000000 --- a/dev/assets/learning_30_constraints_translator.md.Ci6ltlI6.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as n,c as s,o as r,j as t,a}from"./chunks/framework.CBLuZwrP.js";const T=JSON.parse('{"title":"ConstraintsTranslator.jl","description":"","frontmatter":{},"headers":[],"relativePath":"learning/30_constraints_translator.md","filePath":"learning/30_constraints_translator.md","lastUpdated":null}'),o={name:"learning/30_constraints_translator.md"},e=t("h1",{id:"constraintstranslator-jl",tabindex:"-1"},[a("ConstraintsTranslator.jl "),t("a",{class:"header-anchor",href:"#constraintstranslator-jl","aria-label":'Permalink to "ConstraintsTranslator.jl"'},"​")],-1),l=t("p",null,[a("Documentation for "),t("code",null,"ConstraintsTranslator.jl"),a(".")],-1),c=t("p",null,[a("")],-1),i=[e,l,c];function _(d,p,u,h,m,f){return r(),s("div",null,i)}const x=n(o,[["render",_]]);export{T as __pageData,x as default}; diff --git a/dev/assets/learning_30_constraints_translator.md.Ci6ltlI6.lean.js b/dev/assets/learning_30_constraints_translator.md.Ci6ltlI6.lean.js deleted file mode 100644 index e260798..0000000 --- a/dev/assets/learning_30_constraints_translator.md.Ci6ltlI6.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as n,c as s,o as r,j as t,a}from"./chunks/framework.CBLuZwrP.js";const T=JSON.parse('{"title":"ConstraintsTranslator.jl","description":"","frontmatter":{},"headers":[],"relativePath":"learning/30_constraints_translator.md","filePath":"learning/30_constraints_translator.md","lastUpdated":null}'),o={name:"learning/30_constraints_translator.md"},e=t("h1",{id:"constraintstranslator-jl",tabindex:"-1"},[a("ConstraintsTranslator.jl "),t("a",{class:"header-anchor",href:"#constraintstranslator-jl","aria-label":'Permalink to "ConstraintsTranslator.jl"'},"​")],-1),l=t("p",null,[a("Documentation for "),t("code",null,"ConstraintsTranslator.jl"),a(".")],-1),c=t("p",null,[a("")],-1),i=[e,l,c];function _(d,p,u,h,m,f){return r(),s("div",null,i)}const x=n(o,[["render",_]]);export{T as __pageData,x as default}; diff --git a/dev/assets/learning_30_constraints_translator.md.Cp55uYEB.js b/dev/assets/learning_30_constraints_translator.md.Cp55uYEB.js new file mode 100644 index 0000000..5e3f987 --- /dev/null +++ b/dev/assets/learning_30_constraints_translator.md.Cp55uYEB.js @@ -0,0 +1 @@ +import{_ as r,c as s,j as t,a,o}from"./chunks/framework.CJakPlgM.js";const m=JSON.parse('{"title":"ConstraintsTranslator.jl","description":"","frontmatter":{},"headers":[],"relativePath":"learning/30_constraints_translator.md","filePath":"learning/30_constraints_translator.md","lastUpdated":null}'),e={name:"learning/30_constraints_translator.md"};function l(i,n,c,d,_,p){return o(),s("div",null,n[0]||(n[0]=[t("h1",{id:"constraintstranslator-jl",tabindex:"-1"},[a("ConstraintsTranslator.jl "),t("a",{class:"header-anchor",href:"#constraintstranslator-jl","aria-label":'Permalink to "ConstraintsTranslator.jl"'},"​")],-1),t("p",null,[a("Documentation for "),t("code",null,"ConstraintsTranslator.jl"),a(".")],-1),t("p",null,[a("")],-1)]))}const f=r(e,[["render",l]]);export{m as __pageData,f as default}; diff --git a/dev/assets/learning_30_constraints_translator.md.Cp55uYEB.lean.js b/dev/assets/learning_30_constraints_translator.md.Cp55uYEB.lean.js new file mode 100644 index 0000000..5e3f987 --- /dev/null +++ b/dev/assets/learning_30_constraints_translator.md.Cp55uYEB.lean.js @@ -0,0 +1 @@ +import{_ as r,c as s,j as t,a,o}from"./chunks/framework.CJakPlgM.js";const m=JSON.parse('{"title":"ConstraintsTranslator.jl","description":"","frontmatter":{},"headers":[],"relativePath":"learning/30_constraints_translator.md","filePath":"learning/30_constraints_translator.md","lastUpdated":null}'),e={name:"learning/30_constraints_translator.md"};function l(i,n,c,d,_,p){return o(),s("div",null,n[0]||(n[0]=[t("h1",{id:"constraintstranslator-jl",tabindex:"-1"},[a("ConstraintsTranslator.jl "),t("a",{class:"header-anchor",href:"#constraintstranslator-jl","aria-label":'Permalink to "ConstraintsTranslator.jl"'},"​")],-1),t("p",null,[a("Documentation for "),t("code",null,"ConstraintsTranslator.jl"),a(".")],-1),t("p",null,[a("")],-1)]))}const f=r(e,[["render",l]]);export{m as __pageData,f as default}; diff --git a/dev/assets/learning_90_constraint_learning.md.BK3d3pi7.js b/dev/assets/learning_90_constraint_learning.md.BK3d3pi7.js deleted file mode 100644 index 395a03c..0000000 --- a/dev/assets/learning_90_constraint_learning.md.BK3d3pi7.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as s,o as a,a7 as e}from"./chunks/framework.CBLuZwrP.js";const b=JSON.parse('{"title":"ConstraintLearning.jl","description":"","frontmatter":{},"headers":[],"relativePath":"learning/90_constraint_learning.md","filePath":"learning/90_constraint_learning.md","lastUpdated":null}'),t={name:"learning/90_constraint_learning.md"},n=e('

ConstraintLearning.jl

Documentation for ConstraintLearning.jl.

# ConstraintLearning.ICNConfigType.
julia
struct ICNConfig{O <: ICNOptimizer}

A structure to hold the metric and optimizer configurations used in learning the weights of an ICN.

source


# ConstraintLearning.ICNConfigMethod.
julia
ICNConfig(; metric = :hamming, optimizer = ICNGeneticOptimizer())

Constructor for ICNConfig. Defaults to hamming metric using a genetic algorithm.

source


# ConstraintLearning.ICNGeneticOptimizerMethod.
julia
ICNGeneticOptimizer(; kargs...)

Default constructor to learn an ICN through a Genetic Algorithm. Default kargs TBW.

source


# ConstraintLearning.ICNLocalSearchOptimizerType.
julia
ICNLocalSearchOptimizer(options = LocalSearchSolvers.Options())

Default constructor to learn an ICN through a CBLS solver.

source


# ConstraintLearning.ICNOptimizerType.
julia
const ICNOptimizer = CompositionalNetworks.AbstractOptimizer

An abstract type for optmizers defined to learn ICNs.

source


# ConstraintLearning.QUBOGradientOptimizerMethod.
julia
QUBOGradientOptimizer(; kargs...)

A QUBO optimizer based on gradient descent. Defaults TBW

source


# ConstraintLearning.QUBOOptimizerType.
julia
const QUBOOptimizer = QUBOConstraints.AbstractOptimizer

An abstract type for optimizers used to learn QUBO matrices from constraints.

source


# CompositionalNetworks.optimize!Method.
julia
CompositionalNetworks.optimize!(icn, solutions, non_sltns, dom_size, metric, optimizer::ICNGeneticOptimizer; parameters...)

Extends the optimize! method to ICNGeneticOptimizer.

source


# CompositionalNetworks.optimize!Method.
julia
CompositionalNetworks.optimize!(icn, solutions, non_sltns, dom_size, metric, optimizer::ICNLocalSearchOptimizer; parameters...)

Extends the optimize! method to ICNLocalSearchOptimizer.

source


# ConstraintLearning._optimize!Method.
julia
_optimize!(icn, X, X_sols; metric = hamming, pop_size = 200)

Optimize and set the weights of an ICN with a given set of configuration X and solutions X_sols.

source


# ConstraintLearning.domain_sizeMethod.
julia
domain_size(ds::Number)

Extends the domain_size function when ds is number (for dispatch purposes).

source


# ConstraintLearning.generate_populationMethod.
julia
generate_population(icn, pop_size

Generate a pôpulation of weights (individuals) for the genetic algorithm weighting icn.

source


# ConstraintLearning.icnMethod.
julia
icn(X,X̅; kargs..., parameters...)

TBW

source


# ConstraintLearning.lossMethod.
julia
loss(x, y, Q)

Loss of the prediction given by Q, a training set y, and a given configuration x.

source


# ConstraintLearning.make_dfMethod.
julia
make_df(X, Q, penalty, binarization, domains)

DataFrame arrangement to output some basic evaluation of a matrix Q.

source


# ConstraintLearning.make_set_penaltyMethod.
julia
make_set_penalty(X, X̅, args...; kargs)

Return a penalty function when the training set is already split into a pair of solutions X and non solutions .

source


# ConstraintLearning.make_training_setsMethod.
julia
make_training_sets(X, penalty, args...)

Return a pair of solutions and non solutions sets based on X and penalty.

source


# ConstraintLearning.mutually_exclusiveMethod.
julia
mutually_exclusive(layer, w)

Constraint ensuring that w encode exclusive operations in layer.

source


# ConstraintLearning.no_empty_layerMethod.
julia
no_empty_layer(x; X = nothing)

Constraint ensuring that at least one operation is selected.

source


# ConstraintLearning.optimize!Method.
julia
optimize!(icn, X, X_sols, global_iter, local_iter; metric=hamming, popSize=100)

Optimize and set the weights of an ICN with a given set of configuration X and solutions X_sols. The best weights among global_iter will be set.

source


# ConstraintLearning.parameter_specific_operationsMethod.
julia
parameter_specific_operations(x; X = nothing)

Constraint ensuring that at least one operation related to parameters is selected if the error function to be learned is parametric.

source


# ConstraintLearning.predictMethod.
julia
predict(x, Q)

Return the predictions given by Q for a given configuration x.

source


# ConstraintLearning.preliminariesMethod.
julia
preliminaries(args)

Preliminaries to the training process in a QUBOGradientOptimizer run.

source


# ConstraintLearning.quboFunction.
julia
qubo(X,X̅; kargs..., parameters...)

TBW

source


# ConstraintLearning.sub_eltypeMethod.
julia
sub_eltype(X)

Return the element type of of the first element of a collection.

source


# ConstraintLearning.train!Method.
julia
train!(Q, X, penalty, η, precision, X_test, oversampling, binarization, domains)

Training inner method.

source


# ConstraintLearning.trainMethod.
julia
train(X, penalty[, d]; optimizer = QUBOGradientOptimizer(), X_test = X)

Learn a QUBO matrix on training set X for a constraint defined by penalty with optional domain information d. By default, it uses a QUBOGradientOptimizer and X as a testing set.

source


# ConstraintLearning.δMethod.
julia
δ(X[, Y]; discrete = true)

Compute the extrema over a collection X``or a pair of collection(X, Y)`.

source


',58),r=[n];function l(o,p,d,h,c,g){return a(),s("div",null,r)}const u=i(t,[["render",l]]);export{b as __pageData,u as default}; diff --git a/dev/assets/learning_90_constraint_learning.md.BK3d3pi7.lean.js b/dev/assets/learning_90_constraint_learning.md.BK3d3pi7.lean.js deleted file mode 100644 index 4fc8a6a..0000000 --- a/dev/assets/learning_90_constraint_learning.md.BK3d3pi7.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as s,o as a,a7 as e}from"./chunks/framework.CBLuZwrP.js";const b=JSON.parse('{"title":"ConstraintLearning.jl","description":"","frontmatter":{},"headers":[],"relativePath":"learning/90_constraint_learning.md","filePath":"learning/90_constraint_learning.md","lastUpdated":null}'),t={name:"learning/90_constraint_learning.md"},n=e("",58),r=[n];function l(o,p,d,h,c,g){return a(),s("div",null,r)}const u=i(t,[["render",l]]);export{b as __pageData,u as default}; diff --git a/dev/assets/learning_90_constraint_learning.md.YM6S0n3n.js b/dev/assets/learning_90_constraint_learning.md.YM6S0n3n.js new file mode 100644 index 0000000..7317fd6 --- /dev/null +++ b/dev/assets/learning_90_constraint_learning.md.YM6S0n3n.js @@ -0,0 +1 @@ +import{_ as l,c as o,j as s,a as t,G as a,a5 as e,B as r,o as p}from"./chunks/framework.CJakPlgM.js";const P=JSON.parse('{"title":"ConstraintLearning.jl","description":"","frontmatter":{},"headers":[],"relativePath":"learning/90_constraint_learning.md","filePath":"learning/90_constraint_learning.md","lastUpdated":null}'),d={name:"learning/90_constraint_learning.md"},h={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},L={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},O={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},z={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},N={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},M={class:"jldocstring custom-block",open:""},I={class:"jldocstring custom-block",open:""},X={class:"jldocstring custom-block",open:""},J={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""};function Q(G,i,U,S,q,V){const n=r("Badge");return p(),o("div",null,[i[84]||(i[84]=s("h1",{id:"constraintlearning-jl",tabindex:"-1"},[t("ConstraintLearning.jl "),s("a",{class:"header-anchor",href:"#constraintlearning-jl","aria-label":'Permalink to "ConstraintLearning.jl"'},"​")],-1)),i[85]||(i[85]=s("p",null,[t("Documentation for "),s("code",null,"ConstraintLearning.jl"),t(".")],-1)),s("details",h,[s("summary",null,[i[0]||(i[0]=s("a",{id:"ConstraintLearning.ICNConfig",href:"#ConstraintLearning.ICNConfig"},[s("span",{class:"jlbinding"},"ConstraintLearning.ICNConfig")],-1)),i[1]||(i[1]=t()),a(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),i[2]||(i[2]=e('
julia
struct ICNConfig{O <: ICNOptimizer}

A structure to hold the metric and optimizer configurations used in learning the weights of an ICN.

source

',3))]),s("details",g,[s("summary",null,[i[3]||(i[3]=s("a",{id:"ConstraintLearning.ICNConfig-Tuple{}",href:"#ConstraintLearning.ICNConfig-Tuple{}"},[s("span",{class:"jlbinding"},"ConstraintLearning.ICNConfig")],-1)),i[4]||(i[4]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[5]||(i[5]=e('
julia
ICNConfig(; metric = :hamming, optimizer = ICNGeneticOptimizer())

Constructor for ICNConfig. Defaults to hamming metric using a genetic algorithm.

source

',3))]),s("details",k,[s("summary",null,[i[6]||(i[6]=s("a",{id:"ConstraintLearning.ICNGeneticOptimizer-Tuple{}",href:"#ConstraintLearning.ICNGeneticOptimizer-Tuple{}"},[s("span",{class:"jlbinding"},"ConstraintLearning.ICNGeneticOptimizer")],-1)),i[7]||(i[7]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[8]||(i[8]=e('
julia
ICNGeneticOptimizer(; kargs...)

Default constructor to learn an ICN through a Genetic Algorithm. Default kargs TBW.

source

',3))]),s("details",u,[s("summary",null,[i[9]||(i[9]=s("a",{id:"ConstraintLearning.ICNLocalSearchOptimizer",href:"#ConstraintLearning.ICNLocalSearchOptimizer"},[s("span",{class:"jlbinding"},"ConstraintLearning.ICNLocalSearchOptimizer")],-1)),i[10]||(i[10]=t()),a(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),i[11]||(i[11]=e('
julia
ICNLocalSearchOptimizer(options = LocalSearchSolvers.Options())

Default constructor to learn an ICN through a CBLS solver.

source

',3))]),s("details",c,[s("summary",null,[i[12]||(i[12]=s("a",{id:"ConstraintLearning.ICNOptimizer",href:"#ConstraintLearning.ICNOptimizer"},[s("span",{class:"jlbinding"},"ConstraintLearning.ICNOptimizer")],-1)),i[13]||(i[13]=t()),a(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),i[14]||(i[14]=e('
julia
const ICNOptimizer = CompositionalNetworks.AbstractOptimizer

An abstract type for optmizers defined to learn ICNs.

source

',3))]),s("details",y,[s("summary",null,[i[15]||(i[15]=s("a",{id:"ConstraintLearning.QUBOGradientOptimizer-Tuple{}",href:"#ConstraintLearning.QUBOGradientOptimizer-Tuple{}"},[s("span",{class:"jlbinding"},"ConstraintLearning.QUBOGradientOptimizer")],-1)),i[16]||(i[16]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[17]||(i[17]=e('
julia
QUBOGradientOptimizer(; kargs...)

A QUBO optimizer based on gradient descent. Defaults TBW

source

',3))]),s("details",b,[s("summary",null,[i[18]||(i[18]=s("a",{id:"ConstraintLearning.QUBOOptimizer",href:"#ConstraintLearning.QUBOOptimizer"},[s("span",{class:"jlbinding"},"ConstraintLearning.QUBOOptimizer")],-1)),i[19]||(i[19]=t()),a(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),i[20]||(i[20]=e('
julia
const QUBOOptimizer = QUBOConstraints.AbstractOptimizer

An abstract type for optimizers used to learn QUBO matrices from constraints.

source

',3))]),s("details",m,[s("summary",null,[i[21]||(i[21]=s("a",{id:"CompositionalNetworks.optimize!-Tuple{Any, Any, Any, Any, Any, ICNGeneticOptimizer}",href:"#CompositionalNetworks.optimize!-Tuple{Any, Any, Any, Any, Any, ICNGeneticOptimizer}"},[s("span",{class:"jlbinding"},"CompositionalNetworks.optimize!")],-1)),i[22]||(i[22]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[23]||(i[23]=e('
julia
CompositionalNetworks.optimize!(icn, solutions, non_sltns, dom_size, metric, optimizer::ICNGeneticOptimizer; parameters...)

Extends the optimize! method to ICNGeneticOptimizer.

source

',3))]),s("details",C,[s("summary",null,[i[24]||(i[24]=s("a",{id:"CompositionalNetworks.optimize!-Tuple{Any, Any, Any, Any, Any, ICNLocalSearchOptimizer}",href:"#CompositionalNetworks.optimize!-Tuple{Any, Any, Any, Any, Any, ICNLocalSearchOptimizer}"},[s("span",{class:"jlbinding"},"CompositionalNetworks.optimize!")],-1)),i[25]||(i[25]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[26]||(i[26]=e('
julia
CompositionalNetworks.optimize!(icn, solutions, non_sltns, dom_size, metric, optimizer::ICNLocalSearchOptimizer; parameters...)

Extends the optimize! method to ICNLocalSearchOptimizer.

source

',3))]),s("details",j,[s("summary",null,[i[27]||(i[27]=s("a",{id:"ConstraintLearning._optimize!-NTuple{7, Any}",href:"#ConstraintLearning._optimize!-NTuple{7, Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning._optimize!")],-1)),i[28]||(i[28]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[29]||(i[29]=e('
julia
_optimize!(icn, X, X_sols; metric = hamming, pop_size = 200)

Optimize and set the weights of an ICN with a given set of configuration X and solutions X_sols.

source

',3))]),s("details",E,[s("summary",null,[i[30]||(i[30]=s("a",{id:"ConstraintLearning.domain_size-Tuple{Number}",href:"#ConstraintLearning.domain_size-Tuple{Number}"},[s("span",{class:"jlbinding"},"ConstraintLearning.domain_size")],-1)),i[31]||(i[31]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[32]||(i[32]=e('
julia
domain_size(ds::Number)

Extends the domain_size function when ds is number (for dispatch purposes).

source

',3))]),s("details",v,[s("summary",null,[i[33]||(i[33]=s("a",{id:"ConstraintLearning.generate_population-Tuple{Any, Any}",href:"#ConstraintLearning.generate_population-Tuple{Any, Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.generate_population")],-1)),i[34]||(i[34]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[35]||(i[35]=e('
julia
generate_population(icn, pop_size

Generate a pôpulation of weights (individuals) for the genetic algorithm weighting icn.

source

',3))]),s("details",f,[s("summary",null,[i[36]||(i[36]=s("a",{id:"ConstraintLearning.icn-Tuple{Any, Any}",href:"#ConstraintLearning.icn-Tuple{Any, Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.icn")],-1)),i[37]||(i[37]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[38]||(i[38]=e('
julia
icn(X,X̅; kargs..., parameters...)

TBW

source

',3))]),s("details",L,[s("summary",null,[i[39]||(i[39]=s("a",{id:"ConstraintLearning.loss-Tuple{Any, Any, Any}",href:"#ConstraintLearning.loss-Tuple{Any, Any, Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.loss")],-1)),i[40]||(i[40]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[41]||(i[41]=e('
julia
loss(x, y, Q)

Loss of the prediction given by Q, a training set y, and a given configuration x.

source

',3))]),s("details",A,[s("summary",null,[i[42]||(i[42]=s("a",{id:"ConstraintLearning.make_df-NTuple{5, Any}",href:"#ConstraintLearning.make_df-NTuple{5, Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.make_df")],-1)),i[43]||(i[43]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[44]||(i[44]=e('
julia
make_df(X, Q, penalty, binarization, domains)

DataFrame arrangement to output some basic evaluation of a matrix Q.

source

',3))]),s("details",F,[s("summary",null,[i[45]||(i[45]=s("a",{id:"ConstraintLearning.make_set_penalty-Tuple{Any, Any}",href:"#ConstraintLearning.make_set_penalty-Tuple{Any, Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.make_set_penalty")],-1)),i[46]||(i[46]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[47]||(i[47]=e('
julia
make_set_penalty(X, X̅, args...; kargs)

Return a penalty function when the training set is already split into a pair of solutions X and non solutions .

source

',3))]),s("details",T,[s("summary",null,[i[48]||(i[48]=s("a",{id:"ConstraintLearning.make_training_sets-NTuple{4, Any}",href:"#ConstraintLearning.make_training_sets-NTuple{4, Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.make_training_sets")],-1)),i[49]||(i[49]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[50]||(i[50]=e('
julia
make_training_sets(X, penalty, args...)

Return a pair of solutions and non solutions sets based on X and penalty.

source

',3))]),s("details",O,[s("summary",null,[i[51]||(i[51]=s("a",{id:"ConstraintLearning.mutually_exclusive-Tuple{Any, Any}",href:"#ConstraintLearning.mutually_exclusive-Tuple{Any, Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.mutually_exclusive")],-1)),i[52]||(i[52]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[53]||(i[53]=e('
julia
mutually_exclusive(layer, w)

Constraint ensuring that w encode exclusive operations in layer.

source

',3))]),s("details",x,[s("summary",null,[i[54]||(i[54]=s("a",{id:"ConstraintLearning.no_empty_layer-Tuple{Any}",href:"#ConstraintLearning.no_empty_layer-Tuple{Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.no_empty_layer")],-1)),i[55]||(i[55]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[56]||(i[56]=e('
julia
no_empty_layer(x; X = nothing)

Constraint ensuring that at least one operation is selected.

source

',3))]),s("details",z,[s("summary",null,[i[57]||(i[57]=s("a",{id:"ConstraintLearning.optimize!-NTuple{8, Any}",href:"#ConstraintLearning.optimize!-NTuple{8, Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.optimize!")],-1)),i[58]||(i[58]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[59]||(i[59]=e('
julia
optimize!(icn, X, X_sols, global_iter, local_iter; metric=hamming, popSize=100)

Optimize and set the weights of an ICN with a given set of configuration X and solutions X_sols. The best weights among global_iter will be set.

source

',3))]),s("details",B,[s("summary",null,[i[60]||(i[60]=s("a",{id:"ConstraintLearning.parameter_specific_operations-Tuple{Any}",href:"#ConstraintLearning.parameter_specific_operations-Tuple{Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.parameter_specific_operations")],-1)),i[61]||(i[61]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[62]||(i[62]=e('
julia
parameter_specific_operations(x; X = nothing)

Constraint ensuring that at least one operation related to parameters is selected if the error function to be learned is parametric.

source

',3))]),s("details",N,[s("summary",null,[i[63]||(i[63]=s("a",{id:"ConstraintLearning.predict-Tuple{Any, Any}",href:"#ConstraintLearning.predict-Tuple{Any, Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.predict")],-1)),i[64]||(i[64]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[65]||(i[65]=e('
julia
predict(x, Q)

Return the predictions given by Q for a given configuration x.

source

',3))]),s("details",D,[s("summary",null,[i[66]||(i[66]=s("a",{id:"ConstraintLearning.preliminaries-Tuple{Any, Any, Any}",href:"#ConstraintLearning.preliminaries-Tuple{Any, Any, Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.preliminaries")],-1)),i[67]||(i[67]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[68]||(i[68]=e('
julia
preliminaries(args)

Preliminaries to the training process in a QUBOGradientOptimizer run.

source

',3))]),s("details",M,[s("summary",null,[i[69]||(i[69]=s("a",{id:"ConstraintLearning.qubo",href:"#ConstraintLearning.qubo"},[s("span",{class:"jlbinding"},"ConstraintLearning.qubo")],-1)),i[70]||(i[70]=t()),a(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),i[71]||(i[71]=e('
julia
qubo(X,X̅; kargs..., parameters...)

TBW

source

',3))]),s("details",I,[s("summary",null,[i[72]||(i[72]=s("a",{id:"ConstraintLearning.sub_eltype-Tuple{Any}",href:"#ConstraintLearning.sub_eltype-Tuple{Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.sub_eltype")],-1)),i[73]||(i[73]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[74]||(i[74]=e('
julia
sub_eltype(X)

Return the element type of of the first element of a collection.

source

',3))]),s("details",X,[s("summary",null,[i[75]||(i[75]=s("a",{id:"ConstraintLearning.train!-NTuple{9, Any}",href:"#ConstraintLearning.train!-NTuple{9, Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.train!")],-1)),i[76]||(i[76]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[77]||(i[77]=e('
julia
train!(Q, X, penalty, η, precision, X_test, oversampling, binarization, domains)

Training inner method.

source

',3))]),s("details",J,[s("summary",null,[i[78]||(i[78]=s("a",{id:"ConstraintLearning.train-Union{Tuple{D}, Tuple{Any, Any, Vector{D}}} where D<:DiscreteDomain",href:"#ConstraintLearning.train-Union{Tuple{D}, Tuple{Any, Any, Vector{D}}} where D<:DiscreteDomain"},[s("span",{class:"jlbinding"},"ConstraintLearning.train")],-1)),i[79]||(i[79]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[80]||(i[80]=e('
julia
train(X, penalty[, d]; optimizer = QUBOGradientOptimizer(), X_test = X)

Learn a QUBO matrix on training set X for a constraint defined by penalty with optional domain information d. By default, it uses a QUBOGradientOptimizer and X as a testing set.

source

',3))]),s("details",w,[s("summary",null,[i[81]||(i[81]=s("a",{id:"ConstraintLearning.δ-Tuple{Any}",href:"#ConstraintLearning.δ-Tuple{Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.δ")],-1)),i[82]||(i[82]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[83]||(i[83]=e('
julia
δ(X[, Y]; discrete = true)

Compute the extrema over a collection X``or a pair of collection(X, Y)`.

source

',3))])])}const R=l(d,[["render",Q]]);export{P as __pageData,R as default}; diff --git a/dev/assets/learning_90_constraint_learning.md.YM6S0n3n.lean.js b/dev/assets/learning_90_constraint_learning.md.YM6S0n3n.lean.js new file mode 100644 index 0000000..7317fd6 --- /dev/null +++ b/dev/assets/learning_90_constraint_learning.md.YM6S0n3n.lean.js @@ -0,0 +1 @@ +import{_ as l,c as o,j as s,a as t,G as a,a5 as e,B as r,o as p}from"./chunks/framework.CJakPlgM.js";const P=JSON.parse('{"title":"ConstraintLearning.jl","description":"","frontmatter":{},"headers":[],"relativePath":"learning/90_constraint_learning.md","filePath":"learning/90_constraint_learning.md","lastUpdated":null}'),d={name:"learning/90_constraint_learning.md"},h={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},L={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},O={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},z={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},N={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},M={class:"jldocstring custom-block",open:""},I={class:"jldocstring custom-block",open:""},X={class:"jldocstring custom-block",open:""},J={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""};function Q(G,i,U,S,q,V){const n=r("Badge");return p(),o("div",null,[i[84]||(i[84]=s("h1",{id:"constraintlearning-jl",tabindex:"-1"},[t("ConstraintLearning.jl "),s("a",{class:"header-anchor",href:"#constraintlearning-jl","aria-label":'Permalink to "ConstraintLearning.jl"'},"​")],-1)),i[85]||(i[85]=s("p",null,[t("Documentation for "),s("code",null,"ConstraintLearning.jl"),t(".")],-1)),s("details",h,[s("summary",null,[i[0]||(i[0]=s("a",{id:"ConstraintLearning.ICNConfig",href:"#ConstraintLearning.ICNConfig"},[s("span",{class:"jlbinding"},"ConstraintLearning.ICNConfig")],-1)),i[1]||(i[1]=t()),a(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),i[2]||(i[2]=e('
julia
struct ICNConfig{O <: ICNOptimizer}

A structure to hold the metric and optimizer configurations used in learning the weights of an ICN.

source

',3))]),s("details",g,[s("summary",null,[i[3]||(i[3]=s("a",{id:"ConstraintLearning.ICNConfig-Tuple{}",href:"#ConstraintLearning.ICNConfig-Tuple{}"},[s("span",{class:"jlbinding"},"ConstraintLearning.ICNConfig")],-1)),i[4]||(i[4]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[5]||(i[5]=e('
julia
ICNConfig(; metric = :hamming, optimizer = ICNGeneticOptimizer())

Constructor for ICNConfig. Defaults to hamming metric using a genetic algorithm.

source

',3))]),s("details",k,[s("summary",null,[i[6]||(i[6]=s("a",{id:"ConstraintLearning.ICNGeneticOptimizer-Tuple{}",href:"#ConstraintLearning.ICNGeneticOptimizer-Tuple{}"},[s("span",{class:"jlbinding"},"ConstraintLearning.ICNGeneticOptimizer")],-1)),i[7]||(i[7]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[8]||(i[8]=e('
julia
ICNGeneticOptimizer(; kargs...)

Default constructor to learn an ICN through a Genetic Algorithm. Default kargs TBW.

source

',3))]),s("details",u,[s("summary",null,[i[9]||(i[9]=s("a",{id:"ConstraintLearning.ICNLocalSearchOptimizer",href:"#ConstraintLearning.ICNLocalSearchOptimizer"},[s("span",{class:"jlbinding"},"ConstraintLearning.ICNLocalSearchOptimizer")],-1)),i[10]||(i[10]=t()),a(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),i[11]||(i[11]=e('
julia
ICNLocalSearchOptimizer(options = LocalSearchSolvers.Options())

Default constructor to learn an ICN through a CBLS solver.

source

',3))]),s("details",c,[s("summary",null,[i[12]||(i[12]=s("a",{id:"ConstraintLearning.ICNOptimizer",href:"#ConstraintLearning.ICNOptimizer"},[s("span",{class:"jlbinding"},"ConstraintLearning.ICNOptimizer")],-1)),i[13]||(i[13]=t()),a(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),i[14]||(i[14]=e('
julia
const ICNOptimizer = CompositionalNetworks.AbstractOptimizer

An abstract type for optmizers defined to learn ICNs.

source

',3))]),s("details",y,[s("summary",null,[i[15]||(i[15]=s("a",{id:"ConstraintLearning.QUBOGradientOptimizer-Tuple{}",href:"#ConstraintLearning.QUBOGradientOptimizer-Tuple{}"},[s("span",{class:"jlbinding"},"ConstraintLearning.QUBOGradientOptimizer")],-1)),i[16]||(i[16]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[17]||(i[17]=e('
julia
QUBOGradientOptimizer(; kargs...)

A QUBO optimizer based on gradient descent. Defaults TBW

source

',3))]),s("details",b,[s("summary",null,[i[18]||(i[18]=s("a",{id:"ConstraintLearning.QUBOOptimizer",href:"#ConstraintLearning.QUBOOptimizer"},[s("span",{class:"jlbinding"},"ConstraintLearning.QUBOOptimizer")],-1)),i[19]||(i[19]=t()),a(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),i[20]||(i[20]=e('
julia
const QUBOOptimizer = QUBOConstraints.AbstractOptimizer

An abstract type for optimizers used to learn QUBO matrices from constraints.

source

',3))]),s("details",m,[s("summary",null,[i[21]||(i[21]=s("a",{id:"CompositionalNetworks.optimize!-Tuple{Any, Any, Any, Any, Any, ICNGeneticOptimizer}",href:"#CompositionalNetworks.optimize!-Tuple{Any, Any, Any, Any, Any, ICNGeneticOptimizer}"},[s("span",{class:"jlbinding"},"CompositionalNetworks.optimize!")],-1)),i[22]||(i[22]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[23]||(i[23]=e('
julia
CompositionalNetworks.optimize!(icn, solutions, non_sltns, dom_size, metric, optimizer::ICNGeneticOptimizer; parameters...)

Extends the optimize! method to ICNGeneticOptimizer.

source

',3))]),s("details",C,[s("summary",null,[i[24]||(i[24]=s("a",{id:"CompositionalNetworks.optimize!-Tuple{Any, Any, Any, Any, Any, ICNLocalSearchOptimizer}",href:"#CompositionalNetworks.optimize!-Tuple{Any, Any, Any, Any, Any, ICNLocalSearchOptimizer}"},[s("span",{class:"jlbinding"},"CompositionalNetworks.optimize!")],-1)),i[25]||(i[25]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[26]||(i[26]=e('
julia
CompositionalNetworks.optimize!(icn, solutions, non_sltns, dom_size, metric, optimizer::ICNLocalSearchOptimizer; parameters...)

Extends the optimize! method to ICNLocalSearchOptimizer.

source

',3))]),s("details",j,[s("summary",null,[i[27]||(i[27]=s("a",{id:"ConstraintLearning._optimize!-NTuple{7, Any}",href:"#ConstraintLearning._optimize!-NTuple{7, Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning._optimize!")],-1)),i[28]||(i[28]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[29]||(i[29]=e('
julia
_optimize!(icn, X, X_sols; metric = hamming, pop_size = 200)

Optimize and set the weights of an ICN with a given set of configuration X and solutions X_sols.

source

',3))]),s("details",E,[s("summary",null,[i[30]||(i[30]=s("a",{id:"ConstraintLearning.domain_size-Tuple{Number}",href:"#ConstraintLearning.domain_size-Tuple{Number}"},[s("span",{class:"jlbinding"},"ConstraintLearning.domain_size")],-1)),i[31]||(i[31]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[32]||(i[32]=e('
julia
domain_size(ds::Number)

Extends the domain_size function when ds is number (for dispatch purposes).

source

',3))]),s("details",v,[s("summary",null,[i[33]||(i[33]=s("a",{id:"ConstraintLearning.generate_population-Tuple{Any, Any}",href:"#ConstraintLearning.generate_population-Tuple{Any, Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.generate_population")],-1)),i[34]||(i[34]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[35]||(i[35]=e('
julia
generate_population(icn, pop_size

Generate a pôpulation of weights (individuals) for the genetic algorithm weighting icn.

source

',3))]),s("details",f,[s("summary",null,[i[36]||(i[36]=s("a",{id:"ConstraintLearning.icn-Tuple{Any, Any}",href:"#ConstraintLearning.icn-Tuple{Any, Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.icn")],-1)),i[37]||(i[37]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[38]||(i[38]=e('
julia
icn(X,X̅; kargs..., parameters...)

TBW

source

',3))]),s("details",L,[s("summary",null,[i[39]||(i[39]=s("a",{id:"ConstraintLearning.loss-Tuple{Any, Any, Any}",href:"#ConstraintLearning.loss-Tuple{Any, Any, Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.loss")],-1)),i[40]||(i[40]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[41]||(i[41]=e('
julia
loss(x, y, Q)

Loss of the prediction given by Q, a training set y, and a given configuration x.

source

',3))]),s("details",A,[s("summary",null,[i[42]||(i[42]=s("a",{id:"ConstraintLearning.make_df-NTuple{5, Any}",href:"#ConstraintLearning.make_df-NTuple{5, Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.make_df")],-1)),i[43]||(i[43]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[44]||(i[44]=e('
julia
make_df(X, Q, penalty, binarization, domains)

DataFrame arrangement to output some basic evaluation of a matrix Q.

source

',3))]),s("details",F,[s("summary",null,[i[45]||(i[45]=s("a",{id:"ConstraintLearning.make_set_penalty-Tuple{Any, Any}",href:"#ConstraintLearning.make_set_penalty-Tuple{Any, Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.make_set_penalty")],-1)),i[46]||(i[46]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[47]||(i[47]=e('
julia
make_set_penalty(X, X̅, args...; kargs)

Return a penalty function when the training set is already split into a pair of solutions X and non solutions .

source

',3))]),s("details",T,[s("summary",null,[i[48]||(i[48]=s("a",{id:"ConstraintLearning.make_training_sets-NTuple{4, Any}",href:"#ConstraintLearning.make_training_sets-NTuple{4, Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.make_training_sets")],-1)),i[49]||(i[49]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[50]||(i[50]=e('
julia
make_training_sets(X, penalty, args...)

Return a pair of solutions and non solutions sets based on X and penalty.

source

',3))]),s("details",O,[s("summary",null,[i[51]||(i[51]=s("a",{id:"ConstraintLearning.mutually_exclusive-Tuple{Any, Any}",href:"#ConstraintLearning.mutually_exclusive-Tuple{Any, Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.mutually_exclusive")],-1)),i[52]||(i[52]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[53]||(i[53]=e('
julia
mutually_exclusive(layer, w)

Constraint ensuring that w encode exclusive operations in layer.

source

',3))]),s("details",x,[s("summary",null,[i[54]||(i[54]=s("a",{id:"ConstraintLearning.no_empty_layer-Tuple{Any}",href:"#ConstraintLearning.no_empty_layer-Tuple{Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.no_empty_layer")],-1)),i[55]||(i[55]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[56]||(i[56]=e('
julia
no_empty_layer(x; X = nothing)

Constraint ensuring that at least one operation is selected.

source

',3))]),s("details",z,[s("summary",null,[i[57]||(i[57]=s("a",{id:"ConstraintLearning.optimize!-NTuple{8, Any}",href:"#ConstraintLearning.optimize!-NTuple{8, Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.optimize!")],-1)),i[58]||(i[58]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[59]||(i[59]=e('
julia
optimize!(icn, X, X_sols, global_iter, local_iter; metric=hamming, popSize=100)

Optimize and set the weights of an ICN with a given set of configuration X and solutions X_sols. The best weights among global_iter will be set.

source

',3))]),s("details",B,[s("summary",null,[i[60]||(i[60]=s("a",{id:"ConstraintLearning.parameter_specific_operations-Tuple{Any}",href:"#ConstraintLearning.parameter_specific_operations-Tuple{Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.parameter_specific_operations")],-1)),i[61]||(i[61]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[62]||(i[62]=e('
julia
parameter_specific_operations(x; X = nothing)

Constraint ensuring that at least one operation related to parameters is selected if the error function to be learned is parametric.

source

',3))]),s("details",N,[s("summary",null,[i[63]||(i[63]=s("a",{id:"ConstraintLearning.predict-Tuple{Any, Any}",href:"#ConstraintLearning.predict-Tuple{Any, Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.predict")],-1)),i[64]||(i[64]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[65]||(i[65]=e('
julia
predict(x, Q)

Return the predictions given by Q for a given configuration x.

source

',3))]),s("details",D,[s("summary",null,[i[66]||(i[66]=s("a",{id:"ConstraintLearning.preliminaries-Tuple{Any, Any, Any}",href:"#ConstraintLearning.preliminaries-Tuple{Any, Any, Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.preliminaries")],-1)),i[67]||(i[67]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[68]||(i[68]=e('
julia
preliminaries(args)

Preliminaries to the training process in a QUBOGradientOptimizer run.

source

',3))]),s("details",M,[s("summary",null,[i[69]||(i[69]=s("a",{id:"ConstraintLearning.qubo",href:"#ConstraintLearning.qubo"},[s("span",{class:"jlbinding"},"ConstraintLearning.qubo")],-1)),i[70]||(i[70]=t()),a(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),i[71]||(i[71]=e('
julia
qubo(X,X̅; kargs..., parameters...)

TBW

source

',3))]),s("details",I,[s("summary",null,[i[72]||(i[72]=s("a",{id:"ConstraintLearning.sub_eltype-Tuple{Any}",href:"#ConstraintLearning.sub_eltype-Tuple{Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.sub_eltype")],-1)),i[73]||(i[73]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[74]||(i[74]=e('
julia
sub_eltype(X)

Return the element type of of the first element of a collection.

source

',3))]),s("details",X,[s("summary",null,[i[75]||(i[75]=s("a",{id:"ConstraintLearning.train!-NTuple{9, Any}",href:"#ConstraintLearning.train!-NTuple{9, Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.train!")],-1)),i[76]||(i[76]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[77]||(i[77]=e('
julia
train!(Q, X, penalty, η, precision, X_test, oversampling, binarization, domains)

Training inner method.

source

',3))]),s("details",J,[s("summary",null,[i[78]||(i[78]=s("a",{id:"ConstraintLearning.train-Union{Tuple{D}, Tuple{Any, Any, Vector{D}}} where D<:DiscreteDomain",href:"#ConstraintLearning.train-Union{Tuple{D}, Tuple{Any, Any, Vector{D}}} where D<:DiscreteDomain"},[s("span",{class:"jlbinding"},"ConstraintLearning.train")],-1)),i[79]||(i[79]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[80]||(i[80]=e('
julia
train(X, penalty[, d]; optimizer = QUBOGradientOptimizer(), X_test = X)

Learn a QUBO matrix on training set X for a constraint defined by penalty with optional domain information d. By default, it uses a QUBOGradientOptimizer and X as a testing set.

source

',3))]),s("details",w,[s("summary",null,[i[81]||(i[81]=s("a",{id:"ConstraintLearning.δ-Tuple{Any}",href:"#ConstraintLearning.δ-Tuple{Any}"},[s("span",{class:"jlbinding"},"ConstraintLearning.δ")],-1)),i[82]||(i[82]=t()),a(n,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),i[83]||(i[83]=e('
julia
δ(X[, Y]; discrete = true)

Compute the extrema over a collection X``or a pair of collection(X, Y)`.

source

',3))])])}const R=l(d,[["render",Q]]);export{P as __pageData,R as default}; diff --git a/dev/assets/meta_00_meta_strategist.md.BI9Jm8Hx.js b/dev/assets/meta_00_meta_strategist.md.BI9Jm8Hx.js deleted file mode 100644 index 78ae4dc..0000000 --- a/dev/assets/meta_00_meta_strategist.md.BI9Jm8Hx.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as s,o as r,j as t,a as e}from"./chunks/framework.CBLuZwrP.js";const u=JSON.parse('{"title":"MetaStrategist.jl","description":"","frontmatter":{},"headers":[],"relativePath":"meta/00_meta_strategist.md","filePath":"meta/00_meta_strategist.md","lastUpdated":null}'),o={name:"meta/00_meta_strategist.md"},i=t("h1",{id:"metastrategist-jl",tabindex:"-1"},[e("MetaStrategist.jl "),t("a",{class:"header-anchor",href:"#metastrategist-jl","aria-label":'Permalink to "MetaStrategist.jl"'},"​")],-1),n=t("p",null,[e("Documentation for "),t("code",null,"MetaStrategist.jl"),e(".")],-1),l=[i,n];function _(c,d,m,p,g,h){return r(),s("div",null,l)}const j=a(o,[["render",_]]);export{u as __pageData,j as default}; diff --git a/dev/assets/meta_00_meta_strategist.md.BI9Jm8Hx.lean.js b/dev/assets/meta_00_meta_strategist.md.BI9Jm8Hx.lean.js deleted file mode 100644 index 78ae4dc..0000000 --- a/dev/assets/meta_00_meta_strategist.md.BI9Jm8Hx.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as s,o as r,j as t,a as e}from"./chunks/framework.CBLuZwrP.js";const u=JSON.parse('{"title":"MetaStrategist.jl","description":"","frontmatter":{},"headers":[],"relativePath":"meta/00_meta_strategist.md","filePath":"meta/00_meta_strategist.md","lastUpdated":null}'),o={name:"meta/00_meta_strategist.md"},i=t("h1",{id:"metastrategist-jl",tabindex:"-1"},[e("MetaStrategist.jl "),t("a",{class:"header-anchor",href:"#metastrategist-jl","aria-label":'Permalink to "MetaStrategist.jl"'},"​")],-1),n=t("p",null,[e("Documentation for "),t("code",null,"MetaStrategist.jl"),e(".")],-1),l=[i,n];function _(c,d,m,p,g,h){return r(),s("div",null,l)}const j=a(o,[["render",_]]);export{u as __pageData,j as default}; diff --git a/dev/assets/meta_00_meta_strategist.md.W36V92NX.js b/dev/assets/meta_00_meta_strategist.md.W36V92NX.js new file mode 100644 index 0000000..d5b0b0b --- /dev/null +++ b/dev/assets/meta_00_meta_strategist.md.W36V92NX.js @@ -0,0 +1 @@ +import{_ as s,c as r,j as t,a as e,o as l}from"./chunks/framework.CJakPlgM.js";const g=JSON.parse('{"title":"MetaStrategist.jl","description":"","frontmatter":{},"headers":[],"relativePath":"meta/00_meta_strategist.md","filePath":"meta/00_meta_strategist.md","lastUpdated":null}'),i={name:"meta/00_meta_strategist.md"};function o(n,a,m,d,_,c){return l(),r("div",null,a[0]||(a[0]=[t("h1",{id:"metastrategist-jl",tabindex:"-1"},[e("MetaStrategist.jl "),t("a",{class:"header-anchor",href:"#metastrategist-jl","aria-label":'Permalink to "MetaStrategist.jl"'},"​")],-1),t("p",null,[e("Documentation for "),t("code",null,"MetaStrategist.jl"),e(".")],-1)]))}const f=s(i,[["render",o]]);export{g as __pageData,f as default}; diff --git a/dev/assets/meta_00_meta_strategist.md.W36V92NX.lean.js b/dev/assets/meta_00_meta_strategist.md.W36V92NX.lean.js new file mode 100644 index 0000000..d5b0b0b --- /dev/null +++ b/dev/assets/meta_00_meta_strategist.md.W36V92NX.lean.js @@ -0,0 +1 @@ +import{_ as s,c as r,j as t,a as e,o as l}from"./chunks/framework.CJakPlgM.js";const g=JSON.parse('{"title":"MetaStrategist.jl","description":"","frontmatter":{},"headers":[],"relativePath":"meta/00_meta_strategist.md","filePath":"meta/00_meta_strategist.md","lastUpdated":null}'),i={name:"meta/00_meta_strategist.md"};function o(n,a,m,d,_,c){return l(),r("div",null,a[0]||(a[0]=[t("h1",{id:"metastrategist-jl",tabindex:"-1"},[e("MetaStrategist.jl "),t("a",{class:"header-anchor",href:"#metastrategist-jl","aria-label":'Permalink to "MetaStrategist.jl"'},"​")],-1),t("p",null,[e("Documentation for "),t("code",null,"MetaStrategist.jl"),e(".")],-1)]))}const f=s(i,[["render",o]]);export{g as __pageData,f as default}; diff --git a/dev/assets/perf_00_perf_checker.md.BZ7n51Lw.js b/dev/assets/perf_00_perf_checker.md.BMTPCZnU.js similarity index 74% rename from dev/assets/perf_00_perf_checker.md.BZ7n51Lw.js rename to dev/assets/perf_00_perf_checker.md.BMTPCZnU.js index 1fcd0aa..d550820 100644 --- a/dev/assets/perf_00_perf_checker.md.BZ7n51Lw.js +++ b/dev/assets/perf_00_perf_checker.md.BMTPCZnU.js @@ -1,4 +1,4 @@ -import{_ as e,c as s,o as i,a7 as a}from"./chunks/framework.CBLuZwrP.js";const f=JSON.parse('{"title":"PerfChecker.jl","description":"","frontmatter":{},"headers":[],"relativePath":"perf/00_perf_checker.md","filePath":"perf/00_perf_checker.md","lastUpdated":null}'),t={name:"perf/00_perf_checker.md"},n=a(`

PerfChecker.jl

PerfChecker.jl is a package designed for package authors to easily performance test their packages. To achieve that, it provides the follwing features:

  • The main macro @check, which provides an easy-to-use interface over various interfaces, configurable for various backends via a dictionary.

  • (WIP) A CI for reproducible performance testing.

  • Visualization of different metrics from @check using Makie.jl

Usage

The primary usage of PerfChecker.jl looks like this:

julia
  using PerfChecker
+import{_ as s,c as i,a5 as a,o as t}from"./chunks/framework.CJakPlgM.js";const k=JSON.parse('{"title":"PerfChecker.jl","description":"","frontmatter":{},"headers":[],"relativePath":"perf/00_perf_checker.md","filePath":"perf/00_perf_checker.md","lastUpdated":null}'),n={name:"perf/00_perf_checker.md"};function o(l,e,p,r,h,c){return t(),i("div",null,e[0]||(e[0]=[a(`

PerfChecker.jl

PerfChecker.jl is a package designed for package authors to easily performance test their packages. To achieve that, it provides the follwing features:

  • The main macro @check, which provides an easy-to-use interface over various interfaces, configurable for various backends via a dictionary.

  • (WIP) A CI for reproducible performance testing.

  • Visualization of different metrics from @check using Makie.jl

Usage

The primary usage of PerfChecker.jl looks like this:

julia
  using PerfChecker
   # optional using custom backend like BenchmarkTools, Chairmark etc 
   config = Dict(:option1 => "value1", :option2 => :value2)
   
@@ -10,4 +10,4 @@ import{_ as e,c as s,o as i,a7 as a}from"./chunks/framework.CBLuZwrP.js";const f
 
   # Visualization of the results
   using Makie
-  checkres_to_scatterlines(results)

The config dictionary can take many options, depending on the backend.

Some of the commonly used options are:

  • :PATH => The path where to the default environment of julia when creating a new process.

  • :pkgs => A list of versions to test performance for. Its defined as the Tuple, (name::String, option::Symbol, versions::Vector{VersionNumber}, last_or_first::Bool) Can be given as follows:

    • name is the name of the package.

    • option is one of the 5 symbols:

      • :patches: last patch or first patch of a version

      • :breaking: last breaking or next breaking version

      • :major: previous or next major version

      • :minor: previous or next minor version

      • :custom: custom version numbers (provide any boolean value for last_or_first in this case as it doesn't matter)

    • versions: The input for the provided option

    • last_or_first: Input for the provided option

  • :tags => A list of tags (a vector of symbols) to easily tag performance tests.

  • :devops => Giving a custom input to Pkg.develop. Intended to be used to test performance of a local development branch of a pacakge with previous versions. Often can be used as simply as :devops => "MyPackageName"

  • :threads => An integer to select the number of threads to start Julia with.

Checkout the documentation of the other backends for more default options and the default values.

`,10),o=[n];function l(p,r,h,c,d,k){return i(),s("div",null,o)}const u=e(t,[["render",l]]);export{f as __pageData,u as default}; + checkres_to_scatterlines(results)

The config dictionary can take many options, depending on the backend.

Some of the commonly used options are:

  • :PATH => The path where to the default environment of julia when creating a new process.

  • :pkgs => A list of versions to test performance for. Its defined as the Tuple, (name::String, option::Symbol, versions::Vector{VersionNumber}, last_or_first::Bool) Can be given as follows:

    • name is the name of the package.

    • option is one of the 5 symbols:

      • :patches: last patch or first patch of a version

      • :breaking: last breaking or next breaking version

      • :major: previous or next major version

      • :minor: previous or next minor version

      • :custom: custom version numbers (provide any boolean value for last_or_first in this case as it doesn't matter)

    • versions: The input for the provided option

    • last_or_first: Input for the provided option

  • :tags => A list of tags (a vector of symbols) to easily tag performance tests.

  • :devops => Giving a custom input to Pkg.develop. Intended to be used to test performance of a local development branch of a pacakge with previous versions. Often can be used as simply as :devops => "MyPackageName"

  • :threads => An integer to select the number of threads to start Julia with.

Checkout the documentation of the other backends for more default options and the default values.

`,10)]))}const g=s(n,[["render",o]]);export{k as __pageData,g as default}; diff --git a/dev/assets/perf_00_perf_checker.md.BMTPCZnU.lean.js b/dev/assets/perf_00_perf_checker.md.BMTPCZnU.lean.js new file mode 100644 index 0000000..d550820 --- /dev/null +++ b/dev/assets/perf_00_perf_checker.md.BMTPCZnU.lean.js @@ -0,0 +1,13 @@ +import{_ as s,c as i,a5 as a,o as t}from"./chunks/framework.CJakPlgM.js";const k=JSON.parse('{"title":"PerfChecker.jl","description":"","frontmatter":{},"headers":[],"relativePath":"perf/00_perf_checker.md","filePath":"perf/00_perf_checker.md","lastUpdated":null}'),n={name:"perf/00_perf_checker.md"};function o(l,e,p,r,h,c){return t(),i("div",null,e[0]||(e[0]=[a(`

PerfChecker.jl

PerfChecker.jl is a package designed for package authors to easily performance test their packages. To achieve that, it provides the follwing features:

  • The main macro @check, which provides an easy-to-use interface over various interfaces, configurable for various backends via a dictionary.

  • (WIP) A CI for reproducible performance testing.

  • Visualization of different metrics from @check using Makie.jl

Usage

The primary usage of PerfChecker.jl looks like this:

julia
  using PerfChecker
+  # optional using custom backend like BenchmarkTools, Chairmark etc 
+  config = Dict(:option1 => "value1", :option2 => :value2)
+  
+  results = @check :name_of_backend config begin
+    # preparatory code goes here
+  end begin
+    # the code block to be performance tested goes here
+  end
+
+  # Visualization of the results
+  using Makie
+  checkres_to_scatterlines(results)

The config dictionary can take many options, depending on the backend.

Some of the commonly used options are:

  • :PATH => The path where to the default environment of julia when creating a new process.

  • :pkgs => A list of versions to test performance for. Its defined as the Tuple, (name::String, option::Symbol, versions::Vector{VersionNumber}, last_or_first::Bool) Can be given as follows:

    • name is the name of the package.

    • option is one of the 5 symbols:

      • :patches: last patch or first patch of a version

      • :breaking: last breaking or next breaking version

      • :major: previous or next major version

      • :minor: previous or next minor version

      • :custom: custom version numbers (provide any boolean value for last_or_first in this case as it doesn't matter)

    • versions: The input for the provided option

    • last_or_first: Input for the provided option

  • :tags => A list of tags (a vector of symbols) to easily tag performance tests.

  • :devops => Giving a custom input to Pkg.develop. Intended to be used to test performance of a local development branch of a pacakge with previous versions. Often can be used as simply as :devops => "MyPackageName"

  • :threads => An integer to select the number of threads to start Julia with.

Checkout the documentation of the other backends for more default options and the default values.

`,10)]))}const g=s(n,[["render",o]]);export{k as __pageData,g as default}; diff --git a/dev/assets/perf_00_perf_checker.md.BZ7n51Lw.lean.js b/dev/assets/perf_00_perf_checker.md.BZ7n51Lw.lean.js deleted file mode 100644 index b60c743..0000000 --- a/dev/assets/perf_00_perf_checker.md.BZ7n51Lw.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,c as s,o as i,a7 as a}from"./chunks/framework.CBLuZwrP.js";const f=JSON.parse('{"title":"PerfChecker.jl","description":"","frontmatter":{},"headers":[],"relativePath":"perf/00_perf_checker.md","filePath":"perf/00_perf_checker.md","lastUpdated":null}'),t={name:"perf/00_perf_checker.md"},n=a("",10),o=[n];function l(p,r,h,c,d,k){return i(),s("div",null,o)}const u=e(t,[["render",l]]);export{f as __pageData,u as default}; diff --git a/dev/assets/perf_10_tutorial.md.CBaJmQIS.js b/dev/assets/perf_10_tutorial.md.C4bm3h6K.js similarity index 92% rename from dev/assets/perf_10_tutorial.md.CBaJmQIS.js rename to dev/assets/perf_10_tutorial.md.C4bm3h6K.js index 91dfa2f..a55757a 100644 --- a/dev/assets/perf_10_tutorial.md.CBaJmQIS.js +++ b/dev/assets/perf_10_tutorial.md.C4bm3h6K.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const y=JSON.parse('{"title":"Tutorial","description":"","frontmatter":{},"headers":[],"relativePath":"perf/10_tutorial.md","filePath":"perf/10_tutorial.md","lastUpdated":null}'),h={name:"perf/10_tutorial.md"},t=n(`

Tutorial

Taken from PerfChecker.jl examples, this is a guide for performance testing of PatterFolds.jl package using Chairmarks.jl

Using PerfChecker.jl requires an environment with the dependencies present in it.

The actual script looks like this:

julia
using PerfChecker, Chairmarks, CairoMakie
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.CJakPlgM.js";const g=JSON.parse('{"title":"Tutorial","description":"","frontmatter":{},"headers":[],"relativePath":"perf/10_tutorial.md","filePath":"perf/10_tutorial.md","lastUpdated":null}'),k={name:"perf/10_tutorial.md"};function t(l,s,p,e,r,E){return h(),a("div",null,s[0]||(s[0]=[n(`

Tutorial

Taken from PerfChecker.jl examples, this is a guide for performance testing of PatterFolds.jl package using Chairmarks.jl

Using PerfChecker.jl requires an environment with the dependencies present in it.

The actual script looks like this:

julia
using PerfChecker, Chairmarks, CairoMakie
 
 d = Dict(:path => @__DIR__, :evals => 10, :samples => 1000,
     :seconds => 100, :tags => [:patterns, :intervals],
@@ -37,4 +37,4 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const y
 for kwarg in [:times, :gctimes, :bytes, :allocs]
     c2 = checkres_to_boxplots(x, Val(:chairmark); kwarg)
     save(joinpath(@__DIR__, "visuals", "chair_boxplots_$kwarg.png"), c2)
-end

d here is the configuration dictionary. x stores the results from performance testing

The code below the macro call is for plotting and storing the plots. It creates the visuals folder and stores the following plots in the folder:

Boxplots from Chairmarks for allocations:

chair_boxplots

Boxplots from Chairmarks for times:

chair_times

Evolution of different metrics across versions according to Chairmarks:

chair_evolution`,13),k=[t];function l(p,e,r,E,d,g){return a(),i("div",null,k)}const o=s(h,[["render",l]]);export{y as __pageData,o as default}; +end

d here is the configuration dictionary. x stores the results from performance testing

The code below the macro call is for plotting and storing the plots. It creates the visuals folder and stores the following plots in the folder:

Boxplots from Chairmarks for allocations:

chair_boxplots

Boxplots from Chairmarks for times:

chair_times

Evolution of different metrics across versions according to Chairmarks:

chair_evolution`,13)]))}const F=i(k,[["render",t]]);export{g as __pageData,F as default}; diff --git a/dev/assets/perf_10_tutorial.md.C4bm3h6K.lean.js b/dev/assets/perf_10_tutorial.md.C4bm3h6K.lean.js new file mode 100644 index 0000000..a55757a --- /dev/null +++ b/dev/assets/perf_10_tutorial.md.C4bm3h6K.lean.js @@ -0,0 +1,40 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.CJakPlgM.js";const g=JSON.parse('{"title":"Tutorial","description":"","frontmatter":{},"headers":[],"relativePath":"perf/10_tutorial.md","filePath":"perf/10_tutorial.md","lastUpdated":null}'),k={name:"perf/10_tutorial.md"};function t(l,s,p,e,r,E){return h(),a("div",null,s[0]||(s[0]=[n(`

Tutorial

Taken from PerfChecker.jl examples, this is a guide for performance testing of PatterFolds.jl package using Chairmarks.jl

Using PerfChecker.jl requires an environment with the dependencies present in it.

The actual script looks like this:

julia
using PerfChecker, Chairmarks, CairoMakie
+
+d = Dict(:path => @__DIR__, :evals => 10, :samples => 1000,
+    :seconds => 100, :tags => [:patterns, :intervals],
+    :pkgs => (
+        "PatternFolds", :custom, [v"0.2.0", v"0.2.1", v"0.2.2", v"0.2.3", v"0.2.4"], true),
+    :devops => "PatternFolds")
+
+x = @check :chairmark d begin
+    using PatternFolds
+end begin
+    # Intervals
+    itv = Interval{Open, Closed}(0.0, 1.0)
+    i = IntervalsFold(itv, 2.0, 1000)
+
+    unfold(i)
+    collect(i)
+    reverse(collect(i))
+
+    # Vectors
+    vf = make_vector_fold([0, 1], 2, 1000)
+
+    unfold(vf)
+    collect(vf)
+    reverse(collect(vf))
+
+    rand(vf, 1000)
+
+    return nothing
+end
+
+mkpath(joinpath(@__DIR__, "visuals"))
+
+c = checkres_to_scatterlines(x, Val(:chairmark))
+save(joinpath(@__DIR__, "visuals", "chair_evolution.png"), c)
+
+for kwarg in [:times, :gctimes, :bytes, :allocs]
+    c2 = checkres_to_boxplots(x, Val(:chairmark); kwarg)
+    save(joinpath(@__DIR__, "visuals", "chair_boxplots_$kwarg.png"), c2)
+end

d here is the configuration dictionary. x stores the results from performance testing

The code below the macro call is for plotting and storing the plots. It creates the visuals folder and stores the following plots in the folder:

Boxplots from Chairmarks for allocations:

chair_boxplots

Boxplots from Chairmarks for times:

chair_times

Evolution of different metrics across versions according to Chairmarks:

chair_evolution`,13)]))}const F=i(k,[["render",t]]);export{g as __pageData,F as default}; diff --git a/dev/assets/perf_10_tutorial.md.CBaJmQIS.lean.js b/dev/assets/perf_10_tutorial.md.CBaJmQIS.lean.js deleted file mode 100644 index 2a5d4d4..0000000 --- a/dev/assets/perf_10_tutorial.md.CBaJmQIS.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const y=JSON.parse('{"title":"Tutorial","description":"","frontmatter":{},"headers":[],"relativePath":"perf/10_tutorial.md","filePath":"perf/10_tutorial.md","lastUpdated":null}'),h={name:"perf/10_tutorial.md"},t=n("",13),k=[t];function l(p,e,r,E,d,g){return a(),i("div",null,k)}const o=s(h,[["render",l]]);export{y as __pageData,o as default}; diff --git a/dev/assets/perf_20_perf_interface.md.DuuQq97C.js b/dev/assets/perf_20_perf_interface.md.Cfce352q.js similarity index 88% rename from dev/assets/perf_20_perf_interface.md.DuuQq97C.js rename to dev/assets/perf_20_perf_interface.md.Cfce352q.js index 2eaf186..97bfac2 100644 --- a/dev/assets/perf_20_perf_interface.md.DuuQq97C.js +++ b/dev/assets/perf_20_perf_interface.md.Cfce352q.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,a7 as e}from"./chunks/framework.CBLuZwrP.js";const c=JSON.parse('{"title":"Extending PerfChecker","description":"","frontmatter":{},"headers":[],"relativePath":"perf/20_perf_interface.md","filePath":"perf/20_perf_interface.md","lastUpdated":null}'),t={name:"perf/20_perf_interface.md"},h=e(`

Extending PerfChecker

PerfChecker was build as an easy to extend interface. A good reference example for this is the Chairmarks extension.

Extending PerfChecker works via PkgExtensions feature in Julia. There are 6 essential functions that need to be extended inside the Pkg extension. Each extension has a keyword symbol for it, which users can input to use the extension.

The Default Options

Method to be overloaded: PerfChecker.default_options(::Val{:myperfextension})::Dict

PerfChecker works via a config dictionary. Users can populate this dictionary with options and provide it to the main check macro to customize the performance testing to their liking.

For Chairmarks.jl, it looks like this:

julia
function PerfChecker.default_options(::Val{:chairmark})
+import{_ as i,c as a,a5 as e,o as t}from"./chunks/framework.CJakPlgM.js";const E=JSON.parse('{"title":"Extending PerfChecker","description":"","frontmatter":{},"headers":[],"relativePath":"perf/20_perf_interface.md","filePath":"perf/20_perf_interface.md","lastUpdated":null}'),h={name:"perf/20_perf_interface.md"};function n(k,s,l,p,r,d){return t(),a("div",null,s[0]||(s[0]=[e(`

Extending PerfChecker

PerfChecker was build as an easy to extend interface. A good reference example for this is the Chairmarks extension.

Extending PerfChecker works via PkgExtensions feature in Julia. There are 6 essential functions that need to be extended inside the Pkg extension. Each extension has a keyword symbol for it, which users can input to use the extension.

The Default Options

Method to be overloaded: PerfChecker.default_options(::Val{:myperfextension})::Dict

PerfChecker works via a config dictionary. Users can populate this dictionary with options and provide it to the main check macro to customize the performance testing to their liking.

For Chairmarks.jl, it looks like this:

julia
function PerfChecker.default_options(::Val{:chairmark})
     return Dict(
         :threads => 1,
         :track => "none",
@@ -24,4 +24,4 @@ import{_ as s,c as i,o as a,a7 as e}from"./chunks/framework.CBLuZwrP.js";const c
     bytes = [chair.samples[i].bytes for i in 1:l]
     allocs = [chair.samples[i].allocs for i in 1:l]
     return Table(times = times, gctimes = gctimes, bytes = bytes, allocs = allocs)
-end

There are also other functions that can be overloaded, mostly related to plotting but these are the basic functions to extend PerfChecker for a custom backend.

`,36),n=[h];function k(l,p,r,d,o,E){return a(),i("div",null,n)}const y=s(t,[["render",k]]);export{c as __pageData,y as default}; +end

There are also other functions that can be overloaded, mostly related to plotting but these are the basic functions to extend PerfChecker for a custom backend.

`,36)]))}const g=i(h,[["render",n]]);export{E as __pageData,g as default}; diff --git a/dev/assets/perf_20_perf_interface.md.Cfce352q.lean.js b/dev/assets/perf_20_perf_interface.md.Cfce352q.lean.js new file mode 100644 index 0000000..97bfac2 --- /dev/null +++ b/dev/assets/perf_20_perf_interface.md.Cfce352q.lean.js @@ -0,0 +1,27 @@ +import{_ as i,c as a,a5 as e,o as t}from"./chunks/framework.CJakPlgM.js";const E=JSON.parse('{"title":"Extending PerfChecker","description":"","frontmatter":{},"headers":[],"relativePath":"perf/20_perf_interface.md","filePath":"perf/20_perf_interface.md","lastUpdated":null}'),h={name:"perf/20_perf_interface.md"};function n(k,s,l,p,r,d){return t(),a("div",null,s[0]||(s[0]=[e(`

Extending PerfChecker

PerfChecker was build as an easy to extend interface. A good reference example for this is the Chairmarks extension.

Extending PerfChecker works via PkgExtensions feature in Julia. There are 6 essential functions that need to be extended inside the Pkg extension. Each extension has a keyword symbol for it, which users can input to use the extension.

The Default Options

Method to be overloaded: PerfChecker.default_options(::Val{:myperfextension})::Dict

PerfChecker works via a config dictionary. Users can populate this dictionary with options and provide it to the main check macro to customize the performance testing to their liking.

For Chairmarks.jl, it looks like this:

julia
function PerfChecker.default_options(::Val{:chairmark})
+    return Dict(
+        :threads => 1,
+        :track => "none",
+        :evals => nothing,
+        :seconds => 1,
+        :samples => nothing,
+        :gc => true
+    )
+end

Package initialization

Method to be overloaded: PerfChecker.initpkgs(::Val{:myperfextension})::Expr

This method is plainly to load the main package(s) associated with the custom backend. In case of Chairmarks.jl, it looks like this:

julia
PerfChecker.initpkgs(::Val{:chairmark}) = quote
+    using Chairmarks
+end

Preparatory Code:

Method to be overloaded: PerfChecker.prep(config_dict::Dict, block::Expr, ::Val{:myperfextension})::Expr

This method exists to run arbitrary "preparatory" code (represented by block parameter here) before running the code to be performance tested for.

The output from here are stored inside the :prep_result key of the configuration dictionary.

Example for Chairmarks.jl:

julia
PerfChecker.prep(::Dict, block::Expr, ::Val{:chairmark}) = quote
+    $block
+    nothing
+end

This just runs the code in block provided by the user.

Main Code to be Performance Tested

Method to be overloaded: PerfChecker.check(config_dict::Dict, block::Expr, ::Val{:myperfextension})::Expr.

Runs the appropriate code to run the performance testing on user's code. For Chairmarks.jl, it looks like this:

julia
function PerfChecker.check(d::Dict, block::Expr, ::Val{:chairmark})
+    quote
+        d = $d
+        return @be $block evals=d[:evals] seconds=d[:seconds] samples=d[:samples] gc=d[:gc]
+    end
+end

The output from here are stored inside the :check_result key of the configuration dictionary.

Post Performance Testing Code

Method to be overloaded: PerfChecker.post(config_dict::Dict, ::Val{:myperfextension})

The code to be run after the performance testing is done. The output from here is converted into a table via the to_table method overloading.

In the case of Chairmarks.jl:

julia
PerfChecker.post(d::Dict, ::Val{:chairmark}) = d[:check_result]

Converting the result into a Table

Method to be overloaded: PerfChecker.to_table

Convert the output from post function into an appropriate table.

In the case of Chairmarks.jl

julia
function PerfChecker.to_table(chair::Chairmarks.Benchmark)
+    l = length(chair.samples)
+    times = [chair.samples[i].time for i in 1:l]
+    gctimes = [chair.samples[i].gc_fraction for i in 1:l]
+    bytes = [chair.samples[i].bytes for i in 1:l]
+    allocs = [chair.samples[i].allocs for i in 1:l]
+    return Table(times = times, gctimes = gctimes, bytes = bytes, allocs = allocs)
+end

There are also other functions that can be overloaded, mostly related to plotting but these are the basic functions to extend PerfChecker for a custom backend.

`,36)]))}const g=i(h,[["render",n]]);export{E as __pageData,g as default}; diff --git a/dev/assets/perf_20_perf_interface.md.DuuQq97C.lean.js b/dev/assets/perf_20_perf_interface.md.DuuQq97C.lean.js deleted file mode 100644 index 1a9e42d..0000000 --- a/dev/assets/perf_20_perf_interface.md.DuuQq97C.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,c as i,o as a,a7 as e}from"./chunks/framework.CBLuZwrP.js";const c=JSON.parse('{"title":"Extending PerfChecker","description":"","frontmatter":{},"headers":[],"relativePath":"perf/20_perf_interface.md","filePath":"perf/20_perf_interface.md","lastUpdated":null}'),t={name:"perf/20_perf_interface.md"},h=e("",36),n=[h];function k(l,p,r,d,o,E){return a(),i("div",null,n)}const y=s(t,[["render",k]]);export{c as __pageData,y as default}; diff --git a/dev/assets/perf_30_benchmark_ext.md.hCIaUaBY.js b/dev/assets/perf_30_benchmark_ext.md.CzInbrh4.js similarity index 83% rename from dev/assets/perf_30_benchmark_ext.md.hCIaUaBY.js rename to dev/assets/perf_30_benchmark_ext.md.CzInbrh4.js index caf9d26..7efab43 100644 --- a/dev/assets/perf_30_benchmark_ext.md.hCIaUaBY.js +++ b/dev/assets/perf_30_benchmark_ext.md.CzInbrh4.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const c=JSON.parse('{"title":"BenchmarkTools Extension","description":"","frontmatter":{},"headers":[],"relativePath":"perf/30_benchmark_ext.md","filePath":"perf/30_benchmark_ext.md","lastUpdated":null}'),h={name:"perf/30_benchmark_ext.md"},t=n(`

BenchmarkTools Extension

A benchmarking extension, based on BenchmarkTools.jl, has been interfaced with PerfChecker.jl. This section will provide some usage examples, documentation, and links to related notebooks.

Usage

Like all other extensions, BenchmarkTools extension can be used in the following way:

julia
julia> using BenchmarkTools, PerfChecker
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.CJakPlgM.js";const g=JSON.parse('{"title":"BenchmarkTools Extension","description":"","frontmatter":{},"headers":[],"relativePath":"perf/30_benchmark_ext.md","filePath":"perf/30_benchmark_ext.md","lastUpdated":null}'),k={name:"perf/30_benchmark_ext.md"};function t(l,s,e,p,r,E){return h(),a("div",null,s[0]||(s[0]=[n(`

BenchmarkTools Extension

A benchmarking extension, based on BenchmarkTools.jl, has been interfaced with PerfChecker.jl. This section will provide some usage examples, documentation, and links to related notebooks.

Usage

Like all other extensions, BenchmarkTools extension can be used in the following way:

julia
julia> using BenchmarkTools, PerfChecker
 
 julia> @check :benchmark Dict(:option1 => "value1", :option2 => "value2", :PATH => @__DIR__) begin
   # the prelimnary code goes here
@@ -15,4 +15,4 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const c
 :gctrial => BenchmarkTools.DEFAULT_PARAMETERS.gctrial
 :gcsample => BenchmarkTools.DEFAULT_PARAMETERS.gcsample
 :time_tolerance => BenchmarkTools.DEFAULT_PARAMETERS.time_tolerance
-:memory_tolerance => BenchmarkTools.DEFAULT_PARAMETERS.memory_tolerance
`,8),k=[t];function e(l,p,r,E,d,o){return a(),i("div",null,k)}const y=s(h,[["render",e]]);export{c as __pageData,y as default}; +:memory_tolerance => BenchmarkTools.DEFAULT_PARAMETERS.memory_tolerance
`,8)]))}const o=i(k,[["render",t]]);export{g as __pageData,o as default}; diff --git a/dev/assets/perf_30_benchmark_ext.md.CzInbrh4.lean.js b/dev/assets/perf_30_benchmark_ext.md.CzInbrh4.lean.js new file mode 100644 index 0000000..7efab43 --- /dev/null +++ b/dev/assets/perf_30_benchmark_ext.md.CzInbrh4.lean.js @@ -0,0 +1,18 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.CJakPlgM.js";const g=JSON.parse('{"title":"BenchmarkTools Extension","description":"","frontmatter":{},"headers":[],"relativePath":"perf/30_benchmark_ext.md","filePath":"perf/30_benchmark_ext.md","lastUpdated":null}'),k={name:"perf/30_benchmark_ext.md"};function t(l,s,e,p,r,E){return h(),a("div",null,s[0]||(s[0]=[n(`

BenchmarkTools Extension

A benchmarking extension, based on BenchmarkTools.jl, has been interfaced with PerfChecker.jl. This section will provide some usage examples, documentation, and links to related notebooks.

Usage

Like all other extensions, BenchmarkTools extension can be used in the following way:

julia
julia> using BenchmarkTools, PerfChecker
+
+julia> @check :benchmark Dict(:option1 => "value1", :option2 => "value2", :PATH => @__DIR__) begin
+  # the prelimnary code goes here
+  using Example
+end begin
+  # the code you want to be benchmarked
+  Example.domath(10) # returns x + 5, 15 in this case.
+end

Options

Options specific to this backend with their default values are defined as:

julia
:threads => 1
+:track => "none"
+:samples => BenchmarkTools.DEFAULT_PARAMETERS.samples
+:seconds => BenchmarkTools.DEFAULT_PARAMETERS.seconds
+:evals => BenchmarkTools.DEFAULT_PARAMETERS.evals
+:overhead => BenchmarkTools.DEFAULT_PARAMETERS.overhead
+:gctrial => BenchmarkTools.DEFAULT_PARAMETERS.gctrial
+:gcsample => BenchmarkTools.DEFAULT_PARAMETERS.gcsample
+:time_tolerance => BenchmarkTools.DEFAULT_PARAMETERS.time_tolerance
+:memory_tolerance => BenchmarkTools.DEFAULT_PARAMETERS.memory_tolerance
`,8)]))}const o=i(k,[["render",t]]);export{g as __pageData,o as default}; diff --git a/dev/assets/perf_30_benchmark_ext.md.hCIaUaBY.lean.js b/dev/assets/perf_30_benchmark_ext.md.hCIaUaBY.lean.js deleted file mode 100644 index c3e299e..0000000 --- a/dev/assets/perf_30_benchmark_ext.md.hCIaUaBY.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const c=JSON.parse('{"title":"BenchmarkTools Extension","description":"","frontmatter":{},"headers":[],"relativePath":"perf/30_benchmark_ext.md","filePath":"perf/30_benchmark_ext.md","lastUpdated":null}'),h={name:"perf/30_benchmark_ext.md"},t=n("",8),k=[t];function e(l,p,r,E,d,o){return a(),i("div",null,k)}const y=s(h,[["render",e]]);export{c as __pageData,y as default}; diff --git a/dev/assets/perf_40_chairmarks_ext.md.B-RX5T8u.lean.js b/dev/assets/perf_40_chairmarks_ext.md.B-RX5T8u.lean.js deleted file mode 100644 index b178d01..0000000 --- a/dev/assets/perf_40_chairmarks_ext.md.B-RX5T8u.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const F=JSON.parse('{"title":"Chairmarks Extension","description":"","frontmatter":{},"headers":[],"relativePath":"perf/40_chairmarks_ext.md","filePath":"perf/40_chairmarks_ext.md","lastUpdated":null}'),t={name:"perf/40_chairmarks_ext.md"},e=n("",8),h=[e];function l(k,p,r,d,o,g){return a(),i("div",null,h)}const y=s(t,[["render",l]]);export{F as __pageData,y as default}; diff --git a/dev/assets/perf_40_chairmarks_ext.md.B-RX5T8u.js b/dev/assets/perf_40_chairmarks_ext.md.h8pfB9sA.js similarity index 75% rename from dev/assets/perf_40_chairmarks_ext.md.B-RX5T8u.js rename to dev/assets/perf_40_chairmarks_ext.md.h8pfB9sA.js index cb984e2..e090628 100644 --- a/dev/assets/perf_40_chairmarks_ext.md.B-RX5T8u.js +++ b/dev/assets/perf_40_chairmarks_ext.md.h8pfB9sA.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const F=JSON.parse('{"title":"Chairmarks Extension","description":"","frontmatter":{},"headers":[],"relativePath":"perf/40_chairmarks_ext.md","filePath":"perf/40_chairmarks_ext.md","lastUpdated":null}'),t={name:"perf/40_chairmarks_ext.md"},e=n(`

Chairmarks Extension

A benchmarking extension, based on Chairmarks.jl, has been interfaced with PerfChecker.jl. This section will provide some usage examples, documentation, and links to related notebooks.

Usage

Like all other extensions, BenchmarkTools extension can be used in the following way:

julia
julia> using Chairmarks, PerfChecker
+import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.CJakPlgM.js";const g=JSON.parse('{"title":"Chairmarks Extension","description":"","frontmatter":{},"headers":[],"relativePath":"perf/40_chairmarks_ext.md","filePath":"perf/40_chairmarks_ext.md","lastUpdated":null}'),e={name:"perf/40_chairmarks_ext.md"};function h(l,s,k,p,r,d){return t(),a("div",null,s[0]||(s[0]=[n(`

Chairmarks Extension

A benchmarking extension, based on Chairmarks.jl, has been interfaced with PerfChecker.jl. This section will provide some usage examples, documentation, and links to related notebooks.

Usage

Like all other extensions, BenchmarkTools extension can be used in the following way:

julia
julia> using Chairmarks, PerfChecker
 
 julia> @check :chairmark Dict(:option1 => "value1", :option2 => "value2", :PATH => @__DIR__) begin
   # the prelimnary code goes here
@@ -11,4 +11,4 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.CBLuZwrP.js";const F
 :evals => nothing
 :seconds => 1,
 :samples => nothing
-:gc => true
`,8),h=[e];function l(k,p,r,d,o,g){return a(),i("div",null,h)}const y=s(t,[["render",l]]);export{F as __pageData,y as default}; +:gc => true
`,8)]))}const c=i(e,[["render",h]]);export{g as __pageData,c as default}; diff --git a/dev/assets/perf_40_chairmarks_ext.md.h8pfB9sA.lean.js b/dev/assets/perf_40_chairmarks_ext.md.h8pfB9sA.lean.js new file mode 100644 index 0000000..e090628 --- /dev/null +++ b/dev/assets/perf_40_chairmarks_ext.md.h8pfB9sA.lean.js @@ -0,0 +1,14 @@ +import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.CJakPlgM.js";const g=JSON.parse('{"title":"Chairmarks Extension","description":"","frontmatter":{},"headers":[],"relativePath":"perf/40_chairmarks_ext.md","filePath":"perf/40_chairmarks_ext.md","lastUpdated":null}'),e={name:"perf/40_chairmarks_ext.md"};function h(l,s,k,p,r,d){return t(),a("div",null,s[0]||(s[0]=[n(`

Chairmarks Extension

A benchmarking extension, based on Chairmarks.jl, has been interfaced with PerfChecker.jl. This section will provide some usage examples, documentation, and links to related notebooks.

Usage

Like all other extensions, BenchmarkTools extension can be used in the following way:

julia
julia> using Chairmarks, PerfChecker
+
+julia> @check :chairmark Dict(:option1 => "value1", :option2 => "value2", :PATH => @__DIR__) begin
+  # the prelimnary code goes here
+  using Example
+end begin
+  # the code you want to be benchmarked
+  Example.domath(10) # returns x + 5, 15 in this case.
+end

Options

Options specific to this backend with their default values are defined as:

julia
:threads => 1
+:track => "none"
+:evals => nothing
+:seconds => 1,
+:samples => nothing
+:gc => true
`,8)]))}const c=i(e,[["render",h]]);export{g as __pageData,c as default}; diff --git a/dev/assets/perf_90_api.md.0OTlDWyk.js b/dev/assets/perf_90_api.md.0OTlDWyk.js new file mode 100644 index 0000000..a3ca7f1 --- /dev/null +++ b/dev/assets/perf_90_api.md.0OTlDWyk.js @@ -0,0 +1,9 @@ +import{_ as t,c as n,j as e,a as i,G as a,a5 as l,B as o,o as p}from"./chunks/framework.CJakPlgM.js";const j=JSON.parse('{"title":"API","description":"","frontmatter":{},"headers":[],"relativePath":"perf/90_api.md","filePath":"perf/90_api.md","lastUpdated":null}'),k={name:"perf/90_api.md"},h={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""};function b(C,s,c,f,m,F){const r=o("Badge");return p(),n("div",null,[s[15]||(s[15]=e("h1",{id:"api",tabindex:"-1"},[i("API "),e("a",{class:"header-anchor",href:"#api","aria-label":'Permalink to "API"'},"​")],-1)),s[16]||(s[16]=e("p",null,"Here's the API for PerfChecker.jl",-1)),e("details",h,[e("summary",null,[s[0]||(s[0]=e("a",{id:"PerfChecker.arrange_breaking-Tuple{VersionNumber, Vector{VersionNumber}, Bool}",href:"#PerfChecker.arrange_breaking-Tuple{VersionNumber, Vector{VersionNumber}, Bool}"},[e("span",{class:"jlbinding"},"PerfChecker.arrange_breaking")],-1)),s[1]||(s[1]=i()),a(r,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[2]||(s[2]=e("p",null,"Outputs the last breaking or next breaking version.",-1)),s[3]||(s[3]=e("p",null,[e("a",{href:"https://github.com/JuliaConstraints/PerfChecker.jl/blob/v0.2.1/src/versions.jl#L56-L58",target:"_blank",rel:"noreferrer"},"source")],-1))]),e("details",u,[e("summary",null,[s[4]||(s[4]=e("a",{id:"PerfChecker.arrange_major-Tuple{VersionNumber, Vector{VersionNumber}, Bool}",href:"#PerfChecker.arrange_major-Tuple{VersionNumber, Vector{VersionNumber}, Bool}"},[e("span",{class:"jlbinding"},"PerfChecker.arrange_major")],-1)),s[5]||(s[5]=i()),a(r,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[6]||(s[6]=e("p",null,"Outputs the earlier or next major version.",-1)),s[7]||(s[7]=e("p",null,[e("a",{href:"https://github.com/JuliaConstraints/PerfChecker.jl/blob/v0.2.1/src/versions.jl#L67-L69",target:"_blank",rel:"noreferrer"},"source")],-1))]),e("details",d,[e("summary",null,[s[8]||(s[8]=e("a",{id:"PerfChecker.arrange_patches-Tuple{VersionNumber, Vector{VersionNumber}, Bool}",href:"#PerfChecker.arrange_patches-Tuple{VersionNumber, Vector{VersionNumber}, Bool}"},[e("span",{class:"jlbinding"},"PerfChecker.arrange_patches")],-1)),s[9]||(s[9]=i()),a(r,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[10]||(s[10]=e("p",null,"Outputs the last patch or first patch of a version.",-1)),s[11]||(s[11]=e("p",null,[e("a",{href:"https://github.com/JuliaConstraints/PerfChecker.jl/blob/v0.2.1/src/versions.jl#L35-L37",target:"_blank",rel:"noreferrer"},"source")],-1))]),e("details",g,[e("summary",null,[s[12]||(s[12]=e("a",{id:"PerfChecker.get_pkg_versions",href:"#PerfChecker.get_pkg_versions"},[e("span",{class:"jlbinding"},"PerfChecker.get_pkg_versions")],-1)),s[13]||(s[13]=i()),a(r,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[14]||(s[14]=l(`

Finds all versions of a package in all the installed registries and returns it as a vector.

Example:

julia
julia> get_pkg_versions("ConstraintLearning")
+7-element Vector{VersionNumber}:
+ v"0.1.4"
+ v"0.1.5"
+ v"0.1.0"
+ v"0.1.6"
+ v"0.1.1"
+ v"0.1.3"
+ v"0.1.2"

source

`,4))])])}const v=t(k,[["render",b]]);export{j as __pageData,v as default}; diff --git a/dev/assets/perf_90_api.md.0OTlDWyk.lean.js b/dev/assets/perf_90_api.md.0OTlDWyk.lean.js new file mode 100644 index 0000000..a3ca7f1 --- /dev/null +++ b/dev/assets/perf_90_api.md.0OTlDWyk.lean.js @@ -0,0 +1,9 @@ +import{_ as t,c as n,j as e,a as i,G as a,a5 as l,B as o,o as p}from"./chunks/framework.CJakPlgM.js";const j=JSON.parse('{"title":"API","description":"","frontmatter":{},"headers":[],"relativePath":"perf/90_api.md","filePath":"perf/90_api.md","lastUpdated":null}'),k={name:"perf/90_api.md"},h={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""};function b(C,s,c,f,m,F){const r=o("Badge");return p(),n("div",null,[s[15]||(s[15]=e("h1",{id:"api",tabindex:"-1"},[i("API "),e("a",{class:"header-anchor",href:"#api","aria-label":'Permalink to "API"'},"​")],-1)),s[16]||(s[16]=e("p",null,"Here's the API for PerfChecker.jl",-1)),e("details",h,[e("summary",null,[s[0]||(s[0]=e("a",{id:"PerfChecker.arrange_breaking-Tuple{VersionNumber, Vector{VersionNumber}, Bool}",href:"#PerfChecker.arrange_breaking-Tuple{VersionNumber, Vector{VersionNumber}, Bool}"},[e("span",{class:"jlbinding"},"PerfChecker.arrange_breaking")],-1)),s[1]||(s[1]=i()),a(r,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[2]||(s[2]=e("p",null,"Outputs the last breaking or next breaking version.",-1)),s[3]||(s[3]=e("p",null,[e("a",{href:"https://github.com/JuliaConstraints/PerfChecker.jl/blob/v0.2.1/src/versions.jl#L56-L58",target:"_blank",rel:"noreferrer"},"source")],-1))]),e("details",u,[e("summary",null,[s[4]||(s[4]=e("a",{id:"PerfChecker.arrange_major-Tuple{VersionNumber, Vector{VersionNumber}, Bool}",href:"#PerfChecker.arrange_major-Tuple{VersionNumber, Vector{VersionNumber}, Bool}"},[e("span",{class:"jlbinding"},"PerfChecker.arrange_major")],-1)),s[5]||(s[5]=i()),a(r,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[6]||(s[6]=e("p",null,"Outputs the earlier or next major version.",-1)),s[7]||(s[7]=e("p",null,[e("a",{href:"https://github.com/JuliaConstraints/PerfChecker.jl/blob/v0.2.1/src/versions.jl#L67-L69",target:"_blank",rel:"noreferrer"},"source")],-1))]),e("details",d,[e("summary",null,[s[8]||(s[8]=e("a",{id:"PerfChecker.arrange_patches-Tuple{VersionNumber, Vector{VersionNumber}, Bool}",href:"#PerfChecker.arrange_patches-Tuple{VersionNumber, Vector{VersionNumber}, Bool}"},[e("span",{class:"jlbinding"},"PerfChecker.arrange_patches")],-1)),s[9]||(s[9]=i()),a(r,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[10]||(s[10]=e("p",null,"Outputs the last patch or first patch of a version.",-1)),s[11]||(s[11]=e("p",null,[e("a",{href:"https://github.com/JuliaConstraints/PerfChecker.jl/blob/v0.2.1/src/versions.jl#L35-L37",target:"_blank",rel:"noreferrer"},"source")],-1))]),e("details",g,[e("summary",null,[s[12]||(s[12]=e("a",{id:"PerfChecker.get_pkg_versions",href:"#PerfChecker.get_pkg_versions"},[e("span",{class:"jlbinding"},"PerfChecker.get_pkg_versions")],-1)),s[13]||(s[13]=i()),a(r,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[14]||(s[14]=l(`

Finds all versions of a package in all the installed registries and returns it as a vector.

Example:

julia
julia> get_pkg_versions("ConstraintLearning")
+7-element Vector{VersionNumber}:
+ v"0.1.4"
+ v"0.1.5"
+ v"0.1.0"
+ v"0.1.6"
+ v"0.1.1"
+ v"0.1.3"
+ v"0.1.2"

source

`,4))])])}const v=t(k,[["render",b]]);export{j as __pageData,v as default}; diff --git a/dev/assets/perf_90_api.md.CYT8Uuo0.js b/dev/assets/perf_90_api.md.CYT8Uuo0.js deleted file mode 100644 index 1428f48..0000000 --- a/dev/assets/perf_90_api.md.CYT8Uuo0.js +++ /dev/null @@ -1,9 +0,0 @@ -import{_ as e,c as s,o as r,a7 as i}from"./chunks/framework.CBLuZwrP.js";const b=JSON.parse('{"title":"API","description":"","frontmatter":{},"headers":[],"relativePath":"perf/90_api.md","filePath":"perf/90_api.md","lastUpdated":null}'),a={name:"perf/90_api.md"},t=i(`

API

Here's the API for PerfChecker.jl

# PerfChecker.arrange_breakingMethod.

Outputs the last breaking or next breaking version.

source


# PerfChecker.arrange_majorMethod.

Outputs the earlier or next major version.

source


# PerfChecker.arrange_patchesMethod.

Outputs the last patch or first patch of a version.

source


# PerfChecker.get_pkg_versionsFunction.

Finds all versions of a package in all the installed registries and returns it as a vector.

Example:

julia
julia> get_pkg_versions("ConstraintLearning")
-7-element Vector{VersionNumber}:
- v"0.1.4"
- v"0.1.5"
- v"0.1.0"
- v"0.1.6"
- v"0.1.1"
- v"0.1.3"
- v"0.1.2"

source


`,10),n=[t];function l(o,p,h,k,d,c){return r(),s("div",null,n)}const g=e(a,[["render",l]]);export{b as __pageData,g as default}; diff --git a/dev/assets/perf_90_api.md.CYT8Uuo0.lean.js b/dev/assets/perf_90_api.md.CYT8Uuo0.lean.js deleted file mode 100644 index f049fd1..0000000 --- a/dev/assets/perf_90_api.md.CYT8Uuo0.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,c as s,o as r,a7 as i}from"./chunks/framework.CBLuZwrP.js";const b=JSON.parse('{"title":"API","description":"","frontmatter":{},"headers":[],"relativePath":"perf/90_api.md","filePath":"perf/90_api.md","lastUpdated":null}'),a={name:"perf/90_api.md"},t=i("",10),n=[t];function l(o,p,h,k,d,c){return r(),s("div",null,n)}const g=e(a,[["render",l]]);export{b as __pageData,g as default}; diff --git a/dev/assets/solvers_00_intro.md.3TPMgJCO.js b/dev/assets/solvers_00_intro.md.3TPMgJCO.js deleted file mode 100644 index ae5a8fb..0000000 --- a/dev/assets/solvers_00_intro.md.3TPMgJCO.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,c as t,o,j as e,a as r}from"./chunks/framework.CBLuZwrP.js";const u=JSON.parse('{"title":"Solvers","description":"","frontmatter":{},"headers":[],"relativePath":"solvers/00_intro.md","filePath":"solvers/00_intro.md","lastUpdated":null}'),a={name:"solvers/00_intro.md"},n=e("h1",{id:"solvers",tabindex:"-1"},[r("Solvers "),e("a",{class:"header-anchor",href:"#solvers","aria-label":'Permalink to "Solvers"'},"​")],-1),l=e("p",null,"About solvers.",-1),c=[n,l];function _(i,d,p,h,v,m){return o(),t("div",null,c)}const x=s(a,[["render",_]]);export{u as __pageData,x as default}; diff --git a/dev/assets/solvers_00_intro.md.3TPMgJCO.lean.js b/dev/assets/solvers_00_intro.md.3TPMgJCO.lean.js deleted file mode 100644 index ae5a8fb..0000000 --- a/dev/assets/solvers_00_intro.md.3TPMgJCO.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,c as t,o,j as e,a as r}from"./chunks/framework.CBLuZwrP.js";const u=JSON.parse('{"title":"Solvers","description":"","frontmatter":{},"headers":[],"relativePath":"solvers/00_intro.md","filePath":"solvers/00_intro.md","lastUpdated":null}'),a={name:"solvers/00_intro.md"},n=e("h1",{id:"solvers",tabindex:"-1"},[r("Solvers "),e("a",{class:"header-anchor",href:"#solvers","aria-label":'Permalink to "Solvers"'},"​")],-1),l=e("p",null,"About solvers.",-1),c=[n,l];function _(i,d,p,h,v,m){return o(),t("div",null,c)}const x=s(a,[["render",_]]);export{u as __pageData,x as default}; diff --git a/dev/assets/solvers_00_intro.md.s1tbOTQV.js b/dev/assets/solvers_00_intro.md.s1tbOTQV.js new file mode 100644 index 0000000..613d071 --- /dev/null +++ b/dev/assets/solvers_00_intro.md.s1tbOTQV.js @@ -0,0 +1 @@ +import{_ as s,c as t,j as e,a,o}from"./chunks/framework.CJakPlgM.js";const m=JSON.parse('{"title":"Solvers","description":"","frontmatter":{},"headers":[],"relativePath":"solvers/00_intro.md","filePath":"solvers/00_intro.md","lastUpdated":null}'),l={name:"solvers/00_intro.md"};function n(i,r,d,c,_,p){return o(),t("div",null,r[0]||(r[0]=[e("h1",{id:"solvers",tabindex:"-1"},[a("Solvers "),e("a",{class:"header-anchor",href:"#solvers","aria-label":'Permalink to "Solvers"'},"​")],-1),e("p",null,"About solvers.",-1)]))}const f=s(l,[["render",n]]);export{m as __pageData,f as default}; diff --git a/dev/assets/solvers_00_intro.md.s1tbOTQV.lean.js b/dev/assets/solvers_00_intro.md.s1tbOTQV.lean.js new file mode 100644 index 0000000..613d071 --- /dev/null +++ b/dev/assets/solvers_00_intro.md.s1tbOTQV.lean.js @@ -0,0 +1 @@ +import{_ as s,c as t,j as e,a,o}from"./chunks/framework.CJakPlgM.js";const m=JSON.parse('{"title":"Solvers","description":"","frontmatter":{},"headers":[],"relativePath":"solvers/00_intro.md","filePath":"solvers/00_intro.md","lastUpdated":null}'),l={name:"solvers/00_intro.md"};function n(i,r,d,c,_,p){return o(),t("div",null,r[0]||(r[0]=[e("h1",{id:"solvers",tabindex:"-1"},[a("Solvers "),e("a",{class:"header-anchor",href:"#solvers","aria-label":'Permalink to "Solvers"'},"​")],-1),e("p",null,"About solvers.",-1)]))}const f=s(l,[["render",n]]);export{m as __pageData,f as default}; diff --git a/dev/assets/solvers_10_cbls.md.BCa7hnj8.js b/dev/assets/solvers_10_cbls.md.BCa7hnj8.js new file mode 100644 index 0000000..397544a --- /dev/null +++ b/dev/assets/solvers_10_cbls.md.BCa7hnj8.js @@ -0,0 +1,8 @@ +import{_ as n,c as p,j as i,a as t,G as e,a5 as l,B as r,o}from"./chunks/framework.CJakPlgM.js";const Vs=JSON.parse('{"title":"CBLS.jl","description":"","frontmatter":{},"headers":[],"relativePath":"solvers/10_cbls.md","filePath":"solvers/10_cbls.md","lastUpdated":null}'),h={name:"solvers/10_cbls.md"},d={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},O={class:"jldocstring custom-block",open:""},L={class:"jldocstring custom-block",open:""},S={class:"jldocstring custom-block",open:""},I={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},M={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},z={class:"jldocstring custom-block",open:""},V={class:"jldocstring custom-block",open:""},N={class:"jldocstring custom-block",open:""},J={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""},R={class:"jldocstring custom-block",open:""},P={class:"jldocstring custom-block",open:""},G={class:"jldocstring custom-block",open:""},X={class:"jldocstring custom-block",open:""},U={class:"jldocstring custom-block",open:""},q={class:"jldocstring custom-block",open:""},$={class:"jldocstring custom-block",open:""},W={class:"jldocstring custom-block",open:""},H={class:"jldocstring custom-block",open:""},K={class:"jldocstring custom-block",open:""},Q={class:"jldocstring custom-block",open:""},Y={class:"jldocstring custom-block",open:""},Z={class:"jldocstring custom-block",open:""},_={class:"jldocstring custom-block",open:""},ss={class:"jldocstring custom-block",open:""},is={class:"jldocstring custom-block",open:""},ts={class:"jldocstring custom-block",open:""},as={class:"jldocstring custom-block",open:""},es={class:"jldocstring custom-block",open:""},ls={class:"jldocstring custom-block",open:""},ns={class:"jldocstring custom-block",open:""},ps={class:"jldocstring custom-block",open:""},rs={class:"jldocstring custom-block",open:""},os={class:"jldocstring custom-block",open:""},hs={class:"jldocstring custom-block",open:""},ds={class:"jldocstring custom-block",open:""},ks={class:"jldocstring custom-block",open:""},gs={class:"jldocstring custom-block",open:""},us={class:"jldocstring custom-block",open:""},cs={class:"jldocstring custom-block",open:""},ys={class:"jldocstring custom-block",open:""},bs={class:"jldocstring custom-block",open:""},Es={class:"jldocstring custom-block",open:""},Cs={class:"jldocstring custom-block",open:""},ms={class:"jldocstring custom-block",open:""},Fs={class:"jldocstring custom-block",open:""},js={class:"jldocstring custom-block",open:""},vs={class:"jldocstring custom-block",open:""},fs={class:"jldocstring custom-block",open:""},Bs={class:"jldocstring custom-block",open:""},Os={class:"jldocstring custom-block",open:""},Ls={class:"jldocstring custom-block",open:""},Ss={class:"jldocstring custom-block",open:""};function Is(Ts,s,Ms,As,Ds,xs){const a=r("Badge");return o(),p("div",null,[s[222]||(s[222]=i("h1",{id:"cbls-jl",tabindex:"-1"},[t("CBLS.jl "),i("a",{class:"header-anchor",href:"#cbls-jl","aria-label":'Permalink to "CBLS.jl"'},"​")],-1)),s[223]||(s[223]=i("p",null,[t("Documentation for "),i("code",null,"CBLS.jl"),t(".")],-1)),i("details",d,[i("summary",null,[s[0]||(s[0]=i("a",{id:"CBLS.AllDifferent",href:"#CBLS.AllDifferent"},[i("span",{class:"jlbinding"},"CBLS.AllDifferent")],-1)),s[1]||(s[1]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=l('

Global constraint ensuring that all the values of a given configuration are unique.

julia
@constraint(model, X in AllDifferent())

source

',3))]),i("details",k,[i("summary",null,[s[3]||(s[3]=i("a",{id:"CBLS.AllEqual",href:"#CBLS.AllEqual"},[i("span",{class:"jlbinding"},"CBLS.AllEqual")],-1)),s[4]||(s[4]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[5]||(s[5]=l('

Global constraint ensuring that all the values of X are all equal.

julia
@constraint(model, X in AllEqual())

source

',3))]),i("details",g,[i("summary",null,[s[6]||(s[6]=i("a",{id:"CBLS.AtLeast",href:"#CBLS.AtLeast"},[i("span",{class:"jlbinding"},"CBLS.AtLeast")],-1)),s[7]||(s[7]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[8]||(s[8]=l('

Constraint ensuring that the number of occurrences of the values in vals in x is at least val.

julia
@constraint(model, X in AtLeast(val, vals))

source

',3))]),i("details",u,[i("summary",null,[s[9]||(s[9]=i("a",{id:"CBLS.AtMost",href:"#CBLS.AtMost"},[i("span",{class:"jlbinding"},"CBLS.AtMost")],-1)),s[10]||(s[10]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[11]||(s[11]=l('

Constraint ensuring that the number of occurrences of the values in vals in x is at most val.

julia
@constraint(model, X in AtMost(val, vals))

source

',3))]),i("details",c,[i("summary",null,[s[12]||(s[12]=i("a",{id:"CBLS.Conflicts",href:"#CBLS.Conflicts"},[i("span",{class:"jlbinding"},"CBLS.Conflicts")],-1)),s[13]||(s[13]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[14]||(s[14]=l('

Global constraint ensuring that the tuple x does not match any configuration listed within the conflict set pair_vars. This constraint, originating from the extension model, stipulates that x must avoid all configurations defined as conflicts: x ∉ pair_vars. It is useful for specifying tuples that are explicitly forbidden and should be excluded from the solution space.

julia
@constraint(model, X in Conflicts(; pair_vars))

source

',3))]),i("details",y,[i("summary",null,[s[15]||(s[15]=i("a",{id:"CBLS.Count",href:"#CBLS.Count"},[i("span",{class:"jlbinding"},"CBLS.Count")],-1)),s[16]||(s[16]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[17]||(s[17]=l('

Global constraint ensuring that the number of occurrences of val in X is equal to count.

julia
@constraint(model, X in Count(count, val, vals))

source

',3))]),i("details",b,[i("summary",null,[s[18]||(s[18]=i("a",{id:"CBLS.Cumulative",href:"#CBLS.Cumulative"},[i("span",{class:"jlbinding"},"CBLS.Cumulative")],-1)),s[19]||(s[19]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[20]||(s[20]=l('

Global constraint ensuring that the cumulative sum of the heights of the tasks is less than or equal to val.

julia
@constraint(model, X in Cumulative(; pair_vars, op, val))

source

',3))]),i("details",E,[i("summary",null,[s[21]||(s[21]=i("a",{id:"CBLS.DiscreteSet",href:"#CBLS.DiscreteSet"},[i("span",{class:"jlbinding"},"CBLS.DiscreteSet")],-1)),s[22]||(s[22]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[23]||(s[23]=l('
julia
DiscreteSet(values)

Create a discrete set of values.

Arguments

  • values::Vector{T}: A vector of values to include in the set.

Returns

  • DiscreteSet{T}: A discrete set containing the specified values.

source

',7))]),i("details",C,[i("summary",null,[s[24]||(s[24]=i("a",{id:"CBLS.DistDifferent",href:"#CBLS.DistDifferent"},[i("span",{class:"jlbinding"},"CBLS.DistDifferent")],-1)),s[25]||(s[25]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[26]||(s[26]=i("p",null,[t("A constraint ensuring that the distances between marks on the ruler are unique. Specifically, it checks that the distance between "),i("code",null,"x[1]"),t(" and "),i("code",null,"x[2]"),t(", and the distance between "),i("code",null,"x[3]"),t(" and "),i("code",null,"x[4]"),t(", are different. This constraint is fundamental in ensuring the validity of a Golomb ruler, where no two pairs of marks should have the same distance between them.")],-1)),s[27]||(s[27]=i("p",null,[i("a",{href:"https://github.com/JuliaConstraints/CBLS.jl/blob/v0.2.2/src/constraints/intention.jl#L35-L37",target:"_blank",rel:"noreferrer"},"source")],-1))]),i("details",m,[i("summary",null,[s[28]||(s[28]=i("a",{id:"CBLS.Element",href:"#CBLS.Element"},[i("span",{class:"jlbinding"},"CBLS.Element")],-1)),s[29]||(s[29]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[30]||(s[30]=l('

Global constraint ensuring that the value of X at index id is equal to val.

julia
@constraint(model, X in Element(; id = nothing, op = ==, val = 0))

source

',3))]),i("details",F,[i("summary",null,[s[31]||(s[31]=i("a",{id:"CBLS.Error",href:"#CBLS.Error"},[i("span",{class:"jlbinding"},"CBLS.Error")],-1)),s[32]||(s[32]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[33]||(s[33]=l('
julia
Error{F <: Function} <: JuMP.AbstractVectorSet

The solver will compute a straightforward error function based on the concept. To run the solver efficiently, it is possible to provide an error function err instead of concept. err must return a nonnegative real number.

julia
@constraint(model, X in Error(err))

source

',4))]),i("details",j,[i("summary",null,[s[34]||(s[34]=i("a",{id:"CBLS.Exactly",href:"#CBLS.Exactly"},[i("span",{class:"jlbinding"},"CBLS.Exactly")],-1)),s[35]||(s[35]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[36]||(s[36]=l('

Constraint ensuring that the number of occurrences of the values in vals in x is exactly val.

julia
@constraint(model, X in Exactly(val, vals))

source

',3))]),i("details",v,[i("summary",null,[s[37]||(s[37]=i("a",{id:"CBLS.Extension",href:"#CBLS.Extension"},[i("span",{class:"jlbinding"},"CBLS.Extension")],-1)),s[38]||(s[38]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[39]||(s[39]=i("p",null,[t("Global constraint enforcing that the tuple "),i("code",null,"x"),t(" matches a configuration within the supports set "),i("code",null,"pair_vars[1]"),t(" or does not match any configuration within the conflicts set "),i("code",null,"pair_vars[2]"),t(". It embodies the logic: "),i("code",null,"x ∈ pair_vars[1] || x ∉ pair_vars[2]"),t(", providing a comprehensive way to define valid (supported) and invalid (conflicted) tuples for constraint satisfaction problems. This constraint is versatile, allowing for the explicit delineation of both acceptable and unacceptable configurations.")],-1)),s[40]||(s[40]=i("p",null,[i("a",{href:"https://github.com/JuliaConstraints/CBLS.jl/blob/v0.2.2/src/constraints/extension.jl#L41-L43",target:"_blank",rel:"noreferrer"},"source")],-1))]),i("details",f,[i("summary",null,[s[41]||(s[41]=i("a",{id:"CBLS.Instantiation",href:"#CBLS.Instantiation"},[i("span",{class:"jlbinding"},"CBLS.Instantiation")],-1)),s[42]||(s[42]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[43]||(s[43]=i("p",null,"The instantiation constraint is a global constraint used in constraint programming that ensures that a list of variables takes on a specific set of values in a specific order.",-1)),s[44]||(s[44]=i("p",null,[i("a",{href:"https://github.com/JuliaConstraints/CBLS.jl/blob/v0.2.2/src/constraints/instantiation.jl#L37-L39",target:"_blank",rel:"noreferrer"},"source")],-1))]),i("details",B,[i("summary",null,[s[45]||(s[45]=i("a",{id:"CBLS.Intention",href:"#CBLS.Intention"},[i("span",{class:"jlbinding"},"CBLS.Intention")],-1)),s[46]||(s[46]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[47]||(s[47]=l('
julia
Intention{F <: Function} <: JuMP.AbstractVectorSet

Represents an intention set in the model.

Arguments

  • f::F: A function representing the intention.

source

',5))]),i("details",O,[i("summary",null,[s[48]||(s[48]=i("a",{id:"CBLS.MDDConstraint",href:"#CBLS.MDDConstraint"},[i("span",{class:"jlbinding"},"CBLS.MDDConstraint")],-1)),s[49]||(s[49]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[50]||(s[50]=l('

Multi-valued Decision Diagram (MDD) constraint.

The MDD constraint is a constraint that can be used to model a wide range of problems. It is a directed graph where each node is labeled with a value and each edge is labeled with a value. The constraint is satisfied if there is a path from the first node to the last node such that the sequence of edge labels is a valid sequence of the value labels.

julia
@constraint(model, X in MDDConstraint(; language))

source

',4))]),i("details",L,[i("summary",null,[s[51]||(s[51]=i("a",{id:"CBLS.MOIAllDifferent",href:"#CBLS.MOIAllDifferent"},[i("span",{class:"jlbinding"},"CBLS.MOIAllDifferent")],-1)),s[52]||(s[52]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[53]||(s[53]=l('
julia
MOIAllDifferent <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",S,[i("summary",null,[s[54]||(s[54]=i("a",{id:"CBLS.MOIAllEqual",href:"#CBLS.MOIAllEqual"},[i("span",{class:"jlbinding"},"CBLS.MOIAllEqual")],-1)),s[55]||(s[55]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[56]||(s[56]=l('
julia
MOIAllEqual <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",I,[i("summary",null,[s[57]||(s[57]=i("a",{id:"CBLS.MOIConflicts",href:"#CBLS.MOIConflicts"},[i("span",{class:"jlbinding"},"CBLS.MOIConflicts")],-1)),s[58]||(s[58]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[59]||(s[59]=l('
julia
MOIConflicts{T <: Number, V <: Vector{Vector{T}}} <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",T,[i("summary",null,[s[60]||(s[60]=i("a",{id:"CBLS.MOICumulative",href:"#CBLS.MOICumulative"},[i("span",{class:"jlbinding"},"CBLS.MOICumulative")],-1)),s[61]||(s[61]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[62]||(s[62]=l('
julia
MOICumulative{F <: Function, T1 <: Number, T2 <: Number} <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",M,[i("summary",null,[s[63]||(s[63]=i("a",{id:"CBLS.MOIDistDifferent",href:"#CBLS.MOIDistDifferent"},[i("span",{class:"jlbinding"},"CBLS.MOIDistDifferent")],-1)),s[64]||(s[64]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[65]||(s[65]=l('
julia
MOIDistDifferent <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",A,[i("summary",null,[s[66]||(s[66]=i("a",{id:"CBLS.MOIElement",href:"#CBLS.MOIElement"},[i("span",{class:"jlbinding"},"CBLS.MOIElement")],-1)),s[67]||(s[67]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[68]||(s[68]=l('
julia
MOIElement{I <: Integer, F <: Function, T <: Union{Nothing, Number}} <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",D,[i("summary",null,[s[69]||(s[69]=i("a",{id:"CBLS.MOIError",href:"#CBLS.MOIError"},[i("span",{class:"jlbinding"},"CBLS.MOIError")],-1)),s[70]||(s[70]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[71]||(s[71]=l('
julia
MOIError{F <: Function} <: MOI.AbstractVectorSet

DOCSTRING

Arguments:

  • f::F: DESCRIPTION

  • dimension::Int: DESCRIPTION

  • MOIError(f, dim = 0) = begin #= none:5 =# new{typeof(f)}(f, dim) end: DESCRIPTION

source

',5))]),i("details",x,[i("summary",null,[s[72]||(s[72]=i("a",{id:"CBLS.MOIExtension",href:"#CBLS.MOIExtension"},[i("span",{class:"jlbinding"},"CBLS.MOIExtension")],-1)),s[73]||(s[73]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[74]||(s[74]=l(`
julia
MOIExtension{T <: Number, V <: Union{Vector{Vector{T}}, Tuple{Vector{T}, Vector{T}}}} <: MOI.AbstractVectorSet
+
+DOCSTRING

source

`,2))]),i("details",z,[i("summary",null,[s[75]||(s[75]=i("a",{id:"CBLS.MOIInstantiation",href:"#CBLS.MOIInstantiation"},[i("span",{class:"jlbinding"},"CBLS.MOIInstantiation")],-1)),s[76]||(s[76]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[77]||(s[77]=l('
julia
MOIInstantiation{T <: Number, V <: Vector{T}} <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",V,[i("summary",null,[s[78]||(s[78]=i("a",{id:"CBLS.MOIIntention",href:"#CBLS.MOIIntention"},[i("span",{class:"jlbinding"},"CBLS.MOIIntention")],-1)),s[79]||(s[79]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[80]||(s[80]=l('
julia
MOIIntention{F <: Function} <: MOI.AbstractVectorSet

Represents an intention set in the model.

Arguments

  • f::F: A function representing the intention.

  • dimension::Int: The dimension of the vector set.

source

',5))]),i("details",N,[i("summary",null,[s[81]||(s[81]=i("a",{id:"CBLS.MOIMaximum",href:"#CBLS.MOIMaximum"},[i("span",{class:"jlbinding"},"CBLS.MOIMaximum")],-1)),s[82]||(s[82]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[83]||(s[83]=l('
julia
MOIMaximum {F <: Function, T <: Number} <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",J,[i("summary",null,[s[84]||(s[84]=i("a",{id:"CBLS.MOIMinimum",href:"#CBLS.MOIMinimum"},[i("span",{class:"jlbinding"},"CBLS.MOIMinimum")],-1)),s[85]||(s[85]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[86]||(s[86]=l('
julia
MOIMinimum {F <: Function, T <: Number} <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",w,[i("summary",null,[s[87]||(s[87]=i("a",{id:"CBLS.MOIMultivaluedDecisionDiagram",href:"#CBLS.MOIMultivaluedDecisionDiagram"},[i("span",{class:"jlbinding"},"CBLS.MOIMultivaluedDecisionDiagram")],-1)),s[88]||(s[88]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[89]||(s[89]=l('
julia
MOIMultivaluedDecisionDiagram{L <: ConstraintCommons.AbstractMultivaluedDecisionDiagram} <: AbstractVectorSet

DOCSTRING

source

',3))]),i("details",R,[i("summary",null,[s[90]||(s[90]=i("a",{id:"CBLS.MOINValues",href:"#CBLS.MOINValues"},[i("span",{class:"jlbinding"},"CBLS.MOINValues")],-1)),s[91]||(s[91]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[92]||(s[92]=l('
julia
MOINValues{F <: Function, T1 <: Number, T2 <: Number, V <: Vector{T2}} <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",P,[i("summary",null,[s[93]||(s[93]=i("a",{id:"CBLS.MOINoOverlap",href:"#CBLS.MOINoOverlap"},[i("span",{class:"jlbinding"},"CBLS.MOINoOverlap")],-1)),s[94]||(s[94]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[95]||(s[95]=l('
julia
MOINoOverlap{I <: Integer, T <: Number, V <: Vector{T}} <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",G,[i("summary",null,[s[96]||(s[96]=i("a",{id:"CBLS.MOIOrdered",href:"#CBLS.MOIOrdered"},[i("span",{class:"jlbinding"},"CBLS.MOIOrdered")],-1)),s[97]||(s[97]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[98]||(s[98]=l('
julia
MOIOrdered{F <: Function, T <: Number, V <: Vector{T}} <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",X,[i("summary",null,[s[99]||(s[99]=i("a",{id:"CBLS.MOIRegular",href:"#CBLS.MOIRegular"},[i("span",{class:"jlbinding"},"CBLS.MOIRegular")],-1)),s[100]||(s[100]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[101]||(s[101]=l('
julia
MOIRegular{L <: ConstraintCommons.AbstractAutomaton} <: AbstractVectorSet

DOCSTRING

source

',3))]),i("details",U,[i("summary",null,[s[102]||(s[102]=i("a",{id:"CBLS.MOISum",href:"#CBLS.MOISum"},[i("span",{class:"jlbinding"},"CBLS.MOISum")],-1)),s[103]||(s[103]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[104]||(s[104]=l('
julia
MOISum{F <: Function, T1 <: Number, T2 <: Number, V <: Number} <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",q,[i("summary",null,[s[105]||(s[105]=i("a",{id:"CBLS.MOISupports",href:"#CBLS.MOISupports"},[i("span",{class:"jlbinding"},"CBLS.MOISupports")],-1)),s[106]||(s[106]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[107]||(s[107]=l('
julia
MOISupports{T <: Number, V <: Vector{Vector{T}}} <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",$,[i("summary",null,[s[108]||(s[108]=i("a",{id:"CBLS.Maximum",href:"#CBLS.Maximum"},[i("span",{class:"jlbinding"},"CBLS.Maximum")],-1)),s[109]||(s[109]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[110]||(s[110]=l('

Global constraint ensuring that the maximum value in the tuple x satisfies the condition op(x) val. This constraint is useful for specifying that the maximum value in the tuple must satisfy a certain condition.

julia
@constraint(model, X in Maximum(; op = ==, val))

source

',3))]),i("details",W,[i("summary",null,[s[111]||(s[111]=i("a",{id:"CBLS.Minimum",href:"#CBLS.Minimum"},[i("span",{class:"jlbinding"},"CBLS.Minimum")],-1)),s[112]||(s[112]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[113]||(s[113]=l('

Global constraint ensuring that the minimum value in the tuple x satisfies the condition op(x) val. This constraint is useful for specifying that the minimum value in the tuple must satisfy a certain condition.

julia
@constraint(model, X in Minimum(; op = ==, val))

source

',3))]),i("details",H,[i("summary",null,[s[114]||(s[114]=i("a",{id:"CBLS.NValues",href:"#CBLS.NValues"},[i("span",{class:"jlbinding"},"CBLS.NValues")],-1)),s[115]||(s[115]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[116]||(s[116]=i("p",null,[t("Global constraint ensuring that the number of distinct values in "),i("code",null,"X"),t(" satisfies the given condition.")],-1)),s[117]||(s[117]=i("p",null,[i("a",{href:"https://github.com/JuliaConstraints/CBLS.jl/blob/v0.2.2/src/constraints/n_values.jl#L43-L45",target:"_blank",rel:"noreferrer"},"source")],-1))]),i("details",K,[i("summary",null,[s[118]||(s[118]=i("a",{id:"CBLS.NoOverlap",href:"#CBLS.NoOverlap"},[i("span",{class:"jlbinding"},"CBLS.NoOverlap")],-1)),s[119]||(s[119]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[120]||(s[120]=l('

Global constraint ensuring that the tuple x does not overlap with any configuration listed within the pair set pair_vars. This constraint, originating from the extension model, stipulates that x must avoid all configurations defined as pairs: x ∩ pair_vars = ∅. It is useful for specifying tuples that are explicitly forbidden and should be excluded from the solution space.

julia
@constraint(model, X in NoOverlap(; bool = true, dim = 1, pair_vars = nothing))

source

',3))]),i("details",Q,[i("summary",null,[s[121]||(s[121]=i("a",{id:"CBLS.Optimizer",href:"#CBLS.Optimizer"},[i("span",{class:"jlbinding"},"CBLS.Optimizer")],-1)),s[122]||(s[122]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[123]||(s[123]=l('
julia
Optimizer(model = Model(); options = Options())

Create an instance of the Optimizer.

Arguments

  • model: The model to be optimized.

  • options::Options: Options for configuring the solver.

Returns

  • Optimizer: An instance of the optimizer.

source

',7))]),i("details",Y,[i("summary",null,[s[124]||(s[124]=i("a",{id:"CBLS.Optimizer-2",href:"#CBLS.Optimizer-2"},[i("span",{class:"jlbinding"},"CBLS.Optimizer")],-1)),s[125]||(s[125]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[126]||(s[126]=l('
julia
Optimizer <: MOI.AbstractOptimizer

Defines an optimizer for CBLS.

Fields

  • solver::LS.MainSolver: The main solver used for local search.

  • int_vars::Set{Int}: Set of integer variables.

  • compare_vars::Set{Int}: Set of variables to compare.

source

',5))]),i("details",Z,[i("summary",null,[s[127]||(s[127]=i("a",{id:"CBLS.Ordered",href:"#CBLS.Ordered"},[i("span",{class:"jlbinding"},"CBLS.Ordered")],-1)),s[128]||(s[128]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[129]||(s[129]=i("p",null,[t("Global constraint ensuring that the variables are ordered according to "),i("code",null,"op"),t(".")],-1)),s[130]||(s[130]=i("p",null,[i("a",{href:"https://github.com/JuliaConstraints/CBLS.jl/blob/v0.2.2/src/constraints/ordered.jl#L45-L47",target:"_blank",rel:"noreferrer"},"source")],-1))]),i("details",_,[i("summary",null,[s[131]||(s[131]=i("a",{id:"CBLS.Predicate",href:"#CBLS.Predicate"},[i("span",{class:"jlbinding"},"CBLS.Predicate")],-1)),s[132]||(s[132]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[133]||(s[133]=l('
julia
Predicate{F <: Function} <: JuMP.AbstractVectorSet

Deprecated: Use Intention instead.

Represents a predicate set in the model.

Arguments

  • f::F: A function representing the predicate.

source

',6))]),i("details",ss,[i("summary",null,[s[134]||(s[134]=i("a",{id:"CBLS.Regular",href:"#CBLS.Regular"},[i("span",{class:"jlbinding"},"CBLS.Regular")],-1)),s[135]||(s[135]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[136]||(s[136]=l('

Ensures that a sequence x (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of x with the language rules encoded within the automaton parameter, which must be an instance of <:AbstractAutomaton.

julia
@constraint(model, X in RegularConstraint(; language))

source

',3))]),i("details",is,[i("summary",null,[s[137]||(s[137]=i("a",{id:"CBLS.ScalarFunction",href:"#CBLS.ScalarFunction"},[i("span",{class:"jlbinding"},"CBLS.ScalarFunction")],-1)),s[138]||(s[138]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[139]||(s[139]=l(`
julia
ScalarFunction{F <: Function, V <: Union{Nothing, VOV}} <: MOI.AbstractScalarFunction

A container to express any function with real value in JuMP syntax. Used with the @objective macro.

Arguments:

  • f::F: function to be applied to X

  • X::V: a subset of the variables of the model.

Given a model, and some (collection of) variables X to optimize. an objective function f can be added as follows. Note that only Min for minimization us currently defined. Max will come soon.

julia
# Applies to all variables in order of insertion.
+# Recommended only when the function argument order does not matter.
+@objective(model, ScalarFunction(f))
+
+# Generic use
+@objective(model, ScalarFunction(f, X))

source

`,7))]),i("details",ts,[i("summary",null,[s[140]||(s[140]=i("a",{id:"CBLS.Sum",href:"#CBLS.Sum"},[i("span",{class:"jlbinding"},"CBLS.Sum")],-1)),s[141]||(s[141]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[142]||(s[142]=i("p",null,[t("Global constraint ensuring that the sum of the variables in "),i("code",null,"x"),t(" satisfies a given condition.")],-1)),s[143]||(s[143]=i("p",null,[i("a",{href:"https://github.com/JuliaConstraints/CBLS.jl/blob/v0.2.2/src/constraints/sum.jl#L46-L48",target:"_blank",rel:"noreferrer"},"source")],-1))]),i("details",as,[i("summary",null,[s[144]||(s[144]=i("a",{id:"CBLS.Supports",href:"#CBLS.Supports"},[i("span",{class:"jlbinding"},"CBLS.Supports")],-1)),s[145]||(s[145]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[146]||(s[146]=l('

Global constraint ensuring that the tuple x matches a configuration listed within the support set pair_vars. This constraint is derived from the extension model, specifying that x must be one of the explicitly defined supported configurations: x ∈ pair_vars. It is utilized to directly declare the tuples that are valid and should be included in the solution space.

julia
@constraint(model, X in Supports(; pair_vars))

source

',3))]),i("details",es,[i("summary",null,[s[147]||(s[147]=i("a",{id:"Base.copy-Tuple{CBLS.MOIError}",href:"#Base.copy-Tuple{CBLS.MOIError}"},[i("span",{class:"jlbinding"},"Base.copy")],-1)),s[148]||(s[148]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[149]||(s[149]=l('
julia
Base.copy(set::MOIError) = begin

DOCSTRING

source

',3))]),i("details",ls,[i("summary",null,[s[150]||(s[150]=i("a",{id:"Base.copy-Tuple{CBLS.MOIIntention}",href:"#Base.copy-Tuple{CBLS.MOIIntention}"},[i("span",{class:"jlbinding"},"Base.copy")],-1)),s[151]||(s[151]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[152]||(s[152]=l('
julia
Base.copy(set::MOIIntention)

Copy an intention set.

Arguments

  • set::MOIIntention: The intention set to be copied.

Returns

  • MOIIntention: A copy of the intention set.

source

',7))]),i("details",ns,[i("summary",null,[s[153]||(s[153]=i("a",{id:"Base.copy-Tuple{DiscreteSet}",href:"#Base.copy-Tuple{DiscreteSet}"},[i("span",{class:"jlbinding"},"Base.copy")],-1)),s[154]||(s[154]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[155]||(s[155]=l('
julia
Base.copy(set::DiscreteSet)

Copy a discrete set.

Arguments

  • set::DiscreteSet: The discrete set to be copied.

Returns

  • DiscreteSet: A copy of the discrete set.

source

',7))]),i("details",ps,[i("summary",null,[s[156]||(s[156]=i("a",{id:"Base.copy-Tuple{F} where F<:Function",href:"#Base.copy-Tuple{F} where F<:Function"},[i("span",{class:"jlbinding"},"Base.copy")],-1)),s[157]||(s[157]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[158]||(s[158]=l('
julia
Base.copy(op::F) where {F <: Function}

Copy a function.

Arguments

  • op::F: The function to be copied.

Returns

  • F: The copied function.

source

',7))]),i("details",rs,[i("summary",null,[s[159]||(s[159]=i("a",{id:"Base.copy-Tuple{Nothing}",href:"#Base.copy-Tuple{Nothing}"},[i("span",{class:"jlbinding"},"Base.copy")],-1)),s[160]||(s[160]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[161]||(s[161]=l('
julia
Base.copy(::Nothing)

Copy a Nothing value.

Arguments

  • ::Nothing: The Nothing value to be copied.

Returns

  • Nothing: The copied Nothing value.

source

',7))]),i("details",os,[i("summary",null,[s[162]||(s[162]=i("a",{id:"JuMP.build_variable-Union{Tuple{T}, Tuple{Function, JuMP.VariableInfo, T}} where T<:MathOptInterface.AbstractScalarSet",href:"#JuMP.build_variable-Union{Tuple{T}, Tuple{Function, JuMP.VariableInfo, T}} where T<:MathOptInterface.AbstractScalarSet"},[i("span",{class:"jlbinding"},"JuMP.build_variable")],-1)),s[163]||(s[163]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[164]||(s[164]=l('
julia
JuMP.build_variable(::Function, info::JuMP.VariableInfo, set::T) where T <: MOI.AbstractScalarSet

Create a variable constrained by a scalar set.

Arguments

  • info::JuMP.VariableInfo: Information about the variable to be created.

  • set::T where T <: MOI.AbstractScalarSet: The set defining the constraints on the variable.

Returns

  • JuMP.VariableConstrainedOnCreation: A variable constrained by the specified set.

source

',7))]),i("details",hs,[i("summary",null,[s[165]||(s[165]=i("a",{id:"JuMP.moi_set-Tuple{Intention, Int64}",href:"#JuMP.moi_set-Tuple{Intention, Int64}"},[i("span",{class:"jlbinding"},"JuMP.moi_set")],-1)),s[166]||(s[166]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[167]||(s[167]=l('
julia
JuMP.moi_set(set::Intention, dim::Int) -> MOIIntention

Convert an Intention set to a MOIIntention set.

Arguments

  • set::Intention: The intention set to be converted.

  • dim::Int: The dimension of the vector set.

Returns

  • MOIIntention: The converted MOIIntention set.

source

',7))]),i("details",ds,[i("summary",null,[s[168]||(s[168]=i("a",{id:"JuMP.moi_set-Tuple{Predicate, Int64}",href:"#JuMP.moi_set-Tuple{Predicate, Int64}"},[i("span",{class:"jlbinding"},"JuMP.moi_set")],-1)),s[169]||(s[169]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[170]||(s[170]=l('
julia
JuMP.moi_set(set::Predicate, dim::Int) -> MOIIntention

Convert a Predicate set to a MOIIntention set.

Arguments

  • set::Predicate: The predicate set to be converted.

  • dim::Int: The dimension of the vector set.

Returns

  • MOIIntention: The converted MOIIntention set.

source

',7))]),i("details",ks,[i("summary",null,[s[171]||(s[171]=i("a",{id:"MathOptInterface.add_constraint-Union{Tuple{F}, Tuple{CBLS.Optimizer, MathOptInterface.VectorOfVariables, CBLS.MOIError{F}}} where F<:Function",href:"#MathOptInterface.add_constraint-Union{Tuple{F}, Tuple{CBLS.Optimizer, MathOptInterface.VectorOfVariables, CBLS.MOIError{F}}} where F<:Function"},[i("span",{class:"jlbinding"},"MathOptInterface.add_constraint")],-1)),s[172]||(s[172]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[173]||(s[173]=l('
julia
MOI.add_constraint(optimizer::Optimizer, vars::MOI.VectorOfVariables, set::MOIError)

DOCSTRING

Arguments:

  • optimizer: DESCRIPTION

  • vars: DESCRIPTION

  • set: DESCRIPTION

source

',5))]),i("details",gs,[i("summary",null,[s[174]||(s[174]=i("a",{id:"MathOptInterface.add_constraint-Union{Tuple{F}, Tuple{CBLS.Optimizer, MathOptInterface.VectorOfVariables, CBLS.MOIIntention{F}}} where F<:Function",href:"#MathOptInterface.add_constraint-Union{Tuple{F}, Tuple{CBLS.Optimizer, MathOptInterface.VectorOfVariables, CBLS.MOIIntention{F}}} where F<:Function"},[i("span",{class:"jlbinding"},"MathOptInterface.add_constraint")],-1)),s[175]||(s[175]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[176]||(s[176]=l('
julia
MOI.add_constraint(optimizer::Optimizer, vars::MOI.VectorOfVariables, set::MOIIntention{F}) where {F <: Function}

Add an intention constraint to the optimizer.

Arguments

  • optimizer::Optimizer: The optimizer instance.

  • vars::MOI.VectorOfVariables: The variables for the constraint.

  • set::MOIIntention{F}: The intention set defining the constraint.

Returns

  • CI{VOV, MOIIntention{F}}: The constraint index.

source

',7))]),i("details",us,[i("summary",null,[s[177]||(s[177]=i("a",{id:"MathOptInterface.add_constraint-Union{Tuple{T}, Tuple{CBLS.Optimizer, MathOptInterface.VariableIndex, DiscreteSet{T}}} where T<:Number",href:"#MathOptInterface.add_constraint-Union{Tuple{T}, Tuple{CBLS.Optimizer, MathOptInterface.VariableIndex, DiscreteSet{T}}} where T<:Number"},[i("span",{class:"jlbinding"},"MathOptInterface.add_constraint")],-1)),s[178]||(s[178]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[179]||(s[179]=l('
julia
MOI.add_constraint(optimizer::Optimizer, v::VI, set::DiscreteSet{T}) where T <: Number

DOCSTRING

Arguments:

  • optimizer: DESCRIPTION

  • v: DESCRIPTION

  • set: DESCRIPTION

source

',5))]),i("details",cs,[i("summary",null,[s[180]||(s[180]=i("a",{id:"MathOptInterface.add_variable-Tuple{CBLS.Optimizer}",href:"#MathOptInterface.add_variable-Tuple{CBLS.Optimizer}"},[i("span",{class:"jlbinding"},"MathOptInterface.add_variable")],-1)),s[181]||(s[181]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[182]||(s[182]=l('
julia
MOI.add_variable(model::Optimizer) = begin

DOCSTRING

source

',3))]),i("details",ys,[i("summary",null,[s[183]||(s[183]=i("a",{id:"MathOptInterface.copy_to-Tuple{CBLS.Optimizer, MathOptInterface.ModelLike}",href:"#MathOptInterface.copy_to-Tuple{CBLS.Optimizer, MathOptInterface.ModelLike}"},[i("span",{class:"jlbinding"},"MathOptInterface.copy_to")],-1)),s[184]||(s[184]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[185]||(s[185]=l('
julia
MOI.copy_to(model::Optimizer, src::MOI.ModelLike)

Copy the source model to the optimizer.

Arguments

  • model::Optimizer: The optimizer instance.

  • src::MOI.ModelLike: The source model to be copied.

Returns

  • Nothing

source

',7))]),i("details",bs,[i("summary",null,[s[186]||(s[186]=i("a",{id:"MathOptInterface.empty!-Tuple{Any}",href:"#MathOptInterface.empty!-Tuple{Any}"},[i("span",{class:"jlbinding"},"MathOptInterface.empty!")],-1)),s[187]||(s[187]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[188]||(s[188]=l('
julia
MOI.empty!(opt)

Empty the optimizer.

Arguments

  • opt::Optimizer: The optimizer instance.

Returns

  • Nothing

source

',7))]),i("details",Es,[i("summary",null,[s[189]||(s[189]=i("a",{id:"MathOptInterface.get-Tuple{CBLS.Optimizer, MathOptInterface.SolverName}",href:"#MathOptInterface.get-Tuple{CBLS.Optimizer, MathOptInterface.SolverName}"},[i("span",{class:"jlbinding"},"MathOptInterface.get")],-1)),s[190]||(s[190]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[191]||(s[191]=l('
julia
MOI.get(::Optimizer, ::MOI.SolverName)

Get the name of the solver.

Arguments

  • ::Optimizer: The optimizer instance.

Returns

  • String: The name of the solver.

source

',7))]),i("details",Cs,[i("summary",null,[s[192]||(s[192]=i("a",{id:"MathOptInterface.get-Tuple{CBLS.Optimizer, MathOptInterface.SolverVersion}",href:"#MathOptInterface.get-Tuple{CBLS.Optimizer, MathOptInterface.SolverVersion}"},[i("span",{class:"jlbinding"},"MathOptInterface.get")],-1)),s[193]||(s[193]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[194]||(s[194]=l('
julia
Moi.get(::Optimizer, ::MOI.SolverVersion)

Get the version of the solver, here LocalSearchSolvers.jl.

source

',3))]),i("details",ms,[i("summary",null,[s[195]||(s[195]=i("a",{id:"MathOptInterface.is_empty-Tuple{CBLS.Optimizer}",href:"#MathOptInterface.is_empty-Tuple{CBLS.Optimizer}"},[i("span",{class:"jlbinding"},"MathOptInterface.is_empty")],-1)),s[196]||(s[196]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[197]||(s[197]=l('
julia
MOI.is_empty(model::Optimizer)

Check if the model is empty.

Arguments

  • model::Optimizer: The optimizer instance.

Returns

  • Bool: True if the model is empty, false otherwise.

source

',7))]),i("details",Fs,[i("summary",null,[s[198]||(s[198]=i("a",{id:"MathOptInterface.is_valid-Tuple{CBLS.Optimizer, MathOptInterface.ConstraintIndex{MathOptInterface.VariableIndex, MathOptInterface.Integer}}",href:"#MathOptInterface.is_valid-Tuple{CBLS.Optimizer, MathOptInterface.ConstraintIndex{MathOptInterface.VariableIndex, MathOptInterface.Integer}}"},[i("span",{class:"jlbinding"},"MathOptInterface.is_valid")],-1)),s[199]||(s[199]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[200]||(s[200]=l('
julia
MOI.is_valid(optimizer::Optimizer, index::CI{VI, MOI.Integer})

Check if an index is valid for the optimizer.

Arguments

  • optimizer::Optimizer: The optimizer instance.

  • index::CI{VI, MOI.Integer}: The index to be checked.

Returns

  • Bool: True if the index is valid, false otherwise.

source

',7))]),i("details",js,[i("summary",null,[s[201]||(s[201]=i("a",{id:"MathOptInterface.optimize!-Tuple{CBLS.Optimizer}",href:"#MathOptInterface.optimize!-Tuple{CBLS.Optimizer}"},[i("span",{class:"jlbinding"},"MathOptInterface.optimize!")],-1)),s[202]||(s[202]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[203]||(s[203]=l('
julia
MOI.optimize!(model::Optimizer)

Optimize the model using the optimizer.

Arguments

  • model::Optimizer: The optimizer instance.

Returns

  • Nothing

source

',7))]),i("details",vs,[i("summary",null,[s[204]||(s[204]=i("a",{id:"MathOptInterface.set",href:"#MathOptInterface.set"},[i("span",{class:"jlbinding"},"MathOptInterface.set")],-1)),s[205]||(s[205]=t()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[206]||(s[206]=l('
julia
MOI.set(::Optimizer, ::MOI.Silent, bool = true)

Set the verbosity of the solver.

Arguments

  • ::Optimizer: The optimizer instance.

  • ::MOI.Silent: The silent option for the solver.

  • bool::Bool: Whether to set the solver to silent mode.

Returns

  • Nothing

source

',7))]),i("details",fs,[i("summary",null,[s[207]||(s[207]=i("a",{id:"MathOptInterface.set-Tuple{CBLS.Optimizer, MathOptInterface.RawOptimizerAttribute, Any}",href:"#MathOptInterface.set-Tuple{CBLS.Optimizer, MathOptInterface.RawOptimizerAttribute, Any}"},[i("span",{class:"jlbinding"},"MathOptInterface.set")],-1)),s[208]||(s[208]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[209]||(s[209]=l('
julia
MOI.set(model::Optimizer, p::MOI.RawOptimizerAttribute, value)

Set a RawOptimizerAttribute to value

source

',3))]),i("details",Bs,[i("summary",null,[s[210]||(s[210]=i("a",{id:"MathOptInterface.set-Tuple{CBLS.Optimizer, MathOptInterface.TimeLimitSec, Union{Nothing, Float64}}",href:"#MathOptInterface.set-Tuple{CBLS.Optimizer, MathOptInterface.TimeLimitSec, Union{Nothing, Float64}}"},[i("span",{class:"jlbinding"},"MathOptInterface.set")],-1)),s[211]||(s[211]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[212]||(s[212]=l('
julia
MOI.set(model::Optimizer, ::MOI.TimeLimitSec, value::Union{Nothing,Float64})

Set the time limit

source

',3))]),i("details",Os,[i("summary",null,[s[213]||(s[213]=i("a",{id:"MathOptInterface.supports_constraint-Union{Tuple{F}, Tuple{CBLS.Optimizer, Type{MathOptInterface.VectorOfVariables}, Type{CBLS.MOIError{F}}}} where F<:Function",href:"#MathOptInterface.supports_constraint-Union{Tuple{F}, Tuple{CBLS.Optimizer, Type{MathOptInterface.VectorOfVariables}, Type{CBLS.MOIError{F}}}} where F<:Function"},[i("span",{class:"jlbinding"},"MathOptInterface.supports_constraint")],-1)),s[214]||(s[214]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[215]||(s[215]=l('
julia
MOI.supports_constraint(::Optimizer, ::Type{VOV}, ::Type{MOIError}) = begin

DOCSTRING

Arguments:

  • ``: DESCRIPTION

  • ``: DESCRIPTION

  • ``: DESCRIPTION

source

',5))]),i("details",Ls,[i("summary",null,[s[216]||(s[216]=i("a",{id:"MathOptInterface.supports_constraint-Union{Tuple{F}, Tuple{CBLS.Optimizer, Type{MathOptInterface.VectorOfVariables}, Type{CBLS.MOIIntention{F}}}} where F<:Function",href:"#MathOptInterface.supports_constraint-Union{Tuple{F}, Tuple{CBLS.Optimizer, Type{MathOptInterface.VectorOfVariables}, Type{CBLS.MOIIntention{F}}}} where F<:Function"},[i("span",{class:"jlbinding"},"MathOptInterface.supports_constraint")],-1)),s[217]||(s[217]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[218]||(s[218]=l('
julia
MOI.supports_constraint(::Optimizer, ::Type{VOV}, ::Type{MOIIntention{F}}) where {F <: Function}

Check if the optimizer supports a given intention constraint.

Arguments

  • ::Optimizer: The optimizer instance.

  • ::Type{VOV}: The type of the variable.

  • ::Type{MOIIntention{F}}: The type of the intention.

Returns

  • Bool: True if the optimizer supports the constraint, false otherwise.

source

',7))]),i("details",Ss,[i("summary",null,[s[219]||(s[219]=i("a",{id:"MathOptInterface.supports_incremental_interface-Tuple{CBLS.Optimizer}",href:"#MathOptInterface.supports_incremental_interface-Tuple{CBLS.Optimizer}"},[i("span",{class:"jlbinding"},"MathOptInterface.supports_incremental_interface")],-1)),s[220]||(s[220]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[221]||(s[221]=l('
julia
MOI.supports_incremental_interface(::Optimizer)

Check if the optimizer supports incremental interface.

Arguments

  • ::Optimizer: The optimizer instance.

Returns

  • Bool: True if the optimizer supports incremental interface, false otherwise.

source

',7))])])}const Ns=n(h,[["render",Is]]);export{Vs as __pageData,Ns as default}; diff --git a/dev/assets/solvers_10_cbls.md.BCa7hnj8.lean.js b/dev/assets/solvers_10_cbls.md.BCa7hnj8.lean.js new file mode 100644 index 0000000..397544a --- /dev/null +++ b/dev/assets/solvers_10_cbls.md.BCa7hnj8.lean.js @@ -0,0 +1,8 @@ +import{_ as n,c as p,j as i,a as t,G as e,a5 as l,B as r,o}from"./chunks/framework.CJakPlgM.js";const Vs=JSON.parse('{"title":"CBLS.jl","description":"","frontmatter":{},"headers":[],"relativePath":"solvers/10_cbls.md","filePath":"solvers/10_cbls.md","lastUpdated":null}'),h={name:"solvers/10_cbls.md"},d={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},O={class:"jldocstring custom-block",open:""},L={class:"jldocstring custom-block",open:""},S={class:"jldocstring custom-block",open:""},I={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},M={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},z={class:"jldocstring custom-block",open:""},V={class:"jldocstring custom-block",open:""},N={class:"jldocstring custom-block",open:""},J={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""},R={class:"jldocstring custom-block",open:""},P={class:"jldocstring custom-block",open:""},G={class:"jldocstring custom-block",open:""},X={class:"jldocstring custom-block",open:""},U={class:"jldocstring custom-block",open:""},q={class:"jldocstring custom-block",open:""},$={class:"jldocstring custom-block",open:""},W={class:"jldocstring custom-block",open:""},H={class:"jldocstring custom-block",open:""},K={class:"jldocstring custom-block",open:""},Q={class:"jldocstring custom-block",open:""},Y={class:"jldocstring custom-block",open:""},Z={class:"jldocstring custom-block",open:""},_={class:"jldocstring custom-block",open:""},ss={class:"jldocstring custom-block",open:""},is={class:"jldocstring custom-block",open:""},ts={class:"jldocstring custom-block",open:""},as={class:"jldocstring custom-block",open:""},es={class:"jldocstring custom-block",open:""},ls={class:"jldocstring custom-block",open:""},ns={class:"jldocstring custom-block",open:""},ps={class:"jldocstring custom-block",open:""},rs={class:"jldocstring custom-block",open:""},os={class:"jldocstring custom-block",open:""},hs={class:"jldocstring custom-block",open:""},ds={class:"jldocstring custom-block",open:""},ks={class:"jldocstring custom-block",open:""},gs={class:"jldocstring custom-block",open:""},us={class:"jldocstring custom-block",open:""},cs={class:"jldocstring custom-block",open:""},ys={class:"jldocstring custom-block",open:""},bs={class:"jldocstring custom-block",open:""},Es={class:"jldocstring custom-block",open:""},Cs={class:"jldocstring custom-block",open:""},ms={class:"jldocstring custom-block",open:""},Fs={class:"jldocstring custom-block",open:""},js={class:"jldocstring custom-block",open:""},vs={class:"jldocstring custom-block",open:""},fs={class:"jldocstring custom-block",open:""},Bs={class:"jldocstring custom-block",open:""},Os={class:"jldocstring custom-block",open:""},Ls={class:"jldocstring custom-block",open:""},Ss={class:"jldocstring custom-block",open:""};function Is(Ts,s,Ms,As,Ds,xs){const a=r("Badge");return o(),p("div",null,[s[222]||(s[222]=i("h1",{id:"cbls-jl",tabindex:"-1"},[t("CBLS.jl "),i("a",{class:"header-anchor",href:"#cbls-jl","aria-label":'Permalink to "CBLS.jl"'},"​")],-1)),s[223]||(s[223]=i("p",null,[t("Documentation for "),i("code",null,"CBLS.jl"),t(".")],-1)),i("details",d,[i("summary",null,[s[0]||(s[0]=i("a",{id:"CBLS.AllDifferent",href:"#CBLS.AllDifferent"},[i("span",{class:"jlbinding"},"CBLS.AllDifferent")],-1)),s[1]||(s[1]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=l('

Global constraint ensuring that all the values of a given configuration are unique.

julia
@constraint(model, X in AllDifferent())

source

',3))]),i("details",k,[i("summary",null,[s[3]||(s[3]=i("a",{id:"CBLS.AllEqual",href:"#CBLS.AllEqual"},[i("span",{class:"jlbinding"},"CBLS.AllEqual")],-1)),s[4]||(s[4]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[5]||(s[5]=l('

Global constraint ensuring that all the values of X are all equal.

julia
@constraint(model, X in AllEqual())

source

',3))]),i("details",g,[i("summary",null,[s[6]||(s[6]=i("a",{id:"CBLS.AtLeast",href:"#CBLS.AtLeast"},[i("span",{class:"jlbinding"},"CBLS.AtLeast")],-1)),s[7]||(s[7]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[8]||(s[8]=l('

Constraint ensuring that the number of occurrences of the values in vals in x is at least val.

julia
@constraint(model, X in AtLeast(val, vals))

source

',3))]),i("details",u,[i("summary",null,[s[9]||(s[9]=i("a",{id:"CBLS.AtMost",href:"#CBLS.AtMost"},[i("span",{class:"jlbinding"},"CBLS.AtMost")],-1)),s[10]||(s[10]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[11]||(s[11]=l('

Constraint ensuring that the number of occurrences of the values in vals in x is at most val.

julia
@constraint(model, X in AtMost(val, vals))

source

',3))]),i("details",c,[i("summary",null,[s[12]||(s[12]=i("a",{id:"CBLS.Conflicts",href:"#CBLS.Conflicts"},[i("span",{class:"jlbinding"},"CBLS.Conflicts")],-1)),s[13]||(s[13]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[14]||(s[14]=l('

Global constraint ensuring that the tuple x does not match any configuration listed within the conflict set pair_vars. This constraint, originating from the extension model, stipulates that x must avoid all configurations defined as conflicts: x ∉ pair_vars. It is useful for specifying tuples that are explicitly forbidden and should be excluded from the solution space.

julia
@constraint(model, X in Conflicts(; pair_vars))

source

',3))]),i("details",y,[i("summary",null,[s[15]||(s[15]=i("a",{id:"CBLS.Count",href:"#CBLS.Count"},[i("span",{class:"jlbinding"},"CBLS.Count")],-1)),s[16]||(s[16]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[17]||(s[17]=l('

Global constraint ensuring that the number of occurrences of val in X is equal to count.

julia
@constraint(model, X in Count(count, val, vals))

source

',3))]),i("details",b,[i("summary",null,[s[18]||(s[18]=i("a",{id:"CBLS.Cumulative",href:"#CBLS.Cumulative"},[i("span",{class:"jlbinding"},"CBLS.Cumulative")],-1)),s[19]||(s[19]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[20]||(s[20]=l('

Global constraint ensuring that the cumulative sum of the heights of the tasks is less than or equal to val.

julia
@constraint(model, X in Cumulative(; pair_vars, op, val))

source

',3))]),i("details",E,[i("summary",null,[s[21]||(s[21]=i("a",{id:"CBLS.DiscreteSet",href:"#CBLS.DiscreteSet"},[i("span",{class:"jlbinding"},"CBLS.DiscreteSet")],-1)),s[22]||(s[22]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[23]||(s[23]=l('
julia
DiscreteSet(values)

Create a discrete set of values.

Arguments

  • values::Vector{T}: A vector of values to include in the set.

Returns

  • DiscreteSet{T}: A discrete set containing the specified values.

source

',7))]),i("details",C,[i("summary",null,[s[24]||(s[24]=i("a",{id:"CBLS.DistDifferent",href:"#CBLS.DistDifferent"},[i("span",{class:"jlbinding"},"CBLS.DistDifferent")],-1)),s[25]||(s[25]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[26]||(s[26]=i("p",null,[t("A constraint ensuring that the distances between marks on the ruler are unique. Specifically, it checks that the distance between "),i("code",null,"x[1]"),t(" and "),i("code",null,"x[2]"),t(", and the distance between "),i("code",null,"x[3]"),t(" and "),i("code",null,"x[4]"),t(", are different. This constraint is fundamental in ensuring the validity of a Golomb ruler, where no two pairs of marks should have the same distance between them.")],-1)),s[27]||(s[27]=i("p",null,[i("a",{href:"https://github.com/JuliaConstraints/CBLS.jl/blob/v0.2.2/src/constraints/intention.jl#L35-L37",target:"_blank",rel:"noreferrer"},"source")],-1))]),i("details",m,[i("summary",null,[s[28]||(s[28]=i("a",{id:"CBLS.Element",href:"#CBLS.Element"},[i("span",{class:"jlbinding"},"CBLS.Element")],-1)),s[29]||(s[29]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[30]||(s[30]=l('

Global constraint ensuring that the value of X at index id is equal to val.

julia
@constraint(model, X in Element(; id = nothing, op = ==, val = 0))

source

',3))]),i("details",F,[i("summary",null,[s[31]||(s[31]=i("a",{id:"CBLS.Error",href:"#CBLS.Error"},[i("span",{class:"jlbinding"},"CBLS.Error")],-1)),s[32]||(s[32]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[33]||(s[33]=l('
julia
Error{F <: Function} <: JuMP.AbstractVectorSet

The solver will compute a straightforward error function based on the concept. To run the solver efficiently, it is possible to provide an error function err instead of concept. err must return a nonnegative real number.

julia
@constraint(model, X in Error(err))

source

',4))]),i("details",j,[i("summary",null,[s[34]||(s[34]=i("a",{id:"CBLS.Exactly",href:"#CBLS.Exactly"},[i("span",{class:"jlbinding"},"CBLS.Exactly")],-1)),s[35]||(s[35]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[36]||(s[36]=l('

Constraint ensuring that the number of occurrences of the values in vals in x is exactly val.

julia
@constraint(model, X in Exactly(val, vals))

source

',3))]),i("details",v,[i("summary",null,[s[37]||(s[37]=i("a",{id:"CBLS.Extension",href:"#CBLS.Extension"},[i("span",{class:"jlbinding"},"CBLS.Extension")],-1)),s[38]||(s[38]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[39]||(s[39]=i("p",null,[t("Global constraint enforcing that the tuple "),i("code",null,"x"),t(" matches a configuration within the supports set "),i("code",null,"pair_vars[1]"),t(" or does not match any configuration within the conflicts set "),i("code",null,"pair_vars[2]"),t(". It embodies the logic: "),i("code",null,"x ∈ pair_vars[1] || x ∉ pair_vars[2]"),t(", providing a comprehensive way to define valid (supported) and invalid (conflicted) tuples for constraint satisfaction problems. This constraint is versatile, allowing for the explicit delineation of both acceptable and unacceptable configurations.")],-1)),s[40]||(s[40]=i("p",null,[i("a",{href:"https://github.com/JuliaConstraints/CBLS.jl/blob/v0.2.2/src/constraints/extension.jl#L41-L43",target:"_blank",rel:"noreferrer"},"source")],-1))]),i("details",f,[i("summary",null,[s[41]||(s[41]=i("a",{id:"CBLS.Instantiation",href:"#CBLS.Instantiation"},[i("span",{class:"jlbinding"},"CBLS.Instantiation")],-1)),s[42]||(s[42]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[43]||(s[43]=i("p",null,"The instantiation constraint is a global constraint used in constraint programming that ensures that a list of variables takes on a specific set of values in a specific order.",-1)),s[44]||(s[44]=i("p",null,[i("a",{href:"https://github.com/JuliaConstraints/CBLS.jl/blob/v0.2.2/src/constraints/instantiation.jl#L37-L39",target:"_blank",rel:"noreferrer"},"source")],-1))]),i("details",B,[i("summary",null,[s[45]||(s[45]=i("a",{id:"CBLS.Intention",href:"#CBLS.Intention"},[i("span",{class:"jlbinding"},"CBLS.Intention")],-1)),s[46]||(s[46]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[47]||(s[47]=l('
julia
Intention{F <: Function} <: JuMP.AbstractVectorSet

Represents an intention set in the model.

Arguments

  • f::F: A function representing the intention.

source

',5))]),i("details",O,[i("summary",null,[s[48]||(s[48]=i("a",{id:"CBLS.MDDConstraint",href:"#CBLS.MDDConstraint"},[i("span",{class:"jlbinding"},"CBLS.MDDConstraint")],-1)),s[49]||(s[49]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[50]||(s[50]=l('

Multi-valued Decision Diagram (MDD) constraint.

The MDD constraint is a constraint that can be used to model a wide range of problems. It is a directed graph where each node is labeled with a value and each edge is labeled with a value. The constraint is satisfied if there is a path from the first node to the last node such that the sequence of edge labels is a valid sequence of the value labels.

julia
@constraint(model, X in MDDConstraint(; language))

source

',4))]),i("details",L,[i("summary",null,[s[51]||(s[51]=i("a",{id:"CBLS.MOIAllDifferent",href:"#CBLS.MOIAllDifferent"},[i("span",{class:"jlbinding"},"CBLS.MOIAllDifferent")],-1)),s[52]||(s[52]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[53]||(s[53]=l('
julia
MOIAllDifferent <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",S,[i("summary",null,[s[54]||(s[54]=i("a",{id:"CBLS.MOIAllEqual",href:"#CBLS.MOIAllEqual"},[i("span",{class:"jlbinding"},"CBLS.MOIAllEqual")],-1)),s[55]||(s[55]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[56]||(s[56]=l('
julia
MOIAllEqual <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",I,[i("summary",null,[s[57]||(s[57]=i("a",{id:"CBLS.MOIConflicts",href:"#CBLS.MOIConflicts"},[i("span",{class:"jlbinding"},"CBLS.MOIConflicts")],-1)),s[58]||(s[58]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[59]||(s[59]=l('
julia
MOIConflicts{T <: Number, V <: Vector{Vector{T}}} <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",T,[i("summary",null,[s[60]||(s[60]=i("a",{id:"CBLS.MOICumulative",href:"#CBLS.MOICumulative"},[i("span",{class:"jlbinding"},"CBLS.MOICumulative")],-1)),s[61]||(s[61]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[62]||(s[62]=l('
julia
MOICumulative{F <: Function, T1 <: Number, T2 <: Number} <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",M,[i("summary",null,[s[63]||(s[63]=i("a",{id:"CBLS.MOIDistDifferent",href:"#CBLS.MOIDistDifferent"},[i("span",{class:"jlbinding"},"CBLS.MOIDistDifferent")],-1)),s[64]||(s[64]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[65]||(s[65]=l('
julia
MOIDistDifferent <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",A,[i("summary",null,[s[66]||(s[66]=i("a",{id:"CBLS.MOIElement",href:"#CBLS.MOIElement"},[i("span",{class:"jlbinding"},"CBLS.MOIElement")],-1)),s[67]||(s[67]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[68]||(s[68]=l('
julia
MOIElement{I <: Integer, F <: Function, T <: Union{Nothing, Number}} <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",D,[i("summary",null,[s[69]||(s[69]=i("a",{id:"CBLS.MOIError",href:"#CBLS.MOIError"},[i("span",{class:"jlbinding"},"CBLS.MOIError")],-1)),s[70]||(s[70]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[71]||(s[71]=l('
julia
MOIError{F <: Function} <: MOI.AbstractVectorSet

DOCSTRING

Arguments:

  • f::F: DESCRIPTION

  • dimension::Int: DESCRIPTION

  • MOIError(f, dim = 0) = begin #= none:5 =# new{typeof(f)}(f, dim) end: DESCRIPTION

source

',5))]),i("details",x,[i("summary",null,[s[72]||(s[72]=i("a",{id:"CBLS.MOIExtension",href:"#CBLS.MOIExtension"},[i("span",{class:"jlbinding"},"CBLS.MOIExtension")],-1)),s[73]||(s[73]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[74]||(s[74]=l(`
julia
MOIExtension{T <: Number, V <: Union{Vector{Vector{T}}, Tuple{Vector{T}, Vector{T}}}} <: MOI.AbstractVectorSet
+
+DOCSTRING

source

`,2))]),i("details",z,[i("summary",null,[s[75]||(s[75]=i("a",{id:"CBLS.MOIInstantiation",href:"#CBLS.MOIInstantiation"},[i("span",{class:"jlbinding"},"CBLS.MOIInstantiation")],-1)),s[76]||(s[76]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[77]||(s[77]=l('
julia
MOIInstantiation{T <: Number, V <: Vector{T}} <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",V,[i("summary",null,[s[78]||(s[78]=i("a",{id:"CBLS.MOIIntention",href:"#CBLS.MOIIntention"},[i("span",{class:"jlbinding"},"CBLS.MOIIntention")],-1)),s[79]||(s[79]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[80]||(s[80]=l('
julia
MOIIntention{F <: Function} <: MOI.AbstractVectorSet

Represents an intention set in the model.

Arguments

  • f::F: A function representing the intention.

  • dimension::Int: The dimension of the vector set.

source

',5))]),i("details",N,[i("summary",null,[s[81]||(s[81]=i("a",{id:"CBLS.MOIMaximum",href:"#CBLS.MOIMaximum"},[i("span",{class:"jlbinding"},"CBLS.MOIMaximum")],-1)),s[82]||(s[82]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[83]||(s[83]=l('
julia
MOIMaximum {F <: Function, T <: Number} <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",J,[i("summary",null,[s[84]||(s[84]=i("a",{id:"CBLS.MOIMinimum",href:"#CBLS.MOIMinimum"},[i("span",{class:"jlbinding"},"CBLS.MOIMinimum")],-1)),s[85]||(s[85]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[86]||(s[86]=l('
julia
MOIMinimum {F <: Function, T <: Number} <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",w,[i("summary",null,[s[87]||(s[87]=i("a",{id:"CBLS.MOIMultivaluedDecisionDiagram",href:"#CBLS.MOIMultivaluedDecisionDiagram"},[i("span",{class:"jlbinding"},"CBLS.MOIMultivaluedDecisionDiagram")],-1)),s[88]||(s[88]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[89]||(s[89]=l('
julia
MOIMultivaluedDecisionDiagram{L <: ConstraintCommons.AbstractMultivaluedDecisionDiagram} <: AbstractVectorSet

DOCSTRING

source

',3))]),i("details",R,[i("summary",null,[s[90]||(s[90]=i("a",{id:"CBLS.MOINValues",href:"#CBLS.MOINValues"},[i("span",{class:"jlbinding"},"CBLS.MOINValues")],-1)),s[91]||(s[91]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[92]||(s[92]=l('
julia
MOINValues{F <: Function, T1 <: Number, T2 <: Number, V <: Vector{T2}} <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",P,[i("summary",null,[s[93]||(s[93]=i("a",{id:"CBLS.MOINoOverlap",href:"#CBLS.MOINoOverlap"},[i("span",{class:"jlbinding"},"CBLS.MOINoOverlap")],-1)),s[94]||(s[94]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[95]||(s[95]=l('
julia
MOINoOverlap{I <: Integer, T <: Number, V <: Vector{T}} <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",G,[i("summary",null,[s[96]||(s[96]=i("a",{id:"CBLS.MOIOrdered",href:"#CBLS.MOIOrdered"},[i("span",{class:"jlbinding"},"CBLS.MOIOrdered")],-1)),s[97]||(s[97]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[98]||(s[98]=l('
julia
MOIOrdered{F <: Function, T <: Number, V <: Vector{T}} <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",X,[i("summary",null,[s[99]||(s[99]=i("a",{id:"CBLS.MOIRegular",href:"#CBLS.MOIRegular"},[i("span",{class:"jlbinding"},"CBLS.MOIRegular")],-1)),s[100]||(s[100]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[101]||(s[101]=l('
julia
MOIRegular{L <: ConstraintCommons.AbstractAutomaton} <: AbstractVectorSet

DOCSTRING

source

',3))]),i("details",U,[i("summary",null,[s[102]||(s[102]=i("a",{id:"CBLS.MOISum",href:"#CBLS.MOISum"},[i("span",{class:"jlbinding"},"CBLS.MOISum")],-1)),s[103]||(s[103]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[104]||(s[104]=l('
julia
MOISum{F <: Function, T1 <: Number, T2 <: Number, V <: Number} <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",q,[i("summary",null,[s[105]||(s[105]=i("a",{id:"CBLS.MOISupports",href:"#CBLS.MOISupports"},[i("span",{class:"jlbinding"},"CBLS.MOISupports")],-1)),s[106]||(s[106]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[107]||(s[107]=l('
julia
MOISupports{T <: Number, V <: Vector{Vector{T}}} <: MOI.AbstractVectorSet

DOCSTRING

source

',3))]),i("details",$,[i("summary",null,[s[108]||(s[108]=i("a",{id:"CBLS.Maximum",href:"#CBLS.Maximum"},[i("span",{class:"jlbinding"},"CBLS.Maximum")],-1)),s[109]||(s[109]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[110]||(s[110]=l('

Global constraint ensuring that the maximum value in the tuple x satisfies the condition op(x) val. This constraint is useful for specifying that the maximum value in the tuple must satisfy a certain condition.

julia
@constraint(model, X in Maximum(; op = ==, val))

source

',3))]),i("details",W,[i("summary",null,[s[111]||(s[111]=i("a",{id:"CBLS.Minimum",href:"#CBLS.Minimum"},[i("span",{class:"jlbinding"},"CBLS.Minimum")],-1)),s[112]||(s[112]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[113]||(s[113]=l('

Global constraint ensuring that the minimum value in the tuple x satisfies the condition op(x) val. This constraint is useful for specifying that the minimum value in the tuple must satisfy a certain condition.

julia
@constraint(model, X in Minimum(; op = ==, val))

source

',3))]),i("details",H,[i("summary",null,[s[114]||(s[114]=i("a",{id:"CBLS.NValues",href:"#CBLS.NValues"},[i("span",{class:"jlbinding"},"CBLS.NValues")],-1)),s[115]||(s[115]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[116]||(s[116]=i("p",null,[t("Global constraint ensuring that the number of distinct values in "),i("code",null,"X"),t(" satisfies the given condition.")],-1)),s[117]||(s[117]=i("p",null,[i("a",{href:"https://github.com/JuliaConstraints/CBLS.jl/blob/v0.2.2/src/constraints/n_values.jl#L43-L45",target:"_blank",rel:"noreferrer"},"source")],-1))]),i("details",K,[i("summary",null,[s[118]||(s[118]=i("a",{id:"CBLS.NoOverlap",href:"#CBLS.NoOverlap"},[i("span",{class:"jlbinding"},"CBLS.NoOverlap")],-1)),s[119]||(s[119]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[120]||(s[120]=l('

Global constraint ensuring that the tuple x does not overlap with any configuration listed within the pair set pair_vars. This constraint, originating from the extension model, stipulates that x must avoid all configurations defined as pairs: x ∩ pair_vars = ∅. It is useful for specifying tuples that are explicitly forbidden and should be excluded from the solution space.

julia
@constraint(model, X in NoOverlap(; bool = true, dim = 1, pair_vars = nothing))

source

',3))]),i("details",Q,[i("summary",null,[s[121]||(s[121]=i("a",{id:"CBLS.Optimizer",href:"#CBLS.Optimizer"},[i("span",{class:"jlbinding"},"CBLS.Optimizer")],-1)),s[122]||(s[122]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[123]||(s[123]=l('
julia
Optimizer(model = Model(); options = Options())

Create an instance of the Optimizer.

Arguments

  • model: The model to be optimized.

  • options::Options: Options for configuring the solver.

Returns

  • Optimizer: An instance of the optimizer.

source

',7))]),i("details",Y,[i("summary",null,[s[124]||(s[124]=i("a",{id:"CBLS.Optimizer-2",href:"#CBLS.Optimizer-2"},[i("span",{class:"jlbinding"},"CBLS.Optimizer")],-1)),s[125]||(s[125]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[126]||(s[126]=l('
julia
Optimizer <: MOI.AbstractOptimizer

Defines an optimizer for CBLS.

Fields

  • solver::LS.MainSolver: The main solver used for local search.

  • int_vars::Set{Int}: Set of integer variables.

  • compare_vars::Set{Int}: Set of variables to compare.

source

',5))]),i("details",Z,[i("summary",null,[s[127]||(s[127]=i("a",{id:"CBLS.Ordered",href:"#CBLS.Ordered"},[i("span",{class:"jlbinding"},"CBLS.Ordered")],-1)),s[128]||(s[128]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[129]||(s[129]=i("p",null,[t("Global constraint ensuring that the variables are ordered according to "),i("code",null,"op"),t(".")],-1)),s[130]||(s[130]=i("p",null,[i("a",{href:"https://github.com/JuliaConstraints/CBLS.jl/blob/v0.2.2/src/constraints/ordered.jl#L45-L47",target:"_blank",rel:"noreferrer"},"source")],-1))]),i("details",_,[i("summary",null,[s[131]||(s[131]=i("a",{id:"CBLS.Predicate",href:"#CBLS.Predicate"},[i("span",{class:"jlbinding"},"CBLS.Predicate")],-1)),s[132]||(s[132]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[133]||(s[133]=l('
julia
Predicate{F <: Function} <: JuMP.AbstractVectorSet

Deprecated: Use Intention instead.

Represents a predicate set in the model.

Arguments

  • f::F: A function representing the predicate.

source

',6))]),i("details",ss,[i("summary",null,[s[134]||(s[134]=i("a",{id:"CBLS.Regular",href:"#CBLS.Regular"},[i("span",{class:"jlbinding"},"CBLS.Regular")],-1)),s[135]||(s[135]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[136]||(s[136]=l('

Ensures that a sequence x (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of x with the language rules encoded within the automaton parameter, which must be an instance of <:AbstractAutomaton.

julia
@constraint(model, X in RegularConstraint(; language))

source

',3))]),i("details",is,[i("summary",null,[s[137]||(s[137]=i("a",{id:"CBLS.ScalarFunction",href:"#CBLS.ScalarFunction"},[i("span",{class:"jlbinding"},"CBLS.ScalarFunction")],-1)),s[138]||(s[138]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[139]||(s[139]=l(`
julia
ScalarFunction{F <: Function, V <: Union{Nothing, VOV}} <: MOI.AbstractScalarFunction

A container to express any function with real value in JuMP syntax. Used with the @objective macro.

Arguments:

  • f::F: function to be applied to X

  • X::V: a subset of the variables of the model.

Given a model, and some (collection of) variables X to optimize. an objective function f can be added as follows. Note that only Min for minimization us currently defined. Max will come soon.

julia
# Applies to all variables in order of insertion.
+# Recommended only when the function argument order does not matter.
+@objective(model, ScalarFunction(f))
+
+# Generic use
+@objective(model, ScalarFunction(f, X))

source

`,7))]),i("details",ts,[i("summary",null,[s[140]||(s[140]=i("a",{id:"CBLS.Sum",href:"#CBLS.Sum"},[i("span",{class:"jlbinding"},"CBLS.Sum")],-1)),s[141]||(s[141]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[142]||(s[142]=i("p",null,[t("Global constraint ensuring that the sum of the variables in "),i("code",null,"x"),t(" satisfies a given condition.")],-1)),s[143]||(s[143]=i("p",null,[i("a",{href:"https://github.com/JuliaConstraints/CBLS.jl/blob/v0.2.2/src/constraints/sum.jl#L46-L48",target:"_blank",rel:"noreferrer"},"source")],-1))]),i("details",as,[i("summary",null,[s[144]||(s[144]=i("a",{id:"CBLS.Supports",href:"#CBLS.Supports"},[i("span",{class:"jlbinding"},"CBLS.Supports")],-1)),s[145]||(s[145]=t()),e(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[146]||(s[146]=l('

Global constraint ensuring that the tuple x matches a configuration listed within the support set pair_vars. This constraint is derived from the extension model, specifying that x must be one of the explicitly defined supported configurations: x ∈ pair_vars. It is utilized to directly declare the tuples that are valid and should be included in the solution space.

julia
@constraint(model, X in Supports(; pair_vars))

source

',3))]),i("details",es,[i("summary",null,[s[147]||(s[147]=i("a",{id:"Base.copy-Tuple{CBLS.MOIError}",href:"#Base.copy-Tuple{CBLS.MOIError}"},[i("span",{class:"jlbinding"},"Base.copy")],-1)),s[148]||(s[148]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[149]||(s[149]=l('
julia
Base.copy(set::MOIError) = begin

DOCSTRING

source

',3))]),i("details",ls,[i("summary",null,[s[150]||(s[150]=i("a",{id:"Base.copy-Tuple{CBLS.MOIIntention}",href:"#Base.copy-Tuple{CBLS.MOIIntention}"},[i("span",{class:"jlbinding"},"Base.copy")],-1)),s[151]||(s[151]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[152]||(s[152]=l('
julia
Base.copy(set::MOIIntention)

Copy an intention set.

Arguments

  • set::MOIIntention: The intention set to be copied.

Returns

  • MOIIntention: A copy of the intention set.

source

',7))]),i("details",ns,[i("summary",null,[s[153]||(s[153]=i("a",{id:"Base.copy-Tuple{DiscreteSet}",href:"#Base.copy-Tuple{DiscreteSet}"},[i("span",{class:"jlbinding"},"Base.copy")],-1)),s[154]||(s[154]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[155]||(s[155]=l('
julia
Base.copy(set::DiscreteSet)

Copy a discrete set.

Arguments

  • set::DiscreteSet: The discrete set to be copied.

Returns

  • DiscreteSet: A copy of the discrete set.

source

',7))]),i("details",ps,[i("summary",null,[s[156]||(s[156]=i("a",{id:"Base.copy-Tuple{F} where F<:Function",href:"#Base.copy-Tuple{F} where F<:Function"},[i("span",{class:"jlbinding"},"Base.copy")],-1)),s[157]||(s[157]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[158]||(s[158]=l('
julia
Base.copy(op::F) where {F <: Function}

Copy a function.

Arguments

  • op::F: The function to be copied.

Returns

  • F: The copied function.

source

',7))]),i("details",rs,[i("summary",null,[s[159]||(s[159]=i("a",{id:"Base.copy-Tuple{Nothing}",href:"#Base.copy-Tuple{Nothing}"},[i("span",{class:"jlbinding"},"Base.copy")],-1)),s[160]||(s[160]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[161]||(s[161]=l('
julia
Base.copy(::Nothing)

Copy a Nothing value.

Arguments

  • ::Nothing: The Nothing value to be copied.

Returns

  • Nothing: The copied Nothing value.

source

',7))]),i("details",os,[i("summary",null,[s[162]||(s[162]=i("a",{id:"JuMP.build_variable-Union{Tuple{T}, Tuple{Function, JuMP.VariableInfo, T}} where T<:MathOptInterface.AbstractScalarSet",href:"#JuMP.build_variable-Union{Tuple{T}, Tuple{Function, JuMP.VariableInfo, T}} where T<:MathOptInterface.AbstractScalarSet"},[i("span",{class:"jlbinding"},"JuMP.build_variable")],-1)),s[163]||(s[163]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[164]||(s[164]=l('
julia
JuMP.build_variable(::Function, info::JuMP.VariableInfo, set::T) where T <: MOI.AbstractScalarSet

Create a variable constrained by a scalar set.

Arguments

  • info::JuMP.VariableInfo: Information about the variable to be created.

  • set::T where T <: MOI.AbstractScalarSet: The set defining the constraints on the variable.

Returns

  • JuMP.VariableConstrainedOnCreation: A variable constrained by the specified set.

source

',7))]),i("details",hs,[i("summary",null,[s[165]||(s[165]=i("a",{id:"JuMP.moi_set-Tuple{Intention, Int64}",href:"#JuMP.moi_set-Tuple{Intention, Int64}"},[i("span",{class:"jlbinding"},"JuMP.moi_set")],-1)),s[166]||(s[166]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[167]||(s[167]=l('
julia
JuMP.moi_set(set::Intention, dim::Int) -> MOIIntention

Convert an Intention set to a MOIIntention set.

Arguments

  • set::Intention: The intention set to be converted.

  • dim::Int: The dimension of the vector set.

Returns

  • MOIIntention: The converted MOIIntention set.

source

',7))]),i("details",ds,[i("summary",null,[s[168]||(s[168]=i("a",{id:"JuMP.moi_set-Tuple{Predicate, Int64}",href:"#JuMP.moi_set-Tuple{Predicate, Int64}"},[i("span",{class:"jlbinding"},"JuMP.moi_set")],-1)),s[169]||(s[169]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[170]||(s[170]=l('
julia
JuMP.moi_set(set::Predicate, dim::Int) -> MOIIntention

Convert a Predicate set to a MOIIntention set.

Arguments

  • set::Predicate: The predicate set to be converted.

  • dim::Int: The dimension of the vector set.

Returns

  • MOIIntention: The converted MOIIntention set.

source

',7))]),i("details",ks,[i("summary",null,[s[171]||(s[171]=i("a",{id:"MathOptInterface.add_constraint-Union{Tuple{F}, Tuple{CBLS.Optimizer, MathOptInterface.VectorOfVariables, CBLS.MOIError{F}}} where F<:Function",href:"#MathOptInterface.add_constraint-Union{Tuple{F}, Tuple{CBLS.Optimizer, MathOptInterface.VectorOfVariables, CBLS.MOIError{F}}} where F<:Function"},[i("span",{class:"jlbinding"},"MathOptInterface.add_constraint")],-1)),s[172]||(s[172]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[173]||(s[173]=l('
julia
MOI.add_constraint(optimizer::Optimizer, vars::MOI.VectorOfVariables, set::MOIError)

DOCSTRING

Arguments:

  • optimizer: DESCRIPTION

  • vars: DESCRIPTION

  • set: DESCRIPTION

source

',5))]),i("details",gs,[i("summary",null,[s[174]||(s[174]=i("a",{id:"MathOptInterface.add_constraint-Union{Tuple{F}, Tuple{CBLS.Optimizer, MathOptInterface.VectorOfVariables, CBLS.MOIIntention{F}}} where F<:Function",href:"#MathOptInterface.add_constraint-Union{Tuple{F}, Tuple{CBLS.Optimizer, MathOptInterface.VectorOfVariables, CBLS.MOIIntention{F}}} where F<:Function"},[i("span",{class:"jlbinding"},"MathOptInterface.add_constraint")],-1)),s[175]||(s[175]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[176]||(s[176]=l('
julia
MOI.add_constraint(optimizer::Optimizer, vars::MOI.VectorOfVariables, set::MOIIntention{F}) where {F <: Function}

Add an intention constraint to the optimizer.

Arguments

  • optimizer::Optimizer: The optimizer instance.

  • vars::MOI.VectorOfVariables: The variables for the constraint.

  • set::MOIIntention{F}: The intention set defining the constraint.

Returns

  • CI{VOV, MOIIntention{F}}: The constraint index.

source

',7))]),i("details",us,[i("summary",null,[s[177]||(s[177]=i("a",{id:"MathOptInterface.add_constraint-Union{Tuple{T}, Tuple{CBLS.Optimizer, MathOptInterface.VariableIndex, DiscreteSet{T}}} where T<:Number",href:"#MathOptInterface.add_constraint-Union{Tuple{T}, Tuple{CBLS.Optimizer, MathOptInterface.VariableIndex, DiscreteSet{T}}} where T<:Number"},[i("span",{class:"jlbinding"},"MathOptInterface.add_constraint")],-1)),s[178]||(s[178]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[179]||(s[179]=l('
julia
MOI.add_constraint(optimizer::Optimizer, v::VI, set::DiscreteSet{T}) where T <: Number

DOCSTRING

Arguments:

  • optimizer: DESCRIPTION

  • v: DESCRIPTION

  • set: DESCRIPTION

source

',5))]),i("details",cs,[i("summary",null,[s[180]||(s[180]=i("a",{id:"MathOptInterface.add_variable-Tuple{CBLS.Optimizer}",href:"#MathOptInterface.add_variable-Tuple{CBLS.Optimizer}"},[i("span",{class:"jlbinding"},"MathOptInterface.add_variable")],-1)),s[181]||(s[181]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[182]||(s[182]=l('
julia
MOI.add_variable(model::Optimizer) = begin

DOCSTRING

source

',3))]),i("details",ys,[i("summary",null,[s[183]||(s[183]=i("a",{id:"MathOptInterface.copy_to-Tuple{CBLS.Optimizer, MathOptInterface.ModelLike}",href:"#MathOptInterface.copy_to-Tuple{CBLS.Optimizer, MathOptInterface.ModelLike}"},[i("span",{class:"jlbinding"},"MathOptInterface.copy_to")],-1)),s[184]||(s[184]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[185]||(s[185]=l('
julia
MOI.copy_to(model::Optimizer, src::MOI.ModelLike)

Copy the source model to the optimizer.

Arguments

  • model::Optimizer: The optimizer instance.

  • src::MOI.ModelLike: The source model to be copied.

Returns

  • Nothing

source

',7))]),i("details",bs,[i("summary",null,[s[186]||(s[186]=i("a",{id:"MathOptInterface.empty!-Tuple{Any}",href:"#MathOptInterface.empty!-Tuple{Any}"},[i("span",{class:"jlbinding"},"MathOptInterface.empty!")],-1)),s[187]||(s[187]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[188]||(s[188]=l('
julia
MOI.empty!(opt)

Empty the optimizer.

Arguments

  • opt::Optimizer: The optimizer instance.

Returns

  • Nothing

source

',7))]),i("details",Es,[i("summary",null,[s[189]||(s[189]=i("a",{id:"MathOptInterface.get-Tuple{CBLS.Optimizer, MathOptInterface.SolverName}",href:"#MathOptInterface.get-Tuple{CBLS.Optimizer, MathOptInterface.SolverName}"},[i("span",{class:"jlbinding"},"MathOptInterface.get")],-1)),s[190]||(s[190]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[191]||(s[191]=l('
julia
MOI.get(::Optimizer, ::MOI.SolverName)

Get the name of the solver.

Arguments

  • ::Optimizer: The optimizer instance.

Returns

  • String: The name of the solver.

source

',7))]),i("details",Cs,[i("summary",null,[s[192]||(s[192]=i("a",{id:"MathOptInterface.get-Tuple{CBLS.Optimizer, MathOptInterface.SolverVersion}",href:"#MathOptInterface.get-Tuple{CBLS.Optimizer, MathOptInterface.SolverVersion}"},[i("span",{class:"jlbinding"},"MathOptInterface.get")],-1)),s[193]||(s[193]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[194]||(s[194]=l('
julia
Moi.get(::Optimizer, ::MOI.SolverVersion)

Get the version of the solver, here LocalSearchSolvers.jl.

source

',3))]),i("details",ms,[i("summary",null,[s[195]||(s[195]=i("a",{id:"MathOptInterface.is_empty-Tuple{CBLS.Optimizer}",href:"#MathOptInterface.is_empty-Tuple{CBLS.Optimizer}"},[i("span",{class:"jlbinding"},"MathOptInterface.is_empty")],-1)),s[196]||(s[196]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[197]||(s[197]=l('
julia
MOI.is_empty(model::Optimizer)

Check if the model is empty.

Arguments

  • model::Optimizer: The optimizer instance.

Returns

  • Bool: True if the model is empty, false otherwise.

source

',7))]),i("details",Fs,[i("summary",null,[s[198]||(s[198]=i("a",{id:"MathOptInterface.is_valid-Tuple{CBLS.Optimizer, MathOptInterface.ConstraintIndex{MathOptInterface.VariableIndex, MathOptInterface.Integer}}",href:"#MathOptInterface.is_valid-Tuple{CBLS.Optimizer, MathOptInterface.ConstraintIndex{MathOptInterface.VariableIndex, MathOptInterface.Integer}}"},[i("span",{class:"jlbinding"},"MathOptInterface.is_valid")],-1)),s[199]||(s[199]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[200]||(s[200]=l('
julia
MOI.is_valid(optimizer::Optimizer, index::CI{VI, MOI.Integer})

Check if an index is valid for the optimizer.

Arguments

  • optimizer::Optimizer: The optimizer instance.

  • index::CI{VI, MOI.Integer}: The index to be checked.

Returns

  • Bool: True if the index is valid, false otherwise.

source

',7))]),i("details",js,[i("summary",null,[s[201]||(s[201]=i("a",{id:"MathOptInterface.optimize!-Tuple{CBLS.Optimizer}",href:"#MathOptInterface.optimize!-Tuple{CBLS.Optimizer}"},[i("span",{class:"jlbinding"},"MathOptInterface.optimize!")],-1)),s[202]||(s[202]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[203]||(s[203]=l('
julia
MOI.optimize!(model::Optimizer)

Optimize the model using the optimizer.

Arguments

  • model::Optimizer: The optimizer instance.

Returns

  • Nothing

source

',7))]),i("details",vs,[i("summary",null,[s[204]||(s[204]=i("a",{id:"MathOptInterface.set",href:"#MathOptInterface.set"},[i("span",{class:"jlbinding"},"MathOptInterface.set")],-1)),s[205]||(s[205]=t()),e(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[206]||(s[206]=l('
julia
MOI.set(::Optimizer, ::MOI.Silent, bool = true)

Set the verbosity of the solver.

Arguments

  • ::Optimizer: The optimizer instance.

  • ::MOI.Silent: The silent option for the solver.

  • bool::Bool: Whether to set the solver to silent mode.

Returns

  • Nothing

source

',7))]),i("details",fs,[i("summary",null,[s[207]||(s[207]=i("a",{id:"MathOptInterface.set-Tuple{CBLS.Optimizer, MathOptInterface.RawOptimizerAttribute, Any}",href:"#MathOptInterface.set-Tuple{CBLS.Optimizer, MathOptInterface.RawOptimizerAttribute, Any}"},[i("span",{class:"jlbinding"},"MathOptInterface.set")],-1)),s[208]||(s[208]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[209]||(s[209]=l('
julia
MOI.set(model::Optimizer, p::MOI.RawOptimizerAttribute, value)

Set a RawOptimizerAttribute to value

source

',3))]),i("details",Bs,[i("summary",null,[s[210]||(s[210]=i("a",{id:"MathOptInterface.set-Tuple{CBLS.Optimizer, MathOptInterface.TimeLimitSec, Union{Nothing, Float64}}",href:"#MathOptInterface.set-Tuple{CBLS.Optimizer, MathOptInterface.TimeLimitSec, Union{Nothing, Float64}}"},[i("span",{class:"jlbinding"},"MathOptInterface.set")],-1)),s[211]||(s[211]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[212]||(s[212]=l('
julia
MOI.set(model::Optimizer, ::MOI.TimeLimitSec, value::Union{Nothing,Float64})

Set the time limit

source

',3))]),i("details",Os,[i("summary",null,[s[213]||(s[213]=i("a",{id:"MathOptInterface.supports_constraint-Union{Tuple{F}, Tuple{CBLS.Optimizer, Type{MathOptInterface.VectorOfVariables}, Type{CBLS.MOIError{F}}}} where F<:Function",href:"#MathOptInterface.supports_constraint-Union{Tuple{F}, Tuple{CBLS.Optimizer, Type{MathOptInterface.VectorOfVariables}, Type{CBLS.MOIError{F}}}} where F<:Function"},[i("span",{class:"jlbinding"},"MathOptInterface.supports_constraint")],-1)),s[214]||(s[214]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[215]||(s[215]=l('
julia
MOI.supports_constraint(::Optimizer, ::Type{VOV}, ::Type{MOIError}) = begin

DOCSTRING

Arguments:

  • ``: DESCRIPTION

  • ``: DESCRIPTION

  • ``: DESCRIPTION

source

',5))]),i("details",Ls,[i("summary",null,[s[216]||(s[216]=i("a",{id:"MathOptInterface.supports_constraint-Union{Tuple{F}, Tuple{CBLS.Optimizer, Type{MathOptInterface.VectorOfVariables}, Type{CBLS.MOIIntention{F}}}} where F<:Function",href:"#MathOptInterface.supports_constraint-Union{Tuple{F}, Tuple{CBLS.Optimizer, Type{MathOptInterface.VectorOfVariables}, Type{CBLS.MOIIntention{F}}}} where F<:Function"},[i("span",{class:"jlbinding"},"MathOptInterface.supports_constraint")],-1)),s[217]||(s[217]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[218]||(s[218]=l('
julia
MOI.supports_constraint(::Optimizer, ::Type{VOV}, ::Type{MOIIntention{F}}) where {F <: Function}

Check if the optimizer supports a given intention constraint.

Arguments

  • ::Optimizer: The optimizer instance.

  • ::Type{VOV}: The type of the variable.

  • ::Type{MOIIntention{F}}: The type of the intention.

Returns

  • Bool: True if the optimizer supports the constraint, false otherwise.

source

',7))]),i("details",Ss,[i("summary",null,[s[219]||(s[219]=i("a",{id:"MathOptInterface.supports_incremental_interface-Tuple{CBLS.Optimizer}",href:"#MathOptInterface.supports_incremental_interface-Tuple{CBLS.Optimizer}"},[i("span",{class:"jlbinding"},"MathOptInterface.supports_incremental_interface")],-1)),s[220]||(s[220]=t()),e(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[221]||(s[221]=l('
julia
MOI.supports_incremental_interface(::Optimizer)

Check if the optimizer supports incremental interface.

Arguments

  • ::Optimizer: The optimizer instance.

Returns

  • Bool: True if the optimizer supports incremental interface, false otherwise.

source

',7))])])}const Ns=n(h,[["render",Is]]);export{Vs as __pageData,Ns as default}; diff --git a/dev/assets/solvers_10_cbls.md.C5zl8XeS.js b/dev/assets/solvers_10_cbls.md.C5zl8XeS.js deleted file mode 100644 index 4312819..0000000 --- a/dev/assets/solvers_10_cbls.md.C5zl8XeS.js +++ /dev/null @@ -1,8 +0,0 @@ -import{_ as i,c as s,o as a,a7 as e}from"./chunks/framework.CBLuZwrP.js";const g=JSON.parse('{"title":"CBLS.jl","description":"","frontmatter":{},"headers":[],"relativePath":"solvers/10_cbls.md","filePath":"solvers/10_cbls.md","lastUpdated":null}'),t={name:"solvers/10_cbls.md"},l=e(`

CBLS.jl

Documentation for CBLS.jl.

# CBLS.AllDifferentType.

Global constraint ensuring that all the values of a given configuration are unique.

julia
@constraint(model, X in AllDifferent())

source


# CBLS.AllEqualType.

Global constraint ensuring that all the values of X are all equal.

julia
@constraint(model, X in AllEqual())

source


# CBLS.AtLeastType.

Constraint ensuring that the number of occurrences of the values in vals in x is at least val.

julia
@constraint(model, X in AtLeast(val, vals))

source


# CBLS.AtMostType.

Constraint ensuring that the number of occurrences of the values in vals in x is at most val.

julia
@constraint(model, X in AtMost(val, vals))

source


# CBLS.ConflictsType.

Global constraint ensuring that the tuple x does not match any configuration listed within the conflict set pair_vars. This constraint, originating from the extension model, stipulates that x must avoid all configurations defined as conflicts: x ∉ pair_vars. It is useful for specifying tuples that are explicitly forbidden and should be excluded from the solution space.

julia
@constraint(model, X in Conflicts(; pair_vars))

source


# CBLS.CountType.

Global constraint ensuring that the number of occurrences of val in X is equal to count.

julia
@constraint(model, X in Count(count, val, vals))

source


# CBLS.CumulativeType.

Global constraint ensuring that the cumulative sum of the heights of the tasks is less than or equal to val.

julia
@constraint(model, X in Cumulative(; pair_vars, op, val))

source


# CBLS.DiscreteSetType.
julia
DiscreteSet(values)

Create a discrete set of values.

Arguments

  • values::Vector{T}: A vector of values to include in the set.

Returns

  • DiscreteSet{T}: A discrete set containing the specified values.

source


# CBLS.DistDifferentType.

A constraint ensuring that the distances between marks on the ruler are unique. Specifically, it checks that the distance between x[1] and x[2], and the distance between x[3] and x[4], are different. This constraint is fundamental in ensuring the validity of a Golomb ruler, where no two pairs of marks should have the same distance between them.

source


# CBLS.ElementType.

Global constraint ensuring that the value of X at index id is equal to val.

julia
@constraint(model, X in Element(; id = nothing, op = ==, val = 0))

source


# CBLS.ErrorType.
julia
Error{F <: Function} <: JuMP.AbstractVectorSet

The solver will compute a straightforward error function based on the concept. To run the solver efficiently, it is possible to provide an error function err instead of concept. err must return a nonnegative real number.

julia
@constraint(model, X in Error(err))

source


# CBLS.ExactlyType.

Constraint ensuring that the number of occurrences of the values in vals in x is exactly val.

julia
@constraint(model, X in Exactly(val, vals))

source


# CBLS.ExtensionType.

Global constraint enforcing that the tuple x matches a configuration within the supports set pair_vars[1] or does not match any configuration within the conflicts set pair_vars[2]. It embodies the logic: x ∈ pair_vars[1] || x ∉ pair_vars[2], providing a comprehensive way to define valid (supported) and invalid (conflicted) tuples for constraint satisfaction problems. This constraint is versatile, allowing for the explicit delineation of both acceptable and unacceptable configurations.

source


# CBLS.InstantiationType.

The instantiation constraint is a global constraint used in constraint programming that ensures that a list of variables takes on a specific set of values in a specific order.

source


# CBLS.IntentionType.
julia
Intention{F <: Function} <: JuMP.AbstractVectorSet

Represents an intention set in the model.

Arguments

  • f::F: A function representing the intention.

source


# CBLS.MDDConstraintType.

Multi-valued Decision Diagram (MDD) constraint.

The MDD constraint is a constraint that can be used to model a wide range of problems. It is a directed graph where each node is labeled with a value and each edge is labeled with a value. The constraint is satisfied if there is a path from the first node to the last node such that the sequence of edge labels is a valid sequence of the value labels.

julia
@constraint(model, X in MDDConstraint(; language))

source


# CBLS.MOIAllDifferentType.
julia
MOIAllDifferent <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOIAllEqualType.
julia
MOIAllEqual <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOIConflictsType.
julia
MOIConflicts{T <: Number, V <: Vector{Vector{T}}} <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOICumulativeType.
julia
MOICumulative{F <: Function, T1 <: Number, T2 <: Number} <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOIDistDifferentType.
julia
MOIDistDifferent <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOIElementType.
julia
MOIElement{I <: Integer, F <: Function, T <: Union{Nothing, Number}} <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOIErrorType.
julia
MOIError{F <: Function} <: MOI.AbstractVectorSet

DOCSTRING

Arguments:

  • f::F: DESCRIPTION

  • dimension::Int: DESCRIPTION

  • MOIError(f, dim = 0) = begin #= none:5 =# new{typeof(f)}(f, dim) end: DESCRIPTION

source


# CBLS.MOIExtensionType.
julia
MOIExtension{T <: Number, V <: Union{Vector{Vector{T}}, Tuple{Vector{T}, Vector{T}}}} <: MOI.AbstractVectorSet
-
-DOCSTRING

source


# CBLS.MOIInstantiationType.
julia
MOIInstantiation{T <: Number, V <: Vector{T}} <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOIIntentionType.
julia
MOIIntention{F <: Function} <: MOI.AbstractVectorSet

Represents an intention set in the model.

Arguments

  • f::F: A function representing the intention.

  • dimension::Int: The dimension of the vector set.

source


# CBLS.MOIMaximumType.
julia
MOIMaximum {F <: Function, T <: Number} <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOIMinimumType.
julia
MOIMinimum {F <: Function, T <: Number} <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOIMultivaluedDecisionDiagramType.
julia
MOIMultivaluedDecisionDiagram{L <: ConstraintCommons.AbstractMultivaluedDecisionDiagram} <: AbstractVectorSet

DOCSTRING

source


# CBLS.MOINValuesType.
julia
MOINValues{F <: Function, T1 <: Number, T2 <: Number, V <: Vector{T2}} <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOINoOverlapType.
julia
MOINoOverlap{I <: Integer, T <: Number, V <: Vector{T}} <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOIOrderedType.
julia
MOIOrdered{F <: Function, T <: Number, V <: Vector{T}} <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOIRegularType.
julia
MOIRegular{L <: ConstraintCommons.AbstractAutomaton} <: AbstractVectorSet

DOCSTRING

source


# CBLS.MOISumType.
julia
MOISum{F <: Function, T1 <: Number, T2 <: Number, V <: Number} <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOISupportsType.
julia
MOISupports{T <: Number, V <: Vector{Vector{T}}} <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MaximumType.

Global constraint ensuring that the maximum value in the tuple x satisfies the condition op(x) val. This constraint is useful for specifying that the maximum value in the tuple must satisfy a certain condition.

julia
@constraint(model, X in Maximum(; op = ==, val))

source


# CBLS.MinimumType.

Global constraint ensuring that the minimum value in the tuple x satisfies the condition op(x) val. This constraint is useful for specifying that the minimum value in the tuple must satisfy a certain condition.

julia
@constraint(model, X in Minimum(; op = ==, val))

source


# CBLS.NValuesType.

Global constraint ensuring that the number of distinct values in X satisfies the given condition.

source


# CBLS.NoOverlapType.

Global constraint ensuring that the tuple x does not overlap with any configuration listed within the pair set pair_vars. This constraint, originating from the extension model, stipulates that x must avoid all configurations defined as pairs: x ∩ pair_vars = ∅. It is useful for specifying tuples that are explicitly forbidden and should be excluded from the solution space.

julia
@constraint(model, X in NoOverlap(; bool = true, dim = 1, pair_vars = nothing))

source


# CBLS.OptimizerType.
julia
Optimizer(model = Model(); options = Options())

Create an instance of the Optimizer.

Arguments

  • model: The model to be optimized.

  • options::Options: Options for configuring the solver.

Returns

  • Optimizer: An instance of the optimizer.

source


# CBLS.OptimizerType.
julia
Optimizer <: MOI.AbstractOptimizer

Defines an optimizer for CBLS.

Fields

  • solver::LS.MainSolver: The main solver used for local search.

  • int_vars::Set{Int}: Set of integer variables.

  • compare_vars::Set{Int}: Set of variables to compare.

source


# CBLS.OrderedType.

Global constraint ensuring that the variables are ordered according to op.

source


# CBLS.PredicateType.
julia
Predicate{F <: Function} <: JuMP.AbstractVectorSet

Deprecated: Use Intention instead.

Represents a predicate set in the model.

Arguments

  • f::F: A function representing the predicate.

source


# CBLS.RegularType.

Ensures that a sequence x (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of x with the language rules encoded within the automaton parameter, which must be an instance of <:AbstractAutomaton.

julia
@constraint(model, X in RegularConstraint(; language))

source


# CBLS.ScalarFunctionType.
julia
ScalarFunction{F <: Function, V <: Union{Nothing, VOV}} <: MOI.AbstractScalarFunction

A container to express any function with real value in JuMP syntax. Used with the @objective macro.

Arguments:

  • f::F: function to be applied to X

  • X::V: a subset of the variables of the model.

Given a model, and some (collection of) variables X to optimize. an objective function f can be added as follows. Note that only Min for minimization us currently defined. Max will come soon.

julia
# Applies to all variables in order of insertion.
-# Recommended only when the function argument order does not matter.
-@objective(model, ScalarFunction(f))
-
-# Generic use
-@objective(model, ScalarFunction(f, X))

source


# CBLS.SumType.

Global constraint ensuring that the sum of the variables in x satisfies a given condition.

source


# CBLS.SupportsType.

Global constraint ensuring that the tuple x matches a configuration listed within the support set pair_vars. This constraint is derived from the extension model, specifying that x must be one of the explicitly defined supported configurations: x ∈ pair_vars. It is utilized to directly declare the tuples that are valid and should be included in the solution space.

julia
@constraint(model, X in Supports(; pair_vars))

source


# Base.copyMethod.
julia
Base.copy(set::MOIError) = begin

DOCSTRING

source


# Base.copyMethod.
julia
Base.copy(set::MOIIntention)

Copy an intention set.

Arguments

  • set::MOIIntention: The intention set to be copied.

Returns

  • MOIIntention: A copy of the intention set.

source


# Base.copyMethod.
julia
Base.copy(set::DiscreteSet)

Copy a discrete set.

Arguments

  • set::DiscreteSet: The discrete set to be copied.

Returns

  • DiscreteSet: A copy of the discrete set.

source


# Base.copyMethod.
julia
Base.copy(op::F) where {F <: Function}

Copy a function.

Arguments

  • op::F: The function to be copied.

Returns

  • F: The copied function.

source


# Base.copyMethod.
julia
Base.copy(::Nothing)

Copy a Nothing value.

Arguments

  • ::Nothing: The Nothing value to be copied.

Returns

  • Nothing: The copied Nothing value.

source


# JuMP.build_variableMethod.
julia
JuMP.build_variable(::Function, info::JuMP.VariableInfo, set::T) where T <: MOI.AbstractScalarSet

Create a variable constrained by a scalar set.

Arguments

  • info::JuMP.VariableInfo: Information about the variable to be created.

  • set::T where T <: MOI.AbstractScalarSet: The set defining the constraints on the variable.

Returns

  • JuMP.VariableConstrainedOnCreation: A variable constrained by the specified set.

source


# JuMP.moi_setMethod.
julia
JuMP.moi_set(set::Intention, dim::Int) -> MOIIntention

Convert an Intention set to a MOIIntention set.

Arguments

  • set::Intention: The intention set to be converted.

  • dim::Int: The dimension of the vector set.

Returns

  • MOIIntention: The converted MOIIntention set.

source


# JuMP.moi_setMethod.
julia
JuMP.moi_set(set::Predicate, dim::Int) -> MOIIntention

Convert a Predicate set to a MOIIntention set.

Arguments

  • set::Predicate: The predicate set to be converted.

  • dim::Int: The dimension of the vector set.

Returns

  • MOIIntention: The converted MOIIntention set.

source


# MathOptInterface.add_constraintMethod.
julia
MOI.add_constraint(optimizer::Optimizer, vars::MOI.VectorOfVariables, set::MOIError)

DOCSTRING

Arguments:

  • optimizer: DESCRIPTION

  • vars: DESCRIPTION

  • set: DESCRIPTION

source


# MathOptInterface.add_constraintMethod.
julia
MOI.add_constraint(optimizer::Optimizer, vars::MOI.VectorOfVariables, set::MOIIntention{F}) where {F <: Function}

Add an intention constraint to the optimizer.

Arguments

  • optimizer::Optimizer: The optimizer instance.

  • vars::MOI.VectorOfVariables: The variables for the constraint.

  • set::MOIIntention{F}: The intention set defining the constraint.

Returns

  • CI{VOV, MOIIntention{F}}: The constraint index.

source


# MathOptInterface.add_constraintMethod.
julia
MOI.add_constraint(optimizer::Optimizer, v::VI, set::DiscreteSet{T}) where T <: Number

DOCSTRING

Arguments:

  • optimizer: DESCRIPTION

  • v: DESCRIPTION

  • set: DESCRIPTION

source


# MathOptInterface.add_variableMethod.
julia
MOI.add_variable(model::Optimizer) = begin

DOCSTRING

source


# MathOptInterface.copy_toMethod.
julia
MOI.copy_to(model::Optimizer, src::MOI.ModelLike)

Copy the source model to the optimizer.

Arguments

  • model::Optimizer: The optimizer instance.

  • src::MOI.ModelLike: The source model to be copied.

Returns

  • Nothing

source


# MathOptInterface.empty!Method.
julia
MOI.empty!(opt)

Empty the optimizer.

Arguments

  • opt::Optimizer: The optimizer instance.

Returns

  • Nothing

source


# MathOptInterface.getMethod.
julia
MOI.get(::Optimizer, ::MOI.SolverName)

Get the name of the solver.

Arguments

  • ::Optimizer: The optimizer instance.

Returns

  • String: The name of the solver.

source


# MathOptInterface.getMethod.
julia
Moi.get(::Optimizer, ::MOI.SolverVersion)

Get the version of the solver, here LocalSearchSolvers.jl.

source


# MathOptInterface.is_emptyMethod.
julia
MOI.is_empty(model::Optimizer)

Check if the model is empty.

Arguments

  • model::Optimizer: The optimizer instance.

Returns

  • Bool: True if the model is empty, false otherwise.

source


# MathOptInterface.is_validMethod.
julia
MOI.is_valid(optimizer::Optimizer, index::CI{VI, MOI.Integer})

Check if an index is valid for the optimizer.

Arguments

  • optimizer::Optimizer: The optimizer instance.

  • index::CI{VI, MOI.Integer}: The index to be checked.

Returns

  • Bool: True if the index is valid, false otherwise.

source


# MathOptInterface.optimize!Method.
julia
MOI.optimize!(model::Optimizer)

Optimize the model using the optimizer.

Arguments

  • model::Optimizer: The optimizer instance.

Returns

  • Nothing

source


# MathOptInterface.setFunction.
julia
MOI.set(::Optimizer, ::MOI.Silent, bool = true)

Set the verbosity of the solver.

Arguments

  • ::Optimizer: The optimizer instance.

  • ::MOI.Silent: The silent option for the solver.

  • bool::Bool: Whether to set the solver to silent mode.

Returns

  • Nothing

source


# MathOptInterface.setMethod.
julia
MOI.set(model::Optimizer, p::MOI.RawOptimizerAttribute, value)

Set a RawOptimizerAttribute to value

source


# MathOptInterface.setMethod.
julia
MOI.set(model::Optimizer, ::MOI.TimeLimitSec, value::Union{Nothing,Float64})

Set the time limit

source


# MathOptInterface.supports_constraintMethod.
julia
MOI.supports_constraint(::Optimizer, ::Type{VOV}, ::Type{MOIError}) = begin

DOCSTRING

Arguments:

  • \`\`: DESCRIPTION

  • \`\`: DESCRIPTION

  • \`\`: DESCRIPTION

source


# MathOptInterface.supports_constraintMethod.
julia
MOI.supports_constraint(::Optimizer, ::Type{VOV}, ::Type{MOIIntention{F}}) where {F <: Function}

Check if the optimizer supports a given intention constraint.

Arguments

  • ::Optimizer: The optimizer instance.

  • ::Type{VOV}: The type of the variable.

  • ::Type{MOIIntention{F}}: The type of the intention.

Returns

  • Bool: True if the optimizer supports the constraint, false otherwise.

source


# MathOptInterface.supports_incremental_interfaceMethod.
julia
MOI.supports_incremental_interface(::Optimizer)

Check if the optimizer supports incremental interface.

Arguments

  • ::Optimizer: The optimizer instance.

Returns

  • Bool: True if the optimizer supports incremental interface, false otherwise.

source


`,146),n=[l];function r(p,h,o,d,k,c){return a(),s("div",null,n)}const b=i(t,[["render",r]]);export{g as __pageData,b as default}; diff --git a/dev/assets/solvers_10_cbls.md.C5zl8XeS.lean.js b/dev/assets/solvers_10_cbls.md.C5zl8XeS.lean.js deleted file mode 100644 index e11ab75..0000000 --- a/dev/assets/solvers_10_cbls.md.C5zl8XeS.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as s,o as a,a7 as e}from"./chunks/framework.CBLuZwrP.js";const g=JSON.parse('{"title":"CBLS.jl","description":"","frontmatter":{},"headers":[],"relativePath":"solvers/10_cbls.md","filePath":"solvers/10_cbls.md","lastUpdated":null}'),t={name:"solvers/10_cbls.md"},l=e("",146),n=[l];function r(p,h,o,d,k,c){return a(),s("div",null,n)}const b=i(t,[["render",r]]);export{g as __pageData,b as default}; diff --git a/dev/assets/solvers_60_local_search_solvers.md.CmZAwKiI.js b/dev/assets/solvers_60_local_search_solvers.md.CmZAwKiI.js new file mode 100644 index 0000000..92ce653 --- /dev/null +++ b/dev/assets/solvers_60_local_search_solvers.md.CmZAwKiI.js @@ -0,0 +1,36 @@ +import{_ as n,c as o,j as i,a,G as e,a5 as t,B as r,o as p}from"./chunks/framework.CJakPlgM.js";const sa=JSON.parse('{"title":"LocalSearchSolvers.jl","description":"","frontmatter":{},"headers":[],"relativePath":"solvers/60_local_search_solvers.md","filePath":"solvers/60_local_search_solvers.md","lastUpdated":null}'),h={name:"solvers/60_local_search_solvers.md"},d={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},S={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},L={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},M={class:"jldocstring custom-block",open:""},_={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},O={class:"jldocstring custom-block",open:""},J={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""},I={class:"jldocstring custom-block",open:""},U={class:"jldocstring custom-block",open:""},R={class:"jldocstring custom-block",open:""},z={class:"jldocstring custom-block",open:""},N={class:"jldocstring custom-block",open:""},V={class:"jldocstring custom-block",open:""},G={class:"jldocstring custom-block",open:""},P={class:"jldocstring custom-block",open:""},q={class:"jldocstring custom-block",open:""},$={class:"jldocstring custom-block",open:""},W={class:"jldocstring custom-block",open:""},H={class:"jldocstring custom-block",open:""},K={class:"jldocstring custom-block",open:""},Q={class:"jldocstring custom-block",open:""},X={class:"jldocstring custom-block",open:""},Y={class:"jldocstring custom-block",open:""},Z={class:"jldocstring custom-block",open:""},ss={class:"jldocstring custom-block",open:""},is={class:"jldocstring custom-block",open:""},as={class:"jldocstring custom-block",open:""},ls={class:"jldocstring custom-block",open:""},es={class:"jldocstring custom-block",open:""},ts={class:"jldocstring custom-block",open:""},ns={class:"jldocstring custom-block",open:""},os={class:"jldocstring custom-block",open:""},rs={class:"jldocstring custom-block",open:""},ps={class:"jldocstring custom-block",open:""},hs={class:"jldocstring custom-block",open:""},ds={class:"jldocstring custom-block",open:""},ks={class:"jldocstring custom-block",open:""},cs={class:"jldocstring custom-block",open:""},gs={class:"jldocstring custom-block",open:""},us={class:"jldocstring custom-block",open:""},bs={class:"jldocstring custom-block",open:""},ys={class:"jldocstring custom-block",open:""},vs={class:"jldocstring custom-block",open:""},Ss={class:"jldocstring custom-block",open:""},Es={class:"jldocstring custom-block",open:""},ms={class:"jldocstring custom-block",open:""},js={class:"jldocstring custom-block",open:""},Cs={class:"jldocstring custom-block",open:""},Fs={class:"jldocstring custom-block",open:""},Ls={class:"jldocstring custom-block",open:""},fs={class:"jldocstring custom-block",open:""},As={class:"jldocstring custom-block",open:""},Ms={class:"jldocstring custom-block",open:""},_s={class:"jldocstring custom-block",open:""},Ts={class:"jldocstring custom-block",open:""},xs={class:"jldocstring custom-block",open:""},Ds={class:"jldocstring custom-block",open:""},Bs={class:"jldocstring custom-block",open:""},Os={class:"jldocstring custom-block",open:""},Js={class:"jldocstring custom-block",open:""},ws={class:"jldocstring custom-block",open:""},Is={class:"jldocstring custom-block",open:""},Us={class:"jldocstring custom-block",open:""},Rs={class:"jldocstring custom-block",open:""},zs={class:"jldocstring custom-block",open:""},Ns={class:"jldocstring custom-block",open:""},Vs={class:"jldocstring custom-block",open:""},Gs={class:"jldocstring custom-block",open:""},Ps={class:"jldocstring custom-block",open:""},qs={class:"jldocstring custom-block",open:""},$s={class:"jldocstring custom-block",open:""},Ws={class:"jldocstring custom-block",open:""},Hs={class:"jldocstring custom-block",open:""},Ks={class:"jldocstring custom-block",open:""},Qs={class:"jldocstring custom-block",open:""},Xs={class:"jldocstring custom-block",open:""},Ys={class:"jldocstring custom-block",open:""},Zs={class:"jldocstring custom-block",open:""},si={class:"jldocstring custom-block",open:""},ii={class:"jldocstring custom-block",open:""},ai={class:"jldocstring custom-block",open:""},li={class:"jldocstring custom-block",open:""},ei={class:"jldocstring custom-block",open:""},ti={class:"jldocstring custom-block",open:""},ni={class:"jldocstring custom-block",open:""},oi={class:"jldocstring custom-block",open:""},ri={class:"jldocstring custom-block",open:""},pi={class:"jldocstring custom-block",open:""},hi={class:"jldocstring custom-block",open:""},di={class:"jldocstring custom-block",open:""},ki={class:"jldocstring custom-block",open:""},ci={class:"jldocstring custom-block",open:""},gi={class:"jldocstring custom-block",open:""},ui={class:"jldocstring custom-block",open:""},bi={class:"jldocstring custom-block",open:""},yi={class:"jldocstring custom-block",open:""},vi={class:"jldocstring custom-block",open:""},Si={class:"jldocstring custom-block",open:""},Ei={class:"jldocstring custom-block",open:""},mi={class:"jldocstring custom-block",open:""},ji={class:"jldocstring custom-block",open:""},Ci={class:"jldocstring custom-block",open:""},Fi={class:"jldocstring custom-block",open:""},Li={class:"jldocstring custom-block",open:""},fi={class:"jldocstring custom-block",open:""},Ai={class:"jldocstring custom-block",open:""},Mi={class:"jldocstring custom-block",open:""},_i={class:"jldocstring custom-block",open:""},Ti={class:"jldocstring custom-block",open:""},xi={class:"jldocstring custom-block",open:""},Di={class:"jldocstring custom-block",open:""},Bi={class:"jldocstring custom-block",open:""},Oi={class:"jldocstring custom-block",open:""},Ji={class:"jldocstring custom-block",open:""},wi={class:"jldocstring custom-block",open:""},Ii={class:"jldocstring custom-block",open:""},Ui={class:"jldocstring custom-block",open:""},Ri={class:"jldocstring custom-block",open:""},zi={class:"jldocstring custom-block",open:""},Ni={class:"jldocstring custom-block",open:""},Vi={class:"jldocstring custom-block",open:""},Gi={class:"jldocstring custom-block",open:""},Pi={class:"jldocstring custom-block",open:""},qi={class:"jldocstring custom-block",open:""},$i={class:"jldocstring custom-block",open:""};function Wi(Hi,s,Ki,Qi,Xi,Yi){const l=r("Badge");return p(),o("div",null,[s[433]||(s[433]=i("h1",{id:"localsearchsolvers-jl",tabindex:"-1"},[a("LocalSearchSolvers.jl "),i("a",{class:"header-anchor",href:"#localsearchsolvers-jl","aria-label":'Permalink to "LocalSearchSolvers.jl"'},"​")],-1)),s[434]||(s[434]=i("p",null,[a("Documentation for "),i("code",null,"LocalSearchSolvers.jl"),a(".")],-1)),i("details",d,[i("summary",null,[s[0]||(s[0]=i("a",{id:"LocalSearchSolvers.AbstractSolver",href:"#LocalSearchSolvers.AbstractSolver"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.AbstractSolver")],-1)),s[1]||(s[1]=a()),e(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=t('
julia
AbstractSolver

Abstract type to encapsulate the different solver types such as Solver or _SubSolver.

source

',3))]),i("details",k,[i("summary",null,[s[3]||(s[3]=i("a",{id:"LocalSearchSolvers.Constraint",href:"#LocalSearchSolvers.Constraint"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.Constraint")],-1)),s[4]||(s[4]=a()),e(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[5]||(s[5]=t('
julia
Constraint{F <: Function}

Structure to store an error function and the variables it constrains.

source

',3))]),i("details",c,[i("summary",null,[s[6]||(s[6]=i("a",{id:"LocalSearchSolvers.LeadSolver",href:"#LocalSearchSolvers.LeadSolver"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.LeadSolver")],-1)),s[7]||(s[7]=a()),e(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[8]||(s[8]=t('
julia
LeadSolver <: MetaSolver

Solver managed remotely by a MainSolver. Can manage its own set of local sub solvers.

source

',3))]),i("details",g,[i("summary",null,[s[9]||(s[9]=i("a",{id:"LocalSearchSolvers.MainSolver",href:"#LocalSearchSolvers.MainSolver"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.MainSolver")],-1)),s[10]||(s[10]=a()),e(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[11]||(s[11]=t('
julia
MainSolver <: AbstractSolver

Main solver. Handle the solving of a model, and optional multithreaded and/or distributed subsolvers.

Arguments:

  • model::Model: A formal description of the targeted problem

  • state::_State: An internal state to store the info necessary to a solving run

  • options::Options: User options for this solver

  • subs::Vector{_SubSolver}: Optional subsolvers

source

',5))]),i("details",u,[i("summary",null,[s[12]||(s[12]=i("a",{id:"LocalSearchSolvers.MetaSolver",href:"#LocalSearchSolvers.MetaSolver"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.MetaSolver")],-1)),s[13]||(s[13]=a()),e(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[14]||(s[14]=i("p",null,"Abstract type to encapsulate all solver types that manages other solvers.",-1)),s[15]||(s[15]=i("p",null,[i("a",{href:"https://github.com/JuliaConstraints/LocalSearchSolvers.jl/blob/v0.4.9/src/solvers/meta.jl#L1-L3",target:"_blank",rel:"noreferrer"},"source")],-1))]),i("details",b,[i("summary",null,[s[16]||(s[16]=i("a",{id:"LocalSearchSolvers.Objective",href:"#LocalSearchSolvers.Objective"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.Objective")],-1)),s[17]||(s[17]=a()),e(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[18]||(s[18]=t('
julia
Objective{F <: Function}

A structure to handle objectives in a solver. `struct Objective{F <: Function} name::String f::F end``

source

',3))]),i("details",y,[i("summary",null,[s[19]||(s[19]=i("a",{id:"LocalSearchSolvers.Objective-Union{Tuple{F2}, Tuple{Any, LocalSearchSolvers.Objective{F2}}} where F2<:Function",href:"#LocalSearchSolvers.Objective-Union{Tuple{F2}, Tuple{Any, LocalSearchSolvers.Objective{F2}}} where F2<:Function"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.Objective")],-1)),s[20]||(s[20]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[21]||(s[21]=t('
julia
Objective(F, o::Objective{F2}) where {F2 <: Function}

Constructor used in specializing a solver. Should never be called externally.

source

',3))]),i("details",v,[i("summary",null,[s[22]||(s[22]=i("a",{id:"LocalSearchSolvers.Options",href:"#LocalSearchSolvers.Options"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.Options")],-1)),s[23]||(s[23]=a()),e(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[24]||(s[24]=t(`
julia
Options()

Arguments:

  • dynamic::Bool: is the model dynamic?

  • iteration::Union{Int, Float64}: limit on the number of iterations

  • print_level::Symbol: verbosity to choose among :silent, :minimal, :partial, :verbose

  • solutions::Int: number of solutions to return

  • specialize::Bool: should the types of the model be specialized or not. Usually yes for static problems. For dynamic in depends if the user intend to introduce new types. The specialized model is about 10% faster.

  • tabu_time::Int: DESCRIPTION

  • tabu_local::Int: DESCRIPTION

  • tabu_delta::Float64: DESCRIPTION

  • threads::Int: Number of threads to use

  • time_limit::Float64: time limit in seconds

  • \`function Options(; dynamic = false, iteration = 10000, print_level = :minimal, solutions = 1, specialize = !dynamic, tabu_time = 0, tabu_local = 0, tabu_delta = 0.0, threads = typemax(0), time_limit = Inf)

julia
# Setting options in JuMP syntax: print_level, time_limit, iteration
+model = Model(CBLS.Optimizer)
+set_optimizer_attribute(model, "iteration", 100)
+set_optimizer_attribute(model, "print_level", :verbose)
+set_time_limit_sec(model, 5.0)

source

`,5))]),i("details",S,[i("summary",null,[s[25]||(s[25]=i("a",{id:"LocalSearchSolvers.Variable",href:"#LocalSearchSolvers.Variable"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.Variable")],-1)),s[26]||(s[26]=a()),e(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[27]||(s[27]=t(`
julia
Variable{D <: AbstractDomain}

A structure containing the necessary information for a solver's variables: name, domain, and constraints it belongs.

struct Variable{D <: AbstractDomain}
+    domain::D
+    constraints::Indices{Int}
+end

source

`,4))]),i("details",E,[i("summary",null,[s[28]||(s[28]=i("a",{id:"LocalSearchSolvers._Model",href:"#LocalSearchSolvers._Model"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._Model")],-1)),s[29]||(s[29]=a()),e(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[30]||(s[30]=t(`
julia
_Model{V <: Variable{<:AbstractDomain},C <: Constraint{<:Function},O <: Objective{<:Function}}

A struct to model a problem as a set of variables, domains, constraints, and objectives.

struct _Model{V <: Variable{<:AbstractDomain},C <: Constraint{<:Function},O <: Objective{<:Function}}
+    variables::Dictionary{Int,V}
+    constraints::Dictionary{Int,C}
+    objectives::Dictionary{Int,O}
+
+    # counter to add new variables: vars, cons, objs
+    max_vars::Ref{Int}
+    max_cons::Ref{Int}
+    max_objs::Ref{Int}
+
+    # Bool to indicate if the _Model instance has been specialized (relatively to types)
+    specialized::Ref{Bool}
+
+    # Symbol to indicate the kind of model for specialized methods such as pretty printing
+    kind::Symbol
+end

source

`,4))]),i("details",m,[i("summary",null,[s[31]||(s[31]=i("a",{id:"LocalSearchSolvers._State",href:"#LocalSearchSolvers._State"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._State")],-1)),s[32]||(s[32]=a()),e(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[33]||(s[33]=t(`
julia
GeneralState{T <: Number}

A mutable structure to store the general state of a solver. All methods applied to GeneralState are forwarded to S <: AbstractSolver.

mutable struct GeneralState{T <: Number} <: AbstractState
+    configuration::Configuration{T}
+    cons_costs::Dictionary{Int, Float64}
+    last_improvement::Int
+    tabu::Dictionary{Int, Int}
+    vars_costs::Dictionary{Int, Float64}
+end

source

`,4))]),i("details",j,[i("summary",null,[s[34]||(s[34]=i("a",{id:"LocalSearchSolvers._SubSolver",href:"#LocalSearchSolvers._SubSolver"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._SubSolver")],-1)),s[35]||(s[35]=a()),e(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[36]||(s[36]=t('
julia
_SubSolver <: AbstractSolver

An internal solver type called by MetaSolver when multithreading is enabled.

Arguments:

  • id::Int: subsolver id for debugging

  • model::Model: a ref to the model of the main solver

  • state::_State: a deepcopy of the main solver that evolves independently

  • options::Options: a ref to the options of the main solver

source

',5))]),i("details",C,[i("summary",null,[s[37]||(s[37]=i("a",{id:"Base.empty!-Tuple{LocalSearchSolvers.MainSolver}",href:"#Base.empty!-Tuple{LocalSearchSolvers.MainSolver}"},[i("span",{class:"jlbinding"},"Base.empty!")],-1)),s[38]||(s[38]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[39]||(s[39]=t('
julia
empty!(s::Solver)

source

',2))]),i("details",F,[i("summary",null,[s[40]||(s[40]=i("a",{id:"Base.empty!-Tuple{LocalSearchSolvers._Model}",href:"#Base.empty!-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"Base.empty!")],-1)),s[41]||(s[41]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[42]||(s[42]=t('
julia
empty!(m::Model)

DOCSTRING

source

',3))]),i("details",L,[i("summary",null,[s[43]||(s[43]=i("a",{id:"Base.in-Tuple{Int64, LocalSearchSolvers.Constraint}",href:"#Base.in-Tuple{Int64, LocalSearchSolvers.Constraint}"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[44]||(s[44]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[45]||(s[45]=t('
julia
var::Int c::Constraint

source

',2))]),i("details",f,[i("summary",null,[s[46]||(s[46]=i("a",{id:"Base.in-Tuple{LocalSearchSolvers.Variable, Any}",href:"#Base.in-Tuple{LocalSearchSolvers.Variable, Any}"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[47]||(s[47]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[48]||(s[48]=t(`
julia
x::Variable constraint
+value  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

`,3))]),i("details",A,[i("summary",null,[s[49]||(s[49]=i("a",{id:"LocalSearchSolvers._add!-Tuple{LocalSearchSolvers.Constraint, Any}",href:"#LocalSearchSolvers._add!-Tuple{LocalSearchSolvers.Constraint, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._add!")],-1)),s[50]||(s[50]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[51]||(s[51]=t('
julia
_add!(c::Constraint, x)

Add the variable of indice x to c.

source

',3))]),i("details",M,[i("summary",null,[s[52]||(s[52]=i("a",{id:"LocalSearchSolvers._add_to_constraint!-Tuple{LocalSearchSolvers.Variable, Any}",href:"#LocalSearchSolvers._add_to_constraint!-Tuple{LocalSearchSolvers.Variable, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._add_to_constraint!")],-1)),s[53]||(s[53]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[54]||(s[54]=t('
julia
_add_to_constraint!(x::Variable, id)

Add a constraint id to the list of constraints of x.

source

',3))]),i("details",_,[i("summary",null,[s[55]||(s[55]=i("a",{id:"LocalSearchSolvers._check_restart-Tuple{Any}",href:"#LocalSearchSolvers._check_restart-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._check_restart")],-1)),s[56]||(s[56]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[57]||(s[57]=t('
julia
_check_restart(s)

Check if a restart of s is necessary. If s has subsolvers, this check is independent for all of them.

source

',3))]),i("details",T,[i("summary",null,[s[58]||(s[58]=i("a",{id:"LocalSearchSolvers._check_subs-Tuple{LocalSearchSolvers.AbstractSolver}",href:"#LocalSearchSolvers._check_subs-Tuple{LocalSearchSolvers.AbstractSolver}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._check_subs")],-1)),s[59]||(s[59]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[60]||(s[60]=t('
julia
_check_subs(s)

Check if any subsolver of a main solver s, for

  • Satisfaction, has a solution, then return it, resume the run otherwise

  • Optimization, has a better solution, then assign it to its internal state

source

',4))]),i("details",x,[i("summary",null,[s[61]||(s[61]=i("a",{id:"LocalSearchSolvers._compute!-Tuple{Any}",href:"#LocalSearchSolvers._compute!-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._compute!")],-1)),s[62]||(s[62]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[63]||(s[63]=t('
julia
_compute!(s; o::Int = 1, cons_lst = Indices{Int}())

Compute the objective o's value if s is satisfied and return the current error.

Arguments:

  • s: a solver

  • o: targeted objective

  • cons_lst: list of targeted constraints, if empty compute for the whole set

source

',5))]),i("details",D,[i("summary",null,[s[64]||(s[64]=i("a",{id:"LocalSearchSolvers._compute_cost!-Tuple{Any, Any, Any}",href:"#LocalSearchSolvers._compute_cost!-Tuple{Any, Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._compute_cost!")],-1)),s[65]||(s[65]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[66]||(s[66]=t('
julia
_compute_cost!(s, ind, c)

Compute the cost of constraint c with index ind.

source

',3))]),i("details",B,[i("summary",null,[s[67]||(s[67]=i("a",{id:"LocalSearchSolvers._compute_costs!-Tuple{Any}",href:"#LocalSearchSolvers._compute_costs!-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._compute_costs!")],-1)),s[68]||(s[68]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[69]||(s[69]=t('
julia
_compute_costs!(s; cons_lst::Indices{Int} = Indices{Int}())

Compute the cost of constraints c in cons_lst. If cons_lst is empty, compute the cost for all the constraints in s.

source

',3))]),i("details",O,[i("summary",null,[s[70]||(s[70]=i("a",{id:"LocalSearchSolvers._compute_objective!-Tuple{Any, LocalSearchSolvers.Objective}",href:"#LocalSearchSolvers._compute_objective!-Tuple{Any, LocalSearchSolvers.Objective}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._compute_objective!")],-1)),s[71]||(s[71]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[72]||(s[72]=t(`
julia
_compute_objective!(s, o::Objective)
+_compute_objective!(s, o = 1)

Compute the objective o's value.

source

`,3))]),i("details",J,[i("summary",null,[s[73]||(s[73]=i("a",{id:"LocalSearchSolvers._cons_cost!-Tuple{LocalSearchSolvers._State, Any, Any}",href:"#LocalSearchSolvers._cons_cost!-Tuple{LocalSearchSolvers._State, Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._cons_cost!")],-1)),s[74]||(s[74]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[75]||(s[75]=t('
julia
_cons_cost!(s::S, c, cost) where S <: Union{_State, AbstractSolver}

Set the cost of constraint c.

source

',3))]),i("details",w,[i("summary",null,[s[76]||(s[76]=i("a",{id:"LocalSearchSolvers._cons_cost-Tuple{LocalSearchSolvers._State, Any}",href:"#LocalSearchSolvers._cons_cost-Tuple{LocalSearchSolvers._State, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._cons_cost")],-1)),s[77]||(s[77]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[78]||(s[78]=t('
julia
_cons_cost(s::S, c) where S <: Union{_State, AbstractSolver}

Return the cost of constraint c.

source

',3))]),i("details",I,[i("summary",null,[s[79]||(s[79]=i("a",{id:"LocalSearchSolvers._cons_costs!-Tuple{LocalSearchSolvers._State, Any}",href:"#LocalSearchSolvers._cons_costs!-Tuple{LocalSearchSolvers._State, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._cons_costs!")],-1)),s[80]||(s[80]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[81]||(s[81]=t('
julia
_cons_costs!(s::S, costs) where S <: Union{_State, AbstractSolver}

Set the constraints costs.

source

',3))]),i("details",U,[i("summary",null,[s[82]||(s[82]=i("a",{id:"LocalSearchSolvers._cons_costs-Tuple{LocalSearchSolvers._State}",href:"#LocalSearchSolvers._cons_costs-Tuple{LocalSearchSolvers._State}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._cons_costs")],-1)),s[83]||(s[83]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[84]||(s[84]=t('
julia
_cons_costs(s::S) where S <: Union{_State, AbstractSolver}

Access the constraints costs.

source

',3))]),i("details",R,[i("summary",null,[s[85]||(s[85]=i("a",{id:"LocalSearchSolvers._constriction-Tuple{LocalSearchSolvers.Variable}",href:"#LocalSearchSolvers._constriction-Tuple{LocalSearchSolvers.Variable}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._constriction")],-1)),s[86]||(s[86]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[87]||(s[87]=t('
julia
_constriction(x::Variable)

Return the cosntriction of x, i.e. the number of constraints restricting x.

source

',3))]),i("details",z,[i("summary",null,[s[88]||(s[88]=i("a",{id:"LocalSearchSolvers._delete!-Tuple{LocalSearchSolvers.Constraint, Any}",href:"#LocalSearchSolvers._delete!-Tuple{LocalSearchSolvers.Constraint, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._delete!")],-1)),s[89]||(s[89]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[90]||(s[90]=t('
julia
_delete!(c::Constraint, x::Int)

Delete x from c.

source

',3))]),i("details",N,[i("summary",null,[s[91]||(s[91]=i("a",{id:"LocalSearchSolvers._delete_from_constraint!-Tuple{LocalSearchSolvers.Variable, Any}",href:"#LocalSearchSolvers._delete_from_constraint!-Tuple{LocalSearchSolvers.Variable, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._delete_from_constraint!")],-1)),s[92]||(s[92]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[93]||(s[93]=t('
julia
_delete_from_constraint!(x::Variable, id)

Delete a constraint id from the list of constraints of x.

source

',3))]),i("details",V,[i("summary",null,[s[94]||(s[94]=i("a",{id:"LocalSearchSolvers._draw!-Tuple{Any}",href:"#LocalSearchSolvers._draw!-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._draw!")],-1)),s[95]||(s[95]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[96]||(s[96]=t('
julia
_draw!(s)

Draw a random (re-)starting configuration.

source

',3))]),i("details",G,[i("summary",null,[s[97]||(s[97]=i("a",{id:"LocalSearchSolvers._dynamic!-Tuple{Any, Any}",href:"#LocalSearchSolvers._dynamic!-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._dynamic!")],-1)),s[98]||(s[98]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[99]||(s[99]=t('
julia
_dynamic!(options, dynamic) = begin

DOCSTRING

source

',3))]),i("details",P,[i("summary",null,[s[100]||(s[100]=i("a",{id:"LocalSearchSolvers._dynamic-Tuple{Any}",href:"#LocalSearchSolvers._dynamic-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._dynamic")],-1)),s[101]||(s[101]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[102]||(s[102]=t('
julia
_dynamic(options) = begin

DOCSTRING

source

',3))]),i("details",q,[i("summary",null,[s[103]||(s[103]=i("a",{id:"LocalSearchSolvers._find_rand_argmax-Tuple{Dictionaries.DictionaryView}",href:"#LocalSearchSolvers._find_rand_argmax-Tuple{Dictionaries.DictionaryView}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._find_rand_argmax")],-1)),s[104]||(s[104]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[105]||(s[105]=t('
julia
_find_rand_argmax(d::DictionaryView)

Compute argmax of d and select one element randomly.

source

',3))]),i("details",$,[i("summary",null,[s[106]||(s[106]=i("a",{id:"LocalSearchSolvers._get_constraints-Tuple{LocalSearchSolvers.Variable}",href:"#LocalSearchSolvers._get_constraints-Tuple{LocalSearchSolvers.Variable}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._get_constraints")],-1)),s[107]||(s[107]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[108]||(s[108]=t('
julia
_get_constraints(x::Variable)

Access the list of constraints of x.

source

',3))]),i("details",W,[i("summary",null,[s[109]||(s[109]=i("a",{id:"LocalSearchSolvers._get_vars-Tuple{LocalSearchSolvers.Constraint}",href:"#LocalSearchSolvers._get_vars-Tuple{LocalSearchSolvers.Constraint}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._get_vars")],-1)),s[110]||(s[110]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[111]||(s[111]=t('
julia
_get_vars(c::Constraint)

Returns the variables constrained by c.

source

',3))]),i("details",H,[i("summary",null,[s[112]||(s[112]=i("a",{id:"LocalSearchSolvers._inc_cons!-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers._inc_cons!-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._inc_cons!")],-1)),s[113]||(s[113]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[114]||(s[114]=t('
julia
_inc_vars!(m::M) where M <: Union{Model, AbstractSolver}

Increment the maximum constraint id that has been attributed to m.

source

',3))]),i("details",K,[i("summary",null,[s[115]||(s[115]=i("a",{id:"LocalSearchSolvers._inc_objs!-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers._inc_objs!-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._inc_objs!")],-1)),s[116]||(s[116]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[117]||(s[117]=t('
julia
_inc_vars!(m::M) where M <: Union{Model, AbstractSolver}

Increment the maximum objective id that has been attributed to m.

source

',3))]),i("details",Q,[i("summary",null,[s[118]||(s[118]=i("a",{id:"LocalSearchSolvers._inc_vars!-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers._inc_vars!-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._inc_vars!")],-1)),s[119]||(s[119]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[120]||(s[120]=t('
julia
_inc_vars!(m::M) where M <: Union{Model, AbstractSolver}

Increment the maximum variable id that has been attributed to m.

source

',3))]),i("details",X,[i("summary",null,[s[121]||(s[121]=i("a",{id:"LocalSearchSolvers._info_path!-Tuple{Any, Any}",href:"#LocalSearchSolvers._info_path!-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._info_path!")],-1)),s[122]||(s[122]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[123]||(s[123]=t('
julia
_info_path!(options, iterations) = begin

DOCSTRING

source

',3))]),i("details",Y,[i("summary",null,[s[124]||(s[124]=i("a",{id:"LocalSearchSolvers._info_path-Tuple{Any}",href:"#LocalSearchSolvers._info_path-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._info_path")],-1)),s[125]||(s[125]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[126]||(s[126]=t('
julia
_info_path(options, path)

DOCSTRING

source

',3))]),i("details",Z,[i("summary",null,[s[127]||(s[127]=i("a",{id:"LocalSearchSolvers._is_empty-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers._is_empty-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._is_empty")],-1)),s[128]||(s[128]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[129]||(s[129]=t('
julia
_is_empty(m::Model)

DOCSTRING

source

',3))]),i("details",ss,[i("summary",null,[s[130]||(s[130]=i("a",{id:"LocalSearchSolvers._iteration!-Tuple{Any, Any}",href:"#LocalSearchSolvers._iteration!-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._iteration!")],-1)),s[131]||(s[131]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[132]||(s[132]=t('
julia
_iteration!(options, iterations) = begin

DOCSTRING

source

',3))]),i("details",is,[i("summary",null,[s[133]||(s[133]=i("a",{id:"LocalSearchSolvers._iteration-Tuple{Any}",href:"#LocalSearchSolvers._iteration-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._iteration")],-1)),s[134]||(s[134]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[135]||(s[135]=t('
julia
_iteration(options) = begin

DOCSTRING

source

',3))]),i("details",as,[i("summary",null,[s[136]||(s[136]=i("a",{id:"LocalSearchSolvers._length-Tuple{LocalSearchSolvers.Constraint}",href:"#LocalSearchSolvers._length-Tuple{LocalSearchSolvers.Constraint}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._length")],-1)),s[137]||(s[137]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[138]||(s[138]=t('
julia
_length(c::Constraint)

Return the number of constrained variables by c.

source

',3))]),i("details",ls,[i("summary",null,[s[139]||(s[139]=i("a",{id:"LocalSearchSolvers._max_cons-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers._max_cons-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._max_cons")],-1)),s[140]||(s[140]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[141]||(s[141]=t('
julia
_max_cons(m::M) where M <: Union{Model, AbstractSolver}

Access the maximum constraint id that has been attributed to m.

source

',3))]),i("details",es,[i("summary",null,[s[142]||(s[142]=i("a",{id:"LocalSearchSolvers._max_objs-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers._max_objs-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._max_objs")],-1)),s[143]||(s[143]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[144]||(s[144]=t('
julia
_max_objs(m::M) where M <: Union{Model, AbstractSolver}

Access the maximum objective id that has been attributed to m.

source

',3))]),i("details",ts,[i("summary",null,[s[145]||(s[145]=i("a",{id:"LocalSearchSolvers._max_vars-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers._max_vars-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._max_vars")],-1)),s[146]||(s[146]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[147]||(s[147]=t('
julia
_max_vars(m::M) where M <: Union{Model, AbstractSolver}

Access the maximum variable id that has been attributed to m.

source

',3))]),i("details",ns,[i("summary",null,[s[148]||(s[148]=i("a",{id:"LocalSearchSolvers._move!",href:"#LocalSearchSolvers._move!"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._move!")],-1)),s[149]||(s[149]=a()),e(l,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[150]||(s[150]=t('
julia
_move!(s, x::Int, dim::Int = 0)

Perform an improving move in x neighbourhood if possible.

Arguments:

  • s: a solver of type S <: AbstractSolver

  • x: selected variable id

  • dim: describe the dimension of the considered neighbourhood

source

',5))]),i("details",os,[i("summary",null,[s[151]||(s[151]=i("a",{id:"LocalSearchSolvers._neighbours",href:"#LocalSearchSolvers._neighbours"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._neighbours")],-1)),s[152]||(s[152]=a()),e(l,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[153]||(s[153]=t('
julia
_neighbours(s, x, dim = 0)

DOCSTRING

Arguments:

  • s: DESCRIPTION

  • x: DESCRIPTION

  • dim: DESCRIPTION

source

',5))]),i("details",rs,[i("summary",null,[s[154]||(s[154]=i("a",{id:"LocalSearchSolvers._optimizing!-Tuple{LocalSearchSolvers._State}",href:"#LocalSearchSolvers._optimizing!-Tuple{LocalSearchSolvers._State}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._optimizing!")],-1)),s[155]||(s[155]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[156]||(s[156]=t('
julia
_optimizing!(s::S) where S <: Union{_State, AbstractSolver}

Set the solver optimizing status to true.

source

',3))]),i("details",ps,[i("summary",null,[s[157]||(s[157]=i("a",{id:"LocalSearchSolvers._optimizing-Tuple{LocalSearchSolvers._State}",href:"#LocalSearchSolvers._optimizing-Tuple{LocalSearchSolvers._State}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._optimizing")],-1)),s[158]||(s[158]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[159]||(s[159]=t('
julia
_optimizing(s::S) where S <: Union{_State, AbstractSolver}

Check if s is in an optimizing state.

source

',3))]),i("details",hs,[i("summary",null,[s[160]||(s[160]=i("a",{id:"LocalSearchSolvers._print_level!-Tuple{Any, Any}",href:"#LocalSearchSolvers._print_level!-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._print_level!")],-1)),s[161]||(s[161]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[162]||(s[162]=t('
julia
_print_level!(options, level) = begin

DOCSTRING

source

',3))]),i("details",ds,[i("summary",null,[s[163]||(s[163]=i("a",{id:"LocalSearchSolvers._print_level-Tuple{Any}",href:"#LocalSearchSolvers._print_level-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._print_level")],-1)),s[164]||(s[164]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[165]||(s[165]=t('
julia
_print_level(options) = begin

DOCSTRING

source

',3))]),i("details",ks,[i("summary",null,[s[166]||(s[166]=i("a",{id:"LocalSearchSolvers._process_threads_map!-Tuple{Any, AbstractDict}",href:"#LocalSearchSolvers._process_threads_map!-Tuple{Any, AbstractDict}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._process_threads_map!")],-1)),s[167]||(s[167]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[168]||(s[168]=t('
julia
_process_threads_map!(options, ptm)

TBW

source

',3))]),i("details",cs,[i("summary",null,[s[169]||(s[169]=i("a",{id:"LocalSearchSolvers._process_threads_map-Tuple{Any}",href:"#LocalSearchSolvers._process_threads_map-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._process_threads_map")],-1)),s[170]||(s[170]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[171]||(s[171]=t('
julia
_process_threads_map(options)

TBW

source

',3))]),i("details",gs,[i("summary",null,[s[172]||(s[172]=i("a",{id:"LocalSearchSolvers._restart!",href:"#LocalSearchSolvers._restart!"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._restart!")],-1)),s[173]||(s[173]=a()),e(l,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[174]||(s[174]=t('
julia
_restart!(s, k = 10)

Restart a solver.

source

',3))]),i("details",us,[i("summary",null,[s[175]||(s[175]=i("a",{id:"LocalSearchSolvers._satisfying!-Tuple{LocalSearchSolvers._State}",href:"#LocalSearchSolvers._satisfying!-Tuple{LocalSearchSolvers._State}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._satisfying!")],-1)),s[176]||(s[176]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[177]||(s[177]=t('
julia
_satisfying!(s::S) where S <: Union{_State, AbstractSolver}

Set the solver optimizing status to false.

source

',3))]),i("details",bs,[i("summary",null,[s[178]||(s[178]=i("a",{id:"LocalSearchSolvers._select_worse-Tuple{Any}",href:"#LocalSearchSolvers._select_worse-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._select_worse")],-1)),s[179]||(s[179]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[180]||(s[180]=t('
julia
_select_worse(s::S) where S <: Union{_State, AbstractSolver}

Within the non-tabu variables, select the one with the worse error .

source

',3))]),i("details",ys,[i("summary",null,[s[181]||(s[181]=i("a",{id:"LocalSearchSolvers._set!-Tuple{LocalSearchSolvers._State, Any, Any}",href:"#LocalSearchSolvers._set!-Tuple{LocalSearchSolvers._State, Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._set!")],-1)),s[182]||(s[182]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[183]||(s[183]=t('
julia
_set!(s::S, x, val) where S <: Union{_State, AbstractSolver}

Set the value of variable x to val.

source

',3))]),i("details",vs,[i("summary",null,[s[184]||(s[184]=i("a",{id:"LocalSearchSolvers._set_domain!-Tuple{LocalSearchSolvers._Model, Any, Any}",href:"#LocalSearchSolvers._set_domain!-Tuple{LocalSearchSolvers._Model, Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._set_domain!")],-1)),s[185]||(s[185]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[186]||(s[186]=t('
julia
_set_domain!(m::Model, x, values)

DOCSTRING

Arguments:

  • m: DESCRIPTION

  • x: DESCRIPTION

  • values: DESCRIPTION

source

',5))]),i("details",Ss,[i("summary",null,[s[187]||(s[187]=i("a",{id:"LocalSearchSolvers._solutions!-Tuple{Any, Any}",href:"#LocalSearchSolvers._solutions!-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._solutions!")],-1)),s[188]||(s[188]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[189]||(s[189]=t('
julia
_solutions!(options, solutions) = begin

DOCSTRING

source

',3))]),i("details",Es,[i("summary",null,[s[190]||(s[190]=i("a",{id:"LocalSearchSolvers._solutions-Tuple{Any}",href:"#LocalSearchSolvers._solutions-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._solutions")],-1)),s[191]||(s[191]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[192]||(s[192]=t('
julia
_solutions(options) = begin

DOCSTRING

source

',3))]),i("details",ms,[i("summary",null,[s[193]||(s[193]=i("a",{id:"LocalSearchSolvers._specialize!-Tuple{Any, Any}",href:"#LocalSearchSolvers._specialize!-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._specialize!")],-1)),s[194]||(s[194]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[195]||(s[195]=t('
julia
_specialize!(options, specialize) = begin

DOCSTRING

source

',3))]),i("details",js,[i("summary",null,[s[196]||(s[196]=i("a",{id:"LocalSearchSolvers._specialize-Tuple{Any}",href:"#LocalSearchSolvers._specialize-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._specialize")],-1)),s[197]||(s[197]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[198]||(s[198]=t('
julia
_specialize(options) = begin

DOCSTRING

source

',3))]),i("details",Cs,[i("summary",null,[s[199]||(s[199]=i("a",{id:"LocalSearchSolvers._step!-Tuple{Any}",href:"#LocalSearchSolvers._step!-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._step!")],-1)),s[200]||(s[200]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[201]||(s[201]=t('
julia
_step!(s)

Iterate a step of the solver run.

source

',3))]),i("details",Fs,[i("summary",null,[s[202]||(s[202]=i("a",{id:"LocalSearchSolvers._swap_value!-Tuple{LocalSearchSolvers._State, Any, Any}",href:"#LocalSearchSolvers._swap_value!-Tuple{LocalSearchSolvers._State, Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._swap_value!")],-1)),s[203]||(s[203]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[204]||(s[204]=t('
julia
_set!(s::S, x, y) where S <: Union{_State, AbstractSolver}

Swap the values of variables x and y.

source

',3))]),i("details",Ls,[i("summary",null,[s[205]||(s[205]=i("a",{id:"LocalSearchSolvers._tabu_delta!-Tuple{Any, Any}",href:"#LocalSearchSolvers._tabu_delta!-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._tabu_delta!")],-1)),s[206]||(s[206]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[207]||(s[207]=t('
julia
_tabu_delta!(options, time) = begin

DOCSTRING

source

',3))]),i("details",fs,[i("summary",null,[s[208]||(s[208]=i("a",{id:"LocalSearchSolvers._tabu_delta-Tuple{Any}",href:"#LocalSearchSolvers._tabu_delta-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._tabu_delta")],-1)),s[209]||(s[209]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[210]||(s[210]=t('
julia
_tabu_delta(options) = begin

DOCSTRING

source

',3))]),i("details",As,[i("summary",null,[s[211]||(s[211]=i("a",{id:"LocalSearchSolvers._tabu_local!-Tuple{Any, Any}",href:"#LocalSearchSolvers._tabu_local!-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._tabu_local!")],-1)),s[212]||(s[212]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[213]||(s[213]=t('
julia
_tabu_local!(options, time) = begin

DOCSTRING

source

',3))]),i("details",Ms,[i("summary",null,[s[214]||(s[214]=i("a",{id:"LocalSearchSolvers._tabu_local-Tuple{Any}",href:"#LocalSearchSolvers._tabu_local-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._tabu_local")],-1)),s[215]||(s[215]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[216]||(s[216]=t('
julia
_tabu_local(options) = begin

DOCSTRING

source

',3))]),i("details",_s,[i("summary",null,[s[217]||(s[217]=i("a",{id:"LocalSearchSolvers._tabu_time!-Tuple{Any, Any}",href:"#LocalSearchSolvers._tabu_time!-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._tabu_time!")],-1)),s[218]||(s[218]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[219]||(s[219]=t('
julia
_tabu_time!(options, time) = begin

DOCSTRING

source

',3))]),i("details",Ts,[i("summary",null,[s[220]||(s[220]=i("a",{id:"LocalSearchSolvers._tabu_time-Tuple{Any}",href:"#LocalSearchSolvers._tabu_time-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._tabu_time")],-1)),s[221]||(s[221]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[222]||(s[222]=t('
julia
_tabu_time(options) = begin

DOCSTRING

source

',3))]),i("details",xs,[i("summary",null,[s[223]||(s[223]=i("a",{id:"LocalSearchSolvers._threads",href:"#LocalSearchSolvers._threads"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._threads")],-1)),s[224]||(s[224]=a()),e(l,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[225]||(s[225]=t('
julia
_threads(options) = begin

DOCSTRING

source

',3))]),i("details",Ds,[i("summary",null,[s[226]||(s[226]=i("a",{id:"LocalSearchSolvers._threads!",href:"#LocalSearchSolvers._threads!"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._threads!")],-1)),s[227]||(s[227]=a()),e(l,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[228]||(s[228]=t('
julia
_threads!(options, threads) = begin

DOCSTRING

source

',3))]),i("details",Bs,[i("summary",null,[s[229]||(s[229]=i("a",{id:"LocalSearchSolvers._time_limit!-Tuple{Any, Tuple{Bool, Float64}}",href:"#LocalSearchSolvers._time_limit!-Tuple{Any, Tuple{Bool, Float64}}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._time_limit!")],-1)),s[230]||(s[230]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[231]||(s[231]=t('
julia
_time_limit!(options, time::Time) = begin

DOCSTRING

source

',3))]),i("details",Os,[i("summary",null,[s[232]||(s[232]=i("a",{id:"LocalSearchSolvers._time_limit-Tuple{Any}",href:"#LocalSearchSolvers._time_limit-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._time_limit")],-1)),s[233]||(s[233]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[234]||(s[234]=t('
julia
_time_limit(options)

DOCSTRING

source

',3))]),i("details",Js,[i("summary",null,[s[235]||(s[235]=i("a",{id:"LocalSearchSolvers._to_union-Tuple{Any}",href:"#LocalSearchSolvers._to_union-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._to_union")],-1)),s[236]||(s[236]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[237]||(s[237]=t('
julia
_to_union(datatype)

Make a minimal Union type from a collection of data types.

source

',3))]),i("details",ws,[i("summary",null,[s[238]||(s[238]=i("a",{id:"LocalSearchSolvers._value!-Tuple{LocalSearchSolvers._State, Any, Any}",href:"#LocalSearchSolvers._value!-Tuple{LocalSearchSolvers._State, Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._value!")],-1)),s[239]||(s[239]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[240]||(s[240]=t('
julia
_value!(s::S, x, val) where S <: Union{_State, AbstractSolver}

Set the value of variable x to val.

source

',3))]),i("details",Is,[i("summary",null,[s[241]||(s[241]=i("a",{id:"LocalSearchSolvers._value-Tuple{LocalSearchSolvers._State, Any}",href:"#LocalSearchSolvers._value-Tuple{LocalSearchSolvers._State, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._value")],-1)),s[242]||(s[242]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[243]||(s[243]=t('
julia
_value(s::S, x) where S <: Union{_State, AbstractSolver}

Return the value of variable x.

source

',3))]),i("details",Us,[i("summary",null,[s[244]||(s[244]=i("a",{id:"LocalSearchSolvers._values!-Union{Tuple{T}, Tuple{LocalSearchSolvers._State{T}, Any}} where T<:Number",href:"#LocalSearchSolvers._values!-Union{Tuple{T}, Tuple{LocalSearchSolvers._State{T}, Any}} where T<:Number"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._values!")],-1)),s[245]||(s[245]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[246]||(s[246]=t('
julia
_values!(s::S, values) where S <: Union{_State, AbstractSolver}

Set the variables values.

source

',3))]),i("details",Rs,[i("summary",null,[s[247]||(s[247]=i("a",{id:"LocalSearchSolvers._values-Tuple{LocalSearchSolvers._State}",href:"#LocalSearchSolvers._values-Tuple{LocalSearchSolvers._State}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._values")],-1)),s[248]||(s[248]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[249]||(s[249]=t('
julia
_vars_costs(s::S) where S <: Union{_State, AbstractSolver}

Access the variables costs.

source

',3))]),i("details",zs,[i("summary",null,[s[250]||(s[250]=i("a",{id:"LocalSearchSolvers._var_cost!-Tuple{LocalSearchSolvers._State, Any, Any}",href:"#LocalSearchSolvers._var_cost!-Tuple{LocalSearchSolvers._State, Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._var_cost!")],-1)),s[251]||(s[251]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[252]||(s[252]=t('
julia
_var_cost!(s::S, x, cost) where S <: Union{_State, AbstractSolver}

Set the cost of variable x.

source

',3))]),i("details",Ns,[i("summary",null,[s[253]||(s[253]=i("a",{id:"LocalSearchSolvers._var_cost-Tuple{LocalSearchSolvers._State, Any}",href:"#LocalSearchSolvers._var_cost-Tuple{LocalSearchSolvers._State, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._var_cost")],-1)),s[254]||(s[254]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[255]||(s[255]=t('
julia
_var_cost(s::S, x) where S <: Union{_State, AbstractSolver}

Return the cost of variable x.

source

',3))]),i("details",Vs,[i("summary",null,[s[256]||(s[256]=i("a",{id:"LocalSearchSolvers._vars_costs!-Tuple{LocalSearchSolvers._State, Any}",href:"#LocalSearchSolvers._vars_costs!-Tuple{LocalSearchSolvers._State, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._vars_costs!")],-1)),s[257]||(s[257]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[258]||(s[258]=t('
julia
_vars_costs!(s::S, costs) where S <: Union{_State, AbstractSolver}

Set the variables costs.

source

',3))]),i("details",Gs,[i("summary",null,[s[259]||(s[259]=i("a",{id:"LocalSearchSolvers._vars_costs-Tuple{LocalSearchSolvers._State}",href:"#LocalSearchSolvers._vars_costs-Tuple{LocalSearchSolvers._State}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._vars_costs")],-1)),s[260]||(s[260]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[261]||(s[261]=t('
julia
_vars_costs(s::S) where S <: Union{_State, AbstractSolver}

Access the variables costs.

source

',3))]),i("details",Ps,[i("summary",null,[s[262]||(s[262]=i("a",{id:"LocalSearchSolvers._verbose-Tuple{Any, Any}",href:"#LocalSearchSolvers._verbose-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._verbose")],-1)),s[263]||(s[263]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[264]||(s[264]=t('
julia
_verbose(settings, str)

Temporary logging function. #TODO: use better log instead (LoggingExtra.jl)

source

',3))]),i("details",qs,[i("summary",null,[s[265]||(s[265]=i("a",{id:"LocalSearchSolvers.add!-Tuple{LocalSearchSolvers._Model, LocalSearchSolvers.Variable}",href:"#LocalSearchSolvers.add!-Tuple{LocalSearchSolvers._Model, LocalSearchSolvers.Variable}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.add!")],-1)),s[266]||(s[266]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[267]||(s[267]=t(`
julia
add!(m::M, x) where M <: Union{Model, AbstractSolver}
+add!(m::M, c) where M <: Union{Model, AbstractSolver}
+add!(m::M, o) where M <: Union{Model, AbstractSolver}

Add a variable x, a constraint c, or an objective o to m.

source

`,3))]),i("details",$s,[i("summary",null,[s[268]||(s[268]=i("a",{id:"LocalSearchSolvers.add_value!-Tuple{LocalSearchSolvers._Model, Any, Any}",href:"#LocalSearchSolvers.add_value!-Tuple{LocalSearchSolvers._Model, Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.add_value!")],-1)),s[269]||(s[269]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[270]||(s[270]=t('
julia
add_value!(m::M, x, val) where M <: Union{Model, AbstractSolver}

Add val to x domain.

source

',3))]),i("details",Ws,[i("summary",null,[s[271]||(s[271]=i("a",{id:"LocalSearchSolvers.add_var_to_cons!-Tuple{LocalSearchSolvers._Model, Any, Any}",href:"#LocalSearchSolvers.add_var_to_cons!-Tuple{LocalSearchSolvers._Model, Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.add_var_to_cons!")],-1)),s[272]||(s[272]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[273]||(s[273]=t('
julia
add_var_to_cons!(m::M, c, x) where M <: Union{Model, AbstractSolver}

Add x to the constraint c list of restricted variables.

source

',3))]),i("details",Hs,[i("summary",null,[s[274]||(s[274]=i("a",{id:"LocalSearchSolvers.constraint!-Union{Tuple{V}, Tuple{LocalSearchSolvers._Model, Any, V}} where V<:(AbstractVector{<:Number})",href:"#LocalSearchSolvers.constraint!-Union{Tuple{V}, Tuple{LocalSearchSolvers._Model, Any, V}} where V<:(AbstractVector{<:Number})"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.constraint!")],-1)),s[275]||(s[275]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[276]||(s[276]=t('
julia
constraint!(m::M, func, vars) where M <: Union{Model, AbstractSolver}

Add a constraint with an error function func defined over variables vars.

source

',3))]),i("details",Ks,[i("summary",null,[s[277]||(s[277]=i("a",{id:"LocalSearchSolvers.constraint-Tuple{Any, Any}",href:"#LocalSearchSolvers.constraint-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.constraint")],-1)),s[278]||(s[278]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[279]||(s[279]=t('
julia
constraint(f, vars)

DOCSTRING

source

',3))]),i("details",Qs,[i("summary",null,[s[280]||(s[280]=i("a",{id:"LocalSearchSolvers.constriction-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.constriction-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.constriction")],-1)),s[281]||(s[281]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[282]||(s[282]=t('
julia
constriction(m::M, x) where M <: Union{Model, AbstractSolver}

Return the constriction of variable x.

source

',3))]),i("details",Xs,[i("summary",null,[s[283]||(s[283]=i("a",{id:"LocalSearchSolvers.decay_tabu!-Tuple{Any}",href:"#LocalSearchSolvers.decay_tabu!-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.decay_tabu!")],-1)),s[284]||(s[284]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[285]||(s[285]=t('
julia
_decay_tabu!(s::S) where S <: Union{_State, AbstractSolver}

Decay the tabu list.

source

',3))]),i("details",Ys,[i("summary",null,[s[286]||(s[286]=i("a",{id:"LocalSearchSolvers.decrease_tabu!-Tuple{Any, Any}",href:"#LocalSearchSolvers.decrease_tabu!-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.decrease_tabu!")],-1)),s[287]||(s[287]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[288]||(s[288]=t('
julia
_decrease_tabu!(s::S, x) where S <: Union{_State, AbstractSolver}

Decrement the tabu value of variable x.

source

',3))]),i("details",Zs,[i("summary",null,[s[289]||(s[289]=i("a",{id:"LocalSearchSolvers.delete_tabu!-Tuple{Any, Any}",href:"#LocalSearchSolvers.delete_tabu!-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.delete_tabu!")],-1)),s[290]||(s[290]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[291]||(s[291]=t('
julia
_delete_tabu!(s::S, x) where S <: Union{_State, AbstractSolver}

Delete the tabu entry of variable x.

source

',3))]),i("details",si,[i("summary",null,[s[292]||(s[292]=i("a",{id:"LocalSearchSolvers.delete_value!-Tuple{LocalSearchSolvers._Model, Any, Any}",href:"#LocalSearchSolvers.delete_value!-Tuple{LocalSearchSolvers._Model, Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.delete_value!")],-1)),s[293]||(s[293]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[294]||(s[294]=t('
julia
delete_value(m::M, x, val) where M <: Union{Model, AbstractSolver}

Delete val from x domain.

source

',3))]),i("details",ii,[i("summary",null,[s[295]||(s[295]=i("a",{id:"LocalSearchSolvers.delete_var_from_cons!-Tuple{LocalSearchSolvers._Model, Any, Any}",href:"#LocalSearchSolvers.delete_var_from_cons!-Tuple{LocalSearchSolvers._Model, Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.delete_var_from_cons!")],-1)),s[296]||(s[296]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[297]||(s[297]=t('
julia
delete_var_from_cons(m::M, c, x) where M <: Union{Model, AbstractSolver}

Delete x from the constraint c list of restricted variables.

source

',3))]),i("details",ai,[i("summary",null,[s[298]||(s[298]=i("a",{id:"LocalSearchSolvers.describe-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers.describe-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.describe")],-1)),s[299]||(s[299]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[300]||(s[300]=t('
julia
describe(m::M) where M <: Union{Model, AbstractSolver}

Describe the model.

source

',3))]),i("details",li,[i("summary",null,[s[301]||(s[301]=i("a",{id:"LocalSearchSolvers.domain_size-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.domain_size-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.domain_size")],-1)),s[302]||(s[302]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[303]||(s[303]=t('
julia
domain_size(m::Model, x) = begin

DOCSTRING

source

',3))]),i("details",ei,[i("summary",null,[s[304]||(s[304]=i("a",{id:"LocalSearchSolvers.draw-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.draw-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.draw")],-1)),s[305]||(s[305]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[306]||(s[306]=t('
julia
draw(m::M, x) where M <: Union{Model, AbstractSolver}

Draw a random value of x domain.

source

',3))]),i("details",ti,[i("summary",null,[s[307]||(s[307]=i("a",{id:"LocalSearchSolvers.empty_tabu!-Tuple{Any}",href:"#LocalSearchSolvers.empty_tabu!-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.empty_tabu!")],-1)),s[308]||(s[308]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[309]||(s[309]=t('
julia
_empty_tabu!(s::S) where S <: Union{_State, AbstractSolver}

Empty the tabu list.

source

',3))]),i("details",ni,[i("summary",null,[s[310]||(s[310]=i("a",{id:"LocalSearchSolvers.get_cons_from_var-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.get_cons_from_var-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.get_cons_from_var")],-1)),s[311]||(s[311]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[312]||(s[312]=t('
julia
get_cons_from_var(m::M, x) where M <: Union{Model, AbstractSolver}

Access the constraints restricting variable x.

source

',3))]),i("details",oi,[i("summary",null,[s[313]||(s[313]=i("a",{id:"LocalSearchSolvers.get_constraint-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.get_constraint-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.get_constraint")],-1)),s[314]||(s[314]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[315]||(s[315]=t('
julia
get_constraint(m::M, c) where M <: Union{Model, AbstractSolver}

Access the constraint c.

source

',3))]),i("details",ri,[i("summary",null,[s[316]||(s[316]=i("a",{id:"LocalSearchSolvers.get_constraints-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers.get_constraints-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.get_constraints")],-1)),s[317]||(s[317]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[318]||(s[318]=t('
julia
get_constraints(m::M) where M <: Union{Model, AbstractSolver}

Access the constraints of m.

source

',3))]),i("details",pi,[i("summary",null,[s[319]||(s[319]=i("a",{id:"LocalSearchSolvers.get_domain-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.get_domain-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.get_domain")],-1)),s[320]||(s[320]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[321]||(s[321]=t('
julia
get_domain(m::M, x) where M <: Union{Model, AbstractSolver}

Access the domain of variable x.

source

',3))]),i("details",hi,[i("summary",null,[s[322]||(s[322]=i("a",{id:"LocalSearchSolvers.get_kind-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers.get_kind-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.get_kind")],-1)),s[323]||(s[323]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[324]||(s[324]=t('
julia
get_kind(m::M) where M <: Union{Model, AbstractSolver}

Access the kind of m, such as :sudoku or :generic (default).

source

',3))]),i("details",di,[i("summary",null,[s[325]||(s[325]=i("a",{id:"LocalSearchSolvers.get_name-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.get_name-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.get_name")],-1)),s[326]||(s[326]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[327]||(s[327]=t('
julia
get_name(m::M, x) where M <: Union{Model, AbstractSolver}

Access the name of variable x.

source

',3))]),i("details",ki,[i("summary",null,[s[328]||(s[328]=i("a",{id:"LocalSearchSolvers.get_objective-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.get_objective-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.get_objective")],-1)),s[329]||(s[329]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[330]||(s[330]=t('
julia
get_objective(m::M, o) where M <: Union{Model, AbstractSolver}

Access the objective o.

source

',3))]),i("details",ci,[i("summary",null,[s[331]||(s[331]=i("a",{id:"LocalSearchSolvers.get_objectives-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers.get_objectives-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.get_objectives")],-1)),s[332]||(s[332]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[333]||(s[333]=t('
julia
get_objectives(m::M) where M <: Union{Model, AbstractSolver}

Access the objectives of m.

source

',3))]),i("details",gi,[i("summary",null,[s[334]||(s[334]=i("a",{id:"LocalSearchSolvers.get_time_stamp-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers.get_time_stamp-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.get_time_stamp")],-1)),s[335]||(s[335]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[336]||(s[336]=t('
julia
get_time_stamp(m::M) where M <: Union{Model, AbstractSolver}

Access the time (since epoch) when the model was created. This time stamp is for internal performance measurement.

source

',3))]),i("details",ui,[i("summary",null,[s[337]||(s[337]=i("a",{id:"LocalSearchSolvers.get_variable-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.get_variable-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.get_variable")],-1)),s[338]||(s[338]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[339]||(s[339]=t('
julia
get_variable(m::M, x) where M <: Union{Model, AbstractSolver}

Access the variable x.

source

',3))]),i("details",bi,[i("summary",null,[s[340]||(s[340]=i("a",{id:"LocalSearchSolvers.get_variables-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers.get_variables-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.get_variables")],-1)),s[341]||(s[341]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[342]||(s[342]=t('
julia
get_variables(m::M) where M <: Union{Model, AbstractSolver}

Access the variables of m.

source

',3))]),i("details",yi,[i("summary",null,[s[343]||(s[343]=i("a",{id:"LocalSearchSolvers.get_vars_from_cons-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.get_vars_from_cons-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.get_vars_from_cons")],-1)),s[344]||(s[344]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[345]||(s[345]=t('
julia
get_vars_from_cons(m::M, c) where M <: Union{Model, AbstractSolver}

Access the variables restricted by constraint c.

source

',3))]),i("details",vi,[i("summary",null,[s[346]||(s[346]=i("a",{id:"LocalSearchSolvers.insert_tabu!-Tuple{Any, Any, Val{:tabu}}",href:"#LocalSearchSolvers.insert_tabu!-Tuple{Any, Any, Val{:tabu}}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.insert_tabu!")],-1)),s[347]||(s[347]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[348]||(s[348]=t('
julia
_insert_tabu!(s::S, x, tabu_time) where S <: Union{_State, AbstractSolver}

Insert the bariable x as tabu for tabu_time.

source

',3))]),i("details",Si,[i("summary",null,[s[349]||(s[349]=i("a",{id:"LocalSearchSolvers.is_sat-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers.is_sat-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.is_sat")],-1)),s[350]||(s[350]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[351]||(s[351]=t('
julia
is_sat(m::M) where M <: Union{Model, AbstractSolver}

Return true if m is a satisfaction model.

source

',3))]),i("details",Ei,[i("summary",null,[s[352]||(s[352]=i("a",{id:"LocalSearchSolvers.is_specialized-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers.is_specialized-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.is_specialized")],-1)),s[353]||(s[353]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[354]||(s[354]=t('
julia
is_specialized(m::M) where M <: Union{Model, AbstractSolver}

Return true if the model is already specialized.

source

',3))]),i("details",mi,[i("summary",null,[s[355]||(s[355]=i("a",{id:"LocalSearchSolvers.length_cons-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.length_cons-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.length_cons")],-1)),s[356]||(s[356]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[357]||(s[357]=t('
julia
length_cons(m::M, c) where M <: Union{Model, AbstractSolver}

Return the length of constraint c.

source

',3))]),i("details",ji,[i("summary",null,[s[358]||(s[358]=i("a",{id:"LocalSearchSolvers.length_cons-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers.length_cons-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.length_cons")],-1)),s[359]||(s[359]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[360]||(s[360]=t('
julia
length_cons(m::M) where M <: Union{Model, AbstractSolver}

Return the number of constraints in m.

source

',3))]),i("details",Ci,[i("summary",null,[s[361]||(s[361]=i("a",{id:"LocalSearchSolvers.length_objs-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers.length_objs-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.length_objs")],-1)),s[362]||(s[362]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[363]||(s[363]=t('
julia
length_objs(m::M) where M <: Union{Model, AbstractSolver}

Return the number of objectives in m.

source

',3))]),i("details",Fi,[i("summary",null,[s[364]||(s[364]=i("a",{id:"LocalSearchSolvers.length_tabu-Tuple{Any}",href:"#LocalSearchSolvers.length_tabu-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.length_tabu")],-1)),s[365]||(s[365]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[366]||(s[366]=t('
julia
_length_tabu!(s::S) where S <: Union{_State, AbstractSolver}

Return the length of the tabu list.

source

',3))]),i("details",Li,[i("summary",null,[s[367]||(s[367]=i("a",{id:"LocalSearchSolvers.length_var-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.length_var-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.length_var")],-1)),s[368]||(s[368]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[369]||(s[369]=t('
julia
length_var(m::M, x) where M <: Union{Model, AbstractSolver}

Return the domain length of variable x.

source

',3))]),i("details",fi,[i("summary",null,[s[370]||(s[370]=i("a",{id:"LocalSearchSolvers.length_vars-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers.length_vars-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.length_vars")],-1)),s[371]||(s[371]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[372]||(s[372]=t('
julia
length_vars(m::M) where M <: Union{Model, AbstractSolver}

Return the number of variables in m.

source

',3))]),i("details",Ai,[i("summary",null,[s[373]||(s[373]=i("a",{id:"LocalSearchSolvers.max_domains_size-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.max_domains_size-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.max_domains_size")],-1)),s[374]||(s[374]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[375]||(s[375]=t('
julia
max_domains_size(m::Model, vars) = begin

DOCSTRING

source

',3))]),i("details",Mi,[i("summary",null,[s[376]||(s[376]=i("a",{id:"LocalSearchSolvers.model-Tuple{}",href:"#LocalSearchSolvers.model-Tuple{}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.model")],-1)),s[377]||(s[377]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[378]||(s[378]=t('
julia
model()

Construct a _Model, empty by default. It is recommended to add the constraints, variables, and objectives from an empty _Model. The following keyword arguments are available,

  • vars=Dictionary{Int,Variable}(): collection of variables

  • cons=Dictionary{Int,Constraint}(): collection of constraints

  • objs=Dictionary{Int,Objective}(): collection of objectives

  • kind=:generic: the kind of problem modeled (useful for specialized methods such as pretty printing)

source

',4))]),i("details",_i,[i("summary",null,[s[379]||(s[379]=i("a",{id:"LocalSearchSolvers.o_dist_extrema-Tuple{Any}",href:"#LocalSearchSolvers.o_dist_extrema-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.o_dist_extrema")],-1)),s[380]||(s[380]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[381]||(s[381]=t('
julia
dist_extrema(values::T...) where {T <: Number}

Computes the distance between extrema in an ordered set.

source

',3))]),i("details",Ti,[i("summary",null,[s[382]||(s[382]=i("a",{id:"LocalSearchSolvers.o_mincut-Tuple{Any, Any}",href:"#LocalSearchSolvers.o_mincut-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.o_mincut")],-1)),s[383]||(s[383]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[384]||(s[384]=t('
julia
o_mincut(graph, values; interdiction = 0)

Compute the capacity of a cut (determined by the state of the solver) with a possible interdiction on the highest capacited links.

source

',3))]),i("details",xi,[i("summary",null,[s[385]||(s[385]=i("a",{id:"LocalSearchSolvers.objective!-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.objective!-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.objective!")],-1)),s[386]||(s[386]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[387]||(s[387]=t('
julia
objective!(m::M, func) where M <: Union{Model, AbstractSolver}

Add an objective evaluated by func.

source

',3))]),i("details",Di,[i("summary",null,[s[388]||(s[388]=i("a",{id:"LocalSearchSolvers.objective-Tuple{Any, Any}",href:"#LocalSearchSolvers.objective-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.objective")],-1)),s[389]||(s[389]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[390]||(s[390]=t('
julia
objective(func, name)

Construct an objective with a function func that should be applied to a collection of variables.

source

',3))]),i("details",Bi,[i("summary",null,[s[391]||(s[391]=i("a",{id:"LocalSearchSolvers.post_process-Tuple{LocalSearchSolvers.AbstractSolver}",href:"#LocalSearchSolvers.post_process-Tuple{LocalSearchSolvers.AbstractSolver}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.post_process")],-1)),s[392]||(s[392]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[393]||(s[393]=t('
julia
post_process(s::MainSolver)

Launch a series of tasks to round-up a solving run, for instance, export a run's info.

source

',3))]),i("details",Oi,[i("summary",null,[s[394]||(s[394]=i("a",{id:"LocalSearchSolvers.remote_dispatch!-Tuple{LocalSearchSolvers.AbstractSolver}",href:"#LocalSearchSolvers.remote_dispatch!-Tuple{LocalSearchSolvers.AbstractSolver}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.remote_dispatch!")],-1)),s[395]||(s[395]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[396]||(s[396]=t('
julia
remote_dispatch!(solver)

Starts the LeadSolvers attached to the MainSolver.

source

',3))]),i("details",Ji,[i("summary",null,[s[397]||(s[397]=i("a",{id:"LocalSearchSolvers.remote_stop!-Tuple{LocalSearchSolvers.AbstractSolver}",href:"#LocalSearchSolvers.remote_stop!-Tuple{LocalSearchSolvers.AbstractSolver}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.remote_stop!")],-1)),s[398]||(s[398]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[399]||(s[399]=t('
julia
remote_stop!!(solver)

Fetch the pool of solutions from LeadSolvers and merge it into the MainSolver.

source

',3))]),i("details",wi,[i("summary",null,[s[400]||(s[400]=i("a",{id:"LocalSearchSolvers.solution-Tuple{Any}",href:"#LocalSearchSolvers.solution-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.solution")],-1)),s[401]||(s[401]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[402]||(s[402]=t('
julia
solution(s)

Return the only/best known solution of a satisfaction/optimization model.

source

',3))]),i("details",Ii,[i("summary",null,[s[403]||(s[403]=i("a",{id:"LocalSearchSolvers.solve_for_loop!-NTuple{5, Any}",href:"#LocalSearchSolvers.solve_for_loop!-NTuple{5, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.solve_for_loop!")],-1)),s[404]||(s[404]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[405]||(s[405]=t('
julia
solve_for_loop!(solver, stop, sat, iter)

First loop in the solving process that starts LeadSolvers from the MainSolver, and _SubSolvers from each MetaSolver.

source

',3))]),i("details",Ui,[i("summary",null,[s[406]||(s[406]=i("a",{id:"LocalSearchSolvers.solve_while_loop!-NTuple{5, Any}",href:"#LocalSearchSolvers.solve_while_loop!-NTuple{5, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.solve_while_loop!")],-1)),s[407]||(s[407]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[408]||(s[408]=t('
julia
solve_while_loop!(s, )

Search the space of configurations.

source

',3))]),i("details",Ri,[i("summary",null,[s[409]||(s[409]=i("a",{id:"LocalSearchSolvers.specialize!-Tuple{Any}",href:"#LocalSearchSolvers.specialize!-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.specialize!")],-1)),s[410]||(s[410]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[411]||(s[411]=t('
julia
specialize!(solver)

Replace the model of solver by one with specialized types (variables, constraints, objectives).

source

',3))]),i("details",zi,[i("summary",null,[s[412]||(s[412]=i("a",{id:"LocalSearchSolvers.specialize-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers.specialize-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.specialize")],-1)),s[413]||(s[413]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[414]||(s[414]=t('
julia
specialize(m::M) where M <: Union{Model, AbstractSolver}

Specialize the structure of a model to avoid dynamic type attribution at runtime.

source

',3))]),i("details",Ni,[i("summary",null,[s[415]||(s[415]=i("a",{id:"LocalSearchSolvers.status-Tuple{LocalSearchSolvers.MainSolver}",href:"#LocalSearchSolvers.status-Tuple{LocalSearchSolvers.MainSolver}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.status")],-1)),s[416]||(s[416]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[417]||(s[417]=t('
julia
status(solver)

Return the status of a MainSolver.

source

',3))]),i("details",Vi,[i("summary",null,[s[418]||(s[418]=i("a",{id:"LocalSearchSolvers.stop_while_loop-Tuple{LocalSearchSolvers.AbstractSolver}",href:"#LocalSearchSolvers.stop_while_loop-Tuple{LocalSearchSolvers.AbstractSolver}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.stop_while_loop")],-1)),s[419]||(s[419]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[420]||(s[420]=t('
julia
stop_while_loop()

Check the stop conditions of the solve! while inner loop.

source

',3))]),i("details",Gi,[i("summary",null,[s[421]||(s[421]=i("a",{id:"LocalSearchSolvers.tabu_list-Tuple{Any}",href:"#LocalSearchSolvers.tabu_list-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.tabu_list")],-1)),s[422]||(s[422]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[423]||(s[423]=t('
julia
_tabu(s::S) where S <: Union{_State, AbstractSolver}

Access the list of tabu variables.

source

',3))]),i("details",Pi,[i("summary",null,[s[424]||(s[424]=i("a",{id:"LocalSearchSolvers.tabu_value-Tuple{Any, Any}",href:"#LocalSearchSolvers.tabu_value-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.tabu_value")],-1)),s[425]||(s[425]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[426]||(s[426]=t('
julia
_tabu(s::S, x) where S <: Union{_State, AbstractSolver}

Return the tabu value of variable x.

source

',3))]),i("details",qi,[i("summary",null,[s[427]||(s[427]=i("a",{id:"LocalSearchSolvers.variable!",href:"#LocalSearchSolvers.variable!"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.variable!")],-1)),s[428]||(s[428]=a()),e(l,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[429]||(s[429]=t('
julia
variable!(m::M, d) where M <: Union{Model, AbstractSolver}

Add a variable with domain d to m.

source

',3))]),i("details",$i,[i("summary",null,[s[430]||(s[430]=i("a",{id:"LocalSearchSolvers.variable-Tuple{}",href:"#LocalSearchSolvers.variable-Tuple{}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.variable")],-1)),s[431]||(s[431]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[432]||(s[432]=t(`
julia
variable(values::AbstractVector{T}, name::AbstractString; domain = :set) where T <: Number
+variable(domain::AbstractDomain, name::AbstractString) where D <: AbstractDomain

Construct a variable with discrete domain. See the domain method for other options.

julia
d = domain([1,2,3,4], types = :indices)
+x1 = variable(d, "x1")
+x2 = variable([-89,56,28], "x2", domain = :indices)

source

`,4))])])}const ia=n(h,[["render",Wi]]);export{sa as __pageData,ia as default}; diff --git a/dev/assets/solvers_60_local_search_solvers.md.CmZAwKiI.lean.js b/dev/assets/solvers_60_local_search_solvers.md.CmZAwKiI.lean.js new file mode 100644 index 0000000..92ce653 --- /dev/null +++ b/dev/assets/solvers_60_local_search_solvers.md.CmZAwKiI.lean.js @@ -0,0 +1,36 @@ +import{_ as n,c as o,j as i,a,G as e,a5 as t,B as r,o as p}from"./chunks/framework.CJakPlgM.js";const sa=JSON.parse('{"title":"LocalSearchSolvers.jl","description":"","frontmatter":{},"headers":[],"relativePath":"solvers/60_local_search_solvers.md","filePath":"solvers/60_local_search_solvers.md","lastUpdated":null}'),h={name:"solvers/60_local_search_solvers.md"},d={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},S={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},L={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},M={class:"jldocstring custom-block",open:""},_={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},O={class:"jldocstring custom-block",open:""},J={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""},I={class:"jldocstring custom-block",open:""},U={class:"jldocstring custom-block",open:""},R={class:"jldocstring custom-block",open:""},z={class:"jldocstring custom-block",open:""},N={class:"jldocstring custom-block",open:""},V={class:"jldocstring custom-block",open:""},G={class:"jldocstring custom-block",open:""},P={class:"jldocstring custom-block",open:""},q={class:"jldocstring custom-block",open:""},$={class:"jldocstring custom-block",open:""},W={class:"jldocstring custom-block",open:""},H={class:"jldocstring custom-block",open:""},K={class:"jldocstring custom-block",open:""},Q={class:"jldocstring custom-block",open:""},X={class:"jldocstring custom-block",open:""},Y={class:"jldocstring custom-block",open:""},Z={class:"jldocstring custom-block",open:""},ss={class:"jldocstring custom-block",open:""},is={class:"jldocstring custom-block",open:""},as={class:"jldocstring custom-block",open:""},ls={class:"jldocstring custom-block",open:""},es={class:"jldocstring custom-block",open:""},ts={class:"jldocstring custom-block",open:""},ns={class:"jldocstring custom-block",open:""},os={class:"jldocstring custom-block",open:""},rs={class:"jldocstring custom-block",open:""},ps={class:"jldocstring custom-block",open:""},hs={class:"jldocstring custom-block",open:""},ds={class:"jldocstring custom-block",open:""},ks={class:"jldocstring custom-block",open:""},cs={class:"jldocstring custom-block",open:""},gs={class:"jldocstring custom-block",open:""},us={class:"jldocstring custom-block",open:""},bs={class:"jldocstring custom-block",open:""},ys={class:"jldocstring custom-block",open:""},vs={class:"jldocstring custom-block",open:""},Ss={class:"jldocstring custom-block",open:""},Es={class:"jldocstring custom-block",open:""},ms={class:"jldocstring custom-block",open:""},js={class:"jldocstring custom-block",open:""},Cs={class:"jldocstring custom-block",open:""},Fs={class:"jldocstring custom-block",open:""},Ls={class:"jldocstring custom-block",open:""},fs={class:"jldocstring custom-block",open:""},As={class:"jldocstring custom-block",open:""},Ms={class:"jldocstring custom-block",open:""},_s={class:"jldocstring custom-block",open:""},Ts={class:"jldocstring custom-block",open:""},xs={class:"jldocstring custom-block",open:""},Ds={class:"jldocstring custom-block",open:""},Bs={class:"jldocstring custom-block",open:""},Os={class:"jldocstring custom-block",open:""},Js={class:"jldocstring custom-block",open:""},ws={class:"jldocstring custom-block",open:""},Is={class:"jldocstring custom-block",open:""},Us={class:"jldocstring custom-block",open:""},Rs={class:"jldocstring custom-block",open:""},zs={class:"jldocstring custom-block",open:""},Ns={class:"jldocstring custom-block",open:""},Vs={class:"jldocstring custom-block",open:""},Gs={class:"jldocstring custom-block",open:""},Ps={class:"jldocstring custom-block",open:""},qs={class:"jldocstring custom-block",open:""},$s={class:"jldocstring custom-block",open:""},Ws={class:"jldocstring custom-block",open:""},Hs={class:"jldocstring custom-block",open:""},Ks={class:"jldocstring custom-block",open:""},Qs={class:"jldocstring custom-block",open:""},Xs={class:"jldocstring custom-block",open:""},Ys={class:"jldocstring custom-block",open:""},Zs={class:"jldocstring custom-block",open:""},si={class:"jldocstring custom-block",open:""},ii={class:"jldocstring custom-block",open:""},ai={class:"jldocstring custom-block",open:""},li={class:"jldocstring custom-block",open:""},ei={class:"jldocstring custom-block",open:""},ti={class:"jldocstring custom-block",open:""},ni={class:"jldocstring custom-block",open:""},oi={class:"jldocstring custom-block",open:""},ri={class:"jldocstring custom-block",open:""},pi={class:"jldocstring custom-block",open:""},hi={class:"jldocstring custom-block",open:""},di={class:"jldocstring custom-block",open:""},ki={class:"jldocstring custom-block",open:""},ci={class:"jldocstring custom-block",open:""},gi={class:"jldocstring custom-block",open:""},ui={class:"jldocstring custom-block",open:""},bi={class:"jldocstring custom-block",open:""},yi={class:"jldocstring custom-block",open:""},vi={class:"jldocstring custom-block",open:""},Si={class:"jldocstring custom-block",open:""},Ei={class:"jldocstring custom-block",open:""},mi={class:"jldocstring custom-block",open:""},ji={class:"jldocstring custom-block",open:""},Ci={class:"jldocstring custom-block",open:""},Fi={class:"jldocstring custom-block",open:""},Li={class:"jldocstring custom-block",open:""},fi={class:"jldocstring custom-block",open:""},Ai={class:"jldocstring custom-block",open:""},Mi={class:"jldocstring custom-block",open:""},_i={class:"jldocstring custom-block",open:""},Ti={class:"jldocstring custom-block",open:""},xi={class:"jldocstring custom-block",open:""},Di={class:"jldocstring custom-block",open:""},Bi={class:"jldocstring custom-block",open:""},Oi={class:"jldocstring custom-block",open:""},Ji={class:"jldocstring custom-block",open:""},wi={class:"jldocstring custom-block",open:""},Ii={class:"jldocstring custom-block",open:""},Ui={class:"jldocstring custom-block",open:""},Ri={class:"jldocstring custom-block",open:""},zi={class:"jldocstring custom-block",open:""},Ni={class:"jldocstring custom-block",open:""},Vi={class:"jldocstring custom-block",open:""},Gi={class:"jldocstring custom-block",open:""},Pi={class:"jldocstring custom-block",open:""},qi={class:"jldocstring custom-block",open:""},$i={class:"jldocstring custom-block",open:""};function Wi(Hi,s,Ki,Qi,Xi,Yi){const l=r("Badge");return p(),o("div",null,[s[433]||(s[433]=i("h1",{id:"localsearchsolvers-jl",tabindex:"-1"},[a("LocalSearchSolvers.jl "),i("a",{class:"header-anchor",href:"#localsearchsolvers-jl","aria-label":'Permalink to "LocalSearchSolvers.jl"'},"​")],-1)),s[434]||(s[434]=i("p",null,[a("Documentation for "),i("code",null,"LocalSearchSolvers.jl"),a(".")],-1)),i("details",d,[i("summary",null,[s[0]||(s[0]=i("a",{id:"LocalSearchSolvers.AbstractSolver",href:"#LocalSearchSolvers.AbstractSolver"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.AbstractSolver")],-1)),s[1]||(s[1]=a()),e(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=t('
julia
AbstractSolver

Abstract type to encapsulate the different solver types such as Solver or _SubSolver.

source

',3))]),i("details",k,[i("summary",null,[s[3]||(s[3]=i("a",{id:"LocalSearchSolvers.Constraint",href:"#LocalSearchSolvers.Constraint"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.Constraint")],-1)),s[4]||(s[4]=a()),e(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[5]||(s[5]=t('
julia
Constraint{F <: Function}

Structure to store an error function and the variables it constrains.

source

',3))]),i("details",c,[i("summary",null,[s[6]||(s[6]=i("a",{id:"LocalSearchSolvers.LeadSolver",href:"#LocalSearchSolvers.LeadSolver"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.LeadSolver")],-1)),s[7]||(s[7]=a()),e(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[8]||(s[8]=t('
julia
LeadSolver <: MetaSolver

Solver managed remotely by a MainSolver. Can manage its own set of local sub solvers.

source

',3))]),i("details",g,[i("summary",null,[s[9]||(s[9]=i("a",{id:"LocalSearchSolvers.MainSolver",href:"#LocalSearchSolvers.MainSolver"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.MainSolver")],-1)),s[10]||(s[10]=a()),e(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[11]||(s[11]=t('
julia
MainSolver <: AbstractSolver

Main solver. Handle the solving of a model, and optional multithreaded and/or distributed subsolvers.

Arguments:

  • model::Model: A formal description of the targeted problem

  • state::_State: An internal state to store the info necessary to a solving run

  • options::Options: User options for this solver

  • subs::Vector{_SubSolver}: Optional subsolvers

source

',5))]),i("details",u,[i("summary",null,[s[12]||(s[12]=i("a",{id:"LocalSearchSolvers.MetaSolver",href:"#LocalSearchSolvers.MetaSolver"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.MetaSolver")],-1)),s[13]||(s[13]=a()),e(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[14]||(s[14]=i("p",null,"Abstract type to encapsulate all solver types that manages other solvers.",-1)),s[15]||(s[15]=i("p",null,[i("a",{href:"https://github.com/JuliaConstraints/LocalSearchSolvers.jl/blob/v0.4.9/src/solvers/meta.jl#L1-L3",target:"_blank",rel:"noreferrer"},"source")],-1))]),i("details",b,[i("summary",null,[s[16]||(s[16]=i("a",{id:"LocalSearchSolvers.Objective",href:"#LocalSearchSolvers.Objective"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.Objective")],-1)),s[17]||(s[17]=a()),e(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[18]||(s[18]=t('
julia
Objective{F <: Function}

A structure to handle objectives in a solver. `struct Objective{F <: Function} name::String f::F end``

source

',3))]),i("details",y,[i("summary",null,[s[19]||(s[19]=i("a",{id:"LocalSearchSolvers.Objective-Union{Tuple{F2}, Tuple{Any, LocalSearchSolvers.Objective{F2}}} where F2<:Function",href:"#LocalSearchSolvers.Objective-Union{Tuple{F2}, Tuple{Any, LocalSearchSolvers.Objective{F2}}} where F2<:Function"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.Objective")],-1)),s[20]||(s[20]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[21]||(s[21]=t('
julia
Objective(F, o::Objective{F2}) where {F2 <: Function}

Constructor used in specializing a solver. Should never be called externally.

source

',3))]),i("details",v,[i("summary",null,[s[22]||(s[22]=i("a",{id:"LocalSearchSolvers.Options",href:"#LocalSearchSolvers.Options"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.Options")],-1)),s[23]||(s[23]=a()),e(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[24]||(s[24]=t(`
julia
Options()

Arguments:

  • dynamic::Bool: is the model dynamic?

  • iteration::Union{Int, Float64}: limit on the number of iterations

  • print_level::Symbol: verbosity to choose among :silent, :minimal, :partial, :verbose

  • solutions::Int: number of solutions to return

  • specialize::Bool: should the types of the model be specialized or not. Usually yes for static problems. For dynamic in depends if the user intend to introduce new types. The specialized model is about 10% faster.

  • tabu_time::Int: DESCRIPTION

  • tabu_local::Int: DESCRIPTION

  • tabu_delta::Float64: DESCRIPTION

  • threads::Int: Number of threads to use

  • time_limit::Float64: time limit in seconds

  • \`function Options(; dynamic = false, iteration = 10000, print_level = :minimal, solutions = 1, specialize = !dynamic, tabu_time = 0, tabu_local = 0, tabu_delta = 0.0, threads = typemax(0), time_limit = Inf)

julia
# Setting options in JuMP syntax: print_level, time_limit, iteration
+model = Model(CBLS.Optimizer)
+set_optimizer_attribute(model, "iteration", 100)
+set_optimizer_attribute(model, "print_level", :verbose)
+set_time_limit_sec(model, 5.0)

source

`,5))]),i("details",S,[i("summary",null,[s[25]||(s[25]=i("a",{id:"LocalSearchSolvers.Variable",href:"#LocalSearchSolvers.Variable"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.Variable")],-1)),s[26]||(s[26]=a()),e(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[27]||(s[27]=t(`
julia
Variable{D <: AbstractDomain}

A structure containing the necessary information for a solver's variables: name, domain, and constraints it belongs.

struct Variable{D <: AbstractDomain}
+    domain::D
+    constraints::Indices{Int}
+end

source

`,4))]),i("details",E,[i("summary",null,[s[28]||(s[28]=i("a",{id:"LocalSearchSolvers._Model",href:"#LocalSearchSolvers._Model"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._Model")],-1)),s[29]||(s[29]=a()),e(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[30]||(s[30]=t(`
julia
_Model{V <: Variable{<:AbstractDomain},C <: Constraint{<:Function},O <: Objective{<:Function}}

A struct to model a problem as a set of variables, domains, constraints, and objectives.

struct _Model{V <: Variable{<:AbstractDomain},C <: Constraint{<:Function},O <: Objective{<:Function}}
+    variables::Dictionary{Int,V}
+    constraints::Dictionary{Int,C}
+    objectives::Dictionary{Int,O}
+
+    # counter to add new variables: vars, cons, objs
+    max_vars::Ref{Int}
+    max_cons::Ref{Int}
+    max_objs::Ref{Int}
+
+    # Bool to indicate if the _Model instance has been specialized (relatively to types)
+    specialized::Ref{Bool}
+
+    # Symbol to indicate the kind of model for specialized methods such as pretty printing
+    kind::Symbol
+end

source

`,4))]),i("details",m,[i("summary",null,[s[31]||(s[31]=i("a",{id:"LocalSearchSolvers._State",href:"#LocalSearchSolvers._State"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._State")],-1)),s[32]||(s[32]=a()),e(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[33]||(s[33]=t(`
julia
GeneralState{T <: Number}

A mutable structure to store the general state of a solver. All methods applied to GeneralState are forwarded to S <: AbstractSolver.

mutable struct GeneralState{T <: Number} <: AbstractState
+    configuration::Configuration{T}
+    cons_costs::Dictionary{Int, Float64}
+    last_improvement::Int
+    tabu::Dictionary{Int, Int}
+    vars_costs::Dictionary{Int, Float64}
+end

source

`,4))]),i("details",j,[i("summary",null,[s[34]||(s[34]=i("a",{id:"LocalSearchSolvers._SubSolver",href:"#LocalSearchSolvers._SubSolver"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._SubSolver")],-1)),s[35]||(s[35]=a()),e(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[36]||(s[36]=t('
julia
_SubSolver <: AbstractSolver

An internal solver type called by MetaSolver when multithreading is enabled.

Arguments:

  • id::Int: subsolver id for debugging

  • model::Model: a ref to the model of the main solver

  • state::_State: a deepcopy of the main solver that evolves independently

  • options::Options: a ref to the options of the main solver

source

',5))]),i("details",C,[i("summary",null,[s[37]||(s[37]=i("a",{id:"Base.empty!-Tuple{LocalSearchSolvers.MainSolver}",href:"#Base.empty!-Tuple{LocalSearchSolvers.MainSolver}"},[i("span",{class:"jlbinding"},"Base.empty!")],-1)),s[38]||(s[38]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[39]||(s[39]=t('
julia
empty!(s::Solver)

source

',2))]),i("details",F,[i("summary",null,[s[40]||(s[40]=i("a",{id:"Base.empty!-Tuple{LocalSearchSolvers._Model}",href:"#Base.empty!-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"Base.empty!")],-1)),s[41]||(s[41]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[42]||(s[42]=t('
julia
empty!(m::Model)

DOCSTRING

source

',3))]),i("details",L,[i("summary",null,[s[43]||(s[43]=i("a",{id:"Base.in-Tuple{Int64, LocalSearchSolvers.Constraint}",href:"#Base.in-Tuple{Int64, LocalSearchSolvers.Constraint}"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[44]||(s[44]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[45]||(s[45]=t('
julia
var::Int c::Constraint

source

',2))]),i("details",f,[i("summary",null,[s[46]||(s[46]=i("a",{id:"Base.in-Tuple{LocalSearchSolvers.Variable, Any}",href:"#Base.in-Tuple{LocalSearchSolvers.Variable, Any}"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[47]||(s[47]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[48]||(s[48]=t(`
julia
x::Variable constraint
+value  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

`,3))]),i("details",A,[i("summary",null,[s[49]||(s[49]=i("a",{id:"LocalSearchSolvers._add!-Tuple{LocalSearchSolvers.Constraint, Any}",href:"#LocalSearchSolvers._add!-Tuple{LocalSearchSolvers.Constraint, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._add!")],-1)),s[50]||(s[50]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[51]||(s[51]=t('
julia
_add!(c::Constraint, x)

Add the variable of indice x to c.

source

',3))]),i("details",M,[i("summary",null,[s[52]||(s[52]=i("a",{id:"LocalSearchSolvers._add_to_constraint!-Tuple{LocalSearchSolvers.Variable, Any}",href:"#LocalSearchSolvers._add_to_constraint!-Tuple{LocalSearchSolvers.Variable, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._add_to_constraint!")],-1)),s[53]||(s[53]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[54]||(s[54]=t('
julia
_add_to_constraint!(x::Variable, id)

Add a constraint id to the list of constraints of x.

source

',3))]),i("details",_,[i("summary",null,[s[55]||(s[55]=i("a",{id:"LocalSearchSolvers._check_restart-Tuple{Any}",href:"#LocalSearchSolvers._check_restart-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._check_restart")],-1)),s[56]||(s[56]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[57]||(s[57]=t('
julia
_check_restart(s)

Check if a restart of s is necessary. If s has subsolvers, this check is independent for all of them.

source

',3))]),i("details",T,[i("summary",null,[s[58]||(s[58]=i("a",{id:"LocalSearchSolvers._check_subs-Tuple{LocalSearchSolvers.AbstractSolver}",href:"#LocalSearchSolvers._check_subs-Tuple{LocalSearchSolvers.AbstractSolver}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._check_subs")],-1)),s[59]||(s[59]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[60]||(s[60]=t('
julia
_check_subs(s)

Check if any subsolver of a main solver s, for

  • Satisfaction, has a solution, then return it, resume the run otherwise

  • Optimization, has a better solution, then assign it to its internal state

source

',4))]),i("details",x,[i("summary",null,[s[61]||(s[61]=i("a",{id:"LocalSearchSolvers._compute!-Tuple{Any}",href:"#LocalSearchSolvers._compute!-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._compute!")],-1)),s[62]||(s[62]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[63]||(s[63]=t('
julia
_compute!(s; o::Int = 1, cons_lst = Indices{Int}())

Compute the objective o's value if s is satisfied and return the current error.

Arguments:

  • s: a solver

  • o: targeted objective

  • cons_lst: list of targeted constraints, if empty compute for the whole set

source

',5))]),i("details",D,[i("summary",null,[s[64]||(s[64]=i("a",{id:"LocalSearchSolvers._compute_cost!-Tuple{Any, Any, Any}",href:"#LocalSearchSolvers._compute_cost!-Tuple{Any, Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._compute_cost!")],-1)),s[65]||(s[65]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[66]||(s[66]=t('
julia
_compute_cost!(s, ind, c)

Compute the cost of constraint c with index ind.

source

',3))]),i("details",B,[i("summary",null,[s[67]||(s[67]=i("a",{id:"LocalSearchSolvers._compute_costs!-Tuple{Any}",href:"#LocalSearchSolvers._compute_costs!-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._compute_costs!")],-1)),s[68]||(s[68]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[69]||(s[69]=t('
julia
_compute_costs!(s; cons_lst::Indices{Int} = Indices{Int}())

Compute the cost of constraints c in cons_lst. If cons_lst is empty, compute the cost for all the constraints in s.

source

',3))]),i("details",O,[i("summary",null,[s[70]||(s[70]=i("a",{id:"LocalSearchSolvers._compute_objective!-Tuple{Any, LocalSearchSolvers.Objective}",href:"#LocalSearchSolvers._compute_objective!-Tuple{Any, LocalSearchSolvers.Objective}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._compute_objective!")],-1)),s[71]||(s[71]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[72]||(s[72]=t(`
julia
_compute_objective!(s, o::Objective)
+_compute_objective!(s, o = 1)

Compute the objective o's value.

source

`,3))]),i("details",J,[i("summary",null,[s[73]||(s[73]=i("a",{id:"LocalSearchSolvers._cons_cost!-Tuple{LocalSearchSolvers._State, Any, Any}",href:"#LocalSearchSolvers._cons_cost!-Tuple{LocalSearchSolvers._State, Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._cons_cost!")],-1)),s[74]||(s[74]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[75]||(s[75]=t('
julia
_cons_cost!(s::S, c, cost) where S <: Union{_State, AbstractSolver}

Set the cost of constraint c.

source

',3))]),i("details",w,[i("summary",null,[s[76]||(s[76]=i("a",{id:"LocalSearchSolvers._cons_cost-Tuple{LocalSearchSolvers._State, Any}",href:"#LocalSearchSolvers._cons_cost-Tuple{LocalSearchSolvers._State, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._cons_cost")],-1)),s[77]||(s[77]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[78]||(s[78]=t('
julia
_cons_cost(s::S, c) where S <: Union{_State, AbstractSolver}

Return the cost of constraint c.

source

',3))]),i("details",I,[i("summary",null,[s[79]||(s[79]=i("a",{id:"LocalSearchSolvers._cons_costs!-Tuple{LocalSearchSolvers._State, Any}",href:"#LocalSearchSolvers._cons_costs!-Tuple{LocalSearchSolvers._State, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._cons_costs!")],-1)),s[80]||(s[80]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[81]||(s[81]=t('
julia
_cons_costs!(s::S, costs) where S <: Union{_State, AbstractSolver}

Set the constraints costs.

source

',3))]),i("details",U,[i("summary",null,[s[82]||(s[82]=i("a",{id:"LocalSearchSolvers._cons_costs-Tuple{LocalSearchSolvers._State}",href:"#LocalSearchSolvers._cons_costs-Tuple{LocalSearchSolvers._State}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._cons_costs")],-1)),s[83]||(s[83]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[84]||(s[84]=t('
julia
_cons_costs(s::S) where S <: Union{_State, AbstractSolver}

Access the constraints costs.

source

',3))]),i("details",R,[i("summary",null,[s[85]||(s[85]=i("a",{id:"LocalSearchSolvers._constriction-Tuple{LocalSearchSolvers.Variable}",href:"#LocalSearchSolvers._constriction-Tuple{LocalSearchSolvers.Variable}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._constriction")],-1)),s[86]||(s[86]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[87]||(s[87]=t('
julia
_constriction(x::Variable)

Return the cosntriction of x, i.e. the number of constraints restricting x.

source

',3))]),i("details",z,[i("summary",null,[s[88]||(s[88]=i("a",{id:"LocalSearchSolvers._delete!-Tuple{LocalSearchSolvers.Constraint, Any}",href:"#LocalSearchSolvers._delete!-Tuple{LocalSearchSolvers.Constraint, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._delete!")],-1)),s[89]||(s[89]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[90]||(s[90]=t('
julia
_delete!(c::Constraint, x::Int)

Delete x from c.

source

',3))]),i("details",N,[i("summary",null,[s[91]||(s[91]=i("a",{id:"LocalSearchSolvers._delete_from_constraint!-Tuple{LocalSearchSolvers.Variable, Any}",href:"#LocalSearchSolvers._delete_from_constraint!-Tuple{LocalSearchSolvers.Variable, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._delete_from_constraint!")],-1)),s[92]||(s[92]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[93]||(s[93]=t('
julia
_delete_from_constraint!(x::Variable, id)

Delete a constraint id from the list of constraints of x.

source

',3))]),i("details",V,[i("summary",null,[s[94]||(s[94]=i("a",{id:"LocalSearchSolvers._draw!-Tuple{Any}",href:"#LocalSearchSolvers._draw!-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._draw!")],-1)),s[95]||(s[95]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[96]||(s[96]=t('
julia
_draw!(s)

Draw a random (re-)starting configuration.

source

',3))]),i("details",G,[i("summary",null,[s[97]||(s[97]=i("a",{id:"LocalSearchSolvers._dynamic!-Tuple{Any, Any}",href:"#LocalSearchSolvers._dynamic!-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._dynamic!")],-1)),s[98]||(s[98]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[99]||(s[99]=t('
julia
_dynamic!(options, dynamic) = begin

DOCSTRING

source

',3))]),i("details",P,[i("summary",null,[s[100]||(s[100]=i("a",{id:"LocalSearchSolvers._dynamic-Tuple{Any}",href:"#LocalSearchSolvers._dynamic-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._dynamic")],-1)),s[101]||(s[101]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[102]||(s[102]=t('
julia
_dynamic(options) = begin

DOCSTRING

source

',3))]),i("details",q,[i("summary",null,[s[103]||(s[103]=i("a",{id:"LocalSearchSolvers._find_rand_argmax-Tuple{Dictionaries.DictionaryView}",href:"#LocalSearchSolvers._find_rand_argmax-Tuple{Dictionaries.DictionaryView}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._find_rand_argmax")],-1)),s[104]||(s[104]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[105]||(s[105]=t('
julia
_find_rand_argmax(d::DictionaryView)

Compute argmax of d and select one element randomly.

source

',3))]),i("details",$,[i("summary",null,[s[106]||(s[106]=i("a",{id:"LocalSearchSolvers._get_constraints-Tuple{LocalSearchSolvers.Variable}",href:"#LocalSearchSolvers._get_constraints-Tuple{LocalSearchSolvers.Variable}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._get_constraints")],-1)),s[107]||(s[107]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[108]||(s[108]=t('
julia
_get_constraints(x::Variable)

Access the list of constraints of x.

source

',3))]),i("details",W,[i("summary",null,[s[109]||(s[109]=i("a",{id:"LocalSearchSolvers._get_vars-Tuple{LocalSearchSolvers.Constraint}",href:"#LocalSearchSolvers._get_vars-Tuple{LocalSearchSolvers.Constraint}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._get_vars")],-1)),s[110]||(s[110]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[111]||(s[111]=t('
julia
_get_vars(c::Constraint)

Returns the variables constrained by c.

source

',3))]),i("details",H,[i("summary",null,[s[112]||(s[112]=i("a",{id:"LocalSearchSolvers._inc_cons!-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers._inc_cons!-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._inc_cons!")],-1)),s[113]||(s[113]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[114]||(s[114]=t('
julia
_inc_vars!(m::M) where M <: Union{Model, AbstractSolver}

Increment the maximum constraint id that has been attributed to m.

source

',3))]),i("details",K,[i("summary",null,[s[115]||(s[115]=i("a",{id:"LocalSearchSolvers._inc_objs!-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers._inc_objs!-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._inc_objs!")],-1)),s[116]||(s[116]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[117]||(s[117]=t('
julia
_inc_vars!(m::M) where M <: Union{Model, AbstractSolver}

Increment the maximum objective id that has been attributed to m.

source

',3))]),i("details",Q,[i("summary",null,[s[118]||(s[118]=i("a",{id:"LocalSearchSolvers._inc_vars!-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers._inc_vars!-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._inc_vars!")],-1)),s[119]||(s[119]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[120]||(s[120]=t('
julia
_inc_vars!(m::M) where M <: Union{Model, AbstractSolver}

Increment the maximum variable id that has been attributed to m.

source

',3))]),i("details",X,[i("summary",null,[s[121]||(s[121]=i("a",{id:"LocalSearchSolvers._info_path!-Tuple{Any, Any}",href:"#LocalSearchSolvers._info_path!-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._info_path!")],-1)),s[122]||(s[122]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[123]||(s[123]=t('
julia
_info_path!(options, iterations) = begin

DOCSTRING

source

',3))]),i("details",Y,[i("summary",null,[s[124]||(s[124]=i("a",{id:"LocalSearchSolvers._info_path-Tuple{Any}",href:"#LocalSearchSolvers._info_path-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._info_path")],-1)),s[125]||(s[125]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[126]||(s[126]=t('
julia
_info_path(options, path)

DOCSTRING

source

',3))]),i("details",Z,[i("summary",null,[s[127]||(s[127]=i("a",{id:"LocalSearchSolvers._is_empty-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers._is_empty-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._is_empty")],-1)),s[128]||(s[128]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[129]||(s[129]=t('
julia
_is_empty(m::Model)

DOCSTRING

source

',3))]),i("details",ss,[i("summary",null,[s[130]||(s[130]=i("a",{id:"LocalSearchSolvers._iteration!-Tuple{Any, Any}",href:"#LocalSearchSolvers._iteration!-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._iteration!")],-1)),s[131]||(s[131]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[132]||(s[132]=t('
julia
_iteration!(options, iterations) = begin

DOCSTRING

source

',3))]),i("details",is,[i("summary",null,[s[133]||(s[133]=i("a",{id:"LocalSearchSolvers._iteration-Tuple{Any}",href:"#LocalSearchSolvers._iteration-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._iteration")],-1)),s[134]||(s[134]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[135]||(s[135]=t('
julia
_iteration(options) = begin

DOCSTRING

source

',3))]),i("details",as,[i("summary",null,[s[136]||(s[136]=i("a",{id:"LocalSearchSolvers._length-Tuple{LocalSearchSolvers.Constraint}",href:"#LocalSearchSolvers._length-Tuple{LocalSearchSolvers.Constraint}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._length")],-1)),s[137]||(s[137]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[138]||(s[138]=t('
julia
_length(c::Constraint)

Return the number of constrained variables by c.

source

',3))]),i("details",ls,[i("summary",null,[s[139]||(s[139]=i("a",{id:"LocalSearchSolvers._max_cons-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers._max_cons-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._max_cons")],-1)),s[140]||(s[140]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[141]||(s[141]=t('
julia
_max_cons(m::M) where M <: Union{Model, AbstractSolver}

Access the maximum constraint id that has been attributed to m.

source

',3))]),i("details",es,[i("summary",null,[s[142]||(s[142]=i("a",{id:"LocalSearchSolvers._max_objs-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers._max_objs-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._max_objs")],-1)),s[143]||(s[143]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[144]||(s[144]=t('
julia
_max_objs(m::M) where M <: Union{Model, AbstractSolver}

Access the maximum objective id that has been attributed to m.

source

',3))]),i("details",ts,[i("summary",null,[s[145]||(s[145]=i("a",{id:"LocalSearchSolvers._max_vars-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers._max_vars-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._max_vars")],-1)),s[146]||(s[146]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[147]||(s[147]=t('
julia
_max_vars(m::M) where M <: Union{Model, AbstractSolver}

Access the maximum variable id that has been attributed to m.

source

',3))]),i("details",ns,[i("summary",null,[s[148]||(s[148]=i("a",{id:"LocalSearchSolvers._move!",href:"#LocalSearchSolvers._move!"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._move!")],-1)),s[149]||(s[149]=a()),e(l,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[150]||(s[150]=t('
julia
_move!(s, x::Int, dim::Int = 0)

Perform an improving move in x neighbourhood if possible.

Arguments:

  • s: a solver of type S <: AbstractSolver

  • x: selected variable id

  • dim: describe the dimension of the considered neighbourhood

source

',5))]),i("details",os,[i("summary",null,[s[151]||(s[151]=i("a",{id:"LocalSearchSolvers._neighbours",href:"#LocalSearchSolvers._neighbours"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._neighbours")],-1)),s[152]||(s[152]=a()),e(l,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[153]||(s[153]=t('
julia
_neighbours(s, x, dim = 0)

DOCSTRING

Arguments:

  • s: DESCRIPTION

  • x: DESCRIPTION

  • dim: DESCRIPTION

source

',5))]),i("details",rs,[i("summary",null,[s[154]||(s[154]=i("a",{id:"LocalSearchSolvers._optimizing!-Tuple{LocalSearchSolvers._State}",href:"#LocalSearchSolvers._optimizing!-Tuple{LocalSearchSolvers._State}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._optimizing!")],-1)),s[155]||(s[155]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[156]||(s[156]=t('
julia
_optimizing!(s::S) where S <: Union{_State, AbstractSolver}

Set the solver optimizing status to true.

source

',3))]),i("details",ps,[i("summary",null,[s[157]||(s[157]=i("a",{id:"LocalSearchSolvers._optimizing-Tuple{LocalSearchSolvers._State}",href:"#LocalSearchSolvers._optimizing-Tuple{LocalSearchSolvers._State}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._optimizing")],-1)),s[158]||(s[158]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[159]||(s[159]=t('
julia
_optimizing(s::S) where S <: Union{_State, AbstractSolver}

Check if s is in an optimizing state.

source

',3))]),i("details",hs,[i("summary",null,[s[160]||(s[160]=i("a",{id:"LocalSearchSolvers._print_level!-Tuple{Any, Any}",href:"#LocalSearchSolvers._print_level!-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._print_level!")],-1)),s[161]||(s[161]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[162]||(s[162]=t('
julia
_print_level!(options, level) = begin

DOCSTRING

source

',3))]),i("details",ds,[i("summary",null,[s[163]||(s[163]=i("a",{id:"LocalSearchSolvers._print_level-Tuple{Any}",href:"#LocalSearchSolvers._print_level-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._print_level")],-1)),s[164]||(s[164]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[165]||(s[165]=t('
julia
_print_level(options) = begin

DOCSTRING

source

',3))]),i("details",ks,[i("summary",null,[s[166]||(s[166]=i("a",{id:"LocalSearchSolvers._process_threads_map!-Tuple{Any, AbstractDict}",href:"#LocalSearchSolvers._process_threads_map!-Tuple{Any, AbstractDict}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._process_threads_map!")],-1)),s[167]||(s[167]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[168]||(s[168]=t('
julia
_process_threads_map!(options, ptm)

TBW

source

',3))]),i("details",cs,[i("summary",null,[s[169]||(s[169]=i("a",{id:"LocalSearchSolvers._process_threads_map-Tuple{Any}",href:"#LocalSearchSolvers._process_threads_map-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._process_threads_map")],-1)),s[170]||(s[170]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[171]||(s[171]=t('
julia
_process_threads_map(options)

TBW

source

',3))]),i("details",gs,[i("summary",null,[s[172]||(s[172]=i("a",{id:"LocalSearchSolvers._restart!",href:"#LocalSearchSolvers._restart!"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._restart!")],-1)),s[173]||(s[173]=a()),e(l,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[174]||(s[174]=t('
julia
_restart!(s, k = 10)

Restart a solver.

source

',3))]),i("details",us,[i("summary",null,[s[175]||(s[175]=i("a",{id:"LocalSearchSolvers._satisfying!-Tuple{LocalSearchSolvers._State}",href:"#LocalSearchSolvers._satisfying!-Tuple{LocalSearchSolvers._State}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._satisfying!")],-1)),s[176]||(s[176]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[177]||(s[177]=t('
julia
_satisfying!(s::S) where S <: Union{_State, AbstractSolver}

Set the solver optimizing status to false.

source

',3))]),i("details",bs,[i("summary",null,[s[178]||(s[178]=i("a",{id:"LocalSearchSolvers._select_worse-Tuple{Any}",href:"#LocalSearchSolvers._select_worse-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._select_worse")],-1)),s[179]||(s[179]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[180]||(s[180]=t('
julia
_select_worse(s::S) where S <: Union{_State, AbstractSolver}

Within the non-tabu variables, select the one with the worse error .

source

',3))]),i("details",ys,[i("summary",null,[s[181]||(s[181]=i("a",{id:"LocalSearchSolvers._set!-Tuple{LocalSearchSolvers._State, Any, Any}",href:"#LocalSearchSolvers._set!-Tuple{LocalSearchSolvers._State, Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._set!")],-1)),s[182]||(s[182]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[183]||(s[183]=t('
julia
_set!(s::S, x, val) where S <: Union{_State, AbstractSolver}

Set the value of variable x to val.

source

',3))]),i("details",vs,[i("summary",null,[s[184]||(s[184]=i("a",{id:"LocalSearchSolvers._set_domain!-Tuple{LocalSearchSolvers._Model, Any, Any}",href:"#LocalSearchSolvers._set_domain!-Tuple{LocalSearchSolvers._Model, Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._set_domain!")],-1)),s[185]||(s[185]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[186]||(s[186]=t('
julia
_set_domain!(m::Model, x, values)

DOCSTRING

Arguments:

  • m: DESCRIPTION

  • x: DESCRIPTION

  • values: DESCRIPTION

source

',5))]),i("details",Ss,[i("summary",null,[s[187]||(s[187]=i("a",{id:"LocalSearchSolvers._solutions!-Tuple{Any, Any}",href:"#LocalSearchSolvers._solutions!-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._solutions!")],-1)),s[188]||(s[188]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[189]||(s[189]=t('
julia
_solutions!(options, solutions) = begin

DOCSTRING

source

',3))]),i("details",Es,[i("summary",null,[s[190]||(s[190]=i("a",{id:"LocalSearchSolvers._solutions-Tuple{Any}",href:"#LocalSearchSolvers._solutions-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._solutions")],-1)),s[191]||(s[191]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[192]||(s[192]=t('
julia
_solutions(options) = begin

DOCSTRING

source

',3))]),i("details",ms,[i("summary",null,[s[193]||(s[193]=i("a",{id:"LocalSearchSolvers._specialize!-Tuple{Any, Any}",href:"#LocalSearchSolvers._specialize!-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._specialize!")],-1)),s[194]||(s[194]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[195]||(s[195]=t('
julia
_specialize!(options, specialize) = begin

DOCSTRING

source

',3))]),i("details",js,[i("summary",null,[s[196]||(s[196]=i("a",{id:"LocalSearchSolvers._specialize-Tuple{Any}",href:"#LocalSearchSolvers._specialize-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._specialize")],-1)),s[197]||(s[197]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[198]||(s[198]=t('
julia
_specialize(options) = begin

DOCSTRING

source

',3))]),i("details",Cs,[i("summary",null,[s[199]||(s[199]=i("a",{id:"LocalSearchSolvers._step!-Tuple{Any}",href:"#LocalSearchSolvers._step!-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._step!")],-1)),s[200]||(s[200]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[201]||(s[201]=t('
julia
_step!(s)

Iterate a step of the solver run.

source

',3))]),i("details",Fs,[i("summary",null,[s[202]||(s[202]=i("a",{id:"LocalSearchSolvers._swap_value!-Tuple{LocalSearchSolvers._State, Any, Any}",href:"#LocalSearchSolvers._swap_value!-Tuple{LocalSearchSolvers._State, Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._swap_value!")],-1)),s[203]||(s[203]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[204]||(s[204]=t('
julia
_set!(s::S, x, y) where S <: Union{_State, AbstractSolver}

Swap the values of variables x and y.

source

',3))]),i("details",Ls,[i("summary",null,[s[205]||(s[205]=i("a",{id:"LocalSearchSolvers._tabu_delta!-Tuple{Any, Any}",href:"#LocalSearchSolvers._tabu_delta!-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._tabu_delta!")],-1)),s[206]||(s[206]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[207]||(s[207]=t('
julia
_tabu_delta!(options, time) = begin

DOCSTRING

source

',3))]),i("details",fs,[i("summary",null,[s[208]||(s[208]=i("a",{id:"LocalSearchSolvers._tabu_delta-Tuple{Any}",href:"#LocalSearchSolvers._tabu_delta-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._tabu_delta")],-1)),s[209]||(s[209]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[210]||(s[210]=t('
julia
_tabu_delta(options) = begin

DOCSTRING

source

',3))]),i("details",As,[i("summary",null,[s[211]||(s[211]=i("a",{id:"LocalSearchSolvers._tabu_local!-Tuple{Any, Any}",href:"#LocalSearchSolvers._tabu_local!-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._tabu_local!")],-1)),s[212]||(s[212]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[213]||(s[213]=t('
julia
_tabu_local!(options, time) = begin

DOCSTRING

source

',3))]),i("details",Ms,[i("summary",null,[s[214]||(s[214]=i("a",{id:"LocalSearchSolvers._tabu_local-Tuple{Any}",href:"#LocalSearchSolvers._tabu_local-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._tabu_local")],-1)),s[215]||(s[215]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[216]||(s[216]=t('
julia
_tabu_local(options) = begin

DOCSTRING

source

',3))]),i("details",_s,[i("summary",null,[s[217]||(s[217]=i("a",{id:"LocalSearchSolvers._tabu_time!-Tuple{Any, Any}",href:"#LocalSearchSolvers._tabu_time!-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._tabu_time!")],-1)),s[218]||(s[218]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[219]||(s[219]=t('
julia
_tabu_time!(options, time) = begin

DOCSTRING

source

',3))]),i("details",Ts,[i("summary",null,[s[220]||(s[220]=i("a",{id:"LocalSearchSolvers._tabu_time-Tuple{Any}",href:"#LocalSearchSolvers._tabu_time-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._tabu_time")],-1)),s[221]||(s[221]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[222]||(s[222]=t('
julia
_tabu_time(options) = begin

DOCSTRING

source

',3))]),i("details",xs,[i("summary",null,[s[223]||(s[223]=i("a",{id:"LocalSearchSolvers._threads",href:"#LocalSearchSolvers._threads"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._threads")],-1)),s[224]||(s[224]=a()),e(l,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[225]||(s[225]=t('
julia
_threads(options) = begin

DOCSTRING

source

',3))]),i("details",Ds,[i("summary",null,[s[226]||(s[226]=i("a",{id:"LocalSearchSolvers._threads!",href:"#LocalSearchSolvers._threads!"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._threads!")],-1)),s[227]||(s[227]=a()),e(l,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[228]||(s[228]=t('
julia
_threads!(options, threads) = begin

DOCSTRING

source

',3))]),i("details",Bs,[i("summary",null,[s[229]||(s[229]=i("a",{id:"LocalSearchSolvers._time_limit!-Tuple{Any, Tuple{Bool, Float64}}",href:"#LocalSearchSolvers._time_limit!-Tuple{Any, Tuple{Bool, Float64}}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._time_limit!")],-1)),s[230]||(s[230]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[231]||(s[231]=t('
julia
_time_limit!(options, time::Time) = begin

DOCSTRING

source

',3))]),i("details",Os,[i("summary",null,[s[232]||(s[232]=i("a",{id:"LocalSearchSolvers._time_limit-Tuple{Any}",href:"#LocalSearchSolvers._time_limit-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._time_limit")],-1)),s[233]||(s[233]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[234]||(s[234]=t('
julia
_time_limit(options)

DOCSTRING

source

',3))]),i("details",Js,[i("summary",null,[s[235]||(s[235]=i("a",{id:"LocalSearchSolvers._to_union-Tuple{Any}",href:"#LocalSearchSolvers._to_union-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._to_union")],-1)),s[236]||(s[236]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[237]||(s[237]=t('
julia
_to_union(datatype)

Make a minimal Union type from a collection of data types.

source

',3))]),i("details",ws,[i("summary",null,[s[238]||(s[238]=i("a",{id:"LocalSearchSolvers._value!-Tuple{LocalSearchSolvers._State, Any, Any}",href:"#LocalSearchSolvers._value!-Tuple{LocalSearchSolvers._State, Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._value!")],-1)),s[239]||(s[239]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[240]||(s[240]=t('
julia
_value!(s::S, x, val) where S <: Union{_State, AbstractSolver}

Set the value of variable x to val.

source

',3))]),i("details",Is,[i("summary",null,[s[241]||(s[241]=i("a",{id:"LocalSearchSolvers._value-Tuple{LocalSearchSolvers._State, Any}",href:"#LocalSearchSolvers._value-Tuple{LocalSearchSolvers._State, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._value")],-1)),s[242]||(s[242]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[243]||(s[243]=t('
julia
_value(s::S, x) where S <: Union{_State, AbstractSolver}

Return the value of variable x.

source

',3))]),i("details",Us,[i("summary",null,[s[244]||(s[244]=i("a",{id:"LocalSearchSolvers._values!-Union{Tuple{T}, Tuple{LocalSearchSolvers._State{T}, Any}} where T<:Number",href:"#LocalSearchSolvers._values!-Union{Tuple{T}, Tuple{LocalSearchSolvers._State{T}, Any}} where T<:Number"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._values!")],-1)),s[245]||(s[245]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[246]||(s[246]=t('
julia
_values!(s::S, values) where S <: Union{_State, AbstractSolver}

Set the variables values.

source

',3))]),i("details",Rs,[i("summary",null,[s[247]||(s[247]=i("a",{id:"LocalSearchSolvers._values-Tuple{LocalSearchSolvers._State}",href:"#LocalSearchSolvers._values-Tuple{LocalSearchSolvers._State}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._values")],-1)),s[248]||(s[248]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[249]||(s[249]=t('
julia
_vars_costs(s::S) where S <: Union{_State, AbstractSolver}

Access the variables costs.

source

',3))]),i("details",zs,[i("summary",null,[s[250]||(s[250]=i("a",{id:"LocalSearchSolvers._var_cost!-Tuple{LocalSearchSolvers._State, Any, Any}",href:"#LocalSearchSolvers._var_cost!-Tuple{LocalSearchSolvers._State, Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._var_cost!")],-1)),s[251]||(s[251]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[252]||(s[252]=t('
julia
_var_cost!(s::S, x, cost) where S <: Union{_State, AbstractSolver}

Set the cost of variable x.

source

',3))]),i("details",Ns,[i("summary",null,[s[253]||(s[253]=i("a",{id:"LocalSearchSolvers._var_cost-Tuple{LocalSearchSolvers._State, Any}",href:"#LocalSearchSolvers._var_cost-Tuple{LocalSearchSolvers._State, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._var_cost")],-1)),s[254]||(s[254]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[255]||(s[255]=t('
julia
_var_cost(s::S, x) where S <: Union{_State, AbstractSolver}

Return the cost of variable x.

source

',3))]),i("details",Vs,[i("summary",null,[s[256]||(s[256]=i("a",{id:"LocalSearchSolvers._vars_costs!-Tuple{LocalSearchSolvers._State, Any}",href:"#LocalSearchSolvers._vars_costs!-Tuple{LocalSearchSolvers._State, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._vars_costs!")],-1)),s[257]||(s[257]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[258]||(s[258]=t('
julia
_vars_costs!(s::S, costs) where S <: Union{_State, AbstractSolver}

Set the variables costs.

source

',3))]),i("details",Gs,[i("summary",null,[s[259]||(s[259]=i("a",{id:"LocalSearchSolvers._vars_costs-Tuple{LocalSearchSolvers._State}",href:"#LocalSearchSolvers._vars_costs-Tuple{LocalSearchSolvers._State}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._vars_costs")],-1)),s[260]||(s[260]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[261]||(s[261]=t('
julia
_vars_costs(s::S) where S <: Union{_State, AbstractSolver}

Access the variables costs.

source

',3))]),i("details",Ps,[i("summary",null,[s[262]||(s[262]=i("a",{id:"LocalSearchSolvers._verbose-Tuple{Any, Any}",href:"#LocalSearchSolvers._verbose-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers._verbose")],-1)),s[263]||(s[263]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[264]||(s[264]=t('
julia
_verbose(settings, str)

Temporary logging function. #TODO: use better log instead (LoggingExtra.jl)

source

',3))]),i("details",qs,[i("summary",null,[s[265]||(s[265]=i("a",{id:"LocalSearchSolvers.add!-Tuple{LocalSearchSolvers._Model, LocalSearchSolvers.Variable}",href:"#LocalSearchSolvers.add!-Tuple{LocalSearchSolvers._Model, LocalSearchSolvers.Variable}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.add!")],-1)),s[266]||(s[266]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[267]||(s[267]=t(`
julia
add!(m::M, x) where M <: Union{Model, AbstractSolver}
+add!(m::M, c) where M <: Union{Model, AbstractSolver}
+add!(m::M, o) where M <: Union{Model, AbstractSolver}

Add a variable x, a constraint c, or an objective o to m.

source

`,3))]),i("details",$s,[i("summary",null,[s[268]||(s[268]=i("a",{id:"LocalSearchSolvers.add_value!-Tuple{LocalSearchSolvers._Model, Any, Any}",href:"#LocalSearchSolvers.add_value!-Tuple{LocalSearchSolvers._Model, Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.add_value!")],-1)),s[269]||(s[269]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[270]||(s[270]=t('
julia
add_value!(m::M, x, val) where M <: Union{Model, AbstractSolver}

Add val to x domain.

source

',3))]),i("details",Ws,[i("summary",null,[s[271]||(s[271]=i("a",{id:"LocalSearchSolvers.add_var_to_cons!-Tuple{LocalSearchSolvers._Model, Any, Any}",href:"#LocalSearchSolvers.add_var_to_cons!-Tuple{LocalSearchSolvers._Model, Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.add_var_to_cons!")],-1)),s[272]||(s[272]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[273]||(s[273]=t('
julia
add_var_to_cons!(m::M, c, x) where M <: Union{Model, AbstractSolver}

Add x to the constraint c list of restricted variables.

source

',3))]),i("details",Hs,[i("summary",null,[s[274]||(s[274]=i("a",{id:"LocalSearchSolvers.constraint!-Union{Tuple{V}, Tuple{LocalSearchSolvers._Model, Any, V}} where V<:(AbstractVector{<:Number})",href:"#LocalSearchSolvers.constraint!-Union{Tuple{V}, Tuple{LocalSearchSolvers._Model, Any, V}} where V<:(AbstractVector{<:Number})"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.constraint!")],-1)),s[275]||(s[275]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[276]||(s[276]=t('
julia
constraint!(m::M, func, vars) where M <: Union{Model, AbstractSolver}

Add a constraint with an error function func defined over variables vars.

source

',3))]),i("details",Ks,[i("summary",null,[s[277]||(s[277]=i("a",{id:"LocalSearchSolvers.constraint-Tuple{Any, Any}",href:"#LocalSearchSolvers.constraint-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.constraint")],-1)),s[278]||(s[278]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[279]||(s[279]=t('
julia
constraint(f, vars)

DOCSTRING

source

',3))]),i("details",Qs,[i("summary",null,[s[280]||(s[280]=i("a",{id:"LocalSearchSolvers.constriction-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.constriction-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.constriction")],-1)),s[281]||(s[281]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[282]||(s[282]=t('
julia
constriction(m::M, x) where M <: Union{Model, AbstractSolver}

Return the constriction of variable x.

source

',3))]),i("details",Xs,[i("summary",null,[s[283]||(s[283]=i("a",{id:"LocalSearchSolvers.decay_tabu!-Tuple{Any}",href:"#LocalSearchSolvers.decay_tabu!-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.decay_tabu!")],-1)),s[284]||(s[284]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[285]||(s[285]=t('
julia
_decay_tabu!(s::S) where S <: Union{_State, AbstractSolver}

Decay the tabu list.

source

',3))]),i("details",Ys,[i("summary",null,[s[286]||(s[286]=i("a",{id:"LocalSearchSolvers.decrease_tabu!-Tuple{Any, Any}",href:"#LocalSearchSolvers.decrease_tabu!-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.decrease_tabu!")],-1)),s[287]||(s[287]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[288]||(s[288]=t('
julia
_decrease_tabu!(s::S, x) where S <: Union{_State, AbstractSolver}

Decrement the tabu value of variable x.

source

',3))]),i("details",Zs,[i("summary",null,[s[289]||(s[289]=i("a",{id:"LocalSearchSolvers.delete_tabu!-Tuple{Any, Any}",href:"#LocalSearchSolvers.delete_tabu!-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.delete_tabu!")],-1)),s[290]||(s[290]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[291]||(s[291]=t('
julia
_delete_tabu!(s::S, x) where S <: Union{_State, AbstractSolver}

Delete the tabu entry of variable x.

source

',3))]),i("details",si,[i("summary",null,[s[292]||(s[292]=i("a",{id:"LocalSearchSolvers.delete_value!-Tuple{LocalSearchSolvers._Model, Any, Any}",href:"#LocalSearchSolvers.delete_value!-Tuple{LocalSearchSolvers._Model, Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.delete_value!")],-1)),s[293]||(s[293]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[294]||(s[294]=t('
julia
delete_value(m::M, x, val) where M <: Union{Model, AbstractSolver}

Delete val from x domain.

source

',3))]),i("details",ii,[i("summary",null,[s[295]||(s[295]=i("a",{id:"LocalSearchSolvers.delete_var_from_cons!-Tuple{LocalSearchSolvers._Model, Any, Any}",href:"#LocalSearchSolvers.delete_var_from_cons!-Tuple{LocalSearchSolvers._Model, Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.delete_var_from_cons!")],-1)),s[296]||(s[296]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[297]||(s[297]=t('
julia
delete_var_from_cons(m::M, c, x) where M <: Union{Model, AbstractSolver}

Delete x from the constraint c list of restricted variables.

source

',3))]),i("details",ai,[i("summary",null,[s[298]||(s[298]=i("a",{id:"LocalSearchSolvers.describe-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers.describe-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.describe")],-1)),s[299]||(s[299]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[300]||(s[300]=t('
julia
describe(m::M) where M <: Union{Model, AbstractSolver}

Describe the model.

source

',3))]),i("details",li,[i("summary",null,[s[301]||(s[301]=i("a",{id:"LocalSearchSolvers.domain_size-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.domain_size-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.domain_size")],-1)),s[302]||(s[302]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[303]||(s[303]=t('
julia
domain_size(m::Model, x) = begin

DOCSTRING

source

',3))]),i("details",ei,[i("summary",null,[s[304]||(s[304]=i("a",{id:"LocalSearchSolvers.draw-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.draw-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.draw")],-1)),s[305]||(s[305]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[306]||(s[306]=t('
julia
draw(m::M, x) where M <: Union{Model, AbstractSolver}

Draw a random value of x domain.

source

',3))]),i("details",ti,[i("summary",null,[s[307]||(s[307]=i("a",{id:"LocalSearchSolvers.empty_tabu!-Tuple{Any}",href:"#LocalSearchSolvers.empty_tabu!-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.empty_tabu!")],-1)),s[308]||(s[308]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[309]||(s[309]=t('
julia
_empty_tabu!(s::S) where S <: Union{_State, AbstractSolver}

Empty the tabu list.

source

',3))]),i("details",ni,[i("summary",null,[s[310]||(s[310]=i("a",{id:"LocalSearchSolvers.get_cons_from_var-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.get_cons_from_var-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.get_cons_from_var")],-1)),s[311]||(s[311]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[312]||(s[312]=t('
julia
get_cons_from_var(m::M, x) where M <: Union{Model, AbstractSolver}

Access the constraints restricting variable x.

source

',3))]),i("details",oi,[i("summary",null,[s[313]||(s[313]=i("a",{id:"LocalSearchSolvers.get_constraint-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.get_constraint-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.get_constraint")],-1)),s[314]||(s[314]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[315]||(s[315]=t('
julia
get_constraint(m::M, c) where M <: Union{Model, AbstractSolver}

Access the constraint c.

source

',3))]),i("details",ri,[i("summary",null,[s[316]||(s[316]=i("a",{id:"LocalSearchSolvers.get_constraints-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers.get_constraints-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.get_constraints")],-1)),s[317]||(s[317]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[318]||(s[318]=t('
julia
get_constraints(m::M) where M <: Union{Model, AbstractSolver}

Access the constraints of m.

source

',3))]),i("details",pi,[i("summary",null,[s[319]||(s[319]=i("a",{id:"LocalSearchSolvers.get_domain-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.get_domain-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.get_domain")],-1)),s[320]||(s[320]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[321]||(s[321]=t('
julia
get_domain(m::M, x) where M <: Union{Model, AbstractSolver}

Access the domain of variable x.

source

',3))]),i("details",hi,[i("summary",null,[s[322]||(s[322]=i("a",{id:"LocalSearchSolvers.get_kind-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers.get_kind-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.get_kind")],-1)),s[323]||(s[323]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[324]||(s[324]=t('
julia
get_kind(m::M) where M <: Union{Model, AbstractSolver}

Access the kind of m, such as :sudoku or :generic (default).

source

',3))]),i("details",di,[i("summary",null,[s[325]||(s[325]=i("a",{id:"LocalSearchSolvers.get_name-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.get_name-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.get_name")],-1)),s[326]||(s[326]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[327]||(s[327]=t('
julia
get_name(m::M, x) where M <: Union{Model, AbstractSolver}

Access the name of variable x.

source

',3))]),i("details",ki,[i("summary",null,[s[328]||(s[328]=i("a",{id:"LocalSearchSolvers.get_objective-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.get_objective-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.get_objective")],-1)),s[329]||(s[329]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[330]||(s[330]=t('
julia
get_objective(m::M, o) where M <: Union{Model, AbstractSolver}

Access the objective o.

source

',3))]),i("details",ci,[i("summary",null,[s[331]||(s[331]=i("a",{id:"LocalSearchSolvers.get_objectives-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers.get_objectives-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.get_objectives")],-1)),s[332]||(s[332]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[333]||(s[333]=t('
julia
get_objectives(m::M) where M <: Union{Model, AbstractSolver}

Access the objectives of m.

source

',3))]),i("details",gi,[i("summary",null,[s[334]||(s[334]=i("a",{id:"LocalSearchSolvers.get_time_stamp-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers.get_time_stamp-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.get_time_stamp")],-1)),s[335]||(s[335]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[336]||(s[336]=t('
julia
get_time_stamp(m::M) where M <: Union{Model, AbstractSolver}

Access the time (since epoch) when the model was created. This time stamp is for internal performance measurement.

source

',3))]),i("details",ui,[i("summary",null,[s[337]||(s[337]=i("a",{id:"LocalSearchSolvers.get_variable-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.get_variable-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.get_variable")],-1)),s[338]||(s[338]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[339]||(s[339]=t('
julia
get_variable(m::M, x) where M <: Union{Model, AbstractSolver}

Access the variable x.

source

',3))]),i("details",bi,[i("summary",null,[s[340]||(s[340]=i("a",{id:"LocalSearchSolvers.get_variables-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers.get_variables-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.get_variables")],-1)),s[341]||(s[341]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[342]||(s[342]=t('
julia
get_variables(m::M) where M <: Union{Model, AbstractSolver}

Access the variables of m.

source

',3))]),i("details",yi,[i("summary",null,[s[343]||(s[343]=i("a",{id:"LocalSearchSolvers.get_vars_from_cons-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.get_vars_from_cons-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.get_vars_from_cons")],-1)),s[344]||(s[344]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[345]||(s[345]=t('
julia
get_vars_from_cons(m::M, c) where M <: Union{Model, AbstractSolver}

Access the variables restricted by constraint c.

source

',3))]),i("details",vi,[i("summary",null,[s[346]||(s[346]=i("a",{id:"LocalSearchSolvers.insert_tabu!-Tuple{Any, Any, Val{:tabu}}",href:"#LocalSearchSolvers.insert_tabu!-Tuple{Any, Any, Val{:tabu}}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.insert_tabu!")],-1)),s[347]||(s[347]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[348]||(s[348]=t('
julia
_insert_tabu!(s::S, x, tabu_time) where S <: Union{_State, AbstractSolver}

Insert the bariable x as tabu for tabu_time.

source

',3))]),i("details",Si,[i("summary",null,[s[349]||(s[349]=i("a",{id:"LocalSearchSolvers.is_sat-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers.is_sat-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.is_sat")],-1)),s[350]||(s[350]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[351]||(s[351]=t('
julia
is_sat(m::M) where M <: Union{Model, AbstractSolver}

Return true if m is a satisfaction model.

source

',3))]),i("details",Ei,[i("summary",null,[s[352]||(s[352]=i("a",{id:"LocalSearchSolvers.is_specialized-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers.is_specialized-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.is_specialized")],-1)),s[353]||(s[353]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[354]||(s[354]=t('
julia
is_specialized(m::M) where M <: Union{Model, AbstractSolver}

Return true if the model is already specialized.

source

',3))]),i("details",mi,[i("summary",null,[s[355]||(s[355]=i("a",{id:"LocalSearchSolvers.length_cons-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.length_cons-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.length_cons")],-1)),s[356]||(s[356]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[357]||(s[357]=t('
julia
length_cons(m::M, c) where M <: Union{Model, AbstractSolver}

Return the length of constraint c.

source

',3))]),i("details",ji,[i("summary",null,[s[358]||(s[358]=i("a",{id:"LocalSearchSolvers.length_cons-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers.length_cons-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.length_cons")],-1)),s[359]||(s[359]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[360]||(s[360]=t('
julia
length_cons(m::M) where M <: Union{Model, AbstractSolver}

Return the number of constraints in m.

source

',3))]),i("details",Ci,[i("summary",null,[s[361]||(s[361]=i("a",{id:"LocalSearchSolvers.length_objs-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers.length_objs-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.length_objs")],-1)),s[362]||(s[362]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[363]||(s[363]=t('
julia
length_objs(m::M) where M <: Union{Model, AbstractSolver}

Return the number of objectives in m.

source

',3))]),i("details",Fi,[i("summary",null,[s[364]||(s[364]=i("a",{id:"LocalSearchSolvers.length_tabu-Tuple{Any}",href:"#LocalSearchSolvers.length_tabu-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.length_tabu")],-1)),s[365]||(s[365]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[366]||(s[366]=t('
julia
_length_tabu!(s::S) where S <: Union{_State, AbstractSolver}

Return the length of the tabu list.

source

',3))]),i("details",Li,[i("summary",null,[s[367]||(s[367]=i("a",{id:"LocalSearchSolvers.length_var-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.length_var-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.length_var")],-1)),s[368]||(s[368]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[369]||(s[369]=t('
julia
length_var(m::M, x) where M <: Union{Model, AbstractSolver}

Return the domain length of variable x.

source

',3))]),i("details",fi,[i("summary",null,[s[370]||(s[370]=i("a",{id:"LocalSearchSolvers.length_vars-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers.length_vars-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.length_vars")],-1)),s[371]||(s[371]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[372]||(s[372]=t('
julia
length_vars(m::M) where M <: Union{Model, AbstractSolver}

Return the number of variables in m.

source

',3))]),i("details",Ai,[i("summary",null,[s[373]||(s[373]=i("a",{id:"LocalSearchSolvers.max_domains_size-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.max_domains_size-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.max_domains_size")],-1)),s[374]||(s[374]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[375]||(s[375]=t('
julia
max_domains_size(m::Model, vars) = begin

DOCSTRING

source

',3))]),i("details",Mi,[i("summary",null,[s[376]||(s[376]=i("a",{id:"LocalSearchSolvers.model-Tuple{}",href:"#LocalSearchSolvers.model-Tuple{}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.model")],-1)),s[377]||(s[377]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[378]||(s[378]=t('
julia
model()

Construct a _Model, empty by default. It is recommended to add the constraints, variables, and objectives from an empty _Model. The following keyword arguments are available,

  • vars=Dictionary{Int,Variable}(): collection of variables

  • cons=Dictionary{Int,Constraint}(): collection of constraints

  • objs=Dictionary{Int,Objective}(): collection of objectives

  • kind=:generic: the kind of problem modeled (useful for specialized methods such as pretty printing)

source

',4))]),i("details",_i,[i("summary",null,[s[379]||(s[379]=i("a",{id:"LocalSearchSolvers.o_dist_extrema-Tuple{Any}",href:"#LocalSearchSolvers.o_dist_extrema-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.o_dist_extrema")],-1)),s[380]||(s[380]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[381]||(s[381]=t('
julia
dist_extrema(values::T...) where {T <: Number}

Computes the distance between extrema in an ordered set.

source

',3))]),i("details",Ti,[i("summary",null,[s[382]||(s[382]=i("a",{id:"LocalSearchSolvers.o_mincut-Tuple{Any, Any}",href:"#LocalSearchSolvers.o_mincut-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.o_mincut")],-1)),s[383]||(s[383]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[384]||(s[384]=t('
julia
o_mincut(graph, values; interdiction = 0)

Compute the capacity of a cut (determined by the state of the solver) with a possible interdiction on the highest capacited links.

source

',3))]),i("details",xi,[i("summary",null,[s[385]||(s[385]=i("a",{id:"LocalSearchSolvers.objective!-Tuple{LocalSearchSolvers._Model, Any}",href:"#LocalSearchSolvers.objective!-Tuple{LocalSearchSolvers._Model, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.objective!")],-1)),s[386]||(s[386]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[387]||(s[387]=t('
julia
objective!(m::M, func) where M <: Union{Model, AbstractSolver}

Add an objective evaluated by func.

source

',3))]),i("details",Di,[i("summary",null,[s[388]||(s[388]=i("a",{id:"LocalSearchSolvers.objective-Tuple{Any, Any}",href:"#LocalSearchSolvers.objective-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.objective")],-1)),s[389]||(s[389]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[390]||(s[390]=t('
julia
objective(func, name)

Construct an objective with a function func that should be applied to a collection of variables.

source

',3))]),i("details",Bi,[i("summary",null,[s[391]||(s[391]=i("a",{id:"LocalSearchSolvers.post_process-Tuple{LocalSearchSolvers.AbstractSolver}",href:"#LocalSearchSolvers.post_process-Tuple{LocalSearchSolvers.AbstractSolver}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.post_process")],-1)),s[392]||(s[392]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[393]||(s[393]=t('
julia
post_process(s::MainSolver)

Launch a series of tasks to round-up a solving run, for instance, export a run's info.

source

',3))]),i("details",Oi,[i("summary",null,[s[394]||(s[394]=i("a",{id:"LocalSearchSolvers.remote_dispatch!-Tuple{LocalSearchSolvers.AbstractSolver}",href:"#LocalSearchSolvers.remote_dispatch!-Tuple{LocalSearchSolvers.AbstractSolver}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.remote_dispatch!")],-1)),s[395]||(s[395]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[396]||(s[396]=t('
julia
remote_dispatch!(solver)

Starts the LeadSolvers attached to the MainSolver.

source

',3))]),i("details",Ji,[i("summary",null,[s[397]||(s[397]=i("a",{id:"LocalSearchSolvers.remote_stop!-Tuple{LocalSearchSolvers.AbstractSolver}",href:"#LocalSearchSolvers.remote_stop!-Tuple{LocalSearchSolvers.AbstractSolver}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.remote_stop!")],-1)),s[398]||(s[398]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[399]||(s[399]=t('
julia
remote_stop!!(solver)

Fetch the pool of solutions from LeadSolvers and merge it into the MainSolver.

source

',3))]),i("details",wi,[i("summary",null,[s[400]||(s[400]=i("a",{id:"LocalSearchSolvers.solution-Tuple{Any}",href:"#LocalSearchSolvers.solution-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.solution")],-1)),s[401]||(s[401]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[402]||(s[402]=t('
julia
solution(s)

Return the only/best known solution of a satisfaction/optimization model.

source

',3))]),i("details",Ii,[i("summary",null,[s[403]||(s[403]=i("a",{id:"LocalSearchSolvers.solve_for_loop!-NTuple{5, Any}",href:"#LocalSearchSolvers.solve_for_loop!-NTuple{5, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.solve_for_loop!")],-1)),s[404]||(s[404]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[405]||(s[405]=t('
julia
solve_for_loop!(solver, stop, sat, iter)

First loop in the solving process that starts LeadSolvers from the MainSolver, and _SubSolvers from each MetaSolver.

source

',3))]),i("details",Ui,[i("summary",null,[s[406]||(s[406]=i("a",{id:"LocalSearchSolvers.solve_while_loop!-NTuple{5, Any}",href:"#LocalSearchSolvers.solve_while_loop!-NTuple{5, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.solve_while_loop!")],-1)),s[407]||(s[407]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[408]||(s[408]=t('
julia
solve_while_loop!(s, )

Search the space of configurations.

source

',3))]),i("details",Ri,[i("summary",null,[s[409]||(s[409]=i("a",{id:"LocalSearchSolvers.specialize!-Tuple{Any}",href:"#LocalSearchSolvers.specialize!-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.specialize!")],-1)),s[410]||(s[410]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[411]||(s[411]=t('
julia
specialize!(solver)

Replace the model of solver by one with specialized types (variables, constraints, objectives).

source

',3))]),i("details",zi,[i("summary",null,[s[412]||(s[412]=i("a",{id:"LocalSearchSolvers.specialize-Tuple{LocalSearchSolvers._Model}",href:"#LocalSearchSolvers.specialize-Tuple{LocalSearchSolvers._Model}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.specialize")],-1)),s[413]||(s[413]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[414]||(s[414]=t('
julia
specialize(m::M) where M <: Union{Model, AbstractSolver}

Specialize the structure of a model to avoid dynamic type attribution at runtime.

source

',3))]),i("details",Ni,[i("summary",null,[s[415]||(s[415]=i("a",{id:"LocalSearchSolvers.status-Tuple{LocalSearchSolvers.MainSolver}",href:"#LocalSearchSolvers.status-Tuple{LocalSearchSolvers.MainSolver}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.status")],-1)),s[416]||(s[416]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[417]||(s[417]=t('
julia
status(solver)

Return the status of a MainSolver.

source

',3))]),i("details",Vi,[i("summary",null,[s[418]||(s[418]=i("a",{id:"LocalSearchSolvers.stop_while_loop-Tuple{LocalSearchSolvers.AbstractSolver}",href:"#LocalSearchSolvers.stop_while_loop-Tuple{LocalSearchSolvers.AbstractSolver}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.stop_while_loop")],-1)),s[419]||(s[419]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[420]||(s[420]=t('
julia
stop_while_loop()

Check the stop conditions of the solve! while inner loop.

source

',3))]),i("details",Gi,[i("summary",null,[s[421]||(s[421]=i("a",{id:"LocalSearchSolvers.tabu_list-Tuple{Any}",href:"#LocalSearchSolvers.tabu_list-Tuple{Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.tabu_list")],-1)),s[422]||(s[422]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[423]||(s[423]=t('
julia
_tabu(s::S) where S <: Union{_State, AbstractSolver}

Access the list of tabu variables.

source

',3))]),i("details",Pi,[i("summary",null,[s[424]||(s[424]=i("a",{id:"LocalSearchSolvers.tabu_value-Tuple{Any, Any}",href:"#LocalSearchSolvers.tabu_value-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.tabu_value")],-1)),s[425]||(s[425]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[426]||(s[426]=t('
julia
_tabu(s::S, x) where S <: Union{_State, AbstractSolver}

Return the tabu value of variable x.

source

',3))]),i("details",qi,[i("summary",null,[s[427]||(s[427]=i("a",{id:"LocalSearchSolvers.variable!",href:"#LocalSearchSolvers.variable!"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.variable!")],-1)),s[428]||(s[428]=a()),e(l,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[429]||(s[429]=t('
julia
variable!(m::M, d) where M <: Union{Model, AbstractSolver}

Add a variable with domain d to m.

source

',3))]),i("details",$i,[i("summary",null,[s[430]||(s[430]=i("a",{id:"LocalSearchSolvers.variable-Tuple{}",href:"#LocalSearchSolvers.variable-Tuple{}"},[i("span",{class:"jlbinding"},"LocalSearchSolvers.variable")],-1)),s[431]||(s[431]=a()),e(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[432]||(s[432]=t(`
julia
variable(values::AbstractVector{T}, name::AbstractString; domain = :set) where T <: Number
+variable(domain::AbstractDomain, name::AbstractString) where D <: AbstractDomain

Construct a variable with discrete domain. See the domain method for other options.

julia
d = domain([1,2,3,4], types = :indices)
+x1 = variable(d, "x1")
+x2 = variable([-89,56,28], "x2", domain = :indices)

source

`,4))])])}const ia=n(h,[["render",Wi]]);export{sa as __pageData,ia as default}; diff --git a/dev/assets/solvers_60_local_search_solvers.md.DbQ6-9eL.js b/dev/assets/solvers_60_local_search_solvers.md.DbQ6-9eL.js deleted file mode 100644 index 8e77926..0000000 --- a/dev/assets/solvers_60_local_search_solvers.md.DbQ6-9eL.js +++ /dev/null @@ -1,36 +0,0 @@ -import{_ as s,c as i,o as a,a7 as e}from"./chunks/framework.CBLuZwrP.js";const u=JSON.parse('{"title":"LocalSearchSolvers.jl","description":"","frontmatter":{},"headers":[],"relativePath":"solvers/60_local_search_solvers.md","filePath":"solvers/60_local_search_solvers.md","lastUpdated":null}'),l={name:"solvers/60_local_search_solvers.md"},t=e(`

LocalSearchSolvers.jl

Documentation for LocalSearchSolvers.jl.

# LocalSearchSolvers.AbstractSolverType.
julia
AbstractSolver

Abstract type to encapsulate the different solver types such as Solver or _SubSolver.

source


# LocalSearchSolvers.ConstraintType.
julia
Constraint{F <: Function}

Structure to store an error function and the variables it constrains.

source


# LocalSearchSolvers.LeadSolverType.
julia
LeadSolver <: MetaSolver

Solver managed remotely by a MainSolver. Can manage its own set of local sub solvers.

source


# LocalSearchSolvers.MainSolverType.
julia
MainSolver <: AbstractSolver

Main solver. Handle the solving of a model, and optional multithreaded and/or distributed subsolvers.

Arguments:

  • model::Model: A formal description of the targeted problem

  • state::_State: An internal state to store the info necessary to a solving run

  • options::Options: User options for this solver

  • subs::Vector{_SubSolver}: Optional subsolvers

source


# LocalSearchSolvers.MetaSolverType.

Abstract type to encapsulate all solver types that manages other solvers.

source


# LocalSearchSolvers.ObjectiveType.
julia
Objective{F <: Function}

A structure to handle objectives in a solver. \`struct Objective{F <: Function} name::String f::F end\`\`

source


# LocalSearchSolvers.ObjectiveMethod.
julia
Objective(F, o::Objective{F2}) where {F2 <: Function}

Constructor used in specializing a solver. Should never be called externally.

source


# LocalSearchSolvers.OptionsType.
julia
Options()

Arguments:

  • dynamic::Bool: is the model dynamic?

  • iteration::Union{Int, Float64}: limit on the number of iterations

  • print_level::Symbol: verbosity to choose among :silent, :minimal, :partial, :verbose

  • solutions::Int: number of solutions to return

  • specialize::Bool: should the types of the model be specialized or not. Usually yes for static problems. For dynamic in depends if the user intend to introduce new types. The specialized model is about 10% faster.

  • tabu_time::Int: DESCRIPTION

  • tabu_local::Int: DESCRIPTION

  • tabu_delta::Float64: DESCRIPTION

  • threads::Int: Number of threads to use

  • time_limit::Float64: time limit in seconds

  • \`function Options(; dynamic = false, iteration = 10000, print_level = :minimal, solutions = 1, specialize = !dynamic, tabu_time = 0, tabu_local = 0, tabu_delta = 0.0, threads = typemax(0), time_limit = Inf)

julia
# Setting options in JuMP syntax: print_level, time_limit, iteration
-model = Model(CBLS.Optimizer)
-set_optimizer_attribute(model, "iteration", 100)
-set_optimizer_attribute(model, "print_level", :verbose)
-set_time_limit_sec(model, 5.0)

source


# LocalSearchSolvers.VariableType.
julia
Variable{D <: AbstractDomain}

A structure containing the necessary information for a solver's variables: name, domain, and constraints it belongs.

struct Variable{D <: AbstractDomain}
-    domain::D
-    constraints::Indices{Int}
-end

source


# LocalSearchSolvers._ModelType.
julia
_Model{V <: Variable{<:AbstractDomain},C <: Constraint{<:Function},O <: Objective{<:Function}}

A struct to model a problem as a set of variables, domains, constraints, and objectives.

struct _Model{V <: Variable{<:AbstractDomain},C <: Constraint{<:Function},O <: Objective{<:Function}}
-    variables::Dictionary{Int,V}
-    constraints::Dictionary{Int,C}
-    objectives::Dictionary{Int,O}
-
-    # counter to add new variables: vars, cons, objs
-    max_vars::Ref{Int}
-    max_cons::Ref{Int}
-    max_objs::Ref{Int}
-
-    # Bool to indicate if the _Model instance has been specialized (relatively to types)
-    specialized::Ref{Bool}
-
-    # Symbol to indicate the kind of model for specialized methods such as pretty printing
-    kind::Symbol
-end

source


# LocalSearchSolvers._StateType.
julia
GeneralState{T <: Number}

A mutable structure to store the general state of a solver. All methods applied to GeneralState are forwarded to S <: AbstractSolver.

mutable struct GeneralState{T <: Number} <: AbstractState
-    configuration::Configuration{T}
-    cons_costs::Dictionary{Int, Float64}
-    last_improvement::Int
-    tabu::Dictionary{Int, Int}
-    vars_costs::Dictionary{Int, Float64}
-end

source


# LocalSearchSolvers._SubSolverType.
julia
_SubSolver <: AbstractSolver

An internal solver type called by MetaSolver when multithreading is enabled.

Arguments:

  • id::Int: subsolver id for debugging

  • model::Model: a ref to the model of the main solver

  • state::_State: a deepcopy of the main solver that evolves independently

  • options::Options: a ref to the options of the main solver

source


# Base.empty!Method.
julia
empty!(s::Solver)

source


# Base.empty!Method.
julia
empty!(m::Model)

DOCSTRING

source


# Base.inMethod.
julia
var::Int c::Constraint

source


# Base.inMethod.
julia
x::Variable constraint
-value  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source


# LocalSearchSolvers._add!Method.
julia
_add!(c::Constraint, x)

Add the variable of indice x to c.

source


# LocalSearchSolvers._add_to_constraint!Method.
julia
_add_to_constraint!(x::Variable, id)

Add a constraint id to the list of constraints of x.

source


# LocalSearchSolvers._check_restartMethod.
julia
_check_restart(s)

Check if a restart of s is necessary. If s has subsolvers, this check is independent for all of them.

source


# LocalSearchSolvers._check_subsMethod.
julia
_check_subs(s)

Check if any subsolver of a main solver s, for

  • Satisfaction, has a solution, then return it, resume the run otherwise

  • Optimization, has a better solution, then assign it to its internal state

source


# LocalSearchSolvers._compute!Method.
julia
_compute!(s; o::Int = 1, cons_lst = Indices{Int}())

Compute the objective o's value if s is satisfied and return the current error.

Arguments:

  • s: a solver

  • o: targeted objective

  • cons_lst: list of targeted constraints, if empty compute for the whole set

source


# LocalSearchSolvers._compute_cost!Method.
julia
_compute_cost!(s, ind, c)

Compute the cost of constraint c with index ind.

source


# LocalSearchSolvers._compute_costs!Method.
julia
_compute_costs!(s; cons_lst::Indices{Int} = Indices{Int}())

Compute the cost of constraints c in cons_lst. If cons_lst is empty, compute the cost for all the constraints in s.

source


# LocalSearchSolvers._compute_objective!Method.
julia
_compute_objective!(s, o::Objective)
-_compute_objective!(s, o = 1)

Compute the objective o's value.

source


# LocalSearchSolvers._cons_cost!Method.
julia
_cons_cost!(s::S, c, cost) where S <: Union{_State, AbstractSolver}

Set the cost of constraint c.

source


# LocalSearchSolvers._cons_costMethod.
julia
_cons_cost(s::S, c) where S <: Union{_State, AbstractSolver}

Return the cost of constraint c.

source


# LocalSearchSolvers._cons_costs!Method.
julia
_cons_costs!(s::S, costs) where S <: Union{_State, AbstractSolver}

Set the constraints costs.

source


# LocalSearchSolvers._cons_costsMethod.
julia
_cons_costs(s::S) where S <: Union{_State, AbstractSolver}

Access the constraints costs.

source


# LocalSearchSolvers._constrictionMethod.
julia
_constriction(x::Variable)

Return the cosntriction of x, i.e. the number of constraints restricting x.

source


# LocalSearchSolvers._delete!Method.
julia
_delete!(c::Constraint, x::Int)

Delete x from c.

source


# LocalSearchSolvers._delete_from_constraint!Method.
julia
_delete_from_constraint!(x::Variable, id)

Delete a constraint id from the list of constraints of x.

source


# LocalSearchSolvers._draw!Method.
julia
_draw!(s)

Draw a random (re-)starting configuration.

source


# LocalSearchSolvers._dynamic!Method.
julia
_dynamic!(options, dynamic) = begin

DOCSTRING

source


# LocalSearchSolvers._dynamicMethod.
julia
_dynamic(options) = begin

DOCSTRING

source


# LocalSearchSolvers._find_rand_argmaxMethod.
julia
_find_rand_argmax(d::DictionaryView)

Compute argmax of d and select one element randomly.

source


# LocalSearchSolvers._get_constraintsMethod.
julia
_get_constraints(x::Variable)

Access the list of constraints of x.

source


# LocalSearchSolvers._get_varsMethod.
julia
_get_vars(c::Constraint)

Returns the variables constrained by c.

source


# LocalSearchSolvers._inc_cons!Method.
julia
_inc_vars!(m::M) where M <: Union{Model, AbstractSolver}

Increment the maximum constraint id that has been attributed to m.

source


# LocalSearchSolvers._inc_objs!Method.
julia
_inc_vars!(m::M) where M <: Union{Model, AbstractSolver}

Increment the maximum objective id that has been attributed to m.

source


# LocalSearchSolvers._inc_vars!Method.
julia
_inc_vars!(m::M) where M <: Union{Model, AbstractSolver}

Increment the maximum variable id that has been attributed to m.

source


# LocalSearchSolvers._info_path!Method.
julia
_info_path!(options, iterations) = begin

DOCSTRING

source


# LocalSearchSolvers._info_pathMethod.
julia
_info_path(options, path)

DOCSTRING

source


# LocalSearchSolvers._is_emptyMethod.
julia
_is_empty(m::Model)

DOCSTRING

source


# LocalSearchSolvers._iteration!Method.
julia
_iteration!(options, iterations) = begin

DOCSTRING

source


# LocalSearchSolvers._iterationMethod.
julia
_iteration(options) = begin

DOCSTRING

source


# LocalSearchSolvers._lengthMethod.
julia
_length(c::Constraint)

Return the number of constrained variables by c.

source


# LocalSearchSolvers._max_consMethod.
julia
_max_cons(m::M) where M <: Union{Model, AbstractSolver}

Access the maximum constraint id that has been attributed to m.

source


# LocalSearchSolvers._max_objsMethod.
julia
_max_objs(m::M) where M <: Union{Model, AbstractSolver}

Access the maximum objective id that has been attributed to m.

source


# LocalSearchSolvers._max_varsMethod.
julia
_max_vars(m::M) where M <: Union{Model, AbstractSolver}

Access the maximum variable id that has been attributed to m.

source


# LocalSearchSolvers._move!Function.
julia
_move!(s, x::Int, dim::Int = 0)

Perform an improving move in x neighbourhood if possible.

Arguments:

  • s: a solver of type S <: AbstractSolver

  • x: selected variable id

  • dim: describe the dimension of the considered neighbourhood

source


# LocalSearchSolvers._neighboursFunction.
julia
_neighbours(s, x, dim = 0)

DOCSTRING

Arguments:

  • s: DESCRIPTION

  • x: DESCRIPTION

  • dim: DESCRIPTION

source


# LocalSearchSolvers._optimizing!Method.
julia
_optimizing!(s::S) where S <: Union{_State, AbstractSolver}

Set the solver optimizing status to true.

source


# LocalSearchSolvers._optimizingMethod.
julia
_optimizing(s::S) where S <: Union{_State, AbstractSolver}

Check if s is in an optimizing state.

source


# LocalSearchSolvers._print_level!Method.
julia
_print_level!(options, level) = begin

DOCSTRING

source


# LocalSearchSolvers._print_levelMethod.
julia
_print_level(options) = begin

DOCSTRING

source


# LocalSearchSolvers._process_threads_map!Method.
julia
_process_threads_map!(options, ptm)

TBW

source


# LocalSearchSolvers._process_threads_mapMethod.
julia
_process_threads_map(options)

TBW

source


# LocalSearchSolvers._restart!Function.
julia
_restart!(s, k = 10)

Restart a solver.

source


# LocalSearchSolvers._satisfying!Method.
julia
_satisfying!(s::S) where S <: Union{_State, AbstractSolver}

Set the solver optimizing status to false.

source


# LocalSearchSolvers._select_worseMethod.
julia
_select_worse(s::S) where S <: Union{_State, AbstractSolver}

Within the non-tabu variables, select the one with the worse error .

source


# LocalSearchSolvers._set!Method.
julia
_set!(s::S, x, val) where S <: Union{_State, AbstractSolver}

Set the value of variable x to val.

source


# LocalSearchSolvers._set_domain!Method.
julia
_set_domain!(m::Model, x, values)

DOCSTRING

Arguments:

  • m: DESCRIPTION

  • x: DESCRIPTION

  • values: DESCRIPTION

source


# LocalSearchSolvers._solutions!Method.
julia
_solutions!(options, solutions) = begin

DOCSTRING

source


# LocalSearchSolvers._solutionsMethod.
julia
_solutions(options) = begin

DOCSTRING

source


# LocalSearchSolvers._specialize!Method.
julia
_specialize!(options, specialize) = begin

DOCSTRING

source


# LocalSearchSolvers._specializeMethod.
julia
_specialize(options) = begin

DOCSTRING

source


# LocalSearchSolvers._step!Method.
julia
_step!(s)

Iterate a step of the solver run.

source


# LocalSearchSolvers._swap_value!Method.
julia
_set!(s::S, x, y) where S <: Union{_State, AbstractSolver}

Swap the values of variables x and y.

source


# LocalSearchSolvers._tabu_delta!Method.
julia
_tabu_delta!(options, time) = begin

DOCSTRING

source


# LocalSearchSolvers._tabu_deltaMethod.
julia
_tabu_delta(options) = begin

DOCSTRING

source


# LocalSearchSolvers._tabu_local!Method.
julia
_tabu_local!(options, time) = begin

DOCSTRING

source


# LocalSearchSolvers._tabu_localMethod.
julia
_tabu_local(options) = begin

DOCSTRING

source


# LocalSearchSolvers._tabu_time!Method.
julia
_tabu_time!(options, time) = begin

DOCSTRING

source


# LocalSearchSolvers._tabu_timeMethod.
julia
_tabu_time(options) = begin

DOCSTRING

source


# LocalSearchSolvers._threadsFunction.
julia
_threads(options) = begin

DOCSTRING

source


# LocalSearchSolvers._threads!Function.
julia
_threads!(options, threads) = begin

DOCSTRING

source


# LocalSearchSolvers._time_limit!Method.
julia
_time_limit!(options, time::Time) = begin

DOCSTRING

source


# LocalSearchSolvers._time_limitMethod.
julia
_time_limit(options)

DOCSTRING

source


# LocalSearchSolvers._to_unionMethod.
julia
_to_union(datatype)

Make a minimal Union type from a collection of data types.

source


# LocalSearchSolvers._value!Method.
julia
_value!(s::S, x, val) where S <: Union{_State, AbstractSolver}

Set the value of variable x to val.

source


# LocalSearchSolvers._valueMethod.
julia
_value(s::S, x) where S <: Union{_State, AbstractSolver}

Return the value of variable x.

source


# LocalSearchSolvers._values!Method.
julia
_values!(s::S, values) where S <: Union{_State, AbstractSolver}

Set the variables values.

source


# LocalSearchSolvers._valuesMethod.
julia
_vars_costs(s::S) where S <: Union{_State, AbstractSolver}

Access the variables costs.

source


# LocalSearchSolvers._var_cost!Method.
julia
_var_cost!(s::S, x, cost) where S <: Union{_State, AbstractSolver}

Set the cost of variable x.

source


# LocalSearchSolvers._var_costMethod.
julia
_var_cost(s::S, x) where S <: Union{_State, AbstractSolver}

Return the cost of variable x.

source


# LocalSearchSolvers._vars_costs!Method.
julia
_vars_costs!(s::S, costs) where S <: Union{_State, AbstractSolver}

Set the variables costs.

source


# LocalSearchSolvers._vars_costsMethod.
julia
_vars_costs(s::S) where S <: Union{_State, AbstractSolver}

Access the variables costs.

source


# LocalSearchSolvers._verboseMethod.
julia
_verbose(settings, str)

Temporary logging function. #TODO: use better log instead (LoggingExtra.jl)

source


# LocalSearchSolvers.add!Method.
julia
mts = - get_time_stamp(model)

return TimeStamps(mts, mts, mts, mts, mts, mts, mts) end

add!(m::M, x) where M <: Union{Model, AbstractSolver}
-add!(m::M, c) where M <: Union{Model, AbstractSolver}
-add!(m::M, o) where M <: Union{Model, AbstractSolver}

Add a variable x, a constraint c, or an objective o to m.

source


# LocalSearchSolvers.add_value!Method.
julia
add_value!(m::M, x, val) where M <: Union{Model, AbstractSolver}

Add val to x domain.

source


# LocalSearchSolvers.add_var_to_cons!Method.
julia
add_var_to_cons!(m::M, c, x) where M <: Union{Model, AbstractSolver}

Add x to the constraint c list of restricted variables.

source


# LocalSearchSolvers.constraint!Method.
julia
constraint!(m::M, func, vars) where M <: Union{Model, AbstractSolver}

Add a constraint with an error function func defined over variables vars.

source


# LocalSearchSolvers.constraintMethod.
julia
constraint(f, vars)

DOCSTRING

source


# LocalSearchSolvers.constrictionMethod.
julia
constriction(m::M, x) where M <: Union{Model, AbstractSolver}

Return the constriction of variable x.

source


# LocalSearchSolvers.decay_tabu!Method.
julia
_decay_tabu!(s::S) where S <: Union{_State, AbstractSolver}

Decay the tabu list.

source


# LocalSearchSolvers.decrease_tabu!Method.
julia
_decrease_tabu!(s::S, x) where S <: Union{_State, AbstractSolver}

Decrement the tabu value of variable x.

source


# LocalSearchSolvers.delete_tabu!Method.
julia
_delete_tabu!(s::S, x) where S <: Union{_State, AbstractSolver}

Delete the tabu entry of variable x.

source


# LocalSearchSolvers.delete_value!Method.
julia
delete_value(m::M, x, val) where M <: Union{Model, AbstractSolver}

Delete val from x domain.

source


# LocalSearchSolvers.delete_var_from_cons!Method.
julia
delete_var_from_cons(m::M, c, x) where M <: Union{Model, AbstractSolver}

Delete x from the constraint c list of restricted variables.

source


# LocalSearchSolvers.describeMethod.
julia
describe(m::M) where M <: Union{Model, AbstractSolver}

Describe the model.

source


# LocalSearchSolvers.domain_sizeMethod.
julia
domain_size(m::Model, x) = begin

DOCSTRING

source


# LocalSearchSolvers.drawMethod.
julia
draw(m::M, x) where M <: Union{Model, AbstractSolver}

Draw a random value of x domain.

source


# LocalSearchSolvers.empty_tabu!Method.
julia
_empty_tabu!(s::S) where S <: Union{_State, AbstractSolver}

Empty the tabu list.

source


# LocalSearchSolvers.get_cons_from_varMethod.
julia
get_cons_from_var(m::M, x) where M <: Union{Model, AbstractSolver}

Access the constraints restricting variable x.

source


# LocalSearchSolvers.get_constraintMethod.
julia
get_constraint(m::M, c) where M <: Union{Model, AbstractSolver}

Access the constraint c.

source


# LocalSearchSolvers.get_constraintsMethod.
julia
get_constraints(m::M) where M <: Union{Model, AbstractSolver}

Access the constraints of m.

source


# LocalSearchSolvers.get_domainMethod.
julia
get_domain(m::M, x) where M <: Union{Model, AbstractSolver}

Access the domain of variable x.

source


# LocalSearchSolvers.get_kindMethod.
julia
get_kind(m::M) where M <: Union{Model, AbstractSolver}

Access the kind of m, such as :sudoku or :generic (default).

source


# LocalSearchSolvers.get_nameMethod.
julia
get_name(m::M, x) where M <: Union{Model, AbstractSolver}

Access the name of variable x.

source


# LocalSearchSolvers.get_objectiveMethod.
julia
get_objective(m::M, o) where M <: Union{Model, AbstractSolver}

Access the objective o.

source


# LocalSearchSolvers.get_objectivesMethod.
julia
get_objectives(m::M) where M <: Union{Model, AbstractSolver}

Access the objectives of m.

source


# LocalSearchSolvers.get_time_stampMethod.
julia
get_time_stamp(m::M) where M <: Union{Model, AbstractSolver}

Access the time (since epoch) when the model was created. This time stamp is for internal performance measurement.

source


# LocalSearchSolvers.get_variableMethod.
julia
get_variable(m::M, x) where M <: Union{Model, AbstractSolver}

Access the variable x.

source


# LocalSearchSolvers.get_variablesMethod.
julia
get_variables(m::M) where M <: Union{Model, AbstractSolver}

Access the variables of m.

source


# LocalSearchSolvers.get_vars_from_consMethod.
julia
get_vars_from_cons(m::M, c) where M <: Union{Model, AbstractSolver}

Access the variables restricted by constraint c.

source


# LocalSearchSolvers.insert_tabu!Method.
julia
_insert_tabu!(s::S, x, tabu_time) where S <: Union{_State, AbstractSolver}

Insert the bariable x as tabu for tabu_time.

source


# LocalSearchSolvers.is_satMethod.
julia
is_sat(m::M) where M <: Union{Model, AbstractSolver}

Return true if m is a satisfaction model.

source


# LocalSearchSolvers.is_specializedMethod.
julia
is_specialized(m::M) where M <: Union{Model, AbstractSolver}

Return true if the model is already specialized.

source


# LocalSearchSolvers.length_consMethod.
julia
length_cons(m::M, c) where M <: Union{Model, AbstractSolver}

Return the length of constraint c.

source


# LocalSearchSolvers.length_consMethod.
julia
length_cons(m::M) where M <: Union{Model, AbstractSolver}

Return the number of constraints in m.

source


# LocalSearchSolvers.length_objsMethod.
julia
length_objs(m::M) where M <: Union{Model, AbstractSolver}

Return the number of objectives in m.

source


# LocalSearchSolvers.length_tabuMethod.
julia
_length_tabu!(s::S) where S <: Union{_State, AbstractSolver}

Return the length of the tabu list.

source


# LocalSearchSolvers.length_varMethod.
julia
length_var(m::M, x) where M <: Union{Model, AbstractSolver}

Return the domain length of variable x.

source


# LocalSearchSolvers.length_varsMethod.
julia
length_vars(m::M) where M <: Union{Model, AbstractSolver}

Return the number of variables in m.

source


# LocalSearchSolvers.max_domains_sizeMethod.
julia
max_domains_size(m::Model, vars) = begin

DOCSTRING

source


# LocalSearchSolvers.modelMethod.
julia
model()

Construct a _Model, empty by default. It is recommended to add the constraints, variables, and objectives from an empty _Model. The following keyword arguments are available,

  • vars=Dictionary{Int,Variable}(): collection of variables

  • cons=Dictionary{Int,Constraint}(): collection of constraints

  • objs=Dictionary{Int,Objective}(): collection of objectives

  • kind=:generic: the kind of problem modeled (useful for specialized methods such as pretty printing)

source


# LocalSearchSolvers.o_dist_extremaMethod.
julia
dist_extrema(values::T...) where {T <: Number}

Computes the distance between extrema in an ordered set.

source


# LocalSearchSolvers.o_mincutMethod.
julia
o_mincut(graph, values; interdiction = 0)

Compute the capacity of a cut (determined by the state of the solver) with a possible interdiction on the highest capacited links.

source


# LocalSearchSolvers.objective!Method.
julia
objective!(m::M, func) where M <: Union{Model, AbstractSolver}

Add an objective evaluated by func.

source


# LocalSearchSolvers.objectiveMethod.
julia
objective(func, name)

Construct an objective with a function func that should be applied to a collection of variables.

source


# LocalSearchSolvers.post_processMethod.
julia
post_process(s::MainSolver)

Launch a series of tasks to round-up a solving run, for instance, export a run's info.

source


# LocalSearchSolvers.remote_dispatch!Method.
julia
remote_dispatch!(solver)

Starts the LeadSolvers attached to the MainSolver.

source


# LocalSearchSolvers.remote_stop!Method.
julia
remote_stop!!(solver)

Fetch the pool of solutions from LeadSolvers and merge it into the MainSolver.

source


# LocalSearchSolvers.solutionMethod.
julia
solution(s)

Return the only/best known solution of a satisfaction/optimization model.

source


# LocalSearchSolvers.solve_for_loop!Method.
julia
solve_for_loop!(solver, stop, sat, iter)

First loop in the solving process that starts LeadSolvers from the MainSolver, and _SubSolvers from each MetaSolver.

source


# LocalSearchSolvers.solve_while_loop!Method.
julia
solve_while_loop!(s, )

Search the space of configurations.

source


# LocalSearchSolvers.specialize!Method.
julia
specialize!(solver)

Replace the model of solver by one with specialized types (variables, constraints, objectives).

source


# LocalSearchSolvers.specializeMethod.
julia
specialize(m::M) where M <: Union{Model, AbstractSolver}

Specialize the structure of a model to avoid dynamic type attribution at runtime.

source


# LocalSearchSolvers.statusMethod.
julia
status(solver)

Return the status of a MainSolver.

source


# LocalSearchSolvers.stop_while_loopMethod.
julia
stop_while_loop()

Check the stop conditions of the solve! while inner loop.

source


# LocalSearchSolvers.tabu_listMethod.
julia
_tabu(s::S) where S <: Union{_State, AbstractSolver}

Access the list of tabu variables.

source


# LocalSearchSolvers.tabu_valueMethod.
julia
_tabu(s::S, x) where S <: Union{_State, AbstractSolver}

Return the tabu value of variable x.

source


# LocalSearchSolvers.variable!Function.
julia
variable!(m::M, d) where M <: Union{Model, AbstractSolver}

Add a variable with domain d to m.

source


# LocalSearchSolvers.variableMethod.
julia
variable(values::AbstractVector{T}, name::AbstractString; domain = :set) where T <: Number
-variable(domain::AbstractDomain, name::AbstractString) where D <: AbstractDomain

Construct a variable with discrete domain. See the domain method for other options.

julia
d = domain([1,2,3,4], types = :indices)
-x1 = variable(d, "x1")
-x2 = variable([-89,56,28], "x2", domain = :indices)

source


`,290),r=[t];function o(h,n,p,d,c,k){return a(),i("div",null,r)}const g=s(l,[["render",o]]);export{u as __pageData,g as default}; diff --git a/dev/assets/solvers_60_local_search_solvers.md.DbQ6-9eL.lean.js b/dev/assets/solvers_60_local_search_solvers.md.DbQ6-9eL.lean.js deleted file mode 100644 index f01a55f..0000000 --- a/dev/assets/solvers_60_local_search_solvers.md.DbQ6-9eL.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,c as i,o as a,a7 as e}from"./chunks/framework.CBLuZwrP.js";const u=JSON.parse('{"title":"LocalSearchSolvers.jl","description":"","frontmatter":{},"headers":[],"relativePath":"solvers/60_local_search_solvers.md","filePath":"solvers/60_local_search_solvers.md","lastUpdated":null}'),l={name:"solvers/60_local_search_solvers.md"},t=e("",290),r=[t];function o(h,n,p,d,c,k){return a(),i("div",null,r)}const g=s(l,[["render",o]]);export{u as __pageData,g as default}; diff --git a/dev/assets/style.Bb0J_nSp.css b/dev/assets/style.Bb0J_nSp.css deleted file mode 100644 index 75cc062..0000000 --- a/dev/assets/style.Bb0J_nSp.css +++ /dev/null @@ -1 +0,0 @@ -@import"https://fonts.googleapis.com/css?family=Space+Mono:regular,italic,700,700italic";@import"https://fonts.googleapis.com/css?family=Space+Grotesk:regular,italic,700,700italic";@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-roman-cyrillic.C5lxZ8CY.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-roman-greek-ext.CqjqNYQ-.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-roman-greek.BBVDIX6e.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-roman-vietnamese.BjW4sHH5.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-roman-latin-ext.4ZJIpNVo.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-roman-latin.Di8DUHzh.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-italic-cyrillic-ext.r48I6akx.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-italic-cyrillic.By2_1cv3.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-italic-greek-ext.1u6EdAuj.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-italic-greek.DJ8dCoTZ.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-italic-vietnamese.BSbpV94h.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-italic-latin-ext.CN1xVJS-.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-italic-latin.C2AdPX0b.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Punctuation SC;font-weight:400;src:local("PingFang SC Regular"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:500;src:local("PingFang SC Medium"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:600;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:700;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-purple-1: #6f42c1;--vp-c-purple-2: #7e4cc9;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-purple-1: #c8abfa;--vp-c-purple-2: #a879e6;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: rgba(60, 60, 67);--vp-c-text-2: rgba(60, 60, 67, .78);--vp-c-text-3: rgba(60, 60, 67, .56)}.dark{--vp-c-text-1: rgba(255, 255, 245, .86);--vp-c-text-2: rgba(235, 235, 245, .6);--vp-c-text-3: rgba(235, 235, 245, .38)}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-note-1: var(--vp-c-brand-1);--vp-c-note-2: var(--vp-c-brand-2);--vp-c-note-3: var(--vp-c-brand-3);--vp-c-note-soft: var(--vp-c-brand-soft);--vp-c-success-1: var(--vp-c-green-1);--vp-c-success-2: var(--vp-c-green-2);--vp-c-success-3: var(--vp-c-green-3);--vp-c-success-soft: var(--vp-c-green-soft);--vp-c-important-1: var(--vp-c-purple-1);--vp-c-important-2: var(--vp-c-purple-2);--vp-c-important-3: var(--vp-c-purple-3);--vp-c-important-soft: var(--vp-c-purple-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft);--vp-c-caution-1: var(--vp-c-red-1);--vp-c-caution-2: var(--vp-c-red-2);--vp-c-caution-3: var(--vp-c-red-3);--vp-c-caution-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;font-optical-sizing:auto}:root:where(:lang(zh)){--vp-font-family-base: "Punctuation SC", "Inter", ui-sans-serif, system-ui, "PingFang SC", "Noto Sans CJK SC", "Noto Sans SC", "Heiti SC", "Microsoft YaHei", "DengXian", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}@media (min-width: 960px){:root{--vp-z-index-sidebar: 25}}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-success-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-success-1);--vp-code-line-diff-remove-color: var(--vp-c-danger-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-danger-1);--vp-code-line-warning-color: var(--vp-c-warning-soft);--vp-code-line-error-color: var(--vp-c-danger-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-note-border: transparent;--vp-custom-block-note-text: var(--vp-c-text-1);--vp-custom-block-note-bg: var(--vp-c-default-soft);--vp-custom-block-note-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-tip-soft);--vp-custom-block-tip-code-bg: var(--vp-c-tip-soft);--vp-custom-block-important-border: transparent;--vp-custom-block-important-text: var(--vp-c-text-1);--vp-custom-block-important-bg: var(--vp-c-important-soft);--vp-custom-block-important-code-bg: var(--vp-c-important-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-caution-border: transparent;--vp-custom-block-caution-text: var(--vp-c-text-1);--vp-custom-block-caution-bg: var(--vp-c-caution-soft);--vp-custom-block-caution-code-bg: var(--vp-c-caution-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-default-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-tip-1);--vp-badge-tip-bg: var(--vp-c-tip-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{overflow-x:auto}mjx-container>svg{display:inline-block;margin:auto}[class^=vpi-],[class*=" vpi-"],.vp-icon{width:1em;height:1em}[class^=vpi-].bg,[class*=" vpi-"].bg,.vp-icon.bg{background-size:100% 100%;background-color:transparent}[class^=vpi-]:not(.bg),[class*=" vpi-"]:not(.bg),.vp-icon:not(.bg){-webkit-mask:var(--icon) no-repeat;mask:var(--icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit}.vpi-align-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M21 6H3M15 12H3M17 18H3'/%3E%3C/svg%3E")}.vpi-arrow-right,.vpi-arrow-down,.vpi-arrow-left,.vpi-arrow-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5l7 7-7 7'/%3E%3C/svg%3E")}.vpi-chevron-right,.vpi-chevron-down,.vpi-chevron-left,.vpi-chevron-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E")}.vpi-chevron-down,.vpi-arrow-down{transform:rotate(90deg)}.vpi-chevron-left,.vpi-arrow-left{transform:rotate(180deg)}.vpi-chevron-up,.vpi-arrow-up{transform:rotate(-90deg)}.vpi-square-pen{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z'/%3E%3C/svg%3E")}.vpi-plus{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5v14'/%3E%3C/svg%3E")}.vpi-sun{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41'/%3E%3C/svg%3E")}.vpi-moon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z'/%3E%3C/svg%3E")}.vpi-more-horizontal{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='1'/%3E%3Ccircle cx='19' cy='12' r='1'/%3E%3Ccircle cx='5' cy='12' r='1'/%3E%3C/svg%3E")}.vpi-languages{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m5 8 6 6M4 14l6-6 2-3M2 5h12M7 2h1M22 22l-5-10-5 10M14 18h6'/%3E%3C/svg%3E")}.vpi-heart{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z'/%3E%3C/svg%3E")}.vpi-search{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E")}.vpi-layout-list{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='7' height='7' x='3' y='3' rx='1'/%3E%3Crect width='7' height='7' x='3' y='14' rx='1'/%3E%3Cpath d='M14 4h7M14 9h7M14 15h7M14 20h7'/%3E%3C/svg%3E")}.vpi-delete{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M20 5H9l-7 7 7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2ZM18 9l-6 6M12 9l6 6'/%3E%3C/svg%3E")}.vpi-corner-down-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 10-5 5 5 5'/%3E%3Cpath d='M20 4v7a4 4 0 0 1-4 4H4'/%3E%3C/svg%3E")}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3Cpath d='m9 14 2 2 4-4'/%3E%3C/svg%3E")}.vpi-social-discord{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418Z'/%3E%3C/svg%3E")}.vpi-social-facebook{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z'/%3E%3C/svg%3E")}.vpi-social-github{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")}.vpi-social-instagram{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.03.084c-1.277.06-2.149.264-2.91.563a5.874 5.874 0 0 0-2.124 1.388 5.878 5.878 0 0 0-1.38 2.127C.321 4.926.12 5.8.064 7.076.008 8.354-.005 8.764.001 12.023c.007 3.259.021 3.667.083 4.947.061 1.277.264 2.149.563 2.911.308.789.72 1.457 1.388 2.123a5.872 5.872 0 0 0 2.129 1.38c.763.295 1.636.496 2.913.552 1.278.056 1.689.069 4.947.063 3.257-.007 3.668-.021 4.947-.082 1.28-.06 2.147-.265 2.91-.563a5.881 5.881 0 0 0 2.123-1.388 5.881 5.881 0 0 0 1.38-2.129c.295-.763.496-1.636.551-2.912.056-1.28.07-1.69.063-4.948-.006-3.258-.02-3.667-.081-4.947-.06-1.28-.264-2.148-.564-2.911a5.892 5.892 0 0 0-1.387-2.123 5.857 5.857 0 0 0-2.128-1.38C19.074.322 18.202.12 16.924.066 15.647.009 15.236-.006 11.977 0 8.718.008 8.31.021 7.03.084m.14 21.693c-1.17-.05-1.805-.245-2.228-.408a3.736 3.736 0 0 1-1.382-.895 3.695 3.695 0 0 1-.9-1.378c-.165-.423-.363-1.058-.417-2.228-.06-1.264-.072-1.644-.08-4.848-.006-3.204.006-3.583.061-4.848.05-1.169.246-1.805.408-2.228.216-.561.477-.96.895-1.382a3.705 3.705 0 0 1 1.379-.9c.423-.165 1.057-.361 2.227-.417 1.265-.06 1.644-.072 4.848-.08 3.203-.006 3.583.006 4.85.062 1.168.05 1.804.244 2.227.408.56.216.96.475 1.382.895.421.42.681.817.9 1.378.165.422.362 1.056.417 2.227.06 1.265.074 1.645.08 4.848.005 3.203-.006 3.583-.061 4.848-.051 1.17-.245 1.805-.408 2.23-.216.56-.477.96-.896 1.38a3.705 3.705 0 0 1-1.378.9c-.422.165-1.058.362-2.226.418-1.266.06-1.645.072-4.85.079-3.204.007-3.582-.006-4.848-.06m9.783-16.192a1.44 1.44 0 1 0 1.437-1.442 1.44 1.44 0 0 0-1.437 1.442M5.839 12.012a6.161 6.161 0 1 0 12.323-.024 6.162 6.162 0 0 0-12.323.024M8 12.008A4 4 0 1 1 12.008 16 4 4 0 0 1 8 12.008'/%3E%3C/svg%3E")}.vpi-social-linkedin{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z'/%3E%3C/svg%3E")}.vpi-social-mastodon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z'/%3E%3C/svg%3E")}.vpi-social-npm{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M1.763 0C.786 0 0 .786 0 1.763v20.474C0 23.214.786 24 1.763 24h20.474c.977 0 1.763-.786 1.763-1.763V1.763C24 .786 23.214 0 22.237 0zM5.13 5.323l13.837.019-.009 13.836h-3.464l.01-10.382h-3.456L12.04 19.17H5.113z'/%3E%3C/svg%3E")}.vpi-social-slack{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zm1.271 0a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zm0 1.271a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zm10.122 2.521a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zm-1.268 0a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zm-2.523 10.122a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zm0-1.268a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z'/%3E%3C/svg%3E")}.vpi-social-twitter,.vpi-social-x{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z'/%3E%3C/svg%3E")}.vpi-social-youtube{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z'/%3E%3C/svg%3E")}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover,.custom-block.info a:hover>code{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.note{border-color:var(--vp-custom-block-note-border);color:var(--vp-custom-block-note-text);background-color:var(--vp-custom-block-note-bg)}.custom-block.note a,.custom-block.note code{color:var(--vp-c-brand-1)}.custom-block.note a:hover,.custom-block.note a:hover>code{color:var(--vp-c-brand-2)}.custom-block.note code{background-color:var(--vp-custom-block-note-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-tip-1)}.custom-block.tip a:hover,.custom-block.tip a:hover>code{color:var(--vp-c-tip-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.important{border-color:var(--vp-custom-block-important-border);color:var(--vp-custom-block-important-text);background-color:var(--vp-custom-block-important-bg)}.custom-block.important a,.custom-block.important code{color:var(--vp-c-important-1)}.custom-block.important a:hover,.custom-block.important a:hover>code{color:var(--vp-c-important-2)}.custom-block.important code{background-color:var(--vp-custom-block-important-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover,.custom-block.warning a:hover>code{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover,.custom-block.danger a:hover>code{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.caution{border-color:var(--vp-custom-block-caution-border);color:var(--vp-custom-block-caution-text);background-color:var(--vp-custom-block-caution-bg)}.custom-block.caution a,.custom-block.caution code{color:var(--vp-c-caution-1)}.custom-block.caution a:hover,.custom-block.caution a:hover>code{color:var(--vp-c-caution-2)}.custom-block.caution code{background-color:var(--vp-custom-block-caution-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover,.custom-block.details a:hover>code{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code span{color:var(--shiki-dark, inherit)}html:not(.dark) .vp-code span{color:var(--shiki-light, inherit)}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc h4{margin:24px 0 0;letter-spacing:-.01em;line-height:24px;font-size:18px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s;color:var(--vp-c-text-2)}.vp-doc blockquote>p{margin:0;font-size:16px;transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code,.vp-doc h4>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(.no-icon):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.external-link-icon-enabled :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):after{content:"";color:currentColor}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin:0 0 4px!important;text-align:center;letter-spacing:1px!important;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.VPBadge.small{padding:0 6px;line-height:18px;font-size:10px;transform:translateY(-8px)}.VPDocFooter .VPBadge{display:none}.vp-doc h1>.VPBadge{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge{vertical-align:middle}.vp-doc h4>.VPBadge,.vp-doc h5>.VPBadge,.vp-doc h6>.VPBadge{vertical-align:middle;line-height:18px}.VPBadge.info{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-b06cdb19]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-b06cdb19],.VPBackdrop.fade-leave-to[data-v-b06cdb19]{opacity:0}.VPBackdrop.fade-leave-active[data-v-b06cdb19]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-b06cdb19]{display:none}}.NotFound[data-v-951cab6c]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-951cab6c]{padding:96px 32px 168px}}.code[data-v-951cab6c]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-951cab6c]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-951cab6c]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-951cab6c]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-951cab6c]{padding-top:20px}.link[data-v-951cab6c]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-951cab6c]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-3f927ebe]{position:relative;z-index:1}.nested[data-v-3f927ebe]{padding-right:16px;padding-left:16px}.outline-link[data-v-3f927ebe]{display:block;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s}.outline-link[data-v-3f927ebe]:hover,.outline-link.active[data-v-3f927ebe]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-3f927ebe]{padding-left:13px}.VPDocAsideOutline[data-v-b38bf2ff]{display:none}.VPDocAsideOutline.has-outline[data-v-b38bf2ff]{display:block}.content[data-v-b38bf2ff]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-b38bf2ff]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-b38bf2ff]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-6d7b3c46]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-6d7b3c46]{flex-grow:1}.VPDocAside[data-v-6d7b3c46] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-6d7b3c46] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-6d7b3c46] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-475f71b8]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-475f71b8]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-4f9813fa]{margin-top:64px}.edit-info[data-v-4f9813fa]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-4f9813fa]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-4f9813fa]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-4f9813fa]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-4f9813fa]{margin-right:8px}.prev-next[data-v-4f9813fa]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-4f9813fa]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-4f9813fa]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-4f9813fa]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-4f9813fa]{margin-left:auto;text-align:right}.desc[data-v-4f9813fa]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-4f9813fa]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-83890dd9]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-83890dd9]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-83890dd9]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-83890dd9]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-83890dd9]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-83890dd9]{display:flex;justify-content:center}.VPDoc .aside[data-v-83890dd9]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-83890dd9]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-83890dd9]{max-width:1104px}}.container[data-v-83890dd9]{margin:0 auto;width:100%}.aside[data-v-83890dd9]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-83890dd9]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-83890dd9]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-83890dd9]::-webkit-scrollbar{display:none}.aside-curtain[data-v-83890dd9]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-83890dd9]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));padding-bottom:32px}.content[data-v-83890dd9]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-83890dd9]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-83890dd9]{order:1;margin:0;min-width:640px}}.content-container[data-v-83890dd9]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-83890dd9]{max-width:688px}.VPButton[data-v-14206e74]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-14206e74]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-14206e74]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-14206e74]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-14206e74]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-14206e74]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-14206e74]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-14206e74]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-14206e74]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-14206e74]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-14206e74]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-14206e74]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-14206e74]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-35a7d0b8]{display:none}.dark .VPImage.light[data-v-35a7d0b8]{display:none}.VPHero[data-v-955009fc]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-955009fc]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-955009fc]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-955009fc]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-955009fc]{flex-direction:row}}.main[data-v-955009fc]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-955009fc]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-955009fc]{text-align:left}}@media (min-width: 960px){.main[data-v-955009fc]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-955009fc]{max-width:592px}}.name[data-v-955009fc],.text[data-v-955009fc]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-955009fc],.VPHero.has-image .text[data-v-955009fc]{margin:0 auto}.name[data-v-955009fc]{color:var(--vp-home-hero-name-color)}.clip[data-v-955009fc]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-955009fc],.text[data-v-955009fc]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-955009fc],.text[data-v-955009fc]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-955009fc],.VPHero.has-image .text[data-v-955009fc]{margin:0}}.tagline[data-v-955009fc]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-955009fc]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-955009fc]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-955009fc]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-955009fc]{margin:0}}.actions[data-v-955009fc]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-955009fc]{justify-content:center}@media (min-width: 640px){.actions[data-v-955009fc]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-955009fc]{justify-content:flex-start}}.action[data-v-955009fc]{flex-shrink:0;padding:6px}.image[data-v-955009fc]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-955009fc]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-955009fc]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-955009fc]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-955009fc]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-955009fc]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-955009fc]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-955009fc]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-955009fc]{width:320px;height:320px}}[data-v-955009fc] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-955009fc] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-955009fc] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-f5e9645b]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-f5e9645b]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-f5e9645b]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-f5e9645b]>.VPImage{margin-bottom:20px}.icon[data-v-f5e9645b]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-f5e9645b]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-f5e9645b]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-f5e9645b]{padding-top:8px}.link-text-value[data-v-f5e9645b]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-f5e9645b]{margin-left:6px}.VPFeatures[data-v-d0a190d7]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-d0a190d7]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-d0a190d7]{padding:0 64px}}.container[data-v-d0a190d7]{margin:0 auto;max-width:1152px}.items[data-v-d0a190d7]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-d0a190d7]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-d0a190d7],.item.grid-4[data-v-d0a190d7],.item.grid-6[data-v-d0a190d7]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-d0a190d7],.item.grid-4[data-v-d0a190d7]{width:50%}.item.grid-3[data-v-d0a190d7],.item.grid-6[data-v-d0a190d7]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-d0a190d7]{width:25%}}.container[data-v-7a48a447]{margin:auto;width:100%;max-width:1280px;padding:0 24px}@media (min-width: 640px){.container[data-v-7a48a447]{padding:0 48px}}@media (min-width: 960px){.container[data-v-7a48a447]{width:100%;padding:0 64px}}.vp-doc[data-v-7a48a447] .VPHomeSponsors,.vp-doc[data-v-7a48a447] .VPTeamPage{margin-left:var(--vp-offset, calc(50% - 50vw) );margin-right:var(--vp-offset, calc(50% - 50vw) )}.vp-doc[data-v-7a48a447] .VPHomeSponsors h2{border-top:none;letter-spacing:normal}.vp-doc[data-v-7a48a447] .VPHomeSponsors a,.vp-doc[data-v-7a48a447] .VPTeamPage a{text-decoration:none}.VPHome[data-v-cbb6ec48]{margin-bottom:96px}@media (min-width: 768px){.VPHome[data-v-cbb6ec48]{margin-bottom:128px}}.VPContent[data-v-91765379]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-91765379]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-91765379]{margin:0}@media (min-width: 960px){.VPContent[data-v-91765379]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-91765379]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-91765379]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-c970a860]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-c970a860]{display:none}.VPFooter[data-v-c970a860] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-c970a860] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-c970a860]{padding:32px}}.container[data-v-c970a860]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-c970a860],.copyright[data-v-c970a860]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-bc9dc845]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-bc9dc845]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-bc9dc845]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-bc9dc845]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-bc9dc845]{color:var(--vp-c-text-1)}.icon[data-v-bc9dc845]{display:inline-block;vertical-align:middle;margin-left:2px;font-size:14px;transform:rotate(0);transition:transform .25s}@media (min-width: 960px){.VPLocalNavOutlineDropdown button[data-v-bc9dc845]{font-size:14px}.icon[data-v-bc9dc845]{font-size:16px}}.open>.icon[data-v-bc9dc845]{transform:rotate(90deg)}.items[data-v-bc9dc845]{position:absolute;top:40px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}@media (min-width: 960px){.items[data-v-bc9dc845]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-bc9dc845]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-bc9dc845]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-bc9dc845]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-bc9dc845]{transition:all .2s ease-out}.flyout-leave-active[data-v-bc9dc845]{transition:all .15s ease-in}.flyout-enter-from[data-v-bc9dc845],.flyout-leave-to[data-v-bc9dc845]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-070ab83d]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-070ab83d]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-070ab83d]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-070ab83d]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-070ab83d]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-070ab83d]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-070ab83d]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-070ab83d]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-070ab83d]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-070ab83d]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-070ab83d]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-070ab83d]{display:none}}.menu-icon[data-v-070ab83d]{margin-right:8px;font-size:14px}.VPOutlineDropdown[data-v-070ab83d]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-070ab83d]{padding:12px 32px 11px}}.VPSwitch[data-v-4a1c76db]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-4a1c76db]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-4a1c76db]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-4a1c76db]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-4a1c76db] [class^=vpi-]{position:absolute;top:3px;left:3px;width:12px;height:12px;color:var(--vp-c-text-2)}.dark .icon[data-v-4a1c76db] [class^=vpi-]{color:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-e40a8bb6]{opacity:1}.moon[data-v-e40a8bb6],.dark .sun[data-v-e40a8bb6]{opacity:0}.dark .moon[data-v-e40a8bb6]{opacity:1}.dark .VPSwitchAppearance[data-v-e40a8bb6] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-af096f4a]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-af096f4a]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-8b74d055]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-8b74d055]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-8b74d055]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-8b74d055]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-48c802d0]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-48c802d0]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-48c802d0]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-48c802d0]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-7dd3104a]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-7dd3104a] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-7dd3104a] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-7dd3104a] .group:last-child{padding-bottom:0}.VPMenu[data-v-7dd3104a] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-7dd3104a] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-7dd3104a] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-7dd3104a] .action{padding-left:24px}.VPFlyout[data-v-e5380155]{position:relative}.VPFlyout[data-v-e5380155]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-e5380155]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-e5380155]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-e5380155]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-e5380155]{color:var(--vp-c-brand-2)}.VPFlyout:hover .menu[data-v-e5380155],.button[aria-expanded=true]+.menu[data-v-e5380155]{opacity:1;visibility:visible;transform:translateY(0)}.button[aria-expanded=false]+.menu[data-v-e5380155]{opacity:0;visibility:hidden;transform:translateY(0)}.button[data-v-e5380155]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-e5380155]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-e5380155]{margin-right:0;font-size:16px}.text-icon[data-v-e5380155]{margin-left:4px;font-size:14px}.icon[data-v-e5380155]{font-size:20px;transition:fill .25s}.menu[data-v-e5380155]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-717b8b75]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-717b8b75]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-717b8b75]>svg,.VPSocialLink[data-v-717b8b75]>[class^=vpi-social-]{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-ee7a9424]{display:flex;justify-content:center}.VPNavBarExtra[data-v-925effce]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-925effce]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-925effce]{display:none}}.trans-title[data-v-925effce]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-925effce],.item.social-links[data-v-925effce]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-925effce]{min-width:176px}.appearance-action[data-v-925effce]{margin-right:-2px}.social-links-list[data-v-925effce]{margin:-4px -8px}.VPNavBarHamburger[data-v-5dea55bf]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-5dea55bf]{display:none}}.container[data-v-5dea55bf]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-5dea55bf]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-5dea55bf]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-5dea55bf]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-5dea55bf]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-5dea55bf]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-5dea55bf]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-5dea55bf],.VPNavBarHamburger.active:hover .middle[data-v-5dea55bf],.VPNavBarHamburger.active:hover .bottom[data-v-5dea55bf]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-5dea55bf],.middle[data-v-5dea55bf],.bottom[data-v-5dea55bf]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-5dea55bf]{top:0;left:0;transform:translate(0)}.middle[data-v-5dea55bf]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-5dea55bf]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-ed5ac1f6]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-ed5ac1f6],.VPNavBarMenuLink[data-v-ed5ac1f6]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-e6d46098]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-e6d46098]{display:flex}}/*! @docsearch/css 3.6.1 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 rgba(3,4,9,.30196078431372547);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;padding:0 0 2px;border:0;top:-1px;width:20px}.DocSearch-Button-Key--pressed{transform:translate3d(0,1px,0);box-shadow:var(--docsearch-key-pressed-shadow)}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button-Key--pressed{transform:none;box-shadow:none}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.DocSearch-Search-Icon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke-width='1.6' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='m14.386 14.386 4.088 4.088-4.088-4.088A7.533 7.533 0 1 1 3.733 3.733a7.533 7.533 0 0 1 10.653 10.653z'/%3E%3C/svg%3E")}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-164c457f]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-164c457f]{display:flex;align-items:center}}.title[data-v-28a961f9]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-28a961f9]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-28a961f9]{border-bottom-color:var(--vp-c-divider)}}[data-v-28a961f9] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-c80d9ad0]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-c80d9ad0]{display:flex;align-items:center}}.title[data-v-c80d9ad0]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-822684d1]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .25s}.VPNavBar.screen-open[data-v-822684d1]{transition:none;background-color:var(--vp-nav-bg-color);border-bottom:1px solid var(--vp-c-divider)}.VPNavBar[data-v-822684d1]:not(.home){background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar[data-v-822684d1]:not(.home){background-color:transparent}.VPNavBar[data-v-822684d1]:not(.has-sidebar):not(.home.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-822684d1]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-822684d1]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-822684d1]{padding:0}}.container[data-v-822684d1]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-822684d1],.container>.content[data-v-822684d1]{pointer-events:none}.container[data-v-822684d1] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-822684d1]{max-width:100%}}.title[data-v-822684d1]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-822684d1]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-822684d1]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-822684d1]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-822684d1]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-822684d1]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-822684d1]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.home.top) .content-body[data-v-822684d1]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.home.top) .content-body[data-v-822684d1]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-822684d1]{column-gap:.5rem}}.menu+.translations[data-v-822684d1]:before,.menu+.appearance[data-v-822684d1]:before,.menu+.social-links[data-v-822684d1]:before,.translations+.appearance[data-v-822684d1]:before,.appearance+.social-links[data-v-822684d1]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-822684d1]:before,.translations+.appearance[data-v-822684d1]:before{margin-right:16px}.appearance+.social-links[data-v-822684d1]:before{margin-left:16px}.social-links[data-v-822684d1]{margin-right:-8px}.divider[data-v-822684d1]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-822684d1]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-822684d1]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-822684d1]{width:100%;height:1px;transition:background-color .5s}.VPNavBar:not(.home) .divider-line[data-v-822684d1]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.home.top) .divider-line[data-v-822684d1]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.home.top) .divider[data-v-822684d1]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-ffb44008]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-ffb44008]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-27d04aeb]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-27d04aeb]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-7179dbb7]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-7179dbb7]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-4b8941ac]{display:block}.title[data-v-4b8941ac]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-875057a5]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-875057a5]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-875057a5]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-875057a5]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-875057a5]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-875057a5]{transform:rotate(45deg)}.button[data-v-875057a5]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-875057a5]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-875057a5]{transition:transform .25s}.group[data-v-875057a5]:first-child{padding-top:0}.group+.group[data-v-875057a5],.group+.item[data-v-875057a5]{padding-top:4px}.VPNavScreenTranslations[data-v-362991c2]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-362991c2]{height:auto}.title[data-v-362991c2]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-362991c2]{font-size:16px}.icon.lang[data-v-362991c2]{margin-right:8px}.icon.chevron[data-v-362991c2]{margin-left:4px}.list[data-v-362991c2]{padding:4px 0 0 24px}.link[data-v-362991c2]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-833aabba]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px));right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .25s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-833aabba],.VPNavScreen.fade-leave-active[data-v-833aabba]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-833aabba],.VPNavScreen.fade-leave-active .container[data-v-833aabba]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-833aabba],.VPNavScreen.fade-leave-to[data-v-833aabba]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-833aabba],.VPNavScreen.fade-leave-to .container[data-v-833aabba]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-833aabba]{display:none}}.container[data-v-833aabba]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-833aabba],.menu+.appearance[data-v-833aabba],.translations+.appearance[data-v-833aabba]{margin-top:24px}.menu+.social-links[data-v-833aabba]{margin-top:16px}.appearance+.social-links[data-v-833aabba]{margin-top:16px}.VPNav[data-v-f1e365da]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-f1e365da]{position:fixed}}.VPSidebarItem.level-0[data-v-196b2e5f]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-196b2e5f]{padding-bottom:10px}.item[data-v-196b2e5f]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-196b2e5f]{cursor:pointer}.indicator[data-v-196b2e5f]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-196b2e5f],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-196b2e5f],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-196b2e5f],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-196b2e5f]{background-color:var(--vp-c-brand-1)}.link[data-v-196b2e5f]{display:flex;align-items:center;flex-grow:1}.text[data-v-196b2e5f]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-196b2e5f]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-196b2e5f],.VPSidebarItem.level-2 .text[data-v-196b2e5f],.VPSidebarItem.level-3 .text[data-v-196b2e5f],.VPSidebarItem.level-4 .text[data-v-196b2e5f],.VPSidebarItem.level-5 .text[data-v-196b2e5f]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-196b2e5f],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-196b2e5f],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-196b2e5f],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-196b2e5f],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-196b2e5f],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-196b2e5f]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-1.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-2.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-3.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-4.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-5.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-196b2e5f],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-196b2e5f],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-196b2e5f],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-196b2e5f],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-196b2e5f],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-196b2e5f]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-196b2e5f],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-196b2e5f],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-196b2e5f],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-196b2e5f],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-196b2e5f],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-196b2e5f]{color:var(--vp-c-brand-1)}.caret[data-v-196b2e5f]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-196b2e5f]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-196b2e5f]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-196b2e5f]{font-size:18px;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-196b2e5f]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-196b2e5f],.VPSidebarItem.level-2 .items[data-v-196b2e5f],.VPSidebarItem.level-3 .items[data-v-196b2e5f],.VPSidebarItem.level-4 .items[data-v-196b2e5f],.VPSidebarItem.level-5 .items[data-v-196b2e5f]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-196b2e5f]{display:none}.no-transition[data-v-9e426adc] .caret-icon{transition:none}.group+.group[data-v-9e426adc]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-9e426adc]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSidebar[data-v-18756405]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-18756405]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-18756405]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-18756405]{padding-top:var(--vp-nav-height);width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-18756405]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-18756405]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-18756405]{outline:0}.VPSkipLink[data-v-c3508ec8]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-c3508ec8]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-c3508ec8]{top:14px;left:16px}}.Layout[data-v-a9a9e638]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-db81191c]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPHomeSponsors[data-v-db81191c]{margin:96px 0}@media (min-width: 768px){.VPHomeSponsors[data-v-db81191c]{margin:128px 0}}.VPHomeSponsors[data-v-db81191c]{padding:0 24px}@media (min-width: 768px){.VPHomeSponsors[data-v-db81191c]{padding:0 48px}}@media (min-width: 960px){.VPHomeSponsors[data-v-db81191c]{padding:0 64px}}.container[data-v-db81191c]{margin:0 auto;max-width:1152px}.love[data-v-db81191c]{margin:0 auto;width:fit-content;font-size:28px;color:var(--vp-c-text-3)}.icon[data-v-db81191c]{display:inline-block}.message[data-v-db81191c]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-db81191c]{padding-top:32px}.action[data-v-db81191c]{padding-top:40px;text-align:center}.VPTeamPage[data-v-c2f8e101]{margin:96px 0}@media (min-width: 768px){.VPTeamPage[data-v-c2f8e101]{margin:128px 0}}.VPHome .VPTeamPageTitle[data-v-c2f8e101-s]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPTeamPageSection+.VPTeamPageSection[data-v-c2f8e101-s],.VPTeamMembers+.VPTeamPageSection[data-v-c2f8e101-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-c2f8e101-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-c2f8e101-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-c2f8e101-s],.VPTeamMembers+.VPTeamPageSection[data-v-c2f8e101-s]{margin-top:96px}}.VPTeamMembers[data-v-c2f8e101-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-c2f8e101-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-c2f8e101-s]{padding:0 64px}}.VPTeamPageTitle[data-v-e277e15c]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-e277e15c]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-e277e15c]{padding:80px 64px 48px}}.title[data-v-e277e15c]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-e277e15c]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-e277e15c]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-e277e15c]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-d43bc49d]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-d43bc49d]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-d43bc49d]{padding:0 64px}}.title[data-v-d43bc49d]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-d43bc49d]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-d43bc49d]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-d43bc49d]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-d43bc49d]{padding-top:40px}.VPTeamMembersItem[data-v-f9987cb6]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-f9987cb6]{padding:32px}.VPTeamMembersItem.small .data[data-v-f9987cb6]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-f9987cb6]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-f9987cb6]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-f9987cb6]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-f9987cb6]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-f9987cb6]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-f9987cb6]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-f9987cb6]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-f9987cb6]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-f9987cb6]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-f9987cb6]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-f9987cb6]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-f9987cb6]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-f9987cb6]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-f9987cb6]{text-align:center}.avatar[data-v-f9987cb6]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-f9987cb6]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-f9987cb6]{margin:0;font-weight:600}.affiliation[data-v-f9987cb6]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-f9987cb6]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-f9987cb6]:hover{color:var(--vp-c-brand-1)}.desc[data-v-f9987cb6]{margin:0 auto}.desc[data-v-f9987cb6] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-f9987cb6]{display:flex;justify-content:center;height:56px}.sp-link[data-v-f9987cb6]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-f9987cb6]:hover,.sp .sp-link.link[data-v-f9987cb6]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-f9987cb6]{margin-right:8px;font-size:16px}.VPTeamMembers.small .container[data-v-fba19bad]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-fba19bad]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-fba19bad]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-fba19bad]{max-width:876px}.VPTeamMembers.medium .container[data-v-fba19bad]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-fba19bad]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-fba19bad]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-fba19bad]{max-width:760px}.container[data-v-fba19bad]{display:grid;gap:24px;margin:0 auto;max-width:1152px}:root{--vp-plugin-tabs-tab-text-color: var(--vp-c-text-2);--vp-plugin-tabs-tab-active-text-color: var(--vp-c-text-1);--vp-plugin-tabs-tab-hover-text-color: var(--vp-c-text-1);--vp-plugin-tabs-tab-bg: var(--vp-c-bg-soft);--vp-plugin-tabs-tab-divider: var(--vp-c-divider);--vp-plugin-tabs-tab-active-bar-color: var(--vp-c-brand-1)}.plugin-tabs{margin:16px 0;background-color:var(--vp-plugin-tabs-tab-bg);border-radius:8px}.plugin-tabs--tab-list{position:relative;padding:0 12px;overflow-x:auto;overflow-y:hidden}.plugin-tabs--tab-list:after{content:"";position:absolute;bottom:0;left:0;right:0;height:2px;background-color:var(--vp-plugin-tabs-tab-divider)}.plugin-tabs--tab{position:relative;padding:0 12px;line-height:48px;border-bottom:2px solid transparent;color:var(--vp-plugin-tabs-tab-text-color);font-size:14px;font-weight:500;white-space:nowrap;transition:color .25s}.plugin-tabs--tab[aria-selected=true]{color:var(--vp-plugin-tabs-tab-active-text-color)}.plugin-tabs--tab:hover{color:var(--vp-plugin-tabs-tab-hover-text-color)}.plugin-tabs--tab:after{content:"";position:absolute;bottom:-2px;left:8px;right:8px;height:2px;background-color:transparent;transition:background-color .25s;z-index:1}.plugin-tabs--tab[aria-selected=true]:after{background-color:var(--vp-plugin-tabs-tab-active-bar-color)}.plugin-tabs--content[data-v-9b0d03d2]{padding:16px}.plugin-tabs--content[data-v-9b0d03d2]>:first-child:first-child{margin-top:0}.plugin-tabs--content[data-v-9b0d03d2]>:last-child:last-child{margin-bottom:0}.plugin-tabs--content[data-v-9b0d03d2]>div[class*=language-]{border-radius:8px;margin:16px 0}:root:not(.dark) .plugin-tabs--content[data-v-9b0d03d2] div[class*=language-]{background-color:var(--vp-c-bg)}.VPHero .clip{white-space:pre;max-width:500px}:root{--vp-font-family-base: "Barlow", "Inter var experimental", "Inter var", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;--vp-font-family-mono: "Space Mono", Menlo, Monaco, Consolas, "Courier New", monospace}.mono{font-feature-settings:"calt" 0}:root{--julia-blue: #4063D8;--julia-purple: #9558B2;--julia-red: #CB3C33;--julia-green: #389826;--vp-c-brand: #389826;--vp-c-brand-light: #3dd027;--vp-c-brand-lighter: #9499ff;--vp-c-brand-lightest: #bcc0ff;--vp-c-brand-dark: #535bf2;--vp-c-brand-darker: #454ce1;--vp-c-brand-dimm: #212425}:root{--vp-button-brand-border: var(--vp-c-brand-light);--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand);--vp-button-brand-hover-border: var(--vp-c-brand-light);--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-light);--vp-button-brand-active-border: var(--vp-c-brand-light);--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-button-brand-bg)}:root{--vp-home-hero-name-color: transparent;--vp-home-hero-name-background: -webkit-linear-gradient( 120deg, #9558B2 30%, #CB3C33 );--vp-home-hero-image-background-image: linear-gradient( -45deg, #9558B2 30%, #389826 30%, #CB3C33 );--vp-home-hero-image-filter: blur(40px)}@media (min-width: 640px){:root{--vp-home-hero-image-filter: blur(56px)}}@media (min-width: 960px){:root{--vp-home-hero-image-filter: blur(72px)}}:root.dark{--vp-custom-block-tip-border: var(--vp-c-brand);--vp-custom-block-tip-text: var(--vp-c-brand-lightest);--vp-custom-block-tip-bg: var(--vp-c-brand-dimm);--vp-c-black: hsl(220 20% 9%);--vp-c-black-pure: hsl(220, 24%, 4%);--vp-c-black-soft: hsl(220 16% 13%);--vp-c-black-mute: hsl(220 14% 17%);--vp-c-gray: hsl(220 8% 56%);--vp-c-gray-dark-1: hsl(220 10% 39%);--vp-c-gray-dark-2: hsl(220 12% 28%);--vp-c-gray-dark-3: hsl(220 12% 23%);--vp-c-gray-dark-4: hsl(220 14% 17%);--vp-c-gray-dark-5: hsl(220 16% 13%);--vp-custom-block-info-bg: hsl(220 14% 17%)}.DocSearch{--docsearch-primary-color: var(--vp-c-brand) !important}mjx-container>svg{display:block;margin:auto}mjx-container{padding:.5rem 0}mjx-container{display:inline-block;margin:auto 2px -2px}mjx-container>svg{margin:auto;display:inline-block}:root{--vp-c-brand-1: #CB3C33;--vp-c-brand-2: #CB3C33;--vp-c-brand-3: #CB3C33;--vp-c-sponsor: #ca2971;--vitest-c-sponsor-hover: #c13071}.dark{--vp-c-brand-1: #91dd33;--vp-c-brand-2: #91dd33;--vp-c-brand-3: #91dd33;--vp-c-sponsor: #91dd33;--vitest-c-sponsor-hover: #e51370}.VPLocalSearchBox[data-v-f4c4f812]{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;display:flex}.backdrop[data-v-f4c4f812]{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-f4c4f812]{position:relative;padding:12px;margin:64px auto;display:flex;flex-direction:column;gap:16px;background:var(--vp-local-search-bg);width:min(100vw - 60px,900px);height:min-content;max-height:min(100vh - 128px,900px);border-radius:6px}@media (max-width: 767px){.shell[data-v-f4c4f812]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-f4c4f812]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media (max-width: 767px){.search-bar[data-v-f4c4f812]{padding:0 8px}}.search-bar[data-v-f4c4f812]:focus-within{border-color:var(--vp-c-brand-1)}.local-search-icon[data-v-f4c4f812]{display:block;font-size:18px}.navigate-icon[data-v-f4c4f812]{display:block;font-size:14px}.search-icon[data-v-f4c4f812]{margin:8px}@media (max-width: 767px){.search-icon[data-v-f4c4f812]{display:none}}.search-input[data-v-f4c4f812]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 767px){.search-input[data-v-f4c4f812]{padding:6px 4px}}.search-actions[data-v-f4c4f812]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-f4c4f812]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-f4c4f812]{display:none}}.search-actions button[data-v-f4c4f812]{padding:8px}.search-actions button[data-v-f4c4f812]:not([disabled]):hover,.toggle-layout-button.detailed-list[data-v-f4c4f812]{color:var(--vp-c-brand-1)}.search-actions button.clear-button[data-v-f4c4f812]:disabled{opacity:.37}.search-keyboard-shortcuts[data-v-f4c4f812]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-f4c4f812]{display:flex;align-items:center;gap:4px}@media (max-width: 767px){.search-keyboard-shortcuts[data-v-f4c4f812]{display:none}}.search-keyboard-shortcuts kbd[data-v-f4c4f812]{background:#8080801a;border-radius:4px;padding:3px 6px;min-width:24px;display:inline-block;text-align:center;vertical-align:middle;border:1px solid rgba(128,128,128,.15);box-shadow:0 2px 2px #0000001a}.results[data-v-f4c4f812]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-f4c4f812]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border);outline:none}.result>div[data-v-f4c4f812]{margin:12px;width:100%;overflow:hidden}@media (max-width: 767px){.result>div[data-v-f4c4f812]{margin:8px}}.titles[data-v-f4c4f812]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-f4c4f812]{display:flex;align-items:center;gap:4px}.title.main[data-v-f4c4f812]{font-weight:500}.title-icon[data-v-f4c4f812]{opacity:.5;font-weight:500;color:var(--vp-c-brand-1)}.title svg[data-v-f4c4f812]{opacity:.5}.result.selected[data-v-f4c4f812]{--vp-local-search-result-bg: var(--vp-local-search-result-selected-bg);border-color:var(--vp-local-search-result-selected-border)}.excerpt-wrapper[data-v-f4c4f812]{position:relative}.excerpt[data-v-f4c4f812]{opacity:75%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;opacity:.5;margin-top:4px}.result.selected .excerpt[data-v-f4c4f812]{opacity:1}.excerpt[data-v-f4c4f812] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-f4c4f812] mark,.excerpt[data-v-f4c4f812] mark{background-color:var(--vp-local-search-highlight-bg);color:var(--vp-local-search-highlight-text);border-radius:2px;padding:0 2px}.excerpt[data-v-f4c4f812] .vp-code-group .tabs{display:none}.excerpt[data-v-f4c4f812] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-f4c4f812]{position:absolute;bottom:-1px;left:0;width:100%;height:8px;background:linear-gradient(transparent,var(--vp-local-search-result-bg));z-index:1000}.excerpt-gradient-top[data-v-f4c4f812]{position:absolute;top:-1px;left:0;width:100%;height:8px;background:linear-gradient(var(--vp-local-search-result-bg),transparent);z-index:1000}.result.selected .titles[data-v-f4c4f812],.result.selected .title-icon[data-v-f4c4f812]{color:var(--vp-c-brand-1)!important}.no-results[data-v-f4c4f812]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-f4c4f812]{flex:none} diff --git a/dev/assets/style.DQ4GYGrf.css b/dev/assets/style.DQ4GYGrf.css new file mode 100644 index 0000000..bb22c22 --- /dev/null +++ b/dev/assets/style.DQ4GYGrf.css @@ -0,0 +1 @@ +@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-roman-cyrillic.C5lxZ8CY.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-roman-greek-ext.CqjqNYQ-.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-roman-greek.BBVDIX6e.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-roman-vietnamese.BjW4sHH5.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-roman-latin-ext.4ZJIpNVo.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-roman-latin.Di8DUHzh.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-italic-cyrillic-ext.r48I6akx.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-italic-cyrillic.By2_1cv3.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-italic-greek-ext.1u6EdAuj.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-italic-greek.DJ8dCoTZ.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-italic-vietnamese.BSbpV94h.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-italic-latin-ext.CN1xVJS-.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/dev/assets/inter-italic-latin.C2AdPX0b.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Punctuation SC;font-weight:400;src:local("PingFang SC Regular"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:500;src:local("PingFang SC Medium"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:600;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:700;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-purple-1: #6f42c1;--vp-c-purple-2: #7e4cc9;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-purple-1: #c8abfa;--vp-c-purple-2: #a879e6;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: rgba(60, 60, 67);--vp-c-text-2: rgba(60, 60, 67, .78);--vp-c-text-3: rgba(60, 60, 67, .56)}.dark{--vp-c-text-1: rgba(255, 255, 245, .86);--vp-c-text-2: rgba(235, 235, 245, .6);--vp-c-text-3: rgba(235, 235, 245, .38)}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-note-1: var(--vp-c-brand-1);--vp-c-note-2: var(--vp-c-brand-2);--vp-c-note-3: var(--vp-c-brand-3);--vp-c-note-soft: var(--vp-c-brand-soft);--vp-c-success-1: var(--vp-c-green-1);--vp-c-success-2: var(--vp-c-green-2);--vp-c-success-3: var(--vp-c-green-3);--vp-c-success-soft: var(--vp-c-green-soft);--vp-c-important-1: var(--vp-c-purple-1);--vp-c-important-2: var(--vp-c-purple-2);--vp-c-important-3: var(--vp-c-purple-3);--vp-c-important-soft: var(--vp-c-purple-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft);--vp-c-caution-1: var(--vp-c-red-1);--vp-c-caution-2: var(--vp-c-red-2);--vp-c-caution-3: var(--vp-c-red-3);--vp-c-caution-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;font-optical-sizing:auto}:root:where(:lang(zh)){--vp-font-family-base: "Punctuation SC", "Inter", ui-sans-serif, system-ui, "PingFang SC", "Noto Sans CJK SC", "Noto Sans SC", "Heiti SC", "Microsoft YaHei", "DengXian", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}@media (min-width: 960px){:root{--vp-z-index-sidebar: 25}}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-success-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-success-1);--vp-code-line-diff-remove-color: var(--vp-c-danger-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-danger-1);--vp-code-line-warning-color: var(--vp-c-warning-soft);--vp-code-line-error-color: var(--vp-c-danger-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-note-border: transparent;--vp-custom-block-note-text: var(--vp-c-text-1);--vp-custom-block-note-bg: var(--vp-c-default-soft);--vp-custom-block-note-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-tip-soft);--vp-custom-block-tip-code-bg: var(--vp-c-tip-soft);--vp-custom-block-important-border: transparent;--vp-custom-block-important-text: var(--vp-c-text-1);--vp-custom-block-important-bg: var(--vp-c-important-soft);--vp-custom-block-important-code-bg: var(--vp-c-important-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-caution-border: transparent;--vp-custom-block-caution-text: var(--vp-c-text-1);--vp-custom-block-caution-bg: var(--vp-c-caution-soft);--vp-custom-block-caution-code-bg: var(--vp-c-caution-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-default-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-tip-1);--vp-badge-tip-bg: var(--vp-c-tip-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{overflow-x:auto}mjx-container>svg{display:inline-block;margin:auto}[class^=vpi-],[class*=" vpi-"],.vp-icon{width:1em;height:1em}[class^=vpi-].bg,[class*=" vpi-"].bg,.vp-icon.bg{background-size:100% 100%;background-color:transparent}[class^=vpi-]:not(.bg),[class*=" vpi-"]:not(.bg),.vp-icon:not(.bg){-webkit-mask:var(--icon) no-repeat;mask:var(--icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit}.vpi-align-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M21 6H3M15 12H3M17 18H3'/%3E%3C/svg%3E")}.vpi-arrow-right,.vpi-arrow-down,.vpi-arrow-left,.vpi-arrow-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5l7 7-7 7'/%3E%3C/svg%3E")}.vpi-chevron-right,.vpi-chevron-down,.vpi-chevron-left,.vpi-chevron-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E")}.vpi-chevron-down,.vpi-arrow-down{transform:rotate(90deg)}.vpi-chevron-left,.vpi-arrow-left{transform:rotate(180deg)}.vpi-chevron-up,.vpi-arrow-up{transform:rotate(-90deg)}.vpi-square-pen{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z'/%3E%3C/svg%3E")}.vpi-plus{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5v14'/%3E%3C/svg%3E")}.vpi-sun{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41'/%3E%3C/svg%3E")}.vpi-moon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z'/%3E%3C/svg%3E")}.vpi-more-horizontal{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='1'/%3E%3Ccircle cx='19' cy='12' r='1'/%3E%3Ccircle cx='5' cy='12' r='1'/%3E%3C/svg%3E")}.vpi-languages{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m5 8 6 6M4 14l6-6 2-3M2 5h12M7 2h1M22 22l-5-10-5 10M14 18h6'/%3E%3C/svg%3E")}.vpi-heart{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z'/%3E%3C/svg%3E")}.vpi-search{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E")}.vpi-layout-list{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='7' height='7' x='3' y='3' rx='1'/%3E%3Crect width='7' height='7' x='3' y='14' rx='1'/%3E%3Cpath d='M14 4h7M14 9h7M14 15h7M14 20h7'/%3E%3C/svg%3E")}.vpi-delete{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M20 5H9l-7 7 7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2ZM18 9l-6 6M12 9l6 6'/%3E%3C/svg%3E")}.vpi-corner-down-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 10-5 5 5 5'/%3E%3Cpath d='M20 4v7a4 4 0 0 1-4 4H4'/%3E%3C/svg%3E")}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3Cpath d='m9 14 2 2 4-4'/%3E%3C/svg%3E")}.vpi-social-discord{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418Z'/%3E%3C/svg%3E")}.vpi-social-facebook{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z'/%3E%3C/svg%3E")}.vpi-social-github{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")}.vpi-social-instagram{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.03.084c-1.277.06-2.149.264-2.91.563a5.874 5.874 0 0 0-2.124 1.388 5.878 5.878 0 0 0-1.38 2.127C.321 4.926.12 5.8.064 7.076.008 8.354-.005 8.764.001 12.023c.007 3.259.021 3.667.083 4.947.061 1.277.264 2.149.563 2.911.308.789.72 1.457 1.388 2.123a5.872 5.872 0 0 0 2.129 1.38c.763.295 1.636.496 2.913.552 1.278.056 1.689.069 4.947.063 3.257-.007 3.668-.021 4.947-.082 1.28-.06 2.147-.265 2.91-.563a5.881 5.881 0 0 0 2.123-1.388 5.881 5.881 0 0 0 1.38-2.129c.295-.763.496-1.636.551-2.912.056-1.28.07-1.69.063-4.948-.006-3.258-.02-3.667-.081-4.947-.06-1.28-.264-2.148-.564-2.911a5.892 5.892 0 0 0-1.387-2.123 5.857 5.857 0 0 0-2.128-1.38C19.074.322 18.202.12 16.924.066 15.647.009 15.236-.006 11.977 0 8.718.008 8.31.021 7.03.084m.14 21.693c-1.17-.05-1.805-.245-2.228-.408a3.736 3.736 0 0 1-1.382-.895 3.695 3.695 0 0 1-.9-1.378c-.165-.423-.363-1.058-.417-2.228-.06-1.264-.072-1.644-.08-4.848-.006-3.204.006-3.583.061-4.848.05-1.169.246-1.805.408-2.228.216-.561.477-.96.895-1.382a3.705 3.705 0 0 1 1.379-.9c.423-.165 1.057-.361 2.227-.417 1.265-.06 1.644-.072 4.848-.08 3.203-.006 3.583.006 4.85.062 1.168.05 1.804.244 2.227.408.56.216.96.475 1.382.895.421.42.681.817.9 1.378.165.422.362 1.056.417 2.227.06 1.265.074 1.645.08 4.848.005 3.203-.006 3.583-.061 4.848-.051 1.17-.245 1.805-.408 2.23-.216.56-.477.96-.896 1.38a3.705 3.705 0 0 1-1.378.9c-.422.165-1.058.362-2.226.418-1.266.06-1.645.072-4.85.079-3.204.007-3.582-.006-4.848-.06m9.783-16.192a1.44 1.44 0 1 0 1.437-1.442 1.44 1.44 0 0 0-1.437 1.442M5.839 12.012a6.161 6.161 0 1 0 12.323-.024 6.162 6.162 0 0 0-12.323.024M8 12.008A4 4 0 1 1 12.008 16 4 4 0 0 1 8 12.008'/%3E%3C/svg%3E")}.vpi-social-linkedin{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z'/%3E%3C/svg%3E")}.vpi-social-mastodon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z'/%3E%3C/svg%3E")}.vpi-social-npm{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M1.763 0C.786 0 0 .786 0 1.763v20.474C0 23.214.786 24 1.763 24h20.474c.977 0 1.763-.786 1.763-1.763V1.763C24 .786 23.214 0 22.237 0zM5.13 5.323l13.837.019-.009 13.836h-3.464l.01-10.382h-3.456L12.04 19.17H5.113z'/%3E%3C/svg%3E")}.vpi-social-slack{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zm1.271 0a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zm0 1.271a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zm10.122 2.521a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zm-1.268 0a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zm-2.523 10.122a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zm0-1.268a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z'/%3E%3C/svg%3E")}.vpi-social-twitter,.vpi-social-x{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z'/%3E%3C/svg%3E")}.vpi-social-youtube{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z'/%3E%3C/svg%3E")}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover,.custom-block.info a:hover>code{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.note{border-color:var(--vp-custom-block-note-border);color:var(--vp-custom-block-note-text);background-color:var(--vp-custom-block-note-bg)}.custom-block.note a,.custom-block.note code{color:var(--vp-c-brand-1)}.custom-block.note a:hover,.custom-block.note a:hover>code{color:var(--vp-c-brand-2)}.custom-block.note code{background-color:var(--vp-custom-block-note-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-tip-1)}.custom-block.tip a:hover,.custom-block.tip a:hover>code{color:var(--vp-c-tip-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.important{border-color:var(--vp-custom-block-important-border);color:var(--vp-custom-block-important-text);background-color:var(--vp-custom-block-important-bg)}.custom-block.important a,.custom-block.important code{color:var(--vp-c-important-1)}.custom-block.important a:hover,.custom-block.important a:hover>code{color:var(--vp-c-important-2)}.custom-block.important code{background-color:var(--vp-custom-block-important-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover,.custom-block.warning a:hover>code{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover,.custom-block.danger a:hover>code{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.caution{border-color:var(--vp-custom-block-caution-border);color:var(--vp-custom-block-caution-text);background-color:var(--vp-custom-block-caution-bg)}.custom-block.caution a,.custom-block.caution code{color:var(--vp-c-caution-1)}.custom-block.caution a:hover,.custom-block.caution a:hover>code{color:var(--vp-c-caution-2)}.custom-block.caution code{background-color:var(--vp-custom-block-caution-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover,.custom-block.details a:hover>code{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code span{color:var(--shiki-dark, inherit)}html:not(.dark) .vp-code span{color:var(--shiki-light, inherit)}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc h4{margin:24px 0 0;letter-spacing:-.01em;line-height:24px;font-size:18px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s;color:var(--vp-c-text-2)}.vp-doc blockquote>p{margin:0;font-size:16px;transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code,.vp-doc h4>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(.no-icon):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.external-link-icon-enabled :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):after{content:"";color:currentColor}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin:0 0 4px!important;text-align:center;letter-spacing:1px!important;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.VPBadge.small{padding:0 6px;line-height:18px;font-size:10px;transform:translateY(-8px)}.VPDocFooter .VPBadge{display:none}.vp-doc h1>.VPBadge{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge{vertical-align:middle}.vp-doc h4>.VPBadge,.vp-doc h5>.VPBadge,.vp-doc h6>.VPBadge{vertical-align:middle;line-height:18px}.VPBadge.info{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-b06cdb19]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-b06cdb19],.VPBackdrop.fade-leave-to[data-v-b06cdb19]{opacity:0}.VPBackdrop.fade-leave-active[data-v-b06cdb19]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-b06cdb19]{display:none}}.NotFound[data-v-951cab6c]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-951cab6c]{padding:96px 32px 168px}}.code[data-v-951cab6c]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-951cab6c]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-951cab6c]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-951cab6c]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-951cab6c]{padding-top:20px}.link[data-v-951cab6c]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-951cab6c]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-3f927ebe]{position:relative;z-index:1}.nested[data-v-3f927ebe]{padding-right:16px;padding-left:16px}.outline-link[data-v-3f927ebe]{display:block;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s}.outline-link[data-v-3f927ebe]:hover,.outline-link.active[data-v-3f927ebe]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-3f927ebe]{padding-left:13px}.VPDocAsideOutline[data-v-b38bf2ff]{display:none}.VPDocAsideOutline.has-outline[data-v-b38bf2ff]{display:block}.content[data-v-b38bf2ff]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-b38bf2ff]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-b38bf2ff]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-6d7b3c46]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-6d7b3c46]{flex-grow:1}.VPDocAside[data-v-6d7b3c46] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-6d7b3c46] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-6d7b3c46] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-475f71b8]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-475f71b8]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-4f9813fa]{margin-top:64px}.edit-info[data-v-4f9813fa]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-4f9813fa]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-4f9813fa]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-4f9813fa]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-4f9813fa]{margin-right:8px}.prev-next[data-v-4f9813fa]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-4f9813fa]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-4f9813fa]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-4f9813fa]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-4f9813fa]{margin-left:auto;text-align:right}.desc[data-v-4f9813fa]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-4f9813fa]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-83890dd9]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-83890dd9]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-83890dd9]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-83890dd9]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-83890dd9]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-83890dd9]{display:flex;justify-content:center}.VPDoc .aside[data-v-83890dd9]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-83890dd9]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-83890dd9]{max-width:1104px}}.container[data-v-83890dd9]{margin:0 auto;width:100%}.aside[data-v-83890dd9]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-83890dd9]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-83890dd9]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-83890dd9]::-webkit-scrollbar{display:none}.aside-curtain[data-v-83890dd9]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-83890dd9]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));padding-bottom:32px}.content[data-v-83890dd9]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-83890dd9]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-83890dd9]{order:1;margin:0;min-width:640px}}.content-container[data-v-83890dd9]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-83890dd9]{max-width:688px}.VPButton[data-v-14206e74]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-14206e74]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-14206e74]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-14206e74]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-14206e74]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-14206e74]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-14206e74]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-14206e74]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-14206e74]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-14206e74]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-14206e74]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-14206e74]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-14206e74]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-35a7d0b8]{display:none}.dark .VPImage.light[data-v-35a7d0b8]{display:none}.VPHero[data-v-955009fc]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-955009fc]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-955009fc]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-955009fc]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-955009fc]{flex-direction:row}}.main[data-v-955009fc]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-955009fc]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-955009fc]{text-align:left}}@media (min-width: 960px){.main[data-v-955009fc]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-955009fc]{max-width:592px}}.name[data-v-955009fc],.text[data-v-955009fc]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-955009fc],.VPHero.has-image .text[data-v-955009fc]{margin:0 auto}.name[data-v-955009fc]{color:var(--vp-home-hero-name-color)}.clip[data-v-955009fc]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-955009fc],.text[data-v-955009fc]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-955009fc],.text[data-v-955009fc]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-955009fc],.VPHero.has-image .text[data-v-955009fc]{margin:0}}.tagline[data-v-955009fc]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-955009fc]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-955009fc]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-955009fc]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-955009fc]{margin:0}}.actions[data-v-955009fc]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-955009fc]{justify-content:center}@media (min-width: 640px){.actions[data-v-955009fc]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-955009fc]{justify-content:flex-start}}.action[data-v-955009fc]{flex-shrink:0;padding:6px}.image[data-v-955009fc]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-955009fc]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-955009fc]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-955009fc]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-955009fc]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-955009fc]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-955009fc]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-955009fc]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-955009fc]{width:320px;height:320px}}[data-v-955009fc] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-955009fc] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-955009fc] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-f5e9645b]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-f5e9645b]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-f5e9645b]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-f5e9645b]>.VPImage{margin-bottom:20px}.icon[data-v-f5e9645b]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-f5e9645b]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-f5e9645b]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-f5e9645b]{padding-top:8px}.link-text-value[data-v-f5e9645b]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-f5e9645b]{margin-left:6px}.VPFeatures[data-v-d0a190d7]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-d0a190d7]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-d0a190d7]{padding:0 64px}}.container[data-v-d0a190d7]{margin:0 auto;max-width:1152px}.items[data-v-d0a190d7]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-d0a190d7]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-d0a190d7],.item.grid-4[data-v-d0a190d7],.item.grid-6[data-v-d0a190d7]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-d0a190d7],.item.grid-4[data-v-d0a190d7]{width:50%}.item.grid-3[data-v-d0a190d7],.item.grid-6[data-v-d0a190d7]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-d0a190d7]{width:25%}}.container[data-v-7a48a447]{margin:auto;width:100%;max-width:1280px;padding:0 24px}@media (min-width: 640px){.container[data-v-7a48a447]{padding:0 48px}}@media (min-width: 960px){.container[data-v-7a48a447]{width:100%;padding:0 64px}}.vp-doc[data-v-7a48a447] .VPHomeSponsors,.vp-doc[data-v-7a48a447] .VPTeamPage{margin-left:var(--vp-offset, calc(50% - 50vw) );margin-right:var(--vp-offset, calc(50% - 50vw) )}.vp-doc[data-v-7a48a447] .VPHomeSponsors h2{border-top:none;letter-spacing:normal}.vp-doc[data-v-7a48a447] .VPHomeSponsors a,.vp-doc[data-v-7a48a447] .VPTeamPage a{text-decoration:none}.VPHome[data-v-cbb6ec48]{margin-bottom:96px}@media (min-width: 768px){.VPHome[data-v-cbb6ec48]{margin-bottom:128px}}.VPContent[data-v-91765379]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-91765379]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-91765379]{margin:0}@media (min-width: 960px){.VPContent[data-v-91765379]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-91765379]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-91765379]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-c970a860]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-c970a860]{display:none}.VPFooter[data-v-c970a860] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-c970a860] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-c970a860]{padding:32px}}.container[data-v-c970a860]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-c970a860],.copyright[data-v-c970a860]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-bc9dc845]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-bc9dc845]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-bc9dc845]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-bc9dc845]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-bc9dc845]{color:var(--vp-c-text-1)}.icon[data-v-bc9dc845]{display:inline-block;vertical-align:middle;margin-left:2px;font-size:14px;transform:rotate(0);transition:transform .25s}@media (min-width: 960px){.VPLocalNavOutlineDropdown button[data-v-bc9dc845]{font-size:14px}.icon[data-v-bc9dc845]{font-size:16px}}.open>.icon[data-v-bc9dc845]{transform:rotate(90deg)}.items[data-v-bc9dc845]{position:absolute;top:40px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}@media (min-width: 960px){.items[data-v-bc9dc845]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-bc9dc845]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-bc9dc845]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-bc9dc845]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-bc9dc845]{transition:all .2s ease-out}.flyout-leave-active[data-v-bc9dc845]{transition:all .15s ease-in}.flyout-enter-from[data-v-bc9dc845],.flyout-leave-to[data-v-bc9dc845]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-070ab83d]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-070ab83d]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-070ab83d]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-070ab83d]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-070ab83d]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-070ab83d]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-070ab83d]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-070ab83d]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-070ab83d]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-070ab83d]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-070ab83d]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-070ab83d]{display:none}}.menu-icon[data-v-070ab83d]{margin-right:8px;font-size:14px}.VPOutlineDropdown[data-v-070ab83d]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-070ab83d]{padding:12px 32px 11px}}.VPSwitch[data-v-4a1c76db]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-4a1c76db]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-4a1c76db]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-4a1c76db]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-4a1c76db] [class^=vpi-]{position:absolute;top:3px;left:3px;width:12px;height:12px;color:var(--vp-c-text-2)}.dark .icon[data-v-4a1c76db] [class^=vpi-]{color:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-e40a8bb6]{opacity:1}.moon[data-v-e40a8bb6],.dark .sun[data-v-e40a8bb6]{opacity:0}.dark .moon[data-v-e40a8bb6]{opacity:1}.dark .VPSwitchAppearance[data-v-e40a8bb6] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-af096f4a]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-af096f4a]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-8b74d055]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-8b74d055]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-8b74d055]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-8b74d055]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-48c802d0]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-48c802d0]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-48c802d0]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-48c802d0]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-7dd3104a]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-7dd3104a] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-7dd3104a] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-7dd3104a] .group:last-child{padding-bottom:0}.VPMenu[data-v-7dd3104a] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-7dd3104a] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-7dd3104a] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-7dd3104a] .action{padding-left:24px}.VPFlyout[data-v-e5380155]{position:relative}.VPFlyout[data-v-e5380155]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-e5380155]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-e5380155]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-e5380155]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-e5380155]{color:var(--vp-c-brand-2)}.VPFlyout:hover .menu[data-v-e5380155],.button[aria-expanded=true]+.menu[data-v-e5380155]{opacity:1;visibility:visible;transform:translateY(0)}.button[aria-expanded=false]+.menu[data-v-e5380155]{opacity:0;visibility:hidden;transform:translateY(0)}.button[data-v-e5380155]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-e5380155]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-e5380155]{margin-right:0;font-size:16px}.text-icon[data-v-e5380155]{margin-left:4px;font-size:14px}.icon[data-v-e5380155]{font-size:20px;transition:fill .25s}.menu[data-v-e5380155]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-717b8b75]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-717b8b75]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-717b8b75]>svg,.VPSocialLink[data-v-717b8b75]>[class^=vpi-social-]{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-ee7a9424]{display:flex;justify-content:center}.VPNavBarExtra[data-v-925effce]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-925effce]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-925effce]{display:none}}.trans-title[data-v-925effce]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-925effce],.item.social-links[data-v-925effce]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-925effce]{min-width:176px}.appearance-action[data-v-925effce]{margin-right:-2px}.social-links-list[data-v-925effce]{margin:-4px -8px}.VPNavBarHamburger[data-v-5dea55bf]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-5dea55bf]{display:none}}.container[data-v-5dea55bf]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-5dea55bf]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-5dea55bf]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-5dea55bf]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-5dea55bf]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-5dea55bf]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-5dea55bf]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-5dea55bf],.VPNavBarHamburger.active:hover .middle[data-v-5dea55bf],.VPNavBarHamburger.active:hover .bottom[data-v-5dea55bf]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-5dea55bf],.middle[data-v-5dea55bf],.bottom[data-v-5dea55bf]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-5dea55bf]{top:0;left:0;transform:translate(0)}.middle[data-v-5dea55bf]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-5dea55bf]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-ed5ac1f6]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-ed5ac1f6],.VPNavBarMenuLink[data-v-ed5ac1f6]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-e6d46098]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-e6d46098]{display:flex}}/*! @docsearch/css 3.6.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 rgba(3,4,9,.30196078431372547);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;padding:0 0 2px;border:0;top:-1px;width:20px}.DocSearch-Button-Key--pressed{transform:translate3d(0,1px,0);box-shadow:var(--docsearch-key-pressed-shadow)}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button-Key--pressed{transform:none;box-shadow:none}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.DocSearch-Search-Icon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke-width='1.6' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='m14.386 14.386 4.088 4.088-4.088-4.088A7.533 7.533 0 1 1 3.733 3.733a7.533 7.533 0 0 1 10.653 10.653z'/%3E%3C/svg%3E")}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-164c457f]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-164c457f]{display:flex;align-items:center}}.title[data-v-28a961f9]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-28a961f9]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-28a961f9]{border-bottom-color:var(--vp-c-divider)}}[data-v-28a961f9] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-c80d9ad0]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-c80d9ad0]{display:flex;align-items:center}}.title[data-v-c80d9ad0]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-822684d1]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .25s}.VPNavBar.screen-open[data-v-822684d1]{transition:none;background-color:var(--vp-nav-bg-color);border-bottom:1px solid var(--vp-c-divider)}.VPNavBar[data-v-822684d1]:not(.home){background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar[data-v-822684d1]:not(.home){background-color:transparent}.VPNavBar[data-v-822684d1]:not(.has-sidebar):not(.home.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-822684d1]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-822684d1]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-822684d1]{padding:0}}.container[data-v-822684d1]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-822684d1],.container>.content[data-v-822684d1]{pointer-events:none}.container[data-v-822684d1] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-822684d1]{max-width:100%}}.title[data-v-822684d1]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-822684d1]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-822684d1]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-822684d1]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-822684d1]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-822684d1]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-822684d1]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.home.top) .content-body[data-v-822684d1]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.home.top) .content-body[data-v-822684d1]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-822684d1]{column-gap:.5rem}}.menu+.translations[data-v-822684d1]:before,.menu+.appearance[data-v-822684d1]:before,.menu+.social-links[data-v-822684d1]:before,.translations+.appearance[data-v-822684d1]:before,.appearance+.social-links[data-v-822684d1]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-822684d1]:before,.translations+.appearance[data-v-822684d1]:before{margin-right:16px}.appearance+.social-links[data-v-822684d1]:before{margin-left:16px}.social-links[data-v-822684d1]{margin-right:-8px}.divider[data-v-822684d1]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-822684d1]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-822684d1]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-822684d1]{width:100%;height:1px;transition:background-color .5s}.VPNavBar:not(.home) .divider-line[data-v-822684d1]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.home.top) .divider-line[data-v-822684d1]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.home.top) .divider[data-v-822684d1]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-ffb44008]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-ffb44008]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-27d04aeb]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-27d04aeb]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-7179dbb7]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-7179dbb7]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-4b8941ac]{display:block}.title[data-v-4b8941ac]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-875057a5]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-875057a5]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-875057a5]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-875057a5]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-875057a5]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-875057a5]{transform:rotate(45deg)}.button[data-v-875057a5]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-875057a5]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-875057a5]{transition:transform .25s}.group[data-v-875057a5]:first-child{padding-top:0}.group+.group[data-v-875057a5],.group+.item[data-v-875057a5]{padding-top:4px}.VPNavScreenTranslations[data-v-362991c2]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-362991c2]{height:auto}.title[data-v-362991c2]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-362991c2]{font-size:16px}.icon.lang[data-v-362991c2]{margin-right:8px}.icon.chevron[data-v-362991c2]{margin-left:4px}.list[data-v-362991c2]{padding:4px 0 0 24px}.link[data-v-362991c2]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-833aabba]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px));right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .25s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-833aabba],.VPNavScreen.fade-leave-active[data-v-833aabba]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-833aabba],.VPNavScreen.fade-leave-active .container[data-v-833aabba]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-833aabba],.VPNavScreen.fade-leave-to[data-v-833aabba]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-833aabba],.VPNavScreen.fade-leave-to .container[data-v-833aabba]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-833aabba]{display:none}}.container[data-v-833aabba]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-833aabba],.menu+.appearance[data-v-833aabba],.translations+.appearance[data-v-833aabba]{margin-top:24px}.menu+.social-links[data-v-833aabba]{margin-top:16px}.appearance+.social-links[data-v-833aabba]{margin-top:16px}.VPNav[data-v-f1e365da]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-f1e365da]{position:fixed}}.VPSidebarItem.level-0[data-v-196b2e5f]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-196b2e5f]{padding-bottom:10px}.item[data-v-196b2e5f]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-196b2e5f]{cursor:pointer}.indicator[data-v-196b2e5f]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-196b2e5f],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-196b2e5f],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-196b2e5f],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-196b2e5f]{background-color:var(--vp-c-brand-1)}.link[data-v-196b2e5f]{display:flex;align-items:center;flex-grow:1}.text[data-v-196b2e5f]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-196b2e5f]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-196b2e5f],.VPSidebarItem.level-2 .text[data-v-196b2e5f],.VPSidebarItem.level-3 .text[data-v-196b2e5f],.VPSidebarItem.level-4 .text[data-v-196b2e5f],.VPSidebarItem.level-5 .text[data-v-196b2e5f]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-196b2e5f],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-196b2e5f],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-196b2e5f],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-196b2e5f],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-196b2e5f],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-196b2e5f]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-1.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-2.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-3.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-4.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-5.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-196b2e5f],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-196b2e5f],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-196b2e5f],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-196b2e5f],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-196b2e5f],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-196b2e5f]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-196b2e5f],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-196b2e5f],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-196b2e5f],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-196b2e5f],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-196b2e5f],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-196b2e5f]{color:var(--vp-c-brand-1)}.caret[data-v-196b2e5f]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-196b2e5f]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-196b2e5f]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-196b2e5f]{font-size:18px;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-196b2e5f]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-196b2e5f],.VPSidebarItem.level-2 .items[data-v-196b2e5f],.VPSidebarItem.level-3 .items[data-v-196b2e5f],.VPSidebarItem.level-4 .items[data-v-196b2e5f],.VPSidebarItem.level-5 .items[data-v-196b2e5f]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-196b2e5f]{display:none}.no-transition[data-v-9e426adc] .caret-icon{transition:none}.group+.group[data-v-9e426adc]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-9e426adc]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSidebar[data-v-18756405]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-18756405]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-18756405]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-18756405]{padding-top:var(--vp-nav-height);width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-18756405]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-18756405]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-18756405]{outline:0}.VPSkipLink[data-v-c3508ec8]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-c3508ec8]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-c3508ec8]{top:14px;left:16px}}.Layout[data-v-a9a9e638]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-db81191c]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPHomeSponsors[data-v-db81191c]{margin:96px 0}@media (min-width: 768px){.VPHomeSponsors[data-v-db81191c]{margin:128px 0}}.VPHomeSponsors[data-v-db81191c]{padding:0 24px}@media (min-width: 768px){.VPHomeSponsors[data-v-db81191c]{padding:0 48px}}@media (min-width: 960px){.VPHomeSponsors[data-v-db81191c]{padding:0 64px}}.container[data-v-db81191c]{margin:0 auto;max-width:1152px}.love[data-v-db81191c]{margin:0 auto;width:fit-content;font-size:28px;color:var(--vp-c-text-3)}.icon[data-v-db81191c]{display:inline-block}.message[data-v-db81191c]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-db81191c]{padding-top:32px}.action[data-v-db81191c]{padding-top:40px;text-align:center}.VPTeamPage[data-v-c2f8e101]{margin:96px 0}@media (min-width: 768px){.VPTeamPage[data-v-c2f8e101]{margin:128px 0}}.VPHome .VPTeamPageTitle[data-v-c2f8e101-s]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPTeamPageSection+.VPTeamPageSection[data-v-c2f8e101-s],.VPTeamMembers+.VPTeamPageSection[data-v-c2f8e101-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-c2f8e101-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-c2f8e101-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-c2f8e101-s],.VPTeamMembers+.VPTeamPageSection[data-v-c2f8e101-s]{margin-top:96px}}.VPTeamMembers[data-v-c2f8e101-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-c2f8e101-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-c2f8e101-s]{padding:0 64px}}.VPTeamPageTitle[data-v-e277e15c]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-e277e15c]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-e277e15c]{padding:80px 64px 48px}}.title[data-v-e277e15c]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-e277e15c]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-e277e15c]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-e277e15c]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-d43bc49d]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-d43bc49d]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-d43bc49d]{padding:0 64px}}.title[data-v-d43bc49d]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-d43bc49d]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-d43bc49d]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-d43bc49d]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-d43bc49d]{padding-top:40px}.VPTeamMembersItem[data-v-f9987cb6]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-f9987cb6]{padding:32px}.VPTeamMembersItem.small .data[data-v-f9987cb6]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-f9987cb6]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-f9987cb6]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-f9987cb6]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-f9987cb6]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-f9987cb6]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-f9987cb6]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-f9987cb6]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-f9987cb6]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-f9987cb6]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-f9987cb6]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-f9987cb6]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-f9987cb6]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-f9987cb6]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-f9987cb6]{text-align:center}.avatar[data-v-f9987cb6]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-f9987cb6]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-f9987cb6]{margin:0;font-weight:600}.affiliation[data-v-f9987cb6]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-f9987cb6]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-f9987cb6]:hover{color:var(--vp-c-brand-1)}.desc[data-v-f9987cb6]{margin:0 auto}.desc[data-v-f9987cb6] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-f9987cb6]{display:flex;justify-content:center;height:56px}.sp-link[data-v-f9987cb6]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-f9987cb6]:hover,.sp .sp-link.link[data-v-f9987cb6]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-f9987cb6]{margin-right:8px;font-size:16px}.VPTeamMembers.small .container[data-v-fba19bad]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-fba19bad]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-fba19bad]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-fba19bad]{max-width:876px}.VPTeamMembers.medium .container[data-v-fba19bad]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-fba19bad]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-fba19bad]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-fba19bad]{max-width:760px}.container[data-v-fba19bad]{display:grid;gap:24px;margin:0 auto;max-width:1152px}:root{--vp-plugin-tabs-tab-text-color: var(--vp-c-text-2);--vp-plugin-tabs-tab-active-text-color: var(--vp-c-text-1);--vp-plugin-tabs-tab-hover-text-color: var(--vp-c-text-1);--vp-plugin-tabs-tab-bg: var(--vp-c-bg-soft);--vp-plugin-tabs-tab-divider: var(--vp-c-divider);--vp-plugin-tabs-tab-active-bar-color: var(--vp-c-brand-1)}.plugin-tabs{margin:16px 0;background-color:var(--vp-plugin-tabs-tab-bg);border-radius:8px}.plugin-tabs--tab-list{position:relative;padding:0 12px;overflow-x:auto;overflow-y:hidden}.plugin-tabs--tab-list:after{content:"";position:absolute;bottom:0;left:0;right:0;height:2px;background-color:var(--vp-plugin-tabs-tab-divider)}.plugin-tabs--tab{position:relative;padding:0 12px;line-height:48px;border-bottom:2px solid transparent;color:var(--vp-plugin-tabs-tab-text-color);font-size:14px;font-weight:500;white-space:nowrap;transition:color .25s}.plugin-tabs--tab[aria-selected=true]{color:var(--vp-plugin-tabs-tab-active-text-color)}.plugin-tabs--tab:hover{color:var(--vp-plugin-tabs-tab-hover-text-color)}.plugin-tabs--tab:after{content:"";position:absolute;bottom:-2px;left:8px;right:8px;height:2px;background-color:transparent;transition:background-color .25s;z-index:1}.plugin-tabs--tab[aria-selected=true]:after{background-color:var(--vp-plugin-tabs-tab-active-bar-color)}.plugin-tabs--content[data-v-9b0d03d2]{padding:16px}.plugin-tabs--content[data-v-9b0d03d2]>:first-child:first-child{margin-top:0}.plugin-tabs--content[data-v-9b0d03d2]>:last-child:last-child{margin-bottom:0}.plugin-tabs--content[data-v-9b0d03d2]>div[class*=language-]{border-radius:8px;margin:16px 0}:root:not(.dark) .plugin-tabs--content[data-v-9b0d03d2] div[class*=language-]{background-color:var(--vp-c-bg)}.VPHero .clip{white-space:pre;max-width:500px}@font-face{font-family:JuliaMono-Regular;src:url(https://cdn.jsdelivr.net/gh/cormullion/juliamono/webfonts/JuliaMono-Regular.woff2)}:root{--vp-font-family-base: "Barlow", "Inter var experimental", "Inter var", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;--vp-font-family-mono: JuliaMono-Regular, monospace}.mono-no-substitutions{font-family:JuliaMono-Light,monospace;font-feature-settings:"calt" off}.mono-no-substitutions-alt{font-family:JuliaMono-Light,monospace;font-variant-ligatures:none}pre,code{font-family:JuliaMono-Light,monospace;font-feature-settings:"calt" off}:root{--julia-blue: #4063D8;--julia-purple: #9558B2;--julia-red: #CB3C33;--julia-green: #389826;--vp-c-brand: #389826;--vp-c-brand-light: #3dd027;--vp-c-brand-lighter: #9499ff;--vp-c-brand-lightest: #bcc0ff;--vp-c-brand-dark: #535bf2;--vp-c-brand-darker: #454ce1;--vp-c-brand-dimm: #212425}:root{--vp-button-brand-border: var(--vp-c-brand-light);--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand);--vp-button-brand-hover-border: var(--vp-c-brand-light);--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-light);--vp-button-brand-active-border: var(--vp-c-brand-light);--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-button-brand-bg)}:root{--vp-home-hero-name-color: transparent;--vp-home-hero-name-background: -webkit-linear-gradient( 120deg, #9558B2 30%, #CB3C33 );--vp-home-hero-image-background-image: linear-gradient( -45deg, #9558B2 30%, #389826 30%, #CB3C33 );--vp-home-hero-image-filter: blur(40px)}@media (min-width: 640px){:root{--vp-home-hero-image-filter: blur(56px)}}@media (min-width: 960px){:root{--vp-home-hero-image-filter: blur(72px)}}:root.dark{--vp-custom-block-tip-border: var(--vp-c-brand);--vp-custom-block-tip-text: var(--vp-c-brand-lightest);--vp-custom-block-tip-bg: var(--vp-c-brand-dimm);--vp-c-black: hsl(220 20% 9%);--vp-c-black-pure: hsl(220, 24%, 4%);--vp-c-black-soft: hsl(220 16% 13%);--vp-c-black-mute: hsl(220 14% 17%);--vp-c-gray: hsl(220 8% 56%);--vp-c-gray-dark-1: hsl(220 10% 39%);--vp-c-gray-dark-2: hsl(220 12% 28%);--vp-c-gray-dark-3: hsl(220 12% 23%);--vp-c-gray-dark-4: hsl(220 14% 17%);--vp-c-gray-dark-5: hsl(220 16% 13%);--vp-custom-block-info-bg: hsl(220 14% 17%)}.DocSearch{--docsearch-primary-color: var(--vp-c-brand) !important}mjx-container>svg{display:block;margin:auto}mjx-container{padding:.5rem 0}mjx-container{display:inline;margin:auto 2px -2px}mjx-container>svg{margin:auto;display:inline-block}:root{--vp-c-brand-1: #CB3C33;--vp-c-brand-2: #CB3C33;--vp-c-brand-3: #CB3C33;--vp-c-sponsor: #ca2971;--vitest-c-sponsor-hover: #c13071}.dark{--vp-c-brand-1: #91dd33;--vp-c-brand-2: #91dd33;--vp-c-brand-3: #91dd33;--vp-c-sponsor: #91dd33;--vitest-c-sponsor-hover: #e51370}:root:not(.dark) .dark-only{display:none}:root:is(.dark) .light-only{display:none}.VPDoc.has-aside .content-container{max-width:100%!important}.aside{max-width:200px!important;padding-left:0!important}.VPDoc{padding-top:15px!important;padding-left:5px!important}.VPDocOutlineItem li{text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:200px}.VPNavBar .title{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}@media (max-width: 960px){.VPDoc{padding-left:25px!important}}.jldocstring.custom-block{border:1px solid var(--vp-c-gray-2);color:var(--vp-c-text-1)}.jldocstring.custom-block summary{font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none;margin:0 0 8px}.VPLocalSearchBox[data-v-5b749456]{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;display:flex}.backdrop[data-v-5b749456]{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-5b749456]{position:relative;padding:12px;margin:64px auto;display:flex;flex-direction:column;gap:16px;background:var(--vp-local-search-bg);width:min(100vw - 60px,900px);height:min-content;max-height:min(100vh - 128px,900px);border-radius:6px}@media (max-width: 767px){.shell[data-v-5b749456]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-5b749456]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media (max-width: 767px){.search-bar[data-v-5b749456]{padding:0 8px}}.search-bar[data-v-5b749456]:focus-within{border-color:var(--vp-c-brand-1)}.local-search-icon[data-v-5b749456]{display:block;font-size:18px}.navigate-icon[data-v-5b749456]{display:block;font-size:14px}.search-icon[data-v-5b749456]{margin:8px}@media (max-width: 767px){.search-icon[data-v-5b749456]{display:none}}.search-input[data-v-5b749456]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 767px){.search-input[data-v-5b749456]{padding:6px 4px}}.search-actions[data-v-5b749456]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-5b749456]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-5b749456]{display:none}}.search-actions button[data-v-5b749456]{padding:8px}.search-actions button[data-v-5b749456]:not([disabled]):hover,.toggle-layout-button.detailed-list[data-v-5b749456]{color:var(--vp-c-brand-1)}.search-actions button.clear-button[data-v-5b749456]:disabled{opacity:.37}.search-keyboard-shortcuts[data-v-5b749456]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-5b749456]{display:flex;align-items:center;gap:4px}@media (max-width: 767px){.search-keyboard-shortcuts[data-v-5b749456]{display:none}}.search-keyboard-shortcuts kbd[data-v-5b749456]{background:#8080801a;border-radius:4px;padding:3px 6px;min-width:24px;display:inline-block;text-align:center;vertical-align:middle;border:1px solid rgba(128,128,128,.15);box-shadow:0 2px 2px #0000001a}.results[data-v-5b749456]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-5b749456]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border);outline:none}.result>div[data-v-5b749456]{margin:12px;width:100%;overflow:hidden}@media (max-width: 767px){.result>div[data-v-5b749456]{margin:8px}}.titles[data-v-5b749456]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-5b749456]{display:flex;align-items:center;gap:4px}.title.main[data-v-5b749456]{font-weight:500}.title-icon[data-v-5b749456]{opacity:.5;font-weight:500;color:var(--vp-c-brand-1)}.title svg[data-v-5b749456]{opacity:.5}.result.selected[data-v-5b749456]{--vp-local-search-result-bg: var(--vp-local-search-result-selected-bg);border-color:var(--vp-local-search-result-selected-border)}.excerpt-wrapper[data-v-5b749456]{position:relative}.excerpt[data-v-5b749456]{opacity:50%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;margin-top:4px}.result.selected .excerpt[data-v-5b749456]{opacity:1}.excerpt[data-v-5b749456] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-5b749456] mark,.excerpt[data-v-5b749456] mark{background-color:var(--vp-local-search-highlight-bg);color:var(--vp-local-search-highlight-text);border-radius:2px;padding:0 2px}.excerpt[data-v-5b749456] .vp-code-group .tabs{display:none}.excerpt[data-v-5b749456] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-5b749456]{position:absolute;bottom:-1px;left:0;width:100%;height:8px;background:linear-gradient(transparent,var(--vp-local-search-result-bg));z-index:1000}.excerpt-gradient-top[data-v-5b749456]{position:absolute;top:-1px;left:0;width:100%;height:8px;background:linear-gradient(var(--vp-local-search-result-bg),transparent);z-index:1000}.result.selected .titles[data-v-5b749456],.result.selected .title-icon[data-v-5b749456]{color:var(--vp-c-brand-1)!important}.no-results[data-v-5b749456]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-5b749456]{flex:none} diff --git a/dev/constraints/00_intro.html b/dev/constraints/00_intro.html index 9e373f2..59940fb 100644 --- a/dev/constraints/00_intro.html +++ b/dev/constraints/00_intro.html @@ -4,21 +4,21 @@ Introduction to basics constraint-based modeling tools | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Introduction to basics constraint-based modeling tools

Constraint programming (CP) is a high-level paradigm for solving combinatorial problems, and Julia Constraints provides an efficient and flexible framework for developing constraint-based models.

All along this documentation, we will present code example base on the syntaxes of Julia Constraints internals (JC-API), of Julia for Mathematical Programming (JuMP ), of MathOptInterface (MOI), and, when relevant, of other standards such as XCSP.

Terminology

Warning

Terminology in Optimization varies strongly between different methods and communities. In this doc we try to be consistent with the following principles (in bold).

  • Constraint: A general mathematical predicate involving variables.

  • Constraint Instantiation: The application of a constraint to specific variables.

  • Configuration: A specific assignment of values to the variables.

  • Constraint Satisfaction/Violation: Whether a configuration meets or fails a constraint.

Constraint

Definition: A constraint is a formal mathematical statement that expresses a condition or a relation between a set of variables. It can be seen as a predicate that the variables must satisfy.

Example: Consider the constraint x+y10. This constraint involves two variables, x and y, and specifies that their sum must not exceed 10.

Constraint Instantiation

Definition: A constraint instantiation refers to a specific application of a generic constraint to a particular subset of variables from a problem. It is essentially the constraint applied with the actual variables of the problem.

Example: Given the generic constraint x+y10, if we have variables x1 and x2 in our problem, then the instantiated constraint would be x1+x210.

Configuration

Definition: A configuration, also known as an assignment, is a specific set of values assigned to the variables in their respective domains. It represents a possible state of the variables.

Example: For variables x and y with domains [0,10], a configuration could be x=3 and y=2.

Constraint Satisfaction or Violation by a Configuration

Definition: This refers to whether a specific configuration (set of variable assignments) satisfies or violates a given constraint instantiation. A constraint is satisfied if the configuration makes the constraint true; otherwise, it is violated (false).

Example: Given the constraint instantiation x+y10 and the configuration x=3 and y=2, the constraint is satisfied because 3+2=5, which is less than or equal to 10. However, for the configuration x=6 and y=5, the constraint is violated because 6+5=11, which exceeds 10.

Domain-defined variables

In CP, variables are defined through their domain. ConstraintDomains.jl supports various types of domains such as discrete ones (sets, range, etc.), or continuous intervals, and custom domains.

A versatile constraints' API

Constraints.jl implements a wide range of generic and core constraints, ensuring compatibility with XCSP3-core standards and providing a user-friendly interface. It includes features extracted from the learning blocks of Julia Constraints to leverage most of each constraint characteristics.

A collection of models

The ConstraintModels.jl catalog offers a collection of predefined models and templates for constructing complex constraint satisfaction problems (CSPs) and optimization models. This resource provides reusable components to streamline the modeling process.

Contributions with new models are more than welcome!

Internal Aspects

Several internal components are crucial for the efficient functioning of Julia Constraints. ConstraintCommons.jl provides shared functionalities and utilities used across different parts of the framework, contributing to its robust performance and extensibility. However, it is unlikely to be of direct use to most users.

- +
Skip to content

Introduction to basics constraint-based modeling tools

Constraint programming (CP) is a high-level paradigm for solving combinatorial problems, and Julia Constraints provides an efficient and flexible framework for developing constraint-based models.

All along this documentation, we will present code example base on the syntaxes of Julia Constraints internals (JC-API), of Julia for Mathematical Programming (JuMP ), of MathOptInterface (MOI), and, when relevant, of other standards such as XCSP.

Terminology

Warning

Terminology in Optimization varies strongly between different methods and communities. In this doc we try to be consistent with the following principles (in bold).

  • Constraint: A general mathematical predicate involving variables.

  • Constraint Instantiation: The application of a constraint to specific variables.

  • Configuration: A specific assignment of values to the variables.

  • Constraint Satisfaction/Violation: Whether a configuration meets or fails a constraint.

Constraint

Definition: A constraint is a formal mathematical statement that expresses a condition or a relation between a set of variables. It can be seen as a predicate that the variables must satisfy.

Example: Consider the constraint x+y10. This constraint involves two variables, x and y, and specifies that their sum must not exceed 10.

Constraint Instantiation

Definition: A constraint instantiation refers to a specific application of a generic constraint to a particular subset of variables from a problem. It is essentially the constraint applied with the actual variables of the problem.

Example: Given the generic constraint x+y10, if we have variables x1 and x2 in our problem, then the instantiated constraint would be x1+x210.

Configuration

Definition: A configuration, also known as an assignment, is a specific set of values assigned to the variables in their respective domains. It represents a possible state of the variables.

Example: For variables x and y with domains [0,10], a configuration could be x=3 and y=2.

Constraint Satisfaction or Violation by a Configuration

Definition: This refers to whether a specific configuration (set of variable assignments) satisfies or violates a given constraint instantiation. A constraint is satisfied if the configuration makes the constraint true; otherwise, it is violated (false).

Example: Given the constraint instantiation x+y10 and the configuration x=3 and y=2, the constraint is satisfied because 3+2=5, which is less than or equal to 10. However, for the configuration x=6 and y=5, the constraint is violated because 6+5=11, which exceeds 10.

Domain-defined variables

In CP, variables are defined through their domain. ConstraintDomains.jl supports various types of domains such as discrete ones (sets, range, etc.), or continuous intervals, and custom domains.

A versatile constraints' API

Constraints.jl implements a wide range of generic and core constraints, ensuring compatibility with XCSP3-core standards and providing a user-friendly interface. It includes features extracted from the learning blocks of Julia Constraints to leverage most of each constraint characteristics.

A collection of models

The ConstraintModels.jl catalog offers a collection of predefined models and templates for constructing complex constraint satisfaction problems (CSPs) and optimization models. This resource provides reusable components to streamline the modeling process.

Contributions with new models are more than welcome!

Internal Aspects

Several internal components are crucial for the efficient functioning of Julia Constraints. ConstraintCommons.jl provides shared functionalities and utilities used across different parts of the framework, contributing to its robust performance and extensibility. However, it is unlikely to be of direct use to most users.

+ \ No newline at end of file diff --git a/dev/constraints/10_variables_and_domains.html b/dev/constraints/10_variables_and_domains.html index 38c7cae..e5f9c78 100644 --- a/dev/constraints/10_variables_and_domains.html +++ b/dev/constraints/10_variables_and_domains.html @@ -4,20 +4,20 @@ Defining Variables and Exploring Domains | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Defining Variables and Exploring Domains

ConstraintDomains.jl stands as the standard way to define variables and explore domains within the Julia Constraints ecosystem. This package provides the infrastructure necessary for specifying both discrete and continuous domains. Explorations features are mainly related to the learning about constraints aspect and will be detailed in that chapter.

Variables and their domains can also be defined through MOI and JuMP syntaxes in their respective models.

Implementing the AbstractDomain Interface

At the foundation of ConstraintDomains.jl is the AbstractDomain type, an abstract supertype for all domain types. Implementations of AbstractDomain must provide methods for checking membership (), generating random elements (rand), and determining the domain's size or range (length). These functionalities are essential for defining the behavior and properties of variable domains within constraint models.

# ConstraintDomains.AbstractDomainType.
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

  • Base.∈(val, ::D)

  • Base.rand(::D)

  • Base.length(::D) that is the number of elements in a discrete domain, and the distance between bounds or similar for a continuous domain

Additionally, if the domain is used in a dynamic context, it can extend

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source


Discrete Domains

Optimization in discrete spaces has been the core of Constraint Programming since its inception. We provide three kinds of discrete domains.

SetDomain

A SetDomain is simply a Set of unordered numerical values.

julia
using ConstraintDomains
+    
Skip to content

Defining Variables and Exploring Domains

ConstraintDomains.jl stands as the standard way to define variables and explore domains within the Julia Constraints ecosystem. This package provides the infrastructure necessary for specifying both discrete and continuous domains. Explorations features are mainly related to the learning about constraints aspect and will be detailed in that chapter.

Variables and their domains can also be defined through MOI and JuMP syntaxes in their respective models.

Implementing the AbstractDomain Interface

At the foundation of ConstraintDomains.jl is the AbstractDomain type, an abstract supertype for all domain types. Implementations of AbstractDomain must provide methods for checking membership (), generating random elements (rand), and determining the domain's size or range (length). These functionalities are essential for defining the behavior and properties of variable domains within constraint models.

ConstraintDomains.AbstractDomain Type
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

  • Base.∈(val, ::D)

  • Base.rand(::D)

  • Base.length(::D) that is the number of elements in a discrete domain, and the distance between bounds or similar for a continuous domain

Additionally, if the domain is used in a dynamic context, it can extend

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source

Discrete Domains

Optimization in discrete spaces has been the core of Constraint Programming since its inception. We provide three kinds of discrete domains.

SetDomain

A SetDomain is simply a Set of unordered numerical values.

julia
using ConstraintDomains
 
 d1 = domain([53.69, 89.2, 0.12])
 d2 = domain([2//3, 89//123])
@@ -44,7 +44,7 @@
 MOI.add_constraint(optimizer, v3, CBLS.DiscreteSet(4.3))
 
 v4 = MOI.add_variable(optimizer)
-MOI.add_constraint(optimizer, v4, CBLS.DiscreteSet([1, 42, 3.14]))

RangeDomain

A range domain allows for minimal storage and more efficient operation on discrete sets defined as Range in Julia. It is not recommended for dynamic domains (it will be replaced with SetDomain as soon as a non-extremal element is removed).

julia
using ConstraintDomains
+MOI.add_constraint(optimizer, v4, CBLS.DiscreteSet([1, 42, 3.14]))

RangeDomain

A range domain allows for minimal storage and more efficient operation on discrete sets defined as Range in Julia. It is not recommended for dynamic domains (it will be replaced with SetDomain as soon as a non-extremal element is removed).

julia
using ConstraintDomains
 
 d1 = domain(1:5)
 d2 = domain(0.4:0.1:1.3)
julia
## To be implemented
@@ -64,12 +64,12 @@
 
 # v2 = MOI.add_variable(optimizer)
 
-# MOI.add_constraint(optimizer, v1, MOI.RangeSet(0.4:0.1:1.3))

Arbitrary Domains

As odd as it may sound, we provide a constructor for sets of elements making up arbitrary, possibly non-numerical, domains.

Until some practical examples are implemented, this structure will mainly be a placeholder with default behavior.

Continuous Domains

Numerous problems cannot be challenged without expressing at least part of their domains as continuous variables. In Julia Constraints we provide such domains as (set of) intervals.

julia
using ConstraintDomains, Intervals
+# MOI.add_constraint(optimizer, v1, MOI.RangeSet(0.4:0.1:1.3))

Arbitrary Domains

As odd as it may sound, we provide a constructor for sets of elements making up arbitrary, possibly non-numerical, domains.

Until some practical examples are implemented, this structure will mainly be a placeholder with default behavior.

Continuous Domains

Numerous problems cannot be challenged without expressing at least part of their domains as continuous variables. In Julia Constraints we provide such domains as (set of) intervals.

julia
using ConstraintDomains, Intervals
 
 d1 = domain(Interval{Open,Closed}(3.2, true), (42, false))
 d2 = domain(3.2..42)
-d3 = domain([3.2..42, 63.2..324.1])
julia
## see MOI.Interval
julia
## see MOI.Interval
- +d3 = domain([3.2..42, 63.2..324.1])
julia
## see MOI.Interval
julia
## see MOI.Interval
+ \ No newline at end of file diff --git a/dev/constraints/20_constraints.html b/dev/constraints/20_constraints.html index af23eca..b97f931 100644 --- a/dev/constraints/20_constraints.html +++ b/dev/constraints/20_constraints.html @@ -4,20 +4,20 @@ Interacting with Constraints in Julia | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Interacting with Constraints in Julia

Constraints.jl is designed to facilitate the definition, manipulation, and application of constraints in constraint programming (CP).

Note

It also acts as a catalog of various information and features learned about constraints by the learning part of the ecosystem. Per design, we only store the practical information extracted by those tools (such as CompositionalNetworks or QUBOConstraints) and not the heavy machinery (ConstraintLearning).

Usual Constraints and Parameters

The usual constraints of Julia Constraints are heavily inspired by the core constraints of the XCSP3-core standard. The main difference lies in the name chosen to describe the different parameters those core constraints can have.

In XCSP3, the parameters are described based on their roles, which the user can find as keyword argument in the xcsp_ prefixed collection of constraints (for instance xcsp_all_different). In our the Julia Constraints API (JC-API), the keyword arguments correspond to the nature of each parameter.

# ConstraintCommons.USUAL_CONSTRAINT_PARAMETERSConstant.
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
+    
Skip to content

Interacting with Constraints in Julia

Constraints.jl is designed to facilitate the definition, manipulation, and application of constraints in constraint programming (CP).

Note

It also acts as a catalog of various information and features learned about constraints by the learning part of the ecosystem. Per design, we only store the practical information extracted by those tools (such as CompositionalNetworks or QUBOConstraints) and not the heavy machinery (ConstraintLearning).

Usual Constraints and Parameters

The usual constraints of Julia Constraints are heavily inspired by the core constraints of the XCSP3-core standard. The main difference lies in the name chosen to describe the different parameters those core constraints can have.

In XCSP3, the parameters are described based on their roles, which the user can find as keyword argument in the xcsp_ prefixed collection of constraints (for instance xcsp_all_different). In our the Julia Constraints API (JC-API), the keyword arguments correspond to the nature of each parameter.

ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS Constant
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
     :bool, # boolean parameter
     :dim, # dimension, an integer parameter used along the pair_vars or vals parameters
     :id, # index to target one variable in the input vector
@@ -26,8 +26,8 @@
     :pair_vars, # a list of parameters that are paired with each variable in the input vector
     :val, # one scalar value
     :vals, # a list of scalar values (independent of the input vector size)
-]

source


We provide a couple of methods to navigate the usual constraints extracted from XCSP3-Core.

# Constraints.USUAL_CONSTRAINTSConstant.
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source


# Constraints.describeFunction.
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

  • constraints::Dict{Symbol,Constraint}: dictionary of constraints to describe. Default is USUAL_CONSTRAINTS.

  • width::Int: width of the table.

Example

julia
describe()

source


# Constraints.constraints_parametersFunction.
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_parameters()

source


# Constraints.constraints_descriptionsFunction.
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_descriptions()

source


Concepts, Error Functions, and QUBO matrices

One major use of this collection of usual constraint is to extract the concept or the error function (error_f) of a given constraint.

# Constraints.conceptFunction.
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source

julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

  • s::Symbol: the constraint name.

  • args...: the arguments to apply the concept to.

  • kargs...: the keyword arguments to apply the concept to.

Example

julia
concept(:all_different, [1, 2, 3])

source


Note that the error function is a finer estimation of how much a constraint is violated or not. By default, the error_f method simply return 0. if the constraint is satisfied or 1. otherwise.

Efficient versions of error_f are either hand-coded or generated through CompositionalNetworks.jl.

# Constraints.error_fFunction.
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source


Finally, another use is to provide QUBO matrices of those usual constraints through QUBOConstraints.jl. The syntax and interface for this feature are still a work in progress.

- +]

source

We provide a couple of methods to navigate the usual constraints extracted from XCSP3-Core.

Constraints.USUAL_CONSTRAINTS Constant
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source

Constraints.describe Function
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

  • constraints::Dict{Symbol,Constraint}: dictionary of constraints to describe. Default is USUAL_CONSTRAINTS.

  • width::Int: width of the table.

Example

julia
describe()

source

Constraints.constraints_parameters Function
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_parameters()

source

Constraints.constraints_descriptions Function
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_descriptions()

source

Concepts, Error Functions, and QUBO matrices

One major use of this collection of usual constraint is to extract the concept or the error function (error_f) of a given constraint.

Constraints.concept Function
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source

julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

  • s::Symbol: the constraint name.

  • args...: the arguments to apply the concept to.

  • kargs...: the keyword arguments to apply the concept to.

Example

julia
concept(:all_different, [1, 2, 3])

source

Note that the error function is a finer estimation of how much a constraint is violated or not. By default, the error_f method simply return 0. if the constraint is satisfied or 1. otherwise.

Efficient versions of error_f are either hand-coded or generated through CompositionalNetworks.jl.

Constraints.error_f Function
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source

Finally, another use is to provide QUBO matrices of those usual constraints through QUBOConstraints.jl. The syntax and interface for this feature are still a work in progress.

+ \ No newline at end of file diff --git a/dev/constraints/21_generic_constraints.html b/dev/constraints/21_generic_constraints.html index 1716e2b..fe13fff 100644 --- a/dev/constraints/21_generic_constraints.html +++ b/dev/constraints/21_generic_constraints.html @@ -4,20 +4,20 @@ Generic Constraints | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Generic Constraints

In the XCSP³-core standard, generic constraints are categorized into two main types: intention and extension constraints.

Intention Constraints

These are constraints that are defined by a logical expression or a function. They are called intentional because they are defined by the property they satisfy. For example, a constraint that specifies that a variable x must be less than a variable y could be defined intentionally as x<y.

Note that the intention constraint is not directly available through the JC-API in Constraints.jl. It is designed as such since defining a constraint through a predicate is the natural way.

We provide a straightforward example through the :dist_different constraint on how to define and add such a constraint in the USUAL_CONSTRAINTS collection.

Higher level modeling languages such as JuMP should provide a Intention interface.

Defining an intention constraint in JC-API

We use the dist_different constraint to illustrate how to define an intention constraint in Constraints.jl. The dist_different constraint ensures that the distances between marks x on a ruler are unique.

|x[1]x[2]||x[3]x[4]|

The constraint is then added to the usual constraints collection.

julia
const description_dist_different = """
+    
Skip to content

Generic Constraints

In the XCSP³-core standard, generic constraints are categorized into two main types: intention and extension constraints.

Intention Constraints

These are constraints that are defined by a logical expression or a function. They are called intentional because they are defined by the property they satisfy. For example, a constraint that specifies that a variable x must be less than a variable y could be defined intentionally as x<y.

Note that the intention constraint is not directly available through the JC-API in Constraints.jl. It is designed as such since defining a constraint through a predicate is the natural way.

We provide a straightforward example through the :dist_different constraint on how to define and add such a constraint in the USUAL_CONSTRAINTS collection.

Higher level modeling languages such as JuMP should provide a Intention interface.

Defining an intention constraint in JC-API

We use the dist_different constraint to illustrate how to define an intention constraint in Constraints.jl. The dist_different constraint ensures that the distances between marks x on a ruler are unique.

|x[1]x[2]||x[3]x[4]|

The constraint is then added to the usual constraints collection.

julia
const description_dist_different = """
 Ensures that the distances between marks on the ruler are unique.
 """
 
@@ -28,7 +28,7 @@
 @usual concept_dist_different(x) = xcsp_intention(
     list = x,
     predicate = predicate_dist_different
-)

Please check the section dedicated to the Golomb Ruler problem to see a use for this constraint. <!– TODO: Golomb Ruler –>

APIs

Note that the intention constraint is not directly available through the JC-API in Constraints.jl. It is designed as such since defining a constraint through a predicate is the natural way.

We provide here a usage example for the :dist_different constraint, previously added to the USUAL_CONSTRAINTS collection.

Higher level modeling language such as JuMP should provide an Intention interface.

julia
using Constraints
+)

Please check the section dedicated to the Golomb Ruler problem to see a use for this constraint. <!– TODO: Golomb Ruler –>

APIs

Note that the intention constraint is not directly available through the JC-API in Constraints.jl. It is designed as such since defining a constraint through a predicate is the natural way.

We provide here a usage example for the :dist_different constraint, previously added to the USUAL_CONSTRAINTS collection.

Higher level modeling language such as JuMP should provide an Intention interface.

julia
using Constraints
 
 concept(:dist_different, x)
 concept(:dist_different)(x)
julia
# Defines the DistDifferent constraint
@@ -67,7 +67,7 @@
 end
 MOI.add_constraint(optimizer, x, CBLS.Intention(y -> abs(y[1] - y[2])  abs(y[3] - y[4])))
 
-MOI.optimize!(optimizer)

Extension Constraints

These are constraints that are defined by explicitly listing all the tuples of values that satisfy the constraint. They are called extensional because they are defined by the set of values they allow. For example, a binary constraint that specifies that a variable X must be either 1 or 2 and a variable Y must be either 3 or 4 could be defined extensionally by the set of tuples (1,3),(1,4),(2,3),(2,4).

These two types of constraints provide a flexible way to define complex relationships between variables in constraint programming.

julia
using Constraints
+MOI.optimize!(optimizer)

Extension Constraints

These are constraints that are defined by explicitly listing all the tuples of values that satisfy the constraint. They are called extensional because they are defined by the set of values they allow. For example, a binary constraint that specifies that a variable X must be either 1 or 2 and a variable Y must be either 3 or 4 could be defined extensionally by the set of tuples (1,3),(1,4),(2,3),(2,4).

These two types of constraints provide a flexible way to define complex relationships between variables in constraint programming.

julia
using Constraints
 
 concept(:dist_different, x)
 concept(:dist_different)(x)
julia
# Defines the DistDifferent constraint
@@ -106,8 +106,8 @@
 end
 MOI.add_constraint(optimizer, x, CBLS.Intention(y -> abs(y[1] - y[2])  abs(y[3] - y[4])))
 
-MOI.optimize!(optimizer)
- +MOI.optimize!(optimizer)
+ \ No newline at end of file diff --git a/dev/constraints/22_language_constraints.html b/dev/constraints/22_language_constraints.html index a75a514..ec3dcf8 100644 --- a/dev/constraints/22_language_constraints.html +++ b/dev/constraints/22_language_constraints.html @@ -4,22 +4,20 @@ Constraints.jl: Streamlining Constraint Definition and Integration in Julia | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

Constraints defined from Languages

# Constraints.xcsp_regularFunction.
julia
xcsp_regular(; list, automaton)
-
-Ensures that a sequence `x` (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of `x` with the language rules encoded within the `automaton` parameter, which must be an instance of `<:AbstractAutomaton`.

Arguments

  • list::Vector{Int}: A list of variables

  • automaton<:AbstractAutomaton: An automaton representing the regular language

Variants

  • :regular: Ensures that a sequence x (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of x with the language rules encoded within the automaton parameter, which must be an instance of <:AbstractAutomaton.
julia
concept(:regular, x; language)
+    
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

Constraints defined from Languages

Constraints.xcsp_regular Function
julia
xcsp_regular(; list, automaton)

Ensures that a sequence x (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of x with the language rules encoded within the automaton parameter, which must be an instance of <:AbstractAutomaton.

Arguments

  • list::Vector{Int}: A list of variables

  • automaton<:AbstractAutomaton: An automaton representing the regular language

Variants

  • :regular: Ensures that a sequence x (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of x with the language rules encoded within the automaton parameter, which must be an instance of <:AbstractAutomaton.
julia
concept(:regular, x; language)
 concept(:regular)(x; language)

Examples

julia
c = concept(:regular)
 
 states = Dict(
@@ -37,7 +35,7 @@
 a = Automaton(states, start, finish)
 
 c([0,0,1,1,0,0,1,0,0]; language = a)
-c([1,1,1,0,1]; language = a)

source


# Constraints.xcsp_mddFunction.
julia
xcsp_mdd(; list, diagram)

Return a function that checks if the list of values list satisfies the MDD diagram.

Arguments

  • list::Vector{Int}: list of values to check.

  • diagram::MDD: MDD to check.

Variants

  • :mdd: Multi-valued Decision Diagram (MDD) constraint. The MDD constraint is a constraint that can be used to model a wide range of problems. It is a directed graph where each node is labeled with a value and each edge is labeled with a value. The constraint is satisfied if there is a path from the first node to the last node such that the sequence of edge labels is a valid sequence of the value labels.
julia
concept(:mdd, x; language)
+c([1,1,1,0,1]; language = a)

source

Constraints.xcsp_mdd Function
julia
xcsp_mdd(; list, diagram)

Return a function that checks if the list of values list satisfies the MDD diagram.

Arguments

  • list::Vector{Int}: list of values to check.

  • diagram::MDD: MDD to check.

Variants

  • :mdd: Multi-valued Decision Diagram (MDD) constraint.

The MDD constraint is a constraint that can be used to model a wide range of problems. It is a directed graph where each node is labeled with a value and each edge is labeled with a value. The constraint is satisfied if there is a path from the first node to the last node such that the sequence of edge labels is a valid sequence of the value labels.

julia
concept(:mdd, x; language)
 concept(:mdd)(x; language)

Examples

julia
c = concept(:mdd)
 
 states = [
@@ -64,8 +62,8 @@
 c([2,0,0]; language = a)
 c([2,1,2]; language = a)
 c([1,0,2]; language = a)
-c([0,1,2]; language = a)

source


- +c([0,1,2]; language = a)

source

+ \ No newline at end of file diff --git a/dev/constraints/23_comparison_constraints.html b/dev/constraints/23_comparison_constraints.html index 41b49a2..306a7f0 100644 --- a/dev/constraints/23_comparison_constraints.html +++ b/dev/constraints/23_comparison_constraints.html @@ -4,20 +4,20 @@ Constraints.jl: Streamlining Constraint Definition and Integration in Julia | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
+    
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
 
 concept(:all_different, [1,1,1,2]) # false
 concept(:all_different, [1,9,3,2]) # true
julia
using Constraints
@@ -36,7 +36,7 @@
 JuMP.optimize!(model)
 @info "All Different" value.(X) value.(Y)
 
-# Note that this example gives a solution for the all_different constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+# Note that this example gives a solution for the all_different constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 concept(:all_equal, [1,1,1,2]) #false
 concept(:all_equal, [1,1,1,1]) #true
julia
using Constraints
@@ -54,7 +54,7 @@
 JuMP.optimize!(model)
 @info "All Equal" value.(X)
 
-# Note that this example gives a solution for the all_equal constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+# Note that this example gives a solution for the all_equal constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 @info concept(:ordered, [1, 2, 3, 4, 4]; op=≤)
 @info concept(:ordered, [1, 2, 3, 3, 5]; op=<)
@@ -74,13 +74,13 @@
 @constraint(model, X in Ordered())
 @constraint(model, Y in Ordered(; op = <))
 JuMP.optimize!(model)
-@info "Ordered" value.(X) value.(Y)
julia
# TODO: How to handle intention in JuMP/MOI

Comparison-based Constraints

# Constraints.xcsp_all_differentFunction.
julia
xcsp_all_different(list::Vector{Int})

Return true if all the values of list are different, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

Variants

  • :all_different: Global constraint ensuring that all the values of x are all different.
julia
concept(:all_different, x; vals)
+@info "Ordered" value.(X) value.(Y)
julia
# TODO: How to handle intention in JuMP/MOI

Comparison-based Constraints

Constraints.xcsp_all_different Function
julia
xcsp_all_different(list::Vector{Int})

Return true if all the values of list are different, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

Variants

  • :all_different: Global constraint ensuring that the values in x are all different.
julia
concept(:all_different, x; vals)
 concept(:all_different)(x; vals)

Examples

julia
c = concept(:all_different)
 
 c([1, 2, 3, 4])
 c([1, 2, 3, 1])
 c([1, 0, 0, 4]; vals=[0])
-c([1, 0, 0, 1]; vals=[0])

source


# Constraints.xcsp_all_equalFunction.
julia
xcsp_all_equal(list::Vector{Int}, val::Int)

Return true if all the values of list are equal to val, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • val::Int: value to compare to.

Variants

  • :all_equal: Global constraint ensuring that all the values of x are all equal.
julia
concept(:all_equal, x; val=nothing, pair_vars=zeros(x), op=+)
+c([1, 0, 0, 1]; vals=[0])

source

Constraints.xcsp_all_equal Function
julia
xcsp_all_equal(list::Vector{Int}, val::Int)

Return true if all the values of list are equal to val, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • val::Int: value to compare to.

Variants

  • :all_equal: Global constraint ensuring that the values in x are all equal.
julia
concept(:all_equal, x; val=nothing, pair_vars=zeros(x), op=+)
 concept(:all_equal)(x; val=nothing, pair_vars=zeros(x), op=+)

Examples

julia
c = concept(:all_equal)
 
 c([0, 0, 0, 0])
@@ -88,7 +88,7 @@
 c([3, 2, 1, 0]; pair_vars=[0, 1, 2, 3])
 c([0, 1, 2, 3]; pair_vars=[0, 1, 2, 3])
 c([1, 2, 3, 4]; op=/, val=1, pair_vars=[1, 2, 3, 4])
-c([1, 2, 3, 4]; op=*, val=1, pair_vars=[1, 2, 3, 4])

source


# Constraints.xcsp_orderedFunction.
julia
xcsp_ordered(list::Vector{Int}, operator, lengths)

Return true if all the values of list are in an increasing order, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • operator: comparison operator to use.

  • lengths: list of lengths to use. Defaults to nothing.

Variants

  • :ordered: Global constraint ensuring that all the values of x are in an increasing order.
julia
concept(:ordered, x; op=≤, pair_vars=nothing)
+c([1, 2, 3, 4]; op=*, val=1, pair_vars=[1, 2, 3, 4])

source

Constraints.xcsp_ordered Function
julia
xcsp_ordered(list::Vector{Int}, operator, lengths)

Return true if all the values of list are in an increasing order, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • operator: comparison operator to use.

  • lengths: list of lengths to use. Defaults to nothing.

Variants

  • :ordered: Global constraint ensuring that all the values of x are in a total order defined by a comparison operator.
julia
concept(:ordered, x; op=≤, pair_vars=nothing)
 concept(:ordered)(x; op=≤, pair_vars=nothing)
  • :increasing: Global constraint ensuring that all the values of x are in an increasing order.
julia
concept(:increasing, x; op=≤, pair_vars=nothing)
 concept(:increasing)(x; op=≤, pair_vars=nothing)
  • :decreasing: Global constraint ensuring that all the values of x are in a decreasing order.
julia
concept(:decreasing, x; op=≥, pair_vars=nothing)
 concept(:decreasing)(x; op=≥, pair_vars=nothing)
  • :strictly_increasing: Global constraint ensuring that all the values of x are in a strictly increasing order.
julia
concept(:strictly_increasing, x; op=<, pair_vars=nothing)
@@ -98,8 +98,8 @@
 c([1, 2, 3, 4, 4]; op=≤)
 c([1, 2, 3, 4, 5]; op=<)
 !c([1, 2, 3, 4, 3]; op=≤)
-!c([1, 2, 3, 4, 3]; op=<)

source


- +!c([1, 2, 3, 4, 3]; op=<)

source

+ \ No newline at end of file diff --git a/dev/constraints/24_counting_summing_constraints.html b/dev/constraints/24_counting_summing_constraints.html index 0f7010d..66640d8 100644 --- a/dev/constraints/24_counting_summing_constraints.html +++ b/dev/constraints/24_counting_summing_constraints.html @@ -4,20 +4,20 @@ Constraints.jl: Streamlining Constraint Definition and Integration in Julia | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
+    
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
 
 @info concept(:sum, [1, 2, 3, 4, 5]; op = ==, val=15)
 @info concept(:sum, [1, 2, 3, 4, 5]; op = ==, val=2)
@@ -39,7 +39,7 @@
 @constraint(model, X in Sum(; op = ==, val = 15))
 @constraint(model, Y in Sum(; op = <=, val = 10))
 JuMP.optimize!(model)
-@info "Sum" value.(X) value.(Y)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "Sum" value.(X) value.(Y)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 concept(:count, [1,1,1,2], vals = [1, 1, 1, 2], op = ==, val = 4) # true
 concept(:count, [1,1,1,2], vals = [1, 1, 1, 2], op = ==, val = 5) # false
@@ -73,7 +73,7 @@
 @constraint(model, X_at_most in AtMost(vals = [1, 2], val = 1))
 @constraint(model, X_exactly in Exactly(vals = [1, 2], val = 2))
 JuMP.optimize!(model)
-@info "Count" value.(X) value.(X_at_least) value.(X_at_most) value.(X_exactly)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "Count" value.(X) value.(X_at_least) value.(X_at_most) value.(X_exactly)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 @info concept(:nvalues, [1, 2, 3, 4, 5]; op = ==, val = 5)
 @info concept(:nvalues, [1, 2, 3, 4, 5]; op = ==, val = 2)
@@ -97,7 +97,7 @@
 @constraint(model, Y in NValues(; op = ==, val = 2))
 @constraint(model, Z in NValues(; op = <=, val = 5, vals = [1, 2]))
 JuMP.optimize!(model)
-@info "NValues" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "NValues" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 # [v1, v2, v3], [v1, a1, a2; v2, b1, b2; v3, c1, c2] means v1 occurs between a1 and a2 times in the first array, similar for v2 and v3.
 
@@ -124,13 +124,13 @@
 @constraint(model, Y in CardinalityOpen(; vals = [2 0 1; 5 1 3; 10 2 3]))
 @constraint(model, Z in CardinalityClosed(; vals = [2 0 1; 5 1 3; 10 2 3]))
 JuMP.optimize!(model)
-@info "Cardinality" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI

Counting and Summing Constraints

# Constraints.xcsp_sumFunction.
julia
xcsp_sum(list, coeffs, condition)

Return true if the sum of the variables in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • coeffs::Vector{Int}: list of coefficients to use.

  • condition: condition to satisfy.

Variants

  • :sum: Global constraint ensuring that the sum of the variables in x satisfies a given condition.
julia
concept(:sum, x; op===, pair_vars=ones(x), val)
+@info "Cardinality" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI

Counting and Summing Constraints

Constraints.xcsp_sum Function
julia
xcsp_sum(list, coeffs, condition)

Return true if the sum of the variables in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • coeffs::Vector{Int}: list of coefficients to use.

  • condition: condition to satisfy.

Variants

  • :sum: Global constraint ensuring that the sum of the variables in x satisfies a given numerical condition.
julia
concept(:sum, x; op===, pair_vars=ones(x), val)
 concept(:sum)(x; op===, pair_vars=ones(x), val)

Examples

julia
c = concept(:sum)
 
 c([1, 2, 3, 4, 5]; op===, val=15)
 c([1, 2, 3, 4, 5]; op===, val=2)
 c([1, 2, 3, 4, 3]; op=≤, val=15)
-c([1, 2, 3, 4, 3]; op=≤, val=3)

source


# Constraints.xcsp_countFunction.
julia
xcsp_count(list, values, condition)

Return true if the number of occurrences of the values in values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • values::Vector{Int}: list of values to check.

  • condition: condition to satisfy.

Variants

  • :count: Constraint ensuring that the number of occurrences of the values in vals in x satisfies the given condition.
julia
concept(:count, x; vals, op, val)
+c([1, 2, 3, 4, 3]; op=≤, val=3)

source

Constraints.xcsp_count Function
julia
xcsp_count(list, values, condition)

Return true if the number of occurrences of the values in values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • values::Vector{Int}: list of values to check.

  • condition: condition to satisfy.

Variants

  • :count: Constraint ensuring that the number of occurrences of the values in vals in x satisfies the given condition.
julia
concept(:count, x; vals, op, val)
 concept(:count)(x; vals, op, val)
  • :at_least: Constraint ensuring that the number of occurrences of the values in vals in x is at least val.
julia
concept(:at_least, x; vals, val)
 concept(:at_least)(x; vals, val)
  • :at_most: Constraint ensuring that the number of occurrences of the values in vals in x is at most val.
julia
concept(:at_most, x; vals, val)
 concept(:at_most)(x; vals, val)
  • :exactly: Constraint ensuring that the number of occurrences of the values in vals in x is exactly val.
julia
concept(:exactly, x; vals, val)
@@ -138,15 +138,15 @@
 
 c([2, 1, 4, 3]; vals=[1, 2, 3, 4], op=≥, val=2)
 c([1, 2, 3, 4]; vals=[1, 2], op==, val=2)
-c([2, 1, 4, 3]; vals=[1, 2], op=≤, val=1)

source


# Constraints.xcsp_nvaluesFunction.
julia
xcsp_nvalues(list, condition, except)

Return true if the number of distinct values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • condition: condition to satisfy.

  • except::Union{Nothing, Vector{Int}}: list of values to exclude. Default is nothing.

Variants

  • :nvalues: The nValues constraint specifies that the number of distinct values in the list of variables x is equal to a given value. The constraint is defined by the following expression: nValues(x, op, val) where x is a list of variables, op is a comparison operator, and val is an integer value.
julia
concept(:nvalues, x; op, val)
+c([2, 1, 4, 3]; vals=[1, 2], op=≤, val=1)

source

Constraints.xcsp_nvalues Function
julia
xcsp_nvalues(list, condition, except)

Return true if the number of distinct values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • condition: condition to satisfy.

  • except::Union{Nothing, Vector{Int}}: list of values to exclude. Default is nothing.

Variants

  • :nvalues: Ensures that the number of distinct values in x satisfies a given numerical condition.

The constraint is defined by the following expression: nValues(x, op, val) where x is a list of variables, op is a comparison operator, and val is an integer value.

julia
concept(:nvalues, x; op, val)
 concept(:nvalues)(x; op, val)

Examples

julia
c = concept(:nvalues)
 
 c([1, 2, 3, 4, 5]; op = ==, val = 5)
 c([1, 2, 3, 4, 5]; op = ==, val = 2)
 c([1, 2, 3, 4, 3]; op = <=, val = 5)
-c([1, 2, 3, 4, 3]; op = <=, val = 3)

source


# Constraints.xcsp_cardinalityFunction.
julia
xcsp_cardinality(list, values, occurs, closed)

Return true if the number of occurrences of the values in values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • values::Vector{Int}: list of values to check.

  • occurs::Vector{Int}: list of occurrences to check.

  • closed::Bool: whether the constraint is closed or not.

Variants

  • :cardinality: The cardinality constraint, also known as the global cardinality constraint (GCC), is a constraint in constraint programming that restricts the number of times a value can appear in a set of variables.
julia
concept(:cardinality, x; bool=false, vals)
-concept(:cardinality)(x; bool=false, vals)
  • :cardinality_closed: The closed cardinality constraint, also known as the global cardinality constraint (GCC), is a constraint in constraint programming that restricts the number of times a value can appear in a set of variables. It is closed, meaning that all values in the domain of the variables must be considered.
julia
concept(:cardinality_closed, x; vals)
-concept(:cardinality_closed)(x; vals)
  • :cardinality_open: The open cardinality constraint, also known as the global cardinality constraint (GCC), is a constraint in constraint programming that restricts the number of times a value can appear in a set of variables. It is open, meaning that only the values in the list of values must be considered.
julia
concept(:cardinality_open, x; vals)
+c([1, 2, 3, 4, 3]; op = <=, val = 3)

source

Constraints.xcsp_cardinality Function
julia
xcsp_cardinality(list, values, occurs, closed)

Return true if the number of occurrences of the values in values in list satisfies the given condition, false otherwise.

Arguments

  • list::Vector{Int}: list of values to check.

  • values::Vector{Int}: list of values to check.

  • occurs::Vector{Int}: list of occurrences to check.

  • closed::Bool: whether the constraint is closed or not.

Variants

  • :cardinality: Global constraint that restricts the number of times specific values in a list values can appear in x.
julia
concept(:cardinality, x; bool=false, vals)
+concept(:cardinality)(x; bool=false, vals)
  • :cardinality_closed: Global constraint that restricts the number of times in a list values can appear in x. It is closed, meaning that the variables in x cannot have values outside the ones in list.
julia
concept(:cardinality_closed, x; vals)
+concept(:cardinality_closed)(x; vals)
  • :cardinality_open: Global constraint that restricts the number of times in a list values can appear in x. It is open, meaning that the variables in x can have values outside the ones in list.
julia
concept(:cardinality_open, x; vals)
 concept(:cardinality_open)(x; vals)

Examples

julia
c = concept(:cardinality)
 
 c([2, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])
@@ -162,8 +162,8 @@
 cc([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])
 
 co = concept(:cardinality_open)
-co([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])

source


- +co([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])

source

+ \ No newline at end of file diff --git a/dev/constraints/25_connection_constraints.html b/dev/constraints/25_connection_constraints.html index 71fd186..a31a5cd 100644 --- a/dev/constraints/25_connection_constraints.html +++ b/dev/constraints/25_connection_constraints.html @@ -4,20 +4,20 @@ Constraints.jl: Streamlining Constraint Definition and Integration in Julia | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
+    
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
 
 concept(:maximum, [1,1,1,2], val = 2, op = ==) # true
 concept(:maximum, [1,2,4,4], val = 2, op = ==) # false
julia
using Constraints
@@ -34,7 +34,7 @@
 @variable(model, 1X[1:5]5, Int)
 @constraint(model, X in Maximum(; op = ==, val = 5))
 optimize!(model)
-@info "Maximum" value.(X)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "Maximum" value.(X)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 concept(:minimum, [1,1,1,2], val = 1, op = ==) # true
 concept(:minimum, [1,2,4,4], val = 2, op = ==) # false
julia
using Constraints
@@ -53,7 +53,7 @@
 JuMP.optimize!(model)
 @info "Minimum" value.(X)
 
-# Note that this example gives a solution for the minimum constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+# Note that this example gives a solution for the minimum constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 @info concept(:element, [1, 2, 3, 4, 5]; id=1, val=1)
 @info concept(:element, [1, 2, 3, 4, 5]; id=1, val=2)
@@ -77,7 +77,7 @@
 @constraint(model, Y in Element(; id = 1, val = 1))
 @constraint(model, Z in Element(; id = 2, val = 2))
 JuMP.optimize!(model)
-@info "Element" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "Element" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 @info concept(:channel, [2, 1, 4, 3])
 @info concept(:channel, [1, 2, 3, 4])
@@ -102,21 +102,21 @@
 @constraint(model, Y in CBLS.Channel(; dim = 2))
 @constraint(model, Z in CBLS.Channel(; id = 3))
 JuMP.optimize!(model)
-@info "Channel" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI

Connection Constraints

# Constraints.xcsp_maximumFunction.
julia
xcsp_maximum(; list, condition)

Return true if the maximum constraint is satisfied, false otherwise. The maximum constraint is a global constraint used in constraint programming that specifies that a certain condition should hold for the maximum value in a list of variables.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • condition::Tuple: condition to check.

Variants

  • :maximum: The maximum constraint is a global constraint used in constraint programming that specifies that a certain condition should hold for the maximum value in a list of variables.
julia
concept(:maximum, x; op, val)
+@info "Channel" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI

Connection Constraints

Constraints.xcsp_maximum Function
julia
xcsp_maximum(; list, condition)

Return true if the maximum constraint is satisfied, false otherwise. The maximum constraint is a global constraint specifying that a certain condition should hold for the maximum value in a list of variables.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • condition::Tuple: condition to check.

Variants

  • :maximum: Global constraint ensuring that a certain numerical condition holds for the maximum value in x.
julia
concept(:maximum, x; op, val)
 concept(:maximum)(x; op, val)

Examples

julia
c = concept(:maximum)
 
 c([1, 2, 3, 4, 5]; op = ==, val = 5)
-c([1, 2, 3, 4, 5]; op = ==, val = 6)

source


# Constraints.xcsp_minimumFunction.
julia
xcsp_minimum(; list, condition)

Return true if the minimum constraint is satisfied, false otherwise. The minimum constraint is a global constraint used in constraint programming that specifies that a certain condition should hold for the minimum value in a list of variables.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • condition::Tuple: condition to check.

Variants

  • :minimum: The minimum constraint is a global constraint used in constraint programming that specifies that a certain condition should hold for the minimum value in a list of variables.
julia
concept(:minimum, x; op, val)
+c([1, 2, 3, 4, 5]; op = ==, val = 6)

source

Constraints.xcsp_minimum Function
julia
xcsp_minimum(; list, condition)

Return true if the minimum constraint is satisfied, false otherwise. The minimum constraint is a global constraint specifying that a certain condition should hold for the minimum value in a list of variables.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • condition::Tuple: condition to check.

Variants

  • :minimum: Global constraint ensuring that a certain numerical condition holds for the minimum value in x.
julia
concept(:minimum, x; op, val)
 concept(:minimum)(x; op, val)

Examples

julia
c = concept(:minimum)
 
 c([1, 2, 3, 4, 5]; op = ==, val = 1)
-c([1, 2, 3, 4, 5]; op = ==, val = 0)

source


# Constraints.xcsp_elementFunction.
julia
xcsp_element(; list, index, condition)

Return true if the element constraint is satisfied, false otherwise. The element constraint is a global constraint used in constraint programming that specifies that the value of a variable should be equal to the value of another variable indexed by a third variable.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • index::Int: index of the value to check.

  • condition::Tuple: condition to check.

Variants

  • :element: The element constraint is a global constraint used in constraint programming that specifies that the value of a variable should be equal to the value of another variable indexed by a third variable.
julia
concept(:element, x; id=nothing, op===, val=nothing)
+c([1, 2, 3, 4, 5]; op = ==, val = 0)

source

Constraints.xcsp_element Function
julia
xcsp_element(; list, index, condition)

Return true if the element constraint is satisfied, false otherwise. The element constraint is a global constraint specifying that a variable in x indexed by id should be equal to a value.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

  • index::Int: index of the value to check.

  • condition::Tuple: condition to check.

Variants

  • :element: Global constraint specifying that a variable in x indexed by id should be equal to a value.
julia
concept(:element, x; id=nothing, op===, val=nothing)
 concept(:element)(x; id=nothing, op===, val=nothing)

Examples

julia
c = concept(:element)
 
 c([1, 2, 3, 4, 5]; id=1, val=1)
 c([1, 2, 3, 4, 5]; id=1, val=2)
 c([1, 2, 3, 4, 2])
-c([1, 2, 3, 4, 1])

source


# Constraints.xcsp_channelFunction.
julia
xcsp_channel(; list)

Return true if the channel constraint is satisfied, false otherwise. The channel constraint establishes a bijective correspondence between two sets of variables. This means that each value in the first set of variables corresponds to a unique value in the second set, and vice versa.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

Variants

  • :channel: The channel constraint establishes a bijective correspondence between two sets of variables. This means that each value in the first set of variables corresponds to a unique value in the second set, and vice versa.
julia
concept(:channel, x; dim=1, id=nothing)
+c([1, 2, 3, 4, 1])

source

Constraints.xcsp_channel Function
julia
xcsp_channel(; list)

Return true if the channel constraint is satisfied, false otherwise. The channel constraint ensures that if the i-th element of list is assigned the value j, then the j-th element of list must be assigned the value i.

Arguments

  • list::Union{AbstractVector, Tuple}: list of values to check.

Variants

  • :channel: Ensures that if the i-th element of x is assigned the value j, then the j-th element of x must be assigned the value i.
julia
concept(:channel, x; dim=1, id=nothing)
 concept(:channel)(x; dim=1, id=nothing)

Examples

julia
c = concept(:channel)
 
 c([2, 1, 4, 3])
@@ -125,8 +125,8 @@
 c([2, 1, 5, 3, 4, 2, 1, 4, 5, 3]; dim=2)
 c([2, 1, 4, 3, 5, 2, 1, 4, 5, 3]; dim=2)
 c([false, false, true, false]; id=3)
-c([false, false, true, false]; id=1)

source


- +c([false, false, true, false]; id=1)

source

+ \ No newline at end of file diff --git a/dev/constraints/26_packing_scheduling_constraints.html b/dev/constraints/26_packing_scheduling_constraints.html index 0859dc8..da084cf 100644 --- a/dev/constraints/26_packing_scheduling_constraints.html +++ b/dev/constraints/26_packing_scheduling_constraints.html @@ -4,20 +4,20 @@ Constraints.jl: Streamlining Constraint Definition and Integration in Julia | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
+    
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
 
 @info concept(:cumulative, [1, 2, 3, 4, 5]; val = 1)
 @info concept(:cumulative, [1, 2, 2, 4, 5]; val = 1)
@@ -44,7 +44,7 @@
 @constraint(model,
     Z in Cumulative(; pair_vars = [3 2 5 4 2; 1 2 1 1 3], op = <, val = 5))
 JuMP.optimize!(model)
-@info "Cumulative" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "Cumulative" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 @info concept(:no_overlap, [1, 2, 3, 4, 5])
 @info concept(:no_overlap, [1, 2, 3, 4, 1])
@@ -70,15 +70,15 @@
 @constraint(model,
     Z in NoOverlap(; pair_vars = [2, 4, 1, 4, 2, 3, 5, 1, 2, 3, 3, 2], dim = 3))
 JuMP.optimize!(model)
-@info "NoOverlap" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI

Packing and Scheduling Constraints

# Constraints.xcsp_cumulativeFunction.
julia
xcsp_cumulative(; origins, lengths, heights, condition)

Return true if the cumulative constraint is satisfied, false otherwise. The cumulative constraint is a global constraint used in constraint programming that is often used in scheduling problems. It ensures that for any point in time, the sum of the "heights" of tasks that are ongoing at that time does not exceed a certain limit.

Arguments

  • origins::AbstractVector: list of origins of the tasks.

  • lengths::AbstractVector: list of lengths of the tasks.

  • heights::AbstractVector: list of heights of the tasks.

  • condition::Tuple: condition to check.

Variants

  • :cumulative: The cumulative constraint is a global constraint used in constraint programming that is often used in scheduling problems. It ensures that for any point in time, the sum of the "heights" of tasks that are ongoing at that time does not exceed a certain limit.
julia
concept(:cumulative, x; pair_vars, op, val)
+@info "NoOverlap" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI

Packing and Scheduling Constraints

Constraints.xcsp_cumulative Function
julia
xcsp_cumulative(; origins, lengths, heights, condition)

Return true if the cumulative constraint is satisfied, false otherwise. The cumulative constraint is a global constraint operating on a set of tasks, defined by origin (starting times), length, and height. This constraint ensures that, at each point in time, the sum of the height of tasks that overlap that point, respects a numerical condition.

Arguments

  • origins::AbstractVector: list of origins of the tasks.

  • lengths::AbstractVector: list of lengths of the tasks.

  • heights::AbstractVector: list of heights of the tasks.

  • condition::Tuple: condition to check.

Variants

  • :cumulative: Global constraint operating on a set of tasks, defined by origin (starting times), length, and height. This constraint ensures that, at each point in time, the sum of the height of tasks that overlap that point, respects a numerical condition.
julia
concept(:cumulative, x; pair_vars, op, val)
 concept(:cumulative)(x; pair_vars, op, val)

Examples

julia
c = concept(:cumulative)
 
 c([1, 2, 3, 4, 5]; val = 1)
 c([1, 2, 2, 4, 5]; val = 1)
 c([1, 2, 3, 4, 5]; pair_vars = [3 2 5 4 2; 1 2 1 1 3], op =, val = 5)
-c([1, 2, 3, 4, 5]; pair_vars = [3 2 5 4 2; 1 2 1 1 3], op = <, val = 5)

source


# Constraints.xcsp_no_overlapFunction.
julia
xcsp_no_overlap(; origins, lengths, zero_ignored)

Return true if the no_overlap constraint is satisfied, false otherwise. The no_overlap constraint is a global constraint used in constraint programming, often in scheduling problems. It ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts.

Arguments

  • origins::AbstractVector: list of origins of the tasks.

  • lengths::AbstractVector: list of lengths of the tasks.

  • zero_ignored::Bool: whether to ignore zero-length tasks.

Variants

  • :no_overlap: The no_overlap constraint is a global constraint used in constraint programming, often in scheduling problems. It ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts.
julia
concept(:no_overlap, x; pair_vars, bool)
-concept(:no_overlap)(x; pair_vars, bool)
  • :no_overlap_no_zero: The no_overlap constraint is a global constraint used in constraint programming, often in scheduling problems. It ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts. This variant ignores zero-length tasks.
julia
concept(:no_overlap_no_zero, x; pair_vars)
-concept(:no_overlap_no_zero)(x; pair_vars)
  • :no_overlap_with_zero: The no_overlap constraint is a global constraint used in constraint programming, often in scheduling problems. It ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts. This variant includes zero-length tasks.
julia
concept(:no_overlap_with_zero, x; pair_vars)
+c([1, 2, 3, 4, 5]; pair_vars = [3 2 5 4 2; 1 2 1 1 3], op = <, val = 5)

source

Constraints.xcsp_no_overlap Function
julia
xcsp_no_overlap(; origins, lengths, zero_ignored)

Return true if the no_overlap constraint is satisfied, false otherwise. The no_overlap constraint is a global constraint used in constraint programming, often in scheduling problems. It ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts.

Arguments

  • origins::AbstractVector: list of origins of the tasks.

  • lengths::AbstractVector: list of lengths of the tasks.

  • zero_ignored::Bool: whether to ignore zero-length tasks.

Variants

  • :no_overlap: Global constraint operating on a set of tasks, defined by origin (starting times), and length. This constraint ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts. Often used in scheduling problems.
julia
concept(:no_overlap, x; pair_vars, bool)
+concept(:no_overlap)(x; pair_vars, bool)
  • :no_overlap_no_zero: Global constraint operating on a set of tasks, defined by origin (starting times), and length. This constraint ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts. This variant ignores zero-length tasks. Often used in scheduling problems.
julia
concept(:no_overlap_no_zero, x; pair_vars)
+concept(:no_overlap_no_zero)(x; pair_vars)
  • :no_overlap_with_zero: Global constraint operating on a set of tasks, defined by origin (starting times), and length. This constraint ensures that tasks do not overlap in time, i.e., for any two tasks, either the first task finishes before the second task starts, or the second task finishes before the first task starts. This variant includes zero-length tasks. Often used in scheduling problems.
julia
concept(:no_overlap_with_zero, x; pair_vars)
 concept(:no_overlap_with_zero)(x; pair_vars)

Examples

julia
c = concept(:no_overlap)
 
 c([1, 2, 3, 4, 5])
@@ -87,8 +87,8 @@
 c([1, 2, 4, 6, 3]; pair_vars = [1, 1, 1, 3, 1])
 c([1, 2, 4, 6, 3]; pair_vars = [1, 1, 3, 1, 1])
 c([1, 1, 1, 3, 5, 2, 7, 7, 5, 12, 8, 7]; pair_vars = [2, 4, 1, 4 ,2 ,3, 5, 1, 2, 3, 3, 2], dim = 3)
-c([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]; pair_vars = [2, 4, 1, 4 ,2 ,3, 5, 1, 2, 3, 3, 2], dim = 3)

source


- +c([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]; pair_vars = [2, 4, 1, 4 ,2 ,3, 5, 1, 2, 3, 3, 2], dim = 3)

source

+ \ No newline at end of file diff --git a/dev/constraints/27_graph_constraints.html b/dev/constraints/27_graph_constraints.html index 860af05..a4b025c 100644 --- a/dev/constraints/27_graph_constraints.html +++ b/dev/constraints/27_graph_constraints.html @@ -4,27 +4,27 @@ Constraints.jl: Streamlining Constraint Definition and Integration in Julia | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

Constraints on Graphs

# Constraints.xcsp_circuitFunction.
julia
xcsp_circuit(; list, size)

Return true if the circuit constraint is satisfied, false otherwise. The circuit constraint is a global constraint used in constraint programming, often in routing problems. It ensures that the values of a list of variables form a circuit, i.e., a sequence where each value is the index of the next value in the sequence, and the sequence eventually loops back to the start.

Arguments

  • list::AbstractVector: list of values to check.

  • size::Int: size of the circuit.

Variants

  • :circuit: The circuit constraint is a global constraint used in constraint programming, often in routing problems. It ensures that the values of a list of variables form a circuit, i.e., a sequence where each value is the index of the next value in the sequence, and the sequence eventually loops back to the start.
julia
concept(:circuit, x; op, val)
+    
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

Constraints on Graphs

Constraints.xcsp_circuit Function
julia
xcsp_circuit(; list, size)

Return true if the circuit constraint is satisfied, false otherwise. The circuit constraint is a global constraint ensuring that the values of x form a circuit, i.e., a sequence where each value is the index of the next value in the sequence, and the sequence eventually loops back to the start.

Arguments

  • list::AbstractVector: list of values to check.

  • size::Int: size of the circuit.

Variants

  • :circuit: Global constraint ensuring that the values of x form a circuit, i.e., a sequence where each value is the index of the next value in the sequence, and the sequence eventually loops back to the start. Often used for routing problems.
julia
concept(:circuit, x; op, val)
 concept(:circuit)(x; op, val)

Examples

julia
c = concept(:circuit)
 
 c([1, 2, 3, 4])
 c([2, 3, 4, 1])
 c([2, 3, 1, 4]; op = ==, val = 3)
-c([4, 3, 1, 3]; op = >, val = 0)

source


- +c([4, 3, 1, 3]; op = >, val = 0)

source

+ \ No newline at end of file diff --git a/dev/constraints/28_elementary_constraints.html b/dev/constraints/28_elementary_constraints.html index 279d76b..285c0d2 100644 --- a/dev/constraints/28_elementary_constraints.html +++ b/dev/constraints/28_elementary_constraints.html @@ -4,25 +4,25 @@ Constraints.jl: Streamlining Constraint Definition and Integration in Julia | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

Elementary Constraints

# Constraints.xcsp_instantiationFunction.
julia
xcsp_instantiation(; list, values)

Return true if the instantiation constraint is satisfied, false otherwise. The instantiation constraint is a global constraint used in constraint programming that ensures that a list of variables takes on a specific set of values in a specific order.

Arguments

  • list::AbstractVector: list of values to check.

  • values::AbstractVector: list of values to check against.

Variants

  • :instantiation: The instantiation constraint is a global constraint used in constraint programming that ensures that a list of variables takes on a specific set of values in a specific order.
julia
concept(:instantiation, x; pair_vars)
+    
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

Elementary Constraints

Constraints.xcsp_instantiation Function
julia
xcsp_instantiation(; list, values)

Return true if the instantiation constraint is satisfied, false otherwise. The instantiation constraint is a global constraint ensuring that x takes on a specific set of values in a specific order.

Arguments

  • list::AbstractVector: list of values to check.

  • values::AbstractVector: list of values to check against.

Variants

  • :instantiation: Global constraint ensuring that x takes on a specific set of values in a specific order.
julia
concept(:instantiation, x; pair_vars)
 concept(:instantiation)(x; pair_vars)

Examples

julia
c = concept(:instantiation)
 
 c([1, 2, 3, 4, 5]; pair_vars=[1, 2, 3, 4, 5])
-c([1, 2, 3, 4, 5]; pair_vars=[1, 2, 3, 4, 6])

source


- +c([1, 2, 3, 4, 5]; pair_vars=[1, 2, 3, 4, 6])

source

+ \ No newline at end of file diff --git a/dev/constraints/40_constraint_models.html b/dev/constraints/40_constraint_models.html index 680a44c..399c1cc 100644 --- a/dev/constraints/40_constraint_models.html +++ b/dev/constraints/40_constraint_models.html @@ -4,27 +4,27 @@ ConstraintModels.jl | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

ConstraintModels.jl

Documentation for ConstraintModels.jl.

# ConstraintModels.SudokuInstanceType.
julia
mutable struct SudokuInstance{T <: Integer} <: AbstractMatrix{T}

A struct for SudokuInstances, which is a subtype of AbstractMatrix.

julia
SudokuInstance(A::AbstractMatrix{T})
+    
Skip to content

ConstraintModels.jl

Documentation for ConstraintModels.jl.

ConstraintModels.SudokuInstance Type
julia
mutable struct SudokuInstance{T <: Integer} <: AbstractMatrix{T}

A struct for SudokuInstances, which is a subtype of AbstractMatrix.

julia
SudokuInstance(A::AbstractMatrix{T})
 SudokuInstance(::Type{T}, n::Int) # fill in blank sudoku of type T
 SudokuInstance(n::Int) # fill in blank sudoku of type Int
 SudokuInstance(::Type{T}) # fill in "standard" 9×9 sudoku of type T
 SudokuInstance() # fill in "standard" 9×9 sudoku of type Int
 SudokuInstance(n::Int, P::Pair{Tuple{Int, Int}, T}...) where {T <: Integer} # construct a sudoku given pairs of coordinates and values
-SudokuInstance(P::Pair{Tuple{Int, Int}, T}...) # again, default to 9×9 sudoku, constructing given pairs

Constructor functions for the SudokuInstance struct.

source


# ConstraintModels.SudokuInstanceMethod.
julia
SudokuInstance(X::Dictionary)

Construct a SudokuInstance with the values X of a solver as input.

source


# Base.Multimedia.displayMethod.
julia
display(io::IO, S::SudokuInstance)
-display(S::SudokuInstance) # default to stdout

Displays an n×n SudokuInstance.

source


# Base.Multimedia.displayMethod.
julia
Base.display(X, Val(:sudoku))

Extends Base.display to a sudoku configuration.

source


# Base.Multimedia.displayMethod.
julia
Base.display(S::SudokuInstance)

Extends Base.display to SudokuInstance.

source


# Base.Multimedia.displayMethod.
julia
Base.display(X::Dictionary)

Extends Base.display to a sudoku configuration.

source


# Base.sizeMethod.
julia
Base.size(S::SudokuInstance)

Extends Base.size for SudokuInstance.

source


# ConstraintModels._format_lineMethod.
julia
_format_line(r, M)

Format line of a sudoku grid.

source


# ConstraintModels._format_line_segmentMethod.
julia
_format_line_segment(r, col_pos, M)

Format line segment of a sudoku grid.

source


# ConstraintModels._format_valMethod.
julia
_format_val(a)

Format an integer a into a string for SudokuInstance.

source


# ConstraintModels._get_sep_lineMethod.
julia
_get_sep_line(s, pos_row, M)

Return a line separator.

source


# ConstraintModels.chemical_equilibriumMethod.
julia
chemical_equilibrium(atoms_compounds, elements_weights, standard_free_energy; modeler = :JuMP)

Warning

Even the structure to model problems with continuous domains is available, the default solver is not yet equiped to solve such problems efficiently.

From Wikipedia

In a chemical reaction, chemical equilibrium is the state in which both the reactants and products are present in concentrations which have no further tendency to change with time, so that there is no observable change in the properties of the system. This state results when the forward reaction proceeds at the same rate as the reverse reaction. The reaction rates of the forward and backward reactions are generally not zero, but they are equal. Thus, there are no net changes in the concentrations of the reactants and products. Such a state is known as dynamic equilibrium.

source


# ConstraintModels.golombFunction.
julia
golomb(n, L=n²)

Model the Golomb problem of n marks on the ruler 0:L. The modeler argument accepts :raw, and :JuMP (default), which refer respectively to the solver internal model, the MathOptInterface model, and the JuMP model.

source


# ConstraintModels.magic_squareMethod.
julia
magic_square(n; modeler = :JuMP)

Create a model for the magic square problem of order n. The modeler argument accepts :JuMP (default), which refer to the solver the JuMP model.

source


# ConstraintModels.mincutMethod.
julia
mincut(graph; source, sink, interdiction =0, modeler = :JuMP)

Compute the minimum cut of a graph.

Arguments:

  • graph: Any matrix <: AbstractMatrix that describes the capacities of the graph

  • source: Id of the source node; must be set

  • sink: Id of the sink node; must be set

  • interdiction: indicates the number of forbidden links

  • modeler: Default to :JuMP.

source


# ConstraintModels.n_queensMethod.
julia
n_queens(n; modeler = :JuMP)

Create a model for the n-queens problem with n queens. The modeler argument accepts :JuMP (default), which refer to the JuMP model.

source


# ConstraintModels.qapMethod.
julia
qap(n, weigths, distances; modeler = :JuMP)

Modelize an instance of the Quadractic Assignment Problem with

  • n: number of both facilities and locations

  • weights: Matrix of the weights of each pair of facilities

  • distances: Matrix of distances between locations

  • modeler: Default to :JuMP. No other modeler available for now.

From Wikipedia

There are a set of n facilities and a set of n locations. For each pair of locations, a distance is specified and for each pair of facilities a weight or flow is specified (e.g., the amount of supplies transported between the two facilities). The problem is to assign all facilities to different locations with the goal of minimizing the sum of the distances multiplied by the corresponding flows.

source


# ConstraintModels.sudokuMethod.
julia
sudoku(n; start= Dictionary{Int, Int}(), modeler = :JuMP)

Create a model for the sudoku problem of domain 1:n² with optional starting values. The modeler argument accepts :raw, :MOI, and :JuMP (default), which refer respectively to the solver internal model, the MathOptInterface model, and the JuMP model.

julia
# Construct a JuMP model `m` and its associated matrix `grid` for sudoku 9×9
+SudokuInstance(P::Pair{Tuple{Int, Int}, T}...) # again, default to 9×9 sudoku, constructing given pairs

Constructor functions for the SudokuInstance struct.

source

ConstraintModels.SudokuInstance Method
julia
SudokuInstance(X::Dictionary)

Construct a SudokuInstance with the values X of a solver as input.

source

Base.Multimedia.display Method
julia
display(io::IO, S::SudokuInstance)
+display(S::SudokuInstance) # default to stdout

Displays an n×n SudokuInstance.

source

Base.Multimedia.display Method
julia
Base.display(X, Val(:sudoku))

Extends Base.display to a sudoku configuration.

source

Base.Multimedia.display Method
julia
Base.display(S::SudokuInstance)

Extends Base.display to SudokuInstance.

source

Base.Multimedia.display Method
julia
Base.display(X::Dictionary)

Extends Base.display to a sudoku configuration.

source

Base.size Method
julia
Base.size(S::SudokuInstance)

Extends Base.size for SudokuInstance.

source

ConstraintModels._format_line Method
julia
_format_line(r, M)

Format line of a sudoku grid.

source

ConstraintModels._format_line_segment Method
julia
_format_line_segment(r, col_pos, M)

Format line segment of a sudoku grid.

source

ConstraintModels._format_val Method
julia
_format_val(a)

Format an integer a into a string for SudokuInstance.

source

ConstraintModels._get_sep_line Method
julia
_get_sep_line(s, pos_row, M)

Return a line separator.

source

ConstraintModels.chemical_equilibrium Method
julia
chemical_equilibrium(atoms_compounds, elements_weights, standard_free_energy; modeler = :JuMP)

Warning

Even the structure to model problems with continuous domains is available, the default solver is not yet equiped to solve such problems efficiently.

From Wikipedia

In a chemical reaction, chemical equilibrium is the state in which both the reactants and products are present in concentrations which have no further tendency to change with time, so that there is no observable change in the properties of the system. This state results when the forward reaction proceeds at the same rate as the reverse reaction. The reaction rates of the forward and backward reactions are generally not zero, but they are equal. Thus, there are no net changes in the concentrations of the reactants and products. Such a state is known as dynamic equilibrium.

source

ConstraintModels.golomb Function
julia
golomb(n, L=n²)

Model the Golomb problem of n marks on the ruler 0:L. The modeler argument accepts :raw, and :JuMP (default), which refer respectively to the solver internal model, the MathOptInterface model, and the JuMP model.

source

ConstraintModels.magic_square Method
julia
magic_square(n; modeler = :JuMP)

Create a model for the magic square problem of order n. The modeler argument accepts :JuMP (default), which refer to the solver the JuMP model.

source

ConstraintModels.mincut Method
julia
mincut(graph; source, sink, interdiction =0, modeler = :JuMP)

Compute the minimum cut of a graph.

Arguments:

  • graph: Any matrix <: AbstractMatrix that describes the capacities of the graph

  • source: Id of the source node; must be set

  • sink: Id of the sink node; must be set

  • interdiction: indicates the number of forbidden links

  • modeler: Default to :JuMP.

source

ConstraintModels.n_queens Method
julia
n_queens(n; modeler = :JuMP)

Create a model for the n-queens problem with n queens. The modeler argument accepts :JuMP (default), which refer to the JuMP model.

source

ConstraintModels.qap Method
julia
qap(n, weigths, distances; modeler = :JuMP)

Modelize an instance of the Quadractic Assignment Problem with

  • n: number of both facilities and locations

  • weights: Matrix of the weights of each pair of facilities

  • distances: Matrix of distances between locations

  • modeler: Default to :JuMP. No other modeler available for now.

From Wikipedia

There are a set of n facilities and a set of n locations. For each pair of locations, a distance is specified and for each pair of facilities a weight or flow is specified (e.g., the amount of supplies transported between the two facilities). The problem is to assign all facilities to different locations with the goal of minimizing the sum of the distances multiplied by the corresponding flows.

source

ConstraintModels.sudoku Method
julia
sudoku(n; start= Dictionary{Int, Int}(), modeler = :JuMP)

Create a model for the sudoku problem of domain 1:n² with optional starting values. The modeler argument accepts :raw, :MOI, and :JuMP (default), which refer respectively to the solver internal model, the MathOptInterface model, and the JuMP model.

julia
# Construct a JuMP model `m` and its associated matrix `grid` for sudoku 9×9
 m, grid = sudoku(3)
 
 # Same with a starting instance
@@ -46,8 +46,8 @@
 
 # Retrieve and display the values
 solution = value.(grid)
-display(solution, Val(:sudoku))

source


- +display(solution, Val(:sudoku))

source

+ \ No newline at end of file diff --git a/dev/constraints/60_constraint_commons.html b/dev/constraints/60_constraint_commons.html index 479fb92..8e6765b 100644 --- a/dev/constraints/60_constraint_commons.html +++ b/dev/constraints/60_constraint_commons.html @@ -4,20 +4,20 @@ ConstraintCommons.jl | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

ConstraintCommons.jl

ConstraintCommons.jl is an essential package within the Julia Constraints ecosystem designed to facilitate the development and interoperability of constraint programming solutions in Julia. It serves as a foundational layer that provides shared structures, abstract types, functions, and generic methods utilized by both basic feature packages and learning-oriented packages.

Only advanced users or package developers are likely to use it. The package covers parameters, (regular) languages, Core or Base methods extensions, sampling, extrema, and dictionaries.

Parameters

This section of the package list or extract parameters based on the XCSP3-core specifications. Note that, for the foreseeable future, the default constraints specification will follow these specifications.

# ConstraintCommons.USUAL_CONSTRAINT_PARAMETERSConstant.
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
+    
Skip to content

ConstraintCommons.jl

ConstraintCommons.jl is an essential package within the Julia Constraints ecosystem designed to facilitate the development and interoperability of constraint programming solutions in Julia. It serves as a foundational layer that provides shared structures, abstract types, functions, and generic methods utilized by both basic feature packages and learning-oriented packages.

Only advanced users or package developers are likely to use it. The package covers parameters, (regular) languages, Core or Base methods extensions, sampling, extrema, and dictionaries.

Parameters

This section of the package list or extract parameters based on the XCSP3-core specifications. Note that, for the foreseeable future, the default constraints specification will follow these specifications.

ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS Constant
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
     :bool, # boolean parameter
     :dim, # dimension, an integer parameter used along the pair_vars or vals parameters
     :id, # index to target one variable in the input vector
@@ -26,8 +26,8 @@
     :pair_vars, # a list of parameters that are paired with each variable in the input vector
     :val, # one scalar value
     :vals, # a list of scalar values (independent of the input vector size)
-]

source


# ConstraintCommons.extract_parametersFunction.
julia
extract_parameters(m::Union{Method, Function}; parameters)

Extracts the intersection between the kargs of m and parameters (defaults to USUAL_CONSTRAINT_PARAMETERS).

source

julia
extract_parameters(s::Symbol, constraints_dict=USUAL_CONSTRAINTS; parameters=ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS)

Return the parameters of the constraint s in constraints_dict.

Arguments

  • s::Symbol: the constraint name.

  • constraints_dict::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

  • parameters::Vector{Symbol}: vector of parameters. Default is ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS.

Example

julia
extract_parameters(:all_different)

source


Performances

Bench Evolution ParametersChair Evolution Parameters

Languages

XCSP3 considers two kinds of structure to recognize languages as core constraints: Automata, Multivalued Decision Diagrams (MMDs).

# ConstraintCommons.AbstractMultivaluedDecisionDiagramType.
julia
AbstractMultivaluedDecisionDiagram

An abstract interface for Multivalued Decision Diagrams (MDD) used in Julia Constraints packages. Requirements:

  • accept(a<:AbstractMultivaluedDecisionDiagram, word): return true if a accepts word.

source


# ConstraintCommons.MDDType.
julia
MDD{S,T} <: AbstractMultivaluedDecisionDiagram

A minimal implementation of a multivalued decision diagram structure.

source


# ConstraintCommons.AbstractAutomatonType.
julia
AbstractAutomaton

An abstract interface for automata used in Julia Constraints packages. Requirements:

  • accept(a<:AbstractAutomaton, word): return true if a accepts word.

source


# ConstraintCommons.AutomatonType.
julia
Automaton{S, T, F <: Union{S, Vector{S}, Set{S}}} <: AbstractAutomaton

A minimal implementation of a deterministic automaton structure.

source


# ConstraintCommons.acceptFunction.
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source


# ConstraintCommons.at_endFunction.
julia
at_end(a::Automaton, s)

Internal method used by accept with Automaton.

source


Performances

Bench Evolution Automata
Chair Evolution Automata
Bench Evolution Diagrams
Chair Evolution Diagrams

Extensions

We extend some operations for Nothing and Symbol.

# ConstraintCommons.symconFunction.
julia
symcon(s1::Symbol, s2::Symbol, connector::AbstractString="_")

Extends * to Symbols multiplication by connecting the symbols by an _.

source


# ConstraintCommons.consinFunction.
julia
consin(::Any, ::Nothing)

Extends Base.in (or ) when the set is nothing. Returns false.

source


# ConstraintCommons.consisemptyFunction.
julia
consisempty(::Nothing)

Extends Base.isempty when the set is nothing. Returns true.

source


Performances

Bench Evolution Nothing
Chair Evolution Nothing
Bench Evolution Symbols
Chair Evolution Symbols

Sampling

During our constraint learning processes, we use sampling to efficiently make partial exploration of search spaces. The following are some examples of sampling utilities.

# ConstraintCommons.oversampleFunction.
julia
oversample(X, f)

Oversample elements of X until the boolean function f has as many true and false configurations.

source


Performances

Bench EvolutionChair Evolution

Extrema

We need to compute the difference between extrema of various kind of collections in several situations.

# ConstraintCommons.δ_extremaFunction.
julia
δ_extrema(X...)

Compute both the difference between the maximum and the minimum of over all the collections of X.

source


Performances

Bench EvolutionChair Evolution

Dictionaries

We provide the ever-useful incsert! function for dictionaries.

# ConstraintCommons.incsert!Function.
julia
incsert!(d::Union{AbstractDict, AbstractDictionary}, ind, val = 1)

Increase or insert a counter in a dictionary-based collection. The counter insertion defaults to val = 1.

source


Performances

Bench EvolutionChair Evolution
- +]

source

ConstraintCommons.extract_parameters Function
julia
extract_parameters(m::Union{Method, Function}; parameters)

Extracts the intersection between the kargs of m and parameters (defaults to USUAL_CONSTRAINT_PARAMETERS).

source

julia
extract_parameters(s::Symbol, constraints_dict=USUAL_CONSTRAINTS; parameters=ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS)

Return the parameters of the constraint s in constraints_dict.

Arguments

  • s::Symbol: the constraint name.

  • constraints_dict::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

  • parameters::Vector{Symbol}: vector of parameters. Default is ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS.

Example

julia
extract_parameters(:all_different)

source

Performances

Bench Evolution ParametersChair Evolution Parameters

Languages

XCSP3 considers two kinds of structure to recognize languages as core constraints: Automata, Multivalued Decision Diagrams (MMDs).

ConstraintCommons.AbstractMultivaluedDecisionDiagram Type
julia
AbstractMultivaluedDecisionDiagram

An abstract interface for Multivalued Decision Diagrams (MDD) used in Julia Constraints packages. Requirements:

  • accept(a<:AbstractMultivaluedDecisionDiagram, word): return true if a accepts word.

source

ConstraintCommons.MDD Type
julia
MDD{S,T} <: AbstractMultivaluedDecisionDiagram

A minimal implementation of a multivalued decision diagram structure.

source

ConstraintCommons.AbstractAutomaton Type
julia
AbstractAutomaton

An abstract interface for automata used in Julia Constraints packages. Requirements:

  • accept(a<:AbstractAutomaton, word): return true if a accepts word.

source

ConstraintCommons.Automaton Type
julia
Automaton{S, T, F <: Union{S, Vector{S}, Set{S}}} <: AbstractAutomaton

A minimal implementation of a deterministic automaton structure.

source

ConstraintCommons.accept Function
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

ConstraintCommons.at_end Function
julia
at_end(a::Automaton, s)

Internal method used by accept with Automaton.

source

Performances

Bench Evolution Automata
Chair Evolution Automata
Bench Evolution Diagrams
Chair Evolution Diagrams

Extensions

We extend some operations for Nothing and Symbol.

ConstraintCommons.symcon Function
julia
symcon(s1::Symbol, s2::Symbol, connector::AbstractString="_")

Extends * to Symbols multiplication by connecting the symbols by an _.

source

ConstraintCommons.consin Function
julia
consin(::Any, ::Nothing)

Extends Base.in (or ) when the set is nothing. Returns false.

source

ConstraintCommons.consisempty Function
julia
consisempty(::Nothing)

Extends Base.isempty when the set is nothing. Returns true.

source

Performances

Bench Evolution Nothing
Chair Evolution Nothing
Bench Evolution Symbols
Chair Evolution Symbols

Sampling

During our constraint learning processes, we use sampling to efficiently make partial exploration of search spaces. The following are some examples of sampling utilities.

ConstraintCommons.oversample Function
julia
oversample(X, f)

Oversample elements of X until the boolean function f has as many true and false configurations.

source

Performances

Bench EvolutionChair Evolution

Extrema

We need to compute the difference between extrema of various kind of collections in several situations.

ConstraintCommons.δ_extrema Function
julia
δ_extrema(X...)

Compute both the difference between the maximum and the minimum of over all the collections of X.

source

Performances

Bench EvolutionChair Evolution

Dictionaries

We provide the ever-useful incsert! function for dictionaries.

ConstraintCommons.incsert! Function
julia
incsert!(d::Union{AbstractDict, AbstractDictionary}, ind, val = 1)

Increase or insert a counter in a dictionary-based collection. The counter insertion defaults to val = 1.

source

Performances

Bench EvolutionChair Evolution
+ \ No newline at end of file diff --git a/dev/constraints/61_constraint_domains.html b/dev/constraints/61_constraint_domains.html index add3e3d..a75d976 100644 --- a/dev/constraints/61_constraint_domains.html +++ b/dev/constraints/61_constraint_domains.html @@ -4,54 +4,54 @@ ConstraintDomains.jl: Defining Variables and Exploring Domains | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

ConstraintDomains.jl: Defining Variables and Exploring Domains

ConstraintDomains.jl is the standard way to define variables and explore domains in the Julia Constraints ecosystem. This package can be used to specify both discrete and continuous domains. Explorations features are primarily related to learning about constraints, aka constraint learning.

Most users should use it through JuMP/MOI interfaces.

Commons

# ConstraintDomains.AbstractDomainType.
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

  • Base.∈(val, ::D)

  • Base.rand(::D)

  • Base.length(::D) that is the number of elements in a discrete domain, and the distance between bounds or similar for a continuous domain

Additionally, if the domain is used in a dynamic context, it can extend

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source


# ConstraintDomains.EmptyDomainType.
julia
EmptyDomain

A struct to handle yet to be defined domains.

source


# ConstraintDomains.domainFunction.
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+    
Skip to content

ConstraintDomains.jl: Defining Variables and Exploring Domains

ConstraintDomains.jl is the standard way to define variables and explore domains in the Julia Constraints ecosystem. This package can be used to specify both discrete and continuous domains. Explorations features are primarily related to learning about constraints, aka constraint learning.

Most users should use it through JuMP/MOI interfaces.

Commons

ConstraintDomains.AbstractDomain Type
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

  • Base.∈(val, ::D)

  • Base.rand(::D)

  • Base.length(::D) that is the number of elements in a discrete domain, and the distance between bounds or similar for a continuous domain

Additionally, if the domain is used in a dynamic context, it can extend

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source

ConstraintDomains.EmptyDomain Type
julia
EmptyDomain

A struct to handle yet to be defined domains.

source

ConstraintDomains.domain Function
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
 domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

julia
domain(values)
 domain(range::R) where {T <: Real, R <: AbstractRange{T}}

Construct either a SetDomain or a RangeDomain.

julia
d1 = domain(1:5)
 d2 = domain([53.69, 89.2, 0.12])
 d3 = domain([2//3, 89//123])
 d4 = domain(4.3)
-d5 = domain(1,42,86.9)

source


# ConstraintDomains.domain_sizeFunction.
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source


# ConstraintDomains.get_domainFunction.
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source


# ConstraintDomains.to_domainsFunction.
julia
to_domains(args...)

Convert various arguments into valid domains format.

source


Extension to Base module

# Base.inFunction.
julia
x::Variable constraint
-value  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source


# Base.randFunction.
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source


# Base.isemptyFunction.
julia
Base.isempty(d <: AbstractDomain)

Fallback method for isempty(d) that return length(d) == 0 which default to 0.

source


# Base.randFunction.
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source


# Base.stringFunction.
julia
Base.string(D::Vector{<:AbstractDomain})
-Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source


Performances

Bench Evolution CommonChair Evolution Common

Continuous

# ConstraintDomains.ContinuousDomainType.
julia
ContinuousDomain{T <: Real} <: AbstractDomain

An abstract supertype for all continuous domains.

source


# ConstraintDomains.IntervalsType.
julia
Intervals{T <: Real} <: ContinuousDomain{T}

An encapsuler to store a vector of PatternFolds.Interval. Dynamic changes to Intervals are not handled yet.

source


# ConstraintDomains.domainFunction.
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+d5 = domain(1,42,86.9)

source

ConstraintDomains.domain_size Function
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

ConstraintDomains.get_domain Function
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

ConstraintDomains.to_domains Function
julia
to_domains(args...)

Convert various arguments into valid domains format.

source

Extension to Base module

Base.in Function
julia
x::Variable constraint
+value  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source

Base.rand Function
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

Base.isempty Function
julia
Base.isempty(d <: AbstractDomain)

Fallback method for isempty(d) that return length(d) == 0 which default to 0.

source

Base.rand Function
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

Base.string Function
julia
Base.string(D::Vector{<:AbstractDomain})
+Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source

Performances

Bench Evolution CommonChair Evolution Common

Continuous

ConstraintDomains.ContinuousDomain Type
julia
ContinuousDomain{T <: Real} <: AbstractDomain

An abstract supertype for all continuous domains.

source

ConstraintDomains.Intervals Type
julia
Intervals{T <: Real} <: ContinuousDomain{T}

An encapsuler to store a vector of PatternFolds.Interval. Dynamic changes to Intervals are not handled yet.

source

ConstraintDomains.domain Function
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
 domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

julia
domain(values)
 domain(range::R) where {T <: Real, R <: AbstractRange{T}}

Construct either a SetDomain or a RangeDomain.

julia
d1 = domain(1:5)
 d2 = domain([53.69, 89.2, 0.12])
 d3 = domain([2//3, 89//123])
 d4 = domain(4.3)
-d5 = domain(1,42,86.9)

source


# ConstraintDomains.domain_sizeFunction.
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source


# ConstraintDomains.merge_domainsFunction.
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source


# ConstraintDomains.intersect_domainsFunction.
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source


# ConstraintDomains.intersect_domains!Function.
julia
intersect_domains!(is, i, new_itvls)

Compute the intersections of a domain with an interval and store the results in new_itvls.

Arguments

  • is::IS: a collection of intervals.

  • i::I: an interval.

  • new_itvls::Vector{I}: a vector to store the results.

source


# ConstraintDomains.sizeFunction.
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source


Extension to Base module

# Base.lengthFunction.
julia
length(layer)

Return the number of operations in a layer.

source

julia
Base.length(icn)

Return the total number of operations of an ICN.

source

julia
Base.rand(d <: AbstractDomain)

Fallback method for length(d) that return 0.

source

julia
Base.length(itv::Intervals)

Return the sum of the length of each interval in itv.

source

julia
Base.length(d::D) where D <: DiscreteDomain

Return the number of points in d.

source


# Base.randFunction.
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source


# Base.inFunction.
julia
x::Variable constraint
-value  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source


# Base.stringFunction.
julia
Base.string(D::Vector{<:AbstractDomain})
-Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source


Performances

Bench Evolution ContinuousChair Evolution Continuous

Discrete

# ConstraintDomains.DiscreteDomainType.
julia
DiscreteDomain{T <: Number} <: AbstractDomain

An abstract supertype for discrete domains (set, range).

source


# ConstraintDomains.SetDomainType.
julia
SetDomain{T <: Number} <: DiscreteDomain{T}

Domain that stores discrete values as a set of (unordered) points.

source


# ConstraintDomains.RangeDomainType.
julia
RangeDomain

A discrete domain defined by a range <: AbstractRange{Real}. As ranges are immutable in Julia, changes in RangeDomain must use set_domain!.

source


# ConstraintDomains.ArbitraryDomainFunction.
julia
ArbitraryDomain{T} <: DiscreteDomain{T}

A domain type that stores arbitrary values, possibly non numeric, of type T.

source


# ConstraintDomains.domainFunction.
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+d5 = domain(1,42,86.9)

source

ConstraintDomains.domain_size Function
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

ConstraintDomains.merge_domains Function
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source

ConstraintDomains.intersect_domains Function
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

ConstraintDomains.intersect_domains! Function
julia
intersect_domains!(is, i, new_itvls)

Compute the intersections of a domain with an interval and store the results in new_itvls.

Arguments

  • is::IS: a collection of intervals.

  • i::I: an interval.

  • new_itvls::Vector{I}: a vector to store the results.

source

ConstraintDomains.size Function
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source

Extension to Base module

Base.length Function
julia
length(layer)

Return the number of operations in a layer.

source

julia
Base.length(icn)

Return the total number of operations of an ICN.

source

julia
Base.rand(d <: AbstractDomain)

Fallback method for length(d) that return 0.

source

julia
Base.length(itv::Intervals)

Return the sum of the length of each interval in itv.

source

julia
Base.length(d::D) where D <: DiscreteDomain

Return the number of points in d.

source

Base.rand Function
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

Base.in Function
julia
x::Variable constraint
+value  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source

Base.string Function
julia
Base.string(D::Vector{<:AbstractDomain})
+Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source

Performances

Bench Evolution ContinuousChair Evolution Continuous

Discrete

ConstraintDomains.DiscreteDomain Type
julia
DiscreteDomain{T <: Number} <: AbstractDomain

An abstract supertype for discrete domains (set, range).

source

ConstraintDomains.SetDomain Type
julia
SetDomain{T <: Number} <: DiscreteDomain{T}

Domain that stores discrete values as a set of (unordered) points.

source

ConstraintDomains.RangeDomain Type
julia
RangeDomain

A discrete domain defined by a range <: AbstractRange{Real}. As ranges are immutable in Julia, changes in RangeDomain must use set_domain!.

source

ConstraintDomains.ArbitraryDomain Function
julia
ArbitraryDomain{T} <: DiscreteDomain{T}

A domain type that stores arbitrary values, possibly non numeric, of type T.

source

ConstraintDomains.domain Function
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
 domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

julia
domain(values)
 domain(range::R) where {T <: Real, R <: AbstractRange{T}}

Construct either a SetDomain or a RangeDomain.

julia
d1 = domain(1:5)
 d2 = domain([53.69, 89.2, 0.12])
 d3 = domain([2//3, 89//123])
 d4 = domain(4.3)
-d5 = domain(1,42,86.9)

source


# ConstraintDomains.domain_sizeFunction.
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source


# ConstraintDomains.add!Function.
julia
add!(d::SetDomain, value)

Add value to the list of points in d.

source


# ConstraintDomains.merge_domainsFunction.
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source


# ConstraintDomains.intersect_domainsFunction.
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source


# ConstraintDomains.sizeFunction.
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source


Extension to Base module

# Base.delete!Function.
julia
Base.delete!(d::SetDomain, value)(d::SetDomain, value)

Delete value from the list of points in d.

source


# Base.lengthFunction.
julia
length(layer)

Return the number of operations in a layer.

source

julia
Base.length(icn)

Return the total number of operations of an ICN.

source

julia
Base.rand(d <: AbstractDomain)

Fallback method for length(d) that return 0.

source

julia
Base.length(itv::Intervals)

Return the sum of the length of each interval in itv.

source

julia
Base.length(d::D) where D <: DiscreteDomain

Return the number of points in d.

source


# Base.randFunction.
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source


# Base.inFunction.
julia
x::Variable constraint
-value  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source


# Base.stringFunction.
julia
Base.string(D::Vector{<:AbstractDomain})
-Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source


Performances

Bench Evolution DiscreteChair Evolution Discrete

General

# Base.eltypeFunction.
julia
Base.eltype(::AbstractDomain)

Extend eltype for domains.

source


# Base.convertFunction.
julia
Base.convert(::Type{Union{Intervals, RangeDomain}}, d::Union{Intervals, RangeDomain})

Extends Base.convert for domains.

source


Exploration

# ConstraintDomains.ExploreSettingsType.
julia
ExploreSettings(domains; 
+d5 = domain(1,42,86.9)

source

ConstraintDomains.domain_size Function
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

ConstraintDomains.add! Function
julia
add!(d::SetDomain, value)

Add value to the list of points in d.

source

ConstraintDomains.merge_domains Function
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source

ConstraintDomains.intersect_domains Function
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

ConstraintDomains.size Function
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source

Extension to Base module

Base.delete! Function
julia
Base.delete!(d::SetDomain, value)(d::SetDomain, value)

Delete value from the list of points in d.

source

Base.length Function
julia
length(layer)

Return the number of operations in a layer.

source

julia
Base.length(icn)

Return the total number of operations of an ICN.

source

julia
Base.rand(d <: AbstractDomain)

Fallback method for length(d) that return 0.

source

julia
Base.length(itv::Intervals)

Return the sum of the length of each interval in itv.

source

julia
Base.length(d::D) where D <: DiscreteDomain

Return the number of points in d.

source

Base.rand Function
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

Base.in Function
julia
x::Variable constraint
+value  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source

Base.string Function
julia
Base.string(D::Vector{<:AbstractDomain})
+Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source

Performances

Bench Evolution DiscreteChair Evolution Discrete

General

Base.eltype Function
julia
Base.eltype(::AbstractDomain)

Extend eltype for domains.

source

Base.convert Function
julia
Base.convert(::Type{Union{Intervals, RangeDomain}}, d::Union{Intervals, RangeDomain})

Extends Base.convert for domains.

source

Exploration

ConstraintDomains.ExploreSettings Type
julia
ExploreSettings(domains; 
                 complete_search_limit = 10^6, 
                 max_samplings = sum(domain_size, domains), 
                 search = :flexible, 
-                solutions_limit = floor(Int, sqrt(max_samplings)))

Create an ExploreSettings object to configure the exploration of a search space composed of a collection of domains.

Arguments

  • domains: A collection of domains to be explored.

  • complete_search_limit: An integer specifying the maximum limit for complete search iterations. Default is 10^6.

  • max_samplings: An integer specifying the maximum number of samplings. Default is the sum of domain sizes.

  • search: A symbol indicating the type of search to perform. Default is :flexible.

  • solutions_limit: An integer specifying the limit on the number of solutions. Default is the floor of the square root of max_samplings.

Returns

  • ExploreSettings object with the specified settings.

source


# ConstraintDomains._exploreFunction.
julia
_explore(args...)

Internals of the explore function. Behavior is automatically adjusted on the kind of exploration: :flexible, :complete, :partial.

source


# ConstraintDomains.exploreFunction.
julia
explore(domains, concept; settings = ExploreSettings(domains), parameters...)

Search (a part of) a search space and return a pair of vectors of configurations: (solutions, non_solutions). The exploration behavior is determined based on the settings.

Arguments

  • domains: A collection of domains to be explored.

  • concept: The concept representing the constraint to be targeted.

  • settings: An optional ExploreSettings object to configure the exploration. Default is ExploreSettings(domains).

  • parameters...: Additional parameters for the concept.

Returns

  • A tuple of sets: (solutions, non_solutions).

source


Performances

Bench Evolution ExplorationChair Evolution Exploration

Parameters

# ConstraintDomains.BoolParameterDomainType.
julia
BoolParameterDomain <: AbstractDomain

A domain to store boolean values. It is used to generate random parameters.

source


# ConstraintDomains.DimParameterDomainType.
julia
DimParameterDomain <: AbstractDomain

A domain to store dimensions. It is used to generate random parameters.

source


# ConstraintDomains.IdParameterDomainType.
julia
IdParameterDomain <: AbstractDomain

A domain to store ids. It is used to generate random parameters.

source


# ConstraintDomains.FakeAutomatonType.
julia
FakeAutomaton{T} <: ConstraintCommons.AbstractAutomaton

A structure to generate pseudo automaton enough for parameter exploration.

source


# ConstraintCommons.acceptFunction.
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source


# ConstraintDomains.fake_automatonFunction.
julia
fake_automaton(d)

Construct a FakeAutomaton.

source


# ConstraintDomains.LanguageParameterDomainType.
julia
LanguageParameterDomain <: AbstractDomain

A domain to store languages. It is used to generate random parameters.

source


# ConstraintDomains.OpParameterDomainType.
julia
OpParameterDomain{T} <: AbstractDomain

A domain to store operators. It is used to generate random parameters.

source


# ConstraintDomains.PairVarsParameterDomainType.
julia
PairVarsParameterDomain{T} <: AbstractDomain

A domain to store values paired with variables. It is used to generate random parameters.

source


# ConstraintDomains.ValParameterDomainType.
julia
ValParameterDomain{T} <: AbstractDomain

A domain to store one value. It is used to generate random parameters.

source


# ConstraintDomains.ValsParameterDomainType.
julia
ValsParameterDomain{T} <: AbstractDomain

A domain to store values. It is used to generate random parameters.

source


# Base.randFunction.
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source


# ConstraintDomains.generate_parametersFunction.
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source


- + solutions_limit = floor(Int, sqrt(max_samplings)))

Create an ExploreSettings object to configure the exploration of a search space composed of a collection of domains.

Arguments

  • domains: A collection of domains to be explored.

  • complete_search_limit: An integer specifying the maximum limit for complete search iterations. Default is 10^6.

  • max_samplings: An integer specifying the maximum number of samplings. Default is the sum of domain sizes.

  • search: A symbol indicating the type of search to perform. Default is :flexible.

  • solutions_limit: An integer specifying the limit on the number of solutions. Default is the floor of the square root of max_samplings.

Returns

  • ExploreSettings object with the specified settings.

source

ConstraintDomains._explore Function
julia
_explore(args...)

Internals of the explore function. Behavior is automatically adjusted on the kind of exploration: :flexible, :complete, :partial.

source

ConstraintDomains.explore Function
julia
explore(domains, concept; settings = ExploreSettings(domains), parameters...)

Search (a part of) a search space and return a pair of vectors of configurations: (solutions, non_solutions). The exploration behavior is determined based on the settings.

Arguments

  • domains: A collection of domains to be explored.

  • concept: The concept representing the constraint to be targeted.

  • settings: An optional ExploreSettings object to configure the exploration. Default is ExploreSettings(domains).

  • parameters...: Additional parameters for the concept.

Returns

  • A tuple of sets: (solutions, non_solutions).

source

Performances

Bench Evolution ExplorationChair Evolution Exploration

Parameters

ConstraintDomains.BoolParameterDomain Type
julia
BoolParameterDomain <: AbstractDomain

A domain to store boolean values. It is used to generate random parameters.

source

ConstraintDomains.DimParameterDomain Type
julia
DimParameterDomain <: AbstractDomain

A domain to store dimensions. It is used to generate random parameters.

source

ConstraintDomains.IdParameterDomain Type
julia
IdParameterDomain <: AbstractDomain

A domain to store ids. It is used to generate random parameters.

source

ConstraintDomains.FakeAutomaton Type
julia
FakeAutomaton{T} <: ConstraintCommons.AbstractAutomaton

A structure to generate pseudo automaton enough for parameter exploration.

source

ConstraintCommons.accept Function
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

ConstraintDomains.fake_automaton Function
julia
fake_automaton(d)

Construct a FakeAutomaton.

source

ConstraintDomains.LanguageParameterDomain Type
julia
LanguageParameterDomain <: AbstractDomain

A domain to store languages. It is used to generate random parameters.

source

ConstraintDomains.OpParameterDomain Type
julia
OpParameterDomain{T} <: AbstractDomain

A domain to store operators. It is used to generate random parameters.

source

ConstraintDomains.PairVarsParameterDomain Type
julia
PairVarsParameterDomain{T} <: AbstractDomain

A domain to store values paired with variables. It is used to generate random parameters.

source

ConstraintDomains.ValParameterDomain Type
julia
ValParameterDomain{T} <: AbstractDomain

A domain to store one value. It is used to generate random parameters.

source

ConstraintDomains.ValsParameterDomain Type
julia
ValsParameterDomain{T} <: AbstractDomain

A domain to store values. It is used to generate random parameters.

source

Base.rand Function
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

ConstraintDomains.generate_parameters Function
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source

+ \ No newline at end of file diff --git a/dev/constraints/62_constraints_jl.html b/dev/constraints/62_constraints_jl.html index 42928d6..2c8fde2 100644 --- a/dev/constraints/62_constraints_jl.html +++ b/dev/constraints/62_constraints_jl.html @@ -4,20 +4,20 @@ Interacting with Constraints in Julia | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Interacting with Constraints in Julia

Constraints.jl is a pivotal package within Julia Constraints, designed to facilitate the definition, manipulation, and application of constraints in constraint programming (CP).

It also acts as a catalog of various information and features learned about constraints by the learning part of the ecosystem. Per design, we only store the practical information extracted by those tools and not the heavy machinery.

Usual Parameters

The usual constraints of Julia Constraints are heavily inspired by the core constraints of the XCSP3-core standard. The main difference lies in the name chosen to describe the different parameters those core constraints can have.

In XCSP3, the parameters are described based on their roles, which the user can find as keyword argument in the xcsp_ prefixed collection of constraints (for instance xcsp_all_different). In our the Julia Constraints API (JC-API), the keyword arguments correspond to the nature of each parameter.

# ConstraintCommons.USUAL_CONSTRAINT_PARAMETERSConstant.
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
+    
Skip to content

Interacting with Constraints in Julia

Constraints.jl is a pivotal package within Julia Constraints, designed to facilitate the definition, manipulation, and application of constraints in constraint programming (CP).

It also acts as a catalog of various information and features learned about constraints by the learning part of the ecosystem. Per design, we only store the practical information extracted by those tools and not the heavy machinery.

Usual Parameters

The usual constraints of Julia Constraints are heavily inspired by the core constraints of the XCSP3-core standard. The main difference lies in the name chosen to describe the different parameters those core constraints can have.

In XCSP3, the parameters are described based on their roles, which the user can find as keyword argument in the xcsp_ prefixed collection of constraints (for instance xcsp_all_different). In our the Julia Constraints API (JC-API), the keyword arguments correspond to the nature of each parameter.

ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS Constant
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
     :bool, # boolean parameter
     :dim, # dimension, an integer parameter used along the pair_vars or vals parameters
     :id, # index to target one variable in the input vector
@@ -26,8 +26,8 @@
     :pair_vars, # a list of parameters that are paired with each variable in the input vector
     :val, # one scalar value
     :vals, # a list of scalar values (independent of the input vector size)
-]

source


Concepts, Error Functions, and QUBO matrices

One major use of this collection of usual constraint is to extract the concept or the error function (error_f) of a given constraint.

# Constraints.conceptFunction.
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source

julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

  • s::Symbol: the constraint name.

  • args...: the arguments to apply the concept to.

  • kargs...: the keyword arguments to apply the concept to.

Example

julia
concept(:all_different, [1, 2, 3])

source


Note that the error function is a finer estimation of how much a constraint is violated or not. By default, the error_f method simply return 0. if the constraint is satisfied or 1. otherwise.

Efficient versions of error_r are either hand-coded or generated through CompositionalNetworks.jl.

# Constraints.error_fFunction.
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source


Finally, another use is to provide QUBO matrices of those usual constraints through QUBOConstraints.jl. The syntax and interface for this feature are still a work in progress.

Usual Constraints

We provide a couple of methods to navigate the usual constraints extracted from XCSP3-Core.

# Constraints.USUAL_CONSTRAINTSConstant.
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source


# Constraints.describeFunction.
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

  • constraints::Dict{Symbol,Constraint}: dictionary of constraints to describe. Default is USUAL_CONSTRAINTS.

  • width::Int: width of the table.

Example

julia
describe()

source


# Constraints.constraints_parametersFunction.
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_parameters()

source


# Constraints.constraints_descriptionsFunction.
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_descriptions()

source


- +]

source

Concepts, Error Functions, and QUBO matrices

One major use of this collection of usual constraint is to extract the concept or the error function (error_f) of a given constraint.

Constraints.concept Function
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source

julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

  • s::Symbol: the constraint name.

  • args...: the arguments to apply the concept to.

  • kargs...: the keyword arguments to apply the concept to.

Example

julia
concept(:all_different, [1, 2, 3])

source

Note that the error function is a finer estimation of how much a constraint is violated or not. By default, the error_f method simply return 0. if the constraint is satisfied or 1. otherwise.

Efficient versions of error_r are either hand-coded or generated through CompositionalNetworks.jl.

Constraints.error_f Function
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source

Finally, another use is to provide QUBO matrices of those usual constraints through QUBOConstraints.jl. The syntax and interface for this feature are still a work in progress.

Usual Constraints

We provide a couple of methods to navigate the usual constraints extracted from XCSP3-Core.

Constraints.USUAL_CONSTRAINTS Constant
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source

Constraints.describe Function
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

  • constraints::Dict{Symbol,Constraint}: dictionary of constraints to describe. Default is USUAL_CONSTRAINTS.

  • width::Int: width of the table.

Example

julia
describe()

source

Constraints.constraints_parameters Function
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_parameters()

source

Constraints.constraints_descriptions Function
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_descriptions()

source

+ \ No newline at end of file diff --git a/dev/cp/00_intro.html b/dev/cp/00_intro.html index cc6bee5..5cf553a 100644 --- a/dev/cp/00_intro.html +++ b/dev/cp/00_intro.html @@ -4,21 +4,21 @@ Welcome to Julia Constraints | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Welcome to Julia Constraints

An introductory post/chapter that provides an overview of the JuliaConstraint organization, its mission, and what readers can expect to learn from the content. Highlight the importance of Constraint Programming (CP) and optimization in solving real-world problems.

- +
Skip to content

Welcome to Julia Constraints

An introductory post/chapter that provides an overview of the JuliaConstraint organization, its mission, and what readers can expect to learn from the content. Highlight the importance of Constraint Programming (CP) and optimization in solving real-world problems.

+ \ No newline at end of file diff --git a/dev/cp/10_cp101.html b/dev/cp/10_cp101.html index cbd4e9d..50f9f55 100644 --- a/dev/cp/10_cp101.html +++ b/dev/cp/10_cp101.html @@ -4,21 +4,21 @@ Constraint Programming 101 | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Constraint Programming 101

What is Constraint Programming?

  • Define CP and its significance in solving combinatorial problems.

Basic Concepts and Terminology

  • Introduce key concepts such as constraints, domains, and variables.

How CP differs from other optimization techniques

  • Contrast with other methods like linear programming and metaheuristics.
- +
Skip to content

Constraint Programming 101

What is Constraint Programming?

  • Define CP and its significance in solving combinatorial problems.

Basic Concepts and Terminology

  • Introduce key concepts such as constraints, domains, and variables.

How CP differs from other optimization techniques

  • Contrast with other methods like linear programming and metaheuristics.
+ \ No newline at end of file diff --git a/dev/cp/20_opt.html b/dev/cp/20_opt.html index 2706500..ada8d72 100644 --- a/dev/cp/20_opt.html +++ b/dev/cp/20_opt.html @@ -4,21 +4,21 @@ Dive into Optimization | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Dive into Optimization

Understanding Optimization

  • Explanation of optimization, types of optimization problems (e.g., linear, nonlinear, integer programming).

Metaheuristics Overview

  • Introduce concepts like Genetic Algorithms, Simulated Annealing, and Tabu Search.

Mathematical Programming Basics

  • Cover the fundamentals of mathematical programming and its role in optimization.
- +
Skip to content

Dive into Optimization

Understanding Optimization

  • Explanation of optimization, types of optimization problems (e.g., linear, nonlinear, integer programming).

Metaheuristics Overview

  • Introduce concepts like Genetic Algorithms, Simulated Annealing, and Tabu Search.

Mathematical Programming Basics

  • Cover the fundamentals of mathematical programming and its role in optimization.
+ \ No newline at end of file diff --git a/dev/cp/30_getting_started.html b/dev/cp/30_getting_started.html index 0041887..2245806 100644 --- a/dev/cp/30_getting_started.html +++ b/dev/cp/30_getting_started.html @@ -4,29 +4,29 @@ Getting Started with Julia for CP and Optimization | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Getting Started with Julia for CP and Optimization

Why Julia?

  • Discuss the advantages of Julia for computational science and optimization, highlighting its performance and ease of use.

Setting Up Your Julia Environment

We encourage users to install Julia through juliaup, a version manager for the Julia language. Please look at the official Julia language download page for further information. Once installed, Julia can be used through various editors (Visual Studio Code), notebooks (Pluto.jl), or command-line (REPL).

Although a part of the CP solvers available within the Julia ecosystem have their own interface, we encourage users to use the JuMP modeling language if possible.

Julia Constraints host several solvers(' interfaces). Due to its flexibility in modeling and solving, we will use LocalSearchSolvers.jl through its JuMP interface CBLS.jl as the basic example. Note that depending on the targeted instances, available hardware, and expectations, it is not necessarily the best choice.

All along the documentation, we will try to provide syntax examples for different setup.

julia
using LocalSearchSolvers
julia
using JuMP, CBLS
julia
# TODO: Add other solvers

Your First Julia CP Model

We will start with a classic puzzle game and some of its not that simple variants: the Sudoku.

(From Wikipedia) In classic Sudoku, the objective is to fill a 9 × 9 grid with digits so that each column, each row, and each of the nine 3 × 3 subgrids that compose the grid (also called "boxes", "blocks", or "regions") contains all of the digits from 1 to 9. The puzzle setter provides a partially completed grid, which for a well-posed puzzle has a single solution.

Constraint Programming follows the model-and-solve approach. We first need to model our Sudoku problem.

julia
m = JuMP.Model(CBLS.Optimizer)
julia
# TODO: Add other solvers

But what are the basis of CP models? It is quite simple:

  1. A collection X=X1,,Xn of variables with each an associated domain.
julia
@variable(m, 1 X[1:9, 1:9]  9, Int)
julia
# TODO: Add other solvers
  1. A collection of predicates (called constraints) C=C1,,Cn over (subsets of) X.

When modeling problems as CP, one might define and use their own predicates. However, a large collection of already defined constraints exists. One, if not the most, iconic global constraint is called AllDifferent. It ensures that all variables take distinct values.

Sudoku puzzles can be defined using only this one constraint applied to different subsets of variables.

julia
for i in 1:9
+    
Skip to content

Getting Started with Julia for CP and Optimization

Why Julia?

  • Discuss the advantages of Julia for computational science and optimization, highlighting its performance and ease of use.

Setting Up Your Julia Environment

We encourage users to install Julia through juliaup, a version manager for the Julia language. Please look at the official Julia language download page for further information. Once installed, Julia can be used through various editors (Visual Studio Code), notebooks (Pluto.jl), or command-line (REPL).

Although a part of the CP solvers available within the Julia ecosystem have their own interface, we encourage users to use the JuMP modeling language if possible.

Julia Constraints host several solvers(' interfaces). Due to its flexibility in modeling and solving, we will use LocalSearchSolvers.jl through its JuMP interface CBLS.jl as the basic example. Note that depending on the targeted instances, available hardware, and expectations, it is not necessarily the best choice.

All along the documentation, we will try to provide syntax examples for different setup.

julia
using LocalSearchSolvers
julia
using JuMP, CBLS
julia
# TODO: Add other solvers

Your First Julia CP Model

We will start with a classic puzzle game and some of its not that simple variants: the Sudoku.

(From Wikipedia) In classic Sudoku, the objective is to fill a 9 × 9 grid with digits so that each column, each row, and each of the nine 3 × 3 subgrids that compose the grid (also called "boxes", "blocks", or "regions") contains all of the digits from 1 to 9. The puzzle setter provides a partially completed grid, which for a well-posed puzzle has a single solution.

Constraint Programming follows the model-and-solve approach. We first need to model our Sudoku problem.

julia
m = JuMP.Model(CBLS.Optimizer)
julia
# TODO: Add other solvers

But what are the basis of CP models? It is quite simple:

  1. A collection X=X1,,Xn of variables with each an associated domain.
julia
@variable(m, 1 X[1:9, 1:9]  9, Int)
julia
# TODO: Add other solvers
  1. A collection of predicates (called constraints) C=C1,,Cn over (subsets of) X.

When modeling problems as CP, one might define and use their own predicates. However, a large collection of already defined constraints exists. One, if not the most, iconic global constraint is called AllDifferent. It ensures that all variables take distinct values.

Sudoku puzzles can be defined using only this one constraint applied to different subsets of variables.

julia
for i in 1:9
         @constraint(m, X[i,:] in AllDifferent()) # rows
         @constraint(m, X[:,i] in AllDifferent()) # columns
-end
julia
# TODO: Add other solvers

The last series of AllDifferent constraint is less straight forward. We need to ensure that each 3 × 3 subgrid (block) is filled with distinct values.

julia
for i in 0:2, j in 0:2 # blocks
+end
julia
# TODO: Add other solvers

The last series of AllDifferent constraint is less straight forward. We need to ensure that each 3 × 3 subgrid (block) is filled with distinct values.

julia
for i in 0:2, j in 0:2 # blocks
     @constraint(
         m,
         vec(X[(3i+1):(3(i+1)), (3j+1):(3(j+1))]) in AllDifferent(),
     )
-end
julia
# TODO: Add other solvers

We can now simply run our solver to look for a feasible solution.

julia
optimize!(m)

Note that this is heuristic solver, we might not get a feasible solution! Let's check it out. The value function print the value of a JuMP variable. We can cast it over a collection with the value. syntax.

julia
value.(X)
- +end
julia
# TODO: Add other solvers

We can now simply run our solver to look for a feasible solution.

julia
optimize!(m)

Note that this is heuristic solver, we might not get a feasible solution! Let's check it out. The value function print the value of a JuMP variable. We can cast it over a collection with the value. syntax.

julia
value.(X)
+ \ No newline at end of file diff --git a/dev/cp/40_ecosystem.html b/dev/cp/40_ecosystem.html index bab85fd..8925fa9 100644 --- a/dev/cp/40_ecosystem.html +++ b/dev/cp/40_ecosystem.html @@ -4,21 +4,21 @@ Exploring JuliaConstraint Packages | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Exploring JuliaConstraint Packages

Package Overviews

  • Introduce each package within the JuliaConstraint organization, its purpose, and primary features.

Installation and Getting Started Guides

  • Provide step-by-step instructions for installing and getting started with each package.
- +
Skip to content

Exploring JuliaConstraint Packages

Package Overviews

  • Introduce each package within the JuliaConstraint organization, its purpose, and primary features.

Installation and Getting Started Guides

  • Provide step-by-step instructions for installing and getting started with each package.
+ \ No newline at end of file diff --git a/dev/cp/50_advanced.html b/dev/cp/50_advanced.html index 3adc3fc..fc23d66 100644 --- a/dev/cp/50_advanced.html +++ b/dev/cp/50_advanced.html @@ -4,21 +4,21 @@ Advanced Constraint Programming Techniques | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Advanced Constraint Programming Techniques

Global Constraints and Their Uses

  • Dive deeper into global constraints and how they simplify complex problems.

Search Strategies and Optimization

  • Discuss various search strategies and their impact on solving CP problems.
- +
Skip to content

Advanced Constraint Programming Techniques

Global Constraints and Their Uses

  • Dive deeper into global constraints and how they simplify complex problems.

Search Strategies and Optimization

  • Discuss various search strategies and their impact on solving CP problems.
+ \ No newline at end of file diff --git a/dev/cp/60_applications.html b/dev/cp/60_applications.html index c4df436..b92edcb 100644 --- a/dev/cp/60_applications.html +++ b/dev/cp/60_applications.html @@ -4,21 +4,21 @@ Applying Optimization Methods | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Applying Optimization Methods

Case Studies and Real-World Applications

  • Showcase studies where CP and optimization have been successfully applied.

From Theory to Practice

  • Guide readers through the process of formulating and solving an optimization problem from a real-world scenario.
- +
Skip to content

Applying Optimization Methods

Case Studies and Real-World Applications

  • Showcase studies where CP and optimization have been successfully applied.

From Theory to Practice

  • Guide readers through the process of formulating and solving an optimization problem from a real-world scenario.
+ \ No newline at end of file diff --git a/dev/cp/70_models.html b/dev/cp/70_models.html index 8c37f13..eb8bb3a 100644 --- a/dev/cp/70_models.html +++ b/dev/cp/70_models.html @@ -4,21 +4,21 @@ Building and Analyzing Models | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Building and Analyzing Models

Modeling Best Practices

  • Share best practices and tips for building efficient CP and optimization models.

Performance Analysis and Improvement

  • Teach how to analyze and improve the performance of models.
- +
Skip to content

Building and Analyzing Models

Modeling Best Practices

  • Share best practices and tips for building efficient CP and optimization models.

Performance Analysis and Improvement

  • Teach how to analyze and improve the performance of models.
+ \ No newline at end of file diff --git a/dev/cp/80_tuto_xp.html b/dev/cp/80_tuto_xp.html index 56ece4a..263dfaa 100644 --- a/dev/cp/80_tuto_xp.html +++ b/dev/cp/80_tuto_xp.html @@ -4,21 +4,21 @@ Tutorials and Experiments | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Tutorials and Experiments

Hands-On Tutorials

  • Provide step-by-step tutorials covering various topics and complexity levels.

Experimental Analysis

  • Discuss the importance of experimental analysis in CP and how to conduct meaningful experiments.
- +
Skip to content

Tutorials and Experiments

Hands-On Tutorials

  • Provide step-by-step tutorials covering various topics and complexity levels.

Experimental Analysis

  • Discuss the importance of experimental analysis in CP and how to conduct meaningful experiments.
+ \ No newline at end of file diff --git a/dev/cp/90_contribution.html b/dev/cp/90_contribution.html index 3efac31..88691b3 100644 --- a/dev/cp/90_contribution.html +++ b/dev/cp/90_contribution.html @@ -4,21 +4,21 @@ Community and Contribution | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Community and Contribution

Joining the JuliaConstraint Community

  • Encourage readers to join the community, highlighting how they can contribute and collaborate.

Future Directions

  • Share the vision for JuliaConstraint and upcoming projects or areas of research.
- +
Skip to content

Community and Contribution

Joining the JuliaConstraint Community

  • Encourage readers to join the community, highlighting how they can contribute and collaborate.

Future Directions

  • Share the vision for JuliaConstraint and upcoming projects or areas of research.
+ \ No newline at end of file diff --git a/dev/hashmap.json b/dev/hashmap.json index 23241d1..a485860 100644 --- a/dev/hashmap.json +++ b/dev/hashmap.json @@ -1 +1 @@ -{"api_00_public.md":"4BMbBTbQ","api_10_full.md":"hyJT-s4-","constraints_00_intro.md":"BK4czCKw","constraints_10_variables_and_domains.md":"BQBZY0dG","constraints_20_constraints.md":"CtnoiJ3Z","constraints_21_generic_constraints.md":"BrP43zj-","constraints_22_language_constraints.md":"CUmApMGU","constraints_23_comparison_constraints.md":"ZkJcXQIT","constraints_24_counting_summing_constraints.md":"CMf8YC_O","constraints_25_connection_constraints.md":"B7lGKa5q","constraints_26_packing_scheduling_constraints.md":"3lrce7Bz","constraints_27_graph_constraints.md":"pFqKPWqH","constraints_28_elementary_constraints.md":"DWoH9ubp","constraints_40_constraint_models.md":"qY8cIswx","constraints_60_constraint_commons.md":"CeqfEZxo","constraints_61_constraint_domains.md":"RArUieSY","constraints_62_constraints_jl.md":"D9UaSr-v","cp_00_intro.md":"Mkmho_dM","cp_10_cp101.md":"BgtkSTPx","cp_20_opt.md":"Dt2oxPiG","cp_30_getting_started.md":"C5h4OWH5","cp_40_ecosystem.md":"B2yVE7ha","cp_50_advanced.md":"DQAz-Dcd","cp_60_applications.md":"BUP9L55l","cp_70_models.md":"Cn6kXaBH","cp_80_tuto_xp.md":"D7vyaVlC","cp_90_contribution.md":"CM5gXEgm","index.md":"CtETS-xm","learning_00_intro.md":"D4p7HvQP","learning_10_compositional_networks.md":"C1bHiEgr","learning_11_layers.md":"BQudKiAI","learning_12_transformation.md":"D3UmWQzI","learning_13_arithmetic.md":"CK9BAsnj","learning_14_aggregation.md":"uncWDDl4","learning_15_comparison.md":"Cizy95BA","learning_20_qubo_constraints.md":"D_0jKThG","learning_21_qubo_encoding.md":"BJsv_NTS","learning_22_qubo_learning.md":"B6T5AI0c","learning_30_constraints_translator.md":"Ci6ltlI6","learning_90_constraint_learning.md":"BK3d3pi7","meta_00_meta_strategist.md":"BI9Jm8Hx","perf_00_perf_checker.md":"BZ7n51Lw","perf_10_tutorial.md":"CBaJmQIS","perf_20_perf_interface.md":"DuuQq97C","perf_30_benchmark_ext.md":"hCIaUaBY","perf_40_chairmarks_ext.md":"B-RX5T8u","perf_90_api.md":"CYT8Uuo0","solvers_00_intro.md":"3TPMgJCO","solvers_10_cbls.md":"C5zl8XeS","solvers_60_local_search_solvers.md":"DbQ6-9eL"} +{"api_00_public.md":"DIEIz3-7","api_10_full.md":"CIhTEgrP","constraints_00_intro.md":"wE3p7Yn4","constraints_10_variables_and_domains.md":"DZUAY6r3","constraints_20_constraints.md":"D3n0An0S","constraints_21_generic_constraints.md":"nEZ1rbmN","constraints_22_language_constraints.md":"DjiODENs","constraints_23_comparison_constraints.md":"D9f4GIqO","constraints_24_counting_summing_constraints.md":"NT49jSaK","constraints_25_connection_constraints.md":"BT5VQBAx","constraints_26_packing_scheduling_constraints.md":"DcwNvTzZ","constraints_27_graph_constraints.md":"BA3dAj1n","constraints_28_elementary_constraints.md":"D420JMw0","constraints_40_constraint_models.md":"Dv2qEx3_","constraints_60_constraint_commons.md":"CTOeYxK8","constraints_61_constraint_domains.md":"BIH3fSw6","constraints_62_constraints_jl.md":"DDHT3MAz","cp_00_intro.md":"CsgSXI99","cp_10_cp101.md":"B-tHlXuM","cp_20_opt.md":"C0pIlKYp","cp_30_getting_started.md":"2ReSYTYy","cp_40_ecosystem.md":"YmIJU8G_","cp_50_advanced.md":"CJxpgFIM","cp_60_applications.md":"CA8-f1fu","cp_70_models.md":"1-J7V95h","cp_80_tuto_xp.md":"BBnKLYxi","cp_90_contribution.md":"DOrkQHq1","index.md":"BKeG-gxU","learning_00_intro.md":"zyAZ0vEH","learning_10_compositional_networks.md":"DeAhp3_R","learning_11_layers.md":"09f2Jdhx","learning_12_transformation.md":"M1sCl03X","learning_13_arithmetic.md":"42vK0uzX","learning_14_aggregation.md":"V0-R09TM","learning_15_comparison.md":"f9lWeNIO","learning_20_qubo_constraints.md":"DfeUpk7q","learning_21_qubo_encoding.md":"U06_V_uV","learning_22_qubo_learning.md":"CzSOBa1N","learning_30_constraints_translator.md":"Cp55uYEB","learning_90_constraint_learning.md":"YM6S0n3n","meta_00_meta_strategist.md":"W36V92NX","perf_00_perf_checker.md":"BMTPCZnU","perf_10_tutorial.md":"C4bm3h6K","perf_20_perf_interface.md":"Cfce352q","perf_30_benchmark_ext.md":"CzInbrh4","perf_40_chairmarks_ext.md":"h8pfB9sA","perf_90_api.md":"0OTlDWyk","solvers_00_intro.md":"s1tbOTQV","solvers_10_cbls.md":"BCa7hnj8","solvers_60_local_search_solvers.md":"CmZAwKiI"} diff --git a/dev/index.html b/dev/index.html index a9df1eb..3d6fc12 100644 --- a/dev/index.html +++ b/dev/index.html @@ -4,21 +4,21 @@ Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Julia Constraints

Model Smoothly Decide Wisely

A Toolkit for Constraint Programming

JuliaConstraints

What is Julia Constraints?

The Julia Constraints organization serves as a hub for resources to create, understand, and solve optimization through the lens of Constraint Programming. Our goal is to make Constraint Programming accessible and efficient for users at all levels of expertise, by providing a comprehensive suite of tools.

Most tools integrate seamlessly with JuMP, a popular Julia package for mathematical optimization.

Ecosystem overview

Core Packages

The foundation of common packages that provide essential features for constraint programming ensures that users possess the fundamental tools required for their projects.

  • ConstraintCommons.jl is designed to make constraint programming solutions in Julia interoperable. It provides shared structures, abstract types, functions, and generic methods used by both basic feature packages and learning-oriented packages.
  • ConstraintDomains.jl focuses on the definition and manipulation of variable domains, which are used to solve constraint programming problems. This package provides the infrastructure needed to specify both discrete and continuous domains, allowing a wide range of constraint programming applications.
  • Constraints.jl is a key component, specifically designed to facilitate the definition, manipulation, and application of constraints in constraint programming. This package is central to handling both standard and complex constraints, making it an indispensable tool for developers and researchers working in CP.
  • ConstraintModels.jl is a package for Julia Constraints' solvers that stores Constraint Programming models.

Learning and Translation Tools

A collection that bridges the gap between the ease of modeling and computational efficacy. These tools learn from constraints or convert natural language problems into constraint programming solutions, requiring minimal input from the user beyond the model itself.

  • CompositionalNetworks.jl provides interpretable compositional networks (ICN), a combinatorial variant of neural networks that allows the user to obtain interpretable results, unlike regular artificial neural networks.
  • QUBOConstraints.jl is a package that can (automatically) learn QUBO matrices from optimization constraints.
  • ConstraintsTranslator.jl (tentative name, WIP) is a tool for converting problems expressed in natural language into optimization models.
  • ConstraintLearning.jl is a common interface that integrates the various components outlined above.

Solvers

We offer a variety of solvers, from native Julia solvers to interfaces with JuMP for external CP solvers, to cater to various problem-solving needs.

  • LocalSearchSolvers.jl is a Julia native framework to (semi-)automatically build Constraint-based Local Search solvers. It serves as a basic for the experimental design or core and learning oriented packages in Julia Constraints.
  • CBLS.jl a MOI/JuMP interface for the above framework!
  • CPLEXCP.jl a Julia interface for CPLEX CP Optimizer.
  • Chuffed.jl a wrapper for the constraint-programming solver Chuffed to Julia.
  • JaCoP.jl a Julia interface for the JaCoP constraint-programming solver.

JuMP extras

Constraint Programming is slowly making steps into the main JuMP components. However, some extra resources are available as

Meta-solving

MetaStrategist.jl is a meta-solving package in its formative stages, which aims to harness the strengths of CP and JuMP. Its goal is to formulate tailored strategies that take into consideration the unique hardware and software resources at hand, offering a new horizon in problem-solving efficiency and adaptability. Stay tuned!

Performance related tools

We've made a tool for cross-version performance checking that ensures the high efficiency and reliability of our solutions. By facilitating clear and simple performance evaluations, PerfChecker.jl enhances both development and maintenance, contributing to the overall health and progress of Julia (Constraints)'s growing library of resources.

Contributors Page

Acknowledgments

The Julia Constraints community would not be where it is today without the collective efforts of many talented individuals and organizations. We extend our heartfelt thanks to:

  • IIJ Research Lab: The driving force behind more than half of this project!
  • JuMP-dev Community: For their extensive contributions to the development of our packages.
  • Individual Contributors: Numerous developers and researchers who have dedicated their time and skills to enhance our tools.
- +
Skip to content

Julia Constraints

Model Smoothly Decide Wisely

A Toolkit for Constraint Programming

JuliaConstraints

What is Julia Constraints?

The Julia Constraints organization serves as a hub for resources to create, understand, and solve optimization through the lens of Constraint Programming. Our goal is to make Constraint Programming accessible and efficient for users at all levels of expertise, by providing a comprehensive suite of tools.

Most tools integrate seamlessly with JuMP, a popular Julia package for mathematical optimization.

Ecosystem overview

Core Packages

The foundation of common packages that provide essential features for constraint programming ensures that users possess the fundamental tools required for their projects.

  • ConstraintCommons.jl is designed to make constraint programming solutions in Julia interoperable. It provides shared structures, abstract types, functions, and generic methods used by both basic feature packages and learning-oriented packages.
  • ConstraintDomains.jl focuses on the definition and manipulation of variable domains, which are used to solve constraint programming problems. This package provides the infrastructure needed to specify both discrete and continuous domains, allowing a wide range of constraint programming applications.
  • Constraints.jl is a key component, specifically designed to facilitate the definition, manipulation, and application of constraints in constraint programming. This package is central to handling both standard and complex constraints, making it an indispensable tool for developers and researchers working in CP.
  • ConstraintModels.jl is a package for Julia Constraints' solvers that stores Constraint Programming models.

Learning and Translation Tools

A collection that bridges the gap between the ease of modeling and computational efficacy. These tools learn from constraints or convert natural language problems into constraint programming solutions, requiring minimal input from the user beyond the model itself.

  • CompositionalNetworks.jl provides interpretable compositional networks (ICN), a combinatorial variant of neural networks that allows the user to obtain interpretable results, unlike regular artificial neural networks.
  • QUBOConstraints.jl is a package that can (automatically) learn QUBO matrices from optimization constraints.
  • ConstraintsTranslator.jl (tentative name, WIP) is a tool for converting problems expressed in natural language into optimization models.
  • ConstraintLearning.jl is a common interface that integrates the various components outlined above.

Solvers

We offer a variety of solvers, from native Julia solvers to interfaces with JuMP for external CP solvers, to cater to various problem-solving needs.

  • LocalSearchSolvers.jl is a Julia native framework to (semi-)automatically build Constraint-based Local Search solvers. It serves as a basic for the experimental design or core and learning oriented packages in Julia Constraints.
  • CBLS.jl a MOI/JuMP interface for the above framework!
  • CPLEXCP.jl a Julia interface for CPLEX CP Optimizer.
  • Chuffed.jl a wrapper for the constraint-programming solver Chuffed to Julia.
  • JaCoP.jl a Julia interface for the JaCoP constraint-programming solver.

JuMP extras

Constraint Programming is slowly making steps into the main JuMP components. However, some extra resources are available as

Meta-solving

MetaStrategist.jl is a meta-solving package in its formative stages, which aims to harness the strengths of CP and JuMP. Its goal is to formulate tailored strategies that take into consideration the unique hardware and software resources at hand, offering a new horizon in problem-solving efficiency and adaptability. Stay tuned!

Performance related tools

We've made a tool for cross-version performance checking that ensures the high efficiency and reliability of our solutions. By facilitating clear and simple performance evaluations, PerfChecker.jl enhances both development and maintenance, contributing to the overall health and progress of Julia (Constraints)'s growing library of resources.

Contributors Page

Acknowledgments

The Julia Constraints community would not be where it is today without the collective efforts of many talented individuals and organizations. We extend our heartfelt thanks to:

  • IIJ Research Lab: The driving force behind more than half of this project!
  • JuMP-dev Community: For their extensive contributions to the development of our packages.
  • Individual Contributors: Numerous developers and researchers who have dedicated their time and skills to enhance our tools.
+ \ No newline at end of file diff --git a/dev/learning/00_intro.html b/dev/learning/00_intro.html index 790dcc7..1cbe540 100644 --- a/dev/learning/00_intro.html +++ b/dev/learning/00_intro.html @@ -4,22 +4,22 @@ Learning about Constraints | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Learning about Constraints

About learning constraints related matters.

Parameters

<!– To be moved –>

One major challenge of learning the features of constraints is exploring the domains of parameters. To tackle this issue, we provide some way to generate parameters from variables' domains.

Missing docstring.

Missing docstring for BoolParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for DimParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for IdParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FakeAutomaton. Check Documenter's build log for details.

# ConstraintCommons.acceptFunction.
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source


Missing docstring.

Missing docstring for fake_automaton. Check Documenter's build log for details.

Missing docstring.

Missing docstring for LanguageParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for OpParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for PairVarsParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for ValParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for ValsParameterDomain. Check Documenter's build log for details.

# Base.randFunction.
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source


# ConstraintDomains.generate_parametersFunction.
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source


- +
Skip to content

Learning about Constraints

About learning constraints related matters.

Parameters

<!– To be moved –>

One major challenge of learning the features of constraints is exploring the domains of parameters. To tackle this issue, we provide some way to generate parameters from variables' domains.

Missing docstring.

Missing docstring for BoolParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for DimParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for IdParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FakeAutomaton. Check Documenter's build log for details.

ConstraintCommons.accept Function
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

Missing docstring.

Missing docstring for fake_automaton. Check Documenter's build log for details.

Missing docstring.

Missing docstring for LanguageParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for OpParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for PairVarsParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for ValParameterDomain. Check Documenter's build log for details.

Missing docstring.

Missing docstring for ValsParameterDomain. Check Documenter's build log for details.

Base.rand Function
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

ConstraintDomains.generate_parameters Function
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source

+ \ No newline at end of file diff --git a/dev/learning/10_compositional_networks.html b/dev/learning/10_compositional_networks.html index e27eb7e..4e14cba 100644 --- a/dev/learning/10_compositional_networks.html +++ b/dev/learning/10_compositional_networks.html @@ -4,21 +4,21 @@ CompositionalNetworks.jl | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

CompositionalNetworks.jl

Documentation for CompositionalNetworks.jl.

Utilities

# CompositionalNetworks.map_tr!Function.
julia
map_tr!(f, x, X, param)

Return an anonymous function that applies f to all elements of x and store the result in X, with a parameter param (which is set to nothing for function with no parameter).

source


# CompositionalNetworks.lazyFunction.
julia
lazy(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V).

source


# CompositionalNetworks.lazy_paramFunction.
julia
lazy_param(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V; param).

source


# CompositionalNetworks.as_bitvectorFunction.
julia
as_bitvector(n::Int, max_n::Int = n)

Convert an Int to a BitVector of minimal size (relatively to max_n).

source


# CompositionalNetworks.as_intFunction.
julia
as_int(v::AbstractVector)

Convert a BitVector into an Int.

source


# CompositionalNetworks.reduce_symbolsFunction.
julia
reduce_symbols(symbols, sep)

Produce a formatted string that separates the symbols by sep. Used internally for show_composition.

source


Missing docstring.

Missing docstring for CompositionalNeworks.tr_in. Check Documenter's build log for details.

Metrics

# CompositionalNetworks.hammingFunction.
julia
hamming(x, X)

Compute the hamming distance of x over a collection of solutions X, i.e. the minimal number of variables to switch in xto reach a solution.

source


# CompositionalNetworks.minkowskiFunction.
julia
minkowski(x, X, p)

source


# CompositionalNetworks.manhattanFunction.
julia
manhattan(x, X)

source


Missing docstring.

Missing docstring for weigths_bias. Check Documenter's build log for details.

- +
Skip to content

CompositionalNetworks.jl

Documentation for CompositionalNetworks.jl.

Utilities

CompositionalNetworks.map_tr! Function
julia
map_tr!(f, x, X, param)

Return an anonymous function that applies f to all elements of x and store the result in X, with a parameter param (which is set to nothing for function with no parameter).

source

CompositionalNetworks.lazy Function
julia
lazy(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V).

source

CompositionalNetworks.lazy_param Function
julia
lazy_param(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V; param).

source

CompositionalNetworks.as_bitvector Function
julia
as_bitvector(n::Int, max_n::Int = n)

Convert an Int to a BitVector of minimal size (relatively to max_n).

source

CompositionalNetworks.as_int Function
julia
as_int(v::AbstractVector)

Convert a BitVector into an Int.

source

CompositionalNetworks.reduce_symbols Function
julia
reduce_symbols(symbols, sep)

Produce a formatted string that separates the symbols by sep. Used internally for show_composition.

source

Missing docstring.

Missing docstring for CompositionalNeworks.tr_in. Check Documenter's build log for details.

Metrics

CompositionalNetworks.hamming Function
julia
hamming(x, X)

Compute the hamming distance of x over a collection of solutions X, i.e. the minimal number of variables to switch in xto reach a solution.

source

CompositionalNetworks.minkowski Function
julia
minkowski(x, X, p)

source

CompositionalNetworks.manhattan Function
julia
manhattan(x, X)

source

Missing docstring.

Missing docstring for weigths_bias. Check Documenter's build log for details.

+ \ No newline at end of file diff --git a/dev/learning/11_layers.html b/dev/learning/11_layers.html index d58bfd6..052f7a9 100644 --- a/dev/learning/11_layers.html +++ b/dev/learning/11_layers.html @@ -4,24 +4,24 @@ A layer structure for any ICN | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

A layer structure for any ICN

The layer.jl file defines a Layer structure and several associated functions for manipulating and interacting with this structure in the context of an Interpretable Compositional Network (ICN).

The Layer structure is used to store a LittleDict of operations that can be selected during the learning phase of an ICN. Each layer can be exclusive, meaning only one operation can be selected at a time. This is particularly useful in the context of ICNs, which are used to learn alternative expressions for highly combinatorial functions, such as those found in Constraint-based Local Search solvers.

# CompositionalNetworks.LayerType.
julia
Layer

A structure to store a LittleDict of operations that can be selected during the learning phase of an ICN. If the layer is exclusive, only one operation can be selected at a time.

source


# CompositionalNetworks.functionsFunction.
julia
functions(layer)

Access the operations of a layer. The container is ordered.

source


# Base.lengthMethod.
julia
length(layer)

Return the number of operations in a layer.

source


# CompositionalNetworks.excluFunction.
julia
exclu(layer)

Return true if the layer has mutually exclusive operations.

source


# CompositionalNetworks.symbolFunction.
julia
symbol(layer, i)

Return the i-th symbols of the operations in a given layer.

source


# CompositionalNetworks.nbits_excluFunction.
julia
nbits_exclu(layer)

Convert the length of an exclusive layer into a number of bits.

source


# CompositionalNetworks.show_layerFunction.
julia
show_layer(layer)

Return a string that contains the elements in a layer.

source


# CompositionalNetworks.selected_sizeFunction.
julia
selected_size(layer, layer_weights)

Return the number of operations selected by layer_weights in layer.

source


# CompositionalNetworks.is_viableFunction.
julia
is_viable(layer, w)
+    
Skip to content

A layer structure for any ICN

The layer.jl file defines a Layer structure and several associated functions for manipulating and interacting with this structure in the context of an Interpretable Compositional Network (ICN).

The Layer structure is used to store a LittleDict of operations that can be selected during the learning phase of an ICN. Each layer can be exclusive, meaning only one operation can be selected at a time. This is particularly useful in the context of ICNs, which are used to learn alternative expressions for highly combinatorial functions, such as those found in Constraint-based Local Search solvers.

CompositionalNetworks.Layer Type
julia
Layer

A structure to store a LittleDict of operations that can be selected during the learning phase of an ICN. If the layer is exclusive, only one operation can be selected at a time.

source

CompositionalNetworks.functions Function
julia
functions(layer)

Access the operations of a layer. The container is ordered.

source

Base.length Method
julia
length(layer)

Return the number of operations in a layer.

source

CompositionalNetworks.exclu Function
julia
exclu(layer)

Return true if the layer has mutually exclusive operations.

source

CompositionalNetworks.symbol Function
julia
symbol(layer, i)

Return the i-th symbols of the operations in a given layer.

source

CompositionalNetworks.nbits_exclu Function
julia
nbits_exclu(layer)

Convert the length of an exclusive layer into a number of bits.

source

CompositionalNetworks.show_layer Function
julia
show_layer(layer)

Return a string that contains the elements in a layer.

source

CompositionalNetworks.selected_size Function
julia
selected_size(layer, layer_weights)

Return the number of operations selected by layer_weights in layer.

source

CompositionalNetworks.is_viable Function
julia
is_viable(layer, w)
 is_viable(icn)
-is_viable(icn, w)

Assert if a pair of layer/icn and weights compose a viable pattern. If no weights are given with an icn, it will check the current internal value.

source


# CompositionalNetworks.generate_inclusive_operationsFunction.
julia
generate_inclusive_operations(predicate, bits)
-generate_exclusive_operation(max_op_number)

Generates the operations (weights) of a layer with inclusive/exclusive operations.

source


# CompositionalNetworks.generate_exclusive_operationFunction.
julia
generate_exclusive_operation(max_op_number)

Generates the operations (weights) of a layer with exclusive operations.

source


Missing docstring.

Missing docstring for generate_weigths. Check Documenter's build log for details.

- +is_viable(icn, w)

Assert if a pair of layer/icn and weights compose a viable pattern. If no weights are given with an icn, it will check the current internal value.

source

CompositionalNetworks.generate_inclusive_operations Function
julia
generate_inclusive_operations(predicate, bits)
+generate_exclusive_operation(max_op_number)

Generates the operations (weights) of a layer with inclusive/exclusive operations.

source

CompositionalNetworks.generate_exclusive_operation Function
julia
generate_exclusive_operation(max_op_number)

Generates the operations (weights) of a layer with exclusive operations.

source

Missing docstring.

Missing docstring for generate_weigths. Check Documenter's build log for details.

+ \ No newline at end of file diff --git a/dev/learning/12_transformation.html b/dev/learning/12_transformation.html index eba073d..0b7d624 100644 --- a/dev/learning/12_transformation.html +++ b/dev/learning/12_transformation.html @@ -4,38 +4,38 @@ Transformations Layer | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Transformations Layer

Some text to describe the transformation layer within usual ICNs.

The implementation of the transformation relies heavily on the use of the lazy function (make a ref, open an issue to make @lazy macro in front of each transformation).

List of transformations

List the possible parameters and how it affects the transformations.

Non-parametric

# CompositionalNetworks.tr_identityFunction.
julia
tr_identity(i, x)
+    
Skip to content

Transformations Layer

Some text to describe the transformation layer within usual ICNs.

The implementation of the transformation relies heavily on the use of the lazy function (make a ref, open an issue to make @lazy macro in front of each transformation).

List of transformations

List the possible parameters and how it affects the transformations.

Non-parametric

CompositionalNetworks.tr_identity Function
julia
tr_identity(i, x)
 tr_identity(x)
-tr_identity(x, X::AbstractVector)

Identity function. Already defined in Julia as identity, specialized for vectors. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_eqFunction.
julia
tr_count_eq(i, x)
+tr_identity(x, X::AbstractVector)

Identity function. Already defined in Julia as identity, specialized for vectors. When X is provided, the result is computed without allocations.

source

CompositionalNetworks.tr_count_eq Function
julia
tr_count_eq(i, x)
 tr_count_eq(x)
-tr_count_eq(x, X::AbstractVector)

Count the number of elements equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_eq_rightFunction.
julia
tr_count_eq_right(i, x)
+tr_count_eq(x, X::AbstractVector)

Count the number of elements equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

CompositionalNetworks.tr_count_eq_right Function
julia
tr_count_eq_right(i, x)
 tr_count_eq_right(x)
-tr_count_eq_right(x, X::AbstractVector)

Count the number of elements to the right of and equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_eq_leftFunction.
julia
tr_count_eq_left(i, x)
+tr_count_eq_right(x, X::AbstractVector)

Count the number of elements to the right of and equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

CompositionalNetworks.tr_count_eq_left Function
julia
tr_count_eq_left(i, x)
 tr_count_eq_left(x)
-tr_count_eq_left(x, X::AbstractVector)

Count the number of elements to the left of and equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_greaterFunction.
julia
tr_count_greater(i, x)
+tr_count_eq_left(x, X::AbstractVector)

Count the number of elements to the left of and equal to x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

CompositionalNetworks.tr_count_greater Function
julia
tr_count_greater(i, x)
 tr_count_greater(x)
-tr_count_greater(x, X::AbstractVector)

Count the number of elements greater than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_lesserFunction.
julia
tr_count_lesser(i, x)
+tr_count_greater(x, X::AbstractVector)

Count the number of elements greater than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

CompositionalNetworks.tr_count_lesser Function
julia
tr_count_lesser(i, x)
 tr_count_lesser(x)
-tr_count_lesser(x, X::AbstractVector)

Count the number of elements lesser than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_g_leftFunction.
julia
tr_count_g_left(i, x)
+tr_count_lesser(x, X::AbstractVector)

Count the number of elements lesser than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

CompositionalNetworks.tr_count_g_left Function
julia
tr_count_g_left(i, x)
 tr_count_g_left(x)
-tr_count_g_left(x, X::AbstractVector)

Count the number of elements to the left of and greater than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_g_rightFunction.
julia
tr_count_g_right(i, x)
+tr_count_g_left(x, X::AbstractVector)

Count the number of elements to the left of and greater than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

CompositionalNetworks.tr_count_g_right Function
julia
tr_count_g_right(i, x)
 tr_count_g_right(x)
-tr_count_g_right(x, X::AbstractVector)

Count the number of elements to the right of and greater than x[i]. Extended method to vector with sig (x) are generated.

source


# CompositionalNetworks.tr_count_l_rightFunction.
julia
tr_count_l_right(i, x)
+tr_count_g_right(x, X::AbstractVector)

Count the number of elements to the right of and greater than x[i]. Extended method to vector with sig (x) are generated.

source

CompositionalNetworks.tr_count_l_right Function
julia
tr_count_l_right(i, x)
 tr_count_l_right(x)
-tr_count_l_right(x, X::AbstractVector)

Count the number of elements to the right of and lesser than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source


Missing docstring.

Missing docstring for tr_contiguous_vals_minus. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_contiguous_vals_minus_rev. Check Documenter's build log for details.

Param: :val

Missing docstring.

Missing docstring for tr_count_eq_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_count_l_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_count_g_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_count_bounding_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_val_minus_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_param_minus_val. Check Documenter's build log for details.

Layer generation

# CompositionalNetworks.make_transformationsFunction.
julia
make_transformations(param::Symbol)

Generates a dictionary of transformation functions based on the specified parameterization. This function facilitates the creation of parametric layers for constraint transformations, allowing for flexible and dynamic constraint manipulation according to the needs of different constraint programming models.

Parameters

  • param::Symbol: Specifies the type of transformations to generate. It can be :none for basic transformations that do not depend on external parameters, or :val for transformations that operate with respect to a specific value parameter.

Returns

  • LittleDict{Symbol, Function}: A dictionary mapping transformation names (Symbol) to their corresponding functions (Function). The functions encapsulate various types of transformations, such as counting, comparison, and contiguous value processing.

Transformation Types

  • When param is :none, the following transformations are available:

    • :identity: No transformation is applied.

    • :count_eq, :count_eq_left, :count_eq_right: Count equalities under different conditions.

    • :count_greater, :count_lesser: Count values greater or lesser than a threshold.

    • :count_g_left, :count_l_left, :count_g_right, :count_l_right: Count values with greater or lesser comparisons from different directions.

    • :contiguous_vals_minus, :contiguous_vals_minus_rev: Process contiguous values with subtraction in normal and reverse order.

  • When param is :val, the transformations relate to operations involving a parameter value:

    • :count_eq_param, :count_l_param, :count_g_param: Count equalities or comparisons against a parameter value.

    • :count_bounding_param: Count values bounding a parameter value.

    • :val_minus_param, :param_minus_val: Subtract a parameter value from values or vice versa.

The function delegates to a version that uses Val(param) for dispatch, ensuring compile-time selection of the appropriate transformation set.

Examples

julia
# Get basic transformations
+tr_count_l_right(x, X::AbstractVector)

Count the number of elements to the right of and lesser than x[i]. Extended method to vector with sig (x) are generated. When X is provided, the result is computed without allocations.

source

Missing docstring.

Missing docstring for tr_contiguous_vals_minus. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_contiguous_vals_minus_rev. Check Documenter's build log for details.

Param: :val

Missing docstring.

Missing docstring for tr_count_eq_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_count_l_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_count_g_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_count_bounding_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_val_minus_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for tr_param_minus_val. Check Documenter's build log for details.

Layer generation

CompositionalNetworks.make_transformations Function
julia
make_transformations(param::Symbol)

Generates a dictionary of transformation functions based on the specified parameterization. This function facilitates the creation of parametric layers for constraint transformations, allowing for flexible and dynamic constraint manipulation according to the needs of different constraint programming models.

Parameters

  • param::Symbol: Specifies the type of transformations to generate. It can be :none for basic transformations that do not depend on external parameters, or :val for transformations that operate with respect to a specific value parameter.

Returns

  • LittleDict{Symbol, Function}: A dictionary mapping transformation names (Symbol) to their corresponding functions (Function). The functions encapsulate various types of transformations, such as counting, comparison, and contiguous value processing.

Transformation Types

  • When param is :none, the following transformations are available:

    • :identity: No transformation is applied.

    • :count_eq, :count_eq_left, :count_eq_right: Count equalities under different conditions.

    • :count_greater, :count_lesser: Count values greater or lesser than a threshold.

    • :count_g_left, :count_l_left, :count_g_right, :count_l_right: Count values with greater or lesser comparisons from different directions.

    • :contiguous_vals_minus, :contiguous_vals_minus_rev: Process contiguous values with subtraction in normal and reverse order.

  • When param is :val, the transformations relate to operations involving a parameter value:

    • :count_eq_param, :count_l_param, :count_g_param: Count equalities or comparisons against a parameter value.

    • :count_bounding_param: Count values bounding a parameter value.

    • :val_minus_param, :param_minus_val: Subtract a parameter value from values or vice versa.

The function delegates to a version that uses Val(param) for dispatch, ensuring compile-time selection of the appropriate transformation set.

Examples

julia
# Get basic transformations
 basic_transforms = make_transformations(:none)
 
 # Apply an identity transformation
@@ -45,8 +45,8 @@
 val_transforms = make_transformations(:val)
 
 # Apply a count equal to parameter transformation
-count_eq_param_result = val_transforms[:count_eq_param](data, param)

source


# CompositionalNetworks.transformation_layerFunction.
julia
transformation_layer(param = Vector{Symbol}())

Generate the layer of transformations functions of the ICN. Iff param value is non empty, also includes all the related parametric transformations.

source


- +count_eq_param_result = val_transforms[:count_eq_param](data, param)

source

CompositionalNetworks.transformation_layer Function
julia
transformation_layer(param = Vector{Symbol}())

Generate the layer of transformations functions of the ICN. Iff param value is non empty, also includes all the related parametric transformations.

source

+ \ No newline at end of file diff --git a/dev/learning/13_arithmetic.html b/dev/learning/13_arithmetic.html index a1a1eb2..9dedbf9 100644 --- a/dev/learning/13_arithmetic.html +++ b/dev/learning/13_arithmetic.html @@ -4,21 +4,21 @@ Arithmetic Layer | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Arithmetic Layer

Some text to describe the arithmetic layer within usual ICNs.

List of arithmetic operations

# CompositionalNetworks.ar_sumFunction.
julia
ar_sum(x)

Reduce k = length(x) vectors through sum to a single vector.

source


# CompositionalNetworks.ar_prodFunction.
julia
ar_prod(x)

Reduce k = length(x) vectors through product to a single vector.

source


Layer generation

# CompositionalNetworks.arithmetic_layerFunction.
julia
arithmetic_layer()

Generate the layer of arithmetic operations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source


- +
Skip to content

Arithmetic Layer

Some text to describe the arithmetic layer within usual ICNs.

List of arithmetic operations

CompositionalNetworks.ar_sum Function
julia
ar_sum(x)

Reduce k = length(x) vectors through sum to a single vector.

source

CompositionalNetworks.ar_prod Function
julia
ar_prod(x)

Reduce k = length(x) vectors through product to a single vector.

source

Layer generation

CompositionalNetworks.arithmetic_layer Function
julia
arithmetic_layer()

Generate the layer of arithmetic operations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source

+ \ No newline at end of file diff --git a/dev/learning/14_aggregation.html b/dev/learning/14_aggregation.html index d08a058..4e1e29c 100644 --- a/dev/learning/14_aggregation.html +++ b/dev/learning/14_aggregation.html @@ -4,21 +4,21 @@ Aggregation Layer | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Aggregation Layer

Some text to describe the aggragation layer within usual ICNs.

List of aggregations

# CompositionalNetworks.ag_sumFunction.
julia
ag_sum(x)

Aggregate through + a vector into a single scalar.

source


# CompositionalNetworks.ag_count_positiveFunction.
julia
ag_count_positive(x)

Count the number of strictly positive elements of x.

source


Layer generation

# CompositionalNetworks.aggregation_layerFunction.
julia
aggregation_layer()

Generate the layer of aggregations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source


- +
Skip to content

Aggregation Layer

Some text to describe the aggragation layer within usual ICNs.

List of aggregations

CompositionalNetworks.ag_sum Function
julia
ag_sum(x)

Aggregate through + a vector into a single scalar.

source

CompositionalNetworks.ag_count_positive Function
julia
ag_count_positive(x)

Count the number of strictly positive elements of x.

source

Layer generation

CompositionalNetworks.aggregation_layer Function
julia
aggregation_layer()

Generate the layer of aggregations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source

+ \ No newline at end of file diff --git a/dev/learning/15_comparison.html b/dev/learning/15_comparison.html index b0c2fd7..f4556f5 100644 --- a/dev/learning/15_comparison.html +++ b/dev/learning/15_comparison.html @@ -4,21 +4,21 @@ Comparison Layer | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Comparison Layer

Some text to describe the comparison layer within usual ICNs.

List of comparisons

List the possible parameters and how it affects the comparison.

Non-parametric

# CompositionalNetworks.co_identityFunction.
julia
co_identity(x)

Identity function. Already defined in Julia as identity, specialized for scalars in the comparison layer.

source


Missing docstring.

Missing docstring for co_euclidian. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_abs_diff_val_vars. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_val_minus_vars. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_vars_minus_val. Check Documenter's build log for details.

Param: :val

Missing docstring.

Missing docstring for co_abs_diff_val_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_val_minus_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_param_minus_val. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_euclidian_param. Check Documenter's build log for details.

Layer generation

Missing docstring.

Missing docstring for make_comparisons. Check Documenter's build log for details.

# CompositionalNetworks.comparison_layerFunction.
julia
comparison_layer(param = false)

Generate the layer of transformations functions of the ICN. Iff param value is set, also includes all the parametric comparison with that value. The operations are mutually exclusive, that is only one will be selected.

source


- +
Skip to content

Comparison Layer

Some text to describe the comparison layer within usual ICNs.

List of comparisons

List the possible parameters and how it affects the comparison.

Non-parametric

CompositionalNetworks.co_identity Function
julia
co_identity(x)

Identity function. Already defined in Julia as identity, specialized for scalars in the comparison layer.

source

Missing docstring.

Missing docstring for co_euclidian. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_abs_diff_val_vars. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_val_minus_vars. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_vars_minus_val. Check Documenter's build log for details.

Param: :val

Missing docstring.

Missing docstring for co_abs_diff_val_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_val_minus_param. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_param_minus_val. Check Documenter's build log for details.

Missing docstring.

Missing docstring for co_euclidian_param. Check Documenter's build log for details.

Layer generation

Missing docstring.

Missing docstring for make_comparisons. Check Documenter's build log for details.

CompositionalNetworks.comparison_layer Function
julia
comparison_layer(param = false)

Generate the layer of transformations functions of the ICN. Iff param value is set, also includes all the parametric comparison with that value. The operations are mutually exclusive, that is only one will be selected.

source

+ \ No newline at end of file diff --git a/dev/learning/20_qubo_constraints.html b/dev/learning/20_qubo_constraints.html index d415cf9..56402db 100644 --- a/dev/learning/20_qubo_constraints.html +++ b/dev/learning/20_qubo_constraints.html @@ -4,21 +4,21 @@ Introduction to QUBOConstraints.jl | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Introduction to QUBOConstraints.jl

Introduction to QUBOConstraints.jl.

Basic features

# QUBOConstraints.QUBO_baseFunction.
julia
QUBO_base(n, weight = 1)

A basic QUBO matrix to ensure that binarized variables keep a valid encoding.

source


# QUBOConstraints.QUBO_linear_sumFunction.
julia
QUBO_linear_sum(n, σ)

One valid QUBO matrix given n variables and parameter σ for the linear sum constraint.

source


- +
Skip to content

Introduction to QUBOConstraints.jl

Introduction to QUBOConstraints.jl.

Basic features

QUBOConstraints.QUBO_base Function
julia
QUBO_base(n, weight = 1)

A basic QUBO matrix to ensure that binarized variables keep a valid encoding.

source

QUBOConstraints.QUBO_linear_sum Function
julia
QUBO_linear_sum(n, σ)

One valid QUBO matrix given n variables and parameter σ for the linear sum constraint.

source

+ \ No newline at end of file diff --git a/dev/learning/21_qubo_encoding.html b/dev/learning/21_qubo_encoding.html index 5e7b711..d4d81af 100644 --- a/dev/learning/21_qubo_encoding.html +++ b/dev/learning/21_qubo_encoding.html @@ -4,21 +4,21 @@ Encoding for QUBO programs | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Encoding for QUBO programs

# QUBOConstraints.is_validFunction.
julia
is_valid(x, encoding::Symbol = :none)

Check if x has a valid format for encoding.

For instance, if encoding == :one_hot, at most one bit of x can be set to 1.

source


# QUBOConstraints.binarizeFunction.
julia
binarize(x[, domain]; binarization = :one_hot)

Binarize x following the binarization encoding. If x is a vector (instead of a number per say), domain is optional.

source


# QUBOConstraints.debinarizeFunction.
julia
debinarize(x[, domain]; binarization = :one_hot)

Transform a binary vector into a number or a set of number. If domain is not given, it will compute a default value based on binarization and x.

source


- +
Skip to content

Encoding for QUBO programs

QUBOConstraints.is_valid Function
julia
is_valid(x, encoding::Symbol = :none)

Check if x has a valid format for encoding.

For instance, if encoding == :one_hot, at most one bit of x can be set to 1.

source

QUBOConstraints.binarize Function
julia
binarize(x[, domain]; binarization = :one_hot)

Binarize x following the binarization encoding. If x is a vector (instead of a number per say), domain is optional.

source

QUBOConstraints.debinarize Function
julia
debinarize(x[, domain]; binarization = :one_hot)

Transform a binary vector into a number or a set of number. If domain is not given, it will compute a default value based on binarization and x.

source

+ \ No newline at end of file diff --git a/dev/learning/22_qubo_learning.html b/dev/learning/22_qubo_learning.html index f667987..2aade32 100644 --- a/dev/learning/22_qubo_learning.html +++ b/dev/learning/22_qubo_learning.html @@ -4,20 +4,20 @@ Learning QUBO matrices | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Learning QUBO matrices

Interface

# QUBOConstraints.AbstractOptimizerType.
julia
AbstractOptimizer

An abstract type (interface) used to learn QUBO matrices from constraints. Only a train method is required.

source


# QUBOConstraints.trainFunction.
julia
train(args...)

Default train method for any AbstractOptimizer.

source


Examples with various optimizers

Gradient Descent

julia
struct GradientDescentOptimizer <: QUBOConstraints.AbstractOptimizer
+    
Skip to content

Learning QUBO matrices

Interface

QUBOConstraints.AbstractOptimizer Type
julia
AbstractOptimizer

An abstract type (interface) used to learn QUBO matrices from constraints. Only a train method is required.

source

QUBOConstraints.train Function
julia
train(args...)

Default train method for any AbstractOptimizer.

source

Examples with various optimizers

Gradient Descent

julia
struct GradientDescentOptimizer <: QUBOConstraints.AbstractOptimizer
     binarization::Symbol
     η::Float64
     precision::Int
@@ -135,8 +135,8 @@
     X_test = X,
 )
     return train(X, penalty, to_domains(X, dom_stuff); optimizer, X_test)
-end
- +end
+ \ No newline at end of file diff --git a/dev/learning/30_constraints_translator.html b/dev/learning/30_constraints_translator.html index 15844fe..7f4e35a 100644 --- a/dev/learning/30_constraints_translator.html +++ b/dev/learning/30_constraints_translator.html @@ -4,21 +4,21 @@ ConstraintsTranslator.jl | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

ConstraintsTranslator.jl

Documentation for ConstraintsTranslator.jl.

<!– @autodocs Modules=[ConstraintsTranslator] –>

- +
Skip to content

ConstraintsTranslator.jl

Documentation for ConstraintsTranslator.jl.

<!– @autodocs Modules=[ConstraintsTranslator] –>

+ \ No newline at end of file diff --git a/dev/learning/90_constraint_learning.html b/dev/learning/90_constraint_learning.html index e403808..75eb098 100644 --- a/dev/learning/90_constraint_learning.html +++ b/dev/learning/90_constraint_learning.html @@ -4,21 +4,21 @@ ConstraintLearning.jl | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

ConstraintLearning.jl

Documentation for ConstraintLearning.jl.

# ConstraintLearning.ICNConfigType.
julia
struct ICNConfig{O <: ICNOptimizer}

A structure to hold the metric and optimizer configurations used in learning the weights of an ICN.

source


# ConstraintLearning.ICNConfigMethod.
julia
ICNConfig(; metric = :hamming, optimizer = ICNGeneticOptimizer())

Constructor for ICNConfig. Defaults to hamming metric using a genetic algorithm.

source


# ConstraintLearning.ICNGeneticOptimizerMethod.
julia
ICNGeneticOptimizer(; kargs...)

Default constructor to learn an ICN through a Genetic Algorithm. Default kargs TBW.

source


# ConstraintLearning.ICNLocalSearchOptimizerType.
julia
ICNLocalSearchOptimizer(options = LocalSearchSolvers.Options())

Default constructor to learn an ICN through a CBLS solver.

source


# ConstraintLearning.ICNOptimizerType.
julia
const ICNOptimizer = CompositionalNetworks.AbstractOptimizer

An abstract type for optmizers defined to learn ICNs.

source


# ConstraintLearning.QUBOGradientOptimizerMethod.
julia
QUBOGradientOptimizer(; kargs...)

A QUBO optimizer based on gradient descent. Defaults TBW

source


# ConstraintLearning.QUBOOptimizerType.
julia
const QUBOOptimizer = QUBOConstraints.AbstractOptimizer

An abstract type for optimizers used to learn QUBO matrices from constraints.

source


# CompositionalNetworks.optimize!Method.
julia
CompositionalNetworks.optimize!(icn, solutions, non_sltns, dom_size, metric, optimizer::ICNGeneticOptimizer; parameters...)

Extends the optimize! method to ICNGeneticOptimizer.

source


# CompositionalNetworks.optimize!Method.
julia
CompositionalNetworks.optimize!(icn, solutions, non_sltns, dom_size, metric, optimizer::ICNLocalSearchOptimizer; parameters...)

Extends the optimize! method to ICNLocalSearchOptimizer.

source


# ConstraintLearning._optimize!Method.
julia
_optimize!(icn, X, X_sols; metric = hamming, pop_size = 200)

Optimize and set the weights of an ICN with a given set of configuration X and solutions X_sols.

source


# ConstraintLearning.domain_sizeMethod.
julia
domain_size(ds::Number)

Extends the domain_size function when ds is number (for dispatch purposes).

source


# ConstraintLearning.generate_populationMethod.
julia
generate_population(icn, pop_size

Generate a pôpulation of weights (individuals) for the genetic algorithm weighting icn.

source


# ConstraintLearning.icnMethod.
julia
icn(X,X̅; kargs..., parameters...)

TBW

source


# ConstraintLearning.lossMethod.
julia
loss(x, y, Q)

Loss of the prediction given by Q, a training set y, and a given configuration x.

source


# ConstraintLearning.make_dfMethod.
julia
make_df(X, Q, penalty, binarization, domains)

DataFrame arrangement to output some basic evaluation of a matrix Q.

source


# ConstraintLearning.make_set_penaltyMethod.
julia
make_set_penalty(X, X̅, args...; kargs)

Return a penalty function when the training set is already split into a pair of solutions X and non solutions .

source


# ConstraintLearning.make_training_setsMethod.
julia
make_training_sets(X, penalty, args...)

Return a pair of solutions and non solutions sets based on X and penalty.

source


# ConstraintLearning.mutually_exclusiveMethod.
julia
mutually_exclusive(layer, w)

Constraint ensuring that w encode exclusive operations in layer.

source


# ConstraintLearning.no_empty_layerMethod.
julia
no_empty_layer(x; X = nothing)

Constraint ensuring that at least one operation is selected.

source


# ConstraintLearning.optimize!Method.
julia
optimize!(icn, X, X_sols, global_iter, local_iter; metric=hamming, popSize=100)

Optimize and set the weights of an ICN with a given set of configuration X and solutions X_sols. The best weights among global_iter will be set.

source


# ConstraintLearning.parameter_specific_operationsMethod.
julia
parameter_specific_operations(x; X = nothing)

Constraint ensuring that at least one operation related to parameters is selected if the error function to be learned is parametric.

source


# ConstraintLearning.predictMethod.
julia
predict(x, Q)

Return the predictions given by Q for a given configuration x.

source


# ConstraintLearning.preliminariesMethod.
julia
preliminaries(args)

Preliminaries to the training process in a QUBOGradientOptimizer run.

source


# ConstraintLearning.quboFunction.
julia
qubo(X,X̅; kargs..., parameters...)

TBW

source


# ConstraintLearning.sub_eltypeMethod.
julia
sub_eltype(X)

Return the element type of of the first element of a collection.

source


# ConstraintLearning.train!Method.
julia
train!(Q, X, penalty, η, precision, X_test, oversampling, binarization, domains)

Training inner method.

source


# ConstraintLearning.trainMethod.
julia
train(X, penalty[, d]; optimizer = QUBOGradientOptimizer(), X_test = X)

Learn a QUBO matrix on training set X for a constraint defined by penalty with optional domain information d. By default, it uses a QUBOGradientOptimizer and X as a testing set.

source


# ConstraintLearning.δMethod.
julia
δ(X[, Y]; discrete = true)

Compute the extrema over a collection X``or a pair of collection(X, Y)`.

source


- +
Skip to content

ConstraintLearning.jl

Documentation for ConstraintLearning.jl.

ConstraintLearning.ICNConfig Type
julia
struct ICNConfig{O <: ICNOptimizer}

A structure to hold the metric and optimizer configurations used in learning the weights of an ICN.

source

ConstraintLearning.ICNConfig Method
julia
ICNConfig(; metric = :hamming, optimizer = ICNGeneticOptimizer())

Constructor for ICNConfig. Defaults to hamming metric using a genetic algorithm.

source

ConstraintLearning.ICNGeneticOptimizer Method
julia
ICNGeneticOptimizer(; kargs...)

Default constructor to learn an ICN through a Genetic Algorithm. Default kargs TBW.

source

ConstraintLearning.ICNLocalSearchOptimizer Type
julia
ICNLocalSearchOptimizer(options = LocalSearchSolvers.Options())

Default constructor to learn an ICN through a CBLS solver.

source

ConstraintLearning.ICNOptimizer Type
julia
const ICNOptimizer = CompositionalNetworks.AbstractOptimizer

An abstract type for optmizers defined to learn ICNs.

source

ConstraintLearning.QUBOGradientOptimizer Method
julia
QUBOGradientOptimizer(; kargs...)

A QUBO optimizer based on gradient descent. Defaults TBW

source

ConstraintLearning.QUBOOptimizer Type
julia
const QUBOOptimizer = QUBOConstraints.AbstractOptimizer

An abstract type for optimizers used to learn QUBO matrices from constraints.

source

CompositionalNetworks.optimize! Method
julia
CompositionalNetworks.optimize!(icn, solutions, non_sltns, dom_size, metric, optimizer::ICNGeneticOptimizer; parameters...)

Extends the optimize! method to ICNGeneticOptimizer.

source

CompositionalNetworks.optimize! Method
julia
CompositionalNetworks.optimize!(icn, solutions, non_sltns, dom_size, metric, optimizer::ICNLocalSearchOptimizer; parameters...)

Extends the optimize! method to ICNLocalSearchOptimizer.

source

ConstraintLearning._optimize! Method
julia
_optimize!(icn, X, X_sols; metric = hamming, pop_size = 200)

Optimize and set the weights of an ICN with a given set of configuration X and solutions X_sols.

source

ConstraintLearning.domain_size Method
julia
domain_size(ds::Number)

Extends the domain_size function when ds is number (for dispatch purposes).

source

ConstraintLearning.generate_population Method
julia
generate_population(icn, pop_size

Generate a pôpulation of weights (individuals) for the genetic algorithm weighting icn.

source

ConstraintLearning.icn Method
julia
icn(X,X̅; kargs..., parameters...)

TBW

source

ConstraintLearning.loss Method
julia
loss(x, y, Q)

Loss of the prediction given by Q, a training set y, and a given configuration x.

source

ConstraintLearning.make_df Method
julia
make_df(X, Q, penalty, binarization, domains)

DataFrame arrangement to output some basic evaluation of a matrix Q.

source

ConstraintLearning.make_set_penalty Method
julia
make_set_penalty(X, X̅, args...; kargs)

Return a penalty function when the training set is already split into a pair of solutions X and non solutions .

source

ConstraintLearning.make_training_sets Method
julia
make_training_sets(X, penalty, args...)

Return a pair of solutions and non solutions sets based on X and penalty.

source

ConstraintLearning.mutually_exclusive Method
julia
mutually_exclusive(layer, w)

Constraint ensuring that w encode exclusive operations in layer.

source

ConstraintLearning.no_empty_layer Method
julia
no_empty_layer(x; X = nothing)

Constraint ensuring that at least one operation is selected.

source

ConstraintLearning.optimize! Method
julia
optimize!(icn, X, X_sols, global_iter, local_iter; metric=hamming, popSize=100)

Optimize and set the weights of an ICN with a given set of configuration X and solutions X_sols. The best weights among global_iter will be set.

source

ConstraintLearning.parameter_specific_operations Method
julia
parameter_specific_operations(x; X = nothing)

Constraint ensuring that at least one operation related to parameters is selected if the error function to be learned is parametric.

source

ConstraintLearning.predict Method
julia
predict(x, Q)

Return the predictions given by Q for a given configuration x.

source

ConstraintLearning.preliminaries Method
julia
preliminaries(args)

Preliminaries to the training process in a QUBOGradientOptimizer run.

source

ConstraintLearning.qubo Function
julia
qubo(X,X̅; kargs..., parameters...)

TBW

source

ConstraintLearning.sub_eltype Method
julia
sub_eltype(X)

Return the element type of of the first element of a collection.

source

ConstraintLearning.train! Method
julia
train!(Q, X, penalty, η, precision, X_test, oversampling, binarization, domains)

Training inner method.

source

ConstraintLearning.train Method
julia
train(X, penalty[, d]; optimizer = QUBOGradientOptimizer(), X_test = X)

Learn a QUBO matrix on training set X for a constraint defined by penalty with optional domain information d. By default, it uses a QUBOGradientOptimizer and X as a testing set.

source

ConstraintLearning.δ Method
julia
δ(X[, Y]; discrete = true)

Compute the extrema over a collection X``or a pair of collection(X, Y)`.

source

+ \ No newline at end of file diff --git a/dev/meta/00_meta_strategist.html b/dev/meta/00_meta_strategist.html index 2692891..5b4ea24 100644 --- a/dev/meta/00_meta_strategist.html +++ b/dev/meta/00_meta_strategist.html @@ -4,21 +4,21 @@ MetaStrategist.jl | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

MetaStrategist.jl

Documentation for MetaStrategist.jl.

- +
Skip to content

MetaStrategist.jl

Documentation for MetaStrategist.jl.

+ \ No newline at end of file diff --git a/dev/perf/00_perf_checker.html b/dev/perf/00_perf_checker.html index b6ac485..1c03997 100644 --- a/dev/perf/00_perf_checker.html +++ b/dev/perf/00_perf_checker.html @@ -4,20 +4,20 @@ PerfChecker.jl | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

PerfChecker.jl

PerfChecker.jl is a package designed for package authors to easily performance test their packages. To achieve that, it provides the follwing features:

  • The main macro @check, which provides an easy-to-use interface over various interfaces, configurable for various backends via a dictionary.

  • (WIP) A CI for reproducible performance testing.

  • Visualization of different metrics from @check using Makie.jl

Usage

The primary usage of PerfChecker.jl looks like this:

julia
  using PerfChecker
+    
Skip to content

PerfChecker.jl

PerfChecker.jl is a package designed for package authors to easily performance test their packages. To achieve that, it provides the follwing features:

  • The main macro @check, which provides an easy-to-use interface over various interfaces, configurable for various backends via a dictionary.

  • (WIP) A CI for reproducible performance testing.

  • Visualization of different metrics from @check using Makie.jl

Usage

The primary usage of PerfChecker.jl looks like this:

julia
  using PerfChecker
   # optional using custom backend like BenchmarkTools, Chairmark etc 
   config = Dict(:option1 => "value1", :option2 => :value2)
   
@@ -29,8 +29,8 @@
 
   # Visualization of the results
   using Makie
-  checkres_to_scatterlines(results)

The config dictionary can take many options, depending on the backend.

Some of the commonly used options are:

  • :PATH => The path where to the default environment of julia when creating a new process.

  • :pkgs => A list of versions to test performance for. Its defined as the Tuple, (name::String, option::Symbol, versions::Vector{VersionNumber}, last_or_first::Bool) Can be given as follows:

    • name is the name of the package.

    • option is one of the 5 symbols:

      • :patches: last patch or first patch of a version

      • :breaking: last breaking or next breaking version

      • :major: previous or next major version

      • :minor: previous or next minor version

      • :custom: custom version numbers (provide any boolean value for last_or_first in this case as it doesn't matter)

    • versions: The input for the provided option

    • last_or_first: Input for the provided option

  • :tags => A list of tags (a vector of symbols) to easily tag performance tests.

  • :devops => Giving a custom input to Pkg.develop. Intended to be used to test performance of a local development branch of a pacakge with previous versions. Often can be used as simply as :devops => "MyPackageName"

  • :threads => An integer to select the number of threads to start Julia with.

Checkout the documentation of the other backends for more default options and the default values.

- + checkres_to_scatterlines(results)

The config dictionary can take many options, depending on the backend.

Some of the commonly used options are:

  • :PATH => The path where to the default environment of julia when creating a new process.

  • :pkgs => A list of versions to test performance for. Its defined as the Tuple, (name::String, option::Symbol, versions::Vector{VersionNumber}, last_or_first::Bool) Can be given as follows:

    • name is the name of the package.

    • option is one of the 5 symbols:

      • :patches: last patch or first patch of a version

      • :breaking: last breaking or next breaking version

      • :major: previous or next major version

      • :minor: previous or next minor version

      • :custom: custom version numbers (provide any boolean value for last_or_first in this case as it doesn't matter)

    • versions: The input for the provided option

    • last_or_first: Input for the provided option

  • :tags => A list of tags (a vector of symbols) to easily tag performance tests.

  • :devops => Giving a custom input to Pkg.develop. Intended to be used to test performance of a local development branch of a pacakge with previous versions. Often can be used as simply as :devops => "MyPackageName"

  • :threads => An integer to select the number of threads to start Julia with.

Checkout the documentation of the other backends for more default options and the default values.

+ \ No newline at end of file diff --git a/dev/perf/10_tutorial.html b/dev/perf/10_tutorial.html index cec501b..33a8136 100644 --- a/dev/perf/10_tutorial.html +++ b/dev/perf/10_tutorial.html @@ -4,20 +4,20 @@ Tutorial | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Tutorial

Taken from PerfChecker.jl examples, this is a guide for performance testing of PatterFolds.jl package using Chairmarks.jl

Using PerfChecker.jl requires an environment with the dependencies present in it.

The actual script looks like this:

julia
using PerfChecker, Chairmarks, CairoMakie
+    
Skip to content

Tutorial

Taken from PerfChecker.jl examples, this is a guide for performance testing of PatterFolds.jl package using Chairmarks.jl

Using PerfChecker.jl requires an environment with the dependencies present in it.

The actual script looks like this:

julia
using PerfChecker, Chairmarks, CairoMakie
 
 d = Dict(:path => @__DIR__, :evals => 10, :samples => 1000,
     :seconds => 100, :tags => [:patterns, :intervals],
@@ -56,8 +56,8 @@
 for kwarg in [:times, :gctimes, :bytes, :allocs]
     c2 = checkres_to_boxplots(x, Val(:chairmark); kwarg)
     save(joinpath(@__DIR__, "visuals", "chair_boxplots_$kwarg.png"), c2)
-end

d here is the configuration dictionary. x stores the results from performance testing

The code below the macro call is for plotting and storing the plots. It creates the visuals folder and stores the following plots in the folder:

Boxplots from Chairmarks for allocations:

chair_boxplots

Boxplots from Chairmarks for times:

chair_times

Evolution of different metrics across versions according to Chairmarks:

chair_evolution
- +end

d here is the configuration dictionary. x stores the results from performance testing

The code below the macro call is for plotting and storing the plots. It creates the visuals folder and stores the following plots in the folder:

Boxplots from Chairmarks for allocations:

chair_boxplots

Boxplots from Chairmarks for times:

chair_times

Evolution of different metrics across versions according to Chairmarks:

chair_evolution
+ \ No newline at end of file diff --git a/dev/perf/20_perf_interface.html b/dev/perf/20_perf_interface.html index a9b79e8..370aa3b 100644 --- a/dev/perf/20_perf_interface.html +++ b/dev/perf/20_perf_interface.html @@ -4,20 +4,20 @@ Extending PerfChecker | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Extending PerfChecker

PerfChecker was build as an easy to extend interface. A good reference example for this is the Chairmarks extension.

Extending PerfChecker works via PkgExtensions feature in Julia. There are 6 essential functions that need to be extended inside the Pkg extension. Each extension has a keyword symbol for it, which users can input to use the extension.

The Default Options

Method to be overloaded: PerfChecker.default_options(::Val{:myperfextension})::Dict

PerfChecker works via a config dictionary. Users can populate this dictionary with options and provide it to the main check macro to customize the performance testing to their liking.

For Chairmarks.jl, it looks like this:

julia
function PerfChecker.default_options(::Val{:chairmark})
+    
Skip to content

Extending PerfChecker

PerfChecker was build as an easy to extend interface. A good reference example for this is the Chairmarks extension.

Extending PerfChecker works via PkgExtensions feature in Julia. There are 6 essential functions that need to be extended inside the Pkg extension. Each extension has a keyword symbol for it, which users can input to use the extension.

The Default Options

Method to be overloaded: PerfChecker.default_options(::Val{:myperfextension})::Dict

PerfChecker works via a config dictionary. Users can populate this dictionary with options and provide it to the main check macro to customize the performance testing to their liking.

For Chairmarks.jl, it looks like this:

julia
function PerfChecker.default_options(::Val{:chairmark})
     return Dict(
         :threads => 1,
         :track => "none",
@@ -43,8 +43,8 @@
     bytes = [chair.samples[i].bytes for i in 1:l]
     allocs = [chair.samples[i].allocs for i in 1:l]
     return Table(times = times, gctimes = gctimes, bytes = bytes, allocs = allocs)
-end

There are also other functions that can be overloaded, mostly related to plotting but these are the basic functions to extend PerfChecker for a custom backend.

- +end

There are also other functions that can be overloaded, mostly related to plotting but these are the basic functions to extend PerfChecker for a custom backend.

+ \ No newline at end of file diff --git a/dev/perf/30_benchmark_ext.html b/dev/perf/30_benchmark_ext.html index 131aafc..6e38532 100644 --- a/dev/perf/30_benchmark_ext.html +++ b/dev/perf/30_benchmark_ext.html @@ -4,20 +4,20 @@ BenchmarkTools Extension | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

BenchmarkTools Extension

A benchmarking extension, based on BenchmarkTools.jl, has been interfaced with PerfChecker.jl. This section will provide some usage examples, documentation, and links to related notebooks.

Usage

Like all other extensions, BenchmarkTools extension can be used in the following way:

julia
julia> using BenchmarkTools, PerfChecker
+    
Skip to content

BenchmarkTools Extension

A benchmarking extension, based on BenchmarkTools.jl, has been interfaced with PerfChecker.jl. This section will provide some usage examples, documentation, and links to related notebooks.

Usage

Like all other extensions, BenchmarkTools extension can be used in the following way:

julia
julia> using BenchmarkTools, PerfChecker
 
 julia> @check :benchmark Dict(:option1 => "value1", :option2 => "value2", :PATH => @__DIR__) begin
   # the prelimnary code goes here
@@ -34,8 +34,8 @@
 :gctrial => BenchmarkTools.DEFAULT_PARAMETERS.gctrial
 :gcsample => BenchmarkTools.DEFAULT_PARAMETERS.gcsample
 :time_tolerance => BenchmarkTools.DEFAULT_PARAMETERS.time_tolerance
-:memory_tolerance => BenchmarkTools.DEFAULT_PARAMETERS.memory_tolerance
- +:memory_tolerance => BenchmarkTools.DEFAULT_PARAMETERS.memory_tolerance
+ \ No newline at end of file diff --git a/dev/perf/40_chairmarks_ext.html b/dev/perf/40_chairmarks_ext.html index ca210bb..85780d4 100644 --- a/dev/perf/40_chairmarks_ext.html +++ b/dev/perf/40_chairmarks_ext.html @@ -4,20 +4,20 @@ Chairmarks Extension | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

Chairmarks Extension

A benchmarking extension, based on Chairmarks.jl, has been interfaced with PerfChecker.jl. This section will provide some usage examples, documentation, and links to related notebooks.

Usage

Like all other extensions, BenchmarkTools extension can be used in the following way:

julia
julia> using Chairmarks, PerfChecker
+    
Skip to content

Chairmarks Extension

A benchmarking extension, based on Chairmarks.jl, has been interfaced with PerfChecker.jl. This section will provide some usage examples, documentation, and links to related notebooks.

Usage

Like all other extensions, BenchmarkTools extension can be used in the following way:

julia
julia> using Chairmarks, PerfChecker
 
 julia> @check :chairmark Dict(:option1 => "value1", :option2 => "value2", :PATH => @__DIR__) begin
   # the prelimnary code goes here
@@ -30,8 +30,8 @@
 :evals => nothing
 :seconds => 1,
 :samples => nothing
-:gc => true
- +:gc => true
+ \ No newline at end of file diff --git a/dev/perf/90_api.html b/dev/perf/90_api.html index 4cd7f8d..2af9717 100644 --- a/dev/perf/90_api.html +++ b/dev/perf/90_api.html @@ -4,20 +4,20 @@ API | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

API

Here's the API for PerfChecker.jl

# PerfChecker.arrange_breakingMethod.

Outputs the last breaking or next breaking version.

source


# PerfChecker.arrange_majorMethod.

Outputs the earlier or next major version.

source


# PerfChecker.arrange_patchesMethod.

Outputs the last patch or first patch of a version.

source


# PerfChecker.get_pkg_versionsFunction.

Finds all versions of a package in all the installed registries and returns it as a vector.

Example:

julia
julia> get_pkg_versions("ConstraintLearning")
+    
Skip to content

API

Here's the API for PerfChecker.jl

PerfChecker.arrange_breaking Method

Outputs the last breaking or next breaking version.

source

PerfChecker.arrange_major Method

Outputs the earlier or next major version.

source

PerfChecker.arrange_patches Method

Outputs the last patch or first patch of a version.

source

PerfChecker.get_pkg_versions Function

Finds all versions of a package in all the installed registries and returns it as a vector.

Example:

julia
julia> get_pkg_versions("ConstraintLearning")
 7-element Vector{VersionNumber}:
  v"0.1.4"
  v"0.1.5"
@@ -25,8 +25,8 @@
  v"0.1.6"
  v"0.1.1"
  v"0.1.3"
- v"0.1.2"

source


- + v"0.1.2"

source

+ \ No newline at end of file diff --git a/dev/solvers/00_intro.html b/dev/solvers/00_intro.html index 72f1694..767b0ce 100644 --- a/dev/solvers/00_intro.html +++ b/dev/solvers/00_intro.html @@ -4,21 +4,21 @@ Solvers | Julia Constraints - - - + + + - + - - - + + + -
Skip to content
- +
Skip to content
+ \ No newline at end of file diff --git a/dev/solvers/10_cbls.html b/dev/solvers/10_cbls.html index 177ba93..64e9218 100644 --- a/dev/solvers/10_cbls.html +++ b/dev/solvers/10_cbls.html @@ -4,28 +4,28 @@ CBLS.jl | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

CBLS.jl

Documentation for CBLS.jl.

# CBLS.AllDifferentType.

Global constraint ensuring that all the values of a given configuration are unique.

julia
@constraint(model, X in AllDifferent())

source


# CBLS.AllEqualType.

Global constraint ensuring that all the values of X are all equal.

julia
@constraint(model, X in AllEqual())

source


# CBLS.AtLeastType.

Constraint ensuring that the number of occurrences of the values in vals in x is at least val.

julia
@constraint(model, X in AtLeast(val, vals))

source


# CBLS.AtMostType.

Constraint ensuring that the number of occurrences of the values in vals in x is at most val.

julia
@constraint(model, X in AtMost(val, vals))

source


# CBLS.ConflictsType.

Global constraint ensuring that the tuple x does not match any configuration listed within the conflict set pair_vars. This constraint, originating from the extension model, stipulates that x must avoid all configurations defined as conflicts: x ∉ pair_vars. It is useful for specifying tuples that are explicitly forbidden and should be excluded from the solution space.

julia
@constraint(model, X in Conflicts(; pair_vars))

source


# CBLS.CountType.

Global constraint ensuring that the number of occurrences of val in X is equal to count.

julia
@constraint(model, X in Count(count, val, vals))

source


# CBLS.CumulativeType.

Global constraint ensuring that the cumulative sum of the heights of the tasks is less than or equal to val.

julia
@constraint(model, X in Cumulative(; pair_vars, op, val))

source


# CBLS.DiscreteSetType.
julia
DiscreteSet(values)

Create a discrete set of values.

Arguments

  • values::Vector{T}: A vector of values to include in the set.

Returns

  • DiscreteSet{T}: A discrete set containing the specified values.

source


# CBLS.DistDifferentType.

A constraint ensuring that the distances between marks on the ruler are unique. Specifically, it checks that the distance between x[1] and x[2], and the distance between x[3] and x[4], are different. This constraint is fundamental in ensuring the validity of a Golomb ruler, where no two pairs of marks should have the same distance between them.

source


# CBLS.ElementType.

Global constraint ensuring that the value of X at index id is equal to val.

julia
@constraint(model, X in Element(; id = nothing, op = ==, val = 0))

source


# CBLS.ErrorType.
julia
Error{F <: Function} <: JuMP.AbstractVectorSet

The solver will compute a straightforward error function based on the concept. To run the solver efficiently, it is possible to provide an error function err instead of concept. err must return a nonnegative real number.

julia
@constraint(model, X in Error(err))

source


# CBLS.ExactlyType.

Constraint ensuring that the number of occurrences of the values in vals in x is exactly val.

julia
@constraint(model, X in Exactly(val, vals))

source


# CBLS.ExtensionType.

Global constraint enforcing that the tuple x matches a configuration within the supports set pair_vars[1] or does not match any configuration within the conflicts set pair_vars[2]. It embodies the logic: x ∈ pair_vars[1] || x ∉ pair_vars[2], providing a comprehensive way to define valid (supported) and invalid (conflicted) tuples for constraint satisfaction problems. This constraint is versatile, allowing for the explicit delineation of both acceptable and unacceptable configurations.

source


# CBLS.InstantiationType.

The instantiation constraint is a global constraint used in constraint programming that ensures that a list of variables takes on a specific set of values in a specific order.

source


# CBLS.IntentionType.
julia
Intention{F <: Function} <: JuMP.AbstractVectorSet

Represents an intention set in the model.

Arguments

  • f::F: A function representing the intention.

source


# CBLS.MDDConstraintType.

Multi-valued Decision Diagram (MDD) constraint.

The MDD constraint is a constraint that can be used to model a wide range of problems. It is a directed graph where each node is labeled with a value and each edge is labeled with a value. The constraint is satisfied if there is a path from the first node to the last node such that the sequence of edge labels is a valid sequence of the value labels.

julia
@constraint(model, X in MDDConstraint(; language))

source


# CBLS.MOIAllDifferentType.
julia
MOIAllDifferent <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOIAllEqualType.
julia
MOIAllEqual <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOIConflictsType.
julia
MOIConflicts{T <: Number, V <: Vector{Vector{T}}} <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOICumulativeType.
julia
MOICumulative{F <: Function, T1 <: Number, T2 <: Number} <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOIDistDifferentType.
julia
MOIDistDifferent <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOIElementType.
julia
MOIElement{I <: Integer, F <: Function, T <: Union{Nothing, Number}} <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOIErrorType.
julia
MOIError{F <: Function} <: MOI.AbstractVectorSet

DOCSTRING

Arguments:

  • f::F: DESCRIPTION

  • dimension::Int: DESCRIPTION

  • MOIError(f, dim = 0) = begin #= none:5 =# new{typeof(f)}(f, dim) end: DESCRIPTION

source


# CBLS.MOIExtensionType.
julia
MOIExtension{T <: Number, V <: Union{Vector{Vector{T}}, Tuple{Vector{T}, Vector{T}}}} <: MOI.AbstractVectorSet
+    
Skip to content

CBLS.jl

Documentation for CBLS.jl.

CBLS.AllDifferent Type

Global constraint ensuring that all the values of a given configuration are unique.

julia
@constraint(model, X in AllDifferent())

source

CBLS.AllEqual Type

Global constraint ensuring that all the values of X are all equal.

julia
@constraint(model, X in AllEqual())

source

CBLS.AtLeast Type

Constraint ensuring that the number of occurrences of the values in vals in x is at least val.

julia
@constraint(model, X in AtLeast(val, vals))

source

CBLS.AtMost Type

Constraint ensuring that the number of occurrences of the values in vals in x is at most val.

julia
@constraint(model, X in AtMost(val, vals))

source

CBLS.Conflicts Type

Global constraint ensuring that the tuple x does not match any configuration listed within the conflict set pair_vars. This constraint, originating from the extension model, stipulates that x must avoid all configurations defined as conflicts: x ∉ pair_vars. It is useful for specifying tuples that are explicitly forbidden and should be excluded from the solution space.

julia
@constraint(model, X in Conflicts(; pair_vars))

source

CBLS.Count Type

Global constraint ensuring that the number of occurrences of val in X is equal to count.

julia
@constraint(model, X in Count(count, val, vals))

source

CBLS.Cumulative Type

Global constraint ensuring that the cumulative sum of the heights of the tasks is less than or equal to val.

julia
@constraint(model, X in Cumulative(; pair_vars, op, val))

source

CBLS.DiscreteSet Type
julia
DiscreteSet(values)

Create a discrete set of values.

Arguments

  • values::Vector{T}: A vector of values to include in the set.

Returns

  • DiscreteSet{T}: A discrete set containing the specified values.

source

CBLS.DistDifferent Type

A constraint ensuring that the distances between marks on the ruler are unique. Specifically, it checks that the distance between x[1] and x[2], and the distance between x[3] and x[4], are different. This constraint is fundamental in ensuring the validity of a Golomb ruler, where no two pairs of marks should have the same distance between them.

source

CBLS.Element Type

Global constraint ensuring that the value of X at index id is equal to val.

julia
@constraint(model, X in Element(; id = nothing, op = ==, val = 0))

source

CBLS.Error Type
julia
Error{F <: Function} <: JuMP.AbstractVectorSet

The solver will compute a straightforward error function based on the concept. To run the solver efficiently, it is possible to provide an error function err instead of concept. err must return a nonnegative real number.

julia
@constraint(model, X in Error(err))

source

CBLS.Exactly Type

Constraint ensuring that the number of occurrences of the values in vals in x is exactly val.

julia
@constraint(model, X in Exactly(val, vals))

source

CBLS.Extension Type

Global constraint enforcing that the tuple x matches a configuration within the supports set pair_vars[1] or does not match any configuration within the conflicts set pair_vars[2]. It embodies the logic: x ∈ pair_vars[1] || x ∉ pair_vars[2], providing a comprehensive way to define valid (supported) and invalid (conflicted) tuples for constraint satisfaction problems. This constraint is versatile, allowing for the explicit delineation of both acceptable and unacceptable configurations.

source

CBLS.Instantiation Type

The instantiation constraint is a global constraint used in constraint programming that ensures that a list of variables takes on a specific set of values in a specific order.

source

CBLS.Intention Type
julia
Intention{F <: Function} <: JuMP.AbstractVectorSet

Represents an intention set in the model.

Arguments

  • f::F: A function representing the intention.

source

CBLS.MDDConstraint Type

Multi-valued Decision Diagram (MDD) constraint.

The MDD constraint is a constraint that can be used to model a wide range of problems. It is a directed graph where each node is labeled with a value and each edge is labeled with a value. The constraint is satisfied if there is a path from the first node to the last node such that the sequence of edge labels is a valid sequence of the value labels.

julia
@constraint(model, X in MDDConstraint(; language))

source

CBLS.MOIAllDifferent Type
julia
MOIAllDifferent <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOIAllEqual Type
julia
MOIAllEqual <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOIConflicts Type
julia
MOIConflicts{T <: Number, V <: Vector{Vector{T}}} <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOICumulative Type
julia
MOICumulative{F <: Function, T1 <: Number, T2 <: Number} <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOIDistDifferent Type
julia
MOIDistDifferent <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOIElement Type
julia
MOIElement{I <: Integer, F <: Function, T <: Union{Nothing, Number}} <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOIError Type
julia
MOIError{F <: Function} <: MOI.AbstractVectorSet

DOCSTRING

Arguments:

  • f::F: DESCRIPTION

  • dimension::Int: DESCRIPTION

  • MOIError(f, dim = 0) = begin #= none:5 =# new{typeof(f)}(f, dim) end: DESCRIPTION

source

CBLS.MOIExtension Type
julia
MOIExtension{T <: Number, V <: Union{Vector{Vector{T}}, Tuple{Vector{T}, Vector{T}}}} <: MOI.AbstractVectorSet
 
-DOCSTRING

source


# CBLS.MOIInstantiationType.
julia
MOIInstantiation{T <: Number, V <: Vector{T}} <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOIIntentionType.
julia
MOIIntention{F <: Function} <: MOI.AbstractVectorSet

Represents an intention set in the model.

Arguments

  • f::F: A function representing the intention.

  • dimension::Int: The dimension of the vector set.

source


# CBLS.MOIMaximumType.
julia
MOIMaximum {F <: Function, T <: Number} <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOIMinimumType.
julia
MOIMinimum {F <: Function, T <: Number} <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOIMultivaluedDecisionDiagramType.
julia
MOIMultivaluedDecisionDiagram{L <: ConstraintCommons.AbstractMultivaluedDecisionDiagram} <: AbstractVectorSet

DOCSTRING

source


# CBLS.MOINValuesType.
julia
MOINValues{F <: Function, T1 <: Number, T2 <: Number, V <: Vector{T2}} <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOINoOverlapType.
julia
MOINoOverlap{I <: Integer, T <: Number, V <: Vector{T}} <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOIOrderedType.
julia
MOIOrdered{F <: Function, T <: Number, V <: Vector{T}} <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOIRegularType.
julia
MOIRegular{L <: ConstraintCommons.AbstractAutomaton} <: AbstractVectorSet

DOCSTRING

source


# CBLS.MOISumType.
julia
MOISum{F <: Function, T1 <: Number, T2 <: Number, V <: Number} <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MOISupportsType.
julia
MOISupports{T <: Number, V <: Vector{Vector{T}}} <: MOI.AbstractVectorSet

DOCSTRING

source


# CBLS.MaximumType.

Global constraint ensuring that the maximum value in the tuple x satisfies the condition op(x) val. This constraint is useful for specifying that the maximum value in the tuple must satisfy a certain condition.

julia
@constraint(model, X in Maximum(; op = ==, val))

source


# CBLS.MinimumType.

Global constraint ensuring that the minimum value in the tuple x satisfies the condition op(x) val. This constraint is useful for specifying that the minimum value in the tuple must satisfy a certain condition.

julia
@constraint(model, X in Minimum(; op = ==, val))

source


# CBLS.NValuesType.

Global constraint ensuring that the number of distinct values in X satisfies the given condition.

source


# CBLS.NoOverlapType.

Global constraint ensuring that the tuple x does not overlap with any configuration listed within the pair set pair_vars. This constraint, originating from the extension model, stipulates that x must avoid all configurations defined as pairs: x ∩ pair_vars = ∅. It is useful for specifying tuples that are explicitly forbidden and should be excluded from the solution space.

julia
@constraint(model, X in NoOverlap(; bool = true, dim = 1, pair_vars = nothing))

source


# CBLS.OptimizerType.
julia
Optimizer(model = Model(); options = Options())

Create an instance of the Optimizer.

Arguments

  • model: The model to be optimized.

  • options::Options: Options for configuring the solver.

Returns

  • Optimizer: An instance of the optimizer.

source


# CBLS.OptimizerType.
julia
Optimizer <: MOI.AbstractOptimizer

Defines an optimizer for CBLS.

Fields

  • solver::LS.MainSolver: The main solver used for local search.

  • int_vars::Set{Int}: Set of integer variables.

  • compare_vars::Set{Int}: Set of variables to compare.

source


# CBLS.OrderedType.

Global constraint ensuring that the variables are ordered according to op.

source


# CBLS.PredicateType.
julia
Predicate{F <: Function} <: JuMP.AbstractVectorSet

Deprecated: Use Intention instead.

Represents a predicate set in the model.

Arguments

  • f::F: A function representing the predicate.

source


# CBLS.RegularType.

Ensures that a sequence x (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of x with the language rules encoded within the automaton parameter, which must be an instance of <:AbstractAutomaton.

julia
@constraint(model, X in RegularConstraint(; language))

source


# CBLS.ScalarFunctionType.
julia
ScalarFunction{F <: Function, V <: Union{Nothing, VOV}} <: MOI.AbstractScalarFunction

A container to express any function with real value in JuMP syntax. Used with the @objective macro.

Arguments:

  • f::F: function to be applied to X

  • X::V: a subset of the variables of the model.

Given a model, and some (collection of) variables X to optimize. an objective function f can be added as follows. Note that only Min for minimization us currently defined. Max will come soon.

julia
# Applies to all variables in order of insertion.
+DOCSTRING

source

CBLS.MOIInstantiation Type
julia
MOIInstantiation{T <: Number, V <: Vector{T}} <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOIIntention Type
julia
MOIIntention{F <: Function} <: MOI.AbstractVectorSet

Represents an intention set in the model.

Arguments

  • f::F: A function representing the intention.

  • dimension::Int: The dimension of the vector set.

source

CBLS.MOIMaximum Type
julia
MOIMaximum {F <: Function, T <: Number} <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOIMinimum Type
julia
MOIMinimum {F <: Function, T <: Number} <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOIMultivaluedDecisionDiagram Type
julia
MOIMultivaluedDecisionDiagram{L <: ConstraintCommons.AbstractMultivaluedDecisionDiagram} <: AbstractVectorSet

DOCSTRING

source

CBLS.MOINValues Type
julia
MOINValues{F <: Function, T1 <: Number, T2 <: Number, V <: Vector{T2}} <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOINoOverlap Type
julia
MOINoOverlap{I <: Integer, T <: Number, V <: Vector{T}} <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOIOrdered Type
julia
MOIOrdered{F <: Function, T <: Number, V <: Vector{T}} <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOIRegular Type
julia
MOIRegular{L <: ConstraintCommons.AbstractAutomaton} <: AbstractVectorSet

DOCSTRING

source

CBLS.MOISum Type
julia
MOISum{F <: Function, T1 <: Number, T2 <: Number, V <: Number} <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOISupports Type
julia
MOISupports{T <: Number, V <: Vector{Vector{T}}} <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.Maximum Type

Global constraint ensuring that the maximum value in the tuple x satisfies the condition op(x) val. This constraint is useful for specifying that the maximum value in the tuple must satisfy a certain condition.

julia
@constraint(model, X in Maximum(; op = ==, val))

source

CBLS.Minimum Type

Global constraint ensuring that the minimum value in the tuple x satisfies the condition op(x) val. This constraint is useful for specifying that the minimum value in the tuple must satisfy a certain condition.

julia
@constraint(model, X in Minimum(; op = ==, val))

source

CBLS.NValues Type

Global constraint ensuring that the number of distinct values in X satisfies the given condition.

source

CBLS.NoOverlap Type

Global constraint ensuring that the tuple x does not overlap with any configuration listed within the pair set pair_vars. This constraint, originating from the extension model, stipulates that x must avoid all configurations defined as pairs: x ∩ pair_vars = ∅. It is useful for specifying tuples that are explicitly forbidden and should be excluded from the solution space.

julia
@constraint(model, X in NoOverlap(; bool = true, dim = 1, pair_vars = nothing))

source

CBLS.Optimizer Type
julia
Optimizer(model = Model(); options = Options())

Create an instance of the Optimizer.

Arguments

  • model: The model to be optimized.

  • options::Options: Options for configuring the solver.

Returns

  • Optimizer: An instance of the optimizer.

source

CBLS.Optimizer Type
julia
Optimizer <: MOI.AbstractOptimizer

Defines an optimizer for CBLS.

Fields

  • solver::LS.MainSolver: The main solver used for local search.

  • int_vars::Set{Int}: Set of integer variables.

  • compare_vars::Set{Int}: Set of variables to compare.

source

CBLS.Ordered Type

Global constraint ensuring that the variables are ordered according to op.

source

CBLS.Predicate Type
julia
Predicate{F <: Function} <: JuMP.AbstractVectorSet

Deprecated: Use Intention instead.

Represents a predicate set in the model.

Arguments

  • f::F: A function representing the predicate.

source

CBLS.Regular Type

Ensures that a sequence x (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of x with the language rules encoded within the automaton parameter, which must be an instance of <:AbstractAutomaton.

julia
@constraint(model, X in RegularConstraint(; language))

source

CBLS.ScalarFunction Type
julia
ScalarFunction{F <: Function, V <: Union{Nothing, VOV}} <: MOI.AbstractScalarFunction

A container to express any function with real value in JuMP syntax. Used with the @objective macro.

Arguments:

  • f::F: function to be applied to X

  • X::V: a subset of the variables of the model.

Given a model, and some (collection of) variables X to optimize. an objective function f can be added as follows. Note that only Min for minimization us currently defined. Max will come soon.

julia
# Applies to all variables in order of insertion.
 # Recommended only when the function argument order does not matter.
 @objective(model, ScalarFunction(f))
 
 # Generic use
-@objective(model, ScalarFunction(f, X))

source


# CBLS.SumType.

Global constraint ensuring that the sum of the variables in x satisfies a given condition.

source


# CBLS.SupportsType.

Global constraint ensuring that the tuple x matches a configuration listed within the support set pair_vars. This constraint is derived from the extension model, specifying that x must be one of the explicitly defined supported configurations: x ∈ pair_vars. It is utilized to directly declare the tuples that are valid and should be included in the solution space.

julia
@constraint(model, X in Supports(; pair_vars))

source


# Base.copyMethod.
julia
Base.copy(set::MOIError) = begin

DOCSTRING

source


# Base.copyMethod.
julia
Base.copy(set::MOIIntention)

Copy an intention set.

Arguments

  • set::MOIIntention: The intention set to be copied.

Returns

  • MOIIntention: A copy of the intention set.

source


# Base.copyMethod.
julia
Base.copy(set::DiscreteSet)

Copy a discrete set.

Arguments

  • set::DiscreteSet: The discrete set to be copied.

Returns

  • DiscreteSet: A copy of the discrete set.

source


# Base.copyMethod.
julia
Base.copy(op::F) where {F <: Function}

Copy a function.

Arguments

  • op::F: The function to be copied.

Returns

  • F: The copied function.

source


# Base.copyMethod.
julia
Base.copy(::Nothing)

Copy a Nothing value.

Arguments

  • ::Nothing: The Nothing value to be copied.

Returns

  • Nothing: The copied Nothing value.

source


# JuMP.build_variableMethod.
julia
JuMP.build_variable(::Function, info::JuMP.VariableInfo, set::T) where T <: MOI.AbstractScalarSet

Create a variable constrained by a scalar set.

Arguments

  • info::JuMP.VariableInfo: Information about the variable to be created.

  • set::T where T <: MOI.AbstractScalarSet: The set defining the constraints on the variable.

Returns

  • JuMP.VariableConstrainedOnCreation: A variable constrained by the specified set.

source


# JuMP.moi_setMethod.
julia
JuMP.moi_set(set::Intention, dim::Int) -> MOIIntention

Convert an Intention set to a MOIIntention set.

Arguments

  • set::Intention: The intention set to be converted.

  • dim::Int: The dimension of the vector set.

Returns

  • MOIIntention: The converted MOIIntention set.

source


# JuMP.moi_setMethod.
julia
JuMP.moi_set(set::Predicate, dim::Int) -> MOIIntention

Convert a Predicate set to a MOIIntention set.

Arguments

  • set::Predicate: The predicate set to be converted.

  • dim::Int: The dimension of the vector set.

Returns

  • MOIIntention: The converted MOIIntention set.

source


# MathOptInterface.add_constraintMethod.
julia
MOI.add_constraint(optimizer::Optimizer, vars::MOI.VectorOfVariables, set::MOIError)

DOCSTRING

Arguments:

  • optimizer: DESCRIPTION

  • vars: DESCRIPTION

  • set: DESCRIPTION

source


# MathOptInterface.add_constraintMethod.
julia
MOI.add_constraint(optimizer::Optimizer, vars::MOI.VectorOfVariables, set::MOIIntention{F}) where {F <: Function}

Add an intention constraint to the optimizer.

Arguments

  • optimizer::Optimizer: The optimizer instance.

  • vars::MOI.VectorOfVariables: The variables for the constraint.

  • set::MOIIntention{F}: The intention set defining the constraint.

Returns

  • CI{VOV, MOIIntention{F}}: The constraint index.

source


# MathOptInterface.add_constraintMethod.
julia
MOI.add_constraint(optimizer::Optimizer, v::VI, set::DiscreteSet{T}) where T <: Number

DOCSTRING

Arguments:

  • optimizer: DESCRIPTION

  • v: DESCRIPTION

  • set: DESCRIPTION

source


# MathOptInterface.add_variableMethod.
julia
MOI.add_variable(model::Optimizer) = begin

DOCSTRING

source


# MathOptInterface.copy_toMethod.
julia
MOI.copy_to(model::Optimizer, src::MOI.ModelLike)

Copy the source model to the optimizer.

Arguments

  • model::Optimizer: The optimizer instance.

  • src::MOI.ModelLike: The source model to be copied.

Returns

  • Nothing

source


# MathOptInterface.empty!Method.
julia
MOI.empty!(opt)

Empty the optimizer.

Arguments

  • opt::Optimizer: The optimizer instance.

Returns

  • Nothing

source


# MathOptInterface.getMethod.
julia
MOI.get(::Optimizer, ::MOI.SolverName)

Get the name of the solver.

Arguments

  • ::Optimizer: The optimizer instance.

Returns

  • String: The name of the solver.

source


# MathOptInterface.getMethod.
julia
Moi.get(::Optimizer, ::MOI.SolverVersion)

Get the version of the solver, here LocalSearchSolvers.jl.

source


# MathOptInterface.is_emptyMethod.
julia
MOI.is_empty(model::Optimizer)

Check if the model is empty.

Arguments

  • model::Optimizer: The optimizer instance.

Returns

  • Bool: True if the model is empty, false otherwise.

source


# MathOptInterface.is_validMethod.
julia
MOI.is_valid(optimizer::Optimizer, index::CI{VI, MOI.Integer})

Check if an index is valid for the optimizer.

Arguments

  • optimizer::Optimizer: The optimizer instance.

  • index::CI{VI, MOI.Integer}: The index to be checked.

Returns

  • Bool: True if the index is valid, false otherwise.

source


# MathOptInterface.optimize!Method.
julia
MOI.optimize!(model::Optimizer)

Optimize the model using the optimizer.

Arguments

  • model::Optimizer: The optimizer instance.

Returns

  • Nothing

source


# MathOptInterface.setFunction.
julia
MOI.set(::Optimizer, ::MOI.Silent, bool = true)

Set the verbosity of the solver.

Arguments

  • ::Optimizer: The optimizer instance.

  • ::MOI.Silent: The silent option for the solver.

  • bool::Bool: Whether to set the solver to silent mode.

Returns

  • Nothing

source


# MathOptInterface.setMethod.
julia
MOI.set(model::Optimizer, p::MOI.RawOptimizerAttribute, value)

Set a RawOptimizerAttribute to value

source


# MathOptInterface.setMethod.
julia
MOI.set(model::Optimizer, ::MOI.TimeLimitSec, value::Union{Nothing,Float64})

Set the time limit

source


# MathOptInterface.supports_constraintMethod.
julia
MOI.supports_constraint(::Optimizer, ::Type{VOV}, ::Type{MOIError}) = begin

DOCSTRING

Arguments:

  • ``: DESCRIPTION

  • ``: DESCRIPTION

  • ``: DESCRIPTION

source


# MathOptInterface.supports_constraintMethod.
julia
MOI.supports_constraint(::Optimizer, ::Type{VOV}, ::Type{MOIIntention{F}}) where {F <: Function}

Check if the optimizer supports a given intention constraint.

Arguments

  • ::Optimizer: The optimizer instance.

  • ::Type{VOV}: The type of the variable.

  • ::Type{MOIIntention{F}}: The type of the intention.

Returns

  • Bool: True if the optimizer supports the constraint, false otherwise.

source


# MathOptInterface.supports_incremental_interfaceMethod.
julia
MOI.supports_incremental_interface(::Optimizer)

Check if the optimizer supports incremental interface.

Arguments

  • ::Optimizer: The optimizer instance.

Returns

  • Bool: True if the optimizer supports incremental interface, false otherwise.

source


- +@objective(model, ScalarFunction(f, X))

source

CBLS.Sum Type

Global constraint ensuring that the sum of the variables in x satisfies a given condition.

source

CBLS.Supports Type

Global constraint ensuring that the tuple x matches a configuration listed within the support set pair_vars. This constraint is derived from the extension model, specifying that x must be one of the explicitly defined supported configurations: x ∈ pair_vars. It is utilized to directly declare the tuples that are valid and should be included in the solution space.

julia
@constraint(model, X in Supports(; pair_vars))

source

Base.copy Method
julia
Base.copy(set::MOIError) = begin

DOCSTRING

source

Base.copy Method
julia
Base.copy(set::MOIIntention)

Copy an intention set.

Arguments

  • set::MOIIntention: The intention set to be copied.

Returns

  • MOIIntention: A copy of the intention set.

source

Base.copy Method
julia
Base.copy(set::DiscreteSet)

Copy a discrete set.

Arguments

  • set::DiscreteSet: The discrete set to be copied.

Returns

  • DiscreteSet: A copy of the discrete set.

source

Base.copy Method
julia
Base.copy(op::F) where {F <: Function}

Copy a function.

Arguments

  • op::F: The function to be copied.

Returns

  • F: The copied function.

source

Base.copy Method
julia
Base.copy(::Nothing)

Copy a Nothing value.

Arguments

  • ::Nothing: The Nothing value to be copied.

Returns

  • Nothing: The copied Nothing value.

source

JuMP.build_variable Method
julia
JuMP.build_variable(::Function, info::JuMP.VariableInfo, set::T) where T <: MOI.AbstractScalarSet

Create a variable constrained by a scalar set.

Arguments

  • info::JuMP.VariableInfo: Information about the variable to be created.

  • set::T where T <: MOI.AbstractScalarSet: The set defining the constraints on the variable.

Returns

  • JuMP.VariableConstrainedOnCreation: A variable constrained by the specified set.

source

JuMP.moi_set Method
julia
JuMP.moi_set(set::Intention, dim::Int) -> MOIIntention

Convert an Intention set to a MOIIntention set.

Arguments

  • set::Intention: The intention set to be converted.

  • dim::Int: The dimension of the vector set.

Returns

  • MOIIntention: The converted MOIIntention set.

source

JuMP.moi_set Method
julia
JuMP.moi_set(set::Predicate, dim::Int) -> MOIIntention

Convert a Predicate set to a MOIIntention set.

Arguments

  • set::Predicate: The predicate set to be converted.

  • dim::Int: The dimension of the vector set.

Returns

  • MOIIntention: The converted MOIIntention set.

source

MathOptInterface.add_constraint Method
julia
MOI.add_constraint(optimizer::Optimizer, vars::MOI.VectorOfVariables, set::MOIError)

DOCSTRING

Arguments:

  • optimizer: DESCRIPTION

  • vars: DESCRIPTION

  • set: DESCRIPTION

source

MathOptInterface.add_constraint Method
julia
MOI.add_constraint(optimizer::Optimizer, vars::MOI.VectorOfVariables, set::MOIIntention{F}) where {F <: Function}

Add an intention constraint to the optimizer.

Arguments

  • optimizer::Optimizer: The optimizer instance.

  • vars::MOI.VectorOfVariables: The variables for the constraint.

  • set::MOIIntention{F}: The intention set defining the constraint.

Returns

  • CI{VOV, MOIIntention{F}}: The constraint index.

source

MathOptInterface.add_constraint Method
julia
MOI.add_constraint(optimizer::Optimizer, v::VI, set::DiscreteSet{T}) where T <: Number

DOCSTRING

Arguments:

  • optimizer: DESCRIPTION

  • v: DESCRIPTION

  • set: DESCRIPTION

source

MathOptInterface.add_variable Method
julia
MOI.add_variable(model::Optimizer) = begin

DOCSTRING

source

MathOptInterface.copy_to Method
julia
MOI.copy_to(model::Optimizer, src::MOI.ModelLike)

Copy the source model to the optimizer.

Arguments

  • model::Optimizer: The optimizer instance.

  • src::MOI.ModelLike: The source model to be copied.

Returns

  • Nothing

source

MathOptInterface.empty! Method
julia
MOI.empty!(opt)

Empty the optimizer.

Arguments

  • opt::Optimizer: The optimizer instance.

Returns

  • Nothing

source

MathOptInterface.get Method
julia
MOI.get(::Optimizer, ::MOI.SolverName)

Get the name of the solver.

Arguments

  • ::Optimizer: The optimizer instance.

Returns

  • String: The name of the solver.

source

MathOptInterface.get Method
julia
Moi.get(::Optimizer, ::MOI.SolverVersion)

Get the version of the solver, here LocalSearchSolvers.jl.

source

MathOptInterface.is_empty Method
julia
MOI.is_empty(model::Optimizer)

Check if the model is empty.

Arguments

  • model::Optimizer: The optimizer instance.

Returns

  • Bool: True if the model is empty, false otherwise.

source

MathOptInterface.is_valid Method
julia
MOI.is_valid(optimizer::Optimizer, index::CI{VI, MOI.Integer})

Check if an index is valid for the optimizer.

Arguments

  • optimizer::Optimizer: The optimizer instance.

  • index::CI{VI, MOI.Integer}: The index to be checked.

Returns

  • Bool: True if the index is valid, false otherwise.

source

MathOptInterface.optimize! Method
julia
MOI.optimize!(model::Optimizer)

Optimize the model using the optimizer.

Arguments

  • model::Optimizer: The optimizer instance.

Returns

  • Nothing

source

MathOptInterface.set Function
julia
MOI.set(::Optimizer, ::MOI.Silent, bool = true)

Set the verbosity of the solver.

Arguments

  • ::Optimizer: The optimizer instance.

  • ::MOI.Silent: The silent option for the solver.

  • bool::Bool: Whether to set the solver to silent mode.

Returns

  • Nothing

source

MathOptInterface.set Method
julia
MOI.set(model::Optimizer, p::MOI.RawOptimizerAttribute, value)

Set a RawOptimizerAttribute to value

source

MathOptInterface.set Method
julia
MOI.set(model::Optimizer, ::MOI.TimeLimitSec, value::Union{Nothing,Float64})

Set the time limit

source

MathOptInterface.supports_constraint Method
julia
MOI.supports_constraint(::Optimizer, ::Type{VOV}, ::Type{MOIError}) = begin

DOCSTRING

Arguments:

  • ``: DESCRIPTION

  • ``: DESCRIPTION

  • ``: DESCRIPTION

source

MathOptInterface.supports_constraint Method
julia
MOI.supports_constraint(::Optimizer, ::Type{VOV}, ::Type{MOIIntention{F}}) where {F <: Function}

Check if the optimizer supports a given intention constraint.

Arguments

  • ::Optimizer: The optimizer instance.

  • ::Type{VOV}: The type of the variable.

  • ::Type{MOIIntention{F}}: The type of the intention.

Returns

  • Bool: True if the optimizer supports the constraint, false otherwise.

source

MathOptInterface.supports_incremental_interface Method
julia
MOI.supports_incremental_interface(::Optimizer)

Check if the optimizer supports incremental interface.

Arguments

  • ::Optimizer: The optimizer instance.

Returns

  • Bool: True if the optimizer supports incremental interface, false otherwise.

source

+ \ No newline at end of file diff --git a/dev/solvers/60_local_search_solvers.html b/dev/solvers/60_local_search_solvers.html index e299065..9a5cea7 100644 --- a/dev/solvers/60_local_search_solvers.html +++ b/dev/solvers/60_local_search_solvers.html @@ -4,27 +4,27 @@ LocalSearchSolvers.jl | Julia Constraints - - - + + + - + - - - + + + -
Skip to content

LocalSearchSolvers.jl

Documentation for LocalSearchSolvers.jl.

# LocalSearchSolvers.AbstractSolverType.
julia
AbstractSolver

Abstract type to encapsulate the different solver types such as Solver or _SubSolver.

source


# LocalSearchSolvers.ConstraintType.
julia
Constraint{F <: Function}

Structure to store an error function and the variables it constrains.

source


# LocalSearchSolvers.LeadSolverType.
julia
LeadSolver <: MetaSolver

Solver managed remotely by a MainSolver. Can manage its own set of local sub solvers.

source


# LocalSearchSolvers.MainSolverType.
julia
MainSolver <: AbstractSolver

Main solver. Handle the solving of a model, and optional multithreaded and/or distributed subsolvers.

Arguments:

  • model::Model: A formal description of the targeted problem

  • state::_State: An internal state to store the info necessary to a solving run

  • options::Options: User options for this solver

  • subs::Vector{_SubSolver}: Optional subsolvers

source


# LocalSearchSolvers.MetaSolverType.

Abstract type to encapsulate all solver types that manages other solvers.

source


# LocalSearchSolvers.ObjectiveType.
julia
Objective{F <: Function}

A structure to handle objectives in a solver. `struct Objective{F <: Function} name::String f::F end``

source


# LocalSearchSolvers.ObjectiveMethod.
julia
Objective(F, o::Objective{F2}) where {F2 <: Function}

Constructor used in specializing a solver. Should never be called externally.

source


# LocalSearchSolvers.OptionsType.
julia
Options()

Arguments:

  • dynamic::Bool: is the model dynamic?

  • iteration::Union{Int, Float64}: limit on the number of iterations

  • print_level::Symbol: verbosity to choose among :silent, :minimal, :partial, :verbose

  • solutions::Int: number of solutions to return

  • specialize::Bool: should the types of the model be specialized or not. Usually yes for static problems. For dynamic in depends if the user intend to introduce new types. The specialized model is about 10% faster.

  • tabu_time::Int: DESCRIPTION

  • tabu_local::Int: DESCRIPTION

  • tabu_delta::Float64: DESCRIPTION

  • threads::Int: Number of threads to use

  • time_limit::Float64: time limit in seconds

  • `function Options(; dynamic = false, iteration = 10000, print_level = :minimal, solutions = 1, specialize = !dynamic, tabu_time = 0, tabu_local = 0, tabu_delta = 0.0, threads = typemax(0), time_limit = Inf)

julia
# Setting options in JuMP syntax: print_level, time_limit, iteration
+    
Skip to content

LocalSearchSolvers.jl

Documentation for LocalSearchSolvers.jl.

LocalSearchSolvers.AbstractSolver Type
julia
AbstractSolver

Abstract type to encapsulate the different solver types such as Solver or _SubSolver.

source

LocalSearchSolvers.Constraint Type
julia
Constraint{F <: Function}

Structure to store an error function and the variables it constrains.

source

LocalSearchSolvers.LeadSolver Type
julia
LeadSolver <: MetaSolver

Solver managed remotely by a MainSolver. Can manage its own set of local sub solvers.

source

LocalSearchSolvers.MainSolver Type
julia
MainSolver <: AbstractSolver

Main solver. Handle the solving of a model, and optional multithreaded and/or distributed subsolvers.

Arguments:

  • model::Model: A formal description of the targeted problem

  • state::_State: An internal state to store the info necessary to a solving run

  • options::Options: User options for this solver

  • subs::Vector{_SubSolver}: Optional subsolvers

source

LocalSearchSolvers.MetaSolver Type

Abstract type to encapsulate all solver types that manages other solvers.

source

LocalSearchSolvers.Objective Type
julia
Objective{F <: Function}

A structure to handle objectives in a solver. `struct Objective{F <: Function} name::String f::F end``

source

LocalSearchSolvers.Objective Method
julia
Objective(F, o::Objective{F2}) where {F2 <: Function}

Constructor used in specializing a solver. Should never be called externally.

source

LocalSearchSolvers.Options Type
julia
Options()

Arguments:

  • dynamic::Bool: is the model dynamic?

  • iteration::Union{Int, Float64}: limit on the number of iterations

  • print_level::Symbol: verbosity to choose among :silent, :minimal, :partial, :verbose

  • solutions::Int: number of solutions to return

  • specialize::Bool: should the types of the model be specialized or not. Usually yes for static problems. For dynamic in depends if the user intend to introduce new types. The specialized model is about 10% faster.

  • tabu_time::Int: DESCRIPTION

  • tabu_local::Int: DESCRIPTION

  • tabu_delta::Float64: DESCRIPTION

  • threads::Int: Number of threads to use

  • time_limit::Float64: time limit in seconds

  • `function Options(; dynamic = false, iteration = 10000, print_level = :minimal, solutions = 1, specialize = !dynamic, tabu_time = 0, tabu_local = 0, tabu_delta = 0.0, threads = typemax(0), time_limit = Inf)

julia
# Setting options in JuMP syntax: print_level, time_limit, iteration
 model = Model(CBLS.Optimizer)
 set_optimizer_attribute(model, "iteration", 100)
 set_optimizer_attribute(model, "print_level", :verbose)
-set_time_limit_sec(model, 5.0)

source


# LocalSearchSolvers.VariableType.
julia
Variable{D <: AbstractDomain}

A structure containing the necessary information for a solver's variables: name, domain, and constraints it belongs.

struct Variable{D <: AbstractDomain}
+set_time_limit_sec(model, 5.0)

source

LocalSearchSolvers.Variable Type
julia
Variable{D <: AbstractDomain}

A structure containing the necessary information for a solver's variables: name, domain, and constraints it belongs.

struct Variable{D <: AbstractDomain}
     domain::D
     constraints::Indices{Int}
-end

source


# LocalSearchSolvers._ModelType.
julia
_Model{V <: Variable{<:AbstractDomain},C <: Constraint{<:Function},O <: Objective{<:Function}}

A struct to model a problem as a set of variables, domains, constraints, and objectives.

struct _Model{V <: Variable{<:AbstractDomain},C <: Constraint{<:Function},O <: Objective{<:Function}}
+end

source

LocalSearchSolvers._Model Type
julia
_Model{V <: Variable{<:AbstractDomain},C <: Constraint{<:Function},O <: Objective{<:Function}}

A struct to model a problem as a set of variables, domains, constraints, and objectives.

struct _Model{V <: Variable{<:AbstractDomain},C <: Constraint{<:Function},O <: Objective{<:Function}}
     variables::Dictionary{Int,V}
     constraints::Dictionary{Int,C}
     objectives::Dictionary{Int,O}
@@ -39,21 +39,21 @@
 
     # Symbol to indicate the kind of model for specialized methods such as pretty printing
     kind::Symbol
-end

source


# LocalSearchSolvers._StateType.
julia
GeneralState{T <: Number}

A mutable structure to store the general state of a solver. All methods applied to GeneralState are forwarded to S <: AbstractSolver.

mutable struct GeneralState{T <: Number} <: AbstractState
+end

source

LocalSearchSolvers._State Type
julia
GeneralState{T <: Number}

A mutable structure to store the general state of a solver. All methods applied to GeneralState are forwarded to S <: AbstractSolver.

mutable struct GeneralState{T <: Number} <: AbstractState
     configuration::Configuration{T}
     cons_costs::Dictionary{Int, Float64}
     last_improvement::Int
     tabu::Dictionary{Int, Int}
     vars_costs::Dictionary{Int, Float64}
-end

source


# LocalSearchSolvers._SubSolverType.
julia
_SubSolver <: AbstractSolver

An internal solver type called by MetaSolver when multithreading is enabled.

Arguments:

  • id::Int: subsolver id for debugging

  • model::Model: a ref to the model of the main solver

  • state::_State: a deepcopy of the main solver that evolves independently

  • options::Options: a ref to the options of the main solver

source


# Base.empty!Method.
julia
empty!(s::Solver)

source


# Base.empty!Method.
julia
empty!(m::Model)

DOCSTRING

source


# Base.inMethod.
julia
var::Int c::Constraint

source


# Base.inMethod.
julia
x::Variable constraint
-value  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source


# LocalSearchSolvers._add!Method.
julia
_add!(c::Constraint, x)

Add the variable of indice x to c.

source


# LocalSearchSolvers._add_to_constraint!Method.
julia
_add_to_constraint!(x::Variable, id)

Add a constraint id to the list of constraints of x.

source


# LocalSearchSolvers._check_restartMethod.
julia
_check_restart(s)

Check if a restart of s is necessary. If s has subsolvers, this check is independent for all of them.

source


# LocalSearchSolvers._check_subsMethod.
julia
_check_subs(s)

Check if any subsolver of a main solver s, for

  • Satisfaction, has a solution, then return it, resume the run otherwise

  • Optimization, has a better solution, then assign it to its internal state

source


# LocalSearchSolvers._compute!Method.
julia
_compute!(s; o::Int = 1, cons_lst = Indices{Int}())

Compute the objective o's value if s is satisfied and return the current error.

Arguments:

  • s: a solver

  • o: targeted objective

  • cons_lst: list of targeted constraints, if empty compute for the whole set

source


# LocalSearchSolvers._compute_cost!Method.
julia
_compute_cost!(s, ind, c)

Compute the cost of constraint c with index ind.

source


# LocalSearchSolvers._compute_costs!Method.
julia
_compute_costs!(s; cons_lst::Indices{Int} = Indices{Int}())

Compute the cost of constraints c in cons_lst. If cons_lst is empty, compute the cost for all the constraints in s.

source


# LocalSearchSolvers._compute_objective!Method.
julia
_compute_objective!(s, o::Objective)
-_compute_objective!(s, o = 1)

Compute the objective o's value.

source


# LocalSearchSolvers._cons_cost!Method.
julia
_cons_cost!(s::S, c, cost) where S <: Union{_State, AbstractSolver}

Set the cost of constraint c.

source


# LocalSearchSolvers._cons_costMethod.
julia
_cons_cost(s::S, c) where S <: Union{_State, AbstractSolver}

Return the cost of constraint c.

source


# LocalSearchSolvers._cons_costs!Method.
julia
_cons_costs!(s::S, costs) where S <: Union{_State, AbstractSolver}

Set the constraints costs.

source


# LocalSearchSolvers._cons_costsMethod.
julia
_cons_costs(s::S) where S <: Union{_State, AbstractSolver}

Access the constraints costs.

source


# LocalSearchSolvers._constrictionMethod.
julia
_constriction(x::Variable)

Return the cosntriction of x, i.e. the number of constraints restricting x.

source


# LocalSearchSolvers._delete!Method.
julia
_delete!(c::Constraint, x::Int)

Delete x from c.

source


# LocalSearchSolvers._delete_from_constraint!Method.
julia
_delete_from_constraint!(x::Variable, id)

Delete a constraint id from the list of constraints of x.

source


# LocalSearchSolvers._draw!Method.
julia
_draw!(s)

Draw a random (re-)starting configuration.

source


# LocalSearchSolvers._dynamic!Method.
julia
_dynamic!(options, dynamic) = begin

DOCSTRING

source


# LocalSearchSolvers._dynamicMethod.
julia
_dynamic(options) = begin

DOCSTRING

source


# LocalSearchSolvers._find_rand_argmaxMethod.
julia
_find_rand_argmax(d::DictionaryView)

Compute argmax of d and select one element randomly.

source


# LocalSearchSolvers._get_constraintsMethod.
julia
_get_constraints(x::Variable)

Access the list of constraints of x.

source


# LocalSearchSolvers._get_varsMethod.
julia
_get_vars(c::Constraint)

Returns the variables constrained by c.

source


# LocalSearchSolvers._inc_cons!Method.
julia
_inc_vars!(m::M) where M <: Union{Model, AbstractSolver}

Increment the maximum constraint id that has been attributed to m.

source


# LocalSearchSolvers._inc_objs!Method.
julia
_inc_vars!(m::M) where M <: Union{Model, AbstractSolver}

Increment the maximum objective id that has been attributed to m.

source


# LocalSearchSolvers._inc_vars!Method.
julia
_inc_vars!(m::M) where M <: Union{Model, AbstractSolver}

Increment the maximum variable id that has been attributed to m.

source


# LocalSearchSolvers._info_path!Method.
julia
_info_path!(options, iterations) = begin

DOCSTRING

source


# LocalSearchSolvers._info_pathMethod.
julia
_info_path(options, path)

DOCSTRING

source


# LocalSearchSolvers._is_emptyMethod.
julia
_is_empty(m::Model)

DOCSTRING

source


# LocalSearchSolvers._iteration!Method.
julia
_iteration!(options, iterations) = begin

DOCSTRING

source


# LocalSearchSolvers._iterationMethod.
julia
_iteration(options) = begin

DOCSTRING

source


# LocalSearchSolvers._lengthMethod.
julia
_length(c::Constraint)

Return the number of constrained variables by c.

source


# LocalSearchSolvers._max_consMethod.
julia
_max_cons(m::M) where M <: Union{Model, AbstractSolver}

Access the maximum constraint id that has been attributed to m.

source


# LocalSearchSolvers._max_objsMethod.
julia
_max_objs(m::M) where M <: Union{Model, AbstractSolver}

Access the maximum objective id that has been attributed to m.

source


# LocalSearchSolvers._max_varsMethod.
julia
_max_vars(m::M) where M <: Union{Model, AbstractSolver}

Access the maximum variable id that has been attributed to m.

source


# LocalSearchSolvers._move!Function.
julia
_move!(s, x::Int, dim::Int = 0)

Perform an improving move in x neighbourhood if possible.

Arguments:

  • s: a solver of type S <: AbstractSolver

  • x: selected variable id

  • dim: describe the dimension of the considered neighbourhood

source


# LocalSearchSolvers._neighboursFunction.
julia
_neighbours(s, x, dim = 0)

DOCSTRING

Arguments:

  • s: DESCRIPTION

  • x: DESCRIPTION

  • dim: DESCRIPTION

source


# LocalSearchSolvers._optimizing!Method.
julia
_optimizing!(s::S) where S <: Union{_State, AbstractSolver}

Set the solver optimizing status to true.

source


# LocalSearchSolvers._optimizingMethod.
julia
_optimizing(s::S) where S <: Union{_State, AbstractSolver}

Check if s is in an optimizing state.

source


# LocalSearchSolvers._print_level!Method.
julia
_print_level!(options, level) = begin

DOCSTRING

source


# LocalSearchSolvers._print_levelMethod.
julia
_print_level(options) = begin

DOCSTRING

source


# LocalSearchSolvers._process_threads_map!Method.
julia
_process_threads_map!(options, ptm)

TBW

source


# LocalSearchSolvers._process_threads_mapMethod.
julia
_process_threads_map(options)

TBW

source


# LocalSearchSolvers._restart!Function.
julia
_restart!(s, k = 10)

Restart a solver.

source


# LocalSearchSolvers._satisfying!Method.
julia
_satisfying!(s::S) where S <: Union{_State, AbstractSolver}

Set the solver optimizing status to false.

source


# LocalSearchSolvers._select_worseMethod.
julia
_select_worse(s::S) where S <: Union{_State, AbstractSolver}

Within the non-tabu variables, select the one with the worse error .

source


# LocalSearchSolvers._set!Method.
julia
_set!(s::S, x, val) where S <: Union{_State, AbstractSolver}

Set the value of variable x to val.

source


# LocalSearchSolvers._set_domain!Method.
julia
_set_domain!(m::Model, x, values)

DOCSTRING

Arguments:

  • m: DESCRIPTION

  • x: DESCRIPTION

  • values: DESCRIPTION

source


# LocalSearchSolvers._solutions!Method.
julia
_solutions!(options, solutions) = begin

DOCSTRING

source


# LocalSearchSolvers._solutionsMethod.
julia
_solutions(options) = begin

DOCSTRING

source


# LocalSearchSolvers._specialize!Method.
julia
_specialize!(options, specialize) = begin

DOCSTRING

source


# LocalSearchSolvers._specializeMethod.
julia
_specialize(options) = begin

DOCSTRING

source


# LocalSearchSolvers._step!Method.
julia
_step!(s)

Iterate a step of the solver run.

source


# LocalSearchSolvers._swap_value!Method.
julia
_set!(s::S, x, y) where S <: Union{_State, AbstractSolver}

Swap the values of variables x and y.

source


# LocalSearchSolvers._tabu_delta!Method.
julia
_tabu_delta!(options, time) = begin

DOCSTRING

source


# LocalSearchSolvers._tabu_deltaMethod.
julia
_tabu_delta(options) = begin

DOCSTRING

source


# LocalSearchSolvers._tabu_local!Method.
julia
_tabu_local!(options, time) = begin

DOCSTRING

source


# LocalSearchSolvers._tabu_localMethod.
julia
_tabu_local(options) = begin

DOCSTRING

source


# LocalSearchSolvers._tabu_time!Method.
julia
_tabu_time!(options, time) = begin

DOCSTRING

source


# LocalSearchSolvers._tabu_timeMethod.
julia
_tabu_time(options) = begin

DOCSTRING

source


# LocalSearchSolvers._threadsFunction.
julia
_threads(options) = begin

DOCSTRING

source


# LocalSearchSolvers._threads!Function.
julia
_threads!(options, threads) = begin

DOCSTRING

source


# LocalSearchSolvers._time_limit!Method.
julia
_time_limit!(options, time::Time) = begin

DOCSTRING

source


# LocalSearchSolvers._time_limitMethod.
julia
_time_limit(options)

DOCSTRING

source


# LocalSearchSolvers._to_unionMethod.
julia
_to_union(datatype)

Make a minimal Union type from a collection of data types.

source


# LocalSearchSolvers._value!Method.
julia
_value!(s::S, x, val) where S <: Union{_State, AbstractSolver}

Set the value of variable x to val.

source


# LocalSearchSolvers._valueMethod.
julia
_value(s::S, x) where S <: Union{_State, AbstractSolver}

Return the value of variable x.

source


# LocalSearchSolvers._values!Method.
julia
_values!(s::S, values) where S <: Union{_State, AbstractSolver}

Set the variables values.

source


# LocalSearchSolvers._valuesMethod.
julia
_vars_costs(s::S) where S <: Union{_State, AbstractSolver}

Access the variables costs.

source


# LocalSearchSolvers._var_cost!Method.
julia
_var_cost!(s::S, x, cost) where S <: Union{_State, AbstractSolver}

Set the cost of variable x.

source


# LocalSearchSolvers._var_costMethod.
julia
_var_cost(s::S, x) where S <: Union{_State, AbstractSolver}

Return the cost of variable x.

source


# LocalSearchSolvers._vars_costs!Method.
julia
_vars_costs!(s::S, costs) where S <: Union{_State, AbstractSolver}

Set the variables costs.

source


# LocalSearchSolvers._vars_costsMethod.
julia
_vars_costs(s::S) where S <: Union{_State, AbstractSolver}

Access the variables costs.

source


# LocalSearchSolvers._verboseMethod.
julia
_verbose(settings, str)

Temporary logging function. #TODO: use better log instead (LoggingExtra.jl)

source


# LocalSearchSolvers.add!Method.
julia
mts = - get_time_stamp(model)

return TimeStamps(mts, mts, mts, mts, mts, mts, mts) end

add!(m::M, x) where M <: Union{Model, AbstractSolver}
-add!(m::M, c) where M <: Union{Model, AbstractSolver}
-add!(m::M, o) where M <: Union{Model, AbstractSolver}

Add a variable x, a constraint c, or an objective o to m.

source


# LocalSearchSolvers.add_value!Method.
julia
add_value!(m::M, x, val) where M <: Union{Model, AbstractSolver}

Add val to x domain.

source


# LocalSearchSolvers.add_var_to_cons!Method.
julia
add_var_to_cons!(m::M, c, x) where M <: Union{Model, AbstractSolver}

Add x to the constraint c list of restricted variables.

source


# LocalSearchSolvers.constraint!Method.
julia
constraint!(m::M, func, vars) where M <: Union{Model, AbstractSolver}

Add a constraint with an error function func defined over variables vars.

source


# LocalSearchSolvers.constraintMethod.
julia
constraint(f, vars)

DOCSTRING

source


# LocalSearchSolvers.constrictionMethod.
julia
constriction(m::M, x) where M <: Union{Model, AbstractSolver}

Return the constriction of variable x.

source


# LocalSearchSolvers.decay_tabu!Method.
julia
_decay_tabu!(s::S) where S <: Union{_State, AbstractSolver}

Decay the tabu list.

source


# LocalSearchSolvers.decrease_tabu!Method.
julia
_decrease_tabu!(s::S, x) where S <: Union{_State, AbstractSolver}

Decrement the tabu value of variable x.

source


# LocalSearchSolvers.delete_tabu!Method.
julia
_delete_tabu!(s::S, x) where S <: Union{_State, AbstractSolver}

Delete the tabu entry of variable x.

source


# LocalSearchSolvers.delete_value!Method.
julia
delete_value(m::M, x, val) where M <: Union{Model, AbstractSolver}

Delete val from x domain.

source


# LocalSearchSolvers.delete_var_from_cons!Method.
julia
delete_var_from_cons(m::M, c, x) where M <: Union{Model, AbstractSolver}

Delete x from the constraint c list of restricted variables.

source


# LocalSearchSolvers.describeMethod.
julia
describe(m::M) where M <: Union{Model, AbstractSolver}

Describe the model.

source


# LocalSearchSolvers.domain_sizeMethod.
julia
domain_size(m::Model, x) = begin

DOCSTRING

source


# LocalSearchSolvers.drawMethod.
julia
draw(m::M, x) where M <: Union{Model, AbstractSolver}

Draw a random value of x domain.

source


# LocalSearchSolvers.empty_tabu!Method.
julia
_empty_tabu!(s::S) where S <: Union{_State, AbstractSolver}

Empty the tabu list.

source


# LocalSearchSolvers.get_cons_from_varMethod.
julia
get_cons_from_var(m::M, x) where M <: Union{Model, AbstractSolver}

Access the constraints restricting variable x.

source


# LocalSearchSolvers.get_constraintMethod.
julia
get_constraint(m::M, c) where M <: Union{Model, AbstractSolver}

Access the constraint c.

source


# LocalSearchSolvers.get_constraintsMethod.
julia
get_constraints(m::M) where M <: Union{Model, AbstractSolver}

Access the constraints of m.

source


# LocalSearchSolvers.get_domainMethod.
julia
get_domain(m::M, x) where M <: Union{Model, AbstractSolver}

Access the domain of variable x.

source


# LocalSearchSolvers.get_kindMethod.
julia
get_kind(m::M) where M <: Union{Model, AbstractSolver}

Access the kind of m, such as :sudoku or :generic (default).

source


# LocalSearchSolvers.get_nameMethod.
julia
get_name(m::M, x) where M <: Union{Model, AbstractSolver}

Access the name of variable x.

source


# LocalSearchSolvers.get_objectiveMethod.
julia
get_objective(m::M, o) where M <: Union{Model, AbstractSolver}

Access the objective o.

source


# LocalSearchSolvers.get_objectivesMethod.
julia
get_objectives(m::M) where M <: Union{Model, AbstractSolver}

Access the objectives of m.

source


# LocalSearchSolvers.get_time_stampMethod.
julia
get_time_stamp(m::M) where M <: Union{Model, AbstractSolver}

Access the time (since epoch) when the model was created. This time stamp is for internal performance measurement.

source


# LocalSearchSolvers.get_variableMethod.
julia
get_variable(m::M, x) where M <: Union{Model, AbstractSolver}

Access the variable x.

source


# LocalSearchSolvers.get_variablesMethod.
julia
get_variables(m::M) where M <: Union{Model, AbstractSolver}

Access the variables of m.

source


# LocalSearchSolvers.get_vars_from_consMethod.
julia
get_vars_from_cons(m::M, c) where M <: Union{Model, AbstractSolver}

Access the variables restricted by constraint c.

source


# LocalSearchSolvers.insert_tabu!Method.
julia
_insert_tabu!(s::S, x, tabu_time) where S <: Union{_State, AbstractSolver}

Insert the bariable x as tabu for tabu_time.

source


# LocalSearchSolvers.is_satMethod.
julia
is_sat(m::M) where M <: Union{Model, AbstractSolver}

Return true if m is a satisfaction model.

source


# LocalSearchSolvers.is_specializedMethod.
julia
is_specialized(m::M) where M <: Union{Model, AbstractSolver}

Return true if the model is already specialized.

source


# LocalSearchSolvers.length_consMethod.
julia
length_cons(m::M, c) where M <: Union{Model, AbstractSolver}

Return the length of constraint c.

source


# LocalSearchSolvers.length_consMethod.
julia
length_cons(m::M) where M <: Union{Model, AbstractSolver}

Return the number of constraints in m.

source


# LocalSearchSolvers.length_objsMethod.
julia
length_objs(m::M) where M <: Union{Model, AbstractSolver}

Return the number of objectives in m.

source


# LocalSearchSolvers.length_tabuMethod.
julia
_length_tabu!(s::S) where S <: Union{_State, AbstractSolver}

Return the length of the tabu list.

source


# LocalSearchSolvers.length_varMethod.
julia
length_var(m::M, x) where M <: Union{Model, AbstractSolver}

Return the domain length of variable x.

source


# LocalSearchSolvers.length_varsMethod.
julia
length_vars(m::M) where M <: Union{Model, AbstractSolver}

Return the number of variables in m.

source


# LocalSearchSolvers.max_domains_sizeMethod.
julia
max_domains_size(m::Model, vars) = begin

DOCSTRING

source


# LocalSearchSolvers.modelMethod.
julia
model()

Construct a _Model, empty by default. It is recommended to add the constraints, variables, and objectives from an empty _Model. The following keyword arguments are available,

  • vars=Dictionary{Int,Variable}(): collection of variables

  • cons=Dictionary{Int,Constraint}(): collection of constraints

  • objs=Dictionary{Int,Objective}(): collection of objectives

  • kind=:generic: the kind of problem modeled (useful for specialized methods such as pretty printing)

source


# LocalSearchSolvers.o_dist_extremaMethod.
julia
dist_extrema(values::T...) where {T <: Number}

Computes the distance between extrema in an ordered set.

source


# LocalSearchSolvers.o_mincutMethod.
julia
o_mincut(graph, values; interdiction = 0)

Compute the capacity of a cut (determined by the state of the solver) with a possible interdiction on the highest capacited links.

source


# LocalSearchSolvers.objective!Method.
julia
objective!(m::M, func) where M <: Union{Model, AbstractSolver}

Add an objective evaluated by func.

source


# LocalSearchSolvers.objectiveMethod.
julia
objective(func, name)

Construct an objective with a function func that should be applied to a collection of variables.

source


# LocalSearchSolvers.post_processMethod.
julia
post_process(s::MainSolver)

Launch a series of tasks to round-up a solving run, for instance, export a run's info.

source


# LocalSearchSolvers.remote_dispatch!Method.
julia
remote_dispatch!(solver)

Starts the LeadSolvers attached to the MainSolver.

source


# LocalSearchSolvers.remote_stop!Method.
julia
remote_stop!!(solver)

Fetch the pool of solutions from LeadSolvers and merge it into the MainSolver.

source


# LocalSearchSolvers.solutionMethod.
julia
solution(s)

Return the only/best known solution of a satisfaction/optimization model.

source


# LocalSearchSolvers.solve_for_loop!Method.
julia
solve_for_loop!(solver, stop, sat, iter)

First loop in the solving process that starts LeadSolvers from the MainSolver, and _SubSolvers from each MetaSolver.

source


# LocalSearchSolvers.solve_while_loop!Method.
julia
solve_while_loop!(s, )

Search the space of configurations.

source


# LocalSearchSolvers.specialize!Method.
julia
specialize!(solver)

Replace the model of solver by one with specialized types (variables, constraints, objectives).

source


# LocalSearchSolvers.specializeMethod.
julia
specialize(m::M) where M <: Union{Model, AbstractSolver}

Specialize the structure of a model to avoid dynamic type attribution at runtime.

source


# LocalSearchSolvers.statusMethod.
julia
status(solver)

Return the status of a MainSolver.

source


# LocalSearchSolvers.stop_while_loopMethod.
julia
stop_while_loop()

Check the stop conditions of the solve! while inner loop.

source


# LocalSearchSolvers.tabu_listMethod.
julia
_tabu(s::S) where S <: Union{_State, AbstractSolver}

Access the list of tabu variables.

source


# LocalSearchSolvers.tabu_valueMethod.
julia
_tabu(s::S, x) where S <: Union{_State, AbstractSolver}

Return the tabu value of variable x.

source


# LocalSearchSolvers.variable!Function.
julia
variable!(m::M, d) where M <: Union{Model, AbstractSolver}

Add a variable with domain d to m.

source


# LocalSearchSolvers.variableMethod.
julia
variable(values::AbstractVector{T}, name::AbstractString; domain = :set) where T <: Number
+end

source

LocalSearchSolvers._SubSolver Type
julia
_SubSolver <: AbstractSolver

An internal solver type called by MetaSolver when multithreading is enabled.

Arguments:

  • id::Int: subsolver id for debugging

  • model::Model: a ref to the model of the main solver

  • state::_State: a deepcopy of the main solver that evolves independently

  • options::Options: a ref to the options of the main solver

source

Base.empty! Method
julia
empty!(s::Solver)

source

Base.empty! Method
julia
empty!(m::Model)

DOCSTRING

source

Base.in Method
julia
var::Int c::Constraint

source

Base.in Method
julia
x::Variable constraint
+value  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

LocalSearchSolvers._add! Method
julia
_add!(c::Constraint, x)

Add the variable of indice x to c.

source

LocalSearchSolvers._add_to_constraint! Method
julia
_add_to_constraint!(x::Variable, id)

Add a constraint id to the list of constraints of x.

source

LocalSearchSolvers._check_restart Method
julia
_check_restart(s)

Check if a restart of s is necessary. If s has subsolvers, this check is independent for all of them.

source

LocalSearchSolvers._check_subs Method
julia
_check_subs(s)

Check if any subsolver of a main solver s, for

  • Satisfaction, has a solution, then return it, resume the run otherwise

  • Optimization, has a better solution, then assign it to its internal state

source

LocalSearchSolvers._compute! Method
julia
_compute!(s; o::Int = 1, cons_lst = Indices{Int}())

Compute the objective o's value if s is satisfied and return the current error.

Arguments:

  • s: a solver

  • o: targeted objective

  • cons_lst: list of targeted constraints, if empty compute for the whole set

source

LocalSearchSolvers._compute_cost! Method
julia
_compute_cost!(s, ind, c)

Compute the cost of constraint c with index ind.

source

LocalSearchSolvers._compute_costs! Method
julia
_compute_costs!(s; cons_lst::Indices{Int} = Indices{Int}())

Compute the cost of constraints c in cons_lst. If cons_lst is empty, compute the cost for all the constraints in s.

source

LocalSearchSolvers._compute_objective! Method
julia
_compute_objective!(s, o::Objective)
+_compute_objective!(s, o = 1)

Compute the objective o's value.

source

LocalSearchSolvers._cons_cost! Method
julia
_cons_cost!(s::S, c, cost) where S <: Union{_State, AbstractSolver}

Set the cost of constraint c.

source

LocalSearchSolvers._cons_cost Method
julia
_cons_cost(s::S, c) where S <: Union{_State, AbstractSolver}

Return the cost of constraint c.

source

LocalSearchSolvers._cons_costs! Method
julia
_cons_costs!(s::S, costs) where S <: Union{_State, AbstractSolver}

Set the constraints costs.

source

LocalSearchSolvers._cons_costs Method
julia
_cons_costs(s::S) where S <: Union{_State, AbstractSolver}

Access the constraints costs.

source

LocalSearchSolvers._constriction Method
julia
_constriction(x::Variable)

Return the cosntriction of x, i.e. the number of constraints restricting x.

source

LocalSearchSolvers._delete! Method
julia
_delete!(c::Constraint, x::Int)

Delete x from c.

source

LocalSearchSolvers._delete_from_constraint! Method
julia
_delete_from_constraint!(x::Variable, id)

Delete a constraint id from the list of constraints of x.

source

LocalSearchSolvers._draw! Method
julia
_draw!(s)

Draw a random (re-)starting configuration.

source

LocalSearchSolvers._dynamic! Method
julia
_dynamic!(options, dynamic) = begin

DOCSTRING

source

LocalSearchSolvers._dynamic Method
julia
_dynamic(options) = begin

DOCSTRING

source

LocalSearchSolvers._find_rand_argmax Method
julia
_find_rand_argmax(d::DictionaryView)

Compute argmax of d and select one element randomly.

source

LocalSearchSolvers._get_constraints Method
julia
_get_constraints(x::Variable)

Access the list of constraints of x.

source

LocalSearchSolvers._get_vars Method
julia
_get_vars(c::Constraint)

Returns the variables constrained by c.

source

LocalSearchSolvers._inc_cons! Method
julia
_inc_vars!(m::M) where M <: Union{Model, AbstractSolver}

Increment the maximum constraint id that has been attributed to m.

source

LocalSearchSolvers._inc_objs! Method
julia
_inc_vars!(m::M) where M <: Union{Model, AbstractSolver}

Increment the maximum objective id that has been attributed to m.

source

LocalSearchSolvers._inc_vars! Method
julia
_inc_vars!(m::M) where M <: Union{Model, AbstractSolver}

Increment the maximum variable id that has been attributed to m.

source

LocalSearchSolvers._info_path! Method
julia
_info_path!(options, iterations) = begin

DOCSTRING

source

LocalSearchSolvers._info_path Method
julia
_info_path(options, path)

DOCSTRING

source

LocalSearchSolvers._is_empty Method
julia
_is_empty(m::Model)

DOCSTRING

source

LocalSearchSolvers._iteration! Method
julia
_iteration!(options, iterations) = begin

DOCSTRING

source

LocalSearchSolvers._iteration Method
julia
_iteration(options) = begin

DOCSTRING

source

LocalSearchSolvers._length Method
julia
_length(c::Constraint)

Return the number of constrained variables by c.

source

LocalSearchSolvers._max_cons Method
julia
_max_cons(m::M) where M <: Union{Model, AbstractSolver}

Access the maximum constraint id that has been attributed to m.

source

LocalSearchSolvers._max_objs Method
julia
_max_objs(m::M) where M <: Union{Model, AbstractSolver}

Access the maximum objective id that has been attributed to m.

source

LocalSearchSolvers._max_vars Method
julia
_max_vars(m::M) where M <: Union{Model, AbstractSolver}

Access the maximum variable id that has been attributed to m.

source

LocalSearchSolvers._move! Function
julia
_move!(s, x::Int, dim::Int = 0)

Perform an improving move in x neighbourhood if possible.

Arguments:

  • s: a solver of type S <: AbstractSolver

  • x: selected variable id

  • dim: describe the dimension of the considered neighbourhood

source

LocalSearchSolvers._neighbours Function
julia
_neighbours(s, x, dim = 0)

DOCSTRING

Arguments:

  • s: DESCRIPTION

  • x: DESCRIPTION

  • dim: DESCRIPTION

source

LocalSearchSolvers._optimizing! Method
julia
_optimizing!(s::S) where S <: Union{_State, AbstractSolver}

Set the solver optimizing status to true.

source

LocalSearchSolvers._optimizing Method
julia
_optimizing(s::S) where S <: Union{_State, AbstractSolver}

Check if s is in an optimizing state.

source

LocalSearchSolvers._print_level! Method
julia
_print_level!(options, level) = begin

DOCSTRING

source

LocalSearchSolvers._print_level Method
julia
_print_level(options) = begin

DOCSTRING

source

LocalSearchSolvers._process_threads_map! Method
julia
_process_threads_map!(options, ptm)

TBW

source

LocalSearchSolvers._process_threads_map Method
julia
_process_threads_map(options)

TBW

source

LocalSearchSolvers._restart! Function
julia
_restart!(s, k = 10)

Restart a solver.

source

LocalSearchSolvers._satisfying! Method
julia
_satisfying!(s::S) where S <: Union{_State, AbstractSolver}

Set the solver optimizing status to false.

source

LocalSearchSolvers._select_worse Method
julia
_select_worse(s::S) where S <: Union{_State, AbstractSolver}

Within the non-tabu variables, select the one with the worse error .

source

LocalSearchSolvers._set! Method
julia
_set!(s::S, x, val) where S <: Union{_State, AbstractSolver}

Set the value of variable x to val.

source

LocalSearchSolvers._set_domain! Method
julia
_set_domain!(m::Model, x, values)

DOCSTRING

Arguments:

  • m: DESCRIPTION

  • x: DESCRIPTION

  • values: DESCRIPTION

source

LocalSearchSolvers._solutions! Method
julia
_solutions!(options, solutions) = begin

DOCSTRING

source

LocalSearchSolvers._solutions Method
julia
_solutions(options) = begin

DOCSTRING

source

LocalSearchSolvers._specialize! Method
julia
_specialize!(options, specialize) = begin

DOCSTRING

source

LocalSearchSolvers._specialize Method
julia
_specialize(options) = begin

DOCSTRING

source

LocalSearchSolvers._step! Method
julia
_step!(s)

Iterate a step of the solver run.

source

LocalSearchSolvers._swap_value! Method
julia
_set!(s::S, x, y) where S <: Union{_State, AbstractSolver}

Swap the values of variables x and y.

source

LocalSearchSolvers._tabu_delta! Method
julia
_tabu_delta!(options, time) = begin

DOCSTRING

source

LocalSearchSolvers._tabu_delta Method
julia
_tabu_delta(options) = begin

DOCSTRING

source

LocalSearchSolvers._tabu_local! Method
julia
_tabu_local!(options, time) = begin

DOCSTRING

source

LocalSearchSolvers._tabu_local Method
julia
_tabu_local(options) = begin

DOCSTRING

source

LocalSearchSolvers._tabu_time! Method
julia
_tabu_time!(options, time) = begin

DOCSTRING

source

LocalSearchSolvers._tabu_time Method
julia
_tabu_time(options) = begin

DOCSTRING

source

LocalSearchSolvers._threads Function
julia
_threads(options) = begin

DOCSTRING

source

LocalSearchSolvers._threads! Function
julia
_threads!(options, threads) = begin

DOCSTRING

source

LocalSearchSolvers._time_limit! Method
julia
_time_limit!(options, time::Time) = begin

DOCSTRING

source

LocalSearchSolvers._time_limit Method
julia
_time_limit(options)

DOCSTRING

source

LocalSearchSolvers._to_union Method
julia
_to_union(datatype)

Make a minimal Union type from a collection of data types.

source

LocalSearchSolvers._value! Method
julia
_value!(s::S, x, val) where S <: Union{_State, AbstractSolver}

Set the value of variable x to val.

source

LocalSearchSolvers._value Method
julia
_value(s::S, x) where S <: Union{_State, AbstractSolver}

Return the value of variable x.

source

LocalSearchSolvers._values! Method
julia
_values!(s::S, values) where S <: Union{_State, AbstractSolver}

Set the variables values.

source

LocalSearchSolvers._values Method
julia
_vars_costs(s::S) where S <: Union{_State, AbstractSolver}

Access the variables costs.

source

LocalSearchSolvers._var_cost! Method
julia
_var_cost!(s::S, x, cost) where S <: Union{_State, AbstractSolver}

Set the cost of variable x.

source

LocalSearchSolvers._var_cost Method
julia
_var_cost(s::S, x) where S <: Union{_State, AbstractSolver}

Return the cost of variable x.

source

LocalSearchSolvers._vars_costs! Method
julia
_vars_costs!(s::S, costs) where S <: Union{_State, AbstractSolver}

Set the variables costs.

source

LocalSearchSolvers._vars_costs Method
julia
_vars_costs(s::S) where S <: Union{_State, AbstractSolver}

Access the variables costs.

source

LocalSearchSolvers._verbose Method
julia
_verbose(settings, str)

Temporary logging function. #TODO: use better log instead (LoggingExtra.jl)

source

LocalSearchSolvers.add! Method
julia
add!(m::M, x) where M <: Union{Model, AbstractSolver}
+add!(m::M, c) where M <: Union{Model, AbstractSolver}
+add!(m::M, o) where M <: Union{Model, AbstractSolver}

Add a variable x, a constraint c, or an objective o to m.

source

LocalSearchSolvers.add_value! Method
julia
add_value!(m::M, x, val) where M <: Union{Model, AbstractSolver}

Add val to x domain.

source

LocalSearchSolvers.add_var_to_cons! Method
julia
add_var_to_cons!(m::M, c, x) where M <: Union{Model, AbstractSolver}

Add x to the constraint c list of restricted variables.

source

LocalSearchSolvers.constraint! Method
julia
constraint!(m::M, func, vars) where M <: Union{Model, AbstractSolver}

Add a constraint with an error function func defined over variables vars.

source

LocalSearchSolvers.constraint Method
julia
constraint(f, vars)

DOCSTRING

source

LocalSearchSolvers.constriction Method
julia
constriction(m::M, x) where M <: Union{Model, AbstractSolver}

Return the constriction of variable x.

source

LocalSearchSolvers.decay_tabu! Method
julia
_decay_tabu!(s::S) where S <: Union{_State, AbstractSolver}

Decay the tabu list.

source

LocalSearchSolvers.decrease_tabu! Method
julia
_decrease_tabu!(s::S, x) where S <: Union{_State, AbstractSolver}

Decrement the tabu value of variable x.

source

LocalSearchSolvers.delete_tabu! Method
julia
_delete_tabu!(s::S, x) where S <: Union{_State, AbstractSolver}

Delete the tabu entry of variable x.

source

LocalSearchSolvers.delete_value! Method
julia
delete_value(m::M, x, val) where M <: Union{Model, AbstractSolver}

Delete val from x domain.

source

LocalSearchSolvers.delete_var_from_cons! Method
julia
delete_var_from_cons(m::M, c, x) where M <: Union{Model, AbstractSolver}

Delete x from the constraint c list of restricted variables.

source

LocalSearchSolvers.describe Method
julia
describe(m::M) where M <: Union{Model, AbstractSolver}

Describe the model.

source

LocalSearchSolvers.domain_size Method
julia
domain_size(m::Model, x) = begin

DOCSTRING

source

LocalSearchSolvers.draw Method
julia
draw(m::M, x) where M <: Union{Model, AbstractSolver}

Draw a random value of x domain.

source

LocalSearchSolvers.empty_tabu! Method
julia
_empty_tabu!(s::S) where S <: Union{_State, AbstractSolver}

Empty the tabu list.

source

LocalSearchSolvers.get_cons_from_var Method
julia
get_cons_from_var(m::M, x) where M <: Union{Model, AbstractSolver}

Access the constraints restricting variable x.

source

LocalSearchSolvers.get_constraint Method
julia
get_constraint(m::M, c) where M <: Union{Model, AbstractSolver}

Access the constraint c.

source

LocalSearchSolvers.get_constraints Method
julia
get_constraints(m::M) where M <: Union{Model, AbstractSolver}

Access the constraints of m.

source

LocalSearchSolvers.get_domain Method
julia
get_domain(m::M, x) where M <: Union{Model, AbstractSolver}

Access the domain of variable x.

source

LocalSearchSolvers.get_kind Method
julia
get_kind(m::M) where M <: Union{Model, AbstractSolver}

Access the kind of m, such as :sudoku or :generic (default).

source

LocalSearchSolvers.get_name Method
julia
get_name(m::M, x) where M <: Union{Model, AbstractSolver}

Access the name of variable x.

source

LocalSearchSolvers.get_objective Method
julia
get_objective(m::M, o) where M <: Union{Model, AbstractSolver}

Access the objective o.

source

LocalSearchSolvers.get_objectives Method
julia
get_objectives(m::M) where M <: Union{Model, AbstractSolver}

Access the objectives of m.

source

LocalSearchSolvers.get_time_stamp Method
julia
get_time_stamp(m::M) where M <: Union{Model, AbstractSolver}

Access the time (since epoch) when the model was created. This time stamp is for internal performance measurement.

source

LocalSearchSolvers.get_variable Method
julia
get_variable(m::M, x) where M <: Union{Model, AbstractSolver}

Access the variable x.

source

LocalSearchSolvers.get_variables Method
julia
get_variables(m::M) where M <: Union{Model, AbstractSolver}

Access the variables of m.

source

LocalSearchSolvers.get_vars_from_cons Method
julia
get_vars_from_cons(m::M, c) where M <: Union{Model, AbstractSolver}

Access the variables restricted by constraint c.

source

LocalSearchSolvers.insert_tabu! Method
julia
_insert_tabu!(s::S, x, tabu_time) where S <: Union{_State, AbstractSolver}

Insert the bariable x as tabu for tabu_time.

source

LocalSearchSolvers.is_sat Method
julia
is_sat(m::M) where M <: Union{Model, AbstractSolver}

Return true if m is a satisfaction model.

source

LocalSearchSolvers.is_specialized Method
julia
is_specialized(m::M) where M <: Union{Model, AbstractSolver}

Return true if the model is already specialized.

source

LocalSearchSolvers.length_cons Method
julia
length_cons(m::M, c) where M <: Union{Model, AbstractSolver}

Return the length of constraint c.

source

LocalSearchSolvers.length_cons Method
julia
length_cons(m::M) where M <: Union{Model, AbstractSolver}

Return the number of constraints in m.

source

LocalSearchSolvers.length_objs Method
julia
length_objs(m::M) where M <: Union{Model, AbstractSolver}

Return the number of objectives in m.

source

LocalSearchSolvers.length_tabu Method
julia
_length_tabu!(s::S) where S <: Union{_State, AbstractSolver}

Return the length of the tabu list.

source

LocalSearchSolvers.length_var Method
julia
length_var(m::M, x) where M <: Union{Model, AbstractSolver}

Return the domain length of variable x.

source

LocalSearchSolvers.length_vars Method
julia
length_vars(m::M) where M <: Union{Model, AbstractSolver}

Return the number of variables in m.

source

LocalSearchSolvers.max_domains_size Method
julia
max_domains_size(m::Model, vars) = begin

DOCSTRING

source

LocalSearchSolvers.model Method
julia
model()

Construct a _Model, empty by default. It is recommended to add the constraints, variables, and objectives from an empty _Model. The following keyword arguments are available,

  • vars=Dictionary{Int,Variable}(): collection of variables

  • cons=Dictionary{Int,Constraint}(): collection of constraints

  • objs=Dictionary{Int,Objective}(): collection of objectives

  • kind=:generic: the kind of problem modeled (useful for specialized methods such as pretty printing)

source

LocalSearchSolvers.o_dist_extrema Method
julia
dist_extrema(values::T...) where {T <: Number}

Computes the distance between extrema in an ordered set.

source

LocalSearchSolvers.o_mincut Method
julia
o_mincut(graph, values; interdiction = 0)

Compute the capacity of a cut (determined by the state of the solver) with a possible interdiction on the highest capacited links.

source

LocalSearchSolvers.objective! Method
julia
objective!(m::M, func) where M <: Union{Model, AbstractSolver}

Add an objective evaluated by func.

source

LocalSearchSolvers.objective Method
julia
objective(func, name)

Construct an objective with a function func that should be applied to a collection of variables.

source

LocalSearchSolvers.post_process Method
julia
post_process(s::MainSolver)

Launch a series of tasks to round-up a solving run, for instance, export a run's info.

source

LocalSearchSolvers.remote_dispatch! Method
julia
remote_dispatch!(solver)

Starts the LeadSolvers attached to the MainSolver.

source

LocalSearchSolvers.remote_stop! Method
julia
remote_stop!!(solver)

Fetch the pool of solutions from LeadSolvers and merge it into the MainSolver.

source

LocalSearchSolvers.solution Method
julia
solution(s)

Return the only/best known solution of a satisfaction/optimization model.

source

LocalSearchSolvers.solve_for_loop! Method
julia
solve_for_loop!(solver, stop, sat, iter)

First loop in the solving process that starts LeadSolvers from the MainSolver, and _SubSolvers from each MetaSolver.

source

LocalSearchSolvers.solve_while_loop! Method
julia
solve_while_loop!(s, )

Search the space of configurations.

source

LocalSearchSolvers.specialize! Method
julia
specialize!(solver)

Replace the model of solver by one with specialized types (variables, constraints, objectives).

source

LocalSearchSolvers.specialize Method
julia
specialize(m::M) where M <: Union{Model, AbstractSolver}

Specialize the structure of a model to avoid dynamic type attribution at runtime.

source

LocalSearchSolvers.status Method
julia
status(solver)

Return the status of a MainSolver.

source

LocalSearchSolvers.stop_while_loop Method
julia
stop_while_loop()

Check the stop conditions of the solve! while inner loop.

source

LocalSearchSolvers.tabu_list Method
julia
_tabu(s::S) where S <: Union{_State, AbstractSolver}

Access the list of tabu variables.

source

LocalSearchSolvers.tabu_value Method
julia
_tabu(s::S, x) where S <: Union{_State, AbstractSolver}

Return the tabu value of variable x.

source

LocalSearchSolvers.variable! Function
julia
variable!(m::M, d) where M <: Union{Model, AbstractSolver}

Add a variable with domain d to m.

source

LocalSearchSolvers.variable Method
julia
variable(values::AbstractVector{T}, name::AbstractString; domain = :set) where T <: Number
 variable(domain::AbstractDomain, name::AbstractString) where D <: AbstractDomain

Construct a variable with discrete domain. See the domain method for other options.

julia
d = domain([1,2,3,4], types = :indices)
 x1 = variable(d, "x1")
-x2 = variable([-89,56,28], "x2", domain = :indices)

source


- +x2 = variable([-89,56,28], "x2", domain = :indices)

source

+ \ No newline at end of file