diff --git a/dev/404.html b/dev/404.html index 89f408b..edc6cd5 100644 --- a/dev/404.html +++ b/dev/404.html @@ -8,14 +8,14 @@ - +
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.
- + \ No newline at end of file diff --git a/dev/assets/app.1eOZa5Hk.js b/dev/assets/app.DQl-0XfV.js similarity index 95% rename from dev/assets/app.1eOZa5Hk.js rename to dev/assets/app.DQl-0XfV.js index 37ac48c..4e8a6b6 100644 --- a/dev/assets/app.1eOZa5Hk.js +++ b/dev/assets/app.DQl-0XfV.js @@ -1 +1 @@ -import{j 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,Y as P,d as _,u as v,l as R,z as w,ai as y,aj as C,ak as E,a6 as b}from"./chunks/framework.aA95Gx5L.js";import{R as T}from"./chunks/theme.CIqXObSN.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(T),S=_({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=v();return R(()=>{w(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&y(),C(),E(),s.setup&&s.setup(),()=>b(s.Layout)}});async function j(){globalThis.__VITEPRESS__=!0;const e=L(),a=D();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 D(){return h(S)}function L(){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=P(()=>import(n),[])),o&&(e=!1),r},s.NotFound)}o&&j().then(({app:e,router:a,data:t})=>{a.go().then(()=>{p(a.route,t.site),e.mount("#app")})});export{j as createApp}; +import{j 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,Y as P,d as _,u as v,l as R,z as w,ai as y,aj as C,ak as E,a6 as b}from"./chunks/framework.aA95Gx5L.js";import{R as T}from"./chunks/theme.s-t-bcG4.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(T),S=_({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=v();return R(()=>{w(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&y(),C(),E(),s.setup&&s.setup(),()=>b(s.Layout)}});async function j(){globalThis.__VITEPRESS__=!0;const e=L(),a=D();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 D(){return h(S)}function L(){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=P(()=>import(n),[])),o&&(e=!1),r},s.NotFound)}o&&j().then(({app:e,router:a,data:t})=>{a.go().then(()=>{p(a.route,t.site),e.mount("#app")})});export{j as createApp}; diff --git a/dev/assets/chunks/@localSearchIndexroot.CPW2lvOM.js b/dev/assets/chunks/@localSearchIndexroot.CPW2lvOM.js new file mode 100644 index 0000000..431f010 --- /dev/null +++ b/dev/assets/chunks/@localSearchIndexroot.CPW2lvOM.js @@ -0,0 +1 @@ +const i='{"documentCount":128,"nextId":128,"documentIds":{"0":"/dev/constraints/comparison_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","1":"/dev/constraints/comparison_constraints#Comparison-based-Constraints","2":"/dev/constraints/connection_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","3":"/dev/constraints/connection_constraints#Connection-Constraints","4":"/dev/constraints/constraint_commons#ConstraintCommons.jl","5":"/dev/constraints/constraint_commons#Key-Features-and-Functionalities","6":"/dev/constraints/constraint_commons#Parameters","7":"/dev/constraints/constraint_commons#Performances-–-TODO","8":"/dev/constraints/constraint_commons#Languages","9":"/dev/constraints/constraint_commons#Performances-–-TODO-2","10":"/dev/constraints/constraint_commons#Extensions","11":"/dev/constraints/constraint_commons#Performances-–-TODO-3","12":"/dev/constraints/constraint_commons#Sampling","13":"/dev/constraints/constraint_commons#Performances-–-TODO-4","14":"/dev/constraints/constraint_commons#Extrema","15":"/dev/constraints/constraint_commons#Performances-–-TODO-5","16":"/dev/constraints/constraint_commons#Dictionaries","17":"/dev/constraints/constraint_commons#Performances-–-TODO-6","18":"/dev/constraints/constraint_domains#ConstraintDomains.jl:-Defining-and-Exploring-Variable-Domains-within-JuliaConstraints","19":"/dev/constraints/constraint_domains#Key-Features-and-Functionalities","20":"/dev/constraints/constraint_domains#Empowering-Constraint-Programming-in-Julia","21":"/dev/constraints/constraint_domains#Commons","22":"/dev/constraints/constraint_domains#Extension-to-Base-module","23":"/dev/constraints/constraint_domains#Performances","24":"/dev/constraints/constraint_domains#Continuous","25":"/dev/constraints/constraint_domains#Extension-to-Base-module-2","26":"/dev/constraints/constraint_domains#Discrete","27":"/dev/constraints/constraint_domains#Extension-to-Base-module-3","28":"/dev/constraints/constraint_domains#General","29":"/dev/constraints/constraint_domains#Exploration","30":"/dev/constraints/constraint_domains#Parameters","31":"/dev/constraints/constraint_models#ConstraintModels.jl","32":"/dev/constraints/constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","33":"/dev/constraints/constraints#Key-Features-and-Functionalities","34":"/dev/constraints/constraints#Enabling-Advanced-Modeling-in-Constraint-Programming","35":"/dev/constraints/constraints#Basic-tools","36":"/dev/constraints/constraints#Usual-constraints-(based-on-and-including-XCSP3-core-categories)","37":"/dev/constraints/counting_summing_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","38":"/dev/constraints/counting_summing_constraints#Counting-and-Summing-Constraints","39":"/dev/constraints/elementary_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","40":"/dev/constraints/elementary_constraints#Elementary-Constraints","41":"/dev/constraints/generic_constraints#Generic-Constraints","42":"/dev/constraints/generic_constraints#Intention-Constraints","43":"/dev/constraints/generic_constraints#Defining-an-intention-constraint-in-JC-API","44":"/dev/constraints/generic_constraints#APIs","45":"/dev/constraints/generic_constraints#Test-for-DocumenterVitePress-Issue","46":"/dev/constraints/generic_constraints#Specific-documentation","47":"/dev/constraints/generic_constraints#Extension-Constraints","48":"/dev/constraints/graph_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","49":"/dev/constraints/graph_constraints#Constraints-on-Graphs","50":"/dev/constraints/language_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","51":"/dev/constraints/language_constraints#Constraints-defined-from-Languages","52":"/dev/constraints/intro#Introduction-to-basics-cosntraints-related-tools","53":"/dev/constraints/packing_scheduling_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","54":"/dev/constraints/packing_scheduling_constraints#Packing-and-Scheduling-Constraints","55":"/dev/cp/advanced#Advanced-Constraint-Programming-Techniques","56":"/dev/cp/advanced#Global-Constraints-and-Their-Uses","57":"/dev/cp/advanced#Search-Strategies-and-Optimization","58":"/dev/cp/applications#Applying-Optimization-Methods","59":"/dev/cp/applications#Case-Studies-and-Real-World-Applications","60":"/dev/cp/applications#From-Theory-to-Practice","61":"/dev/cp/contribution#Community-and-Contribution","62":"/dev/cp/contribution#Joining-the-JuliaConstraint-Community","63":"/dev/cp/contribution#Future-Directions","64":"/dev/cp/cp101#Constraint-Programming-101","65":"/dev/cp/cp101#What-is-Constraint-Programming?","66":"/dev/cp/cp101#Basic-Concepts-and-Terminology","67":"/dev/cp/cp101#How-CP-differs-from-other-optimization-techniques","68":"/dev/cp/ecosystem#Exploring-JuliaConstraint-Packages","69":"/dev/cp/ecosystem#Package-Overviews","70":"/dev/cp/ecosystem#Installation-and-Getting-Started-Guides","71":"/dev/cp/getting_started#Getting-Started-with-Julia-for-CP-and-Optimization","72":"/dev/cp/getting_started#Why-Julia?","73":"/dev/cp/getting_started#Setting-Up-Your-Julia-Environment","74":"/dev/cp/getting_started#Your-First-Julia-CP-Model","75":"/dev/cp/intro#Welcome-to-Julia-Constraints","76":"/dev/cp/models#Building-and-Analyzing-Models","77":"/dev/cp/models#Modeling-Best-Practices","78":"/dev/cp/models#Performance-Analysis-and-Improvement","79":"/dev/cp/opt#Dive-into-Optimization","80":"/dev/cp/opt#Understanding-Optimization","81":"/dev/cp/opt#Metaheuristics-Overview","82":"/dev/cp/opt#Mathematical-Programming-Basics","83":"/dev/cp/tuto_xp#Tutorials-and-Experiments","84":"/dev/cp/tuto_xp#Hands-On-Tutorials","85":"/dev/cp/tuto_xp#Experimental-Analysis","86":"/dev/full_api#Full-API","87":"/dev/index-old#JuliaConstraints","88":"/dev/index-old#Operational-Research-vs-Constraint-Programming","89":"/dev/index-old#Constraint-Based-Local-Search","90":"/dev/learning/aggregation#Aggregation-Layer","91":"/dev/learning/aggregation#List-of-aggregations","92":"/dev/learning/aggregation#Layer-generation","93":"/dev/learning/arithmetic#Arithmetic-Layer","94":"/dev/learning/arithmetic#List-of-arithmetic-operations","95":"/dev/learning/arithmetic#Layer-generation","96":"/dev/learning/comparison#Comparison-Layer","97":"/dev/learning/comparison#List-of-comparisons","98":"/dev/learning/comparison#Non-parametric","99":"/dev/learning/comparison#Param:-:val","100":"/dev/learning/comparison#Layer-generation","101":"/dev/learning/compositional_networks#CompositionalNetworks.jl","102":"/dev/learning/compositional_networks#Utilities","103":"/dev/learning/compositional_networks#Metrics","104":"/dev/learning/constraint_learning#ConstraintLearning.jl","105":"/dev/learning/intro#Learning-about-Constraints","106":"/dev/learning/layers#A-layer-structure-for-any-ICN","107":"/dev/learning/qubo_constraints#Introduction-to-QUBOConstraints.jl","108":"/dev/learning/qubo_constraints#Basic-features","109":"/dev/learning/qubo_encoding#Encoding-for-QUBO-programs","110":"/dev/learning/qubo_learning#Learning-QUBO-matrices","111":"/dev/learning/qubo_learning#Interface","112":"/dev/learning/qubo_learning#Examples-with-various-optimizers","113":"/dev/learning/qubo_learning#Gradient-Descent","114":"/dev/learning/qubo_learning#Constraint-based-Local-Search","115":"/dev/learning/transformation#Transformations-Layer","116":"/dev/learning/transformation#List-of-transformations","117":"/dev/learning/transformation#Non-parametric","118":"/dev/learning/transformation#Param:-:val","119":"/dev/learning/transformation#Layer-generation","120":"/dev/meta/meta_strategist#MetaStrategist.jl","121":"/dev/perf/benchmark_ext#BenchmarkTools-Extension","122":"/dev/perf/perf_interface#Interfacing-PerfChecker","123":"/dev/perf/perf_checker#PerfChecker.jl","124":"/dev/public_api#Public-API","125":"/dev/solvers/cbls#CBLS.jl","126":"/dev/solvers/intro#Solvers","127":"/dev/solvers/local_search_solvers#LocalSearchSolvers.jl"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[9,1,1],"1":[3,10,75],"2":[9,1,1],"3":[2,10,98],"4":[2,1,46],"5":[4,2,162],"6":[1,2,80],"7":[2,3,1],"8":[1,2,93],"9":[2,3,1],"10":[1,2,21],"11":[2,3,1],"12":[1,2,42],"13":[2,3,1],"14":[1,2,31],"15":[2,3,1],"16":[1,2,36],"17":[2,3,1],"18":[9,1,42],"19":[4,9,167],"20":[5,9,54],"21":[1,9,136],"22":[4,10,86],"23":[1,10,1],"24":[1,9,127],"25":[4,10,93],"26":[1,9,138],"27":[4,10,97],"28":[1,9,19],"29":[1,9,96],"30":[1,9,115],"31":[2,1,297],"32":[9,1,39],"33":[4,9,169],"34":[6,9,56],"35":[2,9,184],"36":[10,9,207],"37":[9,1,1],"38":[4,10,134],"39":[9,1,1],"40":[2,10,57],"41":[2,1,17],"42":[2,2,77],"43":[7,3,69],"44":[1,3,75],"45":[4,3,13],"46":[2,3,77],"47":[2,2,55],"48":[9,1,1],"49":[3,10,71],"50":[9,1,1],"51":[4,10,126],"52":[6,1,3],"53":[9,1,1],"54":[4,10,106],"55":[4,1,1],"56":[5,4,12],"57":[4,4,12],"58":[3,1,1],"59":[6,3,11],"60":[4,3,18],"61":[3,1,1],"62":[4,3,14],"63":[2,3,13],"64":[3,1,1],"65":[5,3,10],"66":[4,3,10],"67":[7,3,10],"68":[3,1,1],"69":[2,3,13],"70":[5,1,13],"71":[8,1,1],"72":[3,8,16],"73":[5,8,103],"74":[5,8,190],"75":[4,1,35],"76":[4,1,1],"77":[3,4,12],"78":[4,4,11],"79":[3,1,1],"80":[2,3,12],"81":[2,3,11],"82":[3,3,12],"83":[3,1,1],"84":[3,3,11],"85":[2,3,15],"86":[2,1,1145],"87":[1,1,122],"88":[5,2,93],"89":[4,2,80],"90":[2,1,11],"91":[3,2,26],"92":[2,2,26],"93":[2,1,11],"94":[4,2,22],"95":[2,2,25],"96":[2,1,11],"97":[3,2,10],"98":[2,5,53],"99":[2,5,34],"100":[2,5,49],"101":[2,1,5],"102":[1,2,93],"103":[1,2,45],"104":[2,1,232],"105":[3,1,6],"106":[6,1,144],"107":[4,1,5],"108":[2,4,35],"109":[4,1,64],"110":[3,1,1],"111":[1,3,31],"112":[4,3,1],"113":[2,7,102],"114":[4,7,1],"115":[2,1,30],"116":[3,2,10],"117":[2,5,66],"118":[2,5,58],"119":[2,5,157],"120":[2,1,5],"121":[2,1,26],"122":[2,1,18],"123":[2,1,54],"124":[2,1,596],"125":[2,1,251],"126":[1,1,3],"127":[2,1,504]},"averageFieldLength":[3.328125,3.6249999999999982,66.67187500000001],"storedFields":{"0":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"1":{"title":"Comparison-based Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia",null]},"2":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"3":{"title":"Connection Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia",null]},"4":{"title":"ConstraintCommons.jl","titles":[]},"5":{"title":"Key Features and Functionalities","titles":["ConstraintCommons.jl"]},"6":{"title":"Parameters","titles":["ConstraintCommons.jl"]},"7":{"title":"Performances – TODO","titles":["ConstraintCommons.jl","Parameters"]},"8":{"title":"Languages","titles":["ConstraintCommons.jl"]},"9":{"title":"Performances – TODO","titles":["ConstraintCommons.jl","Languages"]},"10":{"title":"Extensions","titles":["ConstraintCommons.jl"]},"11":{"title":"Performances – TODO","titles":["ConstraintCommons.jl","Extensions"]},"12":{"title":"Sampling","titles":["ConstraintCommons.jl"]},"13":{"title":"Performances – TODO","titles":["ConstraintCommons.jl","Sampling"]},"14":{"title":"Extrema","titles":["ConstraintCommons.jl"]},"15":{"title":"Performances – TODO","titles":["ConstraintCommons.jl","Extrema"]},"16":{"title":"Dictionaries","titles":["ConstraintCommons.jl"]},"17":{"title":"Performances – TODO","titles":["ConstraintCommons.jl","Dictionaries"]},"18":{"title":"ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints","titles":[]},"19":{"title":"Key Features and Functionalities","titles":["ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints"]},"20":{"title":"Empowering Constraint Programming in Julia","titles":["ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints"]},"21":{"title":"Commons","titles":["ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints"]},"22":{"title":"Extension to Base module","titles":["ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints","Commons"]},"23":{"title":"Performances","titles":["ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints","Commons"]},"24":{"title":"Continuous","titles":["ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints"]},"25":{"title":"Extension to Base module","titles":["ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints","Continuous"]},"26":{"title":"Discrete","titles":["ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints"]},"27":{"title":"Extension to Base module","titles":["ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints","Discrete"]},"28":{"title":"General","titles":["ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints"]},"29":{"title":"Exploration","titles":["ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints"]},"30":{"title":"Parameters","titles":["ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints"]},"31":{"title":"ConstraintModels.jl","titles":[]},"32":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"33":{"title":"Key Features and Functionalities","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"34":{"title":"Enabling Advanced Modeling in Constraint Programming","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"35":{"title":"Basic tools","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"36":{"title":"Usual constraints (based on and including XCSP3-core categories)","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"37":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"38":{"title":"Counting and Summing Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia",null]},"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",null]},"41":{"title":"Generic Constraints","titles":[]},"42":{"title":"Intention Constraints","titles":["Generic Constraints"]},"43":{"title":"Defining an intention constraint in JC-API","titles":["Generic Constraints","Intention Constraints"]},"44":{"title":"APIs","titles":["Generic Constraints","Intention Constraints"]},"45":{"title":"Test for DocumenterVitePress Issue","titles":["Generic Constraints","Intention Constraints"]},"46":{"title":"Specific documentation","titles":["Generic Constraints","Intention Constraints"]},"47":{"title":"Extension Constraints","titles":["Generic Constraints"]},"48":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"49":{"title":"Constraints on Graphs","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia",null]},"50":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"51":{"title":"Constraints defined from Languages","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia",null]},"52":{"title":"Introduction to basics cosntraints related tools","titles":[]},"53":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"54":{"title":"Packing and Scheduling Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia",null]},"55":{"title":"Advanced Constraint Programming Techniques","titles":[]},"56":{"title":"Global Constraints and Their Uses","titles":["Advanced Constraint Programming Techniques"]},"57":{"title":"Search Strategies and Optimization","titles":["Advanced Constraint Programming Techniques"]},"58":{"title":"Applying Optimization Methods","titles":[]},"59":{"title":"Case Studies and Real-World Applications","titles":["Applying Optimization Methods"]},"60":{"title":"From Theory to Practice","titles":["Applying Optimization Methods"]},"61":{"title":"Community and Contribution","titles":[]},"62":{"title":"Joining the JuliaConstraint Community","titles":["Community and Contribution"]},"63":{"title":"Future Directions","titles":["Community and Contribution"]},"64":{"title":"Constraint Programming 101","titles":[]},"65":{"title":"What is Constraint Programming?","titles":["Constraint Programming 101"]},"66":{"title":"Basic Concepts and Terminology","titles":["Constraint Programming 101"]},"67":{"title":"How CP differs from other optimization techniques","titles":["Constraint Programming 101"]},"68":{"title":"Exploring JuliaConstraint Packages","titles":[]},"69":{"title":"Package Overviews","titles":["Exploring JuliaConstraint Packages"]},"70":{"title":"Installation and Getting Started Guides","titles":[]},"71":{"title":"Getting Started with Julia for CP and Optimization","titles":[]},"72":{"title":"Why Julia?","titles":["Getting Started with Julia for CP and Optimization"]},"73":{"title":"Setting Up Your Julia Environment","titles":["Getting Started with Julia for CP and Optimization"]},"74":{"title":"Your First Julia CP Model","titles":["Getting Started with Julia for CP and Optimization"]},"75":{"title":"Welcome to Julia Constraints","titles":[]},"76":{"title":"Building and Analyzing Models","titles":[]},"77":{"title":"Modeling Best Practices","titles":["Building and Analyzing Models"]},"78":{"title":"Performance Analysis and Improvement","titles":["Building and Analyzing Models"]},"79":{"title":"Dive into Optimization","titles":[]},"80":{"title":"Understanding Optimization","titles":["Dive into Optimization"]},"81":{"title":"Metaheuristics Overview","titles":["Dive into Optimization"]},"82":{"title":"Mathematical Programming Basics","titles":["Dive into Optimization"]},"83":{"title":"Tutorials and Experiments","titles":[]},"84":{"title":"Hands-On Tutorials","titles":["Tutorials and Experiments"]},"85":{"title":"Experimental Analysis","titles":["Tutorials and Experiments"]},"86":{"title":"Full API","titles":[]},"87":{"title":"JuliaConstraints","titles":[null]},"88":{"title":"Operational Research vs Constraint Programming","titles":[null,"JuliaConstraints"]},"89":{"title":"Constraint-Based Local Search","titles":[null,"JuliaConstraints"]},"90":{"title":"Aggregation Layer","titles":[]},"91":{"title":"List of aggregations","titles":["Aggregation Layer"]},"92":{"title":"Layer generation","titles":["Aggregation Layer"]},"93":{"title":"Arithmetic Layer","titles":[]},"94":{"title":"List of arithmetic operations","titles":["Arithmetic Layer"]},"95":{"title":"Layer generation","titles":["Arithmetic Layer"]},"96":{"title":"Comparison Layer","titles":[]},"97":{"title":"List of comparisons","titles":["Comparison Layer"]},"98":{"title":"Non-parametric","titles":["Comparison Layer","List of comparisons"]},"99":{"title":"Param: :val","titles":["Comparison Layer","List of comparisons"]},"100":{"title":"Layer generation","titles":["Comparison Layer","List of comparisons"]},"101":{"title":"CompositionalNetworks.jl","titles":[]},"102":{"title":"Utilities","titles":["CompositionalNetworks.jl"]},"103":{"title":"Metrics","titles":["CompositionalNetworks.jl"]},"104":{"title":"ConstraintLearning.jl","titles":[]},"105":{"title":"Learning about Constraints","titles":[]},"106":{"title":"A layer structure for any ICN","titles":[]},"107":{"title":"Introduction to QUBOConstraints.jl","titles":[]},"108":{"title":"Basic features","titles":["Introduction to QUBOConstraints.jl"]},"109":{"title":"Encoding for QUBO programs","titles":[]},"110":{"title":"Learning QUBO matrices","titles":[]},"111":{"title":"Interface","titles":["Learning QUBO matrices"]},"112":{"title":"Examples with various optimizers","titles":["Learning QUBO matrices"]},"113":{"title":"Gradient Descent","titles":["Learning QUBO matrices","Examples with various optimizers"]},"114":{"title":"Constraint-based Local Search","titles":["Learning QUBO matrices","Examples with various optimizers"]},"115":{"title":"Transformations Layer","titles":[]},"116":{"title":"List of transformations","titles":["Transformations Layer"]},"117":{"title":"Non-parametric","titles":["Transformations Layer","List of transformations"]},"118":{"title":"Param: :val","titles":["Transformations Layer","List of transformations"]},"119":{"title":"Layer generation","titles":["Transformations Layer","List of transformations"]},"120":{"title":"MetaStrategist.jl","titles":[]},"121":{"title":"BenchmarkTools Extension","titles":[]},"122":{"title":"Interfacing PerfChecker","titles":[]},"123":{"title":"PerfChecker.jl","titles":[]},"124":{"title":"Public API","titles":[]},"125":{"title":"CBLS.jl","titles":[]},"126":{"title":"Solvers","titles":[]},"127":{"title":"LocalSearchSolvers.jl","titles":[]}},"dirtCount":0,"index":[["θ",{"2":{"113":2}}],["≥",{"2":{"113":1}}],["^2",{"2":{"113":1}}],["η",{"2":{"104":1,"113":6}}],["σ",{"2":{"86":2,"108":2,"124":2}}],["∉",{"2":{"86":3}}],["⋯",{"2":{"74":2}}],["×",{"2":{"74":3}}],["+",{"2":{"46":2,"86":9,"87":1,"91":1,"117":2,"118":4}}],[">",{"2":{"44":2,"49":1,"86":1,"113":8}}],["≠",{"2":{"43":1,"44":1,"125":2}}],["|",{"2":{"125":4}}],["||",{"2":{"86":2}}],["|the",{"2":{"43":1}}],["|≠|x",{"2":{"43":1}}],["|x",{"2":{"43":1,"125":4}}],["−x",{"2":{"43":2}}],["yes",{"2":{"127":1}}],["yet",{"2":{"19":1,"21":1,"24":1,"31":1,"33":1,"86":2}}],["you",{"2":{"87":1}}],["your",{"0":{"73":1,"74":1}}],["y",{"2":{"42":2,"44":5,"47":1,"87":1,"104":4,"113":7,"127":2}}],["y=1",{"2":{"36":1,"86":1}}],["7",{"2":{"31":3,"38":2,"54":3,"86":5,"123":1}}],["`function",{"2":{"127":1}}],["`struct",{"2":{"127":1}}],["``",{"2":{"125":6}}],["`",{"2":{"51":1,"86":1,"104":1}}],["`automaton`",{"2":{"51":1,"86":1}}],["`x`",{"2":{"51":2,"86":2}}],["`grid`",{"2":{"31":1}}],["`m`",{"2":{"31":1}}],["`rangedomain``",{"2":{"21":1,"24":1,"26":1,"86":1,"124":1}}],["q",{"2":{"104":7,"113":18}}],["qap",{"2":{"31":1}}],["qubooptimizer",{"2":{"104":2}}],["qubogradientoptimizer",{"2":{"104":4}}],["qubo",{"0":{"109":1,"110":1},"1":{"111":1,"112":1,"113":1,"114":1},"2":{"86":5,"104":4,"108":4,"111":1,"124":2}}],["quboconstraints",{"0":{"107":1},"1":{"108":1},"2":{"5":1,"86":7,"104":1,"107":1,"108":2,"109":3,"111":2,"113":1,"124":5}}],["quite",{"2":{"74":1}}],["quot",{"2":{"35":6,"54":4,"74":6,"86":10,"87":4}}],["quadractic",{"2":{"31":1}}],["queens",{"2":{"31":6}}],["zeros",{"2":{"113":3}}],["zero",{"2":{"31":1,"54":11,"86":11}}],["≤",{"2":{"22":4,"25":4,"27":4,"54":1,"74":2,"86":5}}],["9×9",{"2":{"31":4}}],["9",{"2":{"21":1,"24":1,"26":1,"31":4,"74":7,"86":1,"124":1}}],["8",{"2":{"31":3,"38":5,"54":1,"86":6}}],["86",{"2":{"21":1,"24":1,"26":1,"86":1,"124":1}}],["89",{"2":{"21":2,"24":2,"26":2,"86":2,"124":2,"127":1}}],["∈",{"2":{"19":1,"21":1,"22":7,"25":7,"27":7,"86":8,"124":1,"127":3}}],["δ",{"2":{"14":1,"86":1,"104":1,"113":1,"124":1}}],["heavily",{"2":{"115":1}}],["helps",{"2":{"87":1}}],["help",{"2":{"87":2,"88":1}}],["heuristic",{"2":{"74":1,"89":2}}],["heights",{"2":{"54":5,"86":5}}],["here",{"2":{"36":1,"44":1,"86":1}}],["highly",{"2":{"106":1}}],["highlight",{"2":{"75":1}}],["highlighting",{"2":{"62":1,"72":1}}],["high",{"2":{"87":1}}],["higher",{"2":{"42":1,"44":1}}],["highest",{"2":{"21":1,"24":1,"26":1,"86":1,"124":1,"127":1}}],["hide",{"2":{"46":2,"86":2}}],["https",{"2":{"36":1,"86":1,"124":1}}],["hot",{"2":{"86":3,"109":3,"113":1,"124":3}}],["hosts",{"2":{"87":1}}],["host",{"2":{"73":1}}],["however",{"2":{"74":1}}],["how",{"0":{"67":1},"2":{"33":1,"42":1,"43":1,"44":2,"56":1,"62":1,"78":1,"85":1,"97":1,"116":1}}],["holds",{"2":{"87":1}}],["hold",{"2":{"3":4,"86":4,"104":1}}],["hamming",{"2":{"86":4,"103":2,"104":3,"124":4}}],["hand",{"2":{"88":1}}],["hands",{"0":{"84":1}}],["handling",{"2":{"32":1,"33":2}}],["handled",{"2":{"24":1,"86":1}}],["handle",{"2":{"21":1,"44":2,"86":1,"127":2}}],["handles",{"2":{"19":1}}],["hardware",{"2":{"73":1}}],["have",{"2":{"31":2,"36":1,"46":1,"59":1,"73":1,"86":6,"89":1,"102":2,"124":4}}],["half",{"2":{"29":1,"86":1,"124":1}}],["has",{"2":{"12":1,"36":3,"74":1,"86":6,"106":1,"109":1,"121":1,"124":2,"127":10}}],["keep",{"2":{"86":1,"108":1}}],["keywords",{"2":{"86":1,"124":1}}],["keyword",{"2":{"35":2,"36":8,"86":9,"124":1,"127":1}}],["key",{"0":{"5":1,"19":1,"33":1},"2":{"36":2,"66":1,"86":2}}],["k",{"2":{"86":2,"94":2,"127":1}}],["known",{"2":{"31":1,"38":3,"86":5,"124":2,"127":1}}],["kind=",{"2":{"127":1}}],["kind",{"2":{"14":1,"29":1,"30":1,"86":2,"124":1,"127":6}}],["kinds",{"2":{"8":1}}],["kargs",{"2":{"6":1,"35":6,"36":5,"86":7,"104":6,"124":5}}],["wrappers",{"2":{"87":1}}],["wrapping",{"2":{"87":1}}],["write",{"2":{"86":2,"87":1,"124":2}}],["was",{"2":{"122":1,"127":1}}],["way",{"2":{"36":1,"42":1,"44":1,"47":1,"86":3}}],["warning",{"2":{"31":2,"35":1,"86":1}}],["would",{"2":{"36":1,"86":1}}],["worse",{"2":{"127":3}}],["world",{"0":{"59":1},"2":{"60":1,"75":1}}],["works",{"2":{"35":1,"86":1,"124":1}}],["work",{"2":{"33":2}}],["working",{"2":{"32":1,"34":1}}],["workflows",{"2":{"5":1}}],["workflow",{"2":{"5":1}}],["word",{"2":{"8":6,"30":2,"51":2,"86":8,"124":1}}],["why",{"0":{"72":1}}],["what",{"0":{"65":1},"2":{"36":1,"74":1,"75":1,"86":1}}],["whole",{"2":{"35":1,"86":1,"124":1,"127":1}}],["which",{"2":{"22":1,"31":8,"36":1,"51":2,"74":1,"86":6,"102":1,"106":1,"124":1}}],["while",{"2":{"19":1,"88":2,"89":1,"127":5}}],["when",{"2":{"31":1,"74":1,"86":19,"104":2,"117":10,"118":6,"119":2,"125":1,"127":2}}],["whether",{"2":{"20":1,"34":1,"35":1,"36":1,"38":1,"54":1,"86":4}}],["where",{"2":{"19":1,"21":5,"22":5,"24":5,"25":4,"26":5,"27":4,"30":2,"31":1,"38":1,"46":1,"49":2,"51":1,"59":1,"86":18,"88":1,"89":2,"98":2,"113":1,"124":6,"125":2,"127":69}}],["welcome",{"0":{"75":1}}],["well",{"2":{"74":1}}],["weighting",{"2":{"104":1}}],["weighted",{"2":{"86":1}}],["weight",{"2":{"31":1,"86":2,"108":1,"124":1}}],["weights=nothing",{"2":{"86":1,"124":1}}],["weights",{"2":{"31":3,"86":17,"104":5,"106":5,"124":8}}],["weigths",{"2":{"31":1,"86":1,"103":1,"106":2}}],["we",{"2":{"10":1,"12":1,"14":1,"16":1,"42":1,"43":1,"44":1,"73":4,"74":6,"125":1}}],["w",{"2":{"8":2,"30":2,"86":4,"104":2,"106":2,"124":2}}],["width",{"2":{"36":2,"86":2,"124":2}}],["width=150",{"2":{"36":1,"86":1,"124":1}}],["wide",{"2":{"33":1,"51":1,"86":1}}],["wikipedia",{"2":{"31":2,"74":1}}],["will",{"2":{"6":1,"29":1,"36":1,"73":2,"74":1,"86":9,"92":1,"95":1,"100":1,"104":1,"106":1,"109":1,"121":1,"122":1,"124":8,"125":2}}],["with",{"0":{"71":1,"112":1},"1":{"72":1,"73":1,"74":1,"113":1,"114":1},"2":{"5":3,"8":1,"19":1,"24":1,"30":1,"31":9,"33":4,"34":1,"35":7,"36":7,"51":4,"54":3,"67":1,"70":1,"74":5,"86":56,"87":3,"88":3,"89":1,"100":1,"102":2,"104":3,"106":4,"117":10,"118":6,"119":3,"121":1,"124":10,"125":2,"127":8}}],["without",{"2":{"5":1,"86":17,"117":10,"118":6}}],["within",{"0":{"18":1},"1":{"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1},"2":{"4":1,"18":1,"19":1,"32":1,"33":3,"51":2,"69":1,"73":1,"86":8,"90":1,"93":1,"96":1,"115":1,"127":1}}],["right",{"2":{"86":18,"117":15,"119":3}}],["rich",{"2":{"20":1}}],["rules",{"2":{"51":2,"86":2}}],["ruler",{"2":{"31":1,"43":4,"46":2,"86":2}}],["runtime",{"2":{"127":1}}],["run",{"2":{"31":1,"74":1,"104":1,"125":1,"127":5}}],["rawoptimizerattribute",{"2":{"125":2}}],["raw",{"2":{"31":2}}],["rates",{"2":{"31":1}}],["rate",{"2":{"31":1}}],["rand",{"2":{"19":1,"21":1,"22":16,"25":9,"27":9,"30":8,"86":13,"124":1,"127":2}}],["randomly",{"2":{"22":2,"25":1,"27":1,"30":1,"86":1,"127":1}}],["random",{"2":{"19":2,"22":2,"25":1,"27":1,"30":10,"86":10,"124":1,"127":2}}],["rangedomain",{"2":{"19":1,"26":2,"28":2,"86":4,"124":2}}],["ranges",{"2":{"19":3,"26":1,"86":1,"124":1}}],["range",{"2":{"18":1,"19":1,"21":1,"24":1,"26":3,"33":2,"51":1,"86":4,"124":3}}],["round",{"2":{"113":1,"127":1}}],["routing",{"2":{"49":2,"86":2,"88":1}}],["robust",{"2":{"34":1}}],["rows",{"2":{"74":1}}],["row",{"2":{"31":1,"74":1}}],["role",{"2":{"5":1,"82":1}}],["roles",{"2":{"5":1}}],["r",{"2":{"21":2,"24":2,"26":2,"31":2,"51":3,"86":5,"113":8,"124":2}}],["remote",{"2":{"127":2}}],["remotely",{"2":{"127":1}}],["re",{"2":{"127":1}}],["recommended",{"2":{"125":1,"127":1}}],["recognize",{"2":{"8":1}}],["ref",{"2":{"115":1,"127":6}}],["refer",{"2":{"31":5}}],["rev",{"2":{"86":5,"117":4,"119":1}}],["reverse",{"2":{"31":1,"86":1,"119":1}}],["registries",{"2":{"123":1}}],["regions",{"2":{"74":1}}],["regularization",{"2":{"86":2,"124":2}}],["regular",{"2":{"51":9,"86":9}}],["repositories",{"2":{"87":1}}],["replace",{"2":{"127":1}}],["repl",{"2":{"73":1}}],["represented",{"2":{"51":2,"86":2}}],["represents",{"2":{"36":1,"86":1}}],["represent",{"2":{"19":1}}],["representing",{"2":{"19":1,"51":1,"86":1}}],["relies",{"2":{"115":1}}],["relate",{"2":{"86":1,"119":1}}],["related",{"0":{"52":1},"2":{"104":1,"105":1,"121":1}}],["relatively",{"2":{"86":1,"102":1,"127":1}}],["relationships",{"2":{"47":1}}],["relying",{"2":{"5":1}}],["retrieve",{"2":{"31":1}}],["returned",{"2":{"35":1,"86":1}}],["returns",{"2":{"22":3,"25":2,"27":2,"29":1,"30":1,"35":13,"86":17,"119":1,"123":1,"124":1,"127":1}}],["return",{"2":{"1":3,"3":4,"6":1,"8":3,"21":3,"22":5,"24":3,"25":8,"26":3,"27":8,"30":2,"31":1,"35":7,"36":6,"38":4,"40":1,"49":1,"51":1,"54":2,"86":63,"98":3,"99":3,"102":1,"104":4,"106":5,"113":8,"117":2,"118":2,"124":20,"125":2,"127":21}}],["reach",{"2":{"86":1,"103":1,"124":1}}],["reactants",{"2":{"31":2}}],["reactions",{"2":{"31":1}}],["reaction",{"2":{"31":4}}],["readers",{"2":{"60":1,"62":1,"75":1}}],["realm",{"2":{"20":1}}],["real",{"0":{"59":1},"2":{"19":1,"21":3,"24":5,"26":4,"35":1,"60":1,"75":1,"86":7,"124":6,"125":2}}],["reinforcement",{"2":{"29":1,"86":1,"87":1,"124":1}}],["resume",{"2":{"127":1}}],["result",{"2":{"35":3,"86":23,"102":1,"117":10,"118":6,"119":2}}],["results",{"2":{"24":2,"31":1,"33":1,"35":1,"86":3}}],["resulting",{"2":{"5":1}}],["restart",{"2":{"127":6}}],["restricting",{"2":{"127":2}}],["restriction",{"2":{"35":2,"86":2,"124":2}}],["restricts",{"2":{"38":3,"86":3}}],["restricted",{"2":{"22":1,"25":1,"27":1,"127":4}}],["respect",{"2":{"86":1,"119":1}}],["respectively",{"2":{"19":1,"31":2}}],["researchers",{"2":{"32":1}}],["research",{"0":{"88":1},"2":{"20":1,"34":1,"63":1,"87":1,"88":1}}],["resources",{"2":{"19":1}}],["required",{"2":{"29":1,"86":2,"111":1,"122":1,"124":1}}],["requirements",{"2":{"8":2,"86":2}}],["requiring",{"2":{"5":1}}],["reduce",{"2":{"86":3,"88":1,"94":2,"102":1}}],["reduced",{"2":{"29":1,"86":1,"124":1}}],["reducing",{"2":{"5":1}}],["redundant",{"2":{"5":1,"33":1}}],["give",{"2":{"86":1,"124":1}}],["given",{"2":{"31":2,"35":1,"38":7,"51":2,"86":18,"104":6,"106":2,"108":1,"109":1,"124":7,"125":8}}],["game",{"2":{"74":1}}],["gap",{"2":{"5":1}}],["guides",{"0":{"70":1}}],["guide",{"2":{"60":1}}],["gt",{"2":{"43":1,"87":1}}],["gcc",{"2":{"38":3,"86":3}}],["good",{"2":{"89":1}}],["goes",{"2":{"33":1}}],["goal",{"2":{"31":1,"87":1}}],["golomb",{"2":{"31":2,"43":2,"46":1,"86":1}}],["grads",{"2":{"113":2}}],["gradientdescentoptimizer",{"2":{"113":5}}],["gradient",{"0":{"113":1},"2":{"104":1,"113":1}}],["graphs",{"0":{"49":1}}],["graph",{"2":{"31":4,"51":1,"86":1,"127":1}}],["greater",{"2":{"35":1,"86":12,"117":7,"118":1,"119":3}}],["grid",{"2":{"31":5,"74":3}}],["groundwork",{"2":{"20":1}}],["genetic",{"2":{"81":1,"86":4,"104":3,"124":4}}],["generalstate",{"2":{"127":2}}],["generally",{"2":{"31":1}}],["general",{"0":{"28":1},"2":{"127":1}}],["generated",{"2":{"86":18,"117":10,"118":6,"124":1}}],["generates",{"2":{"30":1,"86":5,"106":2,"119":1,"124":1}}],["generate",{"2":{"19":1,"30":10,"36":1,"86":26,"92":1,"95":1,"100":1,"102":2,"104":2,"106":4,"119":2,"124":7}}],["generation",{"0":{"92":1,"95":1,"100":1,"119":1},"2":{"19":1,"86":2,"124":2}}],["generating",{"2":{"19":2}}],["generic",{"0":{"41":1},"1":{"42":1,"43":1,"44":1,"45":1,"46":1,"47":1},"2":{"4":1,"5":2,"41":1,"46":1,"86":1,"87":1,"125":1,"127":2}}],["getting",{"0":{"70":1,"71":1},"1":{"72":1,"73":1,"74":1},"2":{"70":1}}],["get",{"2":{"19":1,"21":1,"31":2,"36":2,"74":1,"86":5,"119":2,"123":2,"124":1,"125":2,"127":17}}],["g",{"2":{"5":1,"31":1,"80":1,"86":15,"117":8,"118":4,"119":3}}],["global",{"0":{"56":1},"2":{"1":7,"3":6,"33":1,"38":4,"40":2,"49":2,"54":6,"56":1,"74":1,"86":36,"104":2,"124":5,"125":5}}],["block",{"2":{"74":1}}],["blocks",{"2":{"74":2}}],["blank",{"2":{"31":2}}],["binarization==",{"2":{"113":1}}],["binarization",{"2":{"86":4,"104":2,"109":4,"113":13,"124":4}}],["binarize",{"2":{"86":2,"109":2,"113":3,"124":2}}],["binarized",{"2":{"86":1,"108":1}}],["binary",{"2":{"47":1,"86":1,"109":1,"124":1}}],["bias",{"2":{"86":3,"103":1,"124":3}}],["bit",{"2":{"86":2,"109":1,"124":2}}],["bits",{"2":{"86":3,"106":2,"124":1}}],["bitvector",{"2":{"86":5,"102":4,"124":1}}],["bijective",{"2":{"3":2,"86":2}}],["but",{"2":{"31":1,"74":1}}],["building",{"0":{"76":1},"1":{"77":1,"78":1},"2":{"77":1}}],["build",{"2":{"8":1,"10":3,"87":1,"98":1,"99":1,"100":1,"102":1,"103":1,"106":1,"122":1,"125":2}}],["bariable",{"2":{"127":1}}],["back",{"2":{"49":2,"86":2}}],["backward",{"2":{"31":1}}],["basis",{"2":{"74":1}}],["basics",{"0":{"52":1,"82":1}}],["basic",{"0":{"35":1,"66":1,"108":1},"2":{"4":1,"5":3,"19":1,"73":1,"86":5,"104":1,"108":1,"119":4}}],["base",{"0":{"22":1,"25":1,"27":1},"2":{"10":3,"21":3,"22":12,"25":8,"27":9,"28":3,"30":4,"31":9,"86":27,"106":1,"108":2,"124":4,"125":2,"127":4}}],["based",{"0":{"1":1,"36":1,"89":1,"114":1},"2":{"5":1,"6":2,"16":1,"19":1,"30":1,"35":1,"36":1,"86":8,"89":1,"104":2,"106":1,"109":1,"119":2,"121":1,"124":4,"125":2}}],["b",{"2":{"21":1,"22":8,"24":1,"25":8,"26":1,"27":8,"51":2,"86":11,"124":1}}],["breaking",{"2":{"123":3}}],["broad",{"2":{"18":1}}],["bridges",{"2":{"5":1}}],["bounded",{"2":{"86":1,"118":1}}],["bounding",{"2":{"86":6,"118":4,"119":2}}],["bounds",{"2":{"21":1,"86":1,"124":1}}],["boxes",{"2":{"74":1}}],["bool=true",{"2":{"38":1,"86":1}}],["bool=false",{"2":{"38":3,"86":3}}],["boolparameterdomain",{"2":{"30":1,"86":1}}],["boolean",{"2":{"12":1,"30":1,"33":1,"35":2,"86":4,"124":2,"125":1}}],["bool",{"2":{"6":1,"21":4,"24":4,"26":4,"38":1,"54":3,"86":9,"113":1,"124":4,"125":2,"127":4}}],["both",{"2":{"4":1,"14":1,"18":1,"29":1,"31":2,"32":1,"35":2,"86":6,"88":1,"124":2}}],["by",{"2":{"3":2,"4":1,"5":2,"8":1,"19":1,"20":1,"22":1,"25":1,"26":1,"27":1,"29":1,"31":1,"33":3,"34":1,"35":1,"36":1,"38":1,"42":2,"47":3,"51":4,"70":1,"84":1,"86":21,"89":1,"102":1,"104":4,"106":1,"118":1,"124":6,"127":10}}],["begin",{"2":{"125":14,"127":23}}],["benchmarking",{"2":{"121":1}}],["benchmarktools",{"0":{"121":1},"2":{"121":1}}],["better",{"2":{"88":1,"127":2}}],["between",{"2":{"3":2,"5":2,"6":1,"14":2,"19":1,"21":3,"24":2,"26":2,"31":2,"36":1,"43":2,"46":4,"47":1,"86":15,"98":1,"99":1,"124":7,"125":1,"127":1}}],["best",{"0":{"77":1},"2":{"73":1,"77":1,"104":1,"127":1}}],["been",{"2":{"59":1,"121":1,"127":7}}],["before",{"2":{"54":8,"86":8}}],["because",{"2":{"42":1,"47":1}}],["behave",{"2":{"33":1}}],["behaviors",{"2":{"33":1,"34":1}}],["behavior",{"2":{"19":1,"29":1,"33":1,"86":1}}],["beware",{"2":{"29":1,"86":1,"124":1}}],["belongs",{"2":{"22":1,"25":1,"27":1,"127":2}}],["beyond",{"2":{"19":1,"33":1}}],["be",{"2":{"3":2,"5":1,"19":1,"21":1,"29":2,"31":3,"35":3,"36":2,"38":2,"42":2,"47":3,"51":3,"73":1,"74":1,"86":27,"88":2,"89":2,"92":1,"95":1,"100":1,"104":2,"106":5,"109":1,"119":1,"124":8,"125":2,"127":3}}],["69",{"2":{"21":1,"24":1,"26":1,"86":1,"124":1}}],["6",{"2":{"3":1,"31":2,"40":1,"54":3,"86":5,"123":1}}],["up",{"0":{"73":1},"2":{"127":1}}],["upcoming",{"2":{"63":1}}],["update",{"2":{"36":2,"86":2}}],["undefkeyworderror",{"2":{"113":1}}],["under",{"2":{"86":1,"119":1}}],["understanding",{"0":{"80":1},"2":{"88":1}}],["underpin",{"2":{"18":1}}],["unrolled",{"2":{"86":1}}],["unacceptable",{"2":{"86":2}}],["unordered",{"2":{"26":1,"86":1}}],["until",{"2":{"12":1,"86":1,"124":1}}],["unique",{"2":{"3":2,"43":2,"46":1,"86":3,"125":1}}],["union",{"2":{"3":4,"6":1,"8":2,"16":1,"22":2,"25":1,"27":1,"28":2,"30":2,"36":1,"38":1,"86":12,"124":4,"125":2,"127":69}}],["utility",{"2":{"33":1}}],["utilities",{"0":{"102":1},"2":{"12":1}}],["utilized",{"2":{"4":1,"5":1,"86":1}}],["us",{"2":{"125":1}}],["usage",{"2":{"44":1,"121":1}}],["usability",{"2":{"5":1}}],["using",{"2":{"36":1,"74":1,"86":1,"87":1,"104":1,"124":1}}],["usually",{"2":{"46":1,"86":1,"127":1}}],["usual",{"0":{"36":1},"2":{"6":8,"33":5,"35":2,"36":19,"42":1,"43":3,"44":1,"86":24,"90":1,"93":1,"96":1,"115":1,"124":14}}],["useful",{"2":{"86":1,"89":2,"106":1,"127":1}}],["uses",{"0":{"56":1},"2":{"86":1,"88":2,"89":2,"104":1,"119":1}}],["user",{"2":{"5":1,"34":1,"127":2}}],["users",{"2":{"5":3,"20":1,"33":2,"73":2}}],["used",{"2":{"3":6,"8":3,"21":1,"30":8,"35":2,"36":2,"40":2,"49":2,"51":1,"54":8,"73":1,"86":38,"88":1,"102":1,"104":2,"106":2,"111":1,"124":1,"125":2,"127":1}}],["use",{"2":{"1":2,"5":1,"12":1,"26":1,"33":1,"38":1,"43":2,"72":1,"73":2,"74":1,"86":5,"89":2,"115":1,"124":2,"125":1,"127":2}}],["pkg",{"2":{"123":2}}],["penalty",{"2":{"104":9,"113":20}}],["perform",{"2":{"127":1}}],["performance",{"0":{"78":1},"2":{"33":1,"72":1,"78":1,"127":1}}],["performances",{"0":{"7":1,"9":1,"11":1,"13":1,"15":1,"17":1,"23":1}}],["perfchecker",{"0":{"122":1,"123":1},"2":{"121":1,"122":1,"123":5}}],["per",{"2":{"86":1,"109":1,"124":1}}],["pôpulation",{"2":{"104":1}}],["public",{"0":{"124":1}}],["push",{"2":{"113":1}}],["pure",{"2":{"87":3}}],["purely",{"2":{"87":1}}],["purpose",{"2":{"69":1,"125":1}}],["purposes",{"2":{"20":1,"34":1,"35":1,"86":1,"104":1}}],["puzzles",{"2":{"74":1}}],["puzzle",{"2":{"74":3}}],["pluto",{"2":{"73":1}}],["please",{"2":{"43":1,"73":1}}],["platform",{"2":{"34":1}}],["plays",{"2":{"5":1}}],["p",{"2":{"31":2,"86":1,"103":1,"124":1,"125":1}}],["pool",{"2":{"127":1}}],["pop",{"2":{"104":2}}],["population",{"2":{"86":2,"104":2,"124":2}}],["popsize=100",{"2":{"104":1}}],["popsize=200",{"2":{"86":1,"124":1}}],["popsize",{"2":{"86":4,"124":4}}],["post",{"2":{"75":1,"127":1}}],["posed",{"2":{"74":1}}],["possible",{"2":{"73":1,"88":1,"97":1,"116":1,"125":1,"127":2}}],["possibly",{"2":{"26":1,"36":1,"86":2}}],["positional",{"2":{"35":1,"86":1}}],["positive",{"2":{"35":4,"86":15,"91":3,"98":2,"99":2,"117":2,"118":2,"124":4}}],["pos",{"2":{"31":2}}],["point",{"2":{"22":3,"25":2,"27":2,"30":1,"54":2,"86":4}}],["points",{"2":{"21":1,"24":1,"25":1,"26":3,"27":2,"86":5,"124":3}}],["powerful",{"2":{"33":1}}],["power",{"2":{"20":1}}],["pseudo",{"2":{"19":1,"30":1,"86":1}}],["printing",{"2":{"127":2}}],["print",{"2":{"74":1,"127":8}}],["primary",{"2":{"69":1}}],["practices",{"0":{"77":1},"2":{"77":1}}],["practice",{"0":{"60":1}}],["practical",{"2":{"5":1,"20":1,"34":1}}],["practitioners",{"2":{"34":1}}],["precision",{"2":{"104":1,"113":6}}],["preliminaries",{"2":{"104":2,"113":3}}],["predict",{"2":{"104":1,"113":9}}],["predictions",{"2":{"104":1}}],["prediction",{"2":{"104":1}}],["predicate",{"2":{"35":4,"42":1,"43":4,"44":2,"46":4,"86":9,"106":1,"125":2}}],["predicates",{"2":{"33":1,"74":2}}],["previously",{"2":{"44":1}}],["pretty",{"2":{"36":3,"86":3,"113":1,"124":3,"127":2}}],["prefix",{"2":{"35":3,"86":3}}],["preferences",{"2":{"35":1,"86":1,"124":1}}],["preference",{"2":{"33":1}}],["present",{"2":{"31":1,"36":1,"86":1}}],["programs",{"0":{"109":1}}],["programming",{"0":{"20":1,"34":1,"55":1,"64":1,"65":1,"82":1,"88":1},"1":{"56":1,"57":1,"65":1,"66":1,"67":1},"2":{"3":6,"4":1,"5":2,"18":2,"20":2,"32":1,"34":1,"38":3,"40":2,"47":1,"49":2,"54":6,"67":1,"74":1,"75":1,"80":1,"82":1,"86":20,"87":3,"88":2,"89":4,"119":1}}],["proportional",{"2":{"86":1,"124":1}}],["property",{"2":{"42":1}}],["properties",{"2":{"19":1,"31":1,"33":1}}],["properly",{"2":{"21":1,"86":1,"124":1}}],["produce",{"2":{"86":1,"102":1}}],["product",{"2":{"86":1,"94":1}}],["products",{"2":{"31":2}}],["productivity",{"2":{"5":1}}],["prod",{"2":{"86":2,"94":2}}],["providing",{"2":{"5":1,"19":1,"20":1,"33":1,"34":1,"86":2}}],["provided",{"2":{"35":1,"86":18,"117":10,"118":6}}],["provide",{"2":{"5":1,"16":1,"19":1,"42":2,"44":2,"47":1,"70":1,"73":1,"84":1,"87":1,"125":1}}],["provides",{"2":{"4":1,"18":1,"19":1,"33":1,"74":1,"75":1,"87":1,"121":1}}],["projects",{"2":{"5":1,"63":1}}],["proceeds",{"2":{"31":1}}],["proceed",{"2":{"5":1}}],["processing",{"2":{"31":1,"86":1,"119":1}}],["processes",{"2":{"12":1,"88":1}}],["process",{"2":{"5":2,"19":2,"29":1,"60":1,"86":2,"88":1,"104":1,"119":1,"124":1,"127":3}}],["problems",{"2":{"18":1,"19":1,"20":1,"31":2,"33":2,"34":1,"49":2,"51":1,"54":6,"56":1,"57":1,"65":1,"74":1,"75":1,"80":1,"86":11,"87":4,"88":3,"89":6,"127":1}}],["problem",{"2":{"5":1,"19":2,"20":1,"31":7,"43":1,"60":1,"74":1,"88":2,"89":1,"127":3}}],["phase",{"2":{"5":1,"86":1,"106":2}}],["pivotal",{"2":{"5":1,"19":1,"32":1}}],["page",{"2":{"73":1}}],["packing",{"0":{"54":1}}],["packages",{"0":{"68":1},"1":{"69":1},"2":{"4":2,"5":7,"8":2,"33":1,"86":2,"87":4}}],["package",{"0":{"69":1},"2":{"4":1,"5":3,"6":1,"18":2,"19":3,"20":1,"32":2,"33":4,"69":1,"70":1,"123":1}}],["patch",{"2":{"123":2}}],["patches",{"2":{"123":1}}],["pattern",{"2":{"86":1,"106":1}}],["patternfolds",{"2":{"24":1,"86":1}}],["path",{"2":{"51":1,"86":6,"124":5,"127":5}}],["passed",{"2":{"35":2,"86":2}}],["paradigm",{"2":{"88":1}}],["param=nothing",{"2":{"86":1,"124":1}}],["parametric",{"0":{"98":1,"117":1},"2":{"35":1,"86":4,"100":1,"104":1,"119":2,"124":3}}],["parameterization",{"2":{"86":1,"119":1}}],["parameter",{"2":{"19":2,"29":1,"30":1,"51":2,"86":16,"102":2,"104":1,"108":1,"119":6,"124":5,"125":4}}],["parameters=constraintcommons",{"2":{"6":1,"36":1,"86":1,"124":1}}],["parameters",{"0":{"6":1,"30":1},"1":{"7":1},"2":{"6":17,"19":3,"30":12,"33":1,"35":2,"36":18,"86":39,"97":1,"104":5,"116":1,"119":2,"124":22}}],["params",{"2":{"33":1,"35":2,"86":2,"113":1,"124":1}}],["param",{"0":{"99":1,"118":1},"2":{"29":2,"30":2,"35":4,"36":2,"86":109,"99":13,"100":2,"102":5,"118":54,"119":16,"124":22,"125":24}}],["parse",{"2":{"36":1,"86":1}}],["particularly",{"2":{"106":1}}],["partially",{"2":{"74":1,"86":1,"124":1}}],["partial",{"2":{"12":1,"29":1,"86":3,"124":2,"127":1}}],["part",{"2":{"29":1,"35":1,"73":1,"86":2,"87":1,"124":1}}],["pairs",{"2":{"31":2,"46":1,"86":1}}],["paired",{"2":{"30":1,"86":1}}],["pairvarsparameterdomain",{"2":{"30":1,"86":1}}],["pair",{"2":{"1":16,"6":1,"29":1,"31":5,"38":2,"40":4,"54":15,"86":63,"104":3,"106":1,"124":1}}],["mts",{"2":{"127":7}}],["move",{"2":{"127":3}}],["most",{"2":{"38":4,"74":1,"86":5,"109":1,"124":1}}],["more",{"2":{"36":1,"86":2}}],["moisumequalparam",{"2":{"125":2}}],["moisequentialtasks",{"2":{"125":1}}],["moipredicate",{"2":{"125":2}}],["moiordered",{"2":{"125":1}}],["moiminusequalparam",{"2":{"125":2}}],["moilessthanparam",{"2":{"125":2}}],["moierror",{"2":{"125":5}}],["moieq",{"2":{"125":1}}],["moidistdifferent",{"2":{"125":1}}],["moialwaystrue",{"2":{"125":1}}],["moiallequalparam",{"2":{"125":2}}],["moiallequal",{"2":{"125":1}}],["moialldifferent",{"2":{"125":1}}],["moi",{"2":{"31":1,"44":2,"125":22}}],["module",{"0":{"22":1,"25":1,"27":1},"2":{"35":1,"86":1}}],["modeled",{"2":{"127":1}}],["modeler=",{"2":{"31":1}}],["modeler",{"2":{"31":14}}],["modelize",{"2":{"31":1}}],["modeling",{"0":{"34":1,"77":1},"2":{"5":1,"19":1,"20":1,"34":1,"42":1,"44":1,"73":2,"74":1,"87":1}}],["model",{"0":{"74":1},"2":{"31":17,"33":1,"51":1,"74":3,"86":3,"125":25,"127":75}}],["models",{"0":{"76":1},"1":{"77":1,"78":1},"2":{"5":1,"19":1,"74":1,"77":1,"78":1,"86":1,"87":2,"88":2,"119":1}}],["mutable",{"2":{"127":2}}],["mutually",{"2":{"86":4,"92":1,"95":1,"100":1,"104":1,"106":1,"124":3}}],["much",{"2":{"89":1}}],["must",{"2":{"19":1,"21":1,"26":1,"31":2,"38":2,"42":1,"47":2,"51":2,"86":8,"88":1,"124":2,"125":1}}],["multithreading",{"2":{"127":1}}],["multithreaded",{"2":{"127":1}}],["multi",{"2":{"51":1,"86":1}}],["multiplication",{"2":{"86":1,"124":1}}],["multiplied",{"2":{"31":1}}],["multiple",{"2":{"5":1}}],["multimedia",{"2":{"31":4}}],["multivalued",{"2":{"8":3,"86":2,"124":1}}],["mixed",{"2":{"87":1}}],["mission",{"2":{"75":1}}],["missing",{"2":{"8":2,"10":6,"98":2,"99":2,"100":2,"102":2,"103":2,"106":2}}],["might",{"2":{"74":2}}],["min",{"2":{"113":2,"125":1}}],["minkowski",{"2":{"86":1,"103":1,"124":1}}],["minusequalparam",{"2":{"125":2}}],["minus",{"2":{"86":28,"98":4,"99":4,"117":8,"118":8,"119":4}}],["mincut",{"2":{"31":1,"127":2}}],["minimization",{"2":{"125":1}}],["minimizing",{"2":{"31":1}}],["minimizes",{"2":{"5":1}}],["minimal",{"2":{"8":2,"86":4,"102":1,"103":1,"124":3,"127":3}}],["minimum",{"2":{"3":11,"14":1,"31":1,"86":12,"113":2,"124":1}}],["mdd",{"2":{"8":4,"30":1,"51":12,"86":15,"124":2}}],["mdash",{"2":{"1":3,"3":4,"6":2,"8":6,"12":1,"14":1,"16":1,"21":6,"22":5,"24":8,"25":4,"26":10,"27":5,"28":2,"29":3,"30":13,"31":19,"35":10,"36":7,"38":4,"40":1,"46":1,"49":1,"51":2,"54":2,"86":185,"91":2,"92":1,"94":2,"95":1,"98":4,"99":3,"100":1,"102":6,"103":3,"104":28,"106":11,"108":2,"109":3,"111":2,"117":11,"118":6,"119":2,"123":4,"124":71,"125":45,"127":142}}],["mmds",{"2":{"8":1}}],["m",{"2":{"6":2,"31":6,"36":2,"74":5,"86":2,"124":2,"127":139}}],["major",{"2":{"123":2}}],["may",{"2":{"89":1}}],["map",{"2":{"86":1,"102":1,"113":5}}],["mapping",{"2":{"86":1,"119":1}}],["mainsolver",{"2":{"127":7}}],["main",{"2":{"41":1,"86":1,"124":1,"127":5}}],["mainly",{"2":{"35":1,"86":1,"125":1}}],["macro",{"2":{"36":6,"86":6,"115":1,"124":2,"125":1}}],["making",{"2":{"32":1,"89":1}}],["makes",{"2":{"87":1}}],["make",{"2":{"12":1,"35":3,"36":2,"86":8,"87":1,"88":1,"100":1,"104":3,"113":2,"115":2,"119":3,"127":1}}],["matter",{"2":{"125":1}}],["matters",{"2":{"105":1}}],["matrices",{"0":{"110":1},"1":{"111":1,"112":1,"113":1,"114":1},"2":{"86":1,"104":1,"111":1}}],["matrix",{"2":{"31":4,"86":2,"104":2,"108":2,"124":1}}],["match",{"2":{"86":3}}],["matches",{"2":{"86":3}}],["maths",{"2":{"86":1,"124":1}}],["mathematical",{"0":{"82":1},"2":{"82":1,"88":2,"89":1}}],["mathoptinterface",{"2":{"31":2,"125":12}}],["magic",{"2":{"31":2}}],["marks",{"2":{"31":1,"43":2,"46":2,"86":2}}],["max",{"2":{"29":2,"86":6,"102":2,"106":2,"124":2,"125":1,"127":10}}],["maximum",{"2":{"3":11,"14":1,"19":1,"21":1,"24":1,"26":1,"86":14,"124":3,"127":6}}],["manipulating",{"2":{"106":1}}],["manipulations",{"2":{"20":1}}],["manipulation",{"2":{"18":1,"19":2,"32":1,"33":1,"86":1,"119":1}}],["manufacturing",{"2":{"88":1}}],["manhattan",{"2":{"86":1,"103":1,"124":1}}],["managing",{"2":{"33":1}}],["manages",{"2":{"127":1}}],["managed",{"2":{"127":1}}],["manager",{"2":{"73":1}}],["manage",{"2":{"5":1,"127":1}}],["many",{"2":{"12":1,"86":1,"124":1}}],["metasolver",{"2":{"127":4}}],["metastrategist",{"0":{"120":1},"2":{"120":1}}],["metadata",{"2":{"87":1}}],["metaheuristics",{"0":{"81":1},"2":{"67":1}}],["metrics",{"0":{"103":1}}],["metric=hamming",{"2":{"86":1,"104":1,"124":1}}],["metric",{"2":{"86":8,"104":6,"124":8}}],["method",{"2":{"6":1,"8":1,"21":1,"22":3,"24":1,"25":3,"26":1,"27":3,"31":17,"36":1,"86":169,"104":26,"106":1,"111":2,"117":10,"118":6,"122":1,"123":3,"124":53,"125":14,"127":128}}],["methods",{"0":{"58":1},"1":{"59":1,"60":1},"2":{"4":1,"5":2,"8":1,"19":2,"21":1,"30":1,"33":2,"67":1,"86":4,"102":2,"124":3,"127":3}}],["meaningful",{"2":{"85":1}}],["meaning",{"2":{"38":2,"86":2,"106":1}}],["means",{"2":{"3":2,"36":3,"86":5}}],["measurement",{"2":{"127":1}}],["measure",{"2":{"33":1,"86":2,"124":2}}],["merge",{"2":{"19":1,"24":2,"26":2,"86":2,"124":2,"127":1}}],["merging",{"2":{"19":1}}],["membership",{"2":{"19":1}}],["56",{"2":{"127":1}}],["53",{"2":{"21":1,"24":1,"26":1,"86":1,"124":1}}],["5",{"2":{"1":1,"3":11,"21":1,"24":1,"26":1,"31":2,"38":29,"40":3,"54":13,"86":75,"87":1,"113":1,"123":1,"124":1,"125":6,"127":1}}],["nbits",{"2":{"86":2,"106":1,"124":1}}],["nbsp",{"2":{"1":3,"3":4,"6":2,"8":6,"12":1,"14":1,"16":1,"21":6,"22":5,"24":8,"25":4,"26":10,"27":5,"28":2,"29":3,"30":13,"31":19,"35":10,"36":7,"38":4,"40":1,"46":1,"49":1,"51":2,"54":2,"86":185,"91":2,"92":1,"94":2,"95":1,"98":4,"99":3,"100":1,"102":6,"103":3,"104":28,"106":11,"108":2,"109":3,"111":2,"117":11,"118":6,"119":2,"123":4,"124":71,"125":45,"127":142}}],["nvars",{"2":{"86":12,"98":8,"124":4}}],["nvalues",{"2":{"38":8,"86":8}}],["nine",{"2":{"74":1}}],["n5",{"2":{"51":2,"86":2}}],["n4",{"2":{"51":3,"86":3}}],["n3",{"2":{"51":2,"86":2}}],["n2",{"2":{"51":2,"86":2}}],["n1",{"2":{"51":2,"86":2}}],["n²",{"2":{"31":1}}],["n×n",{"2":{"31":1}}],["n",{"2":{"31":18,"86":7,"102":4,"108":3,"113":9,"124":2}}],["numeric",{"2":{"26":1,"86":1}}],["number",{"2":{"21":1,"25":3,"26":2,"27":3,"29":3,"31":2,"35":3,"38":11,"86":53,"91":1,"98":1,"103":1,"104":2,"106":5,"109":3,"117":8,"118":4,"124":18,"125":6,"127":12}}],["numbers",{"2":{"19":2,"86":2,"98":2}}],["normalized",{"2":{"86":1,"124":1}}],["normal",{"2":{"86":1,"119":1}}],["norm",{"2":{"86":2}}],["now",{"2":{"31":1,"74":1}}],["node",{"2":{"31":2,"51":3,"86":3}}],["no",{"2":{"31":4,"46":1,"54":20,"86":24,"102":1,"104":1,"106":1,"119":1}}],["nonnegative",{"2":{"125":1}}],["none",{"2":{"86":4,"109":1,"113":2,"119":3,"124":1,"125":6}}],["nonlinear",{"2":{"80":1}}],["non",{"0":{"98":1,"117":1},"2":{"26":1,"29":2,"86":3,"104":4,"124":2,"127":1}}],["not",{"2":{"24":1,"31":2,"35":1,"36":2,"38":1,"42":1,"44":1,"54":6,"73":1,"74":3,"86":18,"109":1,"118":1,"119":1,"124":2,"125":1,"127":1}}],["notebooks",{"2":{"73":1,"121":1}}],["note",{"2":{"6":1,"42":1,"44":1,"73":1,"74":1,"125":1}}],["nothing",{"2":{"1":1,"10":3,"29":1,"35":4,"36":1,"38":2,"86":14,"102":1,"104":2,"113":1,"124":8,"125":2}}],["natural",{"2":{"42":1,"44":1}}],["nature",{"2":{"24":1,"26":1,"86":1,"124":1}}],["names",{"2":{"86":1,"119":1}}],["name=",{"2":{"86":1,"124":1}}],["name",{"2":{"6":1,"35":1,"36":3,"86":9,"124":8,"127":8}}],["neighbours",{"2":{"127":2}}],["neighbourhood",{"2":{"127":2}}],["neither",{"2":{"35":1,"86":1}}],["never",{"2":{"127":1}}],["necessarily",{"2":{"73":1}}],["necessary",{"2":{"18":1,"127":3}}],["next",{"2":{"49":2,"86":2,"123":2}}],["negation",{"2":{"35":1,"86":1}}],["networks",{"2":{"88":1}}],["network",{"2":{"86":1,"106":1,"124":1}}],["net",{"2":{"31":1}}],["new",{"2":{"24":3,"33":2,"36":5,"86":8,"87":1,"124":3,"125":6,"127":2}}],["needs",{"2":{"19":1,"29":1,"31":1,"86":3,"119":1,"124":2}}],["need",{"2":{"5":1,"14":1,"74":2}}],["lst",{"2":{"127":5}}],["l",{"2":{"31":1,"86":15,"117":4,"118":4,"119":3}}],["l=n²",{"2":{"31":1}}],["loss",{"2":{"104":2,"113":2}}],["local",{"0":{"89":1,"114":1},"2":{"86":5,"89":1,"104":1,"106":1,"124":5,"125":2,"127":7}}],["localsearchsolverscblstodo",{"2":{"73":1}}],["localsearchsolvers",{"0":{"127":1},"2":{"73":2,"87":1,"104":1,"127":139}}],["locations",{"2":{"31":5}}],["loop",{"2":{"127":8}}],["loops",{"2":{"36":1,"49":2,"86":3}}],["look",{"2":{"73":1,"74":1}}],["lower",{"2":{"86":1,"124":1}}],["lowest",{"2":{"21":1,"24":1,"26":1,"86":1,"124":1}}],["low",{"2":{"29":1,"86":1,"87":1,"124":1}}],["loggingextra",{"2":{"127":1}}],["logging",{"2":{"127":1}}],["logic",{"2":{"86":2}}],["logical",{"2":{"42":1}}],["log",{"2":{"8":1,"10":3,"98":1,"99":1,"100":1,"102":1,"103":1,"106":1,"127":1}}],["littledict",{"2":{"86":2,"106":2,"119":1}}],["like",{"2":{"67":1,"81":1}}],["links",{"2":{"31":1,"121":1,"127":1}}],["linear",{"2":{"67":1,"80":1,"86":3,"108":3,"124":3}}],["line",{"2":{"31":9,"73":1}}],["limited",{"2":{"29":1,"86":1,"124":1}}],["limit",{"2":{"29":7,"54":2,"86":11,"124":9,"125":1,"127":10}}],["limits",{"2":{"19":1}}],["listed",{"2":{"86":2}}],["listing",{"2":{"47":1}}],["list=x",{"2":{"36":2,"86":2,"124":1}}],["list",{"0":{"91":1,"94":1,"97":1,"116":1},"1":{"98":1,"99":1,"100":1,"117":1,"118":1,"119":1},"2":{"1":13,"3":16,"6":2,"26":1,"27":1,"35":1,"38":24,"40":6,"43":1,"44":1,"46":5,"49":5,"51":8,"54":5,"86":89,"97":1,"116":1,"124":3,"127":11}}],["lt",{"2":{"8":2,"21":1,"22":4,"25":4,"26":1,"27":4,"31":1,"42":1,"43":1,"51":2,"86":10,"124":2,"127":3}}],["launch",{"2":{"127":1}}],["lazy",{"2":{"86":2,"102":2,"115":2,"124":2}}],["lang",{"2":{"86":3,"124":1}}],["lang=",{"2":{"86":1,"124":1}}],["language=",{"2":{"86":1,"124":1}}],["languageparameterdomain",{"2":{"30":1,"86":1}}],["languages",{"0":{"8":1,"51":1},"1":{"9":1},"2":{"8":1,"30":1,"86":1}}],["language",{"2":{"6":1,"42":1,"44":1,"51":17,"73":3,"86":24,"124":5}}],["large",{"2":{"74":1,"88":1,"89":1}}],["labels",{"2":{"51":2,"86":2}}],["labeled",{"2":{"51":2,"86":2}}],["last",{"2":{"51":1,"74":1,"86":1,"123":2,"127":1}}],["lays",{"2":{"20":1}}],["layered",{"2":{"86":1,"124":1}}],["layers",{"2":{"86":9,"119":1,"124":4}}],["layer",{"0":{"90":1,"92":1,"93":1,"95":1,"96":1,"100":1,"106":1,"115":1,"119":1},"1":{"91":1,"92":1,"94":1,"95":1,"97":1,"98":1,"99":1,"100":1,"116":1,"117":1,"118":1,"119":1},"2":{"4":1,"25":2,"27":2,"86":42,"90":1,"92":3,"93":1,"95":3,"96":1,"98":1,"100":3,"104":4,"106":28,"115":1,"119":3,"124":16}}],["left",{"2":{"86":18,"117":10,"119":3}}],["let",{"2":{"74":1}}],["levels",{"2":{"84":1}}],["level",{"2":{"42":1,"44":1,"51":3,"86":3,"87":2,"127":9}}],["lessthanparam",{"2":{"125":2}}],["lesser",{"2":{"86":11,"117":6,"118":1,"119":3}}],["less",{"2":{"42":1,"74":1,"125":2}}],["leadsolvers",{"2":{"127":3}}],["leadsolver",{"2":{"127":1}}],["least",{"2":{"38":4,"86":4,"104":2}}],["learn",{"2":{"75":1,"86":7,"104":5,"106":1,"111":1,"124":6}}],["learned",{"2":{"33":1,"34":1,"86":1,"104":1,"124":1}}],["learning",{"0":{"105":1,"110":1},"1":{"111":1,"112":1,"113":1,"114":1},"2":{"4":1,"5":6,"12":1,"19":1,"29":1,"33":2,"86":4,"87":1,"104":1,"105":1,"106":2,"124":3}}],["length",{"2":{"19":1,"21":2,"22":1,"24":1,"25":6,"26":1,"27":6,"33":1,"35":4,"54":3,"86":23,"94":2,"106":2,"113":4,"124":6,"127":12}}],["lengths",{"2":{"1":3,"54":6,"86":9}}],["swap",{"2":{"127":2}}],["switch",{"2":{"86":1,"103":1,"124":1}}],["sltns",{"2":{"104":2}}],["smaller",{"2":{"89":1}}],["small",{"2":{"89":1}}],["s2",{"2":{"86":1,"124":1}}],["s1",{"2":{"86":1,"124":1}}],["scalarfunction",{"2":{"125":3}}],["scalars",{"2":{"86":1,"98":1}}],["scalar",{"2":{"86":3,"91":1}}],["science",{"2":{"72":1}}],["scenario",{"2":{"60":1}}],["scheduling",{"0":{"54":1},"2":{"31":1,"54":6,"86":6,"88":1}}],["square",{"2":{"31":3}}],["sqrt",{"2":{"29":1,"86":1,"124":1}}],["syntax",{"2":{"33":1,"73":1,"74":1,"125":2,"127":1}}],["symcon",{"2":{"86":1,"124":1}}],["symb",{"2":{"35":2,"86":2}}],["symbols",{"2":{"86":11,"102":4,"106":1,"124":6}}],["symbol",{"2":{"6":4,"10":1,"35":7,"36":19,"86":32,"106":1,"109":1,"113":1,"119":4,"124":13,"127":3}}],["symmetries",{"2":{"33":3,"35":4,"86":4,"124":4}}],["symmetry",{"2":{"33":1,"35":1,"86":1,"124":1}}],["systems",{"2":{"88":2}}],["system",{"2":{"31":1}}],["subs",{"2":{"127":3}}],["subsolvers",{"2":{"127":4}}],["subsolver",{"2":{"127":6}}],["subset",{"2":{"125":1}}],["subsets",{"2":{"74":2}}],["sub",{"2":{"104":1,"127":1}}],["subtract",{"2":{"86":1,"119":1}}],["subtraction",{"2":{"86":1,"119":1}}],["subtype",{"2":{"31":1}}],["subgrid",{"2":{"74":1}}],["subgrids",{"2":{"74":1}}],["successfully",{"2":{"59":1}}],["such",{"2":{"5":1,"31":2,"33":2,"42":3,"44":2,"46":1,"51":1,"66":1,"86":3,"87":1,"88":2,"106":1,"119":1,"127":4}}],["sudoku",{"2":{"31":17,"74":4,"127":1}}],["sudokuinstances",{"2":{"31":1}}],["sudokuinstance",{"2":{"31":19}}],["sumequalparam",{"2":{"125":2}}],["summary",{"2":{"89":1}}],["summing",{"0":{"38":1}}],["sum",{"2":{"25":1,"27":1,"29":1,"31":1,"38":8,"54":2,"86":20,"91":2,"94":3,"108":3,"124":4,"125":1}}],["supply",{"2":{"88":1}}],["supplies",{"2":{"31":1,"87":1}}],["supported",{"2":{"86":4}}],["support",{"2":{"19":1,"86":1}}],["supports=nothing",{"2":{"86":1}}],["supports",{"2":{"19":1,"33":1,"86":7,"125":3}}],["supertype",{"2":{"19":3,"24":1,"26":1,"86":2,"124":2}}],["super",{"2":{"19":1,"21":1,"86":1,"124":1}}],["silent",{"2":{"125":1,"127":1}}],["sig",{"2":{"86":17,"117":10,"118":6}}],["signature",{"2":{"86":2,"102":2,"124":2}}],["significance",{"2":{"65":1}}],["significantly",{"2":{"33":1,"34":1}}],["single",{"2":{"74":1,"86":3,"91":1,"94":2}}],["since",{"2":{"42":1,"44":1,"127":1}}],["sink",{"2":{"31":3}}],["simulated",{"2":{"81":1}}],["simple",{"2":{"29":1,"33":1,"36":1,"74":2,"86":2,"124":2}}],["simply",{"2":{"22":2,"25":1,"27":1,"30":1,"35":1,"74":1,"86":2}}],["simplify",{"2":{"56":1}}],["simplifying",{"2":{"5":1}}],["simplified",{"2":{"36":3,"86":3}}],["simplifies",{"2":{"5":1,"33":1}}],["similar",{"2":{"21":1,"86":1,"124":1}}],["size",{"2":{"19":1,"21":5,"24":8,"26":8,"29":2,"31":3,"49":3,"86":31,"102":1,"104":7,"106":2,"113":2,"124":16,"125":2,"127":4}}],["situations",{"2":{"14":1}}],["split",{"2":{"104":1}}],["specialize",{"2":{"127":10}}],["specialized",{"2":{"86":2,"98":1,"117":1,"127":10}}],["specializing",{"2":{"127":1}}],["specifying",{"2":{"18":1,"86":2}}],["specific",{"0":{"46":1},"2":{"33":1,"40":4,"86":6,"104":2,"119":1}}],["specifically",{"2":{"22":2,"25":1,"27":1,"30":1,"46":1,"86":2}}],["specification",{"2":{"6":1,"19":1}}],["specifications",{"2":{"6":1,"33":1,"36":1,"86":1,"124":1}}],["specified",{"2":{"22":2,"25":1,"27":1,"30":1,"31":2,"86":2,"119":1}}],["specifies",{"2":{"3":6,"38":1,"42":1,"47":1,"86":8,"119":1}}],["space",{"2":{"29":4,"35":1,"86":11,"88":1,"124":9,"127":1}}],["spaces",{"2":{"12":1,"18":1,"19":1,"33":1}}],["span",{"2":{"24":1,"26":1,"86":1}}],["sat",{"2":{"127":3}}],["satisfying",{"2":{"127":2}}],["satisfy",{"2":{"38":3,"42":1,"47":1,"86":3,"87":1,"88":1,"89":1}}],["satisfies",{"2":{"35":1,"38":6,"51":1,"86":8,"89":1,"124":1}}],["satisfied",{"2":{"3":4,"35":1,"40":1,"49":1,"51":1,"54":2,"86":10,"88":1,"124":1,"127":1}}],["satisfaction",{"2":{"33":1,"86":2,"87":1,"127":3}}],["say",{"2":{"86":1,"109":1,"124":1}}],["same",{"2":{"24":1,"26":1,"31":2,"35":1,"36":1,"46":1,"86":4,"124":2}}],["samplings",{"2":{"19":1,"29":2,"86":2,"124":2}}],["sampling",{"0":{"12":1},"1":{"13":1},"2":{"12":2}}],["s",{"2":{"6":3,"8":7,"10":3,"19":2,"21":2,"24":1,"26":1,"31":5,"33":1,"34":1,"35":6,"36":8,"74":1,"86":18,"98":1,"99":1,"100":1,"102":1,"103":1,"106":1,"124":14,"127":109}}],["stop",{"2":{"127":5}}],["storing",{"2":{"87":1}}],["stores",{"2":{"26":2,"86":2}}],["store",{"2":{"24":3,"30":8,"36":1,"86":15,"102":1,"106":2,"124":1,"127":3}}],["stuff",{"2":{"113":2}}],["studio",{"2":{"73":1}}],["studies",{"0":{"59":1},"2":{"59":1}}],["stipulates",{"2":{"86":1}}],["step",{"2":{"36":2,"70":2,"84":2,"86":2,"127":3}}],["stamp",{"2":{"127":4}}],["static",{"2":{"127":1}}],["statistical",{"2":{"88":1}}],["status",{"2":{"125":1,"127":4}}],["states",{"2":{"51":4,"86":4}}],["state",{"2":{"31":3,"127":36}}],["started",{"0":{"70":1,"71":1},"1":{"72":1,"73":1,"74":1},"2":{"70":1}}],["starts",{"2":{"35":1,"54":8,"86":9,"89":1,"127":2}}],["start",{"2":{"31":1,"49":2,"51":2,"74":1,"86":4}}],["starting",{"2":{"31":2,"35":1,"86":1,"127":1}}],["start=",{"2":{"31":1}}],["standout",{"2":{"33":1}}],["standard",{"2":{"31":3,"32":1,"33":1,"34":1,"41":1,"87":1}}],["standardization",{"2":{"5":1}}],["stands",{"2":{"18":1}}],["stdout",{"2":{"31":1}}],["str",{"2":{"127":1}}],["straight",{"2":{"74":1}}],["straightforward",{"2":{"33":1,"42":1,"125":1}}],["strategies",{"0":{"57":1},"2":{"20":1,"57":1}}],["string",{"2":{"22":4,"25":4,"27":4,"31":1,"35":1,"86":8,"102":1,"106":1,"124":1,"127":1}}],["strictly",{"2":{"1":8,"35":3,"86":13,"91":1,"118":1,"124":3}}],["struct",{"2":{"21":1,"31":3,"86":1,"127":4}}],["structure",{"0":{"106":1},"2":{"8":3,"21":2,"30":1,"31":1,"35":1,"86":7,"89":1,"104":1,"106":4,"124":5,"127":5}}],["structures",{"2":{"4":1,"5":2}}],["streamlining",{"0":{"0":1,"2":1,"32":1,"37":1,"39":1,"48":1,"50":1,"53":1},"1":{"1":1,"3":1,"33":1,"34":1,"35":1,"36":1,"38":1,"40":1,"49":1,"51":1,"54":1},"2":{"5":1}}],["shifted",{"2":{"113":3}}],["share",{"2":{"63":1,"77":1}}],["shared",{"2":{"4":1,"5":3}}],["shrink",{"2":{"35":1,"36":1,"86":2}}],["show",{"2":{"86":4,"102":1,"106":1,"124":1}}],["showcase",{"2":{"59":1}}],["shortcut",{"2":{"35":1,"36":1,"86":1,"124":1}}],["should",{"2":{"3":6,"42":1,"44":1,"46":1,"86":11,"102":2,"124":2,"127":3}}],["soon",{"2":{"125":1}}],["sophisticated",{"2":{"34":1}}],["so",{"2":{"31":1,"36":2,"74":1,"86":2,"88":1}}],["something",{"2":{"35":1,"86":1}}],["some",{"2":{"10":1,"12":1,"74":1,"86":1,"87":1,"90":1,"93":1,"96":1,"104":1,"115":1,"121":1,"124":1,"125":1}}],["sols",{"2":{"86":1,"104":4,"124":1}}],["solve",{"2":{"31":1,"74":1,"87":2,"88":1,"127":3}}],["solvername",{"2":{"125":1}}],["solvers",{"0":{"126":1},"2":{"73":3,"74":4,"87":10,"89":3,"106":1,"126":1,"127":2}}],["solver",{"2":{"31":6,"74":2,"87":1,"89":2,"104":1,"125":4,"127":29}}],["solving",{"2":{"20":1,"34":1,"57":1,"60":1,"65":1,"73":1,"75":1,"88":4,"127":4}}],["sol",{"2":{"29":1,"86":1,"124":1}}],["solution",{"2":{"19":1,"31":2,"74":3,"86":3,"88":1,"89":4,"103":1,"124":1,"127":4}}],["solutions",{"2":{"4":1,"5":2,"29":10,"86":14,"87":1,"88":2,"89":4,"103":1,"104":8,"124":14,"127":9}}],["solely",{"2":{"5":1}}],["source",{"2":{"1":3,"3":4,"6":3,"8":7,"12":1,"14":1,"16":1,"21":10,"22":15,"24":12,"25":15,"26":14,"27":16,"28":2,"29":3,"30":17,"31":22,"35":11,"36":9,"38":4,"40":1,"46":1,"49":1,"51":2,"54":2,"86":185,"91":2,"92":1,"94":2,"95":1,"98":4,"99":3,"100":1,"102":6,"103":3,"104":28,"106":11,"108":2,"109":3,"111":2,"117":11,"118":6,"119":2,"123":4,"124":71,"125":45,"127":142}}],["sequentialtasks",{"2":{"125":2}}],["sequence",{"2":{"49":6,"51":4,"86":10}}],["select",{"2":{"127":4}}],["selection",{"2":{"86":1,"119":1}}],["selected",{"2":{"86":8,"92":1,"95":1,"100":1,"104":2,"106":6,"124":4,"127":1}}],["series",{"2":{"74":1,"127":1}}],["serves",{"2":{"4":1,"19":1}}],["see",{"2":{"43":1,"127":1}}],["seems",{"2":{"31":1}}],["separates",{"2":{"86":1,"102":1}}],["separator",{"2":{"31":1}}],["sep",{"2":{"31":2,"86":2,"102":2}}],["segment",{"2":{"31":3}}],["several",{"2":{"14":1,"73":1,"87":1,"106":1}}],["seaperl",{"2":{"87":1}}],["searching",{"2":{"35":1,"86":1,"124":1}}],["searches",{"2":{"19":1}}],["search",{"0":{"57":1,"89":1,"114":1},"2":{"12":1,"18":1,"19":3,"29":9,"33":1,"57":1,"81":1,"86":20,"88":1,"89":3,"106":1,"124":20,"127":1}}],["seamless",{"2":{"5":1}}],["seamlessly",{"2":{"5":1}}],["sec",{"2":{"127":1}}],["section",{"2":{"6":1,"43":1,"121":1,"122":1}}],["seconds",{"2":{"127":1}}],["second",{"2":{"3":2,"54":8,"86":10}}],["setter",{"2":{"74":1}}],["setting",{"0":{"73":1},"2":{"127":1}}],["settings",{"2":{"19":1,"29":1,"86":1,"124":1,"127":1}}],["setup",{"2":{"73":1}}],["setdomain",{"2":{"21":1,"24":1,"26":3,"27":2,"86":5,"124":4}}],["set",{"2":{"3":4,"5":1,"8":1,"20":1,"22":2,"25":1,"26":3,"27":1,"30":1,"31":4,"38":3,"40":2,"47":2,"86":29,"88":1,"100":1,"102":1,"104":11,"109":2,"119":1,"124":8,"125":16,"127":22}}],["sets",{"2":{"3":2,"19":1,"86":2,"104":3}}],["001",{"2":{"113":1}}],["00514",{"2":{"36":1,"86":1,"124":1}}],["0",{"2":{"1":14,"3":1,"21":1,"22":2,"24":1,"25":1,"26":1,"27":1,"31":54,"35":7,"38":8,"49":1,"51":22,"74":2,"86":73,"98":4,"99":4,"113":1,"117":4,"118":4,"123":8,"124":3,"125":6,"127":9}}],["42",{"2":{"21":1,"24":1,"26":1,"38":2,"86":3,"124":1}}],["4",{"2":{"1":12,"3":15,"21":1,"24":1,"26":1,"31":3,"38":14,"40":4,"43":2,"44":2,"45":2,"46":3,"47":3,"49":4,"54":18,"86":82,"123":1,"124":1,"125":4,"127":1}}],["3j+1",{"2":{"74":1}}],["3i+1",{"2":{"74":1}}],["3",{"2":{"1":17,"3":15,"21":2,"24":2,"26":2,"31":6,"35":4,"36":1,"38":33,"40":4,"43":2,"44":4,"45":6,"46":7,"47":3,"49":6,"54":26,"74":6,"86":125,"123":1,"124":3,"125":2,"127":1}}],["28",{"2":{"127":1}}],["225",{"2":{"86":1}}],["200",{"2":{"86":2,"104":1,"124":2}}],["2009",{"2":{"36":1,"86":1,"124":1}}],["2",{"2":{"1":15,"3":16,"21":2,"24":2,"26":2,"31":5,"35":3,"36":1,"38":40,"40":4,"43":2,"44":3,"45":4,"46":7,"47":3,"49":3,"51":10,"54":28,"74":2,"86":146,"123":1,"124":3,"125":2,"127":1}}],["101",{"0":{"64":1},"1":{"65":1,"66":1,"67":1}}],["10",{"2":{"38":27,"86":29,"87":1,"124":2,"127":2}}],["100",{"2":{"29":2,"86":4,"124":4,"127":1}}],["10000",{"2":{"127":1}}],["1000",{"2":{"29":1,"86":1,"124":1}}],["10^6",{"2":{"29":1,"86":1,"124":1}}],["123",{"2":{"21":1,"24":1,"26":1,"86":1,"124":1}}],["12",{"2":{"21":1,"24":1,"26":1,"54":1,"86":2,"124":1}}],["1",{"2":{"1":19,"3":17,"16":2,"21":2,"24":2,"26":2,"31":3,"35":6,"36":1,"38":34,"40":4,"43":2,"44":3,"45":4,"46":5,"47":3,"49":4,"51":15,"54":41,"74":5,"86":174,"108":1,"109":1,"113":4,"117":2,"123":8,"124":6,"125":2,"127":4}}],["=>",{"2":{"51":15,"86":15,"113":1}}],["=usual",{"2":{"36":1,"86":1,"124":1}}],["=0",{"2":{"31":1}}],["==",{"2":{"3":4,"22":1,"38":2,"49":1,"86":9,"109":1,"113":2,"124":1}}],["=",{"2":{"1":3,"3":12,"6":1,"16":2,"21":5,"22":4,"24":5,"25":4,"26":5,"27":4,"29":7,"31":11,"35":3,"36":3,"38":16,"40":1,"43":5,"44":3,"45":2,"46":2,"49":5,"51":16,"54":17,"74":1,"86":126,"87":1,"94":2,"100":1,"102":1,"104":12,"108":1,"109":3,"113":34,"119":5,"124":36,"125":35,"127":49}}],["epoch",{"2":{"127":1}}],["err",{"2":{"125":3}}],["error",{"2":{"33":2,"35":20,"36":3,"86":24,"104":1,"124":6,"125":4,"127":4}}],["euclidian",{"2":{"98":1,"99":1}}],["euclidean",{"2":{"86":6}}],["eq",{"2":{"86":22,"117":12,"118":4,"119":6,"125":2}}],["equiped",{"2":{"31":1}}],["equilibrium",{"2":{"31":4}}],["equivalent",{"2":{"22":1,"25":1,"27":1,"86":1}}],["equality",{"2":{"125":1}}],["equalities",{"2":{"86":2,"119":2}}],["equal",{"2":{"1":8,"3":2,"31":1,"35":1,"38":1,"86":17,"117":3,"118":1,"119":1,"125":3}}],["editors",{"2":{"73":1}}],["edge",{"2":{"51":2,"86":2}}],["educational",{"2":{"20":1,"34":1}}],["either",{"2":{"21":1,"24":1,"26":1,"47":2,"54":4,"86":8,"87":1,"124":4}}],["efficiency",{"2":{"20":1,"88":1}}],["efficiently",{"2":{"12":1,"31":1,"125":1}}],["efficient",{"2":{"5":1,"77":1,"86":1}}],["embodies",{"2":{"20":1,"34":1,"86":2}}],["empty",{"2":{"104":2,"125":4,"127":11}}],["emptydomain",{"2":{"19":1,"21":2,"24":1,"26":1,"86":2,"124":1}}],["empowering",{"0":{"20":1}}],["emphasizes",{"2":{"5":1}}],["evaluation",{"2":{"104":1}}],["evaluates",{"2":{"35":1,"36":1,"86":2}}],["evaluated",{"2":{"33":1,"127":1}}],["eventually",{"2":{"49":2,"86":2}}],["even",{"2":{"31":1}}],["everuseful",{"2":{"16":1}}],["evolves",{"2":{"127":1}}],["evolve",{"2":{"19":1}}],["earlier",{"2":{"123":1}}],["easy",{"2":{"87":1,"122":1}}],["easier",{"2":{"36":1,"86":1}}],["ease",{"2":{"5":1,"20":1,"72":1}}],["eachrow",{"2":{"113":4}}],["each",{"2":{"3":2,"25":1,"27":1,"31":3,"35":1,"36":1,"49":2,"51":2,"69":1,"70":1,"74":5,"86":10,"106":1,"115":1,"124":2,"127":1}}],["else",{"2":{"113":4}}],["eltype",{"2":{"28":3,"86":3,"104":2}}],["eliminating",{"2":{"5":1}}],["elementary",{"0":{"40":1}}],["elements",{"2":{"5":1,"12":1,"19":2,"21":1,"31":1,"33":1,"86":18,"91":1,"102":1,"106":1,"117":8,"118":4,"124":2}}],["element",{"2":{"3":9,"86":9,"104":2,"123":1,"127":1}}],["e",{"2":{"5":1,"31":1,"35":4,"49":2,"51":4,"54":4,"80":1,"86":15,"103":1,"113":3,"124":1,"127":1}}],["exclu",{"2":{"86":3,"106":3}}],["exclusive",{"2":{"86":11,"92":1,"95":1,"100":1,"104":3,"106":9,"124":3}}],["excluded",{"2":{"86":1}}],["exclude",{"2":{"38":1,"86":1}}],["exceed",{"2":{"54":2,"86":2}}],["except",{"2":{"38":2,"86":2}}],["except=vals",{"2":{"36":2,"86":2,"124":1}}],["exact",{"2":{"89":4}}],["exactly",{"2":{"38":4,"86":4}}],["examine",{"2":{"33":1}}],["exampleusing",{"2":{"46":2,"86":2}}],["example2",{"2":{"46":2,"86":2}}],["example",{"2":{"6":1,"35":1,"36":8,"42":2,"44":1,"47":1,"73":1,"86":8,"123":1,"124":6}}],["examples",{"0":{"112":1},"1":{"113":1,"114":1},"2":{"1":3,"3":4,"35":2,"38":4,"40":1,"46":1,"49":1,"51":2,"54":2,"73":1,"86":22,"119":1,"121":1}}],["existing",{"2":{"36":2,"86":2,"87":1,"88":1}}],["exists",{"2":{"35":3,"74":1,"86":3}}],["ex",{"2":{"36":3,"86":3}}],["expansion",{"2":{"86":1}}],["export",{"2":{"86":1,"124":1,"127":1}}],["explicit",{"2":{"86":2}}],["explicitly",{"2":{"47":1,"86":2}}],["explanation",{"2":{"36":1,"80":1,"86":1}}],["explored",{"2":{"86":1,"124":1}}],["explore",{"2":{"29":4,"86":7,"124":4}}],["exploresettings",{"2":{"19":1,"29":1,"86":1,"124":1}}],["exploring",{"0":{"18":1,"68":1},"1":{"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"69":1},"2":{"20":1}}],["explorations",{"2":{"33":1}}],["exploration",{"0":{"29":1},"2":{"12":1,"19":4,"29":2,"30":1,"86":3,"124":1}}],["express",{"2":{"125":1}}],["expressions",{"2":{"106":1}}],["expression",{"2":{"36":7,"38":1,"42":1,"86":8}}],["expr",{"2":{"36":2,"86":2}}],["experimental",{"0":{"85":1},"2":{"85":1}}],["experiments",{"0":{"83":1},"1":{"84":1,"85":1},"2":{"85":1}}],["experience",{"2":{"5":1}}],["expect",{"2":{"75":1}}],["expectations",{"2":{"73":1}}],["expected",{"2":{"35":2,"36":1,"86":4,"124":3}}],["externally",{"2":{"127":1}}],["external",{"2":{"19":1,"86":1,"119":1}}],["extends",{"2":{"22":5,"25":3,"27":3,"28":1,"30":2,"31":4,"86":5,"104":3,"124":1}}],["extend",{"2":{"21":1,"28":1,"86":2,"122":1,"124":1}}],["extended",{"2":{"10":1,"86":19,"102":2,"117":10,"118":6,"124":2}}],["extensionally",{"2":{"47":1}}],["extensional",{"2":{"47":1}}],["extensions",{"0":{"10":1},"1":{"11":1}}],["extension",{"0":{"22":1,"25":1,"27":1,"47":1,"121":1},"2":{"5":1,"41":1,"86":8,"121":1}}],["extrema",{"0":{"14":1},"1":{"15":1},"2":{"14":3,"86":2,"104":1,"113":1,"124":2,"127":3}}],["extracts",{"2":{"6":1,"36":2,"86":2,"124":1}}],["extract",{"2":{"6":2,"36":1,"86":2,"124":2}}],["enumerate",{"2":{"113":1}}],["enforcing",{"2":{"86":2}}],["encode",{"2":{"104":1}}],["encoded",{"2":{"51":2,"86":2}}],["encoding",{"0":{"109":1},"2":{"86":5,"108":1,"109":4,"124":4}}],["encourage",{"2":{"62":1,"73":2}}],["encompass",{"2":{"46":1,"86":1}}],["encapsulate",{"2":{"86":1,"119":1,"127":2}}],["encapsulating",{"2":{"33":1}}],["encapsuler",{"2":{"24":1,"86":1}}],["entry",{"2":{"36":3,"86":3,"127":1}}],["energy",{"2":{"31":1}}],["enough",{"2":{"30":1,"86":1}}],["enhancement",{"2":{"33":1}}],["enhances",{"2":{"20":1,"34":1}}],["enhancing",{"2":{"5":2,"33":1}}],["enabling",{"0":{"34":1},"2":{"18":1}}],["enabled",{"2":{"127":1}}],["enable",{"2":{"5":1}}],["end``",{"2":{"127":1}}],["end",{"2":{"5":1,"8":2,"74":2,"86":2,"113":15,"125":6,"127":4}}],["ensure",{"2":{"74":1,"86":1,"108":1}}],["ensures",{"2":{"5":1,"33":1,"40":2,"43":2,"49":2,"51":2,"54":6,"74":1,"86":12}}],["ensuring",{"2":{"1":7,"5":2,"38":5,"46":2,"86":17,"104":3,"119":1,"125":9}}],["environment",{"0":{"73":1},"2":{"5":1}}],["etc",{"2":{"5":1}}],["ecosystem",{"2":{"4":1,"5":3,"18":1,"20":1,"32":1,"34":1,"73":1,"87":1}}],["especially",{"2":{"89":1}}],["essential",{"2":{"4":1,"19":1,"33":1}}],["establishes",{"2":{"3":2,"86":2}}],["x``or",{"2":{"104":1}}],["x̅",{"2":{"104":4}}],["xto",{"2":{"86":1,"103":1,"124":1}}],["xn",{"2":{"74":1}}],["x=x1",{"2":{"74":1}}],["x3",{"2":{"51":1,"86":1}}],["x3c",{"2":{"1":4,"8":3,"21":6,"22":9,"24":11,"25":8,"26":12,"27":8,"30":12,"31":3,"38":2,"51":1,"54":1,"86":48,"104":1,"113":2,"124":16,"125":29,"127":91}}],["x2",{"2":{"51":1,"86":1,"127":2}}],["x26",{"2":{"45":4,"46":4,"86":4}}],["x1",{"2":{"51":1,"86":1,"127":2}}],["x",{"2":{"1":23,"3":8,"12":2,"14":2,"22":10,"25":10,"27":10,"31":4,"35":7,"36":5,"38":28,"40":2,"42":2,"43":8,"44":4,"46":6,"47":1,"49":2,"51":6,"54":8,"74":6,"86":298,"87":2,"91":3,"94":4,"98":7,"99":6,"102":6,"103":8,"104":33,"109":8,"113":42,"117":76,"118":43,"124":33,"125":31,"127":68}}],["xcsp³",{"2":{"41":1}}],["xcsp3",{"0":{"36":1},"2":{"6":3,"8":1,"33":3,"36":1,"86":2,"124":1}}],["xcsp",{"2":{"1":3,"3":4,"33":1,"36":2,"38":4,"40":1,"43":1,"44":1,"46":1,"49":1,"51":2,"54":2,"86":21,"124":1}}],["csps",{"2":{"87":1}}],["cn",{"2":{"74":1}}],["c=c1",{"2":{"74":1}}],["c=usual",{"2":{"36":2,"86":2,"124":2}}],["clear",{"2":{"89":1}}],["classic",{"2":{"74":2}}],["closed",{"2":{"38":9,"86":9}}],["cblstodo",{"2":{"74":4}}],["cbls",{"0":{"125":1},"2":{"73":2,"74":3,"87":3,"89":3,"104":1,"125":31,"127":1}}],["circuit",{"2":{"49":12,"86":12}}],["cc",{"2":{"38":2,"86":2}}],["central",{"2":{"32":1}}],["certain",{"2":{"3":4,"54":2,"86":6}}],["cplex",{"2":{"87":1}}],["cp",{"0":{"67":1,"71":1,"74":1},"1":{"72":1,"73":1,"74":1},"2":{"32":2,"33":2,"34":2,"57":1,"59":1,"65":1,"73":1,"74":2,"75":1,"77":1,"85":1,"87":9,"88":4}}],["current",{"2":{"86":2,"106":1,"124":1,"127":1}}],["currently",{"2":{"22":2,"25":1,"27":1,"30":1,"86":1,"125":1}}],["cumulative",{"2":{"54":9,"86":9}}],["cut",{"2":{"31":1,"127":1}}],["case",{"0":{"59":1}}],["cast",{"2":{"35":1,"74":1,"86":1}}],["called",{"2":{"42":1,"47":1,"74":3,"86":1,"127":2}}],["calls",{"2":{"36":2,"86":2}}],["cardinality",{"2":{"38":20,"86":20}}],["care",{"2":{"36":1,"86":1,"124":1}}],["catch",{"2":{"113":1}}],["categorized",{"2":{"41":1}}],["categories",{"0":{"36":1}}],["cater",{"2":{"19":1}}],["catalog",{"2":{"33":1}}],["capacited",{"2":{"127":1}}],["capacity",{"2":{"127":1}}],["capacities",{"2":{"31":1}}],["capabilities",{"2":{"34":1}}],["capability",{"2":{"33":1}}],["can",{"2":{"5":3,"21":1,"33":1,"38":3,"51":1,"62":1,"73":1,"74":3,"75":1,"86":10,"89":1,"106":5,"109":1,"119":1,"124":3,"125":2,"127":1}}],["creation",{"2":{"33":1,"86":1,"119":1}}],["created",{"2":{"127":1}}],["creates",{"2":{"36":1,"86":1}}],["create",{"2":{"31":4,"35":1,"86":2,"124":1,"125":1}}],["critical",{"2":{"5":1,"18":1}}],["crucial",{"2":{"5":1,"19":1,"33":1}}],["choose",{"2":{"127":1}}],["choice",{"2":{"73":1}}],["chuffed",{"2":{"87":1}}],["chemical",{"2":{"31":3}}],["checks",{"2":{"35":2,"36":2,"46":1,"51":1,"86":6}}],["checking",{"2":{"19":1}}],["check",{"2":{"1":3,"3":8,"8":1,"10":3,"22":1,"25":1,"27":1,"35":1,"38":7,"40":2,"43":1,"49":1,"51":2,"54":1,"74":1,"86":27,"98":1,"99":1,"100":1,"102":1,"103":1,"106":2,"109":1,"124":1,"127":10}}],["chains",{"2":{"88":1}}],["chapter",{"2":{"75":1}}],["characteristics",{"2":{"19":1}}],["change",{"2":{"31":2}}],["changes",{"2":{"19":1,"24":1,"26":1,"31":1,"86":2,"89":1,"124":1}}],["channel",{"2":{"3":9,"86":9}}],["c",{"2":{"1":14,"3":15,"22":1,"25":1,"27":1,"35":16,"36":8,"38":19,"40":2,"44":3,"45":4,"46":6,"49":4,"51":10,"54":11,"86":116,"124":24,"127":31}}],["copy",{"2":{"125":5}}],["cops",{"2":{"87":1}}],["cosntriction",{"2":{"127":1}}],["cosntraints",{"0":{"52":1}}],["cost",{"2":{"127":19}}],["costs",{"2":{"88":1,"127":20}}],["covering",{"2":{"84":1}}],["cover",{"2":{"82":1,"122":1}}],["could",{"2":{"42":1,"47":1}}],["count",{"2":{"38":6,"86":95,"91":3,"117":40,"118":20,"119":21}}],["counting",{"0":{"38":1},"2":{"86":1,"119":1}}],["counter",{"2":{"16":2,"86":2,"124":2,"127":1}}],["co",{"2":{"38":2,"86":11,"98":5,"99":4}}],["coefficients",{"2":{"38":1,"86":1}}],["coeffs",{"2":{"38":2,"86":2}}],["columns",{"2":{"74":1}}],["column",{"2":{"74":1}}],["collect",{"2":{"113":1}}],["collections",{"2":{"14":2,"86":1,"124":1}}],["collection",{"2":{"5":1,"16":1,"22":2,"24":1,"25":1,"27":1,"29":2,"30":1,"42":1,"43":1,"44":1,"74":4,"86":8,"87":1,"103":1,"104":3,"124":5,"125":2,"127":5}}],["collaborate",{"2":{"62":1}}],["col",{"2":{"31":1}}],["coordinates",{"2":{"31":1}}],["core",{"0":{"36":1},"2":{"6":2,"8":1,"33":4,"36":1,"41":1,"86":2,"124":1}}],["corresponding",{"2":{"31":1,"86":1,"119":1}}],["corresponds",{"2":{"3":2,"86":2}}],["correspondence",{"2":{"3":2,"86":2}}],["code",{"2":{"5":1,"73":1,"86":5,"124":3}}],["come",{"2":{"125":1}}],["combinatorial",{"2":{"65":1,"88":1,"106":1}}],["command",{"2":{"73":1}}],["community",{"0":{"61":1,"62":1},"1":{"62":1,"63":1},"2":{"62":1}}],["commitment",{"2":{"34":1}}],["commons",{"0":{"21":1},"1":{"22":1,"23":1}}],["common",{"2":{"5":1,"87":1}}],["compile",{"2":{"86":1,"119":1}}],["compliance",{"2":{"51":2,"86":2}}],["complex",{"2":{"20":1,"32":1,"33":1,"47":1,"56":1,"88":2,"89":1}}],["complexity",{"2":{"5":1,"84":1}}],["completely",{"2":{"86":1,"124":1}}],["completed",{"2":{"5":1,"74":1}}],["complete",{"2":{"5":1,"19":1,"29":2,"86":6,"124":5}}],["components",{"2":{"33":1,"86":2,"102":2,"124":2}}],["compounds",{"2":{"31":1}}],["compositions",{"2":{"86":1}}],["compositionalneworks",{"2":{"102":1}}],["compositionalnetworks",{"0":{"101":1},"1":{"102":1,"103":1},"2":{"5":1,"86":77,"91":2,"92":1,"94":2,"95":1,"98":4,"99":3,"100":1,"101":1,"102":6,"103":3,"104":3,"106":10,"117":11,"118":6,"119":2,"124":26}}],["compositional",{"2":{"86":1,"106":1,"124":1}}],["composition",{"2":{"86":24,"102":1,"124":21}}],["compose",{"2":{"74":1,"86":12,"106":1,"124":8}}],["composed",{"2":{"29":1,"86":3,"124":3}}],["comprehensive",{"2":{"20":1,"34":1,"86":2}}],["computational",{"2":{"19":1,"72":1}}],["computes",{"2":{"127":1}}],["computed",{"2":{"86":17,"117":10,"118":6}}],["compute",{"2":{"14":2,"24":2,"26":1,"31":1,"86":7,"103":1,"104":1,"109":1,"124":4,"125":1,"127":17}}],["compatible",{"2":{"5":1}}],["compare",{"2":{"1":1,"35":1,"86":2}}],["comparisons",{"0":{"97":1},"1":{"98":1,"99":1,"100":1},"2":{"86":2,"100":1,"119":2}}],["comparison",{"0":{"1":1,"96":1},"1":{"97":1,"98":1,"99":1,"100":1},"2":{"1":1,"38":1,"86":9,"96":1,"97":1,"98":1,"100":2,"119":1,"124":5}}],["cohesive",{"2":{"5":1}}],["conflict",{"2":{"86":1}}],["conflicted",{"2":{"86":3}}],["conflicts",{"2":{"86":8}}],["conflicts=nothing",{"2":{"86":1}}],["configuration",{"2":{"31":2,"86":8,"104":4,"124":2,"125":1,"127":3}}],["configurations",{"2":{"12":1,"29":2,"86":7,"104":1,"124":3,"127":1}}],["configure",{"2":{"19":1}}],["connecting",{"2":{"86":1,"124":1}}],["connection",{"0":{"3":1}}],["connector",{"2":{"86":1,"124":1}}],["conduct",{"2":{"85":1}}],["conditions",{"2":{"86":1,"88":1,"119":1,"127":1}}],["condition",{"2":{"3":13,"38":15,"54":3,"86":31}}],["concerned",{"2":{"88":2}}],["concentrations",{"2":{"31":2}}],["concepts",{"0":{"66":1},"2":{"66":1,"81":1}}],["concept",{"2":{"1":10,"3":8,"29":3,"33":2,"35":19,"36":18,"38":15,"40":2,"43":1,"44":1,"45":2,"46":3,"49":2,"51":4,"54":6,"86":95,"124":20,"125":5}}],["convert",{"2":{"21":1,"28":3,"86":7,"102":2,"106":1,"124":1}}],["containing",{"2":{"127":1}}],["container",{"2":{"86":1,"106":1,"125":1}}],["contains",{"2":{"35":1,"36":2,"74":1,"86":4,"106":1,"124":2}}],["content",{"2":{"75":1}}],["contexts",{"2":{"33":1}}],["context",{"2":{"21":1,"86":1,"106":2,"124":1}}],["contrast",{"2":{"67":1,"89":1}}],["contribute",{"2":{"62":1}}],["contribution",{"0":{"61":1},"1":{"62":1,"63":1}}],["contiguous",{"2":{"86":12,"117":8,"119":4}}],["contiuous",{"2":{"24":1,"26":1,"86":1,"124":1}}],["continuousdomain",{"2":{"19":1,"24":2,"86":2,"124":1}}],["continuous",{"0":{"24":1},"1":{"25":1},"2":{"18":1,"19":2,"21":2,"24":2,"26":1,"31":1,"86":3,"124":3}}],["cons=dictionary",{"2":{"127":1}}],["cons",{"2":{"127":31}}],["considered",{"2":{"38":2,"86":2,"127":1}}],["considers",{"2":{"8":1}}],["consistent",{"2":{"36":1,"86":1}}],["constriction",{"2":{"127":4}}],["constrained",{"2":{"127":2}}],["constrains",{"2":{"127":1}}],["constraintprogrammingextensions",{"2":{"87":1}}],["constraintmodels",{"0":{"31":1},"2":{"31":15,"87":1}}],["constrainttranslator",{"2":{"5":1}}],["constraintlearning",{"0":{"104":1},"2":{"5":1,"104":27,"123":1}}],["constraintdomains",{"0":{"18":1},"1":{"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1},"2":{"5":1,"18":1,"19":3,"20":2,"21":6,"24":8,"26":10,"29":3,"30":11,"86":35,"87":1,"124":18}}],["constraintcommons",{"0":{"4":1},"1":{"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1},"2":{"4":1,"5":4,"6":3,"8":6,"12":1,"14":1,"16":1,"30":2,"36":2,"86":16,"124":10}}],["constraint",{"0":{"0":1,"2":1,"20":1,"32":1,"34":1,"37":1,"39":1,"43":1,"48":1,"50":1,"53":1,"55":1,"64":1,"65":1,"88":1,"89":1,"114":1},"1":{"1":1,"3":1,"33":1,"34":1,"35":1,"36":1,"38":1,"40":1,"49":1,"51":1,"54":1,"56":1,"57":1,"65":1,"66":1,"67":1},"2":{"1":7,"3":24,"4":1,"5":3,"6":9,"12":1,"18":2,"19":1,"20":2,"22":3,"25":3,"27":3,"29":2,"32":1,"33":10,"34":2,"35":17,"36":24,"38":20,"40":7,"42":5,"43":5,"44":4,"46":4,"47":3,"49":7,"51":6,"54":20,"74":7,"75":1,"86":156,"87":5,"88":1,"89":5,"104":4,"106":1,"108":1,"119":3,"124":39,"125":29,"127":33}}],["constraintsolver",{"2":{"87":1}}],["constraints",{"0":{"0":1,"1":1,"2":1,"3":1,"32":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"47":1,"48":1,"49":1,"50":1,"51":1,"53":1,"54":1,"56":1,"75":1,"105":1},"1":{"1":1,"3":1,"33":1,"34":1,"35":1,"36":1,"38":1,"40":1,"42":1,"43":2,"44":2,"45":2,"46":2,"47":1,"49":1,"51":1,"54":1},"2":{"1":3,"3":4,"4":1,"5":1,"6":9,"8":3,"18":1,"32":3,"33":17,"34":5,"35":12,"36":38,"38":4,"40":1,"41":2,"42":3,"43":3,"44":2,"46":3,"47":2,"49":1,"51":2,"52":1,"54":2,"56":1,"66":1,"73":1,"74":2,"86":75,"87":4,"88":3,"89":2,"104":1,"105":1,"111":1,"124":40,"127":23}}],["constructor",{"2":{"31":1,"104":3,"125":1,"127":1}}],["constructing",{"2":{"31":1}}],["construct",{"2":{"21":3,"24":3,"26":3,"30":1,"31":3,"86":6,"124":5,"127":3}}],["constant",{"2":{"6":1,"35":1,"36":1,"86":3,"124":2}}],["o",{"2":{"104":1,"127":16}}],["objs=dictionary",{"2":{"127":1}}],["objs",{"2":{"127":7}}],["objectives",{"2":{"127":10}}],["objective",{"2":{"74":1,"125":4,"127":24}}],["observable",{"2":{"31":1}}],["own",{"2":{"73":1,"74":1,"127":1}}],["occurs",{"2":{"38":2,"86":2}}],["occurrences",{"2":{"38":7,"86":7}}],["others",{"2":{"87":1}}],["other",{"0":{"67":1},"2":{"31":1,"67":1,"73":1,"74":4,"87":1,"88":1,"89":2,"127":2}}],["otherwise",{"2":{"1":3,"3":4,"8":1,"22":1,"25":1,"27":1,"30":1,"35":3,"38":4,"40":1,"49":1,"54":2,"86":28,"98":2,"99":2,"117":2,"118":2,"124":3,"127":1}}],["oversampling",{"2":{"104":1,"113":6}}],["oversample",{"2":{"12":2,"86":2,"113":1,"124":2}}],["overview",{"0":{"81":1},"2":{"75":1}}],["overviews",{"0":{"69":1}}],["overlap",{"2":{"54":21,"86":21}}],["over",{"2":{"14":1,"29":1,"33":1,"35":1,"36":1,"46":2,"74":2,"86":7,"103":1,"104":1,"124":4,"125":1,"127":1}}],["output",{"2":{"86":2,"104":1,"124":2}}],["outputs",{"2":{"35":1,"86":1,"123":3,"124":1}}],["out",{"2":{"74":1}}],["outlined",{"2":{"33":1}}],["outcomes",{"2":{"5":1}}],["our",{"2":{"12":1,"74":2}}],["ongoing",{"2":{"54":2,"86":2}}],["only",{"2":{"38":1,"74":1,"86":6,"92":1,"95":1,"100":1,"106":2,"111":1,"124":3,"125":2,"127":1}}],["on",{"0":{"36":1,"49":1,"84":1},"2":{"5":2,"6":2,"18":1,"19":1,"21":1,"29":1,"30":1,"31":1,"35":1,"36":3,"40":2,"42":1,"43":2,"46":1,"57":1,"73":1,"86":14,"87":1,"88":3,"104":3,"109":1,"115":1,"119":2,"121":1,"124":4,"125":2,"127":2}}],["once",{"2":{"5":2,"73":1}}],["one",{"2":{"5":1,"30":1,"33":1,"36":1,"74":3,"86":14,"92":1,"95":1,"100":1,"102":2,"104":2,"106":2,"108":1,"109":4,"113":1,"124":10,"127":3}}],["originating",{"2":{"86":1}}],["origins",{"2":{"54":6,"86":6}}],["oriented",{"2":{"4":1}}],["org",{"2":{"36":1,"86":1,"124":1}}],["organizations",{"2":{"88":1}}],["organization",{"2":{"33":1,"69":1,"75":1}}],["or",{"2":{"5":1,"6":1,"16":1,"19":4,"20":1,"21":2,"22":1,"24":1,"25":1,"26":1,"27":1,"31":1,"34":1,"35":1,"36":2,"38":1,"42":1,"47":2,"54":4,"63":1,"73":1,"74":1,"86":24,"87":2,"88":4,"89":2,"109":1,"119":5,"123":3,"124":8,"127":6}}],["order",{"2":{"1":6,"31":1,"40":2,"86":9,"119":1,"125":2}}],["ordered",{"2":{"1":6,"86":8,"106":1,"125":3,"127":1}}],["opt",{"2":{"125":1}}],["optmizers",{"2":{"104":1}}],["optimisation",{"2":{"87":1}}],["optimizing",{"2":{"88":1,"127":7}}],["optimization",{"0":{"57":1,"58":1,"67":1,"71":1,"79":1,"80":1},"1":{"59":1,"60":1,"72":1,"73":1,"74":1,"80":1,"81":1,"82":1},"2":{"33":1,"59":1,"60":1,"72":1,"75":1,"77":1,"80":2,"82":1,"88":2,"127":2}}],["optimizers",{"0":{"112":1},"1":{"113":1,"114":1},"2":{"104":1}}],["optimizer",{"2":{"74":1,"87":1,"104":6,"113":8,"125":17,"127":3}}],["optimize",{"2":{"31":1,"86":1,"88":1,"104":11,"124":1,"125":3}}],["optionally",{"2":{"35":2,"36":1,"86":2,"124":2}}],["optional",{"2":{"29":1,"31":1,"86":10,"104":1,"109":1,"124":10,"127":2}}],["options",{"2":{"19":1,"104":2,"125":4,"127":32}}],["open",{"2":{"38":6,"86":6,"115":1}}],["operate",{"2":{"86":1,"119":1}}],["operational",{"0":{"88":1},"2":{"88":1}}],["operation",{"2":{"86":5,"104":2,"106":5}}],["operations",{"0":{"94":1},"2":{"10":1,"25":2,"27":2,"86":21,"92":1,"95":2,"100":1,"104":3,"106":13,"119":1,"124":7}}],["operators",{"2":{"30":1,"86":1}}],["operator",{"2":{"1":3,"38":1,"86":4}}],["opparameterdomain",{"2":{"30":1,"86":1}}],["op",{"2":{"3":8,"6":1,"38":10,"49":4,"54":4,"86":29,"106":2}}],["op==",{"2":{"38":1,"86":1}}],["op===",{"2":{"3":2,"38":4,"86":6}}],["op=>",{"2":{"1":2,"86":2}}],["op=≥",{"2":{"1":2,"38":1,"86":3}}],["op=≤",{"2":{"1":6,"38":3,"86":9}}],["op=",{"2":{"1":6,"86":6}}],["op=+",{"2":{"1":2,"86":2}}],["official",{"2":{"73":1}}],["offer",{"2":{"33":1}}],["offering",{"2":{"20":1,"33":1,"34":1}}],["offers",{"2":{"5":1,"19":1,"34":1}}],["often",{"2":{"49":2,"54":6,"86":8,"88":1}}],["of",{"0":{"91":1,"94":1,"97":1,"116":1},"1":{"98":1,"99":1,"100":1,"117":1,"118":1,"119":1},"2":{"1":14,"3":17,"4":1,"5":9,"6":6,"8":3,"12":2,"14":4,"18":3,"19":8,"20":4,"21":3,"22":5,"24":7,"25":10,"26":7,"27":11,"29":14,"30":2,"31":33,"32":1,"33":13,"34":1,"35":18,"36":23,"38":35,"40":6,"46":3,"47":4,"49":8,"51":10,"54":14,"60":1,"63":1,"72":2,"73":1,"74":11,"75":2,"78":1,"80":2,"82":1,"85":1,"86":292,"87":7,"88":2,"89":4,"91":2,"92":2,"95":2,"98":3,"100":2,"102":6,"103":3,"104":14,"106":15,"109":3,"115":3,"117":13,"118":4,"119":8,"123":2,"124":96,"125":16,"127":78}}],["f2",{"2":{"127":2}}],["fetch",{"2":{"127":1}}],["few",{"2":{"122":1}}],["feasible",{"2":{"74":2,"89":1}}],["features",{"0":{"5":1,"19":1,"33":1,"108":1},"2":{"33":1,"69":1}}],["feature",{"2":{"4":1,"19":1,"33":1}}],["front",{"2":{"115":1}}],["from",{"0":{"51":1,"60":1,"67":1},"2":{"22":4,"25":2,"27":3,"30":2,"31":2,"33":2,"36":1,"46":1,"51":1,"60":1,"74":2,"75":1,"86":14,"88":1,"104":1,"111":1,"119":2,"124":2,"127":17}}],["framework",{"2":{"87":1}}],["friendly",{"2":{"34":1}}],["free",{"2":{"31":1}}],["finds",{"2":{"123":1}}],["find",{"2":{"89":5,"127":2}}],["finding",{"2":{"87":1,"88":1,"89":2}}],["finishes",{"2":{"54":8,"86":8}}],["finish",{"2":{"51":2,"86":2}}],["filter",{"2":{"113":1}}],["file",{"2":{"86":7,"106":1,"124":7}}],["filled",{"2":{"74":1}}],["fill",{"2":{"31":4,"74":1}}],["fields",{"2":{"35":1,"86":1,"124":1}}],["first",{"0":{"74":1},"2":{"3":2,"35":1,"36":3,"51":1,"54":8,"74":1,"86":15,"104":1,"113":4,"123":1,"127":1}}],["flatten",{"2":{"113":1}}],["flaw",{"2":{"31":1}}],["flexibility",{"2":{"33":2,"73":1}}],["flexible",{"2":{"19":1,"29":2,"33":1,"34":1,"47":1,"86":5,"119":1,"124":3}}],["float64",{"2":{"35":2,"86":2,"113":1,"125":1,"127":5}}],["flows",{"2":{"31":1}}],["flow",{"2":{"31":1}}],["floor",{"2":{"29":1,"86":1,"124":1}}],["f",{"2":{"8":1,"12":2,"33":1,"35":3,"86":16,"102":6,"124":14,"125":20,"127":7}}],["full",{"0":{"86":1}}],["further",{"2":{"31":1,"73":1}}],["future",{"0":{"63":1},"2":{"6":1,"29":1,"86":1,"124":1}}],["func",{"2":{"127":6}}],["funcs",{"2":{"86":2,"102":2,"124":2}}],["functionality",{"2":{"5":1}}],["functionalities",{"0":{"5":1,"19":1,"33":1},"2":{"5":1,"19":1,"20":1,"33":1}}],["functions",{"2":{"4":1,"5":2,"19":1,"31":1,"35":2,"86":8,"100":1,"106":3,"119":4,"124":2}}],["function",{"2":{"1":3,"3":4,"6":2,"8":2,"12":2,"14":1,"16":2,"21":4,"22":5,"24":6,"25":4,"26":7,"27":5,"28":2,"29":3,"30":4,"31":1,"33":2,"35":29,"36":14,"38":4,"40":1,"42":1,"46":2,"49":1,"51":3,"54":2,"74":1,"86":67,"91":2,"92":1,"94":2,"95":1,"98":5,"99":3,"100":1,"102":12,"103":3,"104":4,"106":9,"108":2,"109":3,"111":1,"113":7,"115":1,"117":12,"118":6,"119":6,"123":1,"124":31,"125":14,"127":16}}],["fundamentals",{"2":{"82":1}}],["fundamental",{"2":{"5":1,"46":1,"86":1}}],["found",{"2":{"106":1}}],["foundation",{"2":{"19":1}}],["foundational",{"2":{"4":1,"5":1}}],["fold",{"2":{"87":1}}],["following",{"2":{"21":1,"33":1,"35":1,"38":1,"86":8,"102":2,"109":1,"119":1,"124":6,"127":1}}],["follows",{"2":{"12":1,"74":1,"125":2}}],["follow",{"2":{"6":1}}],["focuses",{"2":{"87":1,"88":2}}],["focusing",{"2":{"18":1}}],["fostering",{"2":{"5":1}}],["forbidden",{"2":{"31":1,"86":1}}],["forwarded",{"2":{"127":1}}],["forward",{"2":{"31":2,"74":1}}],["formal",{"2":{"127":1}}],["formatted",{"2":{"86":2,"102":1,"124":1}}],["format",{"2":{"6":1,"21":1,"31":9,"86":2,"109":1,"124":2}}],["formulating",{"2":{"60":1}}],["formulation",{"2":{"19":1}}],["form",{"2":{"49":2,"86":2}}],["forseeable",{"2":{"6":1}}],["for",{"0":{"45":1,"71":1,"106":1,"109":1},"1":{"72":1,"73":1,"74":1},"2":{"3":4,"5":5,"6":1,"8":5,"10":7,"16":1,"18":1,"19":13,"20":3,"21":3,"22":3,"24":2,"25":3,"26":2,"27":3,"28":2,"29":1,"30":2,"31":13,"32":1,"33":6,"34":4,"35":5,"36":4,"42":1,"43":1,"44":1,"47":1,"54":6,"63":1,"70":1,"72":1,"73":3,"74":2,"77":1,"86":53,"87":5,"88":1,"89":3,"98":3,"99":2,"100":2,"101":1,"102":4,"103":2,"104":8,"106":4,"108":1,"109":2,"111":1,"113":2,"117":1,"119":5,"120":1,"123":1,"124":12,"125":4,"127":18}}],["faster",{"2":{"127":1}}],["facilities",{"2":{"31":6}}],["facilitating",{"2":{"19":1,"34":1}}],["facilitates",{"2":{"5":1,"19":1,"86":1,"119":1}}],["facilitate",{"2":{"4":1,"32":1}}],["fake",{"2":{"30":1,"86":1}}],["fakeautomaton",{"2":{"8":2,"19":1,"22":2,"25":1,"27":1,"30":5,"86":5}}],["fallback",{"2":{"21":1,"22":2,"24":1,"25":2,"26":1,"27":2,"86":4,"124":1}}],["false",{"2":{"1":3,"3":10,"8":1,"12":1,"22":2,"25":2,"27":2,"30":1,"35":3,"36":1,"38":4,"40":1,"44":1,"49":1,"54":2,"86":31,"100":1,"113":3,"119":1,"124":5,"127":2}}],["fa",{"2":{"8":1,"22":4,"25":2,"27":2,"30":3,"86":3}}],["vov",{"2":{"125":2}}],["v",{"2":{"86":3,"102":3,"123":7,"124":2,"125":4,"127":3}}],["vs",{"0":{"88":1},"2":{"35":3,"86":3}}],["vi",{"2":{"125":1}}],["viable",{"2":{"86":6,"106":5,"124":1}}],["visual",{"2":{"73":1}}],["vision",{"2":{"63":1}}],["vital",{"2":{"33":1}}],["vice",{"2":{"3":2,"86":3,"119":1}}],["vec",{"2":{"74":1}}],["vectorofvariables",{"2":{"125":1}}],["vectors",{"2":{"86":3,"94":2,"117":1}}],["vector",{"2":{"1":6,"6":2,"8":1,"21":1,"22":4,"24":4,"25":3,"26":1,"27":3,"29":1,"30":1,"36":2,"38":9,"46":1,"51":2,"86":59,"91":1,"94":2,"102":2,"109":2,"113":5,"117":10,"118":6,"123":2,"124":10,"125":2,"127":1}}],["verbose",{"2":{"127":4}}],["verbosity",{"2":{"127":1}}],["very",{"2":{"88":1}}],["verifies",{"2":{"51":2,"86":2}}],["versionnumber",{"2":{"123":1}}],["versions",{"2":{"123":3}}],["version",{"2":{"36":1,"73":1,"86":2,"119":1,"123":3}}],["versatile",{"2":{"86":2}}],["versatility",{"2":{"20":1}}],["versa",{"2":{"3":2,"86":3,"119":1}}],["var",{"2":{"127":12}}],["variety",{"2":{"89":1}}],["various",{"0":{"112":1},"1":{"113":1,"114":1},"2":{"14":1,"19":1,"21":1,"33":1,"57":1,"73":1,"84":1,"86":2,"89":1,"119":1,"124":1}}],["variant",{"2":{"54":2,"86":2}}],["variants",{"2":{"1":3,"3":4,"38":4,"40":1,"46":1,"49":1,"51":2,"54":2,"74":1,"86":19}}],["variableinfo",{"2":{"125":1}}],["variable",{"0":{"18":1},"1":{"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1},"2":{"3":6,"18":1,"19":1,"20":1,"22":3,"25":3,"27":3,"33":1,"35":1,"42":2,"47":2,"74":2,"86":9,"124":2,"125":4,"127":40}}],["variables",{"2":{"3":8,"30":1,"38":8,"40":2,"46":1,"47":1,"49":2,"51":1,"66":1,"74":3,"86":32,"87":1,"98":3,"103":1,"108":2,"124":4,"125":5,"127":26}}],["vars",{"2":{"6":1,"40":2,"54":15,"86":42,"98":6,"125":2,"127":24}}],["vars=dictionary",{"2":{"127":1}}],["vars=ones",{"2":{"38":2,"86":2}}],["vars=nothing",{"2":{"1":10,"86":10}}],["vars=",{"2":{"1":4,"40":2,"86":11}}],["vars=zeros",{"2":{"1":2,"86":2}}],["valparameterdomain",{"2":{"30":1,"86":1}}],["validity",{"2":{"46":1,"86":1}}],["valid",{"2":{"21":1,"51":1,"86":10,"88":2,"108":2,"109":3,"124":5}}],["val=3",{"2":{"38":1,"86":1}}],["val=2",{"2":{"3":1,"38":3,"86":4}}],["val=15",{"2":{"38":2,"86":2}}],["val=1",{"2":{"1":2,"3":1,"38":1,"86":4}}],["val=nothing",{"2":{"1":2,"3":2,"86":4}}],["valued",{"2":{"51":1,"86":1}}],["value",{"2":{"1":1,"3":13,"22":8,"25":7,"26":2,"27":10,"30":2,"31":1,"35":3,"36":5,"38":5,"49":4,"51":3,"74":3,"86":58,"100":2,"106":1,"109":1,"119":8,"124":13,"125":6,"127":20}}],["values",{"2":{"1":13,"3":4,"21":2,"24":2,"26":4,"30":3,"31":4,"35":2,"36":1,"38":24,"40":6,"47":2,"49":3,"51":2,"74":2,"86":66,"119":5,"124":4,"125":6,"127":11}}],["val",{"0":{"99":1,"118":1},"2":{"1":3,"3":8,"6":1,"16":2,"21":1,"31":4,"38":21,"49":4,"54":6,"86":74,"98":6,"99":6,"118":8,"119":8,"124":3,"127":8}}],["valsparameterdomain",{"2":{"30":1,"86":1}}],["vals=nothing",{"2":{"36":2,"86":2,"124":1}}],["vals=",{"2":{"1":2,"38":13,"86":15}}],["vals",{"2":{"1":2,"6":1,"38":18,"86":31,"117":8,"119":2}}],["tbw",{"2":{"104":4}}],["typically",{"2":{"88":1}}],["typeof",{"2":{"125":6}}],["typemax",{"2":{"113":1,"127":1}}],["type",{"2":{"8":4,"19":2,"21":6,"24":2,"26":5,"28":1,"29":1,"30":9,"31":7,"33":1,"35":1,"86":34,"89":2,"104":7,"106":1,"111":2,"119":1,"124":13,"125":32,"127":17}}],["types",{"2":{"4":1,"5":2,"19":3,"41":1,"47":1,"80":1,"86":2,"119":2,"127":8}}],["tutorials",{"0":{"83":1,"84":1},"1":{"84":1,"85":1},"2":{"84":1}}],["tuples",{"2":{"47":2,"86":6}}],["tuple",{"2":{"3":7,"21":5,"24":5,"26":5,"31":2,"54":1,"86":17,"124":5}}],["tips",{"2":{"77":1}}],["timelimitsec",{"2":{"125":1}}],["timestamps",{"2":{"127":1}}],["times",{"2":{"38":3,"86":3}}],["time",{"2":{"31":2,"54":8,"86":10,"89":1,"106":2,"119":1,"125":1,"127":27}}],["temporary",{"2":{"127":1}}],["terminationstatuscode",{"2":{"125":1}}],["terminology",{"0":{"66":1}}],["text",{"2":{"90":1,"93":1,"96":1,"115":1}}],["teach",{"2":{"78":1}}],["techniques",{"0":{"55":1,"67":1},"1":{"56":1,"57":1},"2":{"88":2,"89":2}}],["test",{"0":{"45":1},"2":{"104":2,"113":6}}],["testing",{"2":{"35":1,"86":1,"104":1,"125":1}}],["tendency",{"2":{"31":1}}],["tabu",{"2":{"81":1,"127":46}}],["table",{"2":{"36":4,"86":4,"113":1,"124":4}}],["task",{"2":{"54":16,"86":16}}],["tasks",{"2":{"54":18,"86":18,"127":1}}],["take",{"2":{"36":1,"74":1,"86":1,"89":1,"124":1}}],["takes",{"2":{"35":1,"36":1,"40":2,"86":4}}],["targeted",{"2":{"29":1,"73":1,"86":2,"124":2,"127":3}}],["tailoring",{"2":{"19":1,"33":1}}],["t",{"2":{"8":2,"21":8,"24":11,"26":14,"30":5,"31":10,"35":1,"36":2,"51":2,"86":29,"124":12,"125":12,"127":7}}],["tries",{"2":{"89":1}}],["tr",{"2":{"86":58,"102":3,"117":33,"118":18}}],["try",{"2":{"73":1,"89":1,"113":1}}],["train",{"2":{"86":3,"104":2,"111":3,"113":5,"124":2}}],["training",{"2":{"86":1,"104":7,"124":1}}],["traditional",{"2":{"33":1}}],["transpose",{"2":{"113":3}}],["transportation",{"2":{"88":1}}],["transported",{"2":{"31":1}}],["transform",{"2":{"86":1,"109":1,"124":1}}],["transforms",{"2":{"86":4,"119":4}}],["transformations",{"0":{"115":1,"116":1},"1":{"116":1,"117":2,"118":2,"119":2},"2":{"86":16,"100":1,"116":1,"119":15,"124":3}}],["transformation",{"2":{"86":12,"115":3,"119":8,"124":4}}],["transition",{"2":{"5":2}}],["true",{"2":{"1":3,"3":6,"8":3,"12":1,"22":2,"25":2,"27":2,"30":1,"35":2,"36":1,"38":4,"40":1,"44":1,"45":2,"49":1,"54":2,"86":28,"104":1,"106":1,"119":1,"124":4,"125":2,"127":3}}],["two",{"2":{"3":2,"8":1,"21":1,"24":3,"26":3,"31":1,"36":1,"41":1,"46":1,"47":1,"54":4,"86":11,"87":1,"124":3,"125":1}}],["th",{"2":{"86":1,"106":1}}],["threads",{"2":{"127":8}}],["threshold",{"2":{"86":1,"119":1}}],["throw",{"2":{"113":1}}],["through",{"2":{"33":1,"42":3,"44":2,"60":1,"73":3,"86":3,"91":1,"94":2,"104":2}}],["than",{"2":{"35":1,"36":1,"42":1,"86":11,"117":5,"118":2,"119":1,"125":2}}],["that",{"2":{"1":7,"3":14,"4":1,"5":6,"6":1,"18":1,"21":2,"22":2,"24":1,"25":2,"26":3,"27":2,"29":1,"31":2,"33":1,"35":11,"36":2,"38":11,"40":4,"42":4,"43":2,"44":1,"46":2,"47":4,"49":2,"51":5,"54":12,"73":1,"74":6,"75":1,"86":101,"87":3,"88":4,"89":5,"92":1,"95":1,"100":2,"102":2,"104":3,"106":3,"108":1,"119":3,"124":16,"125":11,"127":10}}],["those",{"2":{"33":1,"106":1}}],["thus",{"2":{"31":1}}],["this",{"2":{"3":2,"5":3,"6":1,"18":1,"19":1,"20":1,"29":1,"31":1,"32":1,"33":3,"35":1,"36":4,"43":1,"46":1,"51":2,"54":2,"74":2,"86":17,"106":2,"119":1,"121":1,"122":1,"124":2,"127":3}}],["third",{"2":{"3":2,"86":2}}],["theory",{"0":{"60":1}}],["them",{"2":{"46":1,"86":1,"87":1,"127":1}}],["they",{"2":{"31":1,"42":3,"47":3,"56":1,"62":1,"87":1,"88":1,"89":1}}],["there",{"2":{"31":3,"36":1,"51":1,"86":2}}],["thereby",{"2":{"5":1,"18":1}}],["then",{"2":{"29":1,"36":2,"43":1,"86":3,"124":1,"127":2}}],["these",{"2":{"19":1,"33":3,"36":1,"42":1,"47":2,"86":1,"89":1}}],["their",{"0":{"56":1},"2":{"5":1,"33":1,"57":1,"73":1,"74":1,"86":1,"119":1}}],["the",{"0":{"62":1},"2":{"1":10,"3":25,"4":2,"5":19,"6":10,"8":2,"12":1,"14":5,"16":2,"18":4,"19":14,"20":5,"21":8,"22":4,"24":8,"25":8,"26":6,"27":9,"29":13,"30":5,"31":54,"32":2,"33":19,"34":3,"35":46,"36":67,"38":41,"40":3,"41":1,"42":6,"43":9,"44":6,"46":6,"47":4,"49":16,"51":17,"54":33,"60":1,"62":1,"63":1,"69":1,"72":1,"73":9,"74":13,"75":3,"78":1,"82":1,"85":1,"86":464,"87":4,"88":3,"89":3,"90":1,"91":1,"92":3,"93":1,"95":3,"96":1,"97":2,"98":7,"99":3,"100":4,"102":4,"103":2,"104":17,"106":19,"108":1,"109":1,"115":5,"116":2,"117":25,"118":12,"119":12,"122":1,"123":4,"124":137,"125":17,"127":120}}],["too",{"2":{"89":1}}],["tool",{"2":{"32":1}}],["toolkit",{"2":{"20":1}}],["tools",{"0":{"35":1,"52":1},"2":{"19":1,"34":2}}],["towards",{"2":{"86":1,"124":1}}],["topics",{"2":{"84":1}}],["total",{"2":{"25":1,"27":1,"86":1}}],["todo",{"0":{"7":1,"9":1,"11":1,"13":1,"15":1,"17":1},"2":{"35":1,"43":1,"44":2,"73":1,"74":4,"86":1,"127":1}}],["to",{"0":{"22":1,"25":1,"27":1,"52":1,"60":1,"75":1,"107":1},"1":{"108":1},"2":{"1":9,"3":12,"4":1,"5":2,"6":1,"8":1,"12":1,"14":1,"16":1,"19":6,"21":4,"22":6,"24":3,"25":4,"26":1,"27":4,"29":3,"30":18,"31":19,"32":2,"33":4,"34":2,"35":17,"36":23,"38":13,"40":2,"42":1,"43":6,"44":3,"47":1,"49":3,"51":4,"54":2,"62":1,"73":4,"74":6,"75":1,"78":1,"85":1,"86":187,"87":3,"88":5,"89":9,"90":1,"93":1,"94":2,"96":1,"102":6,"103":1,"104":12,"106":3,"107":1,"108":1,"109":1,"111":1,"113":1,"115":2,"117":18,"118":7,"119":7,"121":1,"122":1,"124":46,"125":10,"127":49}}],["i+1",{"2":{"74":1}}],["iconic",{"2":{"74":1}}],["icnlocalsearchoptimizer",{"2":{"104":3}}],["icngeneticoptimizer",{"2":{"104":4}}],["icnoptimizer",{"2":{"104":3}}],["icnconfig",{"2":{"104":4}}],["icns",{"2":{"90":1,"93":1,"96":1,"104":1,"106":1,"115":1}}],["icn=icn",{"2":{"86":1,"124":1}}],["icn",{"0":{"106":1},"2":{"25":2,"27":2,"35":1,"86":36,"92":1,"95":1,"100":1,"104":12,"106":7,"119":1,"124":23}}],["ignores",{"2":{"54":1,"86":1}}],["ignore",{"2":{"54":1,"86":1}}],["ignored",{"2":{"54":2,"86":2}}],["illustrate",{"2":{"43":1}}],["io",{"2":{"31":2}}],["immutable",{"2":{"26":1,"86":1,"124":1}}],["impossible",{"2":{"89":1}}],["importance",{"2":{"75":1,"85":1}}],["improve",{"2":{"78":1,"88":1,"89":1}}],["improvement",{"0":{"78":1},"2":{"127":1}}],["improving",{"2":{"33":1,"127":1}}],["implemented",{"2":{"87":1}}],["implement",{"2":{"8":1,"21":1,"30":1,"86":2,"124":1}}],["implementations",{"2":{"19":1}}],["implementation",{"2":{"8":2,"86":2,"115":1,"124":2}}],["impact",{"2":{"5":1,"57":1}}],["i`",{"2":{"22":1,"25":1,"27":1,"86":1}}],["i",{"2":{"22":10,"24":7,"25":8,"26":3,"27":8,"30":2,"49":2,"54":4,"74":4,"86":64,"102":2,"103":1,"106":2,"113":2,"117":23,"118":13,"124":3,"127":1}}],["identity",{"2":{"86":14,"98":4,"117":6,"119":4}}],["identified",{"2":{"35":1,"86":1}}],["ids",{"2":{"30":1,"86":1}}],["idparameterdomain",{"2":{"30":1,"86":1}}],["id",{"2":{"6":1,"31":2,"86":1,"127":13}}],["id=3",{"2":{"3":1,"86":1}}],["id=1",{"2":{"3":3,"86":3}}],["id=nothing",{"2":{"3":4,"86":4}}],["iterate",{"2":{"127":1}}],["iterators",{"2":{"113":1}}],["iterations",{"2":{"127":3}}],["iteration",{"2":{"86":2,"124":2,"127":8}}],["iter=100",{"2":{"86":2,"124":2}}],["iter",{"2":{"86":8,"104":3,"124":8,"127":1}}],["ith",{"2":{"22":2,"25":1,"27":1,"30":1,"86":1}}],["itvls",{"2":{"24":3,"86":3}}],["itv",{"2":{"21":2,"22":8,"24":2,"25":7,"26":2,"27":7,"30":3,"86":9,"124":2}}],["itself",{"2":{"86":1,"124":1}}],["its",{"2":{"5":1,"24":1,"26":1,"31":1,"33":2,"35":1,"65":1,"69":1,"72":1,"73":2,"74":1,"75":1,"82":1,"86":5,"102":2,"124":3,"127":2}}],["it",{"2":{"4":1,"21":1,"30":8,"32":1,"35":9,"36":25,"38":2,"42":1,"43":1,"44":1,"46":2,"49":2,"51":1,"54":6,"73":1,"74":4,"86":65,"87":2,"89":2,"97":1,"104":1,"106":1,"109":1,"116":1,"119":1,"123":1,"124":6,"125":1,"127":6}}],["isa",{"2":{"113":1}}],["issue",{"0":{"45":1},"2":{"115":1}}],["isempty",{"2":{"10":1,"22":3,"86":3}}],["is",{"0":{"65":1},"2":{"3":10,"4":1,"5":4,"6":2,"19":2,"21":2,"22":5,"24":3,"25":4,"27":4,"29":3,"30":9,"31":9,"32":2,"33":3,"35":7,"36":14,"38":15,"40":3,"42":3,"43":1,"44":3,"46":2,"49":5,"51":9,"54":10,"73":1,"74":6,"86":154,"87":5,"88":5,"89":4,"92":1,"95":1,"100":2,"102":1,"104":5,"106":7,"109":4,"111":1,"117":20,"118":13,"119":4,"124":26,"125":8,"127":17}}],["iff",{"2":{"86":2,"100":1,"119":1,"124":2}}],["if",{"2":{"1":3,"3":4,"8":3,"21":1,"22":10,"25":9,"27":9,"29":2,"30":2,"35":9,"36":8,"38":4,"40":1,"49":1,"51":2,"54":2,"73":1,"74":1,"86":65,"98":2,"99":2,"104":1,"106":4,"109":4,"113":4,"117":2,"118":2,"124":12,"127":14}}],["init",{"2":{"113":1}}],["initial",{"2":{"89":1}}],["initializes",{"2":{"36":1,"86":1}}],["inner",{"2":{"104":1,"127":1}}],["inf",{"2":{"127":1}}],["info",{"2":{"125":2,"127":6}}],["information",{"2":{"73":1,"86":1,"104":1,"124":1,"127":1}}],["infrastructure",{"2":{"18":1}}],["involves",{"2":{"87":1}}],["involving",{"2":{"86":1,"119":1}}],["invalid",{"2":{"33":1,"35":1,"86":3,"124":1}}],["investigated",{"2":{"31":1}}],["input",{"2":{"31":1,"36":3,"86":3}}],["inputs",{"2":{"19":1,"35":1,"86":1}}],["instead",{"2":{"86":3,"102":2,"109":1,"124":3,"125":1,"127":1}}],["instructions",{"2":{"70":1}}],["installed",{"2":{"73":1,"123":1}}],["install",{"2":{"73":1}}],["installing",{"2":{"70":1}}],["installation",{"0":{"70":1}}],["instantiation",{"2":{"40":9,"86":9}}],["instances",{"2":{"73":1}}],["instance",{"2":{"19":1,"31":4,"51":2,"86":3,"109":1,"124":1,"127":2}}],["insertion",{"2":{"16":1,"86":1,"124":1,"125":1}}],["insert",{"2":{"16":1,"86":1,"124":1,"127":3}}],["independent",{"2":{"127":1}}],["independently",{"2":{"127":1}}],["indexed",{"2":{"3":2,"86":2}}],["index",{"2":{"3":3,"49":2,"86":5,"127":1}}],["industry",{"2":{"87":1}}],["indice",{"2":{"127":1}}],["indices",{"2":{"127":6}}],["indicate",{"2":{"127":2}}],["indicates",{"2":{"31":1,"35":2,"86":2,"124":2}}],["individuals",{"2":{"104":1}}],["indispensable",{"2":{"32":1}}],["ind",{"2":{"16":1,"86":1,"124":1,"127":2}}],["inc",{"2":{"127":6}}],["increment",{"2":{"127":3}}],["incremental",{"2":{"125":1}}],["increase",{"2":{"16":1,"86":1,"124":1}}],["increasing",{"2":{"1":10,"86":10}}],["inclusive",{"2":{"86":3,"106":3}}],["included",{"2":{"86":1}}],["include",{"2":{"33":1,"87":1}}],["includes",{"2":{"5":1,"54":1,"86":3,"100":1,"119":1,"124":2}}],["including",{"0":{"36":1},"2":{"19":1,"33":1}}],["incorporation",{"2":{"33":1,"34":1}}],["incsert",{"2":{"16":2,"86":1,"124":1}}],["introductory",{"2":{"75":1}}],["introduction",{"0":{"52":1,"107":1},"1":{"108":1},"2":{"107":1}}],["introduce",{"2":{"66":1,"69":1,"81":1,"127":1}}],["into",{"0":{"79":1},"1":{"80":1,"81":1,"82":1},"2":{"21":1,"31":1,"41":1,"56":1,"86":6,"91":1,"102":1,"104":1,"106":1,"109":1,"124":3,"127":1}}],["intend",{"2":{"127":1}}],["intentionally",{"2":{"42":1}}],["intentional",{"2":{"42":1}}],["intention",{"0":{"42":1,"43":1},"1":{"43":1,"44":1,"45":1,"46":1},"2":{"41":1,"42":2,"43":1,"44":2}}],["intensional",{"2":{"33":1,"46":1,"86":1}}],["intension",{"2":{"33":1,"43":1,"44":3,"46":2,"86":2}}],["integer",{"2":{"31":3,"38":1,"80":1,"86":1,"87":1}}],["integrating",{"2":{"34":1}}],["integration",{"0":{"0":1,"2":1,"32":1,"37":1,"39":1,"48":1,"50":1,"53":1},"1":{"1":1,"3":1,"33":1,"34":1,"35":1,"36":1,"38":1,"40":1,"49":1,"51":1,"54":1},"2":{"33":3}}],["integrates",{"2":{"19":1}}],["integrate",{"2":{"5":1}}],["interfacing",{"0":{"122":1}}],["interfaced",{"2":{"121":1}}],["interfaces",{"2":{"73":1}}],["interface",{"0":{"111":1},"2":{"5":3,"8":2,"21":1,"42":1,"44":1,"73":2,"86":4,"87":3,"111":1,"122":1,"124":1,"125":1}}],["interpretable",{"2":{"86":1,"106":1,"124":1}}],["interpreted",{"2":{"51":2,"86":2}}],["interdiction",{"2":{"31":2,"127":2}}],["interval",{"2":{"21":1,"22":2,"24":6,"25":2,"26":3,"27":2,"30":1,"86":8,"124":1}}],["intervals",{"2":{"19":2,"21":2,"22":5,"24":5,"25":4,"26":2,"27":4,"28":2,"30":2,"86":11,"124":2}}],["intersect",{"2":{"19":1,"24":2,"26":1,"86":2,"124":1}}],["intersecting",{"2":{"19":1}}],["intersections",{"2":{"24":2,"26":1,"86":2,"124":1}}],["intersection",{"2":{"6":1,"36":1,"86":1,"124":1}}],["internally",{"2":{"86":1,"102":1}}],["internals",{"2":{"19":1,"29":1,"86":1}}],["internal",{"2":{"8":1,"21":1,"31":2,"86":4,"106":1,"124":1,"127":4}}],["interacting",{"2":{"33":1,"106":1}}],["interact",{"2":{"5":1}}],["interoperability",{"2":{"4":1,"5":1}}],["int",{"2":{"1":8,"3":1,"22":2,"25":2,"27":2,"29":1,"31":11,"36":1,"38":9,"46":1,"49":1,"51":2,"74":1,"86":35,"102":8,"113":2,"124":4,"125":6,"127":30}}],["in",{"0":{"0":1,"2":1,"20":1,"32":1,"34":1,"37":1,"39":1,"43":1,"48":1,"50":1,"53":1},"1":{"1":1,"3":1,"33":1,"34":1,"35":1,"36":1,"38":1,"40":1,"49":1,"51":1,"54":1},"2":{"1":6,"3":14,"4":1,"5":1,"6":1,"8":2,"10":1,"14":1,"16":1,"20":1,"21":4,"22":6,"24":3,"25":8,"26":5,"27":9,"29":2,"30":1,"31":9,"32":2,"33":3,"34":1,"35":4,"36":7,"38":24,"40":4,"41":1,"42":2,"43":1,"44":3,"46":1,"47":1,"49":6,"54":18,"65":1,"73":1,"74":7,"75":1,"82":1,"85":1,"86":131,"87":7,"89":3,"98":2,"102":2,"103":1,"104":3,"106":7,"113":2,"115":1,"117":1,"119":1,"123":1,"124":29,"125":16,"127":16}}],["df",{"2":{"104":2,"113":24}}],["ds",{"2":{"104":2}}],["date",{"2":{"31":1}}],["datatype",{"2":{"127":1}}],["dataframe",{"2":{"104":1,"113":2}}],["data",{"2":{"5":1,"86":2,"119":2,"127":1}}],["d₂",{"2":{"24":2,"26":2,"86":2,"124":2}}],["d₁",{"2":{"24":2,"26":2,"86":2,"124":2}}],["draw",{"2":{"22":2,"25":1,"27":1,"30":1,"86":1,"127":5}}],["d5",{"2":{"21":1,"24":1,"26":1,"86":1,"124":1}}],["d4",{"2":{"21":1,"24":1,"26":1,"86":1,"124":1}}],["d3",{"2":{"21":1,"24":1,"26":1,"86":1,"124":1}}],["d2",{"2":{"21":1,"24":1,"26":1,"86":1,"124":1}}],["dynamic",{"2":{"19":3,"21":1,"24":1,"31":1,"86":3,"119":1,"124":1,"127":11}}],["dom",{"2":{"86":8,"104":2,"113":4,"124":4}}],["domain",{"2":{"19":10,"20":1,"21":19,"22":1,"24":12,"25":1,"26":15,"27":1,"29":1,"30":9,"31":1,"38":1,"74":1,"86":46,"87":1,"104":3,"109":4,"124":32,"127":20}}],["domains",{"0":{"18":1},"1":{"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1},"2":{"18":2,"19":8,"20":1,"21":4,"22":3,"24":9,"25":2,"26":7,"27":2,"28":2,"29":6,"30":1,"31":1,"66":1,"86":30,"104":2,"113":11,"124":23,"127":3}}],["download",{"2":{"73":1}}],["do",{"2":{"54":4,"86":6,"119":1,"124":1}}],["doesn",{"2":{"35":1,"36":2,"86":3}}],["does",{"2":{"35":1,"36":3,"54":2,"86":9,"125":1}}],["documentation",{"0":{"46":1},"2":{"31":1,"73":1,"101":1,"104":1,"120":1,"121":1,"123":1,"125":1,"127":1}}],["documentervitepress",{"0":{"45":1}}],["documenter",{"2":{"8":1,"10":3,"98":1,"99":1,"100":1,"102":1,"103":1,"106":1}}],["docstring",{"2":{"8":2,"10":6,"98":2,"99":2,"100":2,"102":2,"103":2,"106":2,"125":26,"127":29}}],["d",{"2":{"16":1,"21":14,"22":29,"24":7,"25":23,"26":9,"27":26,"28":1,"30":12,"51":4,"86":54,"104":2,"113":2,"124":22,"127":9}}],["due",{"2":{"31":1,"73":1}}],["during",{"2":{"12":1,"86":1,"106":2}}],["duplication",{"2":{"5":1}}],["diff",{"2":{"86":4,"98":2,"99":2}}],["differs",{"0":{"67":1}}],["difference",{"2":{"14":2,"21":1,"24":1,"26":1,"86":12,"98":3,"99":3,"117":2,"118":2,"124":2}}],["different",{"2":{"1":8,"5":1,"6":1,"19":1,"31":1,"35":5,"36":8,"42":1,"43":6,"44":3,"45":2,"46":6,"73":1,"74":1,"86":29,"88":1,"119":3,"124":4,"127":1}}],["digits",{"2":{"74":2}}],["dive",{"0":{"79":1},"1":{"80":1,"81":1,"82":1},"2":{"56":1}}],["directions",{"0":{"63":1},"2":{"86":1,"119":1}}],["directed",{"2":{"51":1,"86":1}}],["directly",{"2":{"5":1,"33":1,"42":1,"44":1,"86":1}}],["dispatch",{"2":{"86":1,"104":1,"119":1,"127":2}}],["displays",{"2":{"31":1}}],["display",{"2":{"31":13}}],["discuss",{"2":{"57":1,"72":1,"85":1}}],["discreteset",{"2":{"125":3}}],["discretedomain",{"2":{"19":1,"21":1,"22":3,"24":1,"25":3,"26":4,"27":3,"30":1,"86":7,"113":1,"124":2}}],["discrete",{"0":{"26":1},"1":{"27":1},"2":{"18":1,"19":2,"21":1,"24":1,"26":4,"86":5,"104":1,"124":4,"127":1}}],["distributed",{"2":{"127":1}}],["distdifferent",{"2":{"44":1,"125":2}}],["dist",{"2":{"42":1,"43":6,"44":3,"45":2,"46":5,"86":5,"127":1}}],["distinct",{"2":{"38":2,"74":2,"86":2}}],["distinguishes",{"2":{"19":1}}],["distances",{"2":{"31":4,"43":2,"46":1,"86":1}}],["distance",{"2":{"21":2,"24":1,"26":1,"31":1,"46":3,"86":8,"103":1,"124":5,"127":1}}],["diagram",{"2":{"8":1,"51":4,"86":5,"124":1}}],["diagrams",{"2":{"8":2,"86":1}}],["dictionaries",{"0":{"16":1},"1":{"17":1},"2":{"16":1}}],["dictionaryview",{"2":{"127":1}}],["dictionary",{"2":{"6":1,"16":1,"31":3,"33":2,"35":1,"36":14,"86":18,"119":2,"124":8,"127":6}}],["dict",{"2":{"6":3,"36":8,"51":4,"86":12,"124":8}}],["dict=usual",{"2":{"6":1,"36":1,"86":1,"124":1}}],["dimension",{"2":{"125":6,"127":1}}],["dimensions",{"2":{"30":1,"86":1}}],["dimparameterdomain",{"2":{"30":1,"86":1}}],["dim",{"2":{"6":1,"54":2,"86":3,"113":3,"125":12,"127":4}}],["dim=2",{"2":{"3":2,"86":2}}],["dim=1",{"2":{"3":2,"86":2}}],["deepcopy",{"2":{"127":1}}],["deeper",{"2":{"56":1}}],["debugging",{"2":{"127":1}}],["debinarize",{"2":{"86":1,"109":1,"124":1}}],["denotes",{"2":{"86":2,"98":2}}],["density",{"2":{"29":1,"86":1,"124":1}}],["derived",{"2":{"86":1}}],["delta",{"2":{"127":6}}],["delegates",{"2":{"86":1,"119":1}}],["delete",{"2":{"19":1,"21":1,"27":3,"35":1,"86":5,"124":4,"127":13}}],["deletion",{"2":{"19":1}}],["delineation",{"2":{"86":2}}],["dedicated",{"2":{"43":1}}],["descent",{"0":{"113":1},"2":{"104":1}}],["descriptions",{"2":{"36":4,"86":4,"124":4}}],["description",{"2":{"36":2,"43":1,"86":3,"124":2,"125":36,"127":10}}],["describe",{"2":{"36":2,"86":2,"90":1,"93":1,"96":1,"113":1,"115":1,"124":2,"127":3}}],["describes",{"2":{"31":1}}],["design",{"2":{"5":1}}],["designed",{"2":{"4":1,"32":1,"42":1,"44":1}}],["depend",{"2":{"86":1,"119":1}}],["depending",{"2":{"73":1}}],["depends",{"2":{"21":1,"86":1,"124":1,"127":1}}],["dependencies",{"2":{"5":1}}],["determined",{"2":{"127":1}}],["determine",{"2":{"35":1,"86":2,"124":1}}],["determining",{"2":{"19":1,"33":1}}],["deterministic",{"2":{"8":1,"86":1,"124":1}}],["details",{"2":{"8":1,"10":3,"98":1,"99":1,"100":1,"102":1,"103":1,"106":1}}],["decrement",{"2":{"127":1}}],["decrease",{"2":{"127":2}}],["decreasing",{"2":{"1":8,"86":8}}],["decay",{"2":{"127":3}}],["declare",{"2":{"86":1}}],["decisions",{"2":{"88":1}}],["decision",{"2":{"8":3,"51":1,"86":3,"124":1}}],["developers",{"2":{"32":1}}],["developing",{"2":{"5":1}}],["development",{"2":{"4":1,"5":3}}],["define",{"2":{"33":1,"36":3,"42":1,"43":2,"47":1,"65":1,"74":1,"86":6,"124":2}}],["defines",{"2":{"24":1,"26":1,"44":1,"86":2,"106":1,"124":1}}],["defined",{"0":{"51":1},"2":{"19":2,"21":1,"26":1,"33":1,"36":1,"38":1,"42":3,"46":1,"47":3,"74":2,"86":9,"98":1,"104":2,"117":1,"124":2,"125":2,"127":1}}],["defining",{"0":{"18":1,"43":1},"1":{"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1},"2":{"19":1,"20":1,"33":2,"36":1,"42":1,"44":1,"86":1,"124":1}}],["definitions",{"2":{"19":1}}],["definition",{"0":{"0":1,"2":1,"32":1,"37":1,"39":1,"48":1,"50":1,"53":1},"1":{"1":1,"3":1,"33":1,"34":1,"35":1,"36":1,"38":1,"40":1,"49":1,"51":1,"54":1},"2":{"18":1,"19":1,"32":1,"33":1,"34":1,"36":1,"86":1}}],["default",{"2":{"6":3,"22":1,"29":1,"31":10,"36":8,"38":1,"86":17,"104":4,"109":1,"111":1,"124":10,"127":2}}],["defaults",{"2":{"1":1,"6":1,"16":1,"36":6,"86":8,"104":2,"124":2}}],["auto",{"2":{"113":1}}],["automated",{"2":{"36":1,"86":1}}],["automatic",{"2":{"29":1,"86":1,"124":1}}],["automatically",{"2":{"29":1,"86":1}}],["automaton",{"2":{"8":6,"30":4,"51":7,"86":15,"124":3}}],["automata",{"2":{"8":2,"19":1,"86":1}}],["among",{"2":{"104":1,"127":1}}],["amount",{"2":{"31":1}}],["affects",{"2":{"97":1,"116":1}}],["affect",{"2":{"86":1,"124":1}}],["aggragation",{"2":{"90":1}}],["aggregate",{"2":{"86":1,"91":1}}],["aggregations",{"0":{"91":1},"2":{"86":1,"92":1,"124":1}}],["aggregation",{"0":{"90":1},"1":{"91":1,"92":1},"2":{"86":4,"92":1,"124":4}}],["ag",{"2":{"86":2,"91":2}}],["against",{"2":{"40":1,"86":2,"119":1}}],["again",{"2":{"31":1}}],["apixcspjumpmoi",{"2":{"44":1}}],["apis",{"0":{"44":1}}],["api",{"0":{"43":1,"86":1,"124":1},"2":{"42":1,"44":1}}],["appropriate",{"2":{"86":1,"119":1}}],["approach",{"2":{"5":1,"33":1,"74":1,"88":2}}],["appear",{"2":{"38":3,"86":3}}],["applies",{"2":{"86":1,"102":1,"125":1}}],["applied",{"2":{"35":1,"36":1,"59":1,"74":1,"86":3,"119":1,"124":2,"125":1,"127":2}}],["applicability",{"2":{"33":1}}],["applications",{"0":{"59":1},"2":{"18":1,"20":1}}],["application",{"2":{"5":2,"32":1,"33":1,"34":1,"86":1}}],["applying",{"0":{"58":1},"1":{"59":1,"60":1}}],["apply",{"2":{"33":1,"35":5,"36":3,"86":7,"119":2,"124":5}}],["about",{"0":{"105":1},"2":{"52":1,"87":1,"105":1,"126":1,"127":1}}],["absolute",{"2":{"86":2,"98":1,"99":1}}],["abs",{"2":{"36":1,"43":2,"44":2,"86":5,"98":2,"99":2,"124":1}}],["abstractstring",{"2":{"127":2}}],["abstractstring=",{"2":{"86":1,"124":1}}],["abstractstate",{"2":{"127":1}}],["abstractsolver",{"2":{"127":70}}],["abstractscalarset",{"2":{"125":1}}],["abstractscalarfunction",{"2":{"125":1}}],["abstractoptimizer",{"2":{"86":2,"104":2,"111":2,"113":1,"124":1,"125":1}}],["abstractmatrix",{"2":{"31":4}}],["abstractmultivalueddecisiondiagram",{"2":{"8":3,"86":3,"124":1}}],["abstractrange",{"2":{"21":1,"24":1,"26":2,"86":2,"124":2}}],["abstracting",{"2":{"20":1}}],["abstractdomain",{"2":{"19":3,"21":5,"22":6,"24":4,"25":5,"26":4,"27":5,"28":1,"30":10,"86":25,"124":10,"127":6}}],["abstractdictionary",{"2":{"16":1,"86":1,"124":1}}],["abstractdict",{"2":{"16":1,"86":1,"124":1}}],["abstractautomaton`",{"2":{"51":1,"86":1}}],["abstractautomaton",{"2":{"8":3,"30":1,"51":2,"86":6,"124":1}}],["abstract",{"2":{"4":1,"5":2,"8":2,"19":1,"21":1,"24":1,"26":1,"86":6,"104":2,"111":1,"124":3,"127":2}}],["abstractvectorset",{"2":{"125":15}}],["abstractvector",{"2":{"3":4,"40":2,"49":1,"54":5,"86":31,"102":1,"117":11,"118":6,"127":1}}],["ability",{"2":{"33":1}}],["avoid",{"2":{"35":1,"86":2,"124":1,"127":1}}],["avoiding",{"2":{"33":1}}],["available",{"2":{"19":1,"31":2,"34":1,"36":1,"42":1,"44":1,"73":2,"86":2,"87":1,"119":1,"124":1,"127":1}}],["always",{"2":{"125":1}}],["alwaystrue",{"2":{"125":2}}],["alternative",{"2":{"106":1}}],["although",{"2":{"73":1}}],["algorithm",{"2":{"86":4,"89":2,"104":3,"124":4}}],["algorithms",{"2":{"81":1,"89":1}}],["along",{"2":{"73":1}}],["already",{"2":{"36":1,"74":1,"86":3,"98":1,"104":1,"117":1,"127":1}}],["also",{"2":{"19":1,"38":3,"74":1,"86":5,"100":1,"119":1,"124":2}}],["allequalparam",{"2":{"125":2}}],["allequal",{"2":{"125":2}}],["allocation",{"2":{"88":1}}],["allocations",{"2":{"86":17,"117":10,"118":6}}],["allow",{"2":{"47":1}}],["allows",{"2":{"33":2}}],["allowing",{"2":{"19":1,"86":3,"119":1}}],["alldifferent",{"2":{"74":5,"125":2}}],["all",{"2":{"1":24,"6":1,"14":1,"19":1,"24":1,"31":1,"35":4,"36":9,"38":1,"47":1,"73":1,"74":2,"86":45,"87":1,"89":1,"100":1,"102":1,"119":1,"123":2,"124":10,"125":7,"127":4}}],["advantages",{"2":{"72":1}}],["advanced",{"0":{"34":1,"55":1},"1":{"56":1,"57":1},"2":{"19":1,"20":1,"33":1}}],["adjusted",{"2":{"29":1,"86":1}}],["added",{"2":{"43":1,"44":1,"125":1}}],["adds",{"2":{"36":4,"86":4}}],["adding",{"2":{"36":2,"86":2,"124":2}}],["additionally",{"2":{"21":1,"86":1,"124":1}}],["addition",{"2":{"19":1,"33":1}}],["add",{"2":{"19":1,"21":1,"26":2,"35":1,"42":1,"43":1,"73":1,"74":4,"86":4,"124":3,"125":6,"127":20}}],["attribution",{"2":{"127":1}}],["attributed",{"2":{"127":6}}],["attribute",{"2":{"127":2}}],["attached",{"2":{"127":1}}],["atoms",{"2":{"31":1}}],["at",{"2":{"8":1,"19":1,"31":1,"33":1,"36":1,"38":8,"54":2,"73":1,"86":15,"104":2,"106":2,"109":1,"124":3,"127":1}}],["accurate",{"2":{"113":2}}],["according",{"2":{"86":1,"119":1}}],["access",{"2":{"21":1,"86":5,"106":1,"124":4,"127":20}}],["accessing",{"2":{"19":1}}],["acceptable",{"2":{"86":2}}],["accepted",{"2":{"35":2,"51":2,"86":4,"124":2}}],["accepts",{"2":{"8":3,"30":1,"31":5,"86":3,"124":1}}],["accept",{"2":{"8":6,"30":3,"86":7,"124":1}}],["action",{"2":{"86":2,"124":2}}],["actively",{"2":{"5":1}}],["actual",{"2":{"86":1,"124":1}}],["across",{"2":{"5":2}}],["assuming",{"2":{"125":1}}],["assert",{"2":{"86":1,"106":1}}],["associated",{"2":{"31":1,"74":1,"106":1}}],["assign",{"2":{"31":1,"86":1,"124":1,"127":1}}],["assignments",{"2":{"33":2,"35":1,"86":1,"124":1}}],["assignment",{"2":{"31":1,"35":1,"86":1,"124":1}}],["aspect",{"2":{"5":1}}],["as",{"2":{"4":1,"5":1,"8":1,"12":1,"18":1,"19":1,"24":1,"26":3,"31":3,"33":2,"35":1,"36":9,"38":3,"42":3,"44":2,"46":1,"51":2,"66":1,"73":1,"74":1,"86":27,"87":1,"88":2,"98":1,"102":2,"104":1,"106":1,"117":1,"119":1,"122":1,"123":1,"124":7,"125":2,"127":6}}],["a",{"0":{"106":1},"2":{"1":3,"3":22,"4":1,"5":6,"8":12,"16":2,"18":2,"19":2,"20":2,"21":9,"22":19,"24":8,"25":17,"26":8,"27":17,"29":6,"30":15,"31":28,"32":1,"33":7,"34":1,"35":18,"36":21,"38":13,"40":8,"42":10,"43":2,"44":3,"46":5,"47":4,"49":8,"51":29,"54":8,"60":1,"73":2,"74":12,"86":277,"87":7,"88":4,"89":7,"91":2,"94":2,"102":8,"103":2,"104":23,"106":16,"108":2,"109":7,"111":1,"115":1,"119":10,"121":1,"123":3,"124":75,"125":17,"127":51}}],["angles",{"2":{"88":1}}],["anonymous",{"2":{"86":1,"102":1}}],["another",{"2":{"3":2,"86":2,"87":1}}],["annealing",{"2":{"81":1}}],["analyze",{"2":{"78":1,"88":1}}],["analyzing",{"0":{"76":1},"1":{"77":1,"78":1}}],["analysis",{"0":{"78":1,"85":1},"2":{"85":1,"88":1}}],["any",{"0":{"106":1},"2":{"10":1,"21":2,"22":1,"25":1,"27":1,"31":1,"35":2,"46":1,"54":6,"86":18,"111":1,"124":7,"125":1,"127":1}}],["an",{"0":{"43":1},"2":{"1":3,"4":1,"8":2,"19":1,"21":2,"24":6,"25":1,"26":3,"27":1,"29":1,"31":3,"32":1,"33":1,"35":4,"36":6,"38":1,"43":1,"44":1,"46":1,"51":3,"60":1,"74":1,"75":2,"86":57,"89":3,"102":3,"104":7,"106":5,"111":1,"115":1,"118":1,"119":1,"122":1,"124":19,"125":2,"127":11}}],["and",{"0":{"0":1,"2":1,"5":1,"18":1,"19":1,"32":1,"33":1,"36":1,"37":1,"38":1,"39":1,"48":1,"50":1,"53":1,"54":1,"56":1,"57":1,"59":1,"61":1,"66":1,"70":1,"71":1,"76":1,"78":1,"83":1},"1":{"1":1,"3":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"33":1,"34":1,"35":1,"36":1,"38":1,"40":1,"49":1,"51":1,"54":1,"62":1,"63":1,"72":1,"73":1,"74":1,"77":1,"78":1,"84":1,"85":1},"2":{"3":2,"4":3,"5":14,"6":1,"8":1,"10":1,"12":1,"14":1,"18":2,"19":11,"20":4,"21":2,"24":2,"26":1,"29":2,"30":2,"31":13,"32":3,"33":14,"34":2,"35":10,"36":10,"38":1,"41":1,"42":1,"46":3,"47":1,"49":2,"51":1,"56":1,"57":1,"59":1,"60":1,"62":1,"63":1,"65":1,"66":1,"67":1,"69":1,"70":1,"72":2,"73":2,"74":4,"75":2,"77":2,"78":1,"81":1,"82":1,"84":1,"85":1,"86":66,"87":3,"88":8,"89":3,"97":1,"98":1,"99":1,"102":1,"104":10,"106":3,"108":1,"109":1,"116":1,"117":5,"118":1,"119":3,"121":1,"123":1,"124":24,"125":2,"127":11}}],["arrange",{"2":{"123":3}}],["arrangement",{"2":{"104":1}}],["ar",{"2":{"86":2,"94":2}}],["arithmetic",{"0":{"93":1,"94":1},"1":{"94":1,"95":1},"2":{"86":5,"93":1,"95":2,"124":5}}],["arxiv",{"2":{"36":1,"86":1,"124":1}}],["arbitrary",{"2":{"26":1,"35":1,"86":2}}],["arbitrarydomain",{"2":{"26":1,"86":1}}],["argmax",{"2":{"127":3}}],["argument",{"2":{"31":5,"36":7,"86":7,"125":1}}],["arguments",{"2":{"1":3,"3":4,"6":1,"21":1,"24":1,"29":1,"31":1,"35":9,"36":11,"38":4,"40":1,"46":1,"49":1,"51":2,"54":2,"86":43,"124":15,"125":13,"127":8}}],["args",{"2":{"21":4,"29":1,"33":1,"35":7,"36":4,"86":13,"104":3,"111":1,"124":10}}],["areas",{"2":{"63":1}}],["are",{"2":{"1":10,"5":2,"19":1,"24":1,"26":1,"29":1,"31":5,"33":2,"36":1,"41":1,"42":4,"43":2,"46":2,"47":4,"54":2,"74":1,"86":42,"87":2,"88":2,"92":1,"95":1,"100":1,"106":2,"117":10,"118":5,"119":1,"124":6,"125":4,"127":2}}],["jacop",{"2":{"87":1}}],["j+1",{"2":{"74":1}}],["j",{"2":{"74":1}}],["join",{"2":{"62":1}}],["joining",{"0":{"62":1}}],["jc",{"0":{"43":1},"2":{"42":1,"44":2}}],["jump",{"2":{"31":20,"42":1,"44":3,"73":3,"74":2,"87":1,"125":6,"127":1}}],["juliajump",{"2":{"125":1}}],["juliajulia>",{"2":{"123":1}}],["juliapost",{"2":{"127":1}}],["juliapredicate",{"2":{"125":1}}],["juliapredict",{"2":{"104":1}}],["juliapreliminaries",{"2":{"104":1}}],["juliaparameter",{"2":{"104":1}}],["juliaparams",{"2":{"35":1,"86":1,"124":1}}],["juliapairvarsparameterdomain",{"2":{"30":1,"86":1}}],["juliaqubogradientoptimizer",{"2":{"104":1}}],["juliaqubo",{"2":{"86":2,"104":1,"108":2,"124":1}}],["juliaqap",{"2":{"31":1}}],["juliaweights",{"2":{"86":3,"124":3}}],["juliatrain",{"2":{"86":1,"104":2,"111":1,"124":1}}],["juliatransformation",{"2":{"86":1,"119":1,"124":1}}],["juliatr",{"2":{"86":19,"117":11,"118":6}}],["juliato",{"2":{"21":1,"86":1,"124":1}}],["juliaremote",{"2":{"127":2}}],["juliaregularization",{"2":{"86":1,"124":1}}],["juliareduce",{"2":{"86":1,"102":1}}],["juliarangedomain",{"2":{"26":1,"86":1,"124":1}}],["juliahamming",{"2":{"86":1,"103":1,"124":1}}],["juliafunctions",{"2":{"86":1,"106":1}}],["juliafor",{"2":{"74":2}}],["juliafake",{"2":{"30":1,"86":1}}],["juliafakeautomaton",{"2":{"30":1,"86":1}}],["juliausing",{"2":{"73":2}}],["juliausual",{"2":{"35":1,"36":2,"86":3,"124":2}}],["juliaup",{"2":{"73":1}}],["juliano",{"2":{"104":1}}],["julianbits",{"2":{"86":2,"106":1,"124":1}}],["julian",{"2":{"31":1}}],["juliagolomb",{"2":{"31":1}}],["juliageneralstate",{"2":{"127":1}}],["juliagenerate",{"2":{"30":1,"86":5,"104":1,"106":2,"124":1}}],["juliaget",{"2":{"21":1,"86":1,"124":1,"127":12}}],["juliastop",{"2":{"127":1}}],["juliastatus",{"2":{"127":1}}],["juliastruct",{"2":{"86":1,"104":1,"113":1,"124":1}}],["juliaspecialize",{"2":{"127":2}}],["juliasolve",{"2":{"127":2}}],["juliasolution",{"2":{"127":1}}],["juliascalarfunction",{"2":{"125":1}}],["juliascheduling",{"2":{"31":1}}],["juliasub",{"2":{"104":1}}],["juliasudoku",{"2":{"31":1}}],["juliasudokuinstance",{"2":{"31":2}}],["juliasymbols",{"2":{"86":1,"124":1}}],["juliasymbol",{"2":{"86":1,"106":1}}],["juliasymmetries",{"2":{"35":1,"86":1,"124":1}}],["juliashow",{"2":{"86":2,"106":1,"124":1}}],["juliashrink",{"2":{"35":1,"86":1}}],["juliaselected",{"2":{"86":1,"106":1}}],["juliasetdomain",{"2":{"26":1,"86":1}}],["juliavalue",{"2":{"74":1}}],["juliavalsparameterdomain",{"2":{"30":1,"86":1}}],["juliavalparameterdomain",{"2":{"30":1,"86":1}}],["juliavariable",{"2":{"127":3}}],["juliavar",{"2":{"22":1,"25":1,"27":1,"127":1}}],["juliao",{"2":{"127":1}}],["juliaobjective",{"2":{"127":4}}],["juliaoptions",{"2":{"127":1}}],["juliaoptimizer",{"2":{"125":2}}],["juliaoptimize",{"2":{"74":1,"104":1}}],["juliaopparameterdomain",{"2":{"30":1,"86":1}}],["juliaoversample",{"2":{"12":1,"86":1,"124":1}}],["julialoss",{"2":{"104":1}}],["julialeadsolver",{"2":{"127":1}}],["julialearn",{"2":{"86":1,"124":1}}],["julialength",{"2":{"25":1,"27":1,"86":1,"106":1,"127":5}}],["julialazy",{"2":{"86":2,"102":2,"124":2}}],["julialayers",{"2":{"86":1}}],["julialayer",{"2":{"86":1,"106":1}}],["julialanguageparameterdomain",{"2":{"30":1,"86":1}}],["juliais",{"2":{"86":2,"106":1,"109":1,"124":1,"127":2}}],["juliaicnlocalsearchoptimizer",{"2":{"104":1}}],["juliaicngeneticoptimizer",{"2":{"104":1}}],["juliaicnconfig",{"2":{"104":1}}],["juliaicn",{"2":{"86":1,"104":1,"124":1}}],["juliaidparameterdomain",{"2":{"30":1,"86":1}}],["juliaintersect",{"2":{"24":2,"26":1,"86":2,"124":1}}],["juliaintervals",{"2":{"24":1,"86":1}}],["juliaincsert",{"2":{"16":1,"86":1,"124":1}}],["juliabinarize",{"2":{"86":1,"109":1,"124":1}}],["juliaboolparameterdomain",{"2":{"30":1,"86":1}}],["juliabase",{"2":{"22":13,"24":1,"25":12,"26":1,"27":13,"28":2,"30":4,"31":4,"86":18,"124":2,"125":2}}],["juliamodel",{"2":{"127":1}}],["juliamoi",{"2":{"125":11}}],["juliamoisumequalparam",{"2":{"125":1}}],["juliamoisequentialtasks",{"2":{"125":1}}],["juliamoipredicate",{"2":{"125":1}}],["juliamoiordered",{"2":{"125":1}}],["juliamoiminusequalparam",{"2":{"125":1}}],["juliamoilessthanparam",{"2":{"125":1}}],["juliamoierror",{"2":{"125":1}}],["juliamoieq",{"2":{"125":1}}],["juliamoidistdifferent",{"2":{"125":1}}],["juliamoialwaystrue",{"2":{"125":1}}],["juliamoiallequalparam",{"2":{"125":1}}],["juliamoiallequal",{"2":{"125":1}}],["juliamoialldifferent",{"2":{"125":1}}],["juliamts",{"2":{"127":1}}],["juliamutually",{"2":{"104":1}}],["juliamutable",{"2":{"31":1}}],["juliaminkowski",{"2":{"86":1,"103":1,"124":1}}],["juliamincut",{"2":{"31":1}}],["juliam",{"2":{"74":1}}],["juliamax",{"2":{"127":1}}],["juliamainsolver",{"2":{"127":1}}],["juliamap",{"2":{"86":1,"102":1}}],["juliamanhattan",{"2":{"86":1,"103":1,"124":1}}],["juliamake",{"2":{"35":1,"86":2,"104":3,"119":1}}],["juliamagic",{"2":{"31":1}}],["juliamerge",{"2":{"24":1,"26":1,"86":1,"124":1}}],["juliamdd",{"2":{"8":1,"86":1,"124":1}}],["juliax",{"2":{"22":1,"25":1,"27":1,"127":1}}],["juliaxcsp",{"2":{"1":3,"3":4,"38":4,"40":1,"46":1,"49":1,"51":2,"54":2,"86":19}}],["juliad",{"2":{"127":1}}],["juliadraw",{"2":{"127":1}}],["juliadelete",{"2":{"127":2}}],["juliadebinarize",{"2":{"86":1,"109":1,"124":1}}],["juliadescribe",{"2":{"36":2,"86":2,"124":2,"127":1}}],["juliadist",{"2":{"127":1}}],["juliadiscreteset",{"2":{"125":1}}],["juliadiscretedomain",{"2":{"26":1,"86":1,"124":1}}],["juliadisplay",{"2":{"31":1}}],["juliadimparameterdomain",{"2":{"30":1,"86":1}}],["juliad1",{"2":{"21":1,"24":1,"26":1,"86":1,"124":1}}],["juliadomain",{"2":{"21":6,"24":6,"26":6,"86":6,"104":1,"124":6,"127":1}}],["juliaempty",{"2":{"127":2}}],["juliaemptydomain",{"2":{"21":1,"86":1}}],["juliae",{"2":{"35":1,"86":1}}],["juliaerror",{"2":{"35":1,"86":1,"124":1,"125":1}}],["juliaexclu",{"2":{"86":1,"106":1}}],["juliaexplore",{"2":{"29":1,"86":2,"124":2}}],["juliaexploresettings",{"2":{"29":1,"86":1,"124":1}}],["juliaextract",{"2":{"6":3,"36":3,"86":3,"124":3}}],["juliaδ",{"2":{"14":1,"86":1,"104":1,"124":1}}],["juliaas",{"2":{"86":2,"102":2}}],["juliaaggregation",{"2":{"86":1,"92":1,"124":1}}],["juliaag",{"2":{"86":2,"91":2}}],["juliaarithmetic",{"2":{"86":1,"95":1,"124":1}}],["juliaar",{"2":{"86":2,"94":2}}],["juliaargs",{"2":{"35":1,"86":1,"124":1}}],["juliaarbitrarydomain",{"2":{"26":1,"86":1}}],["juliaadd",{"2":{"26":1,"86":1,"124":1,"127":2}}],["juliaat",{"2":{"8":1,"86":1}}],["juliaaccept",{"2":{"8":1,"30":1,"86":1,"124":1}}],["juliaautomaton",{"2":{"8":1,"86":1,"124":1}}],["juliaabstractsolver",{"2":{"127":1}}],["juliaabstractoptimizer",{"2":{"86":1,"111":1}}],["juliaabstractdomain",{"2":{"21":1,"86":1,"124":1}}],["juliaabstractautomaton",{"2":{"8":1,"86":1}}],["juliaabstractmultivalueddecisiondiagram",{"2":{"8":1,"86":1}}],["juliacompose",{"2":{"86":2,"124":2}}],["juliacompositionalnetworks",{"2":{"104":2}}],["juliacomposition",{"2":{"86":3,"124":3}}],["juliacomparison",{"2":{"86":1,"100":1,"124":1}}],["juliacode",{"2":{"86":1,"124":1}}],["juliaco",{"2":{"86":9,"98":4,"99":3}}],["juliacontinuousdomain",{"2":{"24":1,"86":1,"124":1}}],["juliaconstriction",{"2":{"127":1}}],["juliaconstraint",{"0":{"62":1,"68":1},"1":{"69":1},"2":{"35":1,"63":1,"69":1,"75":1,"86":1,"124":1,"127":3}}],["juliaconstraintcommons",{"2":{"8":1,"30":1,"86":1}}],["juliaconstraints",{"0":{"18":1,"87":1},"1":{"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"88":1,"89":1},"2":{"5":3,"20":1,"32":1,"33":1,"34":1,"36":4,"86":4,"87":6,"124":4}}],["juliaconst",{"2":{"6":2,"43":1,"86":2,"104":2}}],["juliaconcept",{"2":{"1":7,"3":4,"35":5,"36":3,"38":9,"40":1,"44":1,"46":1,"49":1,"51":2,"54":4,"86":37,"124":3}}],["juliachemical",{"2":{"31":1}}],["juliac",{"2":{"1":3,"3":4,"38":4,"40":1,"45":2,"49":1,"51":2,"54":2,"86":18}}],["julia",{"0":{"0":1,"2":1,"20":1,"32":1,"37":1,"39":1,"48":1,"50":1,"53":1,"71":1,"72":1,"73":1,"74":1,"75":1},"1":{"1":1,"3":1,"33":1,"34":1,"35":1,"36":1,"38":1,"40":1,"49":1,"51":1,"54":1,"72":1,"73":1,"74":1},"2":{"4":2,"8":2,"18":1,"26":1,"29":1,"31":5,"33":2,"34":1,"36":2,"44":3,"72":1,"73":7,"74":5,"86":13,"87":8,"98":1,"104":1,"117":1,"119":1,"124":5,"125":14,"127":81}}],["jl",{"0":{"0":1,"2":1,"4":1,"18":1,"31":1,"32":1,"37":1,"39":1,"48":1,"50":1,"53":1,"101":1,"104":1,"107":1,"120":1,"123":1,"125":1,"127":1},"1":{"1":1,"3":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"33":1,"34":1,"35":1,"36":1,"38":1,"40":1,"49":1,"51":1,"54":1,"102":1,"103":1,"108":1},"2":{"4":1,"5":4,"18":1,"19":3,"20":2,"31":1,"32":1,"33":3,"34":3,"36":1,"42":1,"43":1,"44":1,"73":3,"86":1,"87":8,"101":1,"104":1,"106":1,"107":1,"120":1,"121":2,"123":1,"124":1,"125":1,"127":2}}]],"serializationVersion":2}';export{i as default}; diff --git a/dev/assets/chunks/@localSearchIndexroot.aRRNdGdD.js b/dev/assets/chunks/@localSearchIndexroot.aRRNdGdD.js deleted file mode 100644 index d82f66c..0000000 --- a/dev/assets/chunks/@localSearchIndexroot.aRRNdGdD.js +++ /dev/null @@ -1 +0,0 @@ -const i='{"documentCount":128,"nextId":128,"documentIds":{"0":"/dev/constraints/comparison_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","1":"/dev/constraints/comparison_constraints#Comparison-based-Constraints","2":"/dev/constraints/connection_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","3":"/dev/constraints/connection_constraints#Connection-Constraints","4":"/dev/constraints/constraint_commons#ConstraintCommons.jl","5":"/dev/constraints/constraint_commons#Key-Features-and-Functionalities","6":"/dev/constraints/constraint_commons#Parameters","7":"/dev/constraints/constraint_commons#Performances-–-TODO","8":"/dev/constraints/constraint_commons#Languages","9":"/dev/constraints/constraint_commons#Performances-–-TODO-2","10":"/dev/constraints/constraint_commons#Extensions","11":"/dev/constraints/constraint_commons#Performances-–-TODO-3","12":"/dev/constraints/constraint_commons#Sampling","13":"/dev/constraints/constraint_commons#Performances-–-TODO-4","14":"/dev/constraints/constraint_commons#Extrema","15":"/dev/constraints/constraint_commons#Performances-–-TODO-5","16":"/dev/constraints/constraint_commons#Dictionaries","17":"/dev/constraints/constraint_commons#Performances-–-TODO-6","18":"/dev/constraints/constraint_domains#ConstraintDomains.jl:-Defining-and-Exploring-Variable-Domains-within-JuliaConstraints","19":"/dev/constraints/constraint_domains#Key-Features-and-Functionalities","20":"/dev/constraints/constraint_domains#Empowering-Constraint-Programming-in-Julia","21":"/dev/constraints/constraint_domains#Commons","22":"/dev/constraints/constraint_domains#Extension-to-Base-module","23":"/dev/constraints/constraint_domains#Performances","24":"/dev/constraints/constraint_domains#Continuous","25":"/dev/constraints/constraint_domains#Extension-to-Base-module-2","26":"/dev/constraints/constraint_domains#Discrete","27":"/dev/constraints/constraint_domains#Extension-to-Base-module-3","28":"/dev/constraints/constraint_domains#General","29":"/dev/constraints/constraint_domains#Exploration","30":"/dev/constraints/constraint_domains#Parameters","31":"/dev/constraints/constraint_models#ConstraintModels.jl","32":"/dev/constraints/constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","33":"/dev/constraints/constraints#Key-Features-and-Functionalities","34":"/dev/constraints/constraints#Enabling-Advanced-Modeling-in-Constraint-Programming","35":"/dev/constraints/constraints#Basic-tools","36":"/dev/constraints/constraints#Usual-constraints-(based-on-and-including-XCSP3-core-categories)","37":"/dev/constraints/counting_summing_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","38":"/dev/constraints/counting_summing_constraints#Counting-and-Summing-Constraints","39":"/dev/constraints/elementary_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","40":"/dev/constraints/elementary_constraints#Elementary-Constraints","41":"/dev/constraints/generic_constraints#Generic-Constraints","42":"/dev/constraints/generic_constraints#Intention-Constraints","43":"/dev/constraints/generic_constraints#Defining-an-intention-constraint-in-JC-API","44":"/dev/constraints/generic_constraints#APIs","45":"/dev/constraints/generic_constraints#Test-for-DocumenterVitePress-Issue","46":"/dev/constraints/generic_constraints#Specific-documentation","47":"/dev/constraints/generic_constraints#Extension-Constraints","48":"/dev/constraints/graph_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","49":"/dev/constraints/graph_constraints#Constraints-on-Graphs","50":"/dev/constraints/intro#Introduction-to-basics-cosntraints-related-tools","51":"/dev/constraints/language_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","52":"/dev/constraints/language_constraints#Constraints-defined-from-Languages","53":"/dev/constraints/packing_scheduling_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","54":"/dev/constraints/packing_scheduling_constraints#Packing-and-Scheduling-Constraints","55":"/dev/cp/advanced#Advanced-Constraint-Programming-Techniques","56":"/dev/cp/advanced#Global-Constraints-and-Their-Uses","57":"/dev/cp/advanced#Search-Strategies-and-Optimization","58":"/dev/cp/applications#Applying-Optimization-Methods","59":"/dev/cp/applications#Case-Studies-and-Real-World-Applications","60":"/dev/cp/applications#From-Theory-to-Practice","61":"/dev/cp/contribution#Community-and-Contribution","62":"/dev/cp/contribution#Joining-the-JuliaConstraint-Community","63":"/dev/cp/contribution#Future-Directions","64":"/dev/cp/cp101#Constraint-Programming-101","65":"/dev/cp/cp101#What-is-Constraint-Programming?","66":"/dev/cp/cp101#Basic-Concepts-and-Terminology","67":"/dev/cp/cp101#How-CP-differs-from-other-optimization-techniques","68":"/dev/cp/ecosystem#Exploring-JuliaConstraint-Packages","69":"/dev/cp/ecosystem#Package-Overviews","70":"/dev/cp/ecosystem#Installation-and-Getting-Started-Guides","71":"/dev/cp/getting_started#Getting-Started-with-Julia-for-CP-and-Optimization","72":"/dev/cp/getting_started#Why-Julia?","73":"/dev/cp/getting_started#Setting-Up-Your-Julia-Environment","74":"/dev/cp/getting_started#Your-First-Julia-CP-Model","75":"/dev/cp/intro#Welcome-to-Julia-Constraints","76":"/dev/cp/models#Building-and-Analyzing-Models","77":"/dev/cp/models#Modeling-Best-Practices","78":"/dev/cp/models#Performance-Analysis-and-Improvement","79":"/dev/cp/opt#Dive-into-Optimization","80":"/dev/cp/opt#Understanding-Optimization","81":"/dev/cp/opt#Metaheuristics-Overview","82":"/dev/cp/opt#Mathematical-Programming-Basics","83":"/dev/cp/tuto_xp#Tutorials-and-Experiments","84":"/dev/cp/tuto_xp#Hands-On-Tutorials","85":"/dev/cp/tuto_xp#Experimental-Analysis","86":"/dev/full_api#Full-API","87":"/dev/index-old#JuliaConstraints","88":"/dev/index-old#Operational-Research-vs-Constraint-Programming","89":"/dev/index-old#Constraint-Based-Local-Search","90":"/dev/learning/aggregation#Aggregation-Layer","91":"/dev/learning/aggregation#List-of-aggregations","92":"/dev/learning/aggregation#Layer-generation","93":"/dev/learning/arithmetic#Arithmetic-Layer","94":"/dev/learning/arithmetic#List-of-arithmetic-operations","95":"/dev/learning/arithmetic#Layer-generation","96":"/dev/learning/comparison#Comparison-Layer","97":"/dev/learning/comparison#List-of-comparisons","98":"/dev/learning/comparison#Non-parametric","99":"/dev/learning/comparison#Param:-:val","100":"/dev/learning/comparison#Layer-generation","101":"/dev/learning/compositional_networks#CompositionalNetworks.jl","102":"/dev/learning/compositional_networks#Utilities","103":"/dev/learning/compositional_networks#Metrics","104":"/dev/learning/constraint_learning#ConstraintLearning.jl","105":"/dev/learning/intro#Learning-about-Constraints","106":"/dev/learning/layers#A-layer-structure-for-any-ICN","107":"/dev/learning/qubo_constraints#Introduction-to-QUBOConstraints.jl","108":"/dev/learning/qubo_constraints#Basic-features","109":"/dev/learning/qubo_encoding#Encoding-for-QUBO-programs","110":"/dev/learning/qubo_learning#Learning-QUBO-matrices","111":"/dev/learning/qubo_learning#Interface","112":"/dev/learning/qubo_learning#Examples-with-various-optimizers","113":"/dev/learning/qubo_learning#Gradient-Descent","114":"/dev/learning/qubo_learning#Constraint-based-Local-Search","115":"/dev/learning/transformation#Transformations-Layer","116":"/dev/learning/transformation#List-of-transformations","117":"/dev/learning/transformation#Non-parametric","118":"/dev/learning/transformation#Param:-:val","119":"/dev/learning/transformation#Layer-generation","120":"/dev/meta/meta_strategist#MetaStrategist.jl","121":"/dev/perf/benchmark_ext#BenchmarkTools-Extension","122":"/dev/perf/perf_checker#PerfChecker.jl","123":"/dev/perf/perf_interface#Interfacing-PerfChecker","124":"/dev/public_api#Public-API","125":"/dev/solvers/cbls#CBLS.jl","126":"/dev/solvers/intro#Solvers","127":"/dev/solvers/local_search_solvers#LocalSearchSolvers.jl"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[9,1,1],"1":[3,10,75],"2":[9,1,1],"3":[2,10,98],"4":[2,1,46],"5":[4,2,162],"6":[1,2,80],"7":[2,3,1],"8":[1,2,93],"9":[2,3,1],"10":[1,2,41],"11":[2,3,1],"12":[1,2,42],"13":[2,3,1],"14":[1,2,31],"15":[2,3,1],"16":[1,2,36],"17":[2,3,1],"18":[9,1,42],"19":[4,9,167],"20":[5,9,54],"21":[1,9,136],"22":[4,10,92],"23":[1,10,1],"24":[1,9,127],"25":[4,10,99],"26":[1,9,138],"27":[4,10,103],"28":[1,9,19],"29":[1,9,96],"30":[1,9,115],"31":[2,1,297],"32":[9,1,39],"33":[4,9,169],"34":[6,9,56],"35":[2,9,184],"36":[10,9,207],"37":[9,1,1],"38":[4,10,134],"39":[9,1,1],"40":[2,10,57],"41":[2,1,17],"42":[2,2,77],"43":[7,3,69],"44":[1,3,75],"45":[4,3,13],"46":[2,3,77],"47":[2,2,55],"48":[9,1,1],"49":[3,10,71],"50":[6,1,3],"51":[9,1,1],"52":[4,10,126],"53":[9,1,1],"54":[4,10,106],"55":[4,1,1],"56":[5,4,12],"57":[4,4,12],"58":[3,1,1],"59":[6,3,11],"60":[4,3,18],"61":[3,1,1],"62":[4,3,14],"63":[2,3,13],"64":[3,1,1],"65":[5,3,10],"66":[4,3,10],"67":[7,3,10],"68":[3,1,1],"69":[2,3,13],"70":[5,1,13],"71":[8,1,1],"72":[3,8,16],"73":[5,8,103],"74":[5,8,190],"75":[4,1,35],"76":[4,1,1],"77":[3,4,12],"78":[4,4,11],"79":[3,1,1],"80":[2,3,12],"81":[2,3,11],"82":[3,3,12],"83":[3,1,1],"84":[3,3,11],"85":[2,3,15],"86":[2,1,1149],"87":[1,1,122],"88":[5,2,93],"89":[4,2,80],"90":[2,1,11],"91":[3,2,26],"92":[2,2,26],"93":[2,1,11],"94":[4,2,22],"95":[2,2,25],"96":[2,1,11],"97":[3,2,10],"98":[2,5,54],"99":[2,5,37],"100":[2,5,49],"101":[2,1,5],"102":[1,2,93],"103":[1,2,49],"104":[2,1,232],"105":[3,1,6],"106":[6,1,139],"107":[4,1,5],"108":[2,4,35],"109":[4,1,64],"110":[3,1,1],"111":[1,3,31],"112":[4,3,1],"113":[2,7,102],"114":[4,7,1],"115":[2,1,30],"116":[3,2,10],"117":[2,5,66],"118":[2,5,58],"119":[2,5,157],"120":[2,1,5],"121":[2,1,26],"122":[2,1,54],"123":[2,1,18],"124":[2,1,590],"125":[2,1,251],"126":[1,1,3],"127":[2,1,506]},"averageFieldLength":[3.328125,3.6249999999999982,66.9921875],"storedFields":{"0":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"1":{"title":"Comparison-based Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia",null]},"2":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"3":{"title":"Connection Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia",null]},"4":{"title":"ConstraintCommons.jl","titles":[]},"5":{"title":"Key Features and Functionalities","titles":["ConstraintCommons.jl"]},"6":{"title":"Parameters","titles":["ConstraintCommons.jl"]},"7":{"title":"Performances – TODO","titles":["ConstraintCommons.jl","Parameters"]},"8":{"title":"Languages","titles":["ConstraintCommons.jl"]},"9":{"title":"Performances – TODO","titles":["ConstraintCommons.jl","Languages"]},"10":{"title":"Extensions","titles":["ConstraintCommons.jl"]},"11":{"title":"Performances – TODO","titles":["ConstraintCommons.jl","Extensions"]},"12":{"title":"Sampling","titles":["ConstraintCommons.jl"]},"13":{"title":"Performances – TODO","titles":["ConstraintCommons.jl","Sampling"]},"14":{"title":"Extrema","titles":["ConstraintCommons.jl"]},"15":{"title":"Performances – TODO","titles":["ConstraintCommons.jl","Extrema"]},"16":{"title":"Dictionaries","titles":["ConstraintCommons.jl"]},"17":{"title":"Performances – TODO","titles":["ConstraintCommons.jl","Dictionaries"]},"18":{"title":"ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints","titles":[]},"19":{"title":"Key Features and Functionalities","titles":["ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints"]},"20":{"title":"Empowering Constraint Programming in Julia","titles":["ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints"]},"21":{"title":"Commons","titles":["ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints"]},"22":{"title":"Extension to Base module","titles":["ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints","Commons"]},"23":{"title":"Performances","titles":["ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints","Commons"]},"24":{"title":"Continuous","titles":["ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints"]},"25":{"title":"Extension to Base module","titles":["ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints","Continuous"]},"26":{"title":"Discrete","titles":["ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints"]},"27":{"title":"Extension to Base module","titles":["ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints","Discrete"]},"28":{"title":"General","titles":["ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints"]},"29":{"title":"Exploration","titles":["ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints"]},"30":{"title":"Parameters","titles":["ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints"]},"31":{"title":"ConstraintModels.jl","titles":[]},"32":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"33":{"title":"Key Features and Functionalities","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"34":{"title":"Enabling Advanced Modeling in Constraint Programming","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"35":{"title":"Basic tools","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"36":{"title":"Usual constraints (based on and including XCSP3-core categories)","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"37":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"38":{"title":"Counting and Summing Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia",null]},"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",null]},"41":{"title":"Generic Constraints","titles":[]},"42":{"title":"Intention Constraints","titles":["Generic Constraints"]},"43":{"title":"Defining an intention constraint in JC-API","titles":["Generic Constraints","Intention Constraints"]},"44":{"title":"APIs","titles":["Generic Constraints","Intention Constraints"]},"45":{"title":"Test for DocumenterVitePress Issue","titles":["Generic Constraints","Intention Constraints"]},"46":{"title":"Specific documentation","titles":["Generic Constraints","Intention Constraints"]},"47":{"title":"Extension Constraints","titles":["Generic Constraints"]},"48":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"49":{"title":"Constraints on Graphs","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia",null]},"50":{"title":"Introduction to basics cosntraints related tools","titles":[]},"51":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"52":{"title":"Constraints defined from Languages","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia",null]},"53":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"54":{"title":"Packing and Scheduling Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia",null]},"55":{"title":"Advanced Constraint Programming Techniques","titles":[]},"56":{"title":"Global Constraints and Their Uses","titles":["Advanced Constraint Programming Techniques"]},"57":{"title":"Search Strategies and Optimization","titles":["Advanced Constraint Programming Techniques"]},"58":{"title":"Applying Optimization Methods","titles":[]},"59":{"title":"Case Studies and Real-World Applications","titles":["Applying Optimization Methods"]},"60":{"title":"From Theory to Practice","titles":["Applying Optimization Methods"]},"61":{"title":"Community and Contribution","titles":[]},"62":{"title":"Joining the JuliaConstraint Community","titles":["Community and Contribution"]},"63":{"title":"Future Directions","titles":["Community and Contribution"]},"64":{"title":"Constraint Programming 101","titles":[]},"65":{"title":"What is Constraint Programming?","titles":["Constraint Programming 101"]},"66":{"title":"Basic Concepts and Terminology","titles":["Constraint Programming 101"]},"67":{"title":"How CP differs from other optimization techniques","titles":["Constraint Programming 101"]},"68":{"title":"Exploring JuliaConstraint Packages","titles":[]},"69":{"title":"Package Overviews","titles":["Exploring JuliaConstraint Packages"]},"70":{"title":"Installation and Getting Started Guides","titles":[]},"71":{"title":"Getting Started with Julia for CP and Optimization","titles":[]},"72":{"title":"Why Julia?","titles":["Getting Started with Julia for CP and Optimization"]},"73":{"title":"Setting Up Your Julia Environment","titles":["Getting Started with Julia for CP and Optimization"]},"74":{"title":"Your First Julia CP Model","titles":["Getting Started with Julia for CP and Optimization"]},"75":{"title":"Welcome to Julia Constraints","titles":[]},"76":{"title":"Building and Analyzing Models","titles":[]},"77":{"title":"Modeling Best Practices","titles":["Building and Analyzing Models"]},"78":{"title":"Performance Analysis and Improvement","titles":["Building and Analyzing Models"]},"79":{"title":"Dive into Optimization","titles":[]},"80":{"title":"Understanding Optimization","titles":["Dive into Optimization"]},"81":{"title":"Metaheuristics Overview","titles":["Dive into Optimization"]},"82":{"title":"Mathematical Programming Basics","titles":["Dive into Optimization"]},"83":{"title":"Tutorials and Experiments","titles":[]},"84":{"title":"Hands-On Tutorials","titles":["Tutorials and Experiments"]},"85":{"title":"Experimental Analysis","titles":["Tutorials and Experiments"]},"86":{"title":"Full API","titles":[]},"87":{"title":"JuliaConstraints","titles":[null]},"88":{"title":"Operational Research vs Constraint Programming","titles":[null,"JuliaConstraints"]},"89":{"title":"Constraint-Based Local Search","titles":[null,"JuliaConstraints"]},"90":{"title":"Aggregation Layer","titles":[]},"91":{"title":"List of aggregations","titles":["Aggregation Layer"]},"92":{"title":"Layer generation","titles":["Aggregation Layer"]},"93":{"title":"Arithmetic Layer","titles":[]},"94":{"title":"List of arithmetic operations","titles":["Arithmetic Layer"]},"95":{"title":"Layer generation","titles":["Arithmetic Layer"]},"96":{"title":"Comparison Layer","titles":[]},"97":{"title":"List of comparisons","titles":["Comparison Layer"]},"98":{"title":"Non-parametric","titles":["Comparison Layer","List of comparisons"]},"99":{"title":"Param: :val","titles":["Comparison Layer","List of comparisons"]},"100":{"title":"Layer generation","titles":["Comparison Layer","List of comparisons"]},"101":{"title":"CompositionalNetworks.jl","titles":[]},"102":{"title":"Utilities","titles":["CompositionalNetworks.jl"]},"103":{"title":"Metrics","titles":["CompositionalNetworks.jl"]},"104":{"title":"ConstraintLearning.jl","titles":[]},"105":{"title":"Learning about Constraints","titles":[]},"106":{"title":"A layer structure for any ICN","titles":[]},"107":{"title":"Introduction to QUBOConstraints.jl","titles":[]},"108":{"title":"Basic features","titles":["Introduction to QUBOConstraints.jl"]},"109":{"title":"Encoding for QUBO programs","titles":[]},"110":{"title":"Learning QUBO matrices","titles":[]},"111":{"title":"Interface","titles":["Learning QUBO matrices"]},"112":{"title":"Examples with various optimizers","titles":["Learning QUBO matrices"]},"113":{"title":"Gradient Descent","titles":["Learning QUBO matrices","Examples with various optimizers"]},"114":{"title":"Constraint-based Local Search","titles":["Learning QUBO matrices","Examples with various optimizers"]},"115":{"title":"Transformations Layer","titles":[]},"116":{"title":"List of transformations","titles":["Transformations Layer"]},"117":{"title":"Non-parametric","titles":["Transformations Layer","List of transformations"]},"118":{"title":"Param: :val","titles":["Transformations Layer","List of transformations"]},"119":{"title":"Layer generation","titles":["Transformations Layer","List of transformations"]},"120":{"title":"MetaStrategist.jl","titles":[]},"121":{"title":"BenchmarkTools Extension","titles":[]},"122":{"title":"PerfChecker.jl","titles":[]},"123":{"title":"Interfacing PerfChecker","titles":[]},"124":{"title":"Public API","titles":[]},"125":{"title":"CBLS.jl","titles":[]},"126":{"title":"Solvers","titles":[]},"127":{"title":"LocalSearchSolvers.jl","titles":[]}},"dirtCount":0,"index":[["θ",{"2":{"113":2}}],["≥",{"2":{"113":1}}],["^2",{"2":{"113":1}}],["η",{"2":{"104":1,"113":6}}],["σ",{"2":{"86":2,"108":2,"124":2}}],["∉",{"2":{"86":3}}],["⋯",{"2":{"74":2}}],["×",{"2":{"74":3}}],["+",{"2":{"46":2,"86":9,"87":1,"91":1,"117":2,"118":4}}],[">",{"2":{"44":2,"49":1,"86":1,"113":8}}],["≠",{"2":{"43":1,"44":1,"125":2}}],["|",{"2":{"125":4}}],["||",{"2":{"86":2}}],["|the",{"2":{"43":1}}],["|≠|x",{"2":{"43":1}}],["|x",{"2":{"43":1,"125":4}}],["−x",{"2":{"43":2}}],["yes",{"2":{"127":1}}],["yet",{"2":{"19":1,"21":1,"24":1,"31":1,"33":1,"86":2}}],["you",{"2":{"87":1}}],["your",{"0":{"73":1,"74":1}}],["y",{"2":{"42":2,"44":5,"47":1,"87":1,"104":4,"113":7,"127":2}}],["y=1",{"2":{"36":1,"86":1}}],["7",{"2":{"31":3,"38":2,"54":3,"86":5,"122":1}}],["`function",{"2":{"127":1}}],["`struct",{"2":{"127":1}}],["``",{"2":{"125":6}}],["`",{"2":{"52":1,"86":1,"104":1}}],["`automaton`",{"2":{"52":1,"86":1}}],["`x`",{"2":{"52":2,"86":2}}],["`grid`",{"2":{"31":1}}],["`m`",{"2":{"31":1}}],["`rangedomain``",{"2":{"21":1,"24":1,"26":1,"86":1,"124":1}}],["q",{"2":{"104":7,"113":18}}],["qap",{"2":{"31":1}}],["qubooptimizer",{"2":{"104":2}}],["qubogradientoptimizer",{"2":{"104":4}}],["qubo",{"0":{"109":1,"110":1},"1":{"111":1,"112":1,"113":1,"114":1},"2":{"86":5,"104":4,"108":4,"111":1,"124":2}}],["quboconstraints",{"0":{"107":1},"1":{"108":1},"2":{"5":1,"86":7,"104":1,"107":1,"108":2,"109":3,"111":2,"113":1,"124":5}}],["quite",{"2":{"74":1}}],["quot",{"2":{"35":6,"54":4,"74":6,"86":10,"87":4}}],["quadractic",{"2":{"31":1}}],["queens",{"2":{"31":6}}],["zeros",{"2":{"113":3}}],["zero",{"2":{"31":1,"54":11,"86":11}}],["≤",{"2":{"22":4,"25":4,"27":4,"54":1,"74":2,"86":5}}],["9×9",{"2":{"31":4}}],["9",{"2":{"21":1,"24":1,"26":1,"31":4,"74":7,"86":1,"124":1}}],["8",{"2":{"31":3,"38":5,"54":1,"86":6}}],["86",{"2":{"21":1,"24":1,"26":1,"86":1,"124":1}}],["89",{"2":{"21":2,"24":2,"26":2,"86":2,"124":2,"127":1}}],["δ",{"2":{"14":1,"86":1,"104":1,"113":1,"124":1}}],["heavily",{"2":{"115":1}}],["helps",{"2":{"87":1}}],["help",{"2":{"87":2,"88":1}}],["heuristic",{"2":{"74":1,"89":2}}],["heights",{"2":{"54":5,"86":5}}],["here",{"2":{"36":1,"44":1,"86":1}}],["highly",{"2":{"106":1}}],["highlight",{"2":{"75":1}}],["highlighting",{"2":{"62":1,"72":1}}],["high",{"2":{"87":1}}],["higher",{"2":{"42":1,"44":1}}],["highest",{"2":{"21":1,"24":1,"26":1,"86":1,"124":1,"127":1}}],["hide",{"2":{"46":2,"86":2}}],["https",{"2":{"36":1,"86":1,"124":1}}],["hot",{"2":{"86":3,"109":3,"113":1,"124":3}}],["hosts",{"2":{"87":1}}],["host",{"2":{"73":1}}],["however",{"2":{"74":1}}],["how",{"0":{"67":1},"2":{"33":1,"42":1,"43":1,"44":2,"56":1,"62":1,"78":1,"85":1,"97":1,"116":1}}],["holds",{"2":{"87":1}}],["hold",{"2":{"3":4,"86":4,"104":1}}],["hamming",{"2":{"86":4,"103":2,"104":3,"124":4}}],["hand",{"2":{"88":1}}],["hands",{"0":{"84":1}}],["handling",{"2":{"32":1,"33":2}}],["handled",{"2":{"24":1,"86":1}}],["handle",{"2":{"21":1,"44":2,"86":1,"127":2}}],["handles",{"2":{"19":1}}],["hardware",{"2":{"73":1}}],["have",{"2":{"31":2,"36":1,"46":1,"59":1,"73":1,"86":6,"89":1,"102":2,"124":4}}],["half",{"2":{"29":1,"86":1,"124":1}}],["has",{"2":{"12":1,"36":3,"74":1,"86":6,"106":1,"109":1,"121":1,"124":2,"127":10}}],["∈",{"2":{"10":1,"19":1,"21":1,"22":8,"25":8,"27":8,"86":9,"124":1,"127":3}}],["keep",{"2":{"86":1,"108":1}}],["keywords",{"2":{"86":1,"124":1}}],["keyword",{"2":{"35":2,"36":8,"86":9,"124":1,"127":1}}],["key",{"0":{"5":1,"19":1,"33":1},"2":{"36":2,"66":1,"86":2}}],["k",{"2":{"86":2,"94":2,"127":1}}],["known",{"2":{"31":1,"38":3,"86":5,"124":2,"127":1}}],["kind=",{"2":{"127":1}}],["kind",{"2":{"14":1,"29":1,"30":1,"86":2,"124":1,"127":6}}],["kinds",{"2":{"8":1}}],["kargs",{"2":{"6":1,"35":6,"36":5,"86":7,"104":6,"124":5}}],["wrappers",{"2":{"87":1}}],["wrapping",{"2":{"87":1}}],["write",{"2":{"86":2,"87":1,"124":2}}],["was",{"2":{"123":1,"127":1}}],["way",{"2":{"36":1,"42":1,"44":1,"47":1,"86":3}}],["warning",{"2":{"31":2,"35":1,"86":1}}],["would",{"2":{"36":1,"86":1}}],["worse",{"2":{"127":3}}],["world",{"0":{"59":1},"2":{"60":1,"75":1}}],["works",{"2":{"35":1,"86":1,"124":1}}],["work",{"2":{"33":2}}],["working",{"2":{"32":1,"34":1}}],["workflows",{"2":{"5":1}}],["workflow",{"2":{"5":1}}],["word",{"2":{"8":6,"30":2,"52":2,"86":8,"124":1}}],["why",{"0":{"72":1}}],["what",{"0":{"65":1},"2":{"36":1,"74":1,"75":1,"86":1}}],["whole",{"2":{"35":1,"86":1,"124":1,"127":1}}],["which",{"2":{"22":1,"31":8,"36":1,"52":2,"74":1,"86":6,"102":1,"106":1,"124":1}}],["while",{"2":{"19":1,"88":2,"89":1,"127":5}}],["whether",{"2":{"20":1,"34":1,"35":1,"36":1,"38":1,"54":1,"86":4}}],["where",{"2":{"19":1,"21":5,"22":5,"24":5,"25":4,"26":5,"27":4,"30":2,"31":1,"38":1,"46":1,"49":2,"52":1,"59":1,"86":18,"88":1,"89":2,"98":2,"113":1,"124":6,"125":2,"127":69}}],["when",{"2":{"10":2,"22":2,"25":1,"27":1,"31":1,"74":1,"86":21,"104":2,"117":10,"118":6,"119":2,"125":1,"127":2}}],["welcome",{"0":{"75":1}}],["well",{"2":{"74":1}}],["weigthing",{"2":{"104":1}}],["weigth",{"2":{"86":1,"124":1}}],["weigthed",{"2":{"86":1,"99":1}}],["weigths=nothing",{"2":{"86":1,"124":1}}],["weigths",{"2":{"31":1,"86":18,"103":1,"104":5,"106":10,"124":8}}],["weight",{"2":{"31":1,"86":1,"108":1}}],["weights",{"2":{"31":3}}],["we",{"2":{"10":1,"12":1,"14":1,"16":1,"42":1,"43":1,"44":1,"73":4,"74":6,"125":1}}],["w",{"2":{"8":2,"30":2,"86":4,"104":2,"106":2,"124":2}}],["width",{"2":{"36":2,"86":2,"124":2}}],["width=150",{"2":{"36":1,"86":1,"124":1}}],["wide",{"2":{"33":1,"52":1,"86":1}}],["wikipedia",{"2":{"31":2,"74":1}}],["will",{"2":{"6":1,"29":1,"36":1,"73":2,"74":1,"86":9,"92":1,"95":1,"100":1,"104":1,"106":1,"109":1,"121":1,"123":1,"124":8,"125":2}}],["with",{"0":{"71":1,"112":1},"1":{"72":1,"73":1,"74":1,"113":1,"114":1},"2":{"5":3,"8":1,"19":1,"24":1,"30":1,"31":9,"33":4,"34":1,"35":7,"36":7,"52":4,"54":3,"67":1,"70":1,"74":5,"86":56,"87":3,"88":3,"89":1,"98":1,"99":1,"100":1,"102":2,"103":1,"104":3,"106":4,"117":10,"118":6,"119":3,"121":1,"124":10,"125":2,"127":8}}],["without",{"2":{"5":1,"86":17,"117":10,"118":6}}],["within",{"0":{"18":1},"1":{"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1},"2":{"4":1,"18":1,"19":1,"32":1,"33":3,"52":2,"69":1,"73":1,"86":8,"90":1,"93":1,"96":1,"115":1,"127":1}}],["right",{"2":{"86":18,"117":15,"119":3}}],["rich",{"2":{"20":1}}],["rules",{"2":{"52":2,"86":2}}],["ruler",{"2":{"31":1,"43":4,"46":2,"86":2}}],["runtime",{"2":{"127":1}}],["run",{"2":{"31":1,"74":1,"104":1,"125":1,"127":5}}],["rawoptimizerattribute",{"2":{"125":2}}],["raw",{"2":{"31":2}}],["rates",{"2":{"31":1}}],["rate",{"2":{"31":1}}],["rand",{"2":{"19":1,"21":1,"22":16,"25":9,"27":9,"30":8,"86":13,"124":1,"127":2}}],["randomly",{"2":{"22":2,"25":1,"27":1,"30":1,"86":1,"127":1}}],["random",{"2":{"19":2,"22":2,"25":1,"27":1,"30":10,"86":10,"124":1,"127":2}}],["rangedomain",{"2":{"19":1,"26":2,"28":2,"86":4,"124":2}}],["ranges",{"2":{"19":3,"26":1,"86":1,"124":1}}],["range",{"2":{"18":1,"19":1,"21":1,"24":1,"26":3,"33":2,"52":1,"86":4,"124":3}}],["round",{"2":{"113":1,"127":1}}],["routing",{"2":{"49":2,"86":2,"88":1}}],["robust",{"2":{"34":1}}],["rows",{"2":{"74":1}}],["row",{"2":{"31":1,"74":1}}],["role",{"2":{"5":1,"82":1}}],["roles",{"2":{"5":1}}],["r",{"2":{"21":2,"24":2,"26":2,"31":2,"52":3,"86":5,"113":8,"124":2}}],["remote",{"2":{"127":2}}],["remotely",{"2":{"127":1}}],["re",{"2":{"127":1}}],["recommended",{"2":{"125":1,"127":1}}],["recognize",{"2":{"8":1}}],["ref",{"2":{"115":1,"127":6}}],["refer",{"2":{"31":5}}],["rev",{"2":{"86":5,"117":4,"119":1}}],["reverse",{"2":{"31":1,"86":1,"119":1}}],["registries",{"2":{"122":1}}],["regions",{"2":{"74":1}}],["regularization",{"2":{"86":2,"124":2}}],["regular",{"2":{"52":9,"86":9}}],["repositories",{"2":{"87":1}}],["replace",{"2":{"127":1}}],["repl",{"2":{"73":1}}],["represented",{"2":{"52":2,"86":2}}],["represents",{"2":{"36":1,"86":1}}],["represent",{"2":{"19":1}}],["representing",{"2":{"19":1,"52":1,"86":1}}],["relies",{"2":{"115":1}}],["relate",{"2":{"86":1,"119":1}}],["related",{"0":{"50":1},"2":{"104":1,"105":1,"121":1}}],["relatively",{"2":{"86":1,"102":1,"127":1}}],["relationships",{"2":{"47":1}}],["relying",{"2":{"5":1}}],["retrieve",{"2":{"31":1}}],["returned",{"2":{"35":1,"86":1}}],["returns",{"2":{"10":2,"22":5,"25":3,"27":3,"29":1,"30":1,"35":13,"86":19,"119":1,"122":1,"124":1,"127":1}}],["return",{"2":{"1":3,"3":4,"6":1,"8":3,"21":3,"22":5,"24":3,"25":8,"26":3,"27":8,"30":2,"31":1,"35":7,"36":6,"38":4,"40":1,"49":1,"52":1,"54":2,"86":63,"98":3,"99":3,"102":1,"104":4,"106":5,"113":8,"117":2,"118":2,"124":20,"125":2,"127":21}}],["reach",{"2":{"86":1,"103":1,"124":1}}],["reactants",{"2":{"31":2}}],["reactions",{"2":{"31":1}}],["reaction",{"2":{"31":4}}],["readers",{"2":{"60":1,"62":1,"75":1}}],["realm",{"2":{"20":1}}],["real",{"0":{"59":1},"2":{"19":1,"21":3,"24":5,"26":4,"35":1,"60":1,"75":1,"86":7,"124":6,"125":2}}],["reinforcement",{"2":{"29":1,"86":1,"87":1,"124":1}}],["resume",{"2":{"127":1}}],["result",{"2":{"35":3,"86":23,"102":1,"117":10,"118":6,"119":2}}],["results",{"2":{"24":2,"31":1,"33":1,"35":1,"86":3}}],["resulting",{"2":{"5":1}}],["restart",{"2":{"127":6}}],["restricting",{"2":{"127":2}}],["restriction",{"2":{"35":2,"86":2,"124":2}}],["restricts",{"2":{"38":3,"86":3}}],["restricted",{"2":{"22":1,"25":1,"27":1,"127":4}}],["respect",{"2":{"86":1,"119":1}}],["respectively",{"2":{"19":1,"31":2}}],["researchers",{"2":{"32":1}}],["research",{"0":{"88":1},"2":{"20":1,"34":1,"63":1,"87":1,"88":1}}],["resources",{"2":{"19":1}}],["required",{"2":{"29":1,"86":2,"111":1,"123":1,"124":1}}],["requirements",{"2":{"8":2,"86":2}}],["requiring",{"2":{"5":1}}],["reduce",{"2":{"86":3,"88":1,"94":2,"102":1}}],["reduced",{"2":{"29":1,"86":1,"124":1}}],["reducing",{"2":{"5":1}}],["redundant",{"2":{"5":1,"33":1}}],["give",{"2":{"86":1,"124":1}}],["given",{"2":{"31":2,"35":1,"38":7,"52":2,"86":18,"104":6,"106":2,"108":1,"109":1,"124":7,"125":8}}],["game",{"2":{"74":1}}],["gap",{"2":{"5":1}}],["guides",{"0":{"70":1}}],["guide",{"2":{"60":1}}],["gt",{"2":{"43":1,"87":1}}],["gcc",{"2":{"38":3,"86":3}}],["good",{"2":{"89":1}}],["goes",{"2":{"33":1}}],["goal",{"2":{"31":1,"87":1}}],["golomb",{"2":{"31":2,"43":2,"46":1,"86":1}}],["grads",{"2":{"113":2}}],["gradientdescentoptimizer",{"2":{"113":5}}],["gradient",{"0":{"113":1},"2":{"104":1,"113":1}}],["graphs",{"0":{"49":1}}],["graph",{"2":{"31":4,"52":1,"86":1,"127":1}}],["greater",{"2":{"35":1,"86":12,"117":7,"118":1,"119":3}}],["grid",{"2":{"31":5,"74":3}}],["groundwork",{"2":{"20":1}}],["genetic",{"2":{"81":1,"86":4,"104":3,"124":4}}],["generalstate",{"2":{"127":2}}],["generally",{"2":{"31":1}}],["general",{"0":{"28":1},"2":{"127":1}}],["generated",{"2":{"86":18,"117":10,"118":6,"124":1}}],["generates",{"2":{"30":1,"86":5,"106":2,"119":1,"124":1}}],["generate",{"2":{"19":1,"30":10,"36":1,"86":25,"92":1,"95":1,"100":1,"102":2,"104":2,"106":5,"119":2,"124":7}}],["generation",{"0":{"92":1,"95":1,"100":1,"119":1},"2":{"19":1,"86":2,"124":2}}],["generating",{"2":{"19":2}}],["generic",{"0":{"41":1},"1":{"42":1,"43":1,"44":1,"45":1,"46":1,"47":1},"2":{"4":1,"5":2,"41":1,"46":1,"86":1,"87":1,"125":1,"127":2}}],["getting",{"0":{"70":1,"71":1},"1":{"72":1,"73":1,"74":1},"2":{"70":1}}],["get",{"2":{"19":1,"21":1,"31":2,"36":2,"74":1,"86":5,"119":2,"122":2,"124":1,"125":2,"127":17}}],["g",{"2":{"5":1,"31":1,"80":1,"86":15,"117":8,"118":4,"119":3}}],["global",{"0":{"56":1},"2":{"1":7,"3":6,"33":1,"38":4,"40":2,"49":2,"54":6,"56":1,"74":1,"86":36,"104":2,"124":5,"125":5}}],["block",{"2":{"74":1}}],["blocks",{"2":{"74":2}}],["blank",{"2":{"31":2}}],["binarization==",{"2":{"113":1}}],["binarization",{"2":{"86":4,"104":2,"109":4,"113":13,"124":4}}],["binarize",{"2":{"86":2,"109":2,"113":3,"124":2}}],["binarized",{"2":{"86":1,"108":1}}],["binary",{"2":{"47":1,"86":1,"109":1,"124":1}}],["bias",{"2":{"86":3,"103":3,"124":3}}],["bit",{"2":{"86":2,"103":1,"109":1,"124":2}}],["bits",{"2":{"86":3,"106":2,"124":1}}],["bitvector",{"2":{"86":5,"102":4,"124":1}}],["bijective",{"2":{"3":2,"86":2}}],["but",{"2":{"31":1,"74":1}}],["building",{"0":{"76":1},"1":{"77":1,"78":1},"2":{"77":1}}],["build",{"2":{"8":1,"87":1,"100":1,"102":1,"123":1,"125":2}}],["bariable",{"2":{"127":1}}],["back",{"2":{"49":2,"86":2}}],["backward",{"2":{"31":1}}],["basis",{"2":{"74":1}}],["basics",{"0":{"50":1,"82":1}}],["basic",{"0":{"35":1,"66":1,"108":1},"2":{"4":1,"5":3,"19":1,"73":1,"86":5,"104":1,"108":1,"119":4}}],["base",{"0":{"22":1,"25":1,"27":1},"2":{"10":5,"21":3,"22":14,"25":9,"27":10,"28":3,"30":4,"31":9,"86":32,"106":1,"108":2,"124":4,"125":2,"127":4}}],["based",{"0":{"1":1,"36":1,"89":1,"114":1},"2":{"5":1,"6":2,"16":1,"19":1,"30":1,"35":1,"36":1,"86":8,"89":1,"104":2,"106":1,"109":1,"119":2,"121":1,"124":4,"125":2}}],["b",{"2":{"21":1,"22":8,"24":1,"25":8,"26":1,"27":8,"52":2,"86":11,"124":1}}],["breaking",{"2":{"122":3}}],["broad",{"2":{"18":1}}],["bridges",{"2":{"5":1}}],["bounded",{"2":{"86":1,"118":1}}],["bounding",{"2":{"86":6,"118":4,"119":2}}],["bounds",{"2":{"21":1,"86":1,"124":1}}],["boxes",{"2":{"74":1}}],["bool=true",{"2":{"38":1,"86":1}}],["bool=false",{"2":{"38":3,"86":3}}],["boolparameterdomain",{"2":{"30":1,"86":1}}],["boolean",{"2":{"12":1,"30":1,"33":1,"35":2,"86":4,"124":2,"125":1}}],["bool",{"2":{"6":1,"21":4,"24":4,"26":4,"38":1,"54":3,"86":9,"113":1,"124":4,"125":2,"127":4}}],["both",{"2":{"4":1,"14":1,"18":1,"29":1,"31":2,"32":1,"35":2,"86":6,"88":1,"124":2}}],["by",{"2":{"3":2,"4":1,"5":2,"8":1,"10":2,"19":1,"20":1,"22":1,"25":1,"26":1,"27":1,"29":1,"31":1,"33":3,"34":1,"35":1,"36":1,"38":1,"42":2,"47":3,"52":4,"70":1,"84":1,"86":21,"89":1,"99":1,"102":1,"104":4,"106":1,"118":1,"124":4,"127":10}}],["begin",{"2":{"125":14,"127":23}}],["benchmarking",{"2":{"121":1}}],["benchmarktools",{"0":{"121":1},"2":{"121":1}}],["better",{"2":{"88":1,"127":2}}],["between",{"2":{"3":2,"5":2,"6":1,"14":2,"19":1,"21":3,"24":2,"26":2,"31":2,"36":1,"43":2,"46":4,"47":1,"86":15,"98":1,"99":1,"124":7,"125":1,"127":1}}],["best",{"0":{"77":1},"2":{"73":1,"77":1,"104":1,"127":1}}],["been",{"2":{"59":1,"121":1,"127":7}}],["before",{"2":{"54":8,"86":8}}],["because",{"2":{"42":1,"47":1}}],["behave",{"2":{"33":1}}],["behaviors",{"2":{"33":1,"34":1}}],["behavior",{"2":{"19":1,"29":1,"33":1,"86":1}}],["beware",{"2":{"29":1,"86":1,"124":1}}],["belongs",{"2":{"22":1,"25":1,"27":1,"127":2}}],["beyond",{"2":{"19":1,"33":1}}],["be",{"2":{"3":2,"5":1,"19":1,"21":1,"29":2,"31":3,"35":3,"36":2,"38":2,"42":2,"47":3,"52":3,"73":1,"74":1,"86":27,"88":2,"89":2,"92":1,"95":1,"100":1,"104":2,"106":5,"109":1,"119":1,"124":8,"125":2,"127":3}}],["69",{"2":{"21":1,"24":1,"26":1,"86":1,"124":1}}],["6",{"2":{"3":1,"31":2,"40":1,"54":3,"86":5,"122":1}}],["up",{"0":{"73":1},"2":{"127":1}}],["upcoming",{"2":{"63":1}}],["update",{"2":{"36":2,"86":2}}],["undefkeyworderror",{"2":{"113":1}}],["under",{"2":{"86":1,"119":1}}],["understanding",{"0":{"80":1},"2":{"88":1}}],["underpin",{"2":{"18":1}}],["unrolled",{"2":{"86":1}}],["unacceptable",{"2":{"86":2}}],["unordered",{"2":{"26":1,"86":1}}],["until",{"2":{"12":1,"86":1,"124":1}}],["unique",{"2":{"3":2,"43":2,"46":1,"86":3,"125":1}}],["union",{"2":{"3":4,"6":1,"8":2,"16":1,"22":2,"25":1,"27":1,"28":2,"30":2,"36":1,"38":1,"86":12,"124":4,"125":2,"127":69}}],["utility",{"2":{"33":1}}],["utilities",{"0":{"102":1},"2":{"12":1}}],["utilized",{"2":{"4":1,"5":1,"86":1}}],["us",{"2":{"125":1}}],["usage",{"2":{"44":1,"121":1}}],["usability",{"2":{"5":1}}],["using",{"2":{"36":1,"74":1,"86":1,"87":1,"104":1,"124":1}}],["usually",{"2":{"46":1,"86":1,"127":1}}],["usual",{"0":{"36":1},"2":{"6":8,"33":5,"35":2,"36":19,"42":1,"43":3,"44":1,"86":24,"90":1,"93":1,"96":1,"115":1,"124":14}}],["useful",{"2":{"86":1,"89":2,"106":1,"127":1}}],["uses",{"0":{"56":1},"2":{"86":1,"88":2,"89":2,"104":1,"119":1}}],["user",{"2":{"5":1,"34":1,"127":2}}],["users",{"2":{"5":3,"20":1,"33":2,"73":2}}],["used",{"2":{"3":6,"8":3,"21":1,"30":8,"35":2,"36":2,"40":2,"49":2,"52":1,"54":8,"73":1,"86":38,"88":1,"102":1,"104":2,"106":2,"111":1,"124":1,"125":2,"127":1}}],["use",{"2":{"1":2,"5":1,"12":1,"26":1,"33":1,"38":1,"43":2,"72":1,"73":2,"74":1,"86":5,"89":2,"115":1,"124":2,"125":1,"127":2}}],["pkg",{"2":{"122":2}}],["penalty",{"2":{"104":9,"113":20}}],["perform",{"2":{"127":1}}],["performance",{"0":{"78":1},"2":{"33":1,"72":1,"78":1,"127":1}}],["performances",{"0":{"7":1,"9":1,"11":1,"13":1,"15":1,"17":1,"23":1}}],["perfchecker",{"0":{"122":1,"123":1},"2":{"121":1,"122":5,"123":1}}],["per",{"2":{"86":1,"109":1,"124":1}}],["pôpulation",{"2":{"104":1}}],["public",{"0":{"124":1}}],["push",{"2":{"113":1}}],["pure",{"2":{"87":3}}],["purely",{"2":{"87":1}}],["purpose",{"2":{"69":1,"125":1}}],["purposes",{"2":{"20":1,"34":1,"35":1,"86":1,"104":1}}],["puzzles",{"2":{"74":1}}],["puzzle",{"2":{"74":3}}],["pluto",{"2":{"73":1}}],["please",{"2":{"43":1,"73":1}}],["platform",{"2":{"34":1}}],["plays",{"2":{"5":1}}],["p",{"2":{"31":2,"86":1,"103":1,"124":1,"125":1}}],["pool",{"2":{"127":1}}],["pop",{"2":{"104":2}}],["population",{"2":{"86":2,"104":2,"124":2}}],["popsize=100",{"2":{"104":1}}],["popsize=200",{"2":{"86":1,"124":1}}],["popsize",{"2":{"86":4,"124":4}}],["post",{"2":{"75":1,"127":1}}],["posed",{"2":{"74":1}}],["possible",{"2":{"73":1,"88":1,"97":1,"116":1,"125":1,"127":2}}],["possibly",{"2":{"26":1,"36":1,"86":2}}],["positional",{"2":{"35":1,"86":1}}],["positive",{"2":{"35":4,"86":15,"91":3,"98":2,"99":2,"117":2,"118":2,"124":4}}],["pos",{"2":{"31":2}}],["point",{"2":{"22":3,"25":2,"27":2,"30":1,"54":2,"86":4}}],["points",{"2":{"21":1,"24":1,"25":1,"26":3,"27":2,"86":5,"124":3}}],["powerful",{"2":{"33":1}}],["power",{"2":{"20":1}}],["pseudo",{"2":{"19":1,"30":1,"86":1}}],["printing",{"2":{"127":2}}],["print",{"2":{"74":1,"127":8}}],["primary",{"2":{"69":1}}],["practices",{"0":{"77":1},"2":{"77":1}}],["practice",{"0":{"60":1}}],["practical",{"2":{"5":1,"20":1,"34":1}}],["practitioners",{"2":{"34":1}}],["precision",{"2":{"104":1,"113":6}}],["preliminaries",{"2":{"104":2,"113":3}}],["predict",{"2":{"104":1,"113":9}}],["predictions",{"2":{"104":1}}],["prediction",{"2":{"104":1}}],["predicate",{"2":{"35":4,"42":1,"43":4,"44":2,"46":4,"86":9,"106":1,"125":2}}],["predicates",{"2":{"33":1,"74":2}}],["previously",{"2":{"44":1}}],["pretty",{"2":{"36":3,"86":3,"113":1,"124":3,"127":2}}],["prefix",{"2":{"35":3,"86":3}}],["preferences",{"2":{"35":1,"86":1,"124":1}}],["preference",{"2":{"33":1}}],["present",{"2":{"31":1,"36":1,"86":1}}],["programs",{"0":{"109":1}}],["programming",{"0":{"20":1,"34":1,"55":1,"64":1,"65":1,"82":1,"88":1},"1":{"56":1,"57":1,"65":1,"66":1,"67":1},"2":{"3":6,"4":1,"5":2,"18":2,"20":2,"32":1,"34":1,"38":3,"40":2,"47":1,"49":2,"54":6,"67":1,"74":1,"75":1,"80":1,"82":1,"86":20,"87":3,"88":2,"89":4,"119":1}}],["proportional",{"2":{"86":1,"124":1}}],["property",{"2":{"42":1}}],["properties",{"2":{"19":1,"31":1,"33":1}}],["properly",{"2":{"21":1,"86":1,"124":1}}],["produce",{"2":{"86":1,"102":1}}],["product",{"2":{"86":1,"94":1}}],["products",{"2":{"31":2}}],["productivity",{"2":{"5":1}}],["prod",{"2":{"86":2,"94":2}}],["providing",{"2":{"5":1,"19":1,"20":1,"33":1,"34":1,"86":2}}],["provided",{"2":{"35":1,"86":18,"117":10,"118":6}}],["provide",{"2":{"5":1,"16":1,"19":1,"42":2,"44":2,"47":1,"70":1,"73":1,"84":1,"87":1,"125":1}}],["provides",{"2":{"4":1,"18":1,"19":1,"33":1,"74":1,"75":1,"87":1,"121":1}}],["projects",{"2":{"5":1,"63":1}}],["proceeds",{"2":{"31":1}}],["proceed",{"2":{"5":1}}],["processing",{"2":{"31":1,"86":1,"119":1}}],["processes",{"2":{"12":1,"88":1}}],["process",{"2":{"5":2,"19":2,"29":1,"60":1,"86":2,"88":1,"104":1,"119":1,"124":1,"127":3}}],["problems",{"2":{"18":1,"19":1,"20":1,"31":2,"33":2,"34":1,"49":2,"52":1,"54":6,"56":1,"57":1,"65":1,"74":1,"75":1,"80":1,"86":11,"87":4,"88":3,"89":6,"127":1}}],["problem",{"2":{"5":1,"19":2,"20":1,"31":7,"43":1,"60":1,"74":1,"88":2,"89":1,"127":3}}],["phase",{"2":{"5":1,"86":1,"106":2}}],["pivotal",{"2":{"5":1,"19":1,"32":1}}],["page",{"2":{"73":1}}],["packing",{"0":{"54":1}}],["packages",{"0":{"68":1},"1":{"69":1},"2":{"4":2,"5":7,"8":2,"33":1,"86":2,"87":4}}],["package",{"0":{"69":1},"2":{"4":1,"5":3,"6":1,"18":2,"19":3,"20":1,"32":2,"33":4,"69":1,"70":1,"122":1}}],["patch",{"2":{"122":2}}],["patches",{"2":{"122":1}}],["pattern",{"2":{"86":1,"106":1}}],["patternfolds",{"2":{"24":1,"86":1}}],["path",{"2":{"52":1,"86":6,"124":5,"127":5}}],["passed",{"2":{"35":2,"86":2}}],["paradigm",{"2":{"88":1}}],["param=nothing",{"2":{"86":1,"124":1}}],["paramater",{"2":{"86":1,"124":1}}],["parametric",{"0":{"98":1,"117":1},"2":{"35":1,"86":4,"100":1,"104":1,"119":2,"124":3}}],["parameterization",{"2":{"86":1,"119":1}}],["parameter",{"2":{"19":2,"29":1,"30":1,"52":2,"86":15,"102":2,"104":1,"108":1,"119":6,"124":4,"125":4}}],["parameters=constraintcommons",{"2":{"6":1,"36":1,"86":1,"124":1}}],["parameters",{"0":{"6":1,"30":1},"1":{"7":1},"2":{"6":17,"19":3,"30":12,"33":1,"35":2,"36":18,"86":39,"97":1,"104":5,"116":1,"119":2,"124":22}}],["params",{"2":{"33":1,"35":2,"86":2,"113":1,"124":1}}],["param",{"0":{"99":1,"118":1},"2":{"29":2,"30":2,"35":4,"36":2,"86":109,"99":16,"100":2,"102":5,"118":54,"119":16,"124":22,"125":24}}],["parse",{"2":{"36":1,"86":1}}],["particularly",{"2":{"106":1}}],["partially",{"2":{"74":1,"86":1,"124":1}}],["partial",{"2":{"12":1,"29":1,"86":3,"124":2,"127":1}}],["part",{"2":{"29":1,"35":1,"73":1,"86":2,"87":1,"124":1}}],["pairs",{"2":{"31":2,"46":1,"86":1}}],["paired",{"2":{"30":1,"86":1}}],["pairvarsparameterdomain",{"2":{"30":1,"86":1}}],["pair",{"2":{"1":16,"6":1,"29":1,"31":5,"38":2,"40":4,"54":15,"86":63,"104":3,"106":1,"124":1}}],["mts",{"2":{"127":7}}],["move",{"2":{"127":3}}],["most",{"2":{"38":4,"74":1,"86":5,"109":1,"124":1}}],["more",{"2":{"36":1,"86":2}}],["moisumequalparam",{"2":{"125":2}}],["moisequentialtasks",{"2":{"125":1}}],["moipredicate",{"2":{"125":2}}],["moiordered",{"2":{"125":1}}],["moiminusequalparam",{"2":{"125":2}}],["moilessthanparam",{"2":{"125":2}}],["moierror",{"2":{"125":5}}],["moieq",{"2":{"125":1}}],["moidistdifferent",{"2":{"125":1}}],["moialwaystrue",{"2":{"125":1}}],["moiallequalparam",{"2":{"125":2}}],["moiallequal",{"2":{"125":1}}],["moialldifferent",{"2":{"125":1}}],["moi",{"2":{"31":1,"44":2,"125":22}}],["module",{"0":{"22":1,"25":1,"27":1},"2":{"35":1,"86":1}}],["modeled",{"2":{"127":1}}],["modeler=",{"2":{"31":1}}],["modeler",{"2":{"31":14}}],["modelize",{"2":{"31":1}}],["modeling",{"0":{"34":1,"77":1},"2":{"5":1,"19":1,"20":1,"34":1,"42":1,"44":1,"73":2,"74":1,"87":1}}],["model",{"0":{"74":1},"2":{"31":17,"33":1,"52":1,"74":3,"86":3,"125":25,"127":75}}],["models",{"0":{"76":1},"1":{"77":1,"78":1},"2":{"5":1,"19":1,"74":1,"77":1,"78":1,"86":1,"87":2,"88":2,"119":1}}],["mutable",{"2":{"127":2}}],["mutually",{"2":{"86":4,"92":1,"95":1,"100":1,"104":1,"106":1,"124":3}}],["much",{"2":{"89":1}}],["must",{"2":{"19":1,"21":1,"26":1,"31":2,"38":2,"42":1,"47":2,"52":2,"86":8,"88":1,"124":2,"125":1}}],["multithreading",{"2":{"127":1}}],["multithreaded",{"2":{"127":1}}],["multi",{"2":{"52":1,"86":1}}],["multimedia",{"2":{"31":4}}],["multiplied",{"2":{"31":1}}],["multiplication",{"2":{"10":1,"86":1}}],["multiple",{"2":{"5":1}}],["multivalued",{"2":{"8":3,"86":2,"124":1}}],["mixed",{"2":{"87":1}}],["mission",{"2":{"75":1}}],["missing",{"2":{"8":2,"100":2,"102":2}}],["might",{"2":{"74":2}}],["min",{"2":{"113":2,"125":1}}],["minkowski",{"2":{"86":1,"103":1,"124":1}}],["minusequalparam",{"2":{"125":2}}],["minus",{"2":{"86":28,"98":4,"99":4,"117":8,"118":8,"119":4}}],["mincut",{"2":{"31":1,"127":2}}],["minimization",{"2":{"125":1}}],["minimizing",{"2":{"31":1}}],["minimizes",{"2":{"5":1}}],["minimal",{"2":{"8":2,"86":4,"102":1,"103":1,"124":3,"127":3}}],["minimum",{"2":{"3":11,"14":1,"31":1,"86":12,"113":2,"124":1}}],["mdd",{"2":{"8":4,"30":1,"52":12,"86":15,"124":2}}],["mdash",{"2":{"1":3,"3":4,"6":2,"8":6,"10":3,"12":1,"14":1,"16":1,"21":6,"22":5,"24":8,"25":4,"26":10,"27":5,"28":2,"29":3,"30":13,"31":19,"35":10,"36":7,"38":4,"40":1,"46":1,"49":1,"52":2,"54":2,"86":187,"91":2,"92":1,"94":2,"95":1,"98":5,"99":4,"100":1,"102":6,"103":4,"104":28,"106":12,"108":2,"109":3,"111":2,"117":11,"118":6,"119":2,"122":4,"124":70,"125":45,"127":142}}],["mmds",{"2":{"8":1}}],["m",{"2":{"6":2,"31":6,"36":2,"74":5,"86":2,"124":2,"127":139}}],["major",{"2":{"122":2}}],["may",{"2":{"89":1}}],["map",{"2":{"86":1,"102":1,"113":5}}],["mapping",{"2":{"86":1,"119":1}}],["mainsolver",{"2":{"127":7}}],["main",{"2":{"41":1,"86":1,"103":1,"124":1,"127":5}}],["mainly",{"2":{"35":1,"86":1,"125":1}}],["macro",{"2":{"36":6,"86":6,"115":1,"124":2,"125":1}}],["making",{"2":{"32":1,"89":1}}],["makes",{"2":{"87":1}}],["make",{"2":{"12":1,"35":3,"36":2,"86":8,"87":1,"88":1,"100":1,"104":3,"113":2,"115":2,"119":3,"127":1}}],["matter",{"2":{"125":1}}],["matters",{"2":{"105":1}}],["matrices",{"0":{"110":1},"1":{"111":1,"112":1,"113":1,"114":1},"2":{"86":1,"104":1,"111":1}}],["matrix",{"2":{"31":4,"86":2,"104":2,"108":2,"124":1}}],["match",{"2":{"86":3}}],["matches",{"2":{"86":3}}],["maths",{"2":{"86":1,"124":1}}],["mathematical",{"0":{"82":1},"2":{"82":1,"88":2,"89":1}}],["mathoptinterface",{"2":{"31":2,"125":12}}],["magic",{"2":{"31":2}}],["marks",{"2":{"31":1,"43":2,"46":2,"86":2}}],["max",{"2":{"29":2,"86":5,"102":2,"106":1,"124":2,"125":1,"127":10}}],["maximum",{"2":{"3":11,"14":1,"19":1,"21":1,"24":1,"26":1,"86":14,"124":3,"127":6}}],["manipulating",{"2":{"106":1}}],["manipulations",{"2":{"20":1}}],["manipulation",{"2":{"18":1,"19":2,"32":1,"33":1,"86":1,"119":1}}],["manufacturing",{"2":{"88":1}}],["manhattan",{"2":{"86":1,"103":1,"124":1}}],["managing",{"2":{"33":1}}],["manages",{"2":{"127":1}}],["managed",{"2":{"127":1}}],["manager",{"2":{"73":1}}],["manage",{"2":{"5":1,"127":1}}],["many",{"2":{"12":1,"86":1,"124":1}}],["metasolver",{"2":{"127":4}}],["metastrategist",{"0":{"120":1},"2":{"120":1}}],["metadata",{"2":{"87":1}}],["metaheuristics",{"0":{"81":1},"2":{"67":1}}],["metrics",{"0":{"103":1}}],["metric=hamming",{"2":{"86":1,"104":1,"124":1}}],["metric",{"2":{"86":8,"103":2,"104":6,"124":8}}],["method",{"2":{"6":1,"8":1,"10":2,"21":1,"22":3,"24":1,"25":3,"26":1,"27":3,"31":17,"36":1,"86":171,"104":26,"106":1,"111":2,"117":10,"118":6,"122":3,"123":1,"124":53,"125":14,"127":128}}],["methods",{"0":{"58":1},"1":{"59":1,"60":1},"2":{"4":1,"5":2,"8":1,"19":2,"21":1,"30":1,"33":2,"67":1,"86":4,"102":2,"124":3,"127":3}}],["meaningful",{"2":{"85":1}}],["meaning",{"2":{"38":2,"86":2,"106":1}}],["means",{"2":{"3":2,"36":3,"86":5}}],["measurement",{"2":{"127":1}}],["measure",{"2":{"33":1,"86":2,"124":2}}],["merge",{"2":{"19":1,"24":2,"26":2,"86":2,"124":2,"127":1}}],["merging",{"2":{"19":1}}],["membership",{"2":{"19":1}}],["56",{"2":{"127":1}}],["53",{"2":{"21":1,"24":1,"26":1,"86":1,"124":1}}],["5",{"2":{"1":1,"3":11,"21":1,"24":1,"26":1,"31":2,"38":29,"40":3,"54":13,"86":75,"87":1,"113":1,"122":1,"124":1,"125":6,"127":1}}],["nbits",{"2":{"86":2,"106":1,"124":1}}],["nbsp",{"2":{"1":3,"3":4,"6":2,"8":6,"10":3,"12":1,"14":1,"16":1,"21":6,"22":5,"24":8,"25":4,"26":10,"27":5,"28":2,"29":3,"30":13,"31":19,"35":10,"36":7,"38":4,"40":1,"46":1,"49":1,"52":2,"54":2,"86":187,"91":2,"92":1,"94":2,"95":1,"98":5,"99":4,"100":1,"102":6,"103":4,"104":28,"106":12,"108":2,"109":3,"111":2,"117":11,"118":6,"119":2,"122":4,"124":70,"125":45,"127":142}}],["nvars",{"2":{"86":12,"98":8,"124":4}}],["nvalues",{"2":{"38":8,"86":8}}],["nine",{"2":{"74":1}}],["n5",{"2":{"52":2,"86":2}}],["n4",{"2":{"52":3,"86":3}}],["n3",{"2":{"52":2,"86":2}}],["n2",{"2":{"52":2,"86":2}}],["n1",{"2":{"52":2,"86":2}}],["n²",{"2":{"31":1}}],["n×n",{"2":{"31":1}}],["n",{"2":{"31":18,"86":7,"102":4,"108":3,"113":9,"124":2}}],["numeric",{"2":{"26":1,"86":1}}],["number",{"2":{"21":1,"25":3,"26":2,"27":3,"29":3,"31":2,"35":3,"38":11,"86":52,"91":1,"98":1,"103":1,"104":2,"106":4,"109":3,"117":8,"118":4,"124":18,"125":6,"127":12}}],["numbers",{"2":{"19":2,"86":2,"98":2}}],["normalized",{"2":{"86":1,"124":1}}],["normal",{"2":{"86":1,"119":1}}],["norm",{"2":{"86":2,"98":1,"99":1}}],["now",{"2":{"31":1,"74":1}}],["node",{"2":{"31":2,"52":3,"86":3}}],["no",{"2":{"31":4,"46":1,"54":20,"86":24,"102":1,"104":1,"106":1,"119":1}}],["nonnegative",{"2":{"125":1}}],["none",{"2":{"86":4,"109":1,"113":2,"119":3,"124":1,"125":6}}],["nonlinear",{"2":{"80":1}}],["non",{"0":{"98":1,"117":1},"2":{"26":1,"29":2,"86":3,"104":4,"124":2,"127":1}}],["not",{"2":{"24":1,"31":2,"35":1,"36":2,"38":1,"42":1,"44":1,"54":6,"73":1,"74":3,"86":18,"103":1,"109":1,"118":1,"119":1,"124":2,"125":1,"127":1}}],["notebooks",{"2":{"73":1,"121":1}}],["note",{"2":{"6":1,"42":1,"44":1,"73":1,"74":1,"125":1}}],["nothing",{"2":{"1":1,"10":5,"22":4,"25":2,"27":2,"29":1,"35":4,"36":1,"38":2,"86":18,"102":1,"104":2,"113":1,"124":8,"125":2}}],["natural",{"2":{"42":1,"44":1}}],["nature",{"2":{"24":1,"26":1,"86":1,"124":1}}],["names",{"2":{"86":1,"119":1}}],["name=",{"2":{"86":1,"124":1}}],["name",{"2":{"6":1,"35":1,"36":3,"86":9,"124":8,"127":8}}],["neighbours",{"2":{"127":2}}],["neighbourhood",{"2":{"127":2}}],["neither",{"2":{"35":1,"86":1}}],["never",{"2":{"127":1}}],["necessarily",{"2":{"73":1}}],["necessary",{"2":{"18":1,"127":3}}],["next",{"2":{"49":2,"86":2,"122":2}}],["negation",{"2":{"35":1,"86":1}}],["networks",{"2":{"88":1}}],["network",{"2":{"86":1,"106":1,"124":1}}],["net",{"2":{"31":1}}],["new",{"2":{"24":3,"33":2,"36":5,"86":8,"87":1,"124":3,"125":6,"127":2}}],["needs",{"2":{"19":1,"29":1,"31":1,"86":3,"119":1,"124":2}}],["need",{"2":{"5":1,"14":1,"74":2}}],["lst",{"2":{"127":5}}],["l",{"2":{"31":1,"86":15,"117":4,"118":4,"119":3}}],["l=n²",{"2":{"31":1}}],["loss",{"2":{"104":2,"113":2}}],["local",{"0":{"89":1,"114":1},"2":{"86":5,"89":1,"104":1,"106":1,"124":5,"125":2,"127":7}}],["localsearchsolverscblstodo",{"2":{"73":1}}],["localsearchsolvers",{"0":{"127":1},"2":{"73":2,"87":1,"104":1,"127":139}}],["locations",{"2":{"31":5}}],["loop",{"2":{"127":8}}],["loops",{"2":{"36":1,"49":2,"86":3}}],["look",{"2":{"73":1,"74":1}}],["lower",{"2":{"86":1,"103":1,"124":1}}],["lowest",{"2":{"21":1,"24":1,"26":1,"86":1,"124":1}}],["low",{"2":{"29":1,"86":1,"87":1,"124":1}}],["loggingextra",{"2":{"127":1}}],["logging",{"2":{"127":1}}],["logic",{"2":{"86":2}}],["logical",{"2":{"42":1}}],["log",{"2":{"8":1,"100":1,"102":1,"127":1}}],["littledict",{"2":{"86":2,"106":2,"119":1}}],["like",{"2":{"67":1,"81":1}}],["links",{"2":{"31":1,"121":1,"127":1}}],["linear",{"2":{"67":1,"80":1,"86":3,"108":3,"124":3}}],["line",{"2":{"31":9,"73":1}}],["limited",{"2":{"29":1,"86":1,"124":1}}],["limit",{"2":{"29":7,"54":2,"86":11,"124":9,"125":1,"127":10}}],["limits",{"2":{"19":1}}],["listed",{"2":{"86":2}}],["listing",{"2":{"47":1}}],["list=x",{"2":{"36":2,"86":2,"124":1}}],["list",{"0":{"91":1,"94":1,"97":1,"116":1},"1":{"98":1,"99":1,"100":1,"117":1,"118":1,"119":1},"2":{"1":13,"3":16,"6":2,"26":1,"27":1,"35":1,"38":24,"40":6,"43":1,"44":1,"46":5,"49":5,"52":8,"54":5,"86":89,"97":1,"116":1,"124":3,"127":11}}],["lt",{"2":{"8":2,"21":1,"22":4,"25":4,"26":1,"27":4,"31":1,"42":1,"43":1,"52":2,"86":10,"124":2,"127":3}}],["launch",{"2":{"127":1}}],["lazy",{"2":{"86":2,"102":2,"115":2,"124":2}}],["lang",{"2":{"86":3,"124":1}}],["lang=",{"2":{"86":1,"124":1}}],["language=",{"2":{"86":1,"124":1}}],["languageparameterdomain",{"2":{"30":1,"86":1}}],["languages",{"0":{"8":1,"52":1},"1":{"9":1},"2":{"8":1,"30":1,"86":1}}],["language",{"2":{"6":1,"42":1,"44":1,"52":17,"73":3,"86":24,"124":5}}],["large",{"2":{"74":1,"88":1,"89":1}}],["labels",{"2":{"52":2,"86":2}}],["labeled",{"2":{"52":2,"86":2}}],["last",{"2":{"52":1,"74":1,"86":1,"122":2,"127":1}}],["lays",{"2":{"20":1}}],["layered",{"2":{"86":1,"124":1}}],["layers",{"2":{"86":9,"106":2,"119":1,"124":4}}],["layer",{"0":{"90":1,"92":1,"93":1,"95":1,"96":1,"100":1,"106":1,"115":1,"119":1},"1":{"91":1,"92":1,"94":1,"95":1,"97":1,"98":1,"99":1,"100":1,"116":1,"117":1,"118":1,"119":1},"2":{"4":1,"25":2,"27":2,"86":42,"90":1,"92":3,"93":1,"95":3,"96":1,"98":1,"100":3,"104":4,"106":28,"115":1,"119":3,"124":16}}],["left",{"2":{"86":18,"117":10,"119":3}}],["let",{"2":{"74":1}}],["levels",{"2":{"84":1}}],["level",{"2":{"42":1,"44":1,"52":3,"86":3,"87":2,"127":9}}],["lessthanparam",{"2":{"125":2}}],["lesser",{"2":{"86":11,"117":6,"118":1,"119":3}}],["less",{"2":{"42":1,"74":1,"125":2}}],["leadsolvers",{"2":{"127":3}}],["leadsolver",{"2":{"127":1}}],["least",{"2":{"38":4,"86":4,"104":2}}],["learn",{"2":{"75":1,"86":7,"104":5,"106":1,"111":1,"124":6}}],["learned",{"2":{"33":1,"34":1,"86":1,"104":1,"124":1}}],["learning",{"0":{"105":1,"110":1},"1":{"111":1,"112":1,"113":1,"114":1},"2":{"4":1,"5":6,"12":1,"19":1,"29":1,"33":2,"86":4,"87":1,"104":1,"105":1,"106":2,"124":3}}],["length",{"2":{"19":1,"21":2,"22":1,"24":1,"25":6,"26":1,"27":6,"33":1,"35":4,"54":3,"86":23,"94":2,"106":2,"113":4,"124":6,"127":12}}],["lengths",{"2":{"1":3,"54":6,"86":9}}],["swap",{"2":{"127":2}}],["switch",{"2":{"86":1,"103":1,"124":1}}],["sltns",{"2":{"104":2}}],["smaller",{"2":{"89":1}}],["small",{"2":{"89":1}}],["scalarfunction",{"2":{"125":3}}],["scalars",{"2":{"86":1,"98":1}}],["scalar",{"2":{"86":3,"91":1,"98":1,"99":1}}],["science",{"2":{"72":1}}],["scenario",{"2":{"60":1}}],["scheduling",{"0":{"54":1},"2":{"31":1,"54":6,"86":6,"88":1}}],["square",{"2":{"31":3}}],["sqrt",{"2":{"29":1,"86":1,"124":1}}],["syntax",{"2":{"33":1,"73":1,"74":1,"125":2,"127":1}}],["symb",{"2":{"35":2,"86":2}}],["symbols",{"2":{"10":2,"86":11,"102":4,"106":1,"124":4}}],["symbol",{"2":{"6":4,"10":3,"35":7,"36":19,"86":32,"106":1,"109":1,"113":1,"119":4,"124":11,"127":3}}],["symmetries",{"2":{"33":3,"35":4,"86":4,"124":4}}],["symmetry",{"2":{"33":1,"35":1,"86":1,"124":1}}],["systems",{"2":{"88":2}}],["system",{"2":{"31":1}}],["subs",{"2":{"127":3}}],["subsolvers",{"2":{"127":4}}],["subsolver",{"2":{"127":6}}],["subset",{"2":{"125":1}}],["subsets",{"2":{"74":2}}],["sub",{"2":{"104":1,"127":1}}],["subtract",{"2":{"86":1,"119":1}}],["subtraction",{"2":{"86":1,"119":1}}],["subtype",{"2":{"31":1}}],["subgrid",{"2":{"74":1}}],["subgrids",{"2":{"74":1}}],["successfully",{"2":{"59":1}}],["such",{"2":{"5":1,"31":2,"33":2,"42":3,"44":2,"46":1,"52":1,"66":1,"86":3,"87":1,"88":2,"106":1,"119":1,"127":4}}],["sudoku",{"2":{"31":17,"74":4,"127":1}}],["sudokuinstances",{"2":{"31":1}}],["sudokuinstance",{"2":{"31":19}}],["sumequalparam",{"2":{"125":2}}],["summary",{"2":{"89":1}}],["summing",{"0":{"38":1}}],["sum",{"2":{"25":1,"27":1,"29":1,"31":1,"38":8,"54":2,"86":20,"91":2,"94":3,"108":3,"124":4,"125":1}}],["supply",{"2":{"88":1}}],["supplies",{"2":{"31":1,"87":1}}],["supported",{"2":{"86":4}}],["support",{"2":{"19":1,"86":1}}],["supports=nothing",{"2":{"86":1}}],["supports",{"2":{"19":1,"33":1,"86":7,"125":3}}],["supertype",{"2":{"19":3,"24":1,"26":1,"86":2,"124":2}}],["super",{"2":{"19":1,"21":1,"86":1,"124":1}}],["silent",{"2":{"125":1,"127":1}}],["sig",{"2":{"86":17,"117":10,"118":6}}],["signature",{"2":{"86":2,"102":2,"124":2}}],["significance",{"2":{"65":1}}],["significantly",{"2":{"33":1,"34":1}}],["single",{"2":{"74":1,"86":3,"91":1,"94":2}}],["since",{"2":{"42":1,"44":1,"127":1}}],["sink",{"2":{"31":3}}],["simulated",{"2":{"81":1}}],["simple",{"2":{"29":1,"33":1,"36":1,"74":2,"86":2,"124":2}}],["simply",{"2":{"22":2,"25":1,"27":1,"30":1,"35":1,"74":1,"86":2}}],["simplify",{"2":{"56":1}}],["simplifying",{"2":{"5":1}}],["simplified",{"2":{"36":3,"86":3}}],["simplifies",{"2":{"5":1,"33":1}}],["similar",{"2":{"21":1,"86":1,"124":1}}],["size",{"2":{"19":1,"21":5,"24":8,"26":8,"29":2,"31":3,"49":3,"86":31,"98":3,"99":3,"102":1,"104":7,"106":2,"113":2,"124":16,"125":2,"127":4}}],["situations",{"2":{"14":1}}],["split",{"2":{"104":1}}],["specialize",{"2":{"127":10}}],["specialized",{"2":{"86":2,"98":1,"117":1,"127":10}}],["specializing",{"2":{"127":1}}],["specifying",{"2":{"18":1,"86":2}}],["specific",{"0":{"46":1},"2":{"33":1,"40":4,"86":6,"104":2,"119":1}}],["specifically",{"2":{"22":2,"25":1,"27":1,"30":1,"46":1,"86":2}}],["specification",{"2":{"6":1,"19":1}}],["specifications",{"2":{"6":1,"33":1,"36":1,"86":1,"124":1}}],["specified",{"2":{"22":2,"25":1,"27":1,"30":1,"31":2,"86":2,"119":1}}],["specifies",{"2":{"3":6,"38":1,"42":1,"47":1,"86":8,"119":1}}],["space",{"2":{"29":4,"35":1,"86":11,"88":1,"124":9,"127":1}}],["spaces",{"2":{"12":1,"18":1,"19":1,"33":1}}],["span",{"2":{"24":1,"26":1,"86":1}}],["sat",{"2":{"127":3}}],["satisfying",{"2":{"127":2}}],["satisfy",{"2":{"38":3,"42":1,"47":1,"86":3,"87":1,"88":1,"89":1}}],["satisfies",{"2":{"35":1,"38":6,"52":1,"86":8,"89":1,"124":1}}],["satisfied",{"2":{"3":4,"35":1,"40":1,"49":1,"52":1,"54":2,"86":10,"88":1,"124":1,"127":1}}],["satisfaction",{"2":{"33":1,"86":2,"87":1,"127":3}}],["say",{"2":{"86":1,"109":1,"124":1}}],["same",{"2":{"24":1,"26":1,"31":2,"35":1,"36":1,"46":1,"86":4,"124":2}}],["samplings",{"2":{"19":1,"29":2,"86":2,"124":2}}],["sampling",{"0":{"12":1},"1":{"13":1},"2":{"12":2}}],["s2",{"2":{"10":1,"86":1}}],["s1",{"2":{"10":1,"86":1}}],["s",{"2":{"6":3,"8":7,"19":2,"21":2,"24":1,"26":1,"31":5,"33":1,"34":1,"35":6,"36":8,"74":1,"86":18,"100":1,"102":1,"124":14,"127":109}}],["stop",{"2":{"127":5}}],["storing",{"2":{"87":1}}],["stores",{"2":{"26":2,"86":2}}],["store",{"2":{"24":3,"30":8,"36":1,"86":15,"102":1,"106":2,"124":1,"127":3}}],["stipulates",{"2":{"86":1}}],["stuff",{"2":{"113":2}}],["studio",{"2":{"73":1}}],["studies",{"0":{"59":1},"2":{"59":1}}],["stucture",{"2":{"35":1,"86":1,"124":1}}],["step",{"2":{"36":2,"70":2,"84":2,"86":2,"127":3}}],["stamp",{"2":{"127":4}}],["static",{"2":{"127":1}}],["statistical",{"2":{"88":1}}],["status",{"2":{"125":1,"127":4}}],["states",{"2":{"52":4,"86":4}}],["state",{"2":{"31":3,"127":36}}],["started",{"0":{"70":1,"71":1},"1":{"72":1,"73":1,"74":1},"2":{"70":1}}],["starts",{"2":{"35":1,"54":8,"86":9,"89":1,"127":2}}],["start",{"2":{"31":1,"49":2,"52":2,"74":1,"86":4}}],["starting",{"2":{"31":2,"35":1,"86":1,"127":1}}],["start=",{"2":{"31":1}}],["standout",{"2":{"33":1}}],["standard",{"2":{"31":3,"32":1,"33":1,"34":1,"41":1,"87":1}}],["standardization",{"2":{"5":1}}],["stands",{"2":{"18":1}}],["stdout",{"2":{"31":1}}],["str",{"2":{"127":1}}],["straight",{"2":{"74":1}}],["straightforward",{"2":{"33":1,"42":1,"125":1}}],["strategies",{"0":{"57":1},"2":{"20":1,"57":1}}],["string",{"2":{"22":4,"25":4,"27":4,"31":1,"35":1,"86":8,"102":1,"106":1,"124":1,"127":1}}],["strictly",{"2":{"1":8,"35":3,"86":13,"91":1,"118":1,"124":3}}],["struct",{"2":{"21":1,"31":3,"86":1,"127":4}}],["structure",{"0":{"106":1},"2":{"8":3,"21":2,"30":1,"31":1,"86":6,"89":1,"104":1,"106":4,"124":4,"127":5}}],["structures",{"2":{"4":1,"5":2}}],["streamlining",{"0":{"0":1,"2":1,"32":1,"37":1,"39":1,"48":1,"51":1,"53":1},"1":{"1":1,"3":1,"33":1,"34":1,"35":1,"36":1,"38":1,"40":1,"49":1,"52":1,"54":1},"2":{"5":1}}],["shifted",{"2":{"113":3}}],["share",{"2":{"63":1,"77":1}}],["shared",{"2":{"4":1,"5":3}}],["shrink",{"2":{"35":1,"36":1,"86":2}}],["show",{"2":{"86":4,"102":1,"106":1,"124":1}}],["showcase",{"2":{"59":1}}],["shortcut",{"2":{"35":1,"36":1,"86":1,"124":1}}],["should",{"2":{"3":6,"42":1,"44":1,"46":1,"86":11,"102":2,"124":2,"127":3}}],["soon",{"2":{"125":1}}],["sophisticated",{"2":{"34":1}}],["so",{"2":{"31":1,"36":2,"74":1,"86":2,"88":1}}],["something",{"2":{"35":1,"86":1}}],["some",{"2":{"10":1,"12":1,"74":1,"86":1,"87":1,"90":1,"93":1,"96":1,"104":1,"115":1,"121":1,"124":1,"125":1}}],["sols",{"2":{"86":1,"104":4,"124":1}}],["solve",{"2":{"31":1,"74":1,"87":2,"88":1,"127":3}}],["solvername",{"2":{"125":1}}],["solvers",{"0":{"126":1},"2":{"73":3,"74":4,"87":10,"89":3,"106":1,"126":1,"127":2}}],["solver",{"2":{"31":6,"74":2,"87":1,"89":2,"104":1,"125":4,"127":29}}],["solving",{"2":{"20":1,"34":1,"57":1,"60":1,"65":1,"73":1,"75":1,"88":4,"127":4}}],["sol",{"2":{"29":1,"86":1,"124":1}}],["solution",{"2":{"19":1,"31":2,"74":3,"86":3,"88":1,"89":4,"103":1,"124":1,"127":4}}],["solutions",{"2":{"4":1,"5":2,"29":10,"86":14,"87":1,"88":2,"89":4,"103":1,"104":8,"124":14,"127":9}}],["solely",{"2":{"5":1}}],["source",{"2":{"1":3,"3":4,"6":3,"8":7,"10":3,"12":1,"14":1,"16":1,"21":10,"22":17,"24":12,"25":16,"26":14,"27":17,"28":2,"29":3,"30":17,"31":22,"35":11,"36":9,"38":4,"40":1,"46":1,"49":1,"52":2,"54":2,"86":187,"91":2,"92":1,"94":2,"95":1,"98":5,"99":4,"100":1,"102":6,"103":4,"104":28,"106":12,"108":2,"109":3,"111":2,"117":11,"118":6,"119":2,"122":4,"124":70,"125":45,"127":142}}],["sequentialtasks",{"2":{"125":2}}],["sequence",{"2":{"49":6,"52":4,"86":10}}],["select",{"2":{"127":4}}],["selection",{"2":{"86":1,"119":1}}],["selected",{"2":{"86":8,"92":1,"95":1,"100":1,"104":2,"106":6,"124":4,"127":1}}],["serie",{"2":{"127":1}}],["series",{"2":{"74":1}}],["serves",{"2":{"4":1,"19":1}}],["see",{"2":{"43":1,"127":1}}],["seems",{"2":{"31":1}}],["separates",{"2":{"86":1,"102":1}}],["separator",{"2":{"31":1}}],["sep",{"2":{"31":2,"86":2,"102":2}}],["segment",{"2":{"31":3}}],["several",{"2":{"14":1,"73":1,"87":1,"106":1}}],["seaperl",{"2":{"87":1}}],["searching",{"2":{"35":1,"86":1,"124":1}}],["searches",{"2":{"19":1}}],["search",{"0":{"57":1,"89":1,"114":1},"2":{"12":1,"18":1,"19":3,"29":9,"33":1,"57":1,"81":1,"86":20,"88":1,"89":3,"106":1,"124":20,"127":1}}],["seamless",{"2":{"5":1}}],["seamlessly",{"2":{"5":1}}],["sec",{"2":{"127":1}}],["section",{"2":{"6":1,"43":1,"121":1,"123":1}}],["seconds",{"2":{"127":1}}],["second",{"2":{"3":2,"54":8,"86":10}}],["setter",{"2":{"74":1}}],["setting",{"0":{"73":1},"2":{"127":1}}],["settings",{"2":{"19":1,"29":1,"86":1,"124":1,"127":1}}],["setup",{"2":{"73":1}}],["setdomain",{"2":{"21":1,"24":1,"26":3,"27":2,"86":5,"124":4}}],["set",{"2":{"3":4,"5":1,"8":1,"10":2,"20":1,"22":4,"25":2,"26":3,"27":2,"30":1,"31":4,"38":3,"40":2,"47":2,"86":31,"88":1,"100":1,"102":1,"104":11,"109":2,"119":1,"124":8,"125":16,"127":22}}],["sets",{"2":{"3":2,"19":1,"86":2,"104":3}}],["001",{"2":{"113":1}}],["00514",{"2":{"36":1,"86":1,"124":1}}],["0",{"2":{"1":14,"3":1,"21":1,"22":2,"24":1,"25":1,"26":1,"27":1,"31":54,"35":7,"38":8,"49":1,"52":22,"74":2,"86":73,"98":4,"99":4,"113":1,"117":4,"118":4,"122":8,"124":3,"125":6,"127":9}}],["42",{"2":{"21":1,"24":1,"26":1,"38":2,"86":3,"124":1}}],["4",{"2":{"1":12,"3":15,"21":1,"24":1,"26":1,"31":3,"38":14,"40":4,"43":2,"44":2,"45":2,"46":3,"47":3,"49":4,"54":18,"86":82,"122":1,"124":1,"125":4,"127":1}}],["3j+1",{"2":{"74":1}}],["3i+1",{"2":{"74":1}}],["3",{"2":{"1":17,"3":15,"21":2,"24":2,"26":2,"31":6,"35":4,"36":1,"38":33,"40":4,"43":2,"44":4,"45":6,"46":7,"47":3,"49":6,"54":26,"74":6,"86":125,"122":1,"124":3,"125":2,"127":1}}],["28",{"2":{"127":1}}],["225",{"2":{"86":1}}],["200",{"2":{"86":2,"104":1,"124":2}}],["2009",{"2":{"36":1,"86":1,"124":1}}],["2",{"2":{"1":15,"3":16,"21":2,"24":2,"26":2,"31":5,"35":3,"36":1,"38":40,"40":4,"43":2,"44":3,"45":4,"46":7,"47":3,"49":3,"52":10,"54":28,"74":2,"86":146,"122":1,"124":3,"125":2,"127":1}}],["101",{"0":{"64":1},"1":{"65":1,"66":1,"67":1}}],["10",{"2":{"38":27,"86":29,"87":1,"124":2,"127":2}}],["100",{"2":{"29":2,"86":4,"124":4,"127":1}}],["10000",{"2":{"127":1}}],["1000",{"2":{"29":1,"86":1,"124":1}}],["10^6",{"2":{"29":1,"86":1,"124":1}}],["123",{"2":{"21":1,"24":1,"26":1,"86":1,"124":1}}],["12",{"2":{"21":1,"24":1,"26":1,"54":1,"86":2,"124":1}}],["1",{"2":{"1":19,"3":17,"16":2,"21":2,"24":2,"26":2,"31":3,"35":6,"36":1,"38":34,"40":4,"43":2,"44":3,"45":4,"46":5,"47":3,"49":4,"52":15,"54":41,"74":5,"86":174,"108":1,"109":1,"113":4,"117":2,"122":8,"124":6,"125":2,"127":4}}],["=>",{"2":{"52":15,"86":15,"113":1}}],["=usual",{"2":{"36":1,"86":1,"124":1}}],["=0",{"2":{"31":1}}],["==",{"2":{"3":4,"22":1,"38":2,"49":1,"86":9,"109":1,"113":2,"124":1}}],["=",{"2":{"1":3,"3":12,"6":1,"16":2,"21":5,"22":4,"24":5,"25":4,"26":5,"27":4,"29":7,"31":11,"35":3,"36":3,"38":16,"40":1,"43":5,"44":3,"45":2,"46":2,"49":5,"52":16,"54":17,"74":1,"86":126,"87":1,"94":2,"100":1,"102":1,"104":12,"108":1,"109":3,"113":34,"119":5,"124":36,"125":35,"127":49}}],["epoch",{"2":{"127":1}}],["err",{"2":{"125":3}}],["error",{"2":{"33":2,"35":20,"36":3,"86":24,"104":1,"124":6,"125":4,"127":4}}],["eq",{"2":{"86":22,"117":12,"118":4,"119":6,"125":2}}],["equiped",{"2":{"31":1}}],["equilibrium",{"2":{"31":4}}],["equivalent",{"2":{"22":1,"25":1,"27":1,"86":1}}],["equality",{"2":{"125":1}}],["equalities",{"2":{"86":2,"119":2}}],["equal",{"2":{"1":8,"3":2,"31":1,"35":1,"38":1,"86":17,"117":3,"118":1,"119":1,"125":3}}],["euclidian",{"2":{"86":6,"98":3,"99":3}}],["editors",{"2":{"73":1}}],["edge",{"2":{"52":2,"86":2}}],["educational",{"2":{"20":1,"34":1}}],["either",{"2":{"21":1,"24":1,"26":1,"47":2,"54":4,"86":8,"87":1,"124":4}}],["efficiency",{"2":{"20":1,"88":1}}],["efficiently",{"2":{"12":1,"31":1,"125":1}}],["efficient",{"2":{"5":1,"77":1,"86":1}}],["embodies",{"2":{"20":1,"34":1,"86":2}}],["empty",{"2":{"104":2,"125":4,"127":11}}],["emptydomain",{"2":{"19":1,"21":2,"24":1,"26":1,"86":2,"124":1}}],["empowering",{"0":{"20":1}}],["emphasizes",{"2":{"5":1}}],["evaluation",{"2":{"104":1}}],["evaluates",{"2":{"35":1,"36":1,"86":2}}],["evaluated",{"2":{"33":1,"127":1}}],["eventually",{"2":{"49":2,"86":2}}],["even",{"2":{"31":1}}],["everuseful",{"2":{"16":1}}],["evolves",{"2":{"127":1}}],["evolve",{"2":{"19":1}}],["earlier",{"2":{"122":1}}],["easy",{"2":{"87":1,"123":1}}],["easier",{"2":{"36":1,"86":1}}],["ease",{"2":{"5":1,"20":1,"72":1}}],["eachrow",{"2":{"113":4}}],["each",{"2":{"3":2,"25":1,"27":1,"31":3,"35":1,"36":1,"49":2,"52":2,"69":1,"70":1,"74":5,"86":10,"106":1,"115":1,"124":2,"127":1}}],["else",{"2":{"113":4}}],["eltype",{"2":{"28":3,"86":3,"104":2}}],["eliminating",{"2":{"5":1}}],["elementary",{"0":{"40":1}}],["elements",{"2":{"5":1,"12":1,"19":2,"21":1,"31":1,"33":1,"86":18,"91":1,"102":1,"106":1,"117":8,"118":4,"124":2}}],["element",{"2":{"3":9,"86":9,"104":2,"122":1,"127":1}}],["e",{"2":{"5":1,"31":1,"35":4,"49":2,"52":4,"54":4,"80":1,"86":15,"103":1,"113":3,"124":1,"127":1}}],["exclu",{"2":{"86":3,"106":3}}],["exclusive",{"2":{"86":9,"92":1,"95":1,"100":1,"104":3,"106":7,"124":3}}],["excluded",{"2":{"86":1}}],["exclude",{"2":{"38":1,"86":1}}],["exceed",{"2":{"54":2,"86":2}}],["except",{"2":{"38":2,"86":2}}],["except=vals",{"2":{"36":2,"86":2,"124":1}}],["exact",{"2":{"89":4}}],["exactly",{"2":{"38":4,"86":4}}],["examine",{"2":{"33":1}}],["exampleusing",{"2":{"46":2,"86":2}}],["example2",{"2":{"46":2,"86":2}}],["example",{"2":{"6":1,"35":1,"36":8,"42":2,"44":1,"47":1,"73":1,"86":8,"122":1,"124":6}}],["examples",{"0":{"112":1},"1":{"113":1,"114":1},"2":{"1":3,"3":4,"35":2,"38":4,"40":1,"46":1,"49":1,"52":2,"54":2,"73":1,"86":22,"119":1,"121":1}}],["existing",{"2":{"36":2,"86":2,"87":1,"88":1}}],["exists",{"2":{"35":3,"74":1,"86":3}}],["ex",{"2":{"36":3,"86":3}}],["expansion",{"2":{"86":1}}],["export",{"2":{"86":1,"124":1,"127":1}}],["explicit",{"2":{"86":2}}],["explicitly",{"2":{"47":1,"86":2}}],["explanation",{"2":{"36":1,"80":1,"86":1}}],["explored",{"2":{"86":1,"124":1}}],["explore",{"2":{"29":4,"86":7,"124":4}}],["exploresettings",{"2":{"19":1,"29":1,"86":1,"124":1}}],["exploring",{"0":{"18":1,"68":1},"1":{"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"69":1},"2":{"20":1}}],["explorations",{"2":{"33":1}}],["exploration",{"0":{"29":1},"2":{"12":1,"19":4,"29":2,"30":1,"86":3,"124":1}}],["express",{"2":{"125":1}}],["expressions",{"2":{"106":1}}],["expression",{"2":{"36":7,"38":1,"42":1,"86":8}}],["expr",{"2":{"36":2,"86":2}}],["experimental",{"0":{"85":1},"2":{"85":1}}],["experiments",{"0":{"83":1},"1":{"84":1,"85":1},"2":{"85":1}}],["experience",{"2":{"5":1}}],["expect",{"2":{"75":1}}],["expectations",{"2":{"73":1}}],["expected",{"2":{"35":2,"36":1,"86":4,"124":3}}],["externally",{"2":{"127":1}}],["external",{"2":{"19":1,"86":1,"119":1}}],["extend",{"2":{"21":1,"28":1,"86":2,"123":1,"124":1}}],["extends",{"2":{"10":3,"22":7,"25":4,"27":4,"28":1,"30":2,"31":4,"86":7,"104":3}}],["extended",{"2":{"10":1,"86":19,"102":2,"117":10,"118":6,"124":2}}],["extensionally",{"2":{"47":1}}],["extensional",{"2":{"47":1}}],["extensions",{"0":{"10":1},"1":{"11":1}}],["extension",{"0":{"22":1,"25":1,"27":1,"47":1,"121":1},"2":{"5":1,"41":1,"86":8,"121":1}}],["extrema",{"0":{"14":1},"1":{"15":1},"2":{"14":3,"86":2,"104":1,"113":1,"124":2,"127":3}}],["extracts",{"2":{"6":1,"36":2,"86":2,"124":1}}],["extract",{"2":{"6":2,"36":1,"86":2,"124":2}}],["enumerate",{"2":{"113":1}}],["enforcing",{"2":{"86":2}}],["encode",{"2":{"104":1}}],["encoded",{"2":{"52":2,"86":2}}],["encoding",{"0":{"109":1},"2":{"86":5,"108":1,"109":4,"124":4}}],["encourage",{"2":{"62":1,"73":2}}],["encompass",{"2":{"46":1,"86":1}}],["encapsulate",{"2":{"86":1,"119":1,"127":2}}],["encapsulating",{"2":{"33":1}}],["encapsuler",{"2":{"24":1,"86":1}}],["entry",{"2":{"36":3,"86":3,"127":1}}],["energy",{"2":{"31":1}}],["enough",{"2":{"30":1,"86":1}}],["enhancement",{"2":{"33":1}}],["enhances",{"2":{"20":1,"34":1}}],["enhancing",{"2":{"5":2,"33":1}}],["enabling",{"0":{"34":1},"2":{"18":1}}],["enabled",{"2":{"127":1}}],["enable",{"2":{"5":1}}],["end``",{"2":{"127":1}}],["end",{"2":{"5":1,"8":2,"74":2,"86":2,"113":15,"125":6,"127":4}}],["ensure",{"2":{"74":1,"86":1,"108":1}}],["ensures",{"2":{"5":1,"33":1,"40":2,"43":2,"49":2,"52":2,"54":6,"74":1,"86":12}}],["ensuring",{"2":{"1":7,"5":2,"38":5,"46":2,"86":17,"104":3,"119":1,"125":9}}],["environment",{"0":{"73":1},"2":{"5":1}}],["etc",{"2":{"5":1}}],["ecosystem",{"2":{"4":1,"5":3,"18":1,"20":1,"32":1,"34":1,"73":1,"87":1}}],["especially",{"2":{"89":1}}],["essential",{"2":{"4":1,"19":1,"33":1}}],["establishes",{"2":{"3":2,"86":2}}],["x``or",{"2":{"104":1}}],["x̅",{"2":{"104":4}}],["xto",{"2":{"86":1,"103":1,"124":1}}],["xn",{"2":{"74":1}}],["x=x1",{"2":{"74":1}}],["x3",{"2":{"52":1,"86":1}}],["x3c",{"2":{"1":4,"8":3,"21":6,"22":9,"24":11,"25":8,"26":12,"27":8,"30":12,"31":3,"38":2,"52":1,"54":1,"86":48,"104":1,"113":2,"124":16,"125":29,"127":91}}],["x2",{"2":{"52":1,"86":1,"127":2}}],["x26",{"2":{"45":4,"46":4,"86":4}}],["x1",{"2":{"52":1,"86":1,"127":2}}],["x",{"2":{"1":23,"3":8,"12":2,"14":2,"22":10,"25":10,"27":10,"31":4,"35":7,"36":5,"38":28,"40":2,"42":2,"43":8,"44":4,"46":6,"47":1,"49":2,"52":6,"54":8,"74":6,"86":298,"87":2,"91":3,"94":4,"98":8,"99":7,"102":6,"103":10,"104":33,"109":8,"113":42,"117":76,"118":43,"124":33,"125":31,"127":68}}],["xcsp³",{"2":{"41":1}}],["xcsp3",{"0":{"36":1},"2":{"6":3,"8":1,"33":3,"36":1,"86":2,"124":1}}],["xcsp",{"2":{"1":3,"3":4,"33":1,"36":2,"38":4,"40":1,"43":1,"44":1,"46":1,"49":1,"52":2,"54":2,"86":21,"124":1}}],["csps",{"2":{"87":1}}],["cn",{"2":{"74":1}}],["c=c1",{"2":{"74":1}}],["c=usual",{"2":{"36":2,"86":2,"124":2}}],["clear",{"2":{"89":1}}],["classic",{"2":{"74":2}}],["closed",{"2":{"38":9,"86":9}}],["cblstodo",{"2":{"74":4}}],["cbls",{"0":{"125":1},"2":{"73":2,"74":3,"87":3,"89":3,"104":1,"125":31,"127":1}}],["circuit",{"2":{"49":12,"86":12}}],["cc",{"2":{"38":2,"86":2}}],["central",{"2":{"32":1}}],["certain",{"2":{"3":4,"54":2,"86":6}}],["cplex",{"2":{"87":1}}],["cp",{"0":{"67":1,"71":1,"74":1},"1":{"72":1,"73":1,"74":1},"2":{"32":2,"33":2,"34":2,"57":1,"59":1,"65":1,"73":1,"74":2,"75":1,"77":1,"85":1,"87":9,"88":4}}],["current",{"2":{"86":2,"106":1,"124":1,"127":1}}],["currently",{"2":{"22":2,"25":1,"27":1,"30":1,"86":1,"125":1}}],["cumulative",{"2":{"54":9,"86":9}}],["cut",{"2":{"31":1,"127":1}}],["case",{"0":{"59":1}}],["cast",{"2":{"35":1,"74":1,"86":1}}],["called",{"2":{"42":1,"47":1,"74":3,"86":1,"127":2}}],["calls",{"2":{"36":2,"86":2}}],["cardinality",{"2":{"38":20,"86":20}}],["care",{"2":{"36":1,"86":1,"124":1}}],["catch",{"2":{"113":1}}],["categorized",{"2":{"41":1}}],["categories",{"0":{"36":1}}],["cater",{"2":{"19":1}}],["catalog",{"2":{"33":1}}],["capacited",{"2":{"127":1}}],["capacity",{"2":{"127":1}}],["capacities",{"2":{"31":1}}],["capabilities",{"2":{"34":1}}],["capability",{"2":{"33":1}}],["can",{"2":{"5":3,"21":1,"33":1,"38":3,"52":1,"62":1,"73":1,"74":3,"75":1,"86":10,"89":1,"106":5,"109":1,"119":1,"124":3,"125":2,"127":1}}],["creation",{"2":{"33":1,"86":1,"119":1}}],["created",{"2":{"127":1}}],["creates",{"2":{"36":1,"86":1}}],["create",{"2":{"31":4,"35":1,"86":2,"124":1,"125":1}}],["critical",{"2":{"5":1,"18":1}}],["crucial",{"2":{"5":1,"19":1,"33":1}}],["choose",{"2":{"127":1}}],["choice",{"2":{"73":1}}],["chuffed",{"2":{"87":1}}],["chemical",{"2":{"31":3}}],["checks",{"2":{"35":2,"36":2,"46":1,"52":1,"86":6}}],["checking",{"2":{"19":1}}],["check",{"2":{"1":3,"3":8,"8":1,"22":1,"25":1,"27":1,"35":1,"38":7,"40":2,"43":1,"49":1,"52":2,"54":1,"74":1,"86":27,"100":1,"102":1,"106":1,"109":1,"124":1,"127":10}}],["chains",{"2":{"88":1}}],["chapter",{"2":{"75":1}}],["characteristics",{"2":{"19":1}}],["change",{"2":{"31":2}}],["changes",{"2":{"19":1,"24":1,"26":1,"31":1,"86":2,"89":1,"124":1}}],["channel",{"2":{"3":9,"86":9}}],["c",{"2":{"1":14,"3":15,"22":1,"25":1,"27":1,"35":16,"36":8,"38":19,"40":2,"44":3,"45":4,"46":6,"49":4,"52":10,"54":11,"86":116,"124":24,"127":31}}],["copy",{"2":{"125":5}}],["cops",{"2":{"87":1}}],["cosntriction",{"2":{"127":1}}],["cosntraints",{"0":{"50":1},"2":{"127":1}}],["cost",{"2":{"127":19}}],["costs",{"2":{"88":1,"127":20}}],["covering",{"2":{"84":1}}],["cover",{"2":{"82":1,"123":1}}],["could",{"2":{"42":1,"47":1}}],["count",{"2":{"38":6,"86":95,"91":3,"117":40,"118":20,"119":21}}],["counting",{"0":{"38":1},"2":{"86":1,"119":1}}],["counter",{"2":{"16":2,"86":2,"124":2,"127":1}}],["co",{"2":{"38":2,"86":11,"98":5,"99":4}}],["coefficients",{"2":{"38":1,"86":1}}],["coeffs",{"2":{"38":2,"86":2}}],["columns",{"2":{"74":1}}],["column",{"2":{"74":1}}],["collect",{"2":{"113":1}}],["collections",{"2":{"14":2,"86":1,"124":1}}],["collection",{"2":{"5":1,"16":1,"22":2,"24":1,"25":1,"27":1,"29":2,"30":1,"42":1,"43":1,"44":1,"74":4,"86":8,"87":1,"103":1,"104":3,"106":1,"124":5,"125":2,"127":5}}],["collaborate",{"2":{"62":1}}],["col",{"2":{"31":1}}],["coordinates",{"2":{"31":1}}],["core",{"0":{"36":1},"2":{"6":2,"8":1,"33":4,"36":1,"41":1,"86":2,"124":1}}],["corresponding",{"2":{"31":1,"86":1,"119":1}}],["corresponds",{"2":{"3":2,"86":2}}],["correspondence",{"2":{"3":2,"86":2}}],["code",{"2":{"5":1,"73":1,"86":5,"124":3}}],["come",{"2":{"125":1}}],["combinatorial",{"2":{"65":1,"88":1,"106":1}}],["command",{"2":{"73":1}}],["community",{"0":{"61":1,"62":1},"1":{"62":1,"63":1},"2":{"62":1}}],["commitment",{"2":{"34":1}}],["commons",{"0":{"21":1},"1":{"22":1,"23":1}}],["common",{"2":{"5":1,"87":1}}],["compile",{"2":{"86":1,"119":1}}],["compliance",{"2":{"52":2,"86":2}}],["complex",{"2":{"20":1,"32":1,"33":1,"47":1,"56":1,"88":2,"89":1}}],["complexity",{"2":{"5":1,"84":1}}],["completely",{"2":{"86":1,"124":1}}],["completed",{"2":{"5":1,"74":1}}],["complete",{"2":{"5":1,"19":1,"29":2,"86":6,"124":5}}],["components",{"2":{"33":1,"86":2,"102":2,"124":2}}],["compounds",{"2":{"31":1}}],["compositions",{"2":{"86":1}}],["compositionalneworks",{"2":{"102":1}}],["compositionalnetworks",{"0":{"101":1},"1":{"102":1,"103":1},"2":{"5":1,"86":77,"91":2,"92":1,"94":2,"95":1,"98":5,"99":4,"100":1,"101":1,"102":6,"103":4,"104":3,"106":11,"117":11,"118":6,"119":2,"124":26}}],["compositional",{"2":{"86":1,"106":1,"124":1}}],["composition",{"2":{"86":24,"102":1,"124":21}}],["compose",{"2":{"74":1,"86":12,"106":1,"124":8}}],["composed",{"2":{"29":1,"86":3,"124":3}}],["comprehensive",{"2":{"20":1,"34":1,"86":2}}],["computational",{"2":{"19":1,"72":1}}],["computes",{"2":{"127":1}}],["computed",{"2":{"86":17,"117":10,"118":6}}],["compute",{"2":{"14":2,"24":2,"26":1,"31":1,"86":7,"98":1,"99":1,"103":1,"104":1,"109":1,"124":4,"125":1,"127":17}}],["compatible",{"2":{"5":1}}],["compare",{"2":{"1":1,"35":1,"86":2}}],["comparisons",{"0":{"97":1},"1":{"98":1,"99":1,"100":1},"2":{"86":2,"100":1,"119":2}}],["comparison",{"0":{"1":1,"96":1},"1":{"97":1,"98":1,"99":1,"100":1},"2":{"1":1,"38":1,"86":9,"96":1,"97":1,"98":1,"100":2,"119":1,"124":5}}],["cohesive",{"2":{"5":1}}],["conflict",{"2":{"86":1}}],["conflicted",{"2":{"86":3}}],["conflicts",{"2":{"86":8}}],["conflicts=nothing",{"2":{"86":1}}],["configuration",{"2":{"31":2,"86":8,"104":4,"124":2,"125":1,"127":3}}],["configurations",{"2":{"12":1,"29":2,"86":7,"104":1,"124":3,"127":1}}],["configure",{"2":{"19":1}}],["conduct",{"2":{"85":1}}],["conditions",{"2":{"86":1,"88":1,"119":1,"127":1}}],["condition",{"2":{"3":13,"38":15,"54":3,"86":31}}],["concerned",{"2":{"88":2}}],["concentrations",{"2":{"31":2}}],["concepts",{"0":{"66":1},"2":{"66":1,"81":1}}],["concept",{"2":{"1":10,"3":8,"29":3,"33":2,"35":19,"36":18,"38":15,"40":2,"43":1,"44":1,"45":2,"46":3,"49":2,"52":4,"54":6,"86":95,"124":20,"125":5}}],["convert",{"2":{"21":1,"28":3,"86":7,"102":2,"106":1,"124":1}}],["containing",{"2":{"127":1}}],["container",{"2":{"86":1,"106":1,"125":1}}],["contains",{"2":{"35":1,"36":2,"74":1,"86":4,"106":1,"124":2}}],["content",{"2":{"75":1}}],["contexts",{"2":{"33":1}}],["context",{"2":{"21":1,"86":1,"106":2,"124":1}}],["contraints",{"2":{"127":2}}],["contrast",{"2":{"67":1,"89":1}}],["contribute",{"2":{"62":1}}],["contribution",{"0":{"61":1},"1":{"62":1,"63":1}}],["contiguous",{"2":{"86":12,"117":8,"119":4}}],["contiuous",{"2":{"24":1,"26":1,"86":1,"124":1}}],["continuousdomain",{"2":{"19":1,"24":2,"86":2,"124":1}}],["continuous",{"0":{"24":1},"1":{"25":1},"2":{"18":1,"19":2,"21":2,"24":2,"26":1,"31":1,"86":3,"124":3}}],["connecting",{"2":{"10":1,"86":1}}],["connection",{"0":{"3":1}}],["connector",{"2":{"10":1,"86":1}}],["cons=dictionary",{"2":{"127":1}}],["cons",{"2":{"127":31}}],["considered",{"2":{"38":2,"86":2,"127":1}}],["considers",{"2":{"8":1}}],["consistent",{"2":{"36":1,"86":1}}],["constriction",{"2":{"127":4}}],["constrained",{"2":{"127":2}}],["constrains",{"2":{"127":1}}],["constraintprogrammingextensions",{"2":{"87":1}}],["constraintmodels",{"0":{"31":1},"2":{"31":15,"87":1}}],["constrainttranslator",{"2":{"5":1}}],["constraintlearning",{"0":{"104":1},"2":{"5":1,"104":27,"122":1}}],["constraintdomains",{"0":{"18":1},"1":{"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1},"2":{"5":1,"18":1,"19":3,"20":2,"21":6,"24":8,"26":10,"29":3,"30":11,"86":35,"87":1,"124":18}}],["constraintcommons",{"0":{"4":1},"1":{"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1},"2":{"4":1,"5":4,"6":3,"8":6,"12":1,"14":1,"16":1,"30":2,"36":2,"86":15,"124":9}}],["constraint",{"0":{"0":1,"2":1,"20":1,"32":1,"34":1,"37":1,"39":1,"43":1,"48":1,"51":1,"53":1,"55":1,"64":1,"65":1,"88":1,"89":1,"114":1},"1":{"1":1,"3":1,"33":1,"34":1,"35":1,"36":1,"38":1,"40":1,"49":1,"52":1,"54":1,"56":1,"57":1,"65":1,"66":1,"67":1},"2":{"1":7,"3":24,"4":1,"5":3,"6":9,"12":1,"18":2,"19":1,"20":2,"22":3,"25":3,"27":3,"29":2,"32":1,"33":10,"34":2,"35":17,"36":24,"38":20,"40":7,"42":5,"43":5,"44":4,"46":4,"47":3,"49":7,"52":6,"54":20,"74":7,"75":1,"86":156,"87":5,"88":1,"89":5,"104":4,"106":1,"108":1,"119":3,"124":39,"125":29,"127":33}}],["constraintsolver",{"2":{"87":1}}],["constraints",{"0":{"0":1,"1":1,"2":1,"3":1,"32":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"47":1,"48":1,"49":1,"51":1,"52":1,"53":1,"54":1,"56":1,"75":1,"105":1},"1":{"1":1,"3":1,"33":1,"34":1,"35":1,"36":1,"38":1,"40":1,"42":1,"43":2,"44":2,"45":2,"46":2,"47":1,"49":1,"52":1,"54":1},"2":{"1":3,"3":4,"4":1,"5":1,"6":9,"8":3,"18":1,"32":3,"33":17,"34":5,"35":12,"36":38,"38":4,"40":1,"41":2,"42":3,"43":3,"44":2,"46":3,"47":2,"49":1,"50":1,"52":2,"54":2,"56":1,"66":1,"73":1,"74":2,"86":75,"87":4,"88":3,"89":2,"104":1,"105":1,"111":1,"124":40,"127":20}}],["constructor",{"2":{"31":1,"104":3,"125":1,"127":1}}],["constructing",{"2":{"31":1}}],["construct",{"2":{"21":3,"24":3,"26":3,"30":1,"31":3,"86":6,"124":5,"127":3}}],["constant",{"2":{"6":1,"35":1,"36":1,"86":3,"124":2}}],["o",{"2":{"104":1,"127":16}}],["objs=dictionary",{"2":{"127":1}}],["objs",{"2":{"127":7}}],["objectives",{"2":{"127":10}}],["objective",{"2":{"74":1,"125":4,"127":24}}],["observable",{"2":{"31":1}}],["own",{"2":{"73":1,"74":1,"127":1}}],["occurs",{"2":{"38":2,"86":2}}],["occurrences",{"2":{"38":7,"86":7}}],["others",{"2":{"87":1}}],["other",{"0":{"67":1},"2":{"31":1,"67":1,"73":1,"74":4,"87":1,"88":1,"89":2,"127":2}}],["otherwise",{"2":{"1":3,"3":4,"8":1,"22":1,"25":1,"27":1,"30":1,"35":3,"38":4,"40":1,"49":1,"54":2,"86":28,"98":2,"99":2,"117":2,"118":2,"124":3,"127":1}}],["oversampling",{"2":{"104":1,"113":6}}],["oversample",{"2":{"12":2,"86":2,"113":1,"124":2}}],["overview",{"0":{"81":1},"2":{"75":1}}],["overviews",{"0":{"69":1}}],["overlap",{"2":{"54":21,"86":21}}],["over",{"2":{"14":1,"29":1,"33":1,"35":1,"36":1,"46":2,"74":2,"86":7,"103":1,"104":1,"124":4,"125":1,"127":1}}],["ouput",{"2":{"104":1}}],["output",{"2":{"86":2,"124":2}}],["outputs",{"2":{"35":1,"86":1,"122":3,"124":1}}],["out",{"2":{"74":1}}],["outlined",{"2":{"33":1}}],["outcomes",{"2":{"5":1}}],["our",{"2":{"12":1,"74":2}}],["ongoing",{"2":{"54":2,"86":2}}],["only",{"2":{"38":1,"74":1,"86":6,"92":1,"95":1,"100":1,"106":2,"111":1,"124":3,"125":2,"127":1}}],["on",{"0":{"36":1,"49":1,"84":1},"2":{"5":2,"6":2,"18":1,"19":1,"21":1,"29":1,"30":1,"31":1,"35":1,"36":3,"40":2,"42":1,"43":2,"46":1,"57":1,"73":1,"86":14,"87":1,"88":3,"104":3,"109":1,"115":1,"119":2,"121":1,"124":4,"125":2,"127":2}}],["once",{"2":{"5":2,"73":1}}],["one",{"2":{"5":1,"30":1,"33":1,"36":1,"74":3,"86":14,"92":1,"95":1,"100":1,"102":2,"104":2,"106":2,"108":1,"109":4,"113":1,"124":10,"127":3}}],["originating",{"2":{"86":1}}],["origins",{"2":{"54":6,"86":6}}],["oriented",{"2":{"4":1}}],["org",{"2":{"36":1,"86":1,"124":1}}],["organizations",{"2":{"88":1}}],["organization",{"2":{"33":1,"69":1,"75":1}}],["or",{"2":{"5":1,"6":1,"10":1,"16":1,"19":4,"20":1,"21":2,"22":2,"24":1,"25":2,"26":1,"27":2,"31":1,"34":1,"35":1,"36":2,"38":1,"42":1,"47":2,"54":4,"63":1,"73":1,"74":1,"86":25,"87":2,"88":4,"89":2,"106":1,"109":1,"119":5,"122":3,"124":8,"127":6}}],["order",{"2":{"1":6,"31":1,"40":2,"86":9,"119":1,"125":2}}],["ordered",{"2":{"1":6,"86":8,"106":1,"125":3,"127":1}}],["opt",{"2":{"125":1}}],["optmizers",{"2":{"104":1}}],["optimisation",{"2":{"87":1}}],["optimizing",{"2":{"88":1,"127":7}}],["optimization",{"0":{"57":1,"58":1,"67":1,"71":1,"79":1,"80":1},"1":{"59":1,"60":1,"72":1,"73":1,"74":1,"80":1,"81":1,"82":1},"2":{"33":1,"59":1,"60":1,"72":1,"75":1,"77":1,"80":2,"82":1,"88":2,"127":2}}],["optimizers",{"0":{"112":1},"1":{"113":1,"114":1},"2":{"104":1}}],["optimizer",{"2":{"74":1,"87":1,"104":6,"113":8,"125":17,"127":3}}],["optimize",{"2":{"31":1,"86":1,"88":1,"104":11,"124":1,"125":3}}],["optionally",{"2":{"35":2,"36":1,"86":2,"124":2}}],["optional",{"2":{"29":1,"31":1,"86":10,"104":1,"109":1,"124":10,"127":2}}],["options",{"2":{"19":1,"104":2,"125":4,"127":32}}],["open",{"2":{"38":6,"86":6,"115":1}}],["operate",{"2":{"86":1,"119":1}}],["operational",{"0":{"88":1},"2":{"88":1}}],["operation",{"2":{"86":4,"104":2,"106":4}}],["operations",{"0":{"94":1},"2":{"10":1,"25":2,"27":2,"86":21,"92":1,"95":2,"100":1,"103":1,"104":3,"106":13,"119":1,"124":7}}],["operators",{"2":{"30":1,"86":1}}],["operator",{"2":{"1":3,"38":1,"86":4}}],["opparameterdomain",{"2":{"30":1,"86":1}}],["op",{"2":{"3":8,"6":1,"38":10,"49":4,"54":4,"86":28,"106":1}}],["op==",{"2":{"38":1,"86":1}}],["op===",{"2":{"3":2,"38":4,"86":6}}],["op=>",{"2":{"1":2,"86":2}}],["op=≥",{"2":{"1":2,"38":1,"86":3}}],["op=≤",{"2":{"1":6,"38":3,"86":9}}],["op=",{"2":{"1":6,"86":6}}],["op=+",{"2":{"1":2,"86":2}}],["official",{"2":{"73":1}}],["offer",{"2":{"33":1}}],["offering",{"2":{"20":1,"33":1,"34":1}}],["offers",{"2":{"5":1,"19":1,"34":1}}],["often",{"2":{"49":2,"54":6,"86":8,"88":1}}],["of",{"0":{"91":1,"94":1,"97":1,"116":1},"1":{"98":1,"99":1,"100":1,"117":1,"118":1,"119":1},"2":{"1":14,"3":17,"4":1,"5":9,"6":6,"8":3,"12":2,"14":4,"18":3,"19":8,"20":4,"21":3,"22":5,"24":7,"25":10,"26":7,"27":11,"29":14,"30":2,"31":33,"32":1,"33":13,"34":1,"35":18,"36":23,"38":35,"40":6,"46":3,"47":4,"49":8,"52":10,"54":14,"60":1,"63":1,"72":2,"73":1,"74":11,"75":2,"78":1,"80":2,"82":1,"85":1,"86":292,"87":7,"88":2,"89":4,"91":2,"92":2,"95":2,"98":4,"99":1,"100":2,"102":6,"103":3,"104":14,"106":18,"109":3,"115":3,"117":13,"118":4,"119":8,"122":2,"124":96,"125":16,"127":78}}],["f2",{"2":{"127":2}}],["fetch",{"2":{"127":1}}],["few",{"2":{"123":1}}],["feasible",{"2":{"74":2,"89":1}}],["features",{"0":{"5":1,"19":1,"33":1,"108":1},"2":{"33":1,"69":1}}],["feature",{"2":{"4":1,"19":1,"33":1}}],["front",{"2":{"115":1}}],["from",{"0":{"52":1,"60":1,"67":1},"2":{"22":4,"25":2,"27":3,"30":2,"31":2,"33":2,"36":1,"46":1,"52":1,"60":1,"74":2,"75":1,"86":14,"88":1,"104":1,"111":1,"119":2,"124":2,"127":17}}],["framework",{"2":{"87":1}}],["friendly",{"2":{"34":1}}],["free",{"2":{"31":1}}],["finds",{"2":{"122":1}}],["find",{"2":{"89":5,"127":2}}],["finding",{"2":{"87":1,"88":1,"89":2}}],["finishes",{"2":{"54":8,"86":8}}],["finish",{"2":{"52":2,"86":2}}],["filter",{"2":{"113":1}}],["file",{"2":{"86":7,"106":1,"124":7}}],["filled",{"2":{"74":1}}],["fill",{"2":{"31":4,"74":1}}],["fields",{"2":{"35":1,"86":1,"124":1}}],["first",{"0":{"74":1},"2":{"3":2,"35":1,"36":3,"52":1,"54":8,"74":1,"86":15,"104":1,"113":4,"122":1,"127":1}}],["flatten",{"2":{"113":1}}],["flaw",{"2":{"31":1}}],["flexibility",{"2":{"33":2,"73":1}}],["flexible",{"2":{"19":1,"29":2,"33":1,"34":1,"47":1,"86":5,"119":1,"124":3}}],["float64",{"2":{"35":2,"86":2,"113":1,"125":1,"127":5}}],["flows",{"2":{"31":1}}],["flow",{"2":{"31":1}}],["floor",{"2":{"29":1,"86":1,"124":1}}],["f",{"2":{"8":1,"12":2,"33":1,"35":3,"86":16,"102":6,"124":14,"125":20,"127":7}}],["full",{"0":{"86":1}}],["further",{"2":{"31":1,"73":1}}],["future",{"0":{"63":1},"2":{"6":1,"29":1,"86":1,"124":1}}],["func",{"2":{"127":6}}],["funcs",{"2":{"86":2,"102":2,"124":2}}],["functionality",{"2":{"5":1}}],["functionalities",{"0":{"5":1,"19":1,"33":1},"2":{"5":1,"19":1,"20":1,"33":1}}],["functions",{"2":{"4":1,"5":2,"19":1,"31":1,"35":2,"86":8,"100":1,"106":3,"119":4,"124":2}}],["function",{"2":{"1":3,"3":4,"6":2,"8":2,"10":1,"12":2,"14":1,"16":2,"21":4,"22":5,"24":6,"25":4,"26":7,"27":5,"28":2,"29":3,"30":4,"31":1,"33":2,"35":29,"36":14,"38":4,"40":1,"42":1,"46":2,"49":1,"52":3,"54":2,"74":1,"86":67,"91":2,"92":1,"94":2,"95":1,"98":6,"99":4,"100":1,"102":12,"103":4,"104":4,"106":10,"108":2,"109":3,"111":1,"113":7,"115":1,"117":12,"118":6,"119":6,"122":1,"124":30,"125":14,"127":16}}],["fundamentals",{"2":{"82":1}}],["fundamental",{"2":{"5":1,"46":1,"86":1}}],["found",{"2":{"106":1}}],["foundation",{"2":{"19":1}}],["foundational",{"2":{"4":1,"5":1}}],["fold",{"2":{"87":1}}],["following",{"2":{"21":1,"33":1,"35":1,"38":1,"86":8,"102":2,"109":1,"119":1,"124":6,"127":1}}],["follows",{"2":{"12":1,"74":1,"125":2}}],["follow",{"2":{"6":1}}],["focuses",{"2":{"87":1,"88":2}}],["focusing",{"2":{"18":1}}],["fostering",{"2":{"5":1}}],["forbidden",{"2":{"31":1,"86":1}}],["forwarded",{"2":{"127":1}}],["forward",{"2":{"31":2,"74":1}}],["formal",{"2":{"127":1}}],["formated",{"2":{"86":1,"124":1}}],["formatted",{"2":{"86":1,"102":1}}],["format",{"2":{"6":1,"21":1,"31":9,"86":2,"109":1,"124":2}}],["formulating",{"2":{"60":1}}],["formulation",{"2":{"19":1}}],["form",{"2":{"49":2,"86":2}}],["forseeable",{"2":{"6":1}}],["for",{"0":{"45":1,"71":1,"106":1,"109":1},"1":{"72":1,"73":1,"74":1},"2":{"3":4,"5":5,"6":1,"8":5,"10":1,"16":1,"18":1,"19":13,"20":3,"21":3,"22":3,"24":2,"25":3,"26":2,"27":3,"28":2,"29":1,"30":2,"31":13,"32":1,"33":6,"34":4,"35":5,"36":4,"42":1,"43":1,"44":1,"47":1,"54":6,"63":1,"70":1,"72":1,"73":3,"74":2,"77":1,"86":53,"87":5,"88":1,"89":3,"98":1,"100":2,"101":1,"102":4,"104":8,"106":2,"108":1,"109":2,"111":1,"113":2,"117":1,"119":5,"120":1,"122":1,"124":12,"125":4,"127":18}}],["faster",{"2":{"127":1}}],["facilities",{"2":{"31":6}}],["facilitating",{"2":{"19":1,"34":1}}],["facilitates",{"2":{"5":1,"19":1,"86":1,"119":1}}],["facilitate",{"2":{"4":1,"32":1}}],["fake",{"2":{"30":1,"86":1}}],["fakeautomaton",{"2":{"8":2,"19":1,"22":2,"25":1,"27":1,"30":5,"86":5}}],["fallback",{"2":{"21":1,"22":2,"24":1,"25":2,"26":1,"27":2,"86":4,"124":1}}],["false",{"2":{"1":3,"3":10,"8":1,"10":1,"12":1,"22":3,"25":3,"27":3,"30":1,"35":3,"36":1,"38":4,"40":1,"44":1,"49":1,"54":2,"86":32,"100":1,"113":3,"119":1,"124":5,"127":2}}],["fa",{"2":{"8":1,"22":4,"25":2,"27":2,"30":3,"86":3}}],["vov",{"2":{"125":2}}],["v",{"2":{"86":3,"102":3,"122":7,"124":2,"125":4,"127":3}}],["vs",{"0":{"88":1},"2":{"35":3,"86":3}}],["vi",{"2":{"125":1}}],["viable",{"2":{"86":6,"106":5,"124":1}}],["visual",{"2":{"73":1}}],["vision",{"2":{"63":1}}],["vital",{"2":{"33":1}}],["vice",{"2":{"3":2,"86":3,"119":1}}],["vec",{"2":{"74":1}}],["vectorofvariables",{"2":{"125":1}}],["vectors",{"2":{"86":3,"94":2,"117":1}}],["vector",{"2":{"1":6,"6":2,"8":1,"21":1,"22":4,"24":4,"25":3,"26":1,"27":3,"29":1,"30":1,"36":2,"38":9,"46":1,"52":2,"86":59,"91":1,"94":2,"102":2,"109":2,"113":5,"117":10,"118":6,"122":2,"124":10,"125":2,"127":1}}],["verbose",{"2":{"127":4}}],["verbosity",{"2":{"127":1}}],["very",{"2":{"88":1}}],["verifies",{"2":{"52":2,"86":2}}],["versionnumber",{"2":{"122":1}}],["versions",{"2":{"122":3}}],["version",{"2":{"36":1,"73":1,"86":2,"119":1,"122":3}}],["versatile",{"2":{"86":2}}],["versatility",{"2":{"20":1}}],["versa",{"2":{"3":2,"86":3,"119":1}}],["var",{"2":{"127":12}}],["variety",{"2":{"89":1}}],["various",{"0":{"112":1},"1":{"113":1,"114":1},"2":{"14":1,"19":1,"21":1,"33":1,"57":1,"73":1,"84":1,"86":2,"89":1,"119":1,"124":1}}],["variant",{"2":{"54":2,"86":2}}],["variants",{"2":{"1":3,"3":4,"38":4,"40":1,"46":1,"49":1,"52":2,"54":2,"74":1,"86":19}}],["variableinfo",{"2":{"125":1}}],["variable",{"0":{"18":1},"1":{"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1},"2":{"3":6,"18":1,"19":1,"20":1,"22":3,"25":3,"27":3,"33":1,"35":1,"42":2,"47":2,"74":2,"86":9,"124":2,"125":4,"127":40}}],["variables",{"2":{"3":8,"30":1,"38":8,"40":2,"46":1,"47":1,"49":2,"52":1,"66":1,"74":3,"86":32,"87":1,"98":3,"103":1,"108":2,"124":4,"125":5,"127":26}}],["vars",{"2":{"6":1,"40":2,"54":15,"86":42,"98":6,"125":2,"127":24}}],["vars=dictionary",{"2":{"127":1}}],["vars=ones",{"2":{"38":2,"86":2}}],["vars=nothing",{"2":{"1":10,"86":10}}],["vars=",{"2":{"1":4,"40":2,"86":11}}],["vars=zeros",{"2":{"1":2,"86":2}}],["valparameterdomain",{"2":{"30":1,"86":1}}],["validity",{"2":{"46":1,"86":1}}],["valid",{"2":{"21":1,"52":1,"86":10,"88":2,"108":2,"109":3,"124":5}}],["val=3",{"2":{"38":1,"86":1}}],["val=2",{"2":{"3":1,"38":3,"86":4}}],["val=15",{"2":{"38":2,"86":2}}],["val=1",{"2":{"1":2,"3":1,"38":1,"86":4}}],["val=nothing",{"2":{"1":2,"3":2,"86":4}}],["valued",{"2":{"52":1,"86":1}}],["value",{"2":{"1":1,"3":13,"22":8,"25":7,"26":2,"27":10,"30":2,"31":1,"35":3,"36":5,"38":5,"49":4,"52":3,"74":3,"86":58,"100":2,"106":1,"109":1,"119":8,"124":13,"125":6,"127":20}}],["values",{"2":{"1":13,"3":4,"21":2,"24":2,"26":4,"30":3,"31":4,"35":2,"36":1,"38":24,"40":6,"47":2,"49":3,"52":2,"74":2,"86":66,"119":5,"124":4,"125":6,"127":11}}],["val",{"0":{"99":1,"118":1},"2":{"1":3,"3":8,"6":1,"16":2,"21":1,"31":4,"38":21,"49":4,"54":6,"86":74,"98":6,"99":6,"118":8,"119":8,"124":3,"127":8}}],["valsparameterdomain",{"2":{"30":1,"86":1}}],["vals=nothing",{"2":{"36":2,"86":2,"124":1}}],["vals=",{"2":{"1":2,"38":13,"86":15}}],["vals",{"2":{"1":2,"6":1,"38":18,"86":31,"117":8,"119":2}}],["tbw",{"2":{"104":4}}],["typically",{"2":{"88":1}}],["typeof",{"2":{"125":6}}],["typemax",{"2":{"113":1,"127":1}}],["type",{"2":{"8":4,"19":2,"21":6,"24":2,"26":5,"28":1,"29":1,"30":9,"31":7,"33":1,"35":1,"86":34,"89":2,"104":7,"106":1,"111":2,"119":1,"124":13,"125":32,"127":17}}],["types",{"2":{"4":1,"5":2,"19":3,"41":1,"47":1,"80":1,"86":2,"119":2,"127":8}}],["tutorials",{"0":{"83":1,"84":1},"1":{"84":1,"85":1},"2":{"84":1}}],["tuples",{"2":{"47":2,"86":6}}],["tuple",{"2":{"3":7,"21":5,"24":5,"26":5,"31":2,"54":1,"86":17,"124":5}}],["tips",{"2":{"77":1}}],["timelimitsec",{"2":{"125":1}}],["timestamps",{"2":{"127":1}}],["times",{"2":{"38":3,"86":3}}],["time",{"2":{"31":2,"54":8,"86":10,"89":1,"106":2,"119":1,"125":1,"127":27}}],["temporary",{"2":{"127":1}}],["terminationstatuscode",{"2":{"125":1}}],["terminology",{"0":{"66":1}}],["text",{"2":{"90":1,"93":1,"96":1,"115":1}}],["teach",{"2":{"78":1}}],["techniques",{"0":{"55":1,"67":1},"1":{"56":1,"57":1},"2":{"88":2,"89":2}}],["test",{"0":{"45":1},"2":{"104":2,"113":6}}],["testing",{"2":{"35":1,"86":1,"104":1,"125":1}}],["tendency",{"2":{"31":1}}],["tabu",{"2":{"81":1,"127":46}}],["table",{"2":{"36":4,"86":4,"113":1,"124":4}}],["task",{"2":{"54":16,"86":16}}],["tasks",{"2":{"54":18,"86":18,"127":1}}],["take",{"2":{"36":1,"74":1,"86":1,"89":1,"124":1}}],["takes",{"2":{"35":1,"36":1,"40":2,"86":4}}],["targeted",{"2":{"29":1,"73":1,"86":2,"124":2,"127":3}}],["tailoring",{"2":{"19":1,"33":1}}],["t",{"2":{"8":2,"21":8,"24":11,"26":14,"30":5,"31":10,"35":1,"36":2,"52":2,"86":29,"124":12,"125":12,"127":7}}],["tries",{"2":{"89":1}}],["tr",{"2":{"86":58,"102":3,"117":33,"118":18}}],["try",{"2":{"73":1,"89":1,"113":1}}],["train",{"2":{"86":3,"104":2,"111":3,"113":5,"124":2}}],["training",{"2":{"86":1,"104":7,"124":1}}],["traditional",{"2":{"33":1}}],["transpose",{"2":{"113":3}}],["transportation",{"2":{"88":1}}],["transported",{"2":{"31":1}}],["transform",{"2":{"86":1,"109":1,"124":1}}],["transforms",{"2":{"86":4,"119":4}}],["transformations",{"0":{"115":1,"116":1},"1":{"116":1,"117":2,"118":2,"119":2},"2":{"86":16,"100":1,"116":1,"119":15,"124":3}}],["transformation",{"2":{"86":12,"115":3,"119":8,"124":4}}],["transition",{"2":{"5":2}}],["true",{"2":{"1":3,"3":6,"8":3,"10":1,"12":1,"22":3,"25":2,"27":2,"30":1,"35":2,"36":1,"38":4,"40":1,"44":1,"45":2,"49":1,"54":2,"86":29,"104":1,"106":1,"119":1,"124":4,"125":2,"127":3}}],["two",{"2":{"3":2,"8":1,"21":1,"24":3,"26":3,"31":1,"36":1,"41":1,"46":1,"47":1,"54":4,"86":11,"87":1,"124":3,"125":1}}],["th",{"2":{"86":1,"106":1}}],["threads",{"2":{"127":8}}],["threshold",{"2":{"86":1,"119":1}}],["throw",{"2":{"113":1}}],["through",{"2":{"33":1,"42":3,"44":2,"60":1,"73":3,"86":3,"91":1,"94":2,"104":2}}],["than",{"2":{"35":1,"36":1,"42":1,"86":11,"117":5,"118":2,"119":1,"125":2}}],["that",{"2":{"1":7,"3":14,"4":1,"5":6,"6":1,"18":1,"21":2,"22":2,"24":1,"25":2,"26":3,"27":2,"29":1,"31":2,"33":1,"35":11,"36":2,"38":11,"40":4,"42":4,"43":2,"44":1,"46":2,"47":4,"49":2,"52":5,"54":12,"73":1,"74":6,"75":1,"86":101,"87":3,"88":4,"89":5,"92":1,"95":1,"100":2,"102":2,"103":1,"104":3,"106":3,"108":1,"119":3,"124":16,"125":11,"127":10}}],["those",{"2":{"33":1,"106":1}}],["thus",{"2":{"31":1}}],["this",{"2":{"3":2,"5":3,"6":1,"18":1,"19":1,"20":1,"29":1,"31":1,"32":1,"33":3,"35":1,"36":4,"43":1,"46":1,"52":2,"54":2,"74":2,"86":17,"106":2,"119":1,"121":1,"123":1,"124":2,"127":3}}],["third",{"2":{"3":2,"86":2}}],["theory",{"0":{"60":1}}],["them",{"2":{"46":1,"86":1,"87":1,"127":1}}],["they",{"2":{"31":1,"42":3,"47":3,"56":1,"62":1,"87":1,"88":1,"89":1}}],["there",{"2":{"31":3,"36":1,"52":1,"86":2}}],["thereby",{"2":{"5":1,"18":1}}],["then",{"2":{"29":1,"36":2,"43":1,"86":3,"124":1,"127":2}}],["these",{"2":{"19":1,"33":3,"36":1,"42":1,"47":2,"86":1,"89":1}}],["their",{"0":{"56":1},"2":{"5":1,"33":1,"57":1,"73":1,"74":1,"86":1,"119":1}}],["the",{"0":{"62":1},"2":{"1":10,"3":25,"4":2,"5":19,"6":10,"8":2,"10":3,"12":1,"14":5,"16":2,"18":4,"19":14,"20":5,"21":8,"22":6,"24":8,"25":9,"26":6,"27":10,"29":13,"30":5,"31":54,"32":2,"33":19,"34":3,"35":46,"36":67,"38":41,"40":3,"41":1,"42":6,"43":9,"44":6,"46":6,"47":4,"49":16,"52":17,"54":33,"60":1,"62":1,"63":1,"69":1,"72":1,"73":9,"74":13,"75":3,"78":1,"82":1,"85":1,"86":466,"87":4,"88":3,"89":3,"90":1,"91":1,"92":3,"93":1,"95":3,"96":1,"97":2,"98":7,"99":3,"100":4,"102":4,"103":3,"104":17,"106":20,"108":1,"109":1,"115":5,"116":2,"117":25,"118":12,"119":12,"122":4,"123":1,"124":136,"125":17,"127":120}}],["too",{"2":{"89":1}}],["tool",{"2":{"32":1}}],["toolkit",{"2":{"20":1}}],["tools",{"0":{"35":1,"50":1},"2":{"19":1,"34":2}}],["towards",{"2":{"86":1,"103":1,"124":1}}],["topics",{"2":{"84":1}}],["total",{"2":{"25":1,"27":1,"86":1}}],["todo",{"0":{"7":1,"9":1,"11":1,"13":1,"15":1,"17":1},"2":{"35":1,"43":1,"44":2,"73":1,"74":4,"86":1,"127":1}}],["to",{"0":{"22":1,"25":1,"27":1,"50":1,"60":1,"75":1,"107":1},"1":{"108":1},"2":{"1":9,"3":12,"4":1,"5":2,"6":1,"8":1,"10":1,"12":1,"14":1,"16":1,"19":6,"21":4,"22":6,"24":3,"25":4,"26":1,"27":4,"29":3,"30":18,"31":19,"32":2,"33":4,"34":2,"35":17,"36":23,"38":13,"40":2,"42":1,"43":6,"44":3,"47":1,"49":3,"52":4,"54":2,"62":1,"73":4,"74":6,"75":1,"78":1,"85":1,"86":187,"87":3,"88":5,"89":9,"90":1,"93":1,"94":2,"96":1,"102":6,"103":1,"104":12,"106":3,"107":1,"108":1,"109":1,"111":1,"113":1,"115":2,"117":18,"118":7,"119":7,"121":1,"123":1,"124":45,"125":10,"127":49}}],["i+1",{"2":{"74":1}}],["iconic",{"2":{"74":1}}],["icnlocalsearchoptimizer",{"2":{"104":3}}],["icngeneticoptimizer",{"2":{"104":4}}],["icnoptimizer",{"2":{"104":3}}],["icnconfig",{"2":{"104":4}}],["icns",{"2":{"90":1,"93":1,"96":1,"104":1,"106":1,"115":1}}],["icn=icn",{"2":{"86":1,"124":1}}],["icn",{"0":{"106":1},"2":{"25":2,"27":2,"35":1,"86":36,"92":1,"95":1,"100":1,"104":12,"106":9,"119":1,"124":23}}],["ignores",{"2":{"54":1,"86":1}}],["ignore",{"2":{"54":1,"86":1}}],["ignored",{"2":{"54":2,"86":2}}],["illustrate",{"2":{"43":1}}],["io",{"2":{"31":2}}],["immutable",{"2":{"26":1,"86":1,"124":1}}],["impossible",{"2":{"89":1}}],["importance",{"2":{"75":1,"85":1}}],["improve",{"2":{"78":1,"88":1,"89":1}}],["improvement",{"0":{"78":1},"2":{"127":1}}],["improving",{"2":{"33":1,"127":1}}],["implemented",{"2":{"87":1}}],["implement",{"2":{"8":1,"21":1,"30":1,"86":2,"124":1}}],["implementations",{"2":{"19":1}}],["implementation",{"2":{"8":2,"86":2,"115":1,"124":2}}],["impact",{"2":{"5":1,"57":1}}],["i`",{"2":{"22":1,"25":1,"27":1,"86":1}}],["i",{"2":{"22":10,"24":7,"25":8,"26":3,"27":8,"30":2,"49":2,"54":4,"74":4,"86":64,"102":2,"103":1,"106":2,"113":2,"117":23,"118":13,"124":3,"127":1}}],["identity",{"2":{"86":14,"98":4,"117":6,"119":4}}],["identified",{"2":{"35":1,"86":1}}],["ids",{"2":{"30":1,"86":1}}],["idparameterdomain",{"2":{"30":1,"86":1}}],["id",{"2":{"6":1,"31":2,"86":1,"127":13}}],["id=3",{"2":{"3":1,"86":1}}],["id=1",{"2":{"3":3,"86":3}}],["id=nothing",{"2":{"3":4,"86":4}}],["iterate",{"2":{"127":1}}],["iterators",{"2":{"113":1}}],["iterations",{"2":{"127":3}}],["iteration",{"2":{"86":2,"124":2,"127":8}}],["iter=100",{"2":{"86":2,"124":2}}],["iter",{"2":{"86":8,"104":3,"124":8,"127":1}}],["ith",{"2":{"22":2,"25":1,"27":1,"30":1,"86":1}}],["itvls",{"2":{"24":3,"86":3}}],["itv",{"2":{"21":2,"22":8,"24":2,"25":7,"26":2,"27":7,"30":3,"86":9,"124":2}}],["itself",{"2":{"86":1,"124":1}}],["its",{"2":{"5":1,"24":1,"26":1,"31":1,"33":2,"35":1,"65":1,"69":1,"72":1,"73":2,"74":1,"75":1,"82":1,"86":5,"102":2,"124":3,"127":2}}],["it",{"2":{"4":1,"21":1,"30":8,"32":1,"35":9,"36":25,"38":2,"42":1,"43":1,"44":1,"46":2,"49":2,"52":1,"54":6,"73":1,"74":4,"86":65,"87":2,"89":2,"97":1,"104":1,"106":1,"109":1,"116":1,"119":1,"122":1,"124":6,"125":1,"127":6}}],["isa",{"2":{"113":1}}],["issue",{"0":{"45":1},"2":{"115":1}}],["isempty",{"2":{"10":3,"22":5,"86":6}}],["is",{"0":{"65":1},"2":{"3":10,"4":1,"5":4,"6":2,"10":2,"19":2,"21":2,"22":7,"24":3,"25":5,"27":5,"29":3,"30":9,"31":9,"32":2,"33":3,"35":7,"36":14,"38":15,"40":3,"42":3,"43":1,"44":3,"46":2,"49":5,"52":9,"54":10,"73":1,"74":6,"86":156,"87":5,"88":5,"89":4,"92":1,"95":1,"100":2,"102":1,"104":5,"106":7,"109":4,"111":1,"117":20,"118":13,"119":4,"124":26,"125":8,"127":17}}],["iff",{"2":{"86":2,"100":1,"119":1,"124":2}}],["if",{"2":{"1":3,"3":4,"8":3,"21":1,"22":10,"25":9,"27":9,"29":2,"30":2,"35":9,"36":8,"38":4,"40":1,"49":1,"52":2,"54":2,"73":1,"74":1,"86":65,"98":2,"99":2,"104":1,"106":4,"109":4,"113":4,"117":2,"118":2,"124":12,"127":14}}],["init",{"2":{"113":1}}],["initial",{"2":{"89":1}}],["initializes",{"2":{"36":1,"86":1}}],["inner",{"2":{"104":1,"127":1}}],["inf",{"2":{"127":1}}],["info",{"2":{"125":2,"127":6}}],["information",{"2":{"73":1,"86":1,"104":1,"124":1,"127":1}}],["infrastructure",{"2":{"18":1}}],["involves",{"2":{"87":1}}],["involving",{"2":{"86":1,"119":1}}],["invalid",{"2":{"33":1,"35":1,"86":3,"124":1}}],["investigated",{"2":{"31":1}}],["input",{"2":{"31":1,"36":3,"86":3}}],["inputs",{"2":{"19":1,"35":1,"86":1}}],["instead",{"2":{"86":3,"102":2,"109":1,"124":3,"125":1,"127":1}}],["instructions",{"2":{"70":1}}],["installed",{"2":{"73":1,"122":1}}],["install",{"2":{"73":1}}],["installing",{"2":{"70":1}}],["installation",{"0":{"70":1}}],["instantiation",{"2":{"40":9,"86":9}}],["instances",{"2":{"73":1}}],["instance",{"2":{"19":1,"31":4,"52":2,"86":3,"109":1,"124":1,"127":2}}],["insertion",{"2":{"16":1,"86":1,"124":1,"125":1}}],["insert",{"2":{"16":1,"86":1,"124":1,"127":3}}],["independent",{"2":{"127":1}}],["independently",{"2":{"127":1}}],["indexed",{"2":{"3":2,"86":2}}],["index",{"2":{"3":3,"49":2,"86":5,"127":1}}],["industry",{"2":{"87":1}}],["indice",{"2":{"127":1}}],["indices",{"2":{"127":6}}],["indicate",{"2":{"127":2}}],["indicates",{"2":{"31":1,"35":2,"86":2,"124":2}}],["individuals",{"2":{"104":1}}],["indispensable",{"2":{"32":1}}],["ind",{"2":{"16":1,"86":1,"124":1,"127":2}}],["inc",{"2":{"127":6}}],["increment",{"2":{"127":3}}],["incremental",{"2":{"125":1}}],["increase",{"2":{"16":1,"86":1,"124":1}}],["increasing",{"2":{"1":10,"86":10}}],["inclusive",{"2":{"86":3,"106":3}}],["included",{"2":{"86":1}}],["include",{"2":{"33":1,"87":1}}],["includes",{"2":{"5":1,"54":1,"86":3,"100":1,"119":1,"124":2}}],["including",{"0":{"36":1},"2":{"19":1,"33":1}}],["incorporation",{"2":{"33":1,"34":1}}],["incsert",{"2":{"16":2,"86":1,"124":1}}],["introductory",{"2":{"75":1}}],["introduction",{"0":{"50":1,"107":1},"1":{"108":1},"2":{"107":1}}],["introduce",{"2":{"66":1,"69":1,"81":1,"127":1}}],["into",{"0":{"79":1},"1":{"80":1,"81":1,"82":1},"2":{"21":1,"31":1,"41":1,"56":1,"86":6,"91":1,"102":1,"104":1,"106":1,"109":1,"124":3,"127":1}}],["intend",{"2":{"127":1}}],["intentionally",{"2":{"42":1}}],["intentional",{"2":{"42":1}}],["intention",{"0":{"42":1,"43":1},"1":{"43":1,"44":1,"45":1,"46":1},"2":{"41":1,"42":2,"43":1,"44":2}}],["intensional",{"2":{"33":1,"46":1,"86":1}}],["intension",{"2":{"33":1,"43":1,"44":3,"46":2,"86":2}}],["integer",{"2":{"31":3,"38":1,"80":1,"86":1,"87":1}}],["integrating",{"2":{"34":1}}],["integration",{"0":{"0":1,"2":1,"32":1,"37":1,"39":1,"48":1,"51":1,"53":1},"1":{"1":1,"3":1,"33":1,"34":1,"35":1,"36":1,"38":1,"40":1,"49":1,"52":1,"54":1},"2":{"33":3}}],["integrates",{"2":{"19":1}}],["integrate",{"2":{"5":1}}],["interfacing",{"0":{"123":1}}],["interfaced",{"2":{"121":1}}],["interfaces",{"2":{"73":1}}],["interface",{"0":{"111":1},"2":{"5":3,"8":2,"21":1,"42":1,"44":1,"73":2,"86":4,"87":3,"111":1,"123":1,"124":1,"125":1}}],["interpretable",{"2":{"86":1,"106":1,"124":1}}],["interpreted",{"2":{"52":2,"86":2}}],["interdiction",{"2":{"31":2,"127":2}}],["interval",{"2":{"21":1,"22":2,"24":6,"25":2,"26":3,"27":2,"30":1,"86":8,"124":1}}],["intervals",{"2":{"19":2,"21":2,"22":5,"24":5,"25":4,"26":2,"27":4,"28":2,"30":2,"86":11,"124":2}}],["intersect",{"2":{"19":1,"24":2,"26":1,"86":2,"124":1}}],["intersecting",{"2":{"19":1}}],["intersections",{"2":{"24":2,"26":1,"86":2,"124":1}}],["intersection",{"2":{"6":1,"36":1,"86":1,"124":1}}],["internally",{"2":{"86":1,"102":1}}],["internals",{"2":{"19":1,"29":1,"86":1}}],["internal",{"2":{"8":1,"21":1,"31":2,"86":4,"106":1,"124":1,"127":4}}],["interacting",{"2":{"33":1,"106":1}}],["interact",{"2":{"5":1}}],["interoperability",{"2":{"4":1,"5":1}}],["int",{"2":{"1":8,"3":1,"22":2,"25":2,"27":2,"29":1,"31":11,"36":1,"38":9,"46":1,"49":1,"52":2,"74":1,"86":35,"102":8,"113":2,"124":4,"125":6,"127":30}}],["in",{"0":{"0":1,"2":1,"20":1,"32":1,"34":1,"37":1,"39":1,"43":1,"48":1,"51":1,"53":1},"1":{"1":1,"3":1,"33":1,"34":1,"35":1,"36":1,"38":1,"40":1,"49":1,"52":1,"54":1},"2":{"1":6,"3":14,"4":1,"5":1,"6":1,"8":2,"10":3,"14":1,"16":1,"20":1,"21":4,"22":8,"24":3,"25":10,"26":5,"27":11,"29":2,"30":1,"31":9,"32":2,"33":3,"34":1,"35":4,"36":7,"38":24,"40":4,"41":1,"42":2,"43":1,"44":3,"46":1,"47":1,"49":6,"54":18,"65":1,"73":1,"74":7,"75":1,"82":1,"85":1,"86":134,"87":7,"89":3,"98":2,"102":2,"103":1,"104":3,"106":7,"113":2,"115":1,"117":1,"119":1,"122":1,"124":29,"125":16,"127":16}}],["df",{"2":{"104":2,"113":24}}],["ds",{"2":{"104":2}}],["date",{"2":{"31":1}}],["datatype",{"2":{"127":1}}],["dataframe",{"2":{"104":1,"113":2}}],["data",{"2":{"5":1,"86":2,"119":2,"127":1}}],["d₂",{"2":{"24":2,"26":2,"86":2,"124":2}}],["d₁",{"2":{"24":2,"26":2,"86":2,"124":2}}],["draw",{"2":{"22":2,"25":1,"27":1,"30":1,"86":1,"127":5}}],["d5",{"2":{"21":1,"24":1,"26":1,"86":1,"124":1}}],["d4",{"2":{"21":1,"24":1,"26":1,"86":1,"124":1}}],["d3",{"2":{"21":1,"24":1,"26":1,"86":1,"124":1}}],["d2",{"2":{"21":1,"24":1,"26":1,"86":1,"124":1}}],["dynamic",{"2":{"19":3,"21":1,"24":1,"31":1,"86":3,"119":1,"124":1,"127":11}}],["dom",{"2":{"86":8,"98":2,"99":2,"104":2,"113":4,"124":4}}],["domain",{"2":{"19":10,"20":1,"21":19,"22":1,"24":12,"25":1,"26":15,"27":1,"29":1,"30":9,"31":1,"38":1,"74":1,"86":46,"87":1,"98":1,"99":1,"104":3,"109":4,"124":32,"127":20}}],["domains",{"0":{"18":1},"1":{"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1},"2":{"18":2,"19":8,"20":1,"21":4,"22":3,"24":9,"25":2,"26":7,"27":2,"28":2,"29":6,"30":1,"31":1,"66":1,"86":30,"104":2,"113":11,"124":23,"127":3}}],["download",{"2":{"73":1}}],["do",{"2":{"54":4,"86":6,"103":1,"119":1,"124":1}}],["doesn",{"2":{"35":1,"36":2,"86":3}}],["does",{"2":{"35":1,"36":3,"54":2,"86":9,"125":1}}],["documentation",{"0":{"46":1},"2":{"31":1,"73":1,"101":1,"104":1,"120":1,"121":1,"122":1,"125":1,"127":1}}],["documentervitepress",{"0":{"45":1}}],["documenter",{"2":{"8":1,"100":1,"102":1}}],["docstring",{"2":{"8":2,"100":2,"102":2,"125":26,"127":29}}],["d",{"2":{"16":1,"21":14,"22":29,"24":7,"25":23,"26":9,"27":26,"28":1,"30":12,"52":4,"86":54,"104":2,"113":2,"124":22,"127":9}}],["due",{"2":{"31":1,"73":1}}],["during",{"2":{"12":1,"86":1,"106":2}}],["duplication",{"2":{"5":1}}],["diff",{"2":{"86":4,"98":2,"99":2}}],["differs",{"0":{"67":1}}],["difference",{"2":{"14":2,"21":1,"24":1,"26":1,"86":12,"98":3,"99":3,"117":2,"118":2,"124":2}}],["different",{"2":{"1":8,"5":1,"6":1,"19":1,"31":1,"35":5,"36":8,"42":1,"43":6,"44":3,"45":2,"46":6,"73":1,"74":1,"86":29,"88":1,"119":3,"124":4,"127":1}}],["digits",{"2":{"74":2}}],["dive",{"0":{"79":1},"1":{"80":1,"81":1,"82":1},"2":{"56":1}}],["directions",{"0":{"63":1},"2":{"86":1,"119":1}}],["directed",{"2":{"52":1,"86":1}}],["directly",{"2":{"5":1,"33":1,"42":1,"44":1,"86":1}}],["dispatch",{"2":{"86":1,"104":1,"119":1,"127":2}}],["displays",{"2":{"31":1}}],["display",{"2":{"31":13}}],["discuss",{"2":{"57":1,"72":1,"85":1}}],["discreteset",{"2":{"125":3}}],["discretedomain",{"2":{"19":1,"21":1,"22":3,"24":1,"25":3,"26":4,"27":3,"30":1,"86":7,"113":1,"124":2}}],["discrete",{"0":{"26":1},"1":{"27":1},"2":{"18":1,"19":2,"21":1,"24":1,"26":4,"86":5,"104":1,"124":4,"127":1}}],["distributed",{"2":{"127":1}}],["distdifferent",{"2":{"44":1,"125":2}}],["dist",{"2":{"42":1,"43":6,"44":3,"45":2,"46":5,"86":5,"127":1}}],["distinct",{"2":{"38":2,"74":2,"86":2}}],["distinguishes",{"2":{"19":1}}],["distances",{"2":{"31":4,"43":2,"46":1,"86":1}}],["distance",{"2":{"21":2,"24":1,"26":1,"31":1,"46":3,"86":8,"103":1,"124":5,"127":1}}],["diagram",{"2":{"8":1,"52":4,"86":5,"124":1}}],["diagrams",{"2":{"8":2,"86":1}}],["dictionaries",{"0":{"16":1},"1":{"17":1},"2":{"16":1}}],["dictionaryview",{"2":{"127":1}}],["dictionary",{"2":{"6":1,"16":1,"31":3,"33":2,"35":1,"36":14,"86":18,"119":2,"124":8,"127":6}}],["dict",{"2":{"6":3,"36":8,"52":4,"86":12,"124":8}}],["dict=usual",{"2":{"6":1,"36":1,"86":1,"124":1}}],["dimension",{"2":{"125":6,"127":1}}],["dimensions",{"2":{"30":1,"86":1}}],["dimparameterdomain",{"2":{"30":1,"86":1}}],["dim",{"2":{"6":1,"54":2,"86":3,"113":3,"125":12,"127":4}}],["dim=2",{"2":{"3":2,"86":2}}],["dim=1",{"2":{"3":2,"86":2}}],["deepcopy",{"2":{"127":1}}],["deeper",{"2":{"56":1}}],["debugging",{"2":{"127":1}}],["debinarize",{"2":{"86":1,"109":1,"124":1}}],["denotes",{"2":{"86":2,"98":2}}],["density",{"2":{"29":1,"86":1,"124":1}}],["derived",{"2":{"86":1}}],["delta",{"2":{"127":6}}],["delegates",{"2":{"86":1,"119":1}}],["delete",{"2":{"19":1,"21":1,"27":3,"35":1,"86":5,"124":4,"127":13}}],["deletion",{"2":{"19":1}}],["delineation",{"2":{"86":2}}],["dedicated",{"2":{"43":1}}],["descent",{"0":{"113":1},"2":{"104":1}}],["descriptions",{"2":{"36":4,"86":4,"124":4}}],["description",{"2":{"36":2,"43":1,"86":3,"124":2,"125":36,"127":10}}],["describe",{"2":{"36":2,"86":2,"90":1,"93":1,"96":1,"113":1,"115":1,"124":2,"127":3}}],["describes",{"2":{"31":1}}],["design",{"2":{"5":1}}],["designed",{"2":{"4":1,"32":1,"42":1,"44":1}}],["depend",{"2":{"86":1,"119":1}}],["depending",{"2":{"73":1}}],["depends",{"2":{"21":1,"86":1,"124":1,"127":1}}],["dependencies",{"2":{"5":1}}],["determined",{"2":{"127":1}}],["determine",{"2":{"35":1,"86":2,"124":1}}],["determining",{"2":{"19":1,"33":1}}],["deterministic",{"2":{"8":1,"86":1,"124":1}}],["details",{"2":{"8":1,"100":1,"102":1}}],["decrement",{"2":{"127":1}}],["decrease",{"2":{"127":2}}],["decreasing",{"2":{"1":8,"86":8}}],["decay",{"2":{"127":3}}],["declare",{"2":{"86":1}}],["decisions",{"2":{"88":1}}],["decision",{"2":{"8":3,"52":1,"86":3,"124":1}}],["developers",{"2":{"32":1}}],["developing",{"2":{"5":1}}],["development",{"2":{"4":1,"5":3}}],["define",{"2":{"33":1,"36":3,"42":1,"43":2,"47":1,"65":1,"74":1,"86":6,"124":2}}],["defines",{"2":{"24":1,"26":1,"44":1,"86":2,"106":1,"124":1}}],["defined",{"0":{"52":1},"2":{"19":2,"21":1,"26":1,"33":1,"36":1,"38":1,"42":3,"46":1,"47":3,"74":2,"86":9,"98":1,"104":2,"117":1,"124":2,"125":2,"127":1}}],["defining",{"0":{"18":1,"43":1},"1":{"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1},"2":{"19":1,"20":1,"33":2,"36":1,"42":1,"44":1,"86":1,"124":1}}],["definitions",{"2":{"19":1}}],["definition",{"0":{"0":1,"2":1,"32":1,"37":1,"39":1,"48":1,"51":1,"53":1},"1":{"1":1,"3":1,"33":1,"34":1,"35":1,"36":1,"38":1,"40":1,"49":1,"52":1,"54":1},"2":{"18":1,"19":1,"32":1,"33":1,"34":1,"36":1,"86":1}}],["default",{"2":{"6":3,"22":1,"29":1,"31":10,"36":8,"38":1,"86":17,"104":4,"109":1,"111":1,"124":10,"127":2}}],["defaults",{"2":{"1":1,"6":1,"16":1,"36":6,"86":8,"104":2,"124":2}}],["auto",{"2":{"113":1}}],["automated",{"2":{"36":1,"86":1}}],["automatic",{"2":{"29":1,"86":1,"124":1}}],["automatically",{"2":{"29":1,"86":1}}],["automaton",{"2":{"8":6,"30":4,"52":7,"86":15,"124":3}}],["automata",{"2":{"8":2,"19":1,"86":1}}],["among",{"2":{"104":1,"127":1}}],["amount",{"2":{"31":1}}],["affects",{"2":{"97":1,"116":1}}],["affect",{"2":{"86":1,"103":1,"124":1}}],["aggragation",{"2":{"90":1}}],["aggregate",{"2":{"86":1,"91":1}}],["aggregations",{"0":{"91":1},"2":{"86":1,"92":1,"124":1}}],["aggregation",{"0":{"90":1},"1":{"91":1,"92":1},"2":{"86":4,"92":1,"124":4}}],["ag",{"2":{"86":2,"91":2}}],["against",{"2":{"40":1,"86":2,"119":1}}],["again",{"2":{"31":1}}],["apixcspjumpmoi",{"2":{"44":1}}],["apis",{"0":{"44":1}}],["api",{"0":{"43":1,"86":1,"124":1},"2":{"42":1,"44":1}}],["appropriate",{"2":{"86":1,"119":1}}],["approach",{"2":{"5":1,"33":1,"74":1,"88":2}}],["appear",{"2":{"38":3,"86":3}}],["applies",{"2":{"86":1,"102":1,"125":1}}],["applied",{"2":{"35":1,"36":1,"59":1,"74":1,"86":3,"119":1,"124":2,"125":1,"127":2}}],["applicability",{"2":{"33":1}}],["applications",{"0":{"59":1},"2":{"18":1,"20":1}}],["application",{"2":{"5":2,"32":1,"33":1,"34":1,"86":1}}],["applying",{"0":{"58":1},"1":{"59":1,"60":1}}],["apply",{"2":{"33":1,"35":5,"36":3,"86":7,"119":2,"124":5}}],["about",{"0":{"105":1},"2":{"50":1,"87":1,"105":1,"126":1,"127":1}}],["absolute",{"2":{"86":2,"98":1,"99":1}}],["abs",{"2":{"36":1,"43":2,"44":2,"86":5,"98":2,"99":2,"124":1}}],["abstractstring",{"2":{"127":2}}],["abstractstring=",{"2":{"10":1,"86":1}}],["abstractstate",{"2":{"127":1}}],["abstractsolver",{"2":{"127":70}}],["abstractscalarset",{"2":{"125":1}}],["abstractscalarfunction",{"2":{"125":1}}],["abstractoptimizer",{"2":{"86":2,"104":2,"111":2,"113":1,"124":1,"125":1}}],["abstractmatrix",{"2":{"31":4}}],["abstractmultivalueddecisiondiagram",{"2":{"8":3,"86":3,"124":1}}],["abstractrange",{"2":{"21":1,"24":1,"26":2,"86":2,"124":2}}],["abstracting",{"2":{"20":1}}],["abstractdomain",{"2":{"19":3,"21":5,"22":6,"24":4,"25":5,"26":4,"27":5,"28":1,"30":10,"86":25,"124":10,"127":6}}],["abstractdictionary",{"2":{"16":1,"86":1,"124":1}}],["abstractdict",{"2":{"16":1,"86":1,"124":1}}],["abstractautomaton`",{"2":{"52":1,"86":1}}],["abstractautomaton",{"2":{"8":3,"30":1,"52":2,"86":6,"124":1}}],["abstract",{"2":{"4":1,"5":2,"8":2,"19":1,"21":1,"24":1,"26":1,"86":6,"104":2,"111":1,"124":3,"127":2}}],["abstractvectorset",{"2":{"125":15}}],["abstractvector",{"2":{"3":4,"40":2,"49":1,"54":5,"86":31,"102":1,"117":11,"118":6,"127":1}}],["ability",{"2":{"33":1}}],["avoid",{"2":{"35":1,"86":2,"124":1,"127":1}}],["avoiding",{"2":{"33":1}}],["available",{"2":{"19":1,"31":2,"34":1,"36":1,"42":1,"44":1,"73":2,"86":2,"87":1,"119":1,"124":1,"127":1}}],["always",{"2":{"125":1}}],["alwaystrue",{"2":{"125":2}}],["alternative",{"2":{"106":1}}],["although",{"2":{"73":1}}],["algorithm",{"2":{"86":4,"89":2,"104":3,"124":4}}],["algorithms",{"2":{"81":1,"89":1}}],["along",{"2":{"73":1}}],["already",{"2":{"36":1,"74":1,"86":3,"98":1,"104":1,"117":1,"127":1}}],["also",{"2":{"19":1,"38":3,"74":1,"86":5,"100":1,"119":1,"124":2}}],["allequalparam",{"2":{"125":2}}],["allequal",{"2":{"125":2}}],["allocation",{"2":{"88":1}}],["allocations",{"2":{"86":17,"117":10,"118":6}}],["allow",{"2":{"47":1}}],["allows",{"2":{"33":2}}],["allowing",{"2":{"19":1,"86":3,"119":1}}],["alldifferent",{"2":{"74":5,"125":2}}],["all",{"2":{"1":24,"6":1,"14":1,"19":1,"24":1,"31":1,"35":4,"36":9,"38":1,"47":1,"73":1,"74":2,"86":45,"87":1,"89":1,"100":1,"102":1,"119":1,"122":2,"124":10,"125":7,"127":4}}],["advantages",{"2":{"72":1}}],["advanced",{"0":{"34":1,"55":1},"1":{"56":1,"57":1},"2":{"19":1,"20":1,"33":1}}],["adjusted",{"2":{"29":1,"86":1}}],["added",{"2":{"43":1,"44":1,"125":1}}],["adds",{"2":{"36":4,"86":4}}],["adding",{"2":{"36":2,"86":2,"124":2}}],["addition",{"2":{"19":1,"33":1}}],["addtionally",{"2":{"21":1,"86":1,"124":1}}],["add",{"2":{"19":1,"21":1,"26":2,"35":1,"42":1,"43":1,"73":1,"74":4,"86":4,"124":3,"125":6,"127":20}}],["attribution",{"2":{"127":1}}],["attributed",{"2":{"127":6}}],["attribute",{"2":{"127":2}}],["attached",{"2":{"127":1}}],["atoms",{"2":{"31":1}}],["at",{"2":{"8":1,"19":1,"31":1,"33":1,"36":1,"38":8,"54":2,"73":1,"86":15,"104":2,"106":2,"109":1,"124":3,"127":1}}],["accurate",{"2":{"113":2}}],["according",{"2":{"86":1,"119":1}}],["access",{"2":{"21":1,"86":5,"106":1,"124":4,"127":20}}],["accessing",{"2":{"19":1}}],["acceptable",{"2":{"86":2}}],["accepted",{"2":{"35":2,"52":2,"86":4,"124":2}}],["accepts",{"2":{"8":3,"30":1,"31":5,"86":3,"124":1}}],["accept",{"2":{"8":6,"30":3,"86":7,"124":1}}],["action",{"2":{"86":2,"124":2}}],["actively",{"2":{"5":1}}],["actual",{"2":{"86":1,"124":1}}],["across",{"2":{"5":2}}],["assuming",{"2":{"125":1}}],["assert",{"2":{"86":1,"106":1}}],["associated",{"2":{"31":1,"74":1,"106":1}}],["assignements",{"2":{"35":1,"86":1,"124":1}}],["assign",{"2":{"31":1,"86":1,"124":1,"127":1}}],["assignments",{"2":{"33":2}}],["assignment",{"2":{"31":1,"35":1,"86":1,"124":1}}],["aspect",{"2":{"5":1}}],["as",{"2":{"4":1,"5":1,"8":1,"12":1,"18":1,"19":1,"24":1,"26":3,"31":3,"33":2,"35":1,"36":9,"38":3,"42":3,"44":2,"46":1,"52":2,"66":1,"73":1,"74":1,"86":27,"87":1,"88":2,"98":1,"102":2,"104":1,"106":1,"117":1,"119":1,"122":1,"123":1,"124":7,"125":2,"127":6}}],["a",{"0":{"106":1},"2":{"1":3,"3":22,"4":1,"5":6,"8":12,"16":2,"18":2,"19":2,"20":2,"21":9,"22":19,"24":8,"25":17,"26":8,"27":17,"29":6,"30":15,"31":28,"32":1,"33":7,"34":1,"35":18,"36":21,"38":13,"40":8,"42":10,"43":2,"44":3,"46":5,"47":4,"49":8,"52":29,"54":8,"60":1,"73":2,"74":12,"86":277,"87":7,"88":4,"89":7,"91":2,"94":2,"98":1,"99":1,"102":8,"103":4,"104":23,"106":17,"108":2,"109":7,"111":1,"115":1,"119":10,"121":1,"122":3,"124":75,"125":17,"127":51}}],["angles",{"2":{"88":1}}],["anonymous",{"2":{"86":1,"102":1}}],["another",{"2":{"3":2,"86":2,"87":1}}],["annealing",{"2":{"81":1}}],["analyze",{"2":{"78":1,"88":1}}],["analyzing",{"0":{"76":1},"1":{"77":1,"78":1}}],["analysis",{"0":{"78":1,"85":1},"2":{"85":1,"88":1}}],["any",{"0":{"106":1},"2":{"10":1,"21":2,"22":2,"25":2,"27":2,"31":1,"35":2,"46":1,"54":6,"86":19,"111":1,"124":7,"125":1,"127":1}}],["an",{"0":{"43":1},"2":{"1":3,"4":1,"8":2,"10":1,"19":1,"21":2,"24":6,"25":1,"26":3,"27":1,"29":1,"31":3,"32":1,"33":1,"35":4,"36":6,"38":1,"43":1,"44":1,"46":1,"52":3,"60":1,"74":1,"75":2,"86":57,"89":3,"98":1,"99":1,"102":3,"104":7,"106":6,"111":1,"115":1,"118":1,"119":1,"123":1,"124":18,"125":2,"127":11}}],["and",{"0":{"0":1,"2":1,"5":1,"18":1,"19":1,"32":1,"33":1,"36":1,"37":1,"38":1,"39":1,"48":1,"51":1,"53":1,"54":1,"56":1,"57":1,"59":1,"61":1,"66":1,"70":1,"71":1,"76":1,"78":1,"83":1},"1":{"1":1,"3":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"33":1,"34":1,"35":1,"36":1,"38":1,"40":1,"49":1,"52":1,"54":1,"62":1,"63":1,"72":1,"73":1,"74":1,"77":1,"78":1,"84":1,"85":1},"2":{"3":2,"4":3,"5":14,"6":1,"8":1,"10":1,"12":1,"14":1,"18":2,"19":11,"20":4,"21":2,"24":2,"26":1,"29":2,"30":2,"31":13,"32":3,"33":14,"34":2,"35":10,"36":10,"38":1,"41":1,"42":1,"46":3,"47":1,"49":2,"52":1,"56":1,"57":1,"59":1,"60":1,"62":1,"63":1,"65":1,"66":1,"67":1,"69":1,"70":1,"72":2,"73":2,"74":4,"75":2,"77":2,"78":1,"81":1,"82":1,"84":1,"85":1,"86":66,"87":3,"88":8,"89":3,"97":1,"98":1,"99":1,"102":1,"104":10,"106":3,"108":1,"109":1,"116":1,"117":5,"118":1,"119":3,"121":1,"122":1,"124":24,"125":2,"127":11}}],["arrange",{"2":{"122":3}}],["arrangement",{"2":{"104":1}}],["ar",{"2":{"86":2,"94":2}}],["arithmetic",{"0":{"93":1,"94":1},"1":{"94":1,"95":1},"2":{"86":5,"93":1,"95":2,"124":5}}],["arxiv",{"2":{"36":1,"86":1,"124":1}}],["arbitrary",{"2":{"26":1,"35":1,"86":2}}],["arbitrarydomain",{"2":{"26":1,"86":1}}],["argmax",{"2":{"127":3}}],["argument",{"2":{"31":5,"36":7,"86":7,"125":1}}],["arguments",{"2":{"1":3,"3":4,"6":1,"21":1,"24":1,"29":1,"31":1,"35":9,"36":11,"38":4,"40":1,"46":1,"49":1,"52":2,"54":2,"86":43,"124":15,"125":13,"127":8}}],["args",{"2":{"21":4,"29":1,"33":1,"35":7,"36":4,"86":13,"104":3,"111":1,"124":10}}],["areas",{"2":{"63":1}}],["are",{"2":{"1":10,"5":2,"19":1,"24":1,"26":1,"29":1,"31":5,"33":2,"36":1,"41":1,"42":4,"43":2,"46":2,"47":4,"54":2,"74":1,"86":42,"87":2,"88":2,"92":1,"95":1,"100":1,"106":2,"117":10,"118":5,"119":1,"124":6,"125":4,"127":2}}],["jacop",{"2":{"87":1}}],["j+1",{"2":{"74":1}}],["j",{"2":{"74":1}}],["join",{"2":{"62":1}}],["joining",{"0":{"62":1}}],["jc",{"0":{"43":1},"2":{"42":1,"44":2}}],["jump",{"2":{"31":20,"42":1,"44":3,"73":3,"74":2,"87":1,"125":6,"127":1}}],["juliajump",{"2":{"125":1}}],["juliajulia>",{"2":{"122":1}}],["juliapost",{"2":{"127":1}}],["juliapredicate",{"2":{"125":1}}],["juliapredict",{"2":{"104":1}}],["juliapreliminaries",{"2":{"104":1}}],["juliaparameter",{"2":{"104":1}}],["juliaparams",{"2":{"35":1,"86":1,"124":1}}],["juliapairvarsparameterdomain",{"2":{"30":1,"86":1}}],["juliaqubogradientoptimizer",{"2":{"104":1}}],["juliaqubo",{"2":{"86":2,"104":1,"108":2,"124":1}}],["juliaqap",{"2":{"31":1}}],["juliaweigths",{"2":{"86":3,"103":1,"124":3}}],["juliatrain",{"2":{"86":1,"104":2,"111":1,"124":1}}],["juliatransformation",{"2":{"86":1,"119":1,"124":1}}],["juliatr",{"2":{"86":19,"117":11,"118":6}}],["juliato",{"2":{"21":1,"86":1,"124":1}}],["juliaremote",{"2":{"127":2}}],["juliaregularization",{"2":{"86":1,"124":1}}],["juliareduce",{"2":{"86":1,"102":1}}],["juliarangedomain",{"2":{"26":1,"86":1,"124":1}}],["juliahamming",{"2":{"86":1,"103":1,"124":1}}],["juliafunctions",{"2":{"86":1,"106":1}}],["juliafor",{"2":{"74":2}}],["juliafake",{"2":{"30":1,"86":1}}],["juliafakeautomaton",{"2":{"30":1,"86":1}}],["juliausing",{"2":{"73":2}}],["juliausual",{"2":{"35":1,"36":2,"86":3,"124":2}}],["juliaup",{"2":{"73":1}}],["juliano",{"2":{"104":1}}],["julianbits",{"2":{"86":2,"106":1,"124":1}}],["julian",{"2":{"31":1}}],["juliagolomb",{"2":{"31":1}}],["juliageneralstate",{"2":{"127":1}}],["juliagenerate",{"2":{"30":1,"86":5,"104":1,"106":3,"124":1}}],["juliaget",{"2":{"21":1,"86":1,"124":1,"127":12}}],["juliastop",{"2":{"127":1}}],["juliastatus",{"2":{"127":1}}],["juliastruct",{"2":{"86":1,"104":1,"113":1,"124":1}}],["juliaspecialize",{"2":{"127":2}}],["juliasolve",{"2":{"127":2}}],["juliasolution",{"2":{"127":1}}],["juliascalarfunction",{"2":{"125":1}}],["juliascheduling",{"2":{"31":1}}],["juliasub",{"2":{"104":1}}],["juliasudoku",{"2":{"31":1}}],["juliasudokuinstance",{"2":{"31":2}}],["juliasymbols",{"2":{"86":1,"124":1}}],["juliasymbol",{"2":{"86":1,"106":1}}],["juliasymmetries",{"2":{"35":1,"86":1,"124":1}}],["juliashow",{"2":{"86":2,"106":1,"124":1}}],["juliashrink",{"2":{"35":1,"86":1}}],["juliaselected",{"2":{"86":1,"106":1}}],["juliasetdomain",{"2":{"26":1,"86":1}}],["juliavalue",{"2":{"74":1}}],["juliavalsparameterdomain",{"2":{"30":1,"86":1}}],["juliavalparameterdomain",{"2":{"30":1,"86":1}}],["juliavariable",{"2":{"127":3}}],["juliavar",{"2":{"22":1,"25":1,"27":1,"127":1}}],["juliao",{"2":{"127":1}}],["juliaobjective",{"2":{"127":4}}],["juliaoptions",{"2":{"127":1}}],["juliaoptimizer",{"2":{"125":2}}],["juliaoptimize",{"2":{"74":1,"104":1}}],["juliaopparameterdomain",{"2":{"30":1,"86":1}}],["juliaoversample",{"2":{"12":1,"86":1,"124":1}}],["julialoss",{"2":{"104":1}}],["julialeadsolver",{"2":{"127":1}}],["julialearn",{"2":{"86":1,"124":1}}],["julialength",{"2":{"25":1,"27":1,"86":1,"106":1,"127":5}}],["julialazy",{"2":{"86":2,"102":2,"124":2}}],["julialayers",{"2":{"86":1}}],["julialayer",{"2":{"86":1,"106":1}}],["julialanguageparameterdomain",{"2":{"30":1,"86":1}}],["juliais",{"2":{"86":2,"106":1,"109":1,"124":1,"127":2}}],["juliaicnlocalsearchoptimizer",{"2":{"104":1}}],["juliaicngeneticoptimizer",{"2":{"104":1}}],["juliaicnconfig",{"2":{"104":1}}],["juliaicn",{"2":{"86":1,"104":1,"124":1}}],["juliaidparameterdomain",{"2":{"30":1,"86":1}}],["juliaintersect",{"2":{"24":2,"26":1,"86":2,"124":1}}],["juliaintervals",{"2":{"24":1,"86":1}}],["juliaincsert",{"2":{"16":1,"86":1,"124":1}}],["juliabinarize",{"2":{"86":1,"109":1,"124":1}}],["juliaboolparameterdomain",{"2":{"30":1,"86":1}}],["juliabase",{"2":{"10":3,"22":15,"24":1,"25":13,"26":1,"27":14,"28":2,"30":4,"31":4,"86":20,"124":1,"125":2}}],["juliamodel",{"2":{"127":1}}],["juliamoi",{"2":{"125":11}}],["juliamoisumequalparam",{"2":{"125":1}}],["juliamoisequentialtasks",{"2":{"125":1}}],["juliamoipredicate",{"2":{"125":1}}],["juliamoiordered",{"2":{"125":1}}],["juliamoiminusequalparam",{"2":{"125":1}}],["juliamoilessthanparam",{"2":{"125":1}}],["juliamoierror",{"2":{"125":1}}],["juliamoieq",{"2":{"125":1}}],["juliamoidistdifferent",{"2":{"125":1}}],["juliamoialwaystrue",{"2":{"125":1}}],["juliamoiallequalparam",{"2":{"125":1}}],["juliamoiallequal",{"2":{"125":1}}],["juliamoialldifferent",{"2":{"125":1}}],["juliamts",{"2":{"127":1}}],["juliamutually",{"2":{"104":1}}],["juliamutable",{"2":{"31":1}}],["juliaminkowski",{"2":{"86":1,"103":1,"124":1}}],["juliamincut",{"2":{"31":1}}],["juliam",{"2":{"74":1}}],["juliamax",{"2":{"127":1}}],["juliamainsolver",{"2":{"127":1}}],["juliamap",{"2":{"86":1,"102":1}}],["juliamanhattan",{"2":{"86":1,"103":1,"124":1}}],["juliamake",{"2":{"35":1,"86":2,"104":3,"119":1}}],["juliamagic",{"2":{"31":1}}],["juliamerge",{"2":{"24":1,"26":1,"86":1,"124":1}}],["juliamdd",{"2":{"8":1,"86":1,"124":1}}],["juliax",{"2":{"22":1,"25":1,"27":1,"127":1}}],["juliaxcsp",{"2":{"1":3,"3":4,"38":4,"40":1,"46":1,"49":1,"52":2,"54":2,"86":19}}],["juliad",{"2":{"127":1}}],["juliadraw",{"2":{"127":1}}],["juliadelete",{"2":{"127":2}}],["juliadebinarize",{"2":{"86":1,"109":1,"124":1}}],["juliadescribe",{"2":{"36":2,"86":2,"124":2,"127":1}}],["juliadist",{"2":{"127":1}}],["juliadiscreteset",{"2":{"125":1}}],["juliadiscretedomain",{"2":{"26":1,"86":1,"124":1}}],["juliadisplay",{"2":{"31":1}}],["juliadimparameterdomain",{"2":{"30":1,"86":1}}],["juliad1",{"2":{"21":1,"24":1,"26":1,"86":1,"124":1}}],["juliadomain",{"2":{"21":6,"24":6,"26":6,"86":6,"104":1,"124":6,"127":1}}],["juliaempty",{"2":{"127":2}}],["juliaemptydomain",{"2":{"21":1,"86":1}}],["juliae",{"2":{"35":1,"86":1}}],["juliaerror",{"2":{"35":1,"86":1,"124":1,"125":1}}],["juliaexclu",{"2":{"86":1,"106":1}}],["juliaexplore",{"2":{"29":1,"86":2,"124":2}}],["juliaexploresettings",{"2":{"29":1,"86":1,"124":1}}],["juliaextract",{"2":{"6":3,"36":3,"86":3,"124":3}}],["juliaδ",{"2":{"14":1,"86":1,"104":1,"124":1}}],["juliaas",{"2":{"86":2,"102":2}}],["juliaaggregation",{"2":{"86":1,"92":1,"124":1}}],["juliaag",{"2":{"86":2,"91":2}}],["juliaarithmetic",{"2":{"86":1,"95":1,"124":1}}],["juliaar",{"2":{"86":2,"94":2}}],["juliaargs",{"2":{"35":1,"86":1,"124":1}}],["juliaarbitrarydomain",{"2":{"26":1,"86":1}}],["juliaadd",{"2":{"26":1,"86":1,"124":1,"127":2}}],["juliaat",{"2":{"8":1,"86":1}}],["juliaaccept",{"2":{"8":1,"30":1,"86":1,"124":1}}],["juliaautomaton",{"2":{"8":1,"86":1,"124":1}}],["juliaabstractsolver",{"2":{"127":1}}],["juliaabstractoptimizer",{"2":{"86":1,"111":1}}],["juliaabstractdomain",{"2":{"21":1,"86":1,"124":1}}],["juliaabstractautomaton",{"2":{"8":1,"86":1}}],["juliaabstractmultivalueddecisiondiagram",{"2":{"8":1,"86":1}}],["juliacompose",{"2":{"86":2,"124":2}}],["juliacompositionalnetworks",{"2":{"104":2}}],["juliacomposition",{"2":{"86":3,"124":3}}],["juliacomparison",{"2":{"86":1,"100":1,"124":1}}],["juliacode",{"2":{"86":1,"124":1}}],["juliaco",{"2":{"86":9,"98":5,"99":4}}],["juliacontinuousdomain",{"2":{"24":1,"86":1,"124":1}}],["juliaconstriction",{"2":{"127":1}}],["juliaconstraint",{"0":{"62":1,"68":1},"1":{"69":1},"2":{"35":1,"63":1,"69":1,"75":1,"86":1,"124":1,"127":3}}],["juliaconstraintcommons",{"2":{"8":1,"30":1,"86":1}}],["juliaconstraints",{"0":{"18":1,"87":1},"1":{"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"88":1,"89":1},"2":{"5":3,"20":1,"32":1,"33":1,"34":1,"36":4,"86":4,"87":6,"124":4}}],["juliaconst",{"2":{"6":2,"43":1,"86":2,"104":2}}],["juliaconcept",{"2":{"1":7,"3":4,"35":5,"36":3,"38":9,"40":1,"44":1,"46":1,"49":1,"52":2,"54":4,"86":37,"124":3}}],["juliachemical",{"2":{"31":1}}],["juliac",{"2":{"1":3,"3":4,"38":4,"40":1,"45":2,"49":1,"52":2,"54":2,"86":18}}],["julia",{"0":{"0":1,"2":1,"20":1,"32":1,"37":1,"39":1,"48":1,"51":1,"53":1,"71":1,"72":1,"73":1,"74":1,"75":1},"1":{"1":1,"3":1,"33":1,"34":1,"35":1,"36":1,"38":1,"40":1,"49":1,"52":1,"54":1,"72":1,"73":1,"74":1},"2":{"4":2,"8":2,"18":1,"26":1,"29":1,"31":5,"33":2,"34":1,"36":2,"44":3,"72":1,"73":7,"74":5,"86":13,"87":8,"98":1,"104":1,"117":1,"119":1,"124":5,"125":14,"127":81}}],["jl",{"0":{"0":1,"2":1,"4":1,"18":1,"31":1,"32":1,"37":1,"39":1,"48":1,"51":1,"53":1,"101":1,"104":1,"107":1,"120":1,"122":1,"125":1,"127":1},"1":{"1":1,"3":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"33":1,"34":1,"35":1,"36":1,"38":1,"40":1,"49":1,"52":1,"54":1,"102":1,"103":1,"108":1},"2":{"4":1,"5":4,"18":1,"19":3,"20":2,"31":1,"32":1,"33":3,"34":3,"36":1,"42":1,"43":1,"44":1,"73":3,"86":1,"87":8,"101":1,"104":1,"106":1,"107":1,"120":1,"121":2,"122":1,"124":1,"125":1,"127":2}}]],"serializationVersion":2}';export{i as default}; diff --git a/dev/assets/chunks/VPLocalSearchBox.CJhDNAGX.js b/dev/assets/chunks/VPLocalSearchBox.Bb6G1GgI.js similarity index 99% rename from dev/assets/chunks/VPLocalSearchBox.CJhDNAGX.js rename to dev/assets/chunks/VPLocalSearchBox.Bb6G1GgI.js index 1698d76..41fad78 100644 --- a/dev/assets/chunks/VPLocalSearchBox.CJhDNAGX.js +++ b/dev/assets/chunks/VPLocalSearchBox.Bb6G1GgI.js @@ -1,4 +1,4 @@ -var It=Object.defineProperty;var Dt=(o,e,t)=>e in o?It(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t;var Oe=(o,e,t)=>(Dt(o,typeof e!="symbol"?e+"":e,t),t);import{Y as yt,h as oe,y as $e,al as kt,am as Ot,d as _t,H as xe,an as tt,k as Fe,ao as Rt,ap as Mt,z as Lt,aq as zt,l as _e,U as de,S as Ee,ar as Pt,as as Vt,Z as Bt,j as $t,at as Wt,o as ee,b as Kt,m as k,a2 as Jt,p as j,au as Ut,av as jt,aw as Gt,c as re,n as rt,e as Se,G as at,F as nt,a as ve,t as pe,ax as qt,q as Ht,s as Qt,ay as it,az as Yt,ab as Zt,ah as Xt,aA as er,_ as tr}from"./framework.aA95Gx5L.js";import{u as rr,c as ar}from"./theme.CIqXObSN.js";const nr={root:()=>yt(()=>import("./@localSearchIndexroot.aRRNdGdD.js"),[])};/*! +var It=Object.defineProperty;var Dt=(o,e,t)=>e in o?It(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t;var Oe=(o,e,t)=>(Dt(o,typeof e!="symbol"?e+"":e,t),t);import{Y as yt,h as oe,y as $e,al as kt,am as Ot,d as _t,H as xe,an as tt,k as Fe,ao as Rt,ap as Mt,z as Lt,aq as zt,l as _e,U as de,S as Ee,ar as Pt,as as Vt,Z as Bt,j as $t,at as Wt,o as ee,b as Kt,m as k,a2 as Jt,p as j,au as Ut,av as jt,aw as Gt,c as re,n as rt,e as Se,G as at,F as nt,a as ve,t as pe,ax as qt,q as Ht,s as Qt,ay as it,az as Yt,ab as Zt,ah as Xt,aA as er,_ as tr}from"./framework.aA95Gx5L.js";import{u as rr,c as ar}from"./theme.s-t-bcG4.js";const nr={root:()=>yt(()=>import("./@localSearchIndexroot.CPW2lvOM.js"),[])};/*! * tabbable 6.2.0 * @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE */var mt=["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])"],Ne=mt.join(","),gt=typeof Element>"u",ue=gt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Ce=!gt&&Element.prototype.getRootNode?function(o){var e;return o==null||(e=o.getRootNode)===null||e===void 0?void 0:e.call(o)}:function(o){return o==null?void 0:o.ownerDocument},Ie=function o(e,t){var r;t===void 0&&(t=!0);var n=e==null||(r=e.getAttribute)===null||r===void 0?void 0:r.call(e,"inert"),a=n===""||n==="true",i=a||t&&e&&o(e.parentNode);return i},ir=function(e){var t,r=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return r===""||r==="true"},bt=function(e,t,r){if(Ie(e))return[];var n=Array.prototype.slice.apply(e.querySelectorAll(Ne));return t&&ue.call(e,Ne)&&n.unshift(e),n=n.filter(r),n},wt=function o(e,t,r){for(var n=[],a=Array.from(e);a.length;){var i=a.shift();if(!Ie(i,!1))if(i.tagName==="SLOT"){var s=i.assignedElements(),u=s.length?s:i.children,l=o(u,!0,r);r.flatten?n.push.apply(n,l):n.push({scopeParent:i,candidates:l})}else{var h=ue.call(i,Ne);h&&r.filter(i)&&(t||!e.includes(i))&&n.push(i);var d=i.shadowRoot||typeof r.getShadowRoot=="function"&&r.getShadowRoot(i),v=!Ie(d,!1)&&(!r.shadowRootFilter||r.shadowRootFilter(i));if(d&&v){var y=o(d===!0?i.children:d.children,!0,r);r.flatten?n.push.apply(n,y):n.push({scopeParent:i,candidates:y})}else a.unshift.apply(a,i.children)}}return n},xt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},se=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||ir(e))&&!xt(e)?0:e.tabIndex},or=function(e,t){var r=se(e);return r<0&&t&&!xt(e)?0:r},sr=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},Ft=function(e){return e.tagName==="INPUT"},ur=function(e){return Ft(e)&&e.type==="hidden"},lr=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(r){return r.tagName==="SUMMARY"});return t},cr=function(e,t){for(var r=0;rsummary:first-of-type"),i=a?e.parentElement:e;if(ue.call(i,"details:not([open]) *"))return!0;if(!r||r==="full"||r==="legacy-full"){if(typeof n=="function"){for(var s=e;e;){var u=e.parentElement,l=Ce(e);if(u&&!u.shadowRoot&&n(u)===!0)return ot(e);e.assignedSlot?e=e.assignedSlot:!u&&l!==e.ownerDocument?e=l.host:e=u}e=s}if(vr(e))return!e.getClientRects().length;if(r!=="legacy-full")return!0}else if(r==="non-zero-area")return ot(e);return!1},yr=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var r=0;r=0)},gr=function o(e){var t=[],r=[];return e.forEach(function(n,a){var i=!!n.scopeParent,s=i?n.scopeParent:n,u=or(s,i),l=i?o(n.candidates):s;u===0?i?t.push.apply(t,l):t.push(s):r.push({documentOrder:a,tabIndex:u,item:n,isScope:i,content:l})}),r.sort(sr).reduce(function(n,a){return a.isScope?n.push.apply(n,a.content):n.push(a.content),n},[]).concat(t)},br=function(e,t){t=t||{};var r;return t.getShadowRoot?r=wt([e],t.includeContainer,{filter:We.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:mr}):r=bt(e,t.includeContainer,We.bind(null,t)),gr(r)},wr=function(e,t){t=t||{};var r;return t.getShadowRoot?r=wt([e],t.includeContainer,{filter:De.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):r=bt(e,t.includeContainer,De.bind(null,t)),r},le=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ue.call(e,Ne)===!1?!1:We(t,e)},xr=mt.concat("iframe").join(","),Re=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ue.call(e,xr)===!1?!1:De(t,e)};/*! diff --git a/dev/assets/chunks/theme.CIqXObSN.js b/dev/assets/chunks/theme.s-t-bcG4.js similarity index 99% rename from dev/assets/chunks/theme.CIqXObSN.js rename to dev/assets/chunks/theme.s-t-bcG4.js index ab15478..1a18d5e 100644 --- a/dev/assets/chunks/theme.CIqXObSN.js +++ b/dev/assets/chunks/theme.s-t-bcG4.js @@ -1,2 +1,2 @@ -const __vite__fileDeps=["assets/chunks/VPLocalSearchBox.CJhDNAGX.js","assets/chunks/framework.aA95Gx5L.js"],__vite__mapDeps=i=>i.map(i=>__vite__fileDeps[i]); -import{d as _,o as a,c as u,r as c,n as N,a as D,t as T,b as y,w as p,T as pe,e as f,_ as $,u as Ye,i as Xe,f as Qe,g as he,h as w,j as q,k as g,l as j,m as h,p as r,q as B,s as H,v as z,x as le,y as G,z as te,A as fe,B as Te,C as Ze,D as xe,E as K,F as M,G as E,H as we,I as se,J as b,K as W,L as Ie,M as oe,N as Z,O as J,P as et,Q as Ne,R as tt,S as ce,U as Me,V as Ae,W as st,X as ot,Y as nt,Z as Ce,$ as _e,a0 as at,a1 as rt,a2 as it,a3 as Be,a4 as lt,a5 as ct,a6 as ut}from"./framework.aA95Gx5L.js";const dt=_({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(s){return(t,e)=>(a(),u("span",{class:N(["VPBadge",t.type])},[c(t.$slots,"default",{},()=>[D(T(t.text),1)])],2))}}),vt={key:0,class:"VPBackdrop"},pt=_({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(s){return(t,e)=>(a(),y(pe,{name:"fade"},{default:p(()=>[t.show?(a(),u("div",vt)):f("",!0)]),_:1}))}}),ht=$(pt,[["__scopeId","data-v-b06cdb19"]]),L=Ye;function ft(s,t){let e,o=!1;return()=>{e&&clearTimeout(e),o?e=setTimeout(s,t):(s(),(o=!0)&&setTimeout(()=>o=!1,t))}}function ue(s){return/^\//.test(s)?s:`/${s}`}function me(s){const{pathname:t,search:e,hash:o,protocol:n}=new URL(s,"http://a.com");if(Xe(s)||s.startsWith("#")||!n.startsWith("http")||!Qe(t))return s;const{site:i}=L(),l=t.endsWith("/")||t.endsWith(".html")?s:s.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,i.value.cleanUrls?"":".html")}${e}${o}`);return he(l)}const be=w(q?location.hash:"");q&&window.addEventListener("hashchange",()=>{be.value=location.hash});function X({removeCurrent:s=!0,correspondingLink:t=!1}={}){const{site:e,localeIndex:o,page:n,theme:i}=L(),l=g(()=>{var d,m;return{label:(d=e.value.locales[o.value])==null?void 0:d.label,link:((m=e.value.locales[o.value])==null?void 0:m.link)||(o.value==="root"?"/":`/${o.value}/`)}});return{localeLinks:g(()=>Object.entries(e.value.locales).flatMap(([d,m])=>s&&l.value.label===m.label?[]:{text:m.label,link:_t(m.link||(d==="root"?"/":`/${d}/`),i.value.i18nRouting!==!1&&t,n.value.relativePath.slice(l.value.link.length-1),!e.value.cleanUrls)+be.value})),currentLang:l}}function _t(s,t,e,o){return t?s.replace(/\/$/,"")+ue(e.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,o?".html":"")):s}const mt=s=>(B("data-v-792811ca"),s=s(),H(),s),bt={class:"NotFound"},kt={class:"code"},$t={class:"title"},gt=mt(()=>h("div",{class:"divider"},null,-1)),yt={class:"quote"},Pt={class:"action"},St=["href","aria-label"],Vt=_({__name:"NotFound",setup(s){const{site:t,theme:e}=L(),{localeLinks:o}=X({removeCurrent:!1}),n=w("/");return j(()=>{var l;const i=window.location.pathname.replace(t.value.base,"").replace(/(^.*?\/).*$/,"/$1");o.value.length&&(n.value=((l=o.value.find(({link:v})=>v.startsWith(i)))==null?void 0:l.link)||o.value[0].link)}),(i,l)=>{var v,d,m,P,k;return a(),u("div",bt,[h("p",kt,T(((v=r(e).notFound)==null?void 0:v.code)??"404"),1),h("h1",$t,T(((d=r(e).notFound)==null?void 0:d.title)??"PAGE NOT FOUND"),1),gt,h("blockquote",yt,T(((m=r(e).notFound)==null?void 0:m.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),h("div",Pt,[h("a",{class:"link",href:r(he)(n.value),"aria-label":((P=r(e).notFound)==null?void 0:P.linkLabel)??"go to home"},T(((k=r(e).notFound)==null?void 0:k.linkText)??"Take me home"),9,St)])])}}}),Lt=$(Vt,[["__scopeId","data-v-792811ca"]]);function He(s,t){if(Array.isArray(s))return x(s);if(s==null)return[];t=ue(t);const e=Object.keys(s).sort((n,i)=>i.split("/").length-n.split("/").length).find(n=>t.startsWith(ue(n))),o=e?s[e]:[];return Array.isArray(o)?x(o):x(o.items,o.base)}function Tt(s){const t=[];let e=0;for(const o in s){const n=s[o];if(n.items){e=t.push(n);continue}t[e]||t.push({items:[]}),t[e].items.push(n)}return t}function wt(s){const t=[];function e(o){for(const n of o)n.text&&n.link&&t.push({text:n.text,link:n.link,docFooterText:n.docFooterText}),n.items&&e(n.items)}return e(s),t}function de(s,t){return Array.isArray(t)?t.some(e=>de(s,e)):z(s,t.link)?!0:t.items?de(s,t.items):!1}function x(s,t){return[...s].map(e=>{const o={...e},n=o.base||t;return n&&o.link&&(o.link=n+o.link),o.items&&(o.items=x(o.items,n)),o})}function O(){const{frontmatter:s,page:t,theme:e}=L(),o=le("(min-width: 960px)"),n=w(!1),i=g(()=>{const C=e.value.sidebar,I=t.value.relativePath;return C?He(C,I):[]}),l=w(i.value);G(i,(C,I)=>{JSON.stringify(C)!==JSON.stringify(I)&&(l.value=i.value)});const v=g(()=>s.value.sidebar!==!1&&l.value.length>0&&s.value.layout!=="home"),d=g(()=>m?s.value.aside==null?e.value.aside==="left":s.value.aside==="left":!1),m=g(()=>s.value.layout==="home"?!1:s.value.aside!=null?!!s.value.aside:e.value.aside!==!1),P=g(()=>v.value&&o.value),k=g(()=>v.value?Tt(l.value):[]);function V(){n.value=!0}function S(){n.value=!1}function A(){n.value?S():V()}return{isOpen:n,sidebar:l,sidebarGroups:k,hasSidebar:v,hasAside:m,leftAside:d,isSidebarEnabled:P,open:V,close:S,toggle:A}}function It(s,t){let e;te(()=>{e=s.value?document.activeElement:void 0}),j(()=>{window.addEventListener("keyup",o)}),fe(()=>{window.removeEventListener("keyup",o)});function o(n){n.key==="Escape"&&s.value&&(t(),e==null||e.focus())}}function Nt(s){const{page:t}=L(),e=w(!1),o=g(()=>s.value.collapsed!=null),n=g(()=>!!s.value.link),i=w(!1),l=()=>{i.value=z(t.value.relativePath,s.value.link)};G([t,s,be],l),j(l);const v=g(()=>i.value?!0:s.value.items?de(t.value.relativePath,s.value.items):!1),d=g(()=>!!(s.value.items&&s.value.items.length));te(()=>{e.value=!!(o.value&&s.value.collapsed)}),Te(()=>{(i.value||v.value)&&(e.value=!1)});function m(){o.value&&(e.value=!e.value)}return{collapsed:e,collapsible:o,isLink:n,isActiveLink:i,hasActiveLink:v,hasChildren:d,toggle:m}}function Mt(){const{hasSidebar:s}=O(),t=le("(min-width: 960px)"),e=le("(min-width: 1280px)");return{isAsideEnabled:g(()=>!e.value&&!t.value?!1:s.value?e.value:t.value)}}const ve=[];function Ee(s){return typeof s.outline=="object"&&!Array.isArray(s.outline)&&s.outline.label||s.outlineTitle||"On this page"}function ke(s){const t=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(e=>e.id&&e.hasChildNodes()).map(e=>{const o=Number(e.tagName[1]);return{element:e,title:At(e),link:"#"+e.id,level:o}});return Ct(t,s)}function At(s){let t="";for(const e of s.childNodes)if(e.nodeType===1){if(e.classList.contains("VPBadge")||e.classList.contains("header-anchor")||e.classList.contains("ignore-header"))continue;t+=e.textContent}else e.nodeType===3&&(t+=e.textContent);return t.trim()}function Ct(s,t){if(t===!1)return[];const e=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2,[o,n]=typeof e=="number"?[e,e]:e==="deep"?[2,6]:e;s=s.filter(l=>l.level>=o&&l.level<=n),ve.length=0;for(const{element:l,link:v}of s)ve.push({element:l,link:v});const i=[];e:for(let l=0;l=0;d--){const m=s[d];if(m.level{requestAnimationFrame(i),window.addEventListener("scroll",o)}),Ze(()=>{l(location.hash)}),fe(()=>{window.removeEventListener("scroll",o)});function i(){if(!e.value)return;const v=window.scrollY,d=window.innerHeight,m=document.body.offsetHeight,P=Math.abs(v+d-m)<1,k=ve.map(({element:S,link:A})=>({link:A,top:Ht(S)})).filter(({top:S})=>!Number.isNaN(S)).sort((S,A)=>S.top-A.top);if(!k.length){l(null);return}if(v<1){l(null);return}if(P){l(k[k.length-1].link);return}let V=null;for(const{link:S,top:A}of k){if(A>v+xe()+4)break;V=S}l(V)}function l(v){n&&n.classList.remove("active"),v==null?n=null:n=s.value.querySelector(`a[href="${decodeURIComponent(v)}"]`);const d=n;d?(d.classList.add("active"),t.value.style.top=d.offsetTop+39+"px",t.value.style.opacity="1"):(t.value.style.top="33px",t.value.style.opacity="0")}}function Ht(s){let t=0;for(;s!==document.body;){if(s===null)return NaN;t+=s.offsetTop,s=s.offsetParent}return t}const Et=["href","title"],Dt=_({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(s){function t({target:e}){const o=e.href.split("#")[1],n=document.getElementById(decodeURIComponent(o));n==null||n.focus({preventScroll:!0})}return(e,o)=>{const n=K("VPDocOutlineItem",!0);return a(),u("ul",{class:N(["VPDocOutlineItem",e.root?"root":"nested"])},[(a(!0),u(M,null,E(e.headers,({children:i,link:l,title:v})=>(a(),u("li",null,[h("a",{class:"outline-link",href:l,onClick:t,title:v},T(v),9,Et),i!=null&&i.length?(a(),y(n,{key:0,headers:i},null,8,["headers"])):f("",!0)]))),256))],2)}}}),De=$(Dt,[["__scopeId","data-v-3f927ebe"]]),Ft=s=>(B("data-v-c14bfc45"),s=s(),H(),s),Ot={class:"content"},Ut={class:"outline-title",role:"heading","aria-level":"2"},jt={"aria-labelledby":"doc-outline-aria-label"},Gt=Ft(()=>h("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),zt=_({__name:"VPDocAsideOutline",setup(s){const{frontmatter:t,theme:e}=L(),o=we([]);se(()=>{o.value=ke(t.value.outline??e.value.outline)});const n=w(),i=w();return Bt(n,i),(l,v)=>(a(),u("div",{class:N(["VPDocAsideOutline",{"has-outline":o.value.length>0}]),ref_key:"container",ref:n,role:"navigation"},[h("div",Ot,[h("div",{class:"outline-marker",ref_key:"marker",ref:i},null,512),h("div",Ut,T(r(Ee)(r(e))),1),h("nav",jt,[Gt,b(De,{headers:o.value,root:!0},null,8,["headers"])])])],2))}}),Kt=$(zt,[["__scopeId","data-v-c14bfc45"]]),Rt={class:"VPDocAsideCarbonAds"},Wt=_({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(s){const t=()=>null;return(e,o)=>(a(),u("div",Rt,[b(r(t),{"carbon-ads":e.carbonAds},null,8,["carbon-ads"])]))}}),qt=s=>(B("data-v-6d7b3c46"),s=s(),H(),s),Jt={class:"VPDocAside"},Yt=qt(()=>h("div",{class:"spacer"},null,-1)),Xt=_({__name:"VPDocAside",setup(s){const{theme:t}=L();return(e,o)=>(a(),u("div",Jt,[c(e.$slots,"aside-top",{},void 0,!0),c(e.$slots,"aside-outline-before",{},void 0,!0),b(Kt),c(e.$slots,"aside-outline-after",{},void 0,!0),Yt,c(e.$slots,"aside-ads-before",{},void 0,!0),r(t).carbonAds?(a(),y(Wt,{key:0,"carbon-ads":r(t).carbonAds},null,8,["carbon-ads"])):f("",!0),c(e.$slots,"aside-ads-after",{},void 0,!0),c(e.$slots,"aside-bottom",{},void 0,!0)]))}}),Qt=$(Xt,[["__scopeId","data-v-6d7b3c46"]]);function Zt(){const{theme:s,page:t}=L();return g(()=>{const{text:e="Edit this page",pattern:o=""}=s.value.editLink||{};let n;return typeof o=="function"?n=o(t.value):n=o.replace(/:path/g,t.value.filePath),{url:n,text:e}})}function xt(){const{page:s,theme:t,frontmatter:e}=L();return g(()=>{var d,m,P,k,V,S,A,C;const o=He(t.value.sidebar,s.value.relativePath),n=wt(o),i=n.findIndex(I=>z(s.value.relativePath,I.link)),l=((d=t.value.docFooter)==null?void 0:d.prev)===!1&&!e.value.prev||e.value.prev===!1,v=((m=t.value.docFooter)==null?void 0:m.next)===!1&&!e.value.next||e.value.next===!1;return{prev:l?void 0:{text:(typeof e.value.prev=="string"?e.value.prev:typeof e.value.prev=="object"?e.value.prev.text:void 0)??((P=n[i-1])==null?void 0:P.docFooterText)??((k=n[i-1])==null?void 0:k.text),link:(typeof e.value.prev=="object"?e.value.prev.link:void 0)??((V=n[i-1])==null?void 0:V.link)},next:v?void 0:{text:(typeof e.value.next=="string"?e.value.next:typeof e.value.next=="object"?e.value.next.text:void 0)??((S=n[i+1])==null?void 0:S.docFooterText)??((A=n[i+1])==null?void 0:A.text),link:(typeof e.value.next=="object"?e.value.next.link:void 0)??((C=n[i+1])==null?void 0:C.link)}}})}const F=_({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(s){const t=s,e=g(()=>t.tag??(t.href?"a":"span")),o=g(()=>t.href&&Ie.test(t.href));return(n,i)=>(a(),y(W(e.value),{class:N(["VPLink",{link:n.href,"vp-external-link-icon":o.value,"no-icon":n.noIcon}]),href:n.href?r(me)(n.href):void 0,target:n.target??(o.value?"_blank":void 0),rel:n.rel??(o.value?"noreferrer":void 0)},{default:p(()=>[c(n.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),es={class:"VPLastUpdated"},ts=["datetime"],ss=_({__name:"VPDocFooterLastUpdated",setup(s){const{theme:t,page:e,frontmatter:o,lang:n}=L(),i=g(()=>new Date(o.value.lastUpdated??e.value.lastUpdated)),l=g(()=>i.value.toISOString()),v=w("");return j(()=>{te(()=>{var d,m,P;v.value=new Intl.DateTimeFormat((m=(d=t.value.lastUpdated)==null?void 0:d.formatOptions)!=null&&m.forceLocale?n.value:void 0,((P=t.value.lastUpdated)==null?void 0:P.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(i.value)})}),(d,m)=>{var P;return a(),u("p",es,[D(T(((P=r(t).lastUpdated)==null?void 0:P.text)||r(t).lastUpdatedText||"Last updated")+": ",1),h("time",{datetime:l.value},T(v.value),9,ts)])}}}),os=$(ss,[["__scopeId","data-v-9da12f1d"]]),ns=s=>(B("data-v-87be45d1"),s=s(),H(),s),as={key:0,class:"VPDocFooter"},rs={key:0,class:"edit-info"},is={key:0,class:"edit-link"},ls=ns(()=>h("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),cs={key:1,class:"last-updated"},us={key:1,class:"prev-next"},ds={class:"pager"},vs=["innerHTML"],ps=["innerHTML"],hs={class:"pager"},fs=["innerHTML"],_s=["innerHTML"],ms=_({__name:"VPDocFooter",setup(s){const{theme:t,page:e,frontmatter:o}=L(),n=Zt(),i=xt(),l=g(()=>t.value.editLink&&o.value.editLink!==!1),v=g(()=>e.value.lastUpdated&&o.value.lastUpdated!==!1),d=g(()=>l.value||v.value||i.value.prev||i.value.next);return(m,P)=>{var k,V,S,A;return d.value?(a(),u("footer",as,[c(m.$slots,"doc-footer-before",{},void 0,!0),l.value||v.value?(a(),u("div",rs,[l.value?(a(),u("div",is,[b(F,{class:"edit-link-button",href:r(n).url,"no-icon":!0},{default:p(()=>[ls,D(" "+T(r(n).text),1)]),_:1},8,["href"])])):f("",!0),v.value?(a(),u("div",cs,[b(os)])):f("",!0)])):f("",!0),(k=r(i).prev)!=null&&k.link||(V=r(i).next)!=null&&V.link?(a(),u("nav",us,[h("div",ds,[(S=r(i).prev)!=null&&S.link?(a(),y(F,{key:0,class:"pager-link prev",href:r(i).prev.link},{default:p(()=>{var C;return[h("span",{class:"desc",innerHTML:((C=r(t).docFooter)==null?void 0:C.prev)||"Previous page"},null,8,vs),h("span",{class:"title",innerHTML:r(i).prev.text},null,8,ps)]}),_:1},8,["href"])):f("",!0)]),h("div",hs,[(A=r(i).next)!=null&&A.link?(a(),y(F,{key:0,class:"pager-link next",href:r(i).next.link},{default:p(()=>{var C;return[h("span",{class:"desc",innerHTML:((C=r(t).docFooter)==null?void 0:C.next)||"Next page"},null,8,fs),h("span",{class:"title",innerHTML:r(i).next.text},null,8,_s)]}),_:1},8,["href"])):f("",!0)])])):f("",!0)])):f("",!0)}}}),bs=$(ms,[["__scopeId","data-v-87be45d1"]]),ks=s=>(B("data-v-83890dd9"),s=s(),H(),s),$s={class:"container"},gs=ks(()=>h("div",{class:"aside-curtain"},null,-1)),ys={class:"aside-container"},Ps={class:"aside-content"},Ss={class:"content"},Vs={class:"content-container"},Ls={class:"main"},Ts=_({__name:"VPDoc",setup(s){const{theme:t}=L(),e=oe(),{hasSidebar:o,hasAside:n,leftAside:i}=O(),l=g(()=>e.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(v,d)=>{const m=K("Content");return a(),u("div",{class:N(["VPDoc",{"has-sidebar":r(o),"has-aside":r(n)}])},[c(v.$slots,"doc-top",{},void 0,!0),h("div",$s,[r(n)?(a(),u("div",{key:0,class:N(["aside",{"left-aside":r(i)}])},[gs,h("div",ys,[h("div",Ps,[b(Qt,null,{"aside-top":p(()=>[c(v.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[c(v.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[c(v.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[c(v.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[c(v.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[c(v.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):f("",!0),h("div",Ss,[h("div",Vs,[c(v.$slots,"doc-before",{},void 0,!0),h("main",Ls,[b(m,{class:N(["vp-doc",[l.value,r(t).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),b(bs,null,{"doc-footer-before":p(()=>[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)}}}),ws=$(Ts,[["__scopeId","data-v-83890dd9"]]),Is=_({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(s){const t=s,e=g(()=>t.href&&Ie.test(t.href)),o=g(()=>t.tag||t.href?"a":"button");return(n,i)=>(a(),y(W(o.value),{class:N(["VPButton",[n.size,n.theme]]),href:n.href?r(me)(n.href):void 0,target:t.target??(e.value?"_blank":void 0),rel:t.rel??(e.value?"noreferrer":void 0)},{default:p(()=>[D(T(n.text),1)]),_:1},8,["class","href","target","rel"]))}}),Ns=$(Is,[["__scopeId","data-v-14206e74"]]),Ms=["src","alt"],As=_({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(s){return(t,e)=>{const o=K("VPImage",!0);return t.image?(a(),u(M,{key:0},[typeof t.image=="string"||"src"in t.image?(a(),u("img",Z({key:0,class:"VPImage"},typeof t.image=="string"?t.$attrs:{...t.image,...t.$attrs},{src:r(he)(typeof t.image=="string"?t.image:t.image.src),alt:t.alt??(typeof t.image=="string"?"":t.image.alt||"")}),null,16,Ms)):(a(),u(M,{key:1},[b(o,Z({class:"dark",image:t.image.dark,alt:t.image.alt},t.$attrs),null,16,["image","alt"]),b(o,Z({class:"light",image:t.image.light,alt:t.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):f("",!0)}}}),ee=$(As,[["__scopeId","data-v-35a7d0b8"]]),Cs=s=>(B("data-v-955009fc"),s=s(),H(),s),Bs={class:"container"},Hs={class:"main"},Es={key:0,class:"name"},Ds=["innerHTML"],Fs=["innerHTML"],Os=["innerHTML"],Us={key:0,class:"actions"},js={key:0,class:"image"},Gs={class:"image-container"},zs=Cs(()=>h("div",{class:"image-bg"},null,-1)),Ks=_({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(s){const t=J("hero-image-slot-exists");return(e,o)=>(a(),u("div",{class:N(["VPHero",{"has-image":e.image||r(t)}])},[h("div",Bs,[h("div",Hs,[c(e.$slots,"home-hero-info-before",{},void 0,!0),c(e.$slots,"home-hero-info",{},()=>[e.name?(a(),u("h1",Es,[h("span",{innerHTML:e.name,class:"clip"},null,8,Ds)])):f("",!0),e.text?(a(),u("p",{key:1,innerHTML:e.text,class:"text"},null,8,Fs)):f("",!0),e.tagline?(a(),u("p",{key:2,innerHTML:e.tagline,class:"tagline"},null,8,Os)):f("",!0)],!0),c(e.$slots,"home-hero-info-after",{},void 0,!0),e.actions?(a(),u("div",Us,[(a(!0),u(M,null,E(e.actions,n=>(a(),u("div",{key:n.link,class:"action"},[b(Ns,{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))])):f("",!0),c(e.$slots,"home-hero-actions-after",{},void 0,!0)]),e.image||r(t)?(a(),u("div",js,[h("div",Gs,[zs,c(e.$slots,"home-hero-image",{},()=>[e.image?(a(),y(ee,{key:0,class:"image-src",image:e.image},null,8,["image"])):f("",!0)],!0)])])):f("",!0)])],2))}}),Rs=$(Ks,[["__scopeId","data-v-955009fc"]]),Ws=_({__name:"VPHomeHero",setup(s){const{frontmatter:t}=L();return(e,o)=>r(t).hero?(a(),y(Rs,{key:0,class:"VPHomeHero",name:r(t).hero.name,text:r(t).hero.text,tagline:r(t).hero.tagline,image:r(t).hero.image,actions:r(t).hero.actions},{"home-hero-info-before":p(()=>[c(e.$slots,"home-hero-info-before")]),"home-hero-info":p(()=>[c(e.$slots,"home-hero-info")]),"home-hero-info-after":p(()=>[c(e.$slots,"home-hero-info-after")]),"home-hero-actions-after":p(()=>[c(e.$slots,"home-hero-actions-after")]),"home-hero-image":p(()=>[c(e.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):f("",!0)}}),qs=s=>(B("data-v-f5e9645b"),s=s(),H(),s),Js={class:"box"},Ys={key:0,class:"icon"},Xs=["innerHTML"],Qs=["innerHTML"],Zs=["innerHTML"],xs={key:4,class:"link-text"},eo={class:"link-text-value"},to=qs(()=>h("span",{class:"vpi-arrow-right link-text-icon"},null,-1)),so=_({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(s){return(t,e)=>(a(),y(F,{class:"VPFeature",href:t.link,rel:t.rel,target:t.target,"no-icon":!0,tag:t.link?"a":"div"},{default:p(()=>[h("article",Js,[typeof t.icon=="object"&&t.icon.wrap?(a(),u("div",Ys,[b(ee,{image:t.icon,alt:t.icon.alt,height:t.icon.height||48,width:t.icon.width||48},null,8,["image","alt","height","width"])])):typeof t.icon=="object"?(a(),y(ee,{key:1,image:t.icon,alt:t.icon.alt,height:t.icon.height||48,width:t.icon.width||48},null,8,["image","alt","height","width"])):t.icon?(a(),u("div",{key:2,class:"icon",innerHTML:t.icon},null,8,Xs)):f("",!0),h("h2",{class:"title",innerHTML:t.title},null,8,Qs),t.details?(a(),u("p",{key:3,class:"details",innerHTML:t.details},null,8,Zs)):f("",!0),t.linkText?(a(),u("div",xs,[h("p",eo,[D(T(t.linkText)+" ",1),to])])):f("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),oo=$(so,[["__scopeId","data-v-f5e9645b"]]),no={key:0,class:"VPFeatures"},ao={class:"container"},ro={class:"items"},io=_({__name:"VPFeatures",props:{features:{}},setup(s){const t=s,e=g(()=>{const o=t.features.length;if(o){if(o===2)return"grid-2";if(o===3)return"grid-3";if(o%3===0)return"grid-6";if(o>3)return"grid-4"}else return});return(o,n)=>o.features?(a(),u("div",no,[h("div",ao,[h("div",ro,[(a(!0),u(M,null,E(o.features,i=>(a(),u("div",{key:i.title,class:N(["item",[e.value]])},[b(oo,{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))])])])):f("",!0)}}),lo=$(io,[["__scopeId","data-v-d0a190d7"]]),co=_({__name:"VPHomeFeatures",setup(s){const{frontmatter:t}=L();return(e,o)=>r(t).features?(a(),y(lo,{key:0,class:"VPHomeFeatures",features:r(t).features},null,8,["features"])):f("",!0)}}),uo=_({__name:"VPHomeContent",setup(s){const{width:t}=et({includeScrollbar:!1});return(e,o)=>(a(),u("div",{class:"vp-doc container",style:Ne(r(t)?{"--vp-offset":`calc(50% - ${r(t)/2}px)`}:{})},[c(e.$slots,"default",{},void 0,!0)],4))}}),vo=$(uo,[["__scopeId","data-v-c43247eb"]]),po={class:"VPHome"},ho=_({__name:"VPHome",setup(s){const{frontmatter:t}=L();return(e,o)=>{const n=K("Content");return a(),u("div",po,[c(e.$slots,"home-hero-before",{},void 0,!0),b(Ws,null,{"home-hero-info-before":p(()=>[c(e.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":p(()=>[c(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":p(()=>[c(e.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":p(()=>[c(e.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":p(()=>[c(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),c(e.$slots,"home-hero-after",{},void 0,!0),c(e.$slots,"home-features-before",{},void 0,!0),b(co),c(e.$slots,"home-features-after",{},void 0,!0),r(t).markdownStyles!==!1?(a(),y(vo,{key:0},{default:p(()=>[b(n)]),_:1})):(a(),y(n,{key:1}))])}}}),fo=$(ho,[["__scopeId","data-v-cbb6ec48"]]),_o={},mo={class:"VPPage"};function bo(s,t){const e=K("Content");return a(),u("div",mo,[c(s.$slots,"page-top"),b(e),c(s.$slots,"page-bottom")])}const ko=$(_o,[["render",bo]]),$o=_({__name:"VPContent",setup(s){const{page:t,frontmatter:e}=L(),{hasSidebar:o}=O();return(n,i)=>(a(),u("div",{class:N(["VPContent",{"has-sidebar":r(o),"is-home":r(e).layout==="home"}]),id:"VPContent"},[r(t).isNotFound?c(n.$slots,"not-found",{key:0},()=>[b(Lt)],!0):r(e).layout==="page"?(a(),y(ko,{key:1},{"page-top":p(()=>[c(n.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[c(n.$slots,"page-bottom",{},void 0,!0)]),_:3})):r(e).layout==="home"?(a(),y(fo,{key:2},{"home-hero-before":p(()=>[c(n.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":p(()=>[c(n.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":p(()=>[c(n.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":p(()=>[c(n.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":p(()=>[c(n.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":p(()=>[c(n.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[c(n.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[c(n.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[c(n.$slots,"home-features-after",{},void 0,!0)]),_:3})):r(e).layout&&r(e).layout!=="doc"?(a(),y(W(r(e).layout),{key:3})):(a(),y(ws,{key:4},{"doc-top":p(()=>[c(n.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[c(n.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":p(()=>[c(n.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[c(n.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[c(n.$slots,"doc-after",{},void 0,!0)]),"aside-top":p(()=>[c(n.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":p(()=>[c(n.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[c(n.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[c(n.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[c(n.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":p(()=>[c(n.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),go=$($o,[["__scopeId","data-v-91765379"]]),yo={class:"container"},Po=["innerHTML"],So=["innerHTML"],Vo=_({__name:"VPFooter",setup(s){const{theme:t,frontmatter:e}=L(),{hasSidebar:o}=O();return(n,i)=>r(t).footer&&r(e).footer!==!1?(a(),u("footer",{key:0,class:N(["VPFooter",{"has-sidebar":r(o)}])},[h("div",yo,[r(t).footer.message?(a(),u("p",{key:0,class:"message",innerHTML:r(t).footer.message},null,8,Po)):f("",!0),r(t).footer.copyright?(a(),u("p",{key:1,class:"copyright",innerHTML:r(t).footer.copyright},null,8,So)):f("",!0)])],2)):f("",!0)}}),Lo=$(Vo,[["__scopeId","data-v-c970a860"]]);function Fe(){const{theme:s,frontmatter:t}=L(),e=we([]),o=g(()=>e.value.length>0);return se(()=>{e.value=ke(t.value.outline??s.value.outline)}),{headers:e,hasLocalNav:o}}const To=s=>(B("data-v-c9ba27ad"),s=s(),H(),s),wo=To(()=>h("span",{class:"vpi-chevron-right icon"},null,-1)),Io={class:"header"},No={class:"outline"},Mo=_({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(s){const t=s,{theme:e}=L(),o=w(!1),n=w(0),i=w(),l=w();tt(i,()=>{o.value=!1}),ce("Escape",()=>{o.value=!1}),se(()=>{o.value=!1});function v(){o.value=!o.value,n.value=window.innerHeight+Math.min(window.scrollY-t.navHeight,0)}function d(P){P.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Me(()=>{o.value=!1}))}function m(){o.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(P,k)=>(a(),u("div",{class:"VPLocalNavOutlineDropdown",style:Ne({"--vp-vh":n.value+"px"}),ref_key:"main",ref:i},[P.headers.length>0?(a(),u("button",{key:0,onClick:v,class:N({open:o.value})},[D(T(r(Ee)(r(e)))+" ",1),wo],2)):(a(),u("button",{key:1,onClick:m},T(r(e).returnToTopLabel||"Return to top"),1)),b(pe,{name:"flyout"},{default:p(()=>[o.value?(a(),u("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:d},[h("div",Io,[h("a",{class:"top-link",href:"#",onClick:m},T(r(e).returnToTopLabel||"Return to top"),1)]),h("div",No,[b(De,{headers:P.headers},null,8,["headers"])])],512)):f("",!0)]),_:1})],4))}}),Ao=$(Mo,[["__scopeId","data-v-c9ba27ad"]]),Co=s=>(B("data-v-070ab83d"),s=s(),H(),s),Bo={class:"container"},Ho=["aria-expanded"],Eo=Co(()=>h("span",{class:"vpi-align-left menu-icon"},null,-1)),Do={class:"menu-text"},Fo=_({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(s){const{theme:t,frontmatter:e}=L(),{hasSidebar:o}=O(),{headers:n}=Fe(),{y:i}=Ae(),l=w(0);j(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),se(()=>{n.value=ke(e.value.outline??t.value.outline)});const v=g(()=>n.value.length===0),d=g(()=>v.value&&!o.value),m=g(()=>({VPLocalNav:!0,"has-sidebar":o.value,empty:v.value,fixed:d.value}));return(P,k)=>r(e).layout!=="home"&&(!d.value||r(i)>=l.value)?(a(),u("div",{key:0,class:N(m.value)},[h("div",Bo,[r(o)?(a(),u("button",{key:0,class:"menu","aria-expanded":P.open,"aria-controls":"VPSidebarNav",onClick:k[0]||(k[0]=V=>P.$emit("open-menu"))},[Eo,h("span",Do,T(r(t).sidebarMenuLabel||"Menu"),1)],8,Ho)):f("",!0),b(Ao,{headers:r(n),navHeight:l.value},null,8,["headers","navHeight"])])],2)):f("",!0)}}),Oo=$(Fo,[["__scopeId","data-v-070ab83d"]]);function Uo(){const s=w(!1);function t(){s.value=!0,window.addEventListener("resize",n)}function e(){s.value=!1,window.removeEventListener("resize",n)}function o(){s.value?e():t()}function n(){window.outerWidth>=768&&e()}const i=oe();return G(()=>i.path,e),{isScreenOpen:s,openScreen:t,closeScreen:e,toggleScreen:o}}const jo={},Go={class:"VPSwitch",type:"button",role:"switch"},zo={class:"check"},Ko={key:0,class:"icon"};function Ro(s,t){return a(),u("button",Go,[h("span",zo,[s.$slots.default?(a(),u("span",Ko,[c(s.$slots,"default",{},void 0,!0)])):f("",!0)])])}const Wo=$(jo,[["render",Ro],["__scopeId","data-v-4a1c76db"]]),Oe=s=>(B("data-v-b79b56d4"),s=s(),H(),s),qo=Oe(()=>h("span",{class:"vpi-sun sun"},null,-1)),Jo=Oe(()=>h("span",{class:"vpi-moon moon"},null,-1)),Yo=_({__name:"VPSwitchAppearance",setup(s){const{isDark:t,theme:e}=L(),o=J("toggle-appearance",()=>{t.value=!t.value}),n=g(()=>t.value?e.value.lightModeSwitchTitle||"Switch to light theme":e.value.darkModeSwitchTitle||"Switch to dark theme");return(i,l)=>(a(),y(Wo,{title:n.value,class:"VPSwitchAppearance","aria-checked":r(t),onClick:r(o)},{default:p(()=>[qo,Jo]),_:1},8,["title","aria-checked","onClick"]))}}),$e=$(Yo,[["__scopeId","data-v-b79b56d4"]]),Xo={key:0,class:"VPNavBarAppearance"},Qo=_({__name:"VPNavBarAppearance",setup(s){const{site:t}=L();return(e,o)=>r(t).appearance&&r(t).appearance!=="force-dark"?(a(),u("div",Xo,[b($e)])):f("",!0)}}),Zo=$(Qo,[["__scopeId","data-v-ead91a81"]]),ge=w();let Ue=!1,ie=0;function xo(s){const t=w(!1);if(q){!Ue&&en(),ie++;const e=G(ge,o=>{var n,i,l;o===s.el.value||(n=s.el.value)!=null&&n.contains(o)?(t.value=!0,(i=s.onFocus)==null||i.call(s)):(t.value=!1,(l=s.onBlur)==null||l.call(s))});fe(()=>{e(),ie--,ie||tn()})}return st(t)}function en(){document.addEventListener("focusin",je),Ue=!0,ge.value=document.activeElement}function tn(){document.removeEventListener("focusin",je)}function je(){ge.value=document.activeElement}const sn={class:"VPMenuLink"},on=_({__name:"VPMenuLink",props:{item:{}},setup(s){const{page:t}=L();return(e,o)=>(a(),u("div",sn,[b(F,{class:N({active:r(z)(r(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel},{default:p(()=>[D(T(e.item.text),1)]),_:1},8,["class","href","target","rel"])]))}}),ne=$(on,[["__scopeId","data-v-8b74d055"]]),nn={class:"VPMenuGroup"},an={key:0,class:"title"},rn=_({__name:"VPMenuGroup",props:{text:{},items:{}},setup(s){return(t,e)=>(a(),u("div",nn,[t.text?(a(),u("p",an,T(t.text),1)):f("",!0),(a(!0),u(M,null,E(t.items,o=>(a(),u(M,null,["link"in o?(a(),y(ne,{key:0,item:o},null,8,["item"])):f("",!0)],64))),256))]))}}),ln=$(rn,[["__scopeId","data-v-48c802d0"]]),cn={class:"VPMenu"},un={key:0,class:"items"},dn=_({__name:"VPMenu",props:{items:{}},setup(s){return(t,e)=>(a(),u("div",cn,[t.items?(a(),u("div",un,[(a(!0),u(M,null,E(t.items,o=>(a(),u(M,{key:o.text},["link"in o?(a(),y(ne,{key:0,item:o},null,8,["item"])):(a(),y(ln,{key:1,text:o.text,items:o.items},null,8,["text","items"]))],64))),128))])):f("",!0),c(t.$slots,"default",{},void 0,!0)]))}}),vn=$(dn,[["__scopeId","data-v-97491713"]]),pn=s=>(B("data-v-e5380155"),s=s(),H(),s),hn=["aria-expanded","aria-label"],fn={key:0,class:"text"},_n=["innerHTML"],mn=pn(()=>h("span",{class:"vpi-chevron-down text-icon"},null,-1)),bn={key:1,class:"vpi-more-horizontal icon"},kn={class:"menu"},$n=_({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(s){const t=w(!1),e=w();xo({el:e,onBlur:o});function o(){t.value=!1}return(n,i)=>(a(),u("div",{class:"VPFlyout",ref_key:"el",ref:e,onMouseenter:i[1]||(i[1]=l=>t.value=!0),onMouseleave:i[2]||(i[2]=l=>t.value=!1)},[h("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":n.label,onClick:i[0]||(i[0]=l=>t.value=!t.value)},[n.button||n.icon?(a(),u("span",fn,[n.icon?(a(),u("span",{key:0,class:N([n.icon,"option-icon"])},null,2)):f("",!0),n.button?(a(),u("span",{key:1,innerHTML:n.button},null,8,_n)):f("",!0),mn])):(a(),u("span",bn))],8,hn),h("div",kn,[b(vn,{items:n.items},{default:p(()=>[c(n.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),ye=$($n,[["__scopeId","data-v-e5380155"]]),gn=["href","aria-label","innerHTML"],yn=_({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(s){const t=s,e=g(()=>typeof t.icon=="object"?t.icon.svg:``);return(o,n)=>(a(),u("a",{class:"VPSocialLink no-icon",href:o.link,"aria-label":o.ariaLabel??(typeof o.icon=="string"?o.icon:""),target:"_blank",rel:"noopener",innerHTML:e.value},null,8,gn))}}),Pn=$(yn,[["__scopeId","data-v-717b8b75"]]),Sn={class:"VPSocialLinks"},Vn=_({__name:"VPSocialLinks",props:{links:{}},setup(s){return(t,e)=>(a(),u("div",Sn,[(a(!0),u(M,null,E(t.links,({link:o,icon:n,ariaLabel:i})=>(a(),y(Pn,{key:o,icon:n,link:o,ariaLabel:i},null,8,["icon","link","ariaLabel"]))),128))]))}}),Pe=$(Vn,[["__scopeId","data-v-ee7a9424"]]),Ln={key:0,class:"group translations"},Tn={class:"trans-title"},wn={key:1,class:"group"},In={class:"item appearance"},Nn={class:"label"},Mn={class:"appearance-action"},An={key:2,class:"group"},Cn={class:"item social-links"},Bn=_({__name:"VPNavBarExtra",setup(s){const{site:t,theme:e}=L(),{localeLinks:o,currentLang:n}=X({correspondingLink:!0}),i=g(()=>o.value.length&&n.value.label||t.value.appearance||e.value.socialLinks);return(l,v)=>i.value?(a(),y(ye,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:p(()=>[r(o).length&&r(n).label?(a(),u("div",Ln,[h("p",Tn,T(r(n).label),1),(a(!0),u(M,null,E(r(o),d=>(a(),y(ne,{key:d.link,item:d},null,8,["item"]))),128))])):f("",!0),r(t).appearance&&r(t).appearance!=="force-dark"?(a(),u("div",wn,[h("div",In,[h("p",Nn,T(r(e).darkModeSwitchLabel||"Appearance"),1),h("div",Mn,[b($e)])])])):f("",!0),r(e).socialLinks?(a(),u("div",An,[h("div",Cn,[b(Pe,{class:"social-links-list",links:r(e).socialLinks},null,8,["links"])])])):f("",!0)]),_:1})):f("",!0)}}),Hn=$(Bn,[["__scopeId","data-v-9b536d0b"]]),En=s=>(B("data-v-5dea55bf"),s=s(),H(),s),Dn=["aria-expanded"],Fn=En(()=>h("span",{class:"container"},[h("span",{class:"top"}),h("span",{class:"middle"}),h("span",{class:"bottom"})],-1)),On=[Fn],Un=_({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(s){return(t,e)=>(a(),u("button",{type:"button",class:N(["VPNavBarHamburger",{active:t.active}]),"aria-label":"mobile navigation","aria-expanded":t.active,"aria-controls":"VPNavScreen",onClick:e[0]||(e[0]=o=>t.$emit("click"))},On,10,Dn))}}),jn=$(Un,[["__scopeId","data-v-5dea55bf"]]),Gn=["innerHTML"],zn=_({__name:"VPNavBarMenuLink",props:{item:{}},setup(s){const{page:t}=L();return(e,o)=>(a(),y(F,{class:N({VPNavBarMenuLink:!0,active:r(z)(r(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,tabindex:"0"},{default:p(()=>[h("span",{innerHTML:e.item.text},null,8,Gn)]),_:1},8,["class","href","target","rel"]))}}),Kn=$(zn,[["__scopeId","data-v-2781b5e7"]]),Rn=_({__name:"VPNavBarMenuGroup",props:{item:{}},setup(s){const t=s,{page:e}=L(),o=i=>"link"in i?z(e.value.relativePath,i.link,!!t.item.activeMatch):i.items.some(o),n=g(()=>o(t.item));return(i,l)=>(a(),y(ye,{class:N({VPNavBarMenuGroup:!0,active:r(z)(r(e).relativePath,i.item.activeMatch,!!i.item.activeMatch)||n.value}),button:i.item.text,items:i.item.items},null,8,["class","button","items"]))}}),Wn=s=>(B("data-v-492ea56d"),s=s(),H(),s),qn={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},Jn=Wn(()=>h("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),Yn=_({__name:"VPNavBarMenu",setup(s){const{theme:t}=L();return(e,o)=>r(t).nav?(a(),u("nav",qn,[Jn,(a(!0),u(M,null,E(r(t).nav,n=>(a(),u(M,{key:n.text},["link"in n?(a(),y(Kn,{key:0,item:n},null,8,["item"])):(a(),y(Rn,{key:1,item:n},null,8,["item"]))],64))),128))])):f("",!0)}}),Xn=$(Yn,[["__scopeId","data-v-492ea56d"]]);function Qn(s){const{localeIndex:t,theme:e}=L();function o(n){var A,C,I;const i=n.split("."),l=(A=e.value.search)==null?void 0:A.options,v=l&&typeof l=="object",d=v&&((I=(C=l.locales)==null?void 0:C[t.value])==null?void 0:I.translations)||null,m=v&&l.translations||null;let P=d,k=m,V=s;const S=i.pop();for(const Q of i){let U=null;const R=V==null?void 0:V[Q];R&&(U=V=R);const ae=k==null?void 0:k[Q];ae&&(U=k=ae);const re=P==null?void 0:P[Q];re&&(U=P=re),R||(V=U),ae||(k=U),re||(P=U)}return(P==null?void 0:P[S])??(k==null?void 0:k[S])??(V==null?void 0:V[S])??""}return o}const Zn=["aria-label"],xn={class:"DocSearch-Button-Container"},ea=h("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1),ta={class:"DocSearch-Button-Placeholder"},sa=h("span",{class:"DocSearch-Button-Keys"},[h("kbd",{class:"DocSearch-Button-Key"}),h("kbd",{class:"DocSearch-Button-Key"},"K")],-1),Se=_({__name:"VPNavBarSearchButton",setup(s){const e=Qn({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(o,n)=>(a(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":r(e)("button.buttonAriaLabel")},[h("span",xn,[ea,h("span",ta,T(r(e)("button.buttonText")),1)]),sa],8,Zn))}}),oa={class:"VPNavBarSearch"},na={id:"local-search"},aa={key:1,id:"docsearch"},ra=_({__name:"VPNavBarSearch",setup(s){const t=ot(()=>nt(()=>import("./VPLocalSearchBox.CJhDNAGX.js"),__vite__mapDeps([0,1]))),e=()=>null,{theme:o}=L(),n=w(!1),i=w(!1);j(()=>{});function l(){n.value||(n.value=!0,setTimeout(v,16))}function v(){const k=new Event("keydown");k.key="k",k.metaKey=!0,window.dispatchEvent(k),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||v()},16)}function d(k){const V=k.target,S=V.tagName;return V.isContentEditable||S==="INPUT"||S==="SELECT"||S==="TEXTAREA"}const m=w(!1);ce("k",k=>{(k.ctrlKey||k.metaKey)&&(k.preventDefault(),m.value=!0)}),ce("/",k=>{d(k)||(k.preventDefault(),m.value=!0)});const P="local";return(k,V)=>{var S;return a(),u("div",oa,[r(P)==="local"?(a(),u(M,{key:0},[m.value?(a(),y(r(t),{key:0,onClose:V[0]||(V[0]=A=>m.value=!1)})):f("",!0),h("div",na,[b(Se,{onClick:V[1]||(V[1]=A=>m.value=!0)})])],64)):r(P)==="algolia"?(a(),u(M,{key:1},[n.value?(a(),y(r(e),{key:0,algolia:((S=r(o).search)==null?void 0:S.options)??r(o).algolia,onVnodeBeforeMount:V[2]||(V[2]=A=>i.value=!0)},null,8,["algolia"])):f("",!0),i.value?f("",!0):(a(),u("div",aa,[b(Se,{onClick:l})]))],64)):f("",!0)])}}}),ia=_({__name:"VPNavBarSocialLinks",setup(s){const{theme:t}=L();return(e,o)=>r(t).socialLinks?(a(),y(Pe,{key:0,class:"VPNavBarSocialLinks",links:r(t).socialLinks},null,8,["links"])):f("",!0)}}),la=$(ia,[["__scopeId","data-v-164c457f"]]),ca=["href","rel","target"],ua={key:1},da={key:2},va=_({__name:"VPNavBarTitle",setup(s){const{site:t,theme:e}=L(),{hasSidebar:o}=O(),{currentLang:n}=X(),i=g(()=>{var d;return typeof e.value.logoLink=="string"?e.value.logoLink:(d=e.value.logoLink)==null?void 0:d.link}),l=g(()=>{var d;return typeof e.value.logoLink=="string"||(d=e.value.logoLink)==null?void 0:d.rel}),v=g(()=>{var d;return typeof e.value.logoLink=="string"||(d=e.value.logoLink)==null?void 0:d.target});return(d,m)=>(a(),u("div",{class:N(["VPNavBarTitle",{"has-sidebar":r(o)}])},[h("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(e).logo?(a(),y(ee,{key:0,class:"logo",image:r(e).logo},null,8,["image"])):f("",!0),r(e).siteTitle?(a(),u("span",ua,T(r(e).siteTitle),1)):r(e).siteTitle===void 0?(a(),u("span",da,T(r(t).title),1)):f("",!0),c(d.$slots,"nav-bar-title-after",{},void 0,!0)],8,ca)],2))}}),pa=$(va,[["__scopeId","data-v-28a961f9"]]),ha={class:"items"},fa={class:"title"},_a=_({__name:"VPNavBarTranslations",setup(s){const{theme:t}=L(),{localeLinks:e,currentLang:o}=X({correspondingLink:!0});return(n,i)=>r(e).length&&r(o).label?(a(),y(ye,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:r(t).langMenuLabel||"Change language"},{default:p(()=>[h("div",ha,[h("p",fa,T(r(o).label),1),(a(!0),u(M,null,E(r(e),l=>(a(),y(ne,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):f("",!0)}}),ma=$(_a,[["__scopeId","data-v-c80d9ad0"]]),ba=s=>(B("data-v-b9c8b02d"),s=s(),H(),s),ka={class:"wrapper"},$a={class:"container"},ga={class:"title"},ya={class:"content"},Pa={class:"content-body"},Sa=ba(()=>h("div",{class:"divider"},[h("div",{class:"divider-line"})],-1)),Va=_({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(s){const{y:t}=Ae(),{hasSidebar:e}=O(),{hasLocalNav:o}=Fe(),{frontmatter:n}=L(),i=w({});return Te(()=>{i.value={"has-sidebar":e.value,"has-local-nav":o.value,top:n.value.layout==="home"&&t.value===0}}),(l,v)=>(a(),u("div",{class:N(["VPNavBar",i.value])},[h("div",ka,[h("div",$a,[h("div",ga,[b(pa,null,{"nav-bar-title-before":p(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),h("div",ya,[h("div",Pa,[c(l.$slots,"nav-bar-content-before",{},void 0,!0),b(ra,{class:"search"}),b(Xn,{class:"menu"}),b(ma,{class:"translations"}),b(Zo,{class:"appearance"}),b(la,{class:"social-links"}),b(Hn,{class:"extra"}),c(l.$slots,"nav-bar-content-after",{},void 0,!0),b(jn,{class:"hamburger",active:l.isScreenOpen,onClick:v[0]||(v[0]=d=>l.$emit("toggle-screen"))},null,8,["active"])])])])]),Sa],2))}}),La=$(Va,[["__scopeId","data-v-b9c8b02d"]]),Ta={key:0,class:"VPNavScreenAppearance"},wa={class:"text"},Ia=_({__name:"VPNavScreenAppearance",setup(s){const{site:t,theme:e}=L();return(o,n)=>r(t).appearance&&r(t).appearance!=="force-dark"?(a(),u("div",Ta,[h("p",wa,T(r(e).darkModeSwitchLabel||"Appearance"),1),b($e)])):f("",!0)}}),Na=$(Ia,[["__scopeId","data-v-2b89f08b"]]),Ma=_({__name:"VPNavScreenMenuLink",props:{item:{}},setup(s){const t=J("close-screen");return(e,o)=>(a(),y(F,{class:"VPNavScreenMenuLink",href:e.item.link,target:e.item.target,rel:e.item.rel,onClick:r(t)},{default:p(()=>[D(T(e.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),Aa=$(Ma,[["__scopeId","data-v-d45ba3e8"]]),Ca=_({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(s){const t=J("close-screen");return(e,o)=>(a(),y(F,{class:"VPNavScreenMenuGroupLink",href:e.item.link,target:e.item.target,rel:e.item.rel,onClick:r(t)},{default:p(()=>[D(T(e.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),Ge=$(Ca,[["__scopeId","data-v-7179dbb7"]]),Ba={class:"VPNavScreenMenuGroupSection"},Ha={key:0,class:"title"},Ea=_({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(s){return(t,e)=>(a(),u("div",Ba,[t.text?(a(),u("p",Ha,T(t.text),1)):f("",!0),(a(!0),u(M,null,E(t.items,o=>(a(),y(Ge,{key:o.text,item:o},null,8,["item"]))),128))]))}}),Da=$(Ea,[["__scopeId","data-v-4b8941ac"]]),Fa=s=>(B("data-v-c9df2649"),s=s(),H(),s),Oa=["aria-controls","aria-expanded"],Ua=["innerHTML"],ja=Fa(()=>h("span",{class:"vpi-plus button-icon"},null,-1)),Ga=["id"],za={key:1,class:"group"},Ka=_({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(s){const t=s,e=w(!1),o=g(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function n(){e.value=!e.value}return(i,l)=>(a(),u("div",{class:N(["VPNavScreenMenuGroup",{open:e.value}])},[h("button",{class:"button","aria-controls":o.value,"aria-expanded":e.value,onClick:n},[h("span",{class:"button-text",innerHTML:i.text},null,8,Ua),ja],8,Oa),h("div",{id:o.value,class:"items"},[(a(!0),u(M,null,E(i.items,v=>(a(),u(M,{key:v.text},["link"in v?(a(),u("div",{key:v.text,class:"item"},[b(Ge,{item:v},null,8,["item"])])):(a(),u("div",za,[b(Da,{text:v.text,items:v.items},null,8,["text","items"])]))],64))),128))],8,Ga)],2))}}),Ra=$(Ka,[["__scopeId","data-v-c9df2649"]]),Wa={key:0,class:"VPNavScreenMenu"},qa=_({__name:"VPNavScreenMenu",setup(s){const{theme:t}=L();return(e,o)=>r(t).nav?(a(),u("nav",Wa,[(a(!0),u(M,null,E(r(t).nav,n=>(a(),u(M,{key:n.text},["link"in n?(a(),y(Aa,{key:0,item:n},null,8,["item"])):(a(),y(Ra,{key:1,text:n.text||"",items:n.items},null,8,["text","items"]))],64))),128))])):f("",!0)}}),Ja=_({__name:"VPNavScreenSocialLinks",setup(s){const{theme:t}=L();return(e,o)=>r(t).socialLinks?(a(),y(Pe,{key:0,class:"VPNavScreenSocialLinks",links:r(t).socialLinks},null,8,["links"])):f("",!0)}}),ze=s=>(B("data-v-362991c2"),s=s(),H(),s),Ya=ze(()=>h("span",{class:"vpi-languages icon lang"},null,-1)),Xa=ze(()=>h("span",{class:"vpi-chevron-down icon chevron"},null,-1)),Qa={class:"list"},Za=_({__name:"VPNavScreenTranslations",setup(s){const{localeLinks:t,currentLang:e}=X({correspondingLink:!0}),o=w(!1);function n(){o.value=!o.value}return(i,l)=>r(t).length&&r(e).label?(a(),u("div",{key:0,class:N(["VPNavScreenTranslations",{open:o.value}])},[h("button",{class:"title",onClick:n},[Ya,D(" "+T(r(e).label)+" ",1),Xa]),h("ul",Qa,[(a(!0),u(M,null,E(r(t),v=>(a(),u("li",{key:v.link,class:"item"},[b(F,{class:"link",href:v.link},{default:p(()=>[D(T(v.text),1)]),_:2},1032,["href"])]))),128))])],2)):f("",!0)}}),xa=$(Za,[["__scopeId","data-v-362991c2"]]),er={class:"container"},tr=_({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(s){const t=w(null),e=Ce(q?document.body:null);return(o,n)=>(a(),y(pe,{name:"fade",onEnter:n[0]||(n[0]=i=>e.value=!0),onAfterLeave:n[1]||(n[1]=i=>e.value=!1)},{default:p(()=>[o.open?(a(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t,id:"VPNavScreen"},[h("div",er,[c(o.$slots,"nav-screen-content-before",{},void 0,!0),b(qa,{class:"menu"}),b(xa,{class:"translations"}),b(Na,{class:"appearance"}),b(Ja,{class:"social-links"}),c(o.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):f("",!0)]),_:3}))}}),sr=$(tr,[["__scopeId","data-v-382f42e9"]]),or={key:0,class:"VPNav"},nr=_({__name:"VPNav",setup(s){const{isScreenOpen:t,closeScreen:e,toggleScreen:o}=Uo(),{frontmatter:n}=L(),i=g(()=>n.value.navbar!==!1);return _e("close-screen",e),te(()=>{q&&document.documentElement.classList.toggle("hide-nav",!i.value)}),(l,v)=>i.value?(a(),u("header",or,[b(La,{"is-screen-open":r(t),onToggleScreen:r(o)},{"nav-bar-title-before":p(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[c(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[c(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),b(sr,{open:r(t)},{"nav-screen-content-before":p(()=>[c(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[c(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):f("",!0)}}),ar=$(nr,[["__scopeId","data-v-f1e365da"]]),Ke=s=>(B("data-v-f24171a4"),s=s(),H(),s),rr=["role","tabindex"],ir=Ke(()=>h("div",{class:"indicator"},null,-1)),lr=Ke(()=>h("span",{class:"vpi-chevron-right caret-icon"},null,-1)),cr=[lr],ur={key:1,class:"items"},dr=_({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(s){const t=s,{collapsed:e,collapsible:o,isLink:n,isActiveLink:i,hasActiveLink:l,hasChildren:v,toggle:d}=Nt(g(()=>t.item)),m=g(()=>v.value?"section":"div"),P=g(()=>n.value?"a":"div"),k=g(()=>v.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),V=g(()=>n.value?void 0:"button"),S=g(()=>[[`level-${t.depth}`],{collapsible:o.value},{collapsed:e.value},{"is-link":n.value},{"is-active":i.value},{"has-active":l.value}]);function A(I){"key"in I&&I.key!=="Enter"||!t.item.link&&d()}function C(){t.item.link&&d()}return(I,Q)=>{const U=K("VPSidebarItem",!0);return a(),y(W(m.value),{class:N(["VPSidebarItem",S.value])},{default:p(()=>[I.item.text?(a(),u("div",Z({key:0,class:"item",role:V.value},rt(I.item.items?{click:A,keydown:A}:{},!0),{tabindex:I.item.items&&0}),[ir,I.item.link?(a(),y(F,{key:0,tag:P.value,class:"link",href:I.item.link,rel:I.item.rel,target:I.item.target},{default:p(()=>[(a(),y(W(k.value),{class:"text",innerHTML:I.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),y(W(k.value),{key:1,class:"text",innerHTML:I.item.text},null,8,["innerHTML"])),I.item.collapsed!=null?(a(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:C,onKeydown:at(C,["enter"]),tabindex:"0"},cr,32)):f("",!0)],16,rr)):f("",!0),I.item.items&&I.item.items.length?(a(),u("div",ur,[I.depth<5?(a(!0),u(M,{key:0},E(I.item.items,R=>(a(),y(U,{key:R.text,item:R,depth:I.depth+1},null,8,["item","depth"]))),128)):f("",!0)])):f("",!0)]),_:1},8,["class"])}}}),vr=$(dr,[["__scopeId","data-v-f24171a4"]]),Re=s=>(B("data-v-ec846e01"),s=s(),H(),s),pr=Re(()=>h("div",{class:"curtain"},null,-1)),hr={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},fr=Re(()=>h("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),_r=_({__name:"VPSidebar",props:{open:{type:Boolean}},setup(s){const{sidebarGroups:t,hasSidebar:e}=O(),o=s,n=w(null),i=Ce(q?document.body:null);return G([o,n],()=>{var l;o.open?(i.value=!0,(l=n.value)==null||l.focus()):i.value=!1},{immediate:!0,flush:"post"}),(l,v)=>r(e)?(a(),u("aside",{key:0,class:N(["VPSidebar",{open:l.open}]),ref_key:"navEl",ref:n,onClick:v[0]||(v[0]=it(()=>{},["stop"]))},[pr,h("nav",hr,[fr,c(l.$slots,"sidebar-nav-before",{},void 0,!0),(a(!0),u(M,null,E(r(t),d=>(a(),u("div",{key:d.text,class:"group"},[b(vr,{item:d,depth:0},null,8,["item"])]))),128)),c(l.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):f("",!0)}}),mr=$(_r,[["__scopeId","data-v-ec846e01"]]),br=_({__name:"VPSkipLink",setup(s){const t=oe(),e=w();G(()=>t.path,()=>e.value.focus());function o({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,[h("span",{ref_key:"backToTop",ref:e,tabindex:"-1"},null,512),h("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o}," Skip to content ")],64))}}),kr=$(br,[["__scopeId","data-v-c3508ec8"]]),$r=_({__name:"Layout",setup(s){const{isOpen:t,open:e,close:o}=O(),n=oe();G(()=>n.path,o),It(t,o);const{frontmatter:i}=L(),l=Be(),v=g(()=>!!l["home-hero-image"]);return _e("hero-image-slot-exists",v),(d,m)=>{const P=K("Content");return r(i).layout!==!1?(a(),u("div",{key:0,class:N(["Layout",r(i).pageClass])},[c(d.$slots,"layout-top",{},void 0,!0),b(kr),b(ht,{class:"backdrop",show:r(t),onClick:r(o)},null,8,["show","onClick"]),b(ar,null,{"nav-bar-title-before":p(()=>[c(d.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[c(d.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[c(d.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[c(d.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":p(()=>[c(d.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[c(d.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),b(Oo,{open:r(t),onOpenMenu:r(e)},null,8,["open","onOpenMenu"]),b(mr,{open:r(t)},{"sidebar-nav-before":p(()=>[c(d.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":p(()=>[c(d.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),b(go,null,{"page-top":p(()=>[c(d.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[c(d.$slots,"page-bottom",{},void 0,!0)]),"not-found":p(()=>[c(d.$slots,"not-found",{},void 0,!0)]),"home-hero-before":p(()=>[c(d.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":p(()=>[c(d.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":p(()=>[c(d.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":p(()=>[c(d.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":p(()=>[c(d.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":p(()=>[c(d.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[c(d.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[c(d.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[c(d.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":p(()=>[c(d.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[c(d.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[c(d.$slots,"doc-after",{},void 0,!0)]),"doc-top":p(()=>[c(d.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[c(d.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":p(()=>[c(d.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[c(d.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[c(d.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[c(d.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[c(d.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[c(d.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),b(Lo),c(d.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),y(P,{key:1}))}}}),gr=$($r,[["__scopeId","data-v-a9a9e638"]]),Ve={Layout:gr,enhanceApp:({app:s})=>{s.component("Badge",dt)}},yr=s=>{if(typeof document>"u")return{stabilizeScrollPosition:n=>async(...i)=>n(...i)};const t=document.documentElement;return{stabilizeScrollPosition:o=>async(...n)=>{const i=o(...n),l=s.value;if(!l)return i;const v=l.offsetTop-t.scrollTop;return await Me(),t.scrollTop=l.offsetTop-v,i}}},We="vitepress:tabSharedState",Y=typeof localStorage<"u"?localStorage:null,qe="vitepress:tabsSharedState",Pr=()=>{const s=Y==null?void 0:Y.getItem(qe);if(s)try{return JSON.parse(s)}catch{}return{}},Sr=s=>{Y&&Y.setItem(qe,JSON.stringify(s))},Vr=s=>{const t=lt({});G(()=>t.content,(e,o)=>{e&&o&&Sr(e)},{deep:!0}),s.provide(We,t)},Lr=(s,t)=>{const e=J(We);if(!e)throw new Error("[vitepress-plugin-tabs] TabsSharedState should be injected");j(()=>{e.content||(e.content=Pr())});const o=w(),n=g({get(){var d;const l=t.value,v=s.value;if(l){const m=(d=e.content)==null?void 0:d[l];if(m&&v.includes(m))return m}else{const m=o.value;if(m)return m}return v[0]},set(l){const v=t.value;v?e.content&&(e.content[v]=l):o.value=l}});return{selected:n,select:l=>{n.value=l}}};let Le=0;const Tr=()=>(Le++,""+Le);function wr(){const s=Be();return g(()=>{var o;const e=(o=s.default)==null?void 0:o.call(s);return e?e.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 Je="vitepress:tabSingleState",Ir=s=>{_e(Je,s)},Nr=()=>{const s=J(Je);if(!s)throw new Error("[vitepress-plugin-tabs] TabsSingleState should be injected");return s},Mr={class:"plugin-tabs"},Ar=["id","aria-selected","aria-controls","tabindex","onClick"],Cr=_({__name:"PluginTabs",props:{sharedStateKey:{}},setup(s){const t=s,e=wr(),{selected:o,select:n}=Lr(e,ct(t,"sharedStateKey")),i=w(),{stabilizeScrollPosition:l}=yr(i),v=l(n),d=w([]),m=k=>{var A;const V=e.value.indexOf(o.value);let S;k.key==="ArrowLeft"?S=V>=1?V-1:e.value.length-1:k.key==="ArrowRight"&&(S=V(a(),u("div",Mr,[h("div",{ref_key:"tablist",ref:i,class:"plugin-tabs--tab-list",role:"tablist",onKeydown:m},[(a(!0),u(M,null,E(r(e),S=>(a(),u("button",{id:`tab-${S}-${r(P)}`,ref_for:!0,ref_key:"buttonRefs",ref:d,key:S,role:"tab",class:"plugin-tabs--tab","aria-selected":S===r(o),"aria-controls":`panel-${S}-${r(P)}`,tabindex:S===r(o)?0:-1,onClick:()=>r(v)(S)},T(S),9,Ar))),128))],544),c(k.$slots,"default")]))}}),Br=["id","aria-labelledby"],Hr=_({__name:"PluginTabsTab",props:{label:{}},setup(s){const{uid:t,selected:e}=Nr();return(o,n)=>r(e)===o.label?(a(),u("div",{key:0,id:`panel-${o.label}-${r(t)}`,class:"plugin-tabs--content",role:"tabpanel",tabindex:"0","aria-labelledby":`tab-${o.label}-${r(t)}`},[c(o.$slots,"default",{},void 0,!0)],8,Br)):f("",!0)}}),Er=$(Hr,[["__scopeId","data-v-9b0d03d2"]]),Dr=s=>{Vr(s),s.component("PluginTabs",Cr),s.component("PluginTabsTab",Er)},Or={extends:Ve,Layout(){return ut(Ve.Layout,null,{})},enhanceApp({app:s,router:t,siteData:e}){Dr(s)}};export{Or as R,Qn as c,L as u}; +const __vite__fileDeps=["assets/chunks/VPLocalSearchBox.Bb6G1GgI.js","assets/chunks/framework.aA95Gx5L.js"],__vite__mapDeps=i=>i.map(i=>__vite__fileDeps[i]); +import{d as _,o as a,c as u,r as c,n as N,a as D,t as T,b as y,w as p,T as pe,e as f,_ as $,u as Ye,i as Xe,f as Qe,g as he,h as w,j as q,k as g,l as j,m as h,p as r,q as B,s as H,v as z,x as le,y as G,z as te,A as fe,B as Te,C as Ze,D as xe,E as K,F as M,G as E,H as we,I as se,J as b,K as W,L as Ie,M as oe,N as Z,O as J,P as et,Q as Ne,R as tt,S as ce,U as Me,V as Ae,W as st,X as ot,Y as nt,Z as Ce,$ as _e,a0 as at,a1 as rt,a2 as it,a3 as Be,a4 as lt,a5 as ct,a6 as ut}from"./framework.aA95Gx5L.js";const dt=_({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(s){return(t,e)=>(a(),u("span",{class:N(["VPBadge",t.type])},[c(t.$slots,"default",{},()=>[D(T(t.text),1)])],2))}}),vt={key:0,class:"VPBackdrop"},pt=_({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(s){return(t,e)=>(a(),y(pe,{name:"fade"},{default:p(()=>[t.show?(a(),u("div",vt)):f("",!0)]),_:1}))}}),ht=$(pt,[["__scopeId","data-v-b06cdb19"]]),L=Ye;function ft(s,t){let e,o=!1;return()=>{e&&clearTimeout(e),o?e=setTimeout(s,t):(s(),(o=!0)&&setTimeout(()=>o=!1,t))}}function ue(s){return/^\//.test(s)?s:`/${s}`}function me(s){const{pathname:t,search:e,hash:o,protocol:n}=new URL(s,"http://a.com");if(Xe(s)||s.startsWith("#")||!n.startsWith("http")||!Qe(t))return s;const{site:i}=L(),l=t.endsWith("/")||t.endsWith(".html")?s:s.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,i.value.cleanUrls?"":".html")}${e}${o}`);return he(l)}const be=w(q?location.hash:"");q&&window.addEventListener("hashchange",()=>{be.value=location.hash});function X({removeCurrent:s=!0,correspondingLink:t=!1}={}){const{site:e,localeIndex:o,page:n,theme:i}=L(),l=g(()=>{var d,m;return{label:(d=e.value.locales[o.value])==null?void 0:d.label,link:((m=e.value.locales[o.value])==null?void 0:m.link)||(o.value==="root"?"/":`/${o.value}/`)}});return{localeLinks:g(()=>Object.entries(e.value.locales).flatMap(([d,m])=>s&&l.value.label===m.label?[]:{text:m.label,link:_t(m.link||(d==="root"?"/":`/${d}/`),i.value.i18nRouting!==!1&&t,n.value.relativePath.slice(l.value.link.length-1),!e.value.cleanUrls)+be.value})),currentLang:l}}function _t(s,t,e,o){return t?s.replace(/\/$/,"")+ue(e.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,o?".html":"")):s}const mt=s=>(B("data-v-792811ca"),s=s(),H(),s),bt={class:"NotFound"},kt={class:"code"},$t={class:"title"},gt=mt(()=>h("div",{class:"divider"},null,-1)),yt={class:"quote"},Pt={class:"action"},St=["href","aria-label"],Vt=_({__name:"NotFound",setup(s){const{site:t,theme:e}=L(),{localeLinks:o}=X({removeCurrent:!1}),n=w("/");return j(()=>{var l;const i=window.location.pathname.replace(t.value.base,"").replace(/(^.*?\/).*$/,"/$1");o.value.length&&(n.value=((l=o.value.find(({link:v})=>v.startsWith(i)))==null?void 0:l.link)||o.value[0].link)}),(i,l)=>{var v,d,m,P,k;return a(),u("div",bt,[h("p",kt,T(((v=r(e).notFound)==null?void 0:v.code)??"404"),1),h("h1",$t,T(((d=r(e).notFound)==null?void 0:d.title)??"PAGE NOT FOUND"),1),gt,h("blockquote",yt,T(((m=r(e).notFound)==null?void 0:m.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),h("div",Pt,[h("a",{class:"link",href:r(he)(n.value),"aria-label":((P=r(e).notFound)==null?void 0:P.linkLabel)??"go to home"},T(((k=r(e).notFound)==null?void 0:k.linkText)??"Take me home"),9,St)])])}}}),Lt=$(Vt,[["__scopeId","data-v-792811ca"]]);function He(s,t){if(Array.isArray(s))return x(s);if(s==null)return[];t=ue(t);const e=Object.keys(s).sort((n,i)=>i.split("/").length-n.split("/").length).find(n=>t.startsWith(ue(n))),o=e?s[e]:[];return Array.isArray(o)?x(o):x(o.items,o.base)}function Tt(s){const t=[];let e=0;for(const o in s){const n=s[o];if(n.items){e=t.push(n);continue}t[e]||t.push({items:[]}),t[e].items.push(n)}return t}function wt(s){const t=[];function e(o){for(const n of o)n.text&&n.link&&t.push({text:n.text,link:n.link,docFooterText:n.docFooterText}),n.items&&e(n.items)}return e(s),t}function de(s,t){return Array.isArray(t)?t.some(e=>de(s,e)):z(s,t.link)?!0:t.items?de(s,t.items):!1}function x(s,t){return[...s].map(e=>{const o={...e},n=o.base||t;return n&&o.link&&(o.link=n+o.link),o.items&&(o.items=x(o.items,n)),o})}function O(){const{frontmatter:s,page:t,theme:e}=L(),o=le("(min-width: 960px)"),n=w(!1),i=g(()=>{const C=e.value.sidebar,I=t.value.relativePath;return C?He(C,I):[]}),l=w(i.value);G(i,(C,I)=>{JSON.stringify(C)!==JSON.stringify(I)&&(l.value=i.value)});const v=g(()=>s.value.sidebar!==!1&&l.value.length>0&&s.value.layout!=="home"),d=g(()=>m?s.value.aside==null?e.value.aside==="left":s.value.aside==="left":!1),m=g(()=>s.value.layout==="home"?!1:s.value.aside!=null?!!s.value.aside:e.value.aside!==!1),P=g(()=>v.value&&o.value),k=g(()=>v.value?Tt(l.value):[]);function V(){n.value=!0}function S(){n.value=!1}function A(){n.value?S():V()}return{isOpen:n,sidebar:l,sidebarGroups:k,hasSidebar:v,hasAside:m,leftAside:d,isSidebarEnabled:P,open:V,close:S,toggle:A}}function It(s,t){let e;te(()=>{e=s.value?document.activeElement:void 0}),j(()=>{window.addEventListener("keyup",o)}),fe(()=>{window.removeEventListener("keyup",o)});function o(n){n.key==="Escape"&&s.value&&(t(),e==null||e.focus())}}function Nt(s){const{page:t}=L(),e=w(!1),o=g(()=>s.value.collapsed!=null),n=g(()=>!!s.value.link),i=w(!1),l=()=>{i.value=z(t.value.relativePath,s.value.link)};G([t,s,be],l),j(l);const v=g(()=>i.value?!0:s.value.items?de(t.value.relativePath,s.value.items):!1),d=g(()=>!!(s.value.items&&s.value.items.length));te(()=>{e.value=!!(o.value&&s.value.collapsed)}),Te(()=>{(i.value||v.value)&&(e.value=!1)});function m(){o.value&&(e.value=!e.value)}return{collapsed:e,collapsible:o,isLink:n,isActiveLink:i,hasActiveLink:v,hasChildren:d,toggle:m}}function Mt(){const{hasSidebar:s}=O(),t=le("(min-width: 960px)"),e=le("(min-width: 1280px)");return{isAsideEnabled:g(()=>!e.value&&!t.value?!1:s.value?e.value:t.value)}}const ve=[];function Ee(s){return typeof s.outline=="object"&&!Array.isArray(s.outline)&&s.outline.label||s.outlineTitle||"On this page"}function ke(s){const t=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(e=>e.id&&e.hasChildNodes()).map(e=>{const o=Number(e.tagName[1]);return{element:e,title:At(e),link:"#"+e.id,level:o}});return Ct(t,s)}function At(s){let t="";for(const e of s.childNodes)if(e.nodeType===1){if(e.classList.contains("VPBadge")||e.classList.contains("header-anchor")||e.classList.contains("ignore-header"))continue;t+=e.textContent}else e.nodeType===3&&(t+=e.textContent);return t.trim()}function Ct(s,t){if(t===!1)return[];const e=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2,[o,n]=typeof e=="number"?[e,e]:e==="deep"?[2,6]:e;s=s.filter(l=>l.level>=o&&l.level<=n),ve.length=0;for(const{element:l,link:v}of s)ve.push({element:l,link:v});const i=[];e:for(let l=0;l=0;d--){const m=s[d];if(m.level{requestAnimationFrame(i),window.addEventListener("scroll",o)}),Ze(()=>{l(location.hash)}),fe(()=>{window.removeEventListener("scroll",o)});function i(){if(!e.value)return;const v=window.scrollY,d=window.innerHeight,m=document.body.offsetHeight,P=Math.abs(v+d-m)<1,k=ve.map(({element:S,link:A})=>({link:A,top:Ht(S)})).filter(({top:S})=>!Number.isNaN(S)).sort((S,A)=>S.top-A.top);if(!k.length){l(null);return}if(v<1){l(null);return}if(P){l(k[k.length-1].link);return}let V=null;for(const{link:S,top:A}of k){if(A>v+xe()+4)break;V=S}l(V)}function l(v){n&&n.classList.remove("active"),v==null?n=null:n=s.value.querySelector(`a[href="${decodeURIComponent(v)}"]`);const d=n;d?(d.classList.add("active"),t.value.style.top=d.offsetTop+39+"px",t.value.style.opacity="1"):(t.value.style.top="33px",t.value.style.opacity="0")}}function Ht(s){let t=0;for(;s!==document.body;){if(s===null)return NaN;t+=s.offsetTop,s=s.offsetParent}return t}const Et=["href","title"],Dt=_({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(s){function t({target:e}){const o=e.href.split("#")[1],n=document.getElementById(decodeURIComponent(o));n==null||n.focus({preventScroll:!0})}return(e,o)=>{const n=K("VPDocOutlineItem",!0);return a(),u("ul",{class:N(["VPDocOutlineItem",e.root?"root":"nested"])},[(a(!0),u(M,null,E(e.headers,({children:i,link:l,title:v})=>(a(),u("li",null,[h("a",{class:"outline-link",href:l,onClick:t,title:v},T(v),9,Et),i!=null&&i.length?(a(),y(n,{key:0,headers:i},null,8,["headers"])):f("",!0)]))),256))],2)}}}),De=$(Dt,[["__scopeId","data-v-3f927ebe"]]),Ft=s=>(B("data-v-c14bfc45"),s=s(),H(),s),Ot={class:"content"},Ut={class:"outline-title",role:"heading","aria-level":"2"},jt={"aria-labelledby":"doc-outline-aria-label"},Gt=Ft(()=>h("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),zt=_({__name:"VPDocAsideOutline",setup(s){const{frontmatter:t,theme:e}=L(),o=we([]);se(()=>{o.value=ke(t.value.outline??e.value.outline)});const n=w(),i=w();return Bt(n,i),(l,v)=>(a(),u("div",{class:N(["VPDocAsideOutline",{"has-outline":o.value.length>0}]),ref_key:"container",ref:n,role:"navigation"},[h("div",Ot,[h("div",{class:"outline-marker",ref_key:"marker",ref:i},null,512),h("div",Ut,T(r(Ee)(r(e))),1),h("nav",jt,[Gt,b(De,{headers:o.value,root:!0},null,8,["headers"])])])],2))}}),Kt=$(zt,[["__scopeId","data-v-c14bfc45"]]),Rt={class:"VPDocAsideCarbonAds"},Wt=_({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(s){const t=()=>null;return(e,o)=>(a(),u("div",Rt,[b(r(t),{"carbon-ads":e.carbonAds},null,8,["carbon-ads"])]))}}),qt=s=>(B("data-v-6d7b3c46"),s=s(),H(),s),Jt={class:"VPDocAside"},Yt=qt(()=>h("div",{class:"spacer"},null,-1)),Xt=_({__name:"VPDocAside",setup(s){const{theme:t}=L();return(e,o)=>(a(),u("div",Jt,[c(e.$slots,"aside-top",{},void 0,!0),c(e.$slots,"aside-outline-before",{},void 0,!0),b(Kt),c(e.$slots,"aside-outline-after",{},void 0,!0),Yt,c(e.$slots,"aside-ads-before",{},void 0,!0),r(t).carbonAds?(a(),y(Wt,{key:0,"carbon-ads":r(t).carbonAds},null,8,["carbon-ads"])):f("",!0),c(e.$slots,"aside-ads-after",{},void 0,!0),c(e.$slots,"aside-bottom",{},void 0,!0)]))}}),Qt=$(Xt,[["__scopeId","data-v-6d7b3c46"]]);function Zt(){const{theme:s,page:t}=L();return g(()=>{const{text:e="Edit this page",pattern:o=""}=s.value.editLink||{};let n;return typeof o=="function"?n=o(t.value):n=o.replace(/:path/g,t.value.filePath),{url:n,text:e}})}function xt(){const{page:s,theme:t,frontmatter:e}=L();return g(()=>{var d,m,P,k,V,S,A,C;const o=He(t.value.sidebar,s.value.relativePath),n=wt(o),i=n.findIndex(I=>z(s.value.relativePath,I.link)),l=((d=t.value.docFooter)==null?void 0:d.prev)===!1&&!e.value.prev||e.value.prev===!1,v=((m=t.value.docFooter)==null?void 0:m.next)===!1&&!e.value.next||e.value.next===!1;return{prev:l?void 0:{text:(typeof e.value.prev=="string"?e.value.prev:typeof e.value.prev=="object"?e.value.prev.text:void 0)??((P=n[i-1])==null?void 0:P.docFooterText)??((k=n[i-1])==null?void 0:k.text),link:(typeof e.value.prev=="object"?e.value.prev.link:void 0)??((V=n[i-1])==null?void 0:V.link)},next:v?void 0:{text:(typeof e.value.next=="string"?e.value.next:typeof e.value.next=="object"?e.value.next.text:void 0)??((S=n[i+1])==null?void 0:S.docFooterText)??((A=n[i+1])==null?void 0:A.text),link:(typeof e.value.next=="object"?e.value.next.link:void 0)??((C=n[i+1])==null?void 0:C.link)}}})}const F=_({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(s){const t=s,e=g(()=>t.tag??(t.href?"a":"span")),o=g(()=>t.href&&Ie.test(t.href));return(n,i)=>(a(),y(W(e.value),{class:N(["VPLink",{link:n.href,"vp-external-link-icon":o.value,"no-icon":n.noIcon}]),href:n.href?r(me)(n.href):void 0,target:n.target??(o.value?"_blank":void 0),rel:n.rel??(o.value?"noreferrer":void 0)},{default:p(()=>[c(n.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),es={class:"VPLastUpdated"},ts=["datetime"],ss=_({__name:"VPDocFooterLastUpdated",setup(s){const{theme:t,page:e,frontmatter:o,lang:n}=L(),i=g(()=>new Date(o.value.lastUpdated??e.value.lastUpdated)),l=g(()=>i.value.toISOString()),v=w("");return j(()=>{te(()=>{var d,m,P;v.value=new Intl.DateTimeFormat((m=(d=t.value.lastUpdated)==null?void 0:d.formatOptions)!=null&&m.forceLocale?n.value:void 0,((P=t.value.lastUpdated)==null?void 0:P.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(i.value)})}),(d,m)=>{var P;return a(),u("p",es,[D(T(((P=r(t).lastUpdated)==null?void 0:P.text)||r(t).lastUpdatedText||"Last updated")+": ",1),h("time",{datetime:l.value},T(v.value),9,ts)])}}}),os=$(ss,[["__scopeId","data-v-9da12f1d"]]),ns=s=>(B("data-v-87be45d1"),s=s(),H(),s),as={key:0,class:"VPDocFooter"},rs={key:0,class:"edit-info"},is={key:0,class:"edit-link"},ls=ns(()=>h("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),cs={key:1,class:"last-updated"},us={key:1,class:"prev-next"},ds={class:"pager"},vs=["innerHTML"],ps=["innerHTML"],hs={class:"pager"},fs=["innerHTML"],_s=["innerHTML"],ms=_({__name:"VPDocFooter",setup(s){const{theme:t,page:e,frontmatter:o}=L(),n=Zt(),i=xt(),l=g(()=>t.value.editLink&&o.value.editLink!==!1),v=g(()=>e.value.lastUpdated&&o.value.lastUpdated!==!1),d=g(()=>l.value||v.value||i.value.prev||i.value.next);return(m,P)=>{var k,V,S,A;return d.value?(a(),u("footer",as,[c(m.$slots,"doc-footer-before",{},void 0,!0),l.value||v.value?(a(),u("div",rs,[l.value?(a(),u("div",is,[b(F,{class:"edit-link-button",href:r(n).url,"no-icon":!0},{default:p(()=>[ls,D(" "+T(r(n).text),1)]),_:1},8,["href"])])):f("",!0),v.value?(a(),u("div",cs,[b(os)])):f("",!0)])):f("",!0),(k=r(i).prev)!=null&&k.link||(V=r(i).next)!=null&&V.link?(a(),u("nav",us,[h("div",ds,[(S=r(i).prev)!=null&&S.link?(a(),y(F,{key:0,class:"pager-link prev",href:r(i).prev.link},{default:p(()=>{var C;return[h("span",{class:"desc",innerHTML:((C=r(t).docFooter)==null?void 0:C.prev)||"Previous page"},null,8,vs),h("span",{class:"title",innerHTML:r(i).prev.text},null,8,ps)]}),_:1},8,["href"])):f("",!0)]),h("div",hs,[(A=r(i).next)!=null&&A.link?(a(),y(F,{key:0,class:"pager-link next",href:r(i).next.link},{default:p(()=>{var C;return[h("span",{class:"desc",innerHTML:((C=r(t).docFooter)==null?void 0:C.next)||"Next page"},null,8,fs),h("span",{class:"title",innerHTML:r(i).next.text},null,8,_s)]}),_:1},8,["href"])):f("",!0)])])):f("",!0)])):f("",!0)}}}),bs=$(ms,[["__scopeId","data-v-87be45d1"]]),ks=s=>(B("data-v-83890dd9"),s=s(),H(),s),$s={class:"container"},gs=ks(()=>h("div",{class:"aside-curtain"},null,-1)),ys={class:"aside-container"},Ps={class:"aside-content"},Ss={class:"content"},Vs={class:"content-container"},Ls={class:"main"},Ts=_({__name:"VPDoc",setup(s){const{theme:t}=L(),e=oe(),{hasSidebar:o,hasAside:n,leftAside:i}=O(),l=g(()=>e.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(v,d)=>{const m=K("Content");return a(),u("div",{class:N(["VPDoc",{"has-sidebar":r(o),"has-aside":r(n)}])},[c(v.$slots,"doc-top",{},void 0,!0),h("div",$s,[r(n)?(a(),u("div",{key:0,class:N(["aside",{"left-aside":r(i)}])},[gs,h("div",ys,[h("div",Ps,[b(Qt,null,{"aside-top":p(()=>[c(v.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[c(v.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[c(v.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[c(v.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[c(v.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[c(v.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):f("",!0),h("div",Ss,[h("div",Vs,[c(v.$slots,"doc-before",{},void 0,!0),h("main",Ls,[b(m,{class:N(["vp-doc",[l.value,r(t).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),b(bs,null,{"doc-footer-before":p(()=>[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)}}}),ws=$(Ts,[["__scopeId","data-v-83890dd9"]]),Is=_({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(s){const t=s,e=g(()=>t.href&&Ie.test(t.href)),o=g(()=>t.tag||t.href?"a":"button");return(n,i)=>(a(),y(W(o.value),{class:N(["VPButton",[n.size,n.theme]]),href:n.href?r(me)(n.href):void 0,target:t.target??(e.value?"_blank":void 0),rel:t.rel??(e.value?"noreferrer":void 0)},{default:p(()=>[D(T(n.text),1)]),_:1},8,["class","href","target","rel"]))}}),Ns=$(Is,[["__scopeId","data-v-14206e74"]]),Ms=["src","alt"],As=_({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(s){return(t,e)=>{const o=K("VPImage",!0);return t.image?(a(),u(M,{key:0},[typeof t.image=="string"||"src"in t.image?(a(),u("img",Z({key:0,class:"VPImage"},typeof t.image=="string"?t.$attrs:{...t.image,...t.$attrs},{src:r(he)(typeof t.image=="string"?t.image:t.image.src),alt:t.alt??(typeof t.image=="string"?"":t.image.alt||"")}),null,16,Ms)):(a(),u(M,{key:1},[b(o,Z({class:"dark",image:t.image.dark,alt:t.image.alt},t.$attrs),null,16,["image","alt"]),b(o,Z({class:"light",image:t.image.light,alt:t.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):f("",!0)}}}),ee=$(As,[["__scopeId","data-v-35a7d0b8"]]),Cs=s=>(B("data-v-955009fc"),s=s(),H(),s),Bs={class:"container"},Hs={class:"main"},Es={key:0,class:"name"},Ds=["innerHTML"],Fs=["innerHTML"],Os=["innerHTML"],Us={key:0,class:"actions"},js={key:0,class:"image"},Gs={class:"image-container"},zs=Cs(()=>h("div",{class:"image-bg"},null,-1)),Ks=_({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(s){const t=J("hero-image-slot-exists");return(e,o)=>(a(),u("div",{class:N(["VPHero",{"has-image":e.image||r(t)}])},[h("div",Bs,[h("div",Hs,[c(e.$slots,"home-hero-info-before",{},void 0,!0),c(e.$slots,"home-hero-info",{},()=>[e.name?(a(),u("h1",Es,[h("span",{innerHTML:e.name,class:"clip"},null,8,Ds)])):f("",!0),e.text?(a(),u("p",{key:1,innerHTML:e.text,class:"text"},null,8,Fs)):f("",!0),e.tagline?(a(),u("p",{key:2,innerHTML:e.tagline,class:"tagline"},null,8,Os)):f("",!0)],!0),c(e.$slots,"home-hero-info-after",{},void 0,!0),e.actions?(a(),u("div",Us,[(a(!0),u(M,null,E(e.actions,n=>(a(),u("div",{key:n.link,class:"action"},[b(Ns,{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))])):f("",!0),c(e.$slots,"home-hero-actions-after",{},void 0,!0)]),e.image||r(t)?(a(),u("div",js,[h("div",Gs,[zs,c(e.$slots,"home-hero-image",{},()=>[e.image?(a(),y(ee,{key:0,class:"image-src",image:e.image},null,8,["image"])):f("",!0)],!0)])])):f("",!0)])],2))}}),Rs=$(Ks,[["__scopeId","data-v-955009fc"]]),Ws=_({__name:"VPHomeHero",setup(s){const{frontmatter:t}=L();return(e,o)=>r(t).hero?(a(),y(Rs,{key:0,class:"VPHomeHero",name:r(t).hero.name,text:r(t).hero.text,tagline:r(t).hero.tagline,image:r(t).hero.image,actions:r(t).hero.actions},{"home-hero-info-before":p(()=>[c(e.$slots,"home-hero-info-before")]),"home-hero-info":p(()=>[c(e.$slots,"home-hero-info")]),"home-hero-info-after":p(()=>[c(e.$slots,"home-hero-info-after")]),"home-hero-actions-after":p(()=>[c(e.$slots,"home-hero-actions-after")]),"home-hero-image":p(()=>[c(e.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):f("",!0)}}),qs=s=>(B("data-v-f5e9645b"),s=s(),H(),s),Js={class:"box"},Ys={key:0,class:"icon"},Xs=["innerHTML"],Qs=["innerHTML"],Zs=["innerHTML"],xs={key:4,class:"link-text"},eo={class:"link-text-value"},to=qs(()=>h("span",{class:"vpi-arrow-right link-text-icon"},null,-1)),so=_({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(s){return(t,e)=>(a(),y(F,{class:"VPFeature",href:t.link,rel:t.rel,target:t.target,"no-icon":!0,tag:t.link?"a":"div"},{default:p(()=>[h("article",Js,[typeof t.icon=="object"&&t.icon.wrap?(a(),u("div",Ys,[b(ee,{image:t.icon,alt:t.icon.alt,height:t.icon.height||48,width:t.icon.width||48},null,8,["image","alt","height","width"])])):typeof t.icon=="object"?(a(),y(ee,{key:1,image:t.icon,alt:t.icon.alt,height:t.icon.height||48,width:t.icon.width||48},null,8,["image","alt","height","width"])):t.icon?(a(),u("div",{key:2,class:"icon",innerHTML:t.icon},null,8,Xs)):f("",!0),h("h2",{class:"title",innerHTML:t.title},null,8,Qs),t.details?(a(),u("p",{key:3,class:"details",innerHTML:t.details},null,8,Zs)):f("",!0),t.linkText?(a(),u("div",xs,[h("p",eo,[D(T(t.linkText)+" ",1),to])])):f("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),oo=$(so,[["__scopeId","data-v-f5e9645b"]]),no={key:0,class:"VPFeatures"},ao={class:"container"},ro={class:"items"},io=_({__name:"VPFeatures",props:{features:{}},setup(s){const t=s,e=g(()=>{const o=t.features.length;if(o){if(o===2)return"grid-2";if(o===3)return"grid-3";if(o%3===0)return"grid-6";if(o>3)return"grid-4"}else return});return(o,n)=>o.features?(a(),u("div",no,[h("div",ao,[h("div",ro,[(a(!0),u(M,null,E(o.features,i=>(a(),u("div",{key:i.title,class:N(["item",[e.value]])},[b(oo,{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))])])])):f("",!0)}}),lo=$(io,[["__scopeId","data-v-d0a190d7"]]),co=_({__name:"VPHomeFeatures",setup(s){const{frontmatter:t}=L();return(e,o)=>r(t).features?(a(),y(lo,{key:0,class:"VPHomeFeatures",features:r(t).features},null,8,["features"])):f("",!0)}}),uo=_({__name:"VPHomeContent",setup(s){const{width:t}=et({includeScrollbar:!1});return(e,o)=>(a(),u("div",{class:"vp-doc container",style:Ne(r(t)?{"--vp-offset":`calc(50% - ${r(t)/2}px)`}:{})},[c(e.$slots,"default",{},void 0,!0)],4))}}),vo=$(uo,[["__scopeId","data-v-c43247eb"]]),po={class:"VPHome"},ho=_({__name:"VPHome",setup(s){const{frontmatter:t}=L();return(e,o)=>{const n=K("Content");return a(),u("div",po,[c(e.$slots,"home-hero-before",{},void 0,!0),b(Ws,null,{"home-hero-info-before":p(()=>[c(e.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":p(()=>[c(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":p(()=>[c(e.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":p(()=>[c(e.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":p(()=>[c(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),c(e.$slots,"home-hero-after",{},void 0,!0),c(e.$slots,"home-features-before",{},void 0,!0),b(co),c(e.$slots,"home-features-after",{},void 0,!0),r(t).markdownStyles!==!1?(a(),y(vo,{key:0},{default:p(()=>[b(n)]),_:1})):(a(),y(n,{key:1}))])}}}),fo=$(ho,[["__scopeId","data-v-cbb6ec48"]]),_o={},mo={class:"VPPage"};function bo(s,t){const e=K("Content");return a(),u("div",mo,[c(s.$slots,"page-top"),b(e),c(s.$slots,"page-bottom")])}const ko=$(_o,[["render",bo]]),$o=_({__name:"VPContent",setup(s){const{page:t,frontmatter:e}=L(),{hasSidebar:o}=O();return(n,i)=>(a(),u("div",{class:N(["VPContent",{"has-sidebar":r(o),"is-home":r(e).layout==="home"}]),id:"VPContent"},[r(t).isNotFound?c(n.$slots,"not-found",{key:0},()=>[b(Lt)],!0):r(e).layout==="page"?(a(),y(ko,{key:1},{"page-top":p(()=>[c(n.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[c(n.$slots,"page-bottom",{},void 0,!0)]),_:3})):r(e).layout==="home"?(a(),y(fo,{key:2},{"home-hero-before":p(()=>[c(n.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":p(()=>[c(n.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":p(()=>[c(n.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":p(()=>[c(n.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":p(()=>[c(n.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":p(()=>[c(n.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[c(n.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[c(n.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[c(n.$slots,"home-features-after",{},void 0,!0)]),_:3})):r(e).layout&&r(e).layout!=="doc"?(a(),y(W(r(e).layout),{key:3})):(a(),y(ws,{key:4},{"doc-top":p(()=>[c(n.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[c(n.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":p(()=>[c(n.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[c(n.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[c(n.$slots,"doc-after",{},void 0,!0)]),"aside-top":p(()=>[c(n.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":p(()=>[c(n.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[c(n.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[c(n.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[c(n.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":p(()=>[c(n.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),go=$($o,[["__scopeId","data-v-91765379"]]),yo={class:"container"},Po=["innerHTML"],So=["innerHTML"],Vo=_({__name:"VPFooter",setup(s){const{theme:t,frontmatter:e}=L(),{hasSidebar:o}=O();return(n,i)=>r(t).footer&&r(e).footer!==!1?(a(),u("footer",{key:0,class:N(["VPFooter",{"has-sidebar":r(o)}])},[h("div",yo,[r(t).footer.message?(a(),u("p",{key:0,class:"message",innerHTML:r(t).footer.message},null,8,Po)):f("",!0),r(t).footer.copyright?(a(),u("p",{key:1,class:"copyright",innerHTML:r(t).footer.copyright},null,8,So)):f("",!0)])],2)):f("",!0)}}),Lo=$(Vo,[["__scopeId","data-v-c970a860"]]);function Fe(){const{theme:s,frontmatter:t}=L(),e=we([]),o=g(()=>e.value.length>0);return se(()=>{e.value=ke(t.value.outline??s.value.outline)}),{headers:e,hasLocalNav:o}}const To=s=>(B("data-v-c9ba27ad"),s=s(),H(),s),wo=To(()=>h("span",{class:"vpi-chevron-right icon"},null,-1)),Io={class:"header"},No={class:"outline"},Mo=_({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(s){const t=s,{theme:e}=L(),o=w(!1),n=w(0),i=w(),l=w();tt(i,()=>{o.value=!1}),ce("Escape",()=>{o.value=!1}),se(()=>{o.value=!1});function v(){o.value=!o.value,n.value=window.innerHeight+Math.min(window.scrollY-t.navHeight,0)}function d(P){P.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Me(()=>{o.value=!1}))}function m(){o.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(P,k)=>(a(),u("div",{class:"VPLocalNavOutlineDropdown",style:Ne({"--vp-vh":n.value+"px"}),ref_key:"main",ref:i},[P.headers.length>0?(a(),u("button",{key:0,onClick:v,class:N({open:o.value})},[D(T(r(Ee)(r(e)))+" ",1),wo],2)):(a(),u("button",{key:1,onClick:m},T(r(e).returnToTopLabel||"Return to top"),1)),b(pe,{name:"flyout"},{default:p(()=>[o.value?(a(),u("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:d},[h("div",Io,[h("a",{class:"top-link",href:"#",onClick:m},T(r(e).returnToTopLabel||"Return to top"),1)]),h("div",No,[b(De,{headers:P.headers},null,8,["headers"])])],512)):f("",!0)]),_:1})],4))}}),Ao=$(Mo,[["__scopeId","data-v-c9ba27ad"]]),Co=s=>(B("data-v-070ab83d"),s=s(),H(),s),Bo={class:"container"},Ho=["aria-expanded"],Eo=Co(()=>h("span",{class:"vpi-align-left menu-icon"},null,-1)),Do={class:"menu-text"},Fo=_({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(s){const{theme:t,frontmatter:e}=L(),{hasSidebar:o}=O(),{headers:n}=Fe(),{y:i}=Ae(),l=w(0);j(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),se(()=>{n.value=ke(e.value.outline??t.value.outline)});const v=g(()=>n.value.length===0),d=g(()=>v.value&&!o.value),m=g(()=>({VPLocalNav:!0,"has-sidebar":o.value,empty:v.value,fixed:d.value}));return(P,k)=>r(e).layout!=="home"&&(!d.value||r(i)>=l.value)?(a(),u("div",{key:0,class:N(m.value)},[h("div",Bo,[r(o)?(a(),u("button",{key:0,class:"menu","aria-expanded":P.open,"aria-controls":"VPSidebarNav",onClick:k[0]||(k[0]=V=>P.$emit("open-menu"))},[Eo,h("span",Do,T(r(t).sidebarMenuLabel||"Menu"),1)],8,Ho)):f("",!0),b(Ao,{headers:r(n),navHeight:l.value},null,8,["headers","navHeight"])])],2)):f("",!0)}}),Oo=$(Fo,[["__scopeId","data-v-070ab83d"]]);function Uo(){const s=w(!1);function t(){s.value=!0,window.addEventListener("resize",n)}function e(){s.value=!1,window.removeEventListener("resize",n)}function o(){s.value?e():t()}function n(){window.outerWidth>=768&&e()}const i=oe();return G(()=>i.path,e),{isScreenOpen:s,openScreen:t,closeScreen:e,toggleScreen:o}}const jo={},Go={class:"VPSwitch",type:"button",role:"switch"},zo={class:"check"},Ko={key:0,class:"icon"};function Ro(s,t){return a(),u("button",Go,[h("span",zo,[s.$slots.default?(a(),u("span",Ko,[c(s.$slots,"default",{},void 0,!0)])):f("",!0)])])}const Wo=$(jo,[["render",Ro],["__scopeId","data-v-4a1c76db"]]),Oe=s=>(B("data-v-b79b56d4"),s=s(),H(),s),qo=Oe(()=>h("span",{class:"vpi-sun sun"},null,-1)),Jo=Oe(()=>h("span",{class:"vpi-moon moon"},null,-1)),Yo=_({__name:"VPSwitchAppearance",setup(s){const{isDark:t,theme:e}=L(),o=J("toggle-appearance",()=>{t.value=!t.value}),n=g(()=>t.value?e.value.lightModeSwitchTitle||"Switch to light theme":e.value.darkModeSwitchTitle||"Switch to dark theme");return(i,l)=>(a(),y(Wo,{title:n.value,class:"VPSwitchAppearance","aria-checked":r(t),onClick:r(o)},{default:p(()=>[qo,Jo]),_:1},8,["title","aria-checked","onClick"]))}}),$e=$(Yo,[["__scopeId","data-v-b79b56d4"]]),Xo={key:0,class:"VPNavBarAppearance"},Qo=_({__name:"VPNavBarAppearance",setup(s){const{site:t}=L();return(e,o)=>r(t).appearance&&r(t).appearance!=="force-dark"?(a(),u("div",Xo,[b($e)])):f("",!0)}}),Zo=$(Qo,[["__scopeId","data-v-ead91a81"]]),ge=w();let Ue=!1,ie=0;function xo(s){const t=w(!1);if(q){!Ue&&en(),ie++;const e=G(ge,o=>{var n,i,l;o===s.el.value||(n=s.el.value)!=null&&n.contains(o)?(t.value=!0,(i=s.onFocus)==null||i.call(s)):(t.value=!1,(l=s.onBlur)==null||l.call(s))});fe(()=>{e(),ie--,ie||tn()})}return st(t)}function en(){document.addEventListener("focusin",je),Ue=!0,ge.value=document.activeElement}function tn(){document.removeEventListener("focusin",je)}function je(){ge.value=document.activeElement}const sn={class:"VPMenuLink"},on=_({__name:"VPMenuLink",props:{item:{}},setup(s){const{page:t}=L();return(e,o)=>(a(),u("div",sn,[b(F,{class:N({active:r(z)(r(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel},{default:p(()=>[D(T(e.item.text),1)]),_:1},8,["class","href","target","rel"])]))}}),ne=$(on,[["__scopeId","data-v-8b74d055"]]),nn={class:"VPMenuGroup"},an={key:0,class:"title"},rn=_({__name:"VPMenuGroup",props:{text:{},items:{}},setup(s){return(t,e)=>(a(),u("div",nn,[t.text?(a(),u("p",an,T(t.text),1)):f("",!0),(a(!0),u(M,null,E(t.items,o=>(a(),u(M,null,["link"in o?(a(),y(ne,{key:0,item:o},null,8,["item"])):f("",!0)],64))),256))]))}}),ln=$(rn,[["__scopeId","data-v-48c802d0"]]),cn={class:"VPMenu"},un={key:0,class:"items"},dn=_({__name:"VPMenu",props:{items:{}},setup(s){return(t,e)=>(a(),u("div",cn,[t.items?(a(),u("div",un,[(a(!0),u(M,null,E(t.items,o=>(a(),u(M,{key:o.text},["link"in o?(a(),y(ne,{key:0,item:o},null,8,["item"])):(a(),y(ln,{key:1,text:o.text,items:o.items},null,8,["text","items"]))],64))),128))])):f("",!0),c(t.$slots,"default",{},void 0,!0)]))}}),vn=$(dn,[["__scopeId","data-v-97491713"]]),pn=s=>(B("data-v-e5380155"),s=s(),H(),s),hn=["aria-expanded","aria-label"],fn={key:0,class:"text"},_n=["innerHTML"],mn=pn(()=>h("span",{class:"vpi-chevron-down text-icon"},null,-1)),bn={key:1,class:"vpi-more-horizontal icon"},kn={class:"menu"},$n=_({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(s){const t=w(!1),e=w();xo({el:e,onBlur:o});function o(){t.value=!1}return(n,i)=>(a(),u("div",{class:"VPFlyout",ref_key:"el",ref:e,onMouseenter:i[1]||(i[1]=l=>t.value=!0),onMouseleave:i[2]||(i[2]=l=>t.value=!1)},[h("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":n.label,onClick:i[0]||(i[0]=l=>t.value=!t.value)},[n.button||n.icon?(a(),u("span",fn,[n.icon?(a(),u("span",{key:0,class:N([n.icon,"option-icon"])},null,2)):f("",!0),n.button?(a(),u("span",{key:1,innerHTML:n.button},null,8,_n)):f("",!0),mn])):(a(),u("span",bn))],8,hn),h("div",kn,[b(vn,{items:n.items},{default:p(()=>[c(n.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),ye=$($n,[["__scopeId","data-v-e5380155"]]),gn=["href","aria-label","innerHTML"],yn=_({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(s){const t=s,e=g(()=>typeof t.icon=="object"?t.icon.svg:``);return(o,n)=>(a(),u("a",{class:"VPSocialLink no-icon",href:o.link,"aria-label":o.ariaLabel??(typeof o.icon=="string"?o.icon:""),target:"_blank",rel:"noopener",innerHTML:e.value},null,8,gn))}}),Pn=$(yn,[["__scopeId","data-v-717b8b75"]]),Sn={class:"VPSocialLinks"},Vn=_({__name:"VPSocialLinks",props:{links:{}},setup(s){return(t,e)=>(a(),u("div",Sn,[(a(!0),u(M,null,E(t.links,({link:o,icon:n,ariaLabel:i})=>(a(),y(Pn,{key:o,icon:n,link:o,ariaLabel:i},null,8,["icon","link","ariaLabel"]))),128))]))}}),Pe=$(Vn,[["__scopeId","data-v-ee7a9424"]]),Ln={key:0,class:"group translations"},Tn={class:"trans-title"},wn={key:1,class:"group"},In={class:"item appearance"},Nn={class:"label"},Mn={class:"appearance-action"},An={key:2,class:"group"},Cn={class:"item social-links"},Bn=_({__name:"VPNavBarExtra",setup(s){const{site:t,theme:e}=L(),{localeLinks:o,currentLang:n}=X({correspondingLink:!0}),i=g(()=>o.value.length&&n.value.label||t.value.appearance||e.value.socialLinks);return(l,v)=>i.value?(a(),y(ye,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:p(()=>[r(o).length&&r(n).label?(a(),u("div",Ln,[h("p",Tn,T(r(n).label),1),(a(!0),u(M,null,E(r(o),d=>(a(),y(ne,{key:d.link,item:d},null,8,["item"]))),128))])):f("",!0),r(t).appearance&&r(t).appearance!=="force-dark"?(a(),u("div",wn,[h("div",In,[h("p",Nn,T(r(e).darkModeSwitchLabel||"Appearance"),1),h("div",Mn,[b($e)])])])):f("",!0),r(e).socialLinks?(a(),u("div",An,[h("div",Cn,[b(Pe,{class:"social-links-list",links:r(e).socialLinks},null,8,["links"])])])):f("",!0)]),_:1})):f("",!0)}}),Hn=$(Bn,[["__scopeId","data-v-9b536d0b"]]),En=s=>(B("data-v-5dea55bf"),s=s(),H(),s),Dn=["aria-expanded"],Fn=En(()=>h("span",{class:"container"},[h("span",{class:"top"}),h("span",{class:"middle"}),h("span",{class:"bottom"})],-1)),On=[Fn],Un=_({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(s){return(t,e)=>(a(),u("button",{type:"button",class:N(["VPNavBarHamburger",{active:t.active}]),"aria-label":"mobile navigation","aria-expanded":t.active,"aria-controls":"VPNavScreen",onClick:e[0]||(e[0]=o=>t.$emit("click"))},On,10,Dn))}}),jn=$(Un,[["__scopeId","data-v-5dea55bf"]]),Gn=["innerHTML"],zn=_({__name:"VPNavBarMenuLink",props:{item:{}},setup(s){const{page:t}=L();return(e,o)=>(a(),y(F,{class:N({VPNavBarMenuLink:!0,active:r(z)(r(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,tabindex:"0"},{default:p(()=>[h("span",{innerHTML:e.item.text},null,8,Gn)]),_:1},8,["class","href","target","rel"]))}}),Kn=$(zn,[["__scopeId","data-v-2781b5e7"]]),Rn=_({__name:"VPNavBarMenuGroup",props:{item:{}},setup(s){const t=s,{page:e}=L(),o=i=>"link"in i?z(e.value.relativePath,i.link,!!t.item.activeMatch):i.items.some(o),n=g(()=>o(t.item));return(i,l)=>(a(),y(ye,{class:N({VPNavBarMenuGroup:!0,active:r(z)(r(e).relativePath,i.item.activeMatch,!!i.item.activeMatch)||n.value}),button:i.item.text,items:i.item.items},null,8,["class","button","items"]))}}),Wn=s=>(B("data-v-492ea56d"),s=s(),H(),s),qn={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},Jn=Wn(()=>h("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),Yn=_({__name:"VPNavBarMenu",setup(s){const{theme:t}=L();return(e,o)=>r(t).nav?(a(),u("nav",qn,[Jn,(a(!0),u(M,null,E(r(t).nav,n=>(a(),u(M,{key:n.text},["link"in n?(a(),y(Kn,{key:0,item:n},null,8,["item"])):(a(),y(Rn,{key:1,item:n},null,8,["item"]))],64))),128))])):f("",!0)}}),Xn=$(Yn,[["__scopeId","data-v-492ea56d"]]);function Qn(s){const{localeIndex:t,theme:e}=L();function o(n){var A,C,I;const i=n.split("."),l=(A=e.value.search)==null?void 0:A.options,v=l&&typeof l=="object",d=v&&((I=(C=l.locales)==null?void 0:C[t.value])==null?void 0:I.translations)||null,m=v&&l.translations||null;let P=d,k=m,V=s;const S=i.pop();for(const Q of i){let U=null;const R=V==null?void 0:V[Q];R&&(U=V=R);const ae=k==null?void 0:k[Q];ae&&(U=k=ae);const re=P==null?void 0:P[Q];re&&(U=P=re),R||(V=U),ae||(k=U),re||(P=U)}return(P==null?void 0:P[S])??(k==null?void 0:k[S])??(V==null?void 0:V[S])??""}return o}const Zn=["aria-label"],xn={class:"DocSearch-Button-Container"},ea=h("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1),ta={class:"DocSearch-Button-Placeholder"},sa=h("span",{class:"DocSearch-Button-Keys"},[h("kbd",{class:"DocSearch-Button-Key"}),h("kbd",{class:"DocSearch-Button-Key"},"K")],-1),Se=_({__name:"VPNavBarSearchButton",setup(s){const e=Qn({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(o,n)=>(a(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":r(e)("button.buttonAriaLabel")},[h("span",xn,[ea,h("span",ta,T(r(e)("button.buttonText")),1)]),sa],8,Zn))}}),oa={class:"VPNavBarSearch"},na={id:"local-search"},aa={key:1,id:"docsearch"},ra=_({__name:"VPNavBarSearch",setup(s){const t=ot(()=>nt(()=>import("./VPLocalSearchBox.Bb6G1GgI.js"),__vite__mapDeps([0,1]))),e=()=>null,{theme:o}=L(),n=w(!1),i=w(!1);j(()=>{});function l(){n.value||(n.value=!0,setTimeout(v,16))}function v(){const k=new Event("keydown");k.key="k",k.metaKey=!0,window.dispatchEvent(k),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||v()},16)}function d(k){const V=k.target,S=V.tagName;return V.isContentEditable||S==="INPUT"||S==="SELECT"||S==="TEXTAREA"}const m=w(!1);ce("k",k=>{(k.ctrlKey||k.metaKey)&&(k.preventDefault(),m.value=!0)}),ce("/",k=>{d(k)||(k.preventDefault(),m.value=!0)});const P="local";return(k,V)=>{var S;return a(),u("div",oa,[r(P)==="local"?(a(),u(M,{key:0},[m.value?(a(),y(r(t),{key:0,onClose:V[0]||(V[0]=A=>m.value=!1)})):f("",!0),h("div",na,[b(Se,{onClick:V[1]||(V[1]=A=>m.value=!0)})])],64)):r(P)==="algolia"?(a(),u(M,{key:1},[n.value?(a(),y(r(e),{key:0,algolia:((S=r(o).search)==null?void 0:S.options)??r(o).algolia,onVnodeBeforeMount:V[2]||(V[2]=A=>i.value=!0)},null,8,["algolia"])):f("",!0),i.value?f("",!0):(a(),u("div",aa,[b(Se,{onClick:l})]))],64)):f("",!0)])}}}),ia=_({__name:"VPNavBarSocialLinks",setup(s){const{theme:t}=L();return(e,o)=>r(t).socialLinks?(a(),y(Pe,{key:0,class:"VPNavBarSocialLinks",links:r(t).socialLinks},null,8,["links"])):f("",!0)}}),la=$(ia,[["__scopeId","data-v-164c457f"]]),ca=["href","rel","target"],ua={key:1},da={key:2},va=_({__name:"VPNavBarTitle",setup(s){const{site:t,theme:e}=L(),{hasSidebar:o}=O(),{currentLang:n}=X(),i=g(()=>{var d;return typeof e.value.logoLink=="string"?e.value.logoLink:(d=e.value.logoLink)==null?void 0:d.link}),l=g(()=>{var d;return typeof e.value.logoLink=="string"||(d=e.value.logoLink)==null?void 0:d.rel}),v=g(()=>{var d;return typeof e.value.logoLink=="string"||(d=e.value.logoLink)==null?void 0:d.target});return(d,m)=>(a(),u("div",{class:N(["VPNavBarTitle",{"has-sidebar":r(o)}])},[h("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(e).logo?(a(),y(ee,{key:0,class:"logo",image:r(e).logo},null,8,["image"])):f("",!0),r(e).siteTitle?(a(),u("span",ua,T(r(e).siteTitle),1)):r(e).siteTitle===void 0?(a(),u("span",da,T(r(t).title),1)):f("",!0),c(d.$slots,"nav-bar-title-after",{},void 0,!0)],8,ca)],2))}}),pa=$(va,[["__scopeId","data-v-28a961f9"]]),ha={class:"items"},fa={class:"title"},_a=_({__name:"VPNavBarTranslations",setup(s){const{theme:t}=L(),{localeLinks:e,currentLang:o}=X({correspondingLink:!0});return(n,i)=>r(e).length&&r(o).label?(a(),y(ye,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:r(t).langMenuLabel||"Change language"},{default:p(()=>[h("div",ha,[h("p",fa,T(r(o).label),1),(a(!0),u(M,null,E(r(e),l=>(a(),y(ne,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):f("",!0)}}),ma=$(_a,[["__scopeId","data-v-c80d9ad0"]]),ba=s=>(B("data-v-b9c8b02d"),s=s(),H(),s),ka={class:"wrapper"},$a={class:"container"},ga={class:"title"},ya={class:"content"},Pa={class:"content-body"},Sa=ba(()=>h("div",{class:"divider"},[h("div",{class:"divider-line"})],-1)),Va=_({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(s){const{y:t}=Ae(),{hasSidebar:e}=O(),{hasLocalNav:o}=Fe(),{frontmatter:n}=L(),i=w({});return Te(()=>{i.value={"has-sidebar":e.value,"has-local-nav":o.value,top:n.value.layout==="home"&&t.value===0}}),(l,v)=>(a(),u("div",{class:N(["VPNavBar",i.value])},[h("div",ka,[h("div",$a,[h("div",ga,[b(pa,null,{"nav-bar-title-before":p(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),h("div",ya,[h("div",Pa,[c(l.$slots,"nav-bar-content-before",{},void 0,!0),b(ra,{class:"search"}),b(Xn,{class:"menu"}),b(ma,{class:"translations"}),b(Zo,{class:"appearance"}),b(la,{class:"social-links"}),b(Hn,{class:"extra"}),c(l.$slots,"nav-bar-content-after",{},void 0,!0),b(jn,{class:"hamburger",active:l.isScreenOpen,onClick:v[0]||(v[0]=d=>l.$emit("toggle-screen"))},null,8,["active"])])])])]),Sa],2))}}),La=$(Va,[["__scopeId","data-v-b9c8b02d"]]),Ta={key:0,class:"VPNavScreenAppearance"},wa={class:"text"},Ia=_({__name:"VPNavScreenAppearance",setup(s){const{site:t,theme:e}=L();return(o,n)=>r(t).appearance&&r(t).appearance!=="force-dark"?(a(),u("div",Ta,[h("p",wa,T(r(e).darkModeSwitchLabel||"Appearance"),1),b($e)])):f("",!0)}}),Na=$(Ia,[["__scopeId","data-v-2b89f08b"]]),Ma=_({__name:"VPNavScreenMenuLink",props:{item:{}},setup(s){const t=J("close-screen");return(e,o)=>(a(),y(F,{class:"VPNavScreenMenuLink",href:e.item.link,target:e.item.target,rel:e.item.rel,onClick:r(t)},{default:p(()=>[D(T(e.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),Aa=$(Ma,[["__scopeId","data-v-d45ba3e8"]]),Ca=_({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(s){const t=J("close-screen");return(e,o)=>(a(),y(F,{class:"VPNavScreenMenuGroupLink",href:e.item.link,target:e.item.target,rel:e.item.rel,onClick:r(t)},{default:p(()=>[D(T(e.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),Ge=$(Ca,[["__scopeId","data-v-7179dbb7"]]),Ba={class:"VPNavScreenMenuGroupSection"},Ha={key:0,class:"title"},Ea=_({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(s){return(t,e)=>(a(),u("div",Ba,[t.text?(a(),u("p",Ha,T(t.text),1)):f("",!0),(a(!0),u(M,null,E(t.items,o=>(a(),y(Ge,{key:o.text,item:o},null,8,["item"]))),128))]))}}),Da=$(Ea,[["__scopeId","data-v-4b8941ac"]]),Fa=s=>(B("data-v-c9df2649"),s=s(),H(),s),Oa=["aria-controls","aria-expanded"],Ua=["innerHTML"],ja=Fa(()=>h("span",{class:"vpi-plus button-icon"},null,-1)),Ga=["id"],za={key:1,class:"group"},Ka=_({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(s){const t=s,e=w(!1),o=g(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function n(){e.value=!e.value}return(i,l)=>(a(),u("div",{class:N(["VPNavScreenMenuGroup",{open:e.value}])},[h("button",{class:"button","aria-controls":o.value,"aria-expanded":e.value,onClick:n},[h("span",{class:"button-text",innerHTML:i.text},null,8,Ua),ja],8,Oa),h("div",{id:o.value,class:"items"},[(a(!0),u(M,null,E(i.items,v=>(a(),u(M,{key:v.text},["link"in v?(a(),u("div",{key:v.text,class:"item"},[b(Ge,{item:v},null,8,["item"])])):(a(),u("div",za,[b(Da,{text:v.text,items:v.items},null,8,["text","items"])]))],64))),128))],8,Ga)],2))}}),Ra=$(Ka,[["__scopeId","data-v-c9df2649"]]),Wa={key:0,class:"VPNavScreenMenu"},qa=_({__name:"VPNavScreenMenu",setup(s){const{theme:t}=L();return(e,o)=>r(t).nav?(a(),u("nav",Wa,[(a(!0),u(M,null,E(r(t).nav,n=>(a(),u(M,{key:n.text},["link"in n?(a(),y(Aa,{key:0,item:n},null,8,["item"])):(a(),y(Ra,{key:1,text:n.text||"",items:n.items},null,8,["text","items"]))],64))),128))])):f("",!0)}}),Ja=_({__name:"VPNavScreenSocialLinks",setup(s){const{theme:t}=L();return(e,o)=>r(t).socialLinks?(a(),y(Pe,{key:0,class:"VPNavScreenSocialLinks",links:r(t).socialLinks},null,8,["links"])):f("",!0)}}),ze=s=>(B("data-v-362991c2"),s=s(),H(),s),Ya=ze(()=>h("span",{class:"vpi-languages icon lang"},null,-1)),Xa=ze(()=>h("span",{class:"vpi-chevron-down icon chevron"},null,-1)),Qa={class:"list"},Za=_({__name:"VPNavScreenTranslations",setup(s){const{localeLinks:t,currentLang:e}=X({correspondingLink:!0}),o=w(!1);function n(){o.value=!o.value}return(i,l)=>r(t).length&&r(e).label?(a(),u("div",{key:0,class:N(["VPNavScreenTranslations",{open:o.value}])},[h("button",{class:"title",onClick:n},[Ya,D(" "+T(r(e).label)+" ",1),Xa]),h("ul",Qa,[(a(!0),u(M,null,E(r(t),v=>(a(),u("li",{key:v.link,class:"item"},[b(F,{class:"link",href:v.link},{default:p(()=>[D(T(v.text),1)]),_:2},1032,["href"])]))),128))])],2)):f("",!0)}}),xa=$(Za,[["__scopeId","data-v-362991c2"]]),er={class:"container"},tr=_({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(s){const t=w(null),e=Ce(q?document.body:null);return(o,n)=>(a(),y(pe,{name:"fade",onEnter:n[0]||(n[0]=i=>e.value=!0),onAfterLeave:n[1]||(n[1]=i=>e.value=!1)},{default:p(()=>[o.open?(a(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t,id:"VPNavScreen"},[h("div",er,[c(o.$slots,"nav-screen-content-before",{},void 0,!0),b(qa,{class:"menu"}),b(xa,{class:"translations"}),b(Na,{class:"appearance"}),b(Ja,{class:"social-links"}),c(o.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):f("",!0)]),_:3}))}}),sr=$(tr,[["__scopeId","data-v-382f42e9"]]),or={key:0,class:"VPNav"},nr=_({__name:"VPNav",setup(s){const{isScreenOpen:t,closeScreen:e,toggleScreen:o}=Uo(),{frontmatter:n}=L(),i=g(()=>n.value.navbar!==!1);return _e("close-screen",e),te(()=>{q&&document.documentElement.classList.toggle("hide-nav",!i.value)}),(l,v)=>i.value?(a(),u("header",or,[b(La,{"is-screen-open":r(t),onToggleScreen:r(o)},{"nav-bar-title-before":p(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[c(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[c(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),b(sr,{open:r(t)},{"nav-screen-content-before":p(()=>[c(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[c(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):f("",!0)}}),ar=$(nr,[["__scopeId","data-v-f1e365da"]]),Ke=s=>(B("data-v-f24171a4"),s=s(),H(),s),rr=["role","tabindex"],ir=Ke(()=>h("div",{class:"indicator"},null,-1)),lr=Ke(()=>h("span",{class:"vpi-chevron-right caret-icon"},null,-1)),cr=[lr],ur={key:1,class:"items"},dr=_({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(s){const t=s,{collapsed:e,collapsible:o,isLink:n,isActiveLink:i,hasActiveLink:l,hasChildren:v,toggle:d}=Nt(g(()=>t.item)),m=g(()=>v.value?"section":"div"),P=g(()=>n.value?"a":"div"),k=g(()=>v.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),V=g(()=>n.value?void 0:"button"),S=g(()=>[[`level-${t.depth}`],{collapsible:o.value},{collapsed:e.value},{"is-link":n.value},{"is-active":i.value},{"has-active":l.value}]);function A(I){"key"in I&&I.key!=="Enter"||!t.item.link&&d()}function C(){t.item.link&&d()}return(I,Q)=>{const U=K("VPSidebarItem",!0);return a(),y(W(m.value),{class:N(["VPSidebarItem",S.value])},{default:p(()=>[I.item.text?(a(),u("div",Z({key:0,class:"item",role:V.value},rt(I.item.items?{click:A,keydown:A}:{},!0),{tabindex:I.item.items&&0}),[ir,I.item.link?(a(),y(F,{key:0,tag:P.value,class:"link",href:I.item.link,rel:I.item.rel,target:I.item.target},{default:p(()=>[(a(),y(W(k.value),{class:"text",innerHTML:I.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),y(W(k.value),{key:1,class:"text",innerHTML:I.item.text},null,8,["innerHTML"])),I.item.collapsed!=null?(a(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:C,onKeydown:at(C,["enter"]),tabindex:"0"},cr,32)):f("",!0)],16,rr)):f("",!0),I.item.items&&I.item.items.length?(a(),u("div",ur,[I.depth<5?(a(!0),u(M,{key:0},E(I.item.items,R=>(a(),y(U,{key:R.text,item:R,depth:I.depth+1},null,8,["item","depth"]))),128)):f("",!0)])):f("",!0)]),_:1},8,["class"])}}}),vr=$(dr,[["__scopeId","data-v-f24171a4"]]),Re=s=>(B("data-v-ec846e01"),s=s(),H(),s),pr=Re(()=>h("div",{class:"curtain"},null,-1)),hr={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},fr=Re(()=>h("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),_r=_({__name:"VPSidebar",props:{open:{type:Boolean}},setup(s){const{sidebarGroups:t,hasSidebar:e}=O(),o=s,n=w(null),i=Ce(q?document.body:null);return G([o,n],()=>{var l;o.open?(i.value=!0,(l=n.value)==null||l.focus()):i.value=!1},{immediate:!0,flush:"post"}),(l,v)=>r(e)?(a(),u("aside",{key:0,class:N(["VPSidebar",{open:l.open}]),ref_key:"navEl",ref:n,onClick:v[0]||(v[0]=it(()=>{},["stop"]))},[pr,h("nav",hr,[fr,c(l.$slots,"sidebar-nav-before",{},void 0,!0),(a(!0),u(M,null,E(r(t),d=>(a(),u("div",{key:d.text,class:"group"},[b(vr,{item:d,depth:0},null,8,["item"])]))),128)),c(l.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):f("",!0)}}),mr=$(_r,[["__scopeId","data-v-ec846e01"]]),br=_({__name:"VPSkipLink",setup(s){const t=oe(),e=w();G(()=>t.path,()=>e.value.focus());function o({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,[h("span",{ref_key:"backToTop",ref:e,tabindex:"-1"},null,512),h("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o}," Skip to content ")],64))}}),kr=$(br,[["__scopeId","data-v-c3508ec8"]]),$r=_({__name:"Layout",setup(s){const{isOpen:t,open:e,close:o}=O(),n=oe();G(()=>n.path,o),It(t,o);const{frontmatter:i}=L(),l=Be(),v=g(()=>!!l["home-hero-image"]);return _e("hero-image-slot-exists",v),(d,m)=>{const P=K("Content");return r(i).layout!==!1?(a(),u("div",{key:0,class:N(["Layout",r(i).pageClass])},[c(d.$slots,"layout-top",{},void 0,!0),b(kr),b(ht,{class:"backdrop",show:r(t),onClick:r(o)},null,8,["show","onClick"]),b(ar,null,{"nav-bar-title-before":p(()=>[c(d.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[c(d.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[c(d.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[c(d.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":p(()=>[c(d.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[c(d.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),b(Oo,{open:r(t),onOpenMenu:r(e)},null,8,["open","onOpenMenu"]),b(mr,{open:r(t)},{"sidebar-nav-before":p(()=>[c(d.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":p(()=>[c(d.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),b(go,null,{"page-top":p(()=>[c(d.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[c(d.$slots,"page-bottom",{},void 0,!0)]),"not-found":p(()=>[c(d.$slots,"not-found",{},void 0,!0)]),"home-hero-before":p(()=>[c(d.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":p(()=>[c(d.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":p(()=>[c(d.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":p(()=>[c(d.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":p(()=>[c(d.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":p(()=>[c(d.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[c(d.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[c(d.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[c(d.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":p(()=>[c(d.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[c(d.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[c(d.$slots,"doc-after",{},void 0,!0)]),"doc-top":p(()=>[c(d.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[c(d.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":p(()=>[c(d.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[c(d.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[c(d.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[c(d.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[c(d.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[c(d.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),b(Lo),c(d.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),y(P,{key:1}))}}}),gr=$($r,[["__scopeId","data-v-a9a9e638"]]),Ve={Layout:gr,enhanceApp:({app:s})=>{s.component("Badge",dt)}},yr=s=>{if(typeof document>"u")return{stabilizeScrollPosition:n=>async(...i)=>n(...i)};const t=document.documentElement;return{stabilizeScrollPosition:o=>async(...n)=>{const i=o(...n),l=s.value;if(!l)return i;const v=l.offsetTop-t.scrollTop;return await Me(),t.scrollTop=l.offsetTop-v,i}}},We="vitepress:tabSharedState",Y=typeof localStorage<"u"?localStorage:null,qe="vitepress:tabsSharedState",Pr=()=>{const s=Y==null?void 0:Y.getItem(qe);if(s)try{return JSON.parse(s)}catch{}return{}},Sr=s=>{Y&&Y.setItem(qe,JSON.stringify(s))},Vr=s=>{const t=lt({});G(()=>t.content,(e,o)=>{e&&o&&Sr(e)},{deep:!0}),s.provide(We,t)},Lr=(s,t)=>{const e=J(We);if(!e)throw new Error("[vitepress-plugin-tabs] TabsSharedState should be injected");j(()=>{e.content||(e.content=Pr())});const o=w(),n=g({get(){var d;const l=t.value,v=s.value;if(l){const m=(d=e.content)==null?void 0:d[l];if(m&&v.includes(m))return m}else{const m=o.value;if(m)return m}return v[0]},set(l){const v=t.value;v?e.content&&(e.content[v]=l):o.value=l}});return{selected:n,select:l=>{n.value=l}}};let Le=0;const Tr=()=>(Le++,""+Le);function wr(){const s=Be();return g(()=>{var o;const e=(o=s.default)==null?void 0:o.call(s);return e?e.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 Je="vitepress:tabSingleState",Ir=s=>{_e(Je,s)},Nr=()=>{const s=J(Je);if(!s)throw new Error("[vitepress-plugin-tabs] TabsSingleState should be injected");return s},Mr={class:"plugin-tabs"},Ar=["id","aria-selected","aria-controls","tabindex","onClick"],Cr=_({__name:"PluginTabs",props:{sharedStateKey:{}},setup(s){const t=s,e=wr(),{selected:o,select:n}=Lr(e,ct(t,"sharedStateKey")),i=w(),{stabilizeScrollPosition:l}=yr(i),v=l(n),d=w([]),m=k=>{var A;const V=e.value.indexOf(o.value);let S;k.key==="ArrowLeft"?S=V>=1?V-1:e.value.length-1:k.key==="ArrowRight"&&(S=V(a(),u("div",Mr,[h("div",{ref_key:"tablist",ref:i,class:"plugin-tabs--tab-list",role:"tablist",onKeydown:m},[(a(!0),u(M,null,E(r(e),S=>(a(),u("button",{id:`tab-${S}-${r(P)}`,ref_for:!0,ref_key:"buttonRefs",ref:d,key:S,role:"tab",class:"plugin-tabs--tab","aria-selected":S===r(o),"aria-controls":`panel-${S}-${r(P)}`,tabindex:S===r(o)?0:-1,onClick:()=>r(v)(S)},T(S),9,Ar))),128))],544),c(k.$slots,"default")]))}}),Br=["id","aria-labelledby"],Hr=_({__name:"PluginTabsTab",props:{label:{}},setup(s){const{uid:t,selected:e}=Nr();return(o,n)=>r(e)===o.label?(a(),u("div",{key:0,id:`panel-${o.label}-${r(t)}`,class:"plugin-tabs--content",role:"tabpanel",tabindex:"0","aria-labelledby":`tab-${o.label}-${r(t)}`},[c(o.$slots,"default",{},void 0,!0)],8,Br)):f("",!0)}}),Er=$(Hr,[["__scopeId","data-v-9b0d03d2"]]),Dr=s=>{Vr(s),s.component("PluginTabs",Cr),s.component("PluginTabsTab",Er)},Or={extends:Ve,Layout(){return ut(Ve.Layout,null,{})},enhanceApp({app:s,router:t,siteData:e}){Dr(s)}};export{Or as R,Qn as c,L as u}; diff --git a/dev/assets/constraints_comparison_constraints.md.C8bTAbHg.js b/dev/assets/constraints_comparison_constraints.md.2Ukc8viw.js similarity index 99% rename from dev/assets/constraints_comparison_constraints.md.C8bTAbHg.js rename to dev/assets/constraints_comparison_constraints.md.2Ukc8viw.js index e3b42a1..a799fd2 100644 --- a/dev/assets/constraints_comparison_constraints.md.C8bTAbHg.js +++ b/dev/assets/constraints_comparison_constraints.md.2Ukc8viw.js @@ -4,7 +4,7 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.aA95Gx5L.js";const y 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_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=+)
 concept(:all_equal)(x; val=nothing, pair_vars=zeros(x), op=+)

Examples

julia
c = concept(:all_equal)
 
 c([0, 0, 0, 0])
@@ -12,7 +12,7 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.aA95Gx5L.js";const y
 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_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)
 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)
@@ -22,4 +22,4 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.aA95Gx5L.js";const y
 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


`,8),l=[t];function k(p,e,r,E,d,g){return a(),i("div",null,l)}const c=s(h,[["render",k]]);export{y as __pageData,c as default}; +!c([1, 2, 3, 4, 3]; op=<)

source


`,8),l=[t];function k(p,e,r,E,d,g){return a(),i("div",null,l)}const c=s(h,[["render",k]]);export{y as __pageData,c as default}; diff --git a/dev/assets/constraints_comparison_constraints.md.C8bTAbHg.lean.js b/dev/assets/constraints_comparison_constraints.md.2Ukc8viw.lean.js similarity index 100% rename from dev/assets/constraints_comparison_constraints.md.C8bTAbHg.lean.js rename to dev/assets/constraints_comparison_constraints.md.2Ukc8viw.lean.js diff --git a/dev/assets/constraints_connection_constraints.md.BVUChQGg.js b/dev/assets/constraints_connection_constraints.md.0kSxmxNT.js similarity index 99% rename from dev/assets/constraints_connection_constraints.md.BVUChQGg.js rename to dev/assets/constraints_connection_constraints.md.0kSxmxNT.js index 0e1a1f3..8a826a2 100644 --- a/dev/assets/constraints_connection_constraints.md.BVUChQGg.js +++ b/dev/assets/constraints_connection_constraints.md.0kSxmxNT.js @@ -2,17 +2,17 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.aA95Gx5L.js";const c 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_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)
 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_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)
 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_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)
 concept(:channel)(x; dim=1, id=nothing)

Examples

julia
c = concept(:channel)
 
 c([2, 1, 4, 3])
@@ -21,4 +21,4 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.aA95Gx5L.js";const c
 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),l=[h];function k(p,e,r,E,d,o){return a(),i("div",null,l)}const y=s(t,[["render",k]]);export{c as __pageData,y as default}; +c([false, false, true, false]; id=1)

source


`,10),l=[h];function k(p,e,r,E,d,o){return a(),i("div",null,l)}const y=s(t,[["render",k]]);export{c as __pageData,y as default}; diff --git a/dev/assets/constraints_connection_constraints.md.BVUChQGg.lean.js b/dev/assets/constraints_connection_constraints.md.0kSxmxNT.lean.js similarity index 100% rename from dev/assets/constraints_connection_constraints.md.BVUChQGg.lean.js rename to dev/assets/constraints_connection_constraints.md.0kSxmxNT.lean.js diff --git a/dev/assets/constraints_constraint_commons.md.CgCZE1cQ.js b/dev/assets/constraints_constraint_commons.md.PTLdrUW2.js similarity index 58% rename from dev/assets/constraints_constraint_commons.md.CgCZE1cQ.js rename to dev/assets/constraints_constraint_commons.md.PTLdrUW2.js index 01ee67d..f3c0636 100644 --- a/dev/assets/constraints_constraint_commons.md.CgCZE1cQ.js +++ b/dev/assets/constraints_constraint_commons.md.PTLdrUW2.js @@ -1,4 +1,4 @@ -import{_ as s,c as a,o as i,a7 as t}from"./chunks/framework.aA95Gx5L.js";const u=JSON.parse('{"title":"ConstraintCommons.jl","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/constraint_commons.md","filePath":"constraints/constraint_commons.md","lastUpdated":null}'),e={name:"constraints/constraint_commons.md"},n=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.

Key Features and Functionalities

  • Shared Structures and Abstract Types: ConstraintCommons.jl offers a collection of shared data structures and abstract types. This standardization is crucial for ensuring that packages such as ConstraintDomains, Constraints, ConstraintLearning, etc. can seamlessly interact and integrate, fostering a cohesive development environment.

  • Generic Functions and Methods: The package includes a set of generic functions and methods that are common across the JuliaConstraints ecosystem. This approach minimizes duplication and facilitates the extension of functionalities across different packages without requiring redundant code.

  • Interface for Learning and Application Transition: One of the pivotal roles of ConstraintCommons.jl is to provide a shared interface that bridges the gap between learning packages (e.g., CompositionalNetworks, QUBOConstraints, and ConstraintTranslator) and basic functionality packages. This interface ensures that once a learning process is complete, the resulting models or solutions can be directly utilized with the basic packages, eliminating the need for users to manage multiple package dependencies actively.

  • Simplifying the User Experience: By ensuring that learning outcomes are compatible with the fundamental packages for constraint programming, ConstraintCommons.jl simplifies the workflow for end-users. Once the learning aspect of problem modeling is completed, users can proceed with their projects relying solely on the basic packages, streamlining the development process and enhancing usability.

  • Impact on the JuliaConstraints Ecosystem: ConstraintCommons.jl plays a critical role in the JuliaConstraints ecosystem by providing the foundational elements that enable package interoperability and efficient development workflows. Its design emphasizes ease of use and seamless transition between the learning phase of constraint programming and practical application, thereby enhancing productivity and reducing the complexity of developing constraint-based solutions.

Parameters

This section of the package list or extract parameters based on the XCSP3-core specifications. Note that, for the forseeable future, the default constraints specification will follow the XCSP3 format.

# ConstraintCommons.USUAL_CONSTRAINT_PARAMETERSConstant.
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints).

julia
const USUAL_CONSTRAINT_PARAMETERS = [
+import{_ as s,c as a,o as i,a7 as t}from"./chunks/framework.aA95Gx5L.js";const k=JSON.parse('{"title":"ConstraintCommons.jl","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/constraint_commons.md","filePath":"constraints/constraint_commons.md","lastUpdated":null}'),e={name:"constraints/constraint_commons.md"},n=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.

Key Features and Functionalities

  • Shared Structures and Abstract Types: ConstraintCommons.jl offers a collection of shared data structures and abstract types. This standardization is crucial for ensuring that packages such as ConstraintDomains, Constraints, ConstraintLearning, etc. can seamlessly interact and integrate, fostering a cohesive development environment.

  • Generic Functions and Methods: The package includes a set of generic functions and methods that are common across the JuliaConstraints ecosystem. This approach minimizes duplication and facilitates the extension of functionalities across different packages without requiring redundant code.

  • Interface for Learning and Application Transition: One of the pivotal roles of ConstraintCommons.jl is to provide a shared interface that bridges the gap between learning packages (e.g., CompositionalNetworks, QUBOConstraints, and ConstraintTranslator) and basic functionality packages. This interface ensures that once a learning process is complete, the resulting models or solutions can be directly utilized with the basic packages, eliminating the need for users to manage multiple package dependencies actively.

  • Simplifying the User Experience: By ensuring that learning outcomes are compatible with the fundamental packages for constraint programming, ConstraintCommons.jl simplifies the workflow for end-users. Once the learning aspect of problem modeling is completed, users can proceed with their projects relying solely on the basic packages, streamlining the development process and enhancing usability.

  • Impact on the JuliaConstraints Ecosystem: ConstraintCommons.jl plays a critical role in the JuliaConstraints ecosystem by providing the foundational elements that enable package interoperability and efficient development workflows. Its design emphasizes ease of use and seamless transition between the learning phase of constraint programming and practical application, thereby enhancing productivity and reducing the complexity of developing constraint-based solutions.

Parameters

This section of the package list or extract parameters based on the XCSP3-core specifications. Note that, for the forseeable future, the default constraints specification will follow the XCSP3 format.

# ConstraintCommons.USUAL_CONSTRAINT_PARAMETERSConstant.
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints).

julia
const USUAL_CONSTRAINT_PARAMETERS = [
     :bool,
     :dim,
     :id,
@@ -7,4 +7,4 @@ import{_ as s,c as a,o as i,a7 as t}from"./chunks/framework.aA95Gx5L.js";const u
     :pair_vars,
     :val,
     :vals,
-]

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 – TODO

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


Missing docstring.

Missing docstring for Automaton(a::MDD). 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


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

Internal method used by accept with Automaton.

source


Performances – TODO

Extensions

We extended some operations for Nothing and Symbol.

# Base.:*Function.
julia
Base.:*(s1::Symbol, s2::Symbol, connector::AbstractString="_")

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

source


# Base.inMethod.
julia
Base.in(::Any, ::Nothing)

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

source


# Base.isemptyMethod.
julia
Base.isempty(::Nothing)

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

source


Performances – TODO

Sampling

During our constraint learning processes, we use sampling to efficiently make partial exploration of search spaces. Follows some 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 – TODO

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 – TODO

Dictionaries

We provide the everuseful 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 – TODO

`,51),o=[n];function r(l,c,p,h,d,m){return i(),a("div",null,o)}const g=s(e,[["render",r]]);export{u as __pageData,g as default}; +]

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 – TODO

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


Missing docstring.

Missing docstring for Automaton(a::MDD). 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


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

Internal method used by accept with Automaton.

source


Performances – TODO

Extensions

We extended some operations for Nothing and Symbol.

Missing docstring.

Missing docstring for Base.:*. Check Documenter's build log for details.

Missing docstring.

Missing docstring for Base.in(::Any, ::Nothing). Check Documenter's build log for details.

Missing docstring.

Missing docstring for Base.isempty(::Nothing). Check Documenter's build log for details.

Performances – TODO

Sampling

During our constraint learning processes, we use sampling to efficiently make partial exploration of search spaces. Follows some 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 – TODO

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 – TODO

Dictionaries

We provide the everuseful 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 – TODO

`,48),o=[n];function r(l,c,p,d,h,m){return i(),a("div",null,o)}const g=s(e,[["render",r]]);export{k as __pageData,g as default}; diff --git a/dev/assets/constraints_constraint_commons.md.CgCZE1cQ.lean.js b/dev/assets/constraints_constraint_commons.md.PTLdrUW2.lean.js similarity index 59% rename from dev/assets/constraints_constraint_commons.md.CgCZE1cQ.lean.js rename to dev/assets/constraints_constraint_commons.md.PTLdrUW2.lean.js index afb573c..e4e042c 100644 --- a/dev/assets/constraints_constraint_commons.md.CgCZE1cQ.lean.js +++ b/dev/assets/constraints_constraint_commons.md.PTLdrUW2.lean.js @@ -1 +1 @@ -import{_ as s,c as a,o as i,a7 as t}from"./chunks/framework.aA95Gx5L.js";const u=JSON.parse('{"title":"ConstraintCommons.jl","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/constraint_commons.md","filePath":"constraints/constraint_commons.md","lastUpdated":null}'),e={name:"constraints/constraint_commons.md"},n=t("",51),o=[n];function r(l,c,p,h,d,m){return i(),a("div",null,o)}const g=s(e,[["render",r]]);export{u as __pageData,g as default}; +import{_ as s,c as a,o as i,a7 as t}from"./chunks/framework.aA95Gx5L.js";const k=JSON.parse('{"title":"ConstraintCommons.jl","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/constraint_commons.md","filePath":"constraints/constraint_commons.md","lastUpdated":null}'),e={name:"constraints/constraint_commons.md"},n=t("",48),o=[n];function r(l,c,p,d,h,m){return i(),a("div",null,o)}const g=s(e,[["render",r]]);export{k as __pageData,g as default}; diff --git a/dev/assets/constraints_constraint_domains.md.CJq87aJj.js b/dev/assets/constraints_constraint_domains.md.CJq87aJj.js deleted file mode 100644 index 370800b..0000000 --- a/dev/assets/constraints_constraint_domains.md.CJq87aJj.js +++ /dev/null @@ -1,36 +0,0 @@ -import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.aA95Gx5L.js";const u=JSON.parse('{"title":"ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/constraint_domains.md","filePath":"constraints/constraint_domains.md","lastUpdated":null}'),n={name:"constraints/constraint_domains.md"},e=t(`

ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints

ConstraintDomains.jl stands as a critical package within the Julia Constraints ecosystem, focusing on the definition and manipulation of variable domains that underpin the search spaces of constraint programming problems. This package provides the infrastructure necessary for specifying both discrete and continuous domains, thereby enabling a broad range of constraint programming applications.

Key Features and Functionalities

  • AbstractDomain Super Type: 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.

  • Domain Types: The package distinguishes between various domain types to cater to different needs:

    • ContinuousDomain: A supertype for domains representing continuous ranges of real numbers.

    • DiscreteDomain: Serves as a supertype for domains defined by discrete sets or ranges of numbers.

    • EmptyDomain: Handles yet-to-be-defined domains, facilitating dynamic problem formulation.

    • Intervals and RangeDomain: Represent continuous intervals and discrete ranges, respectively, providing flexible domain specification options.

  • Dynamic Domain Manipulation: ConstraintDomains.jl supports dynamic changes to domains, allowing for the addition (add!) and deletion (delete!) of elements, crucial for problems where domain definitions evolve based on the search process or external inputs.

  • Exploration Settings and Methods: The package offers ExploreSettings to configure the exploration of search spaces, including parameters for complete searches, maximum samplings, and solution limits. This feature is pivotal for tailoring the search process to the problem's characteristics and the computational resources available.

  • Support for Advanced Modeling: Beyond basic domain definition and manipulation, ConstraintDomains.jl integrates with learning and parameter exploration tools. For instance, FakeAutomaton facilitates the generation of pseudo-automata for parameter exploration, while the package also provides functions for generating random parameters (generate_parameters), accessing domain internals (get_domain), and merging or intersecting domains (merge_domains, intersect_domains).

Empowering Constraint Programming in Julia

ConstraintDomains.jl embodies the versatility and power of the JuliaConstraints ecosystem, offering users a comprehensive toolkit for defining and exploring variable domains. By abstracting complex domain manipulations and providing a rich set of functionalities, ConstraintDomains.jl enhances the ease and efficiency of modeling constraint programming problems. Whether for educational purposes, research, or practical applications, this package lays the groundwork for advanced problem-solving strategies in the realm of constraint programming.

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

Addtionally, 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
Base.in(::Any, ::Nothing)

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

source

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(::Nothing)

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

source

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

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
Base.in(::Any, ::Nothing)

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

source

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


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
Base.in(::Any, ::Nothing)

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

source

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


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)),
-)

Settings for the exploration of a search space composed by a collection of domains.

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, param = nothing; search_limit = 1000, solutions_limit = 100)

Search (a part of) a search space and returns a pair of vector of configurations: (solutions, non_solutions). If the search space size is over search_limit, then both solutions and non_solutions are limited to solutions_limit.

Beware that if the density of the solutions in the search space is low, solutions_limit needs to be reduced. This process will be automatic in the future (simple reinforcement learning).

Arguments:

  • domains: a collection of domains

  • concept: the concept of the targeted constraint

  • param: an optional parameter of the constraint

  • sol_number: the required number of solutions (half of the number of configurations), default to 100

source


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


`,128),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_constraint_domains.md.Cd0YH57K.js b/dev/assets/constraints_constraint_domains.md.Cd0YH57K.js new file mode 100644 index 0000000..02a6713 --- /dev/null +++ b/dev/assets/constraints_constraint_domains.md.Cd0YH57K.js @@ -0,0 +1,36 @@ +import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.aA95Gx5L.js";const u=JSON.parse('{"title":"ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/constraint_domains.md","filePath":"constraints/constraint_domains.md","lastUpdated":null}'),n={name:"constraints/constraint_domains.md"},e=t(`

ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints

ConstraintDomains.jl stands as a critical package within the Julia Constraints ecosystem, focusing on the definition and manipulation of variable domains that underpin the search spaces of constraint programming problems. This package provides the infrastructure necessary for specifying both discrete and continuous domains, thereby enabling a broad range of constraint programming applications.

Key Features and Functionalities

  • AbstractDomain Super Type: 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.

  • Domain Types: The package distinguishes between various domain types to cater to different needs:

    • ContinuousDomain: A supertype for domains representing continuous ranges of real numbers.

    • DiscreteDomain: Serves as a supertype for domains defined by discrete sets or ranges of numbers.

    • EmptyDomain: Handles yet-to-be-defined domains, facilitating dynamic problem formulation.

    • Intervals and RangeDomain: Represent continuous intervals and discrete ranges, respectively, providing flexible domain specification options.

  • Dynamic Domain Manipulation: ConstraintDomains.jl supports dynamic changes to domains, allowing for the addition (add!) and deletion (delete!) of elements, crucial for problems where domain definitions evolve based on the search process or external inputs.

  • Exploration Settings and Methods: The package offers ExploreSettings to configure the exploration of search spaces, including parameters for complete searches, maximum samplings, and solution limits. This feature is pivotal for tailoring the search process to the problem's characteristics and the computational resources available.

  • Support for Advanced Modeling: Beyond basic domain definition and manipulation, ConstraintDomains.jl integrates with learning and parameter exploration tools. For instance, FakeAutomaton facilitates the generation of pseudo-automata for parameter exploration, while the package also provides functions for generating random parameters (generate_parameters), accessing domain internals (get_domain), and merging or intersecting domains (merge_domains, intersect_domains).

Empowering Constraint Programming in Julia

ConstraintDomains.jl embodies the versatility and power of the JuliaConstraints ecosystem, offering users a comprehensive toolkit for defining and exploring variable domains. By abstracting complex domain manipulations and providing a rich set of functionalities, ConstraintDomains.jl enhances the ease and efficiency of modeling constraint programming problems. Whether for educational purposes, research, or practical applications, this package lays the groundwork for advanced problem-solving strategies in the realm of constraint programming.

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

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


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


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)),
+)

Settings for the exploration of a search space composed by a collection of domains.

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, param = nothing; search_limit = 1000, solutions_limit = 100)

Search (a part of) a search space and returns a pair of vector of configurations: (solutions, non_solutions). If the search space size is over search_limit, then both solutions and non_solutions are limited to solutions_limit.

Beware that if the density of the solutions in the search space is low, solutions_limit needs to be reduced. This process will be automatic in the future (simple reinforcement learning).

Arguments:

  • domains: a collection of domains

  • concept: the concept of the targeted constraint

  • param: an optional parameter of the constraint

  • sol_number: the required number of solutions (half of the number of configurations), default to 100

source


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


`,128),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_constraint_domains.md.CJq87aJj.lean.js b/dev/assets/constraints_constraint_domains.md.Cd0YH57K.lean.js similarity index 100% rename from dev/assets/constraints_constraint_domains.md.CJq87aJj.lean.js rename to dev/assets/constraints_constraint_domains.md.Cd0YH57K.lean.js diff --git a/dev/assets/constraints_constraints.md.bgO76M7m.js b/dev/assets/constraints_constraints.md.bgO76M7m.js deleted file mode 100644 index cd617bd..0000000 --- a/dev/assets/constraints_constraints.md.bgO76M7m.js +++ /dev/null @@ -1,3 +0,0 @@ -import{_ as s,c as i,o as t,a7 as a}from"./chunks/framework.aA95Gx5L.js";const u=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/constraints.md","filePath":"constraints/constraints.md","lastUpdated":null}'),n={name:"constraints/constraints.md"},e=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

Constraints.jl is a pivotal package within the JuliaConstraints ecosystem, designed to facilitate the definition, manipulation, and application of constraints in constraint programming (CP). This package is central to handling both standard and complex constraints, making it an indispensable tool for developers and researchers working in CP.

Key Features and Functionalities

  • Integration of XCSP3-core Constraints: One of the standout features of Constraints.jl is its incorporation of the XCSP3-core constraints as usual constraints within Julia. This integration ensures that users can define and work with a wide range of standard constraints, following the specifications outlined in the XCSP3-core, directly in Julia. The use of USUAL_CONSTRAINTS dictionary allows for straightforward addition and manipulation of these constraints, enhancing the package's utility and flexibility.

  • Learning Package Integration: Constraints.jl goes beyond traditional constraint handling by offering the capability to include results from various learning packages within the JuliaConstraints organization. This feature allows for the enhancement of usual constraints and those from the Global Constraints Catalog with learned parameters and behaviors, significantly improving constraint applicability and performance in complex CP problems.

  • Constraint Definition and Symmetry Handling: The package provides a simple yet powerful syntax for defining new constraints (@usual) and managing their symmetries through the USUAL_SYMMETRIES dictionary. This approach simplifies the creation of new constraints and the optimization of constraint search spaces by avoiding redundant explorations.

  • Advanced Constraint Functionalities: At the core of Constraints.jl is the Constraint type, encapsulating the essential elements of a constraint, including its concept (a Boolean function determining satisfaction) and an error function (providing a preference measure over invalid assignments). These components are crucial for defining how constraints behave and are evaluated within a CP model.

  • Flexible Constraint Application: The package supports a range of methods for interacting with constraints, such as args, concept, error_f, params_length, symmetries, and xcsp_intension. These methods offer users the ability to examine constraint properties, apply constraints to variable assignments, and work with intensional constraints defined by predicates. Such flexibility is vital for tailoring constraint behavior to specific problems and contexts.

Enabling Advanced Modeling in Constraint Programming

Constraints.jl embodies the JuliaConstraints ecosystem's commitment to providing robust, flexible tools for constraint programming. By integrating standard constraints, facilitating the incorporation of learned behaviors, and offering comprehensive tools for constraint definition and application, Constraints.jl significantly enhances the modeling capabilities available to CP practitioners. Whether for educational purposes, research, or solving practical CP problems, Constraints.jl offers a sophisticated, user-friendly platform for working with constraints in Julia.

Basic tools

# 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 stucture 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 assignements. Return 0.0 if the constraint is satisfied, and a strictly positive real otherwise.

source


# 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


# 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


# Constraints.argsFunction.
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.params_lengthFunction.
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.symmetriesFunction.
julia
symmetries(c::Constraint)

Return the list of symmetries of c.

source


# Constraints.make_errorFunction.
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.shrink_conceptFunction.
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.concept_vs_errorFunction.
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


Usual constraints (based on and including XCSP3-core categories)

# 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


# 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


# 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


# 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


# 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


`,42),r=[e];function o(l,p,h,c,d,k){return t(),i("div",null,r)}const b=s(n,[["render",o]]);export{u as __pageData,b as default}; diff --git a/dev/assets/constraints_constraints.md.ijIsQmJK.js b/dev/assets/constraints_constraints.md.ijIsQmJK.js new file mode 100644 index 0000000..0789f9f --- /dev/null +++ b/dev/assets/constraints_constraints.md.ijIsQmJK.js @@ -0,0 +1,3 @@ +import{_ as s,c as i,o as t,a7 as a}from"./chunks/framework.aA95Gx5L.js";const u=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/constraints.md","filePath":"constraints/constraints.md","lastUpdated":null}'),n={name:"constraints/constraints.md"},e=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

Constraints.jl is a pivotal package within the JuliaConstraints ecosystem, designed to facilitate the definition, manipulation, and application of constraints in constraint programming (CP). This package is central to handling both standard and complex constraints, making it an indispensable tool for developers and researchers working in CP.

Key Features and Functionalities

  • Integration of XCSP3-core Constraints: One of the standout features of Constraints.jl is its incorporation of the XCSP3-core constraints as usual constraints within Julia. This integration ensures that users can define and work with a wide range of standard constraints, following the specifications outlined in the XCSP3-core, directly in Julia. The use of USUAL_CONSTRAINTS dictionary allows for straightforward addition and manipulation of these constraints, enhancing the package's utility and flexibility.

  • Learning Package Integration: Constraints.jl goes beyond traditional constraint handling by offering the capability to include results from various learning packages within the JuliaConstraints organization. This feature allows for the enhancement of usual constraints and those from the Global Constraints Catalog with learned parameters and behaviors, significantly improving constraint applicability and performance in complex CP problems.

  • Constraint Definition and Symmetry Handling: The package provides a simple yet powerful syntax for defining new constraints (@usual) and managing their symmetries through the USUAL_SYMMETRIES dictionary. This approach simplifies the creation of new constraints and the optimization of constraint search spaces by avoiding redundant explorations.

  • Advanced Constraint Functionalities: At the core of Constraints.jl is the Constraint type, encapsulating the essential elements of a constraint, including its concept (a Boolean function determining satisfaction) and an error function (providing a preference measure over invalid assignments). These components are crucial for defining how constraints behave and are evaluated within a CP model.

  • Flexible Constraint Application: The package supports a range of methods for interacting with constraints, such as args, concept, error_f, params_length, symmetries, and xcsp_intension. These methods offer users the ability to examine constraint properties, apply constraints to variable assignments, and work with intensional constraints defined by predicates. Such flexibility is vital for tailoring constraint behavior to specific problems and contexts.

Enabling Advanced Modeling in Constraint Programming

Constraints.jl embodies the JuliaConstraints ecosystem's commitment to providing robust, flexible tools for constraint programming. By integrating standard constraints, facilitating the incorporation of learned behaviors, and offering comprehensive tools for constraint definition and application, Constraints.jl significantly enhances the modeling capabilities available to CP practitioners. Whether for educational purposes, research, or solving practical CP problems, Constraints.jl offers a sophisticated, user-friendly platform for working with constraints in Julia.

Basic tools

# 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


# 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


# 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


# Constraints.argsFunction.
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.params_lengthFunction.
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.symmetriesFunction.
julia
symmetries(c::Constraint)

Return the list of symmetries of c.

source


# Constraints.make_errorFunction.
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.shrink_conceptFunction.
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.concept_vs_errorFunction.
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


Usual constraints (based on and including XCSP3-core categories)

# 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


# 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


# 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


# 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


# 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


`,42),r=[e];function o(l,p,h,c,d,k){return t(),i("div",null,r)}const b=s(n,[["render",o]]);export{u as __pageData,b as default}; diff --git a/dev/assets/constraints_constraints.md.bgO76M7m.lean.js b/dev/assets/constraints_constraints.md.ijIsQmJK.lean.js similarity index 100% rename from dev/assets/constraints_constraints.md.bgO76M7m.lean.js rename to dev/assets/constraints_constraints.md.ijIsQmJK.lean.js diff --git a/dev/assets/constraints_counting_summing_constraints.md.BT-OmEMD.js b/dev/assets/constraints_counting_summing_constraints.md.BIdrSepq.js similarity index 99% rename from dev/assets/constraints_counting_summing_constraints.md.BT-OmEMD.js rename to dev/assets/constraints_counting_summing_constraints.md.BIdrSepq.js index aa0afae..b9b9241 100644 --- a/dev/assets/constraints_counting_summing_constraints.md.BT-OmEMD.js +++ b/dev/assets/constraints_counting_summing_constraints.md.BIdrSepq.js @@ -4,7 +4,7 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.aA95Gx5L.js";const y 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_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)
 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)
@@ -12,13 +12,13 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.aA95Gx5L.js";const y
 
 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_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)
 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)
+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)
 concept(:cardinality_open)(x; vals)

Examples

julia
c = concept(:cardinality)
@@ -36,4 +36,4 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.aA95Gx5L.js";const y
 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


`,10),k=[t];function l(p,e,E,r,d,g){return a(),i("div",null,k)}const C=s(h,[["render",l]]);export{y as __pageData,C as default}; +co([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])

source


`,10),k=[t];function l(p,e,E,r,d,g){return a(),i("div",null,k)}const C=s(h,[["render",l]]);export{y as __pageData,C as default}; diff --git a/dev/assets/constraints_counting_summing_constraints.md.BT-OmEMD.lean.js b/dev/assets/constraints_counting_summing_constraints.md.BIdrSepq.lean.js similarity index 100% rename from dev/assets/constraints_counting_summing_constraints.md.BT-OmEMD.lean.js rename to dev/assets/constraints_counting_summing_constraints.md.BIdrSepq.lean.js diff --git a/dev/assets/constraints_elementary_constraints.md.b9VNGoNL.js b/dev/assets/constraints_elementary_constraints.md.BbiPuUtE.js similarity index 99% rename from dev/assets/constraints_elementary_constraints.md.b9VNGoNL.js rename to dev/assets/constraints_elementary_constraints.md.BbiPuUtE.js index c713898..5912c07 100644 --- a/dev/assets/constraints_elementary_constraints.md.b9VNGoNL.js +++ b/dev/assets/constraints_elementary_constraints.md.BbiPuUtE.js @@ -2,4 +2,4 @@ import{_ as i,c as s,o as a,a7 as t}from"./chunks/framework.aA95Gx5L.js";const g 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


`,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_elementary_constraints.md.b9VNGoNL.lean.js b/dev/assets/constraints_elementary_constraints.md.BbiPuUtE.lean.js similarity index 100% rename from dev/assets/constraints_elementary_constraints.md.b9VNGoNL.lean.js rename to dev/assets/constraints_elementary_constraints.md.BbiPuUtE.lean.js diff --git a/dev/assets/constraints_generic_constraints.md.COcQcDzW.js b/dev/assets/constraints_generic_constraints.md.Yd2fivbQ.js similarity index 97% rename from dev/assets/constraints_generic_constraints.md.COcQcDzW.js rename to dev/assets/constraints_generic_constraints.md.Yd2fivbQ.js index 65ff2a9..0fcb796 100644 --- a/dev/assets/constraints_generic_constraints.md.COcQcDzW.js +++ b/dev/assets/constraints_generic_constraints.md.Yd2fivbQ.js @@ -1,4 +1,4 @@ -import{_ as e,c as a,m as s,a as i,a7 as n,o as t}from"./chunks/framework.aA95Gx5L.js";const R=JSON.parse('{"title":"Generic Constraints","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/generic_constraints.md","filePath":"constraints/generic_constraints.md","lastUpdated":null}'),l={name:"constraints/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),c={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},E={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"},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":"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),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,"y")])],-1),u={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"},Q=n('',1),F=[Q],T=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),b=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 language such as JuMP should provide a Intention interface.

Defining an intention constraint in JC-API

',4),f=s("code",null,"dist_different",-1),x=s("em",null,"Constraints.jl",-1),v=s("code",null,"dist_different",-1),_={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},B={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"},w=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),H=[w],A=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),D={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"},j=n('',1),M=[j],I=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),P=n(`

The constraint is then added to the usual constraints collection.

julia
const description_dist_different = """
+import{_ as e,c as a,m as s,a as i,a7 as n,o as t}from"./chunks/framework.aA95Gx5L.js";const R=JSON.parse('{"title":"Generic Constraints","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/generic_constraints.md","filePath":"constraints/generic_constraints.md","lastUpdated":null}'),l={name:"constraints/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),c={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},E={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"},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":"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),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,"y")])],-1),u={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"},Q=n('',1),F=[Q],T=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),f=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 language such as JuMP should provide a Intention interface.

Defining an intention constraint in JC-API

',4),b=s("code",null,"dist_different",-1),x=s("em",null,"Constraints.jl",-1),v=s("code",null,"dist_different",-1),_={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},B={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"},w=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=[w],H=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"},j=n('',1),M=[j],P=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=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.
 """
 
@@ -9,7 +9,7 @@ import{_ as e,c as a,m as s,a as i,a7 as n,o as t}from"./chunks/framework.aA95Gx
 @usual concept_dist_different(x) = xcsp_intension(
     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 intension 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 Intension interface.

julia
concept(:dist_different, x)
+)

Please check the section dedicated to the Golomb Ruler problem to see a use for this constraint. <!– TODO: Golomb Ruler –>

APIs

Note that the intension 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 Intension interface.

julia
concept(:dist_different, x)
 concept(:dist_different)(x)
julia
# Defines the DistDifferent constraint
 c = x -> xcsp_intension(
     list = x,
@@ -24,7 +24,7 @@ import{_ as e,c as a,m as s,a as i,a7 as n,o as t}from"./chunks/framework.aA95Gx
 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


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.

XCSP in Constraints.jl {#XCSP-in-Constraints.jl}

# Constraints.xcsp_extensionFunction.
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)
+c([1, 2, 3, 3]) && !c([1, 2, 3, 4])

source


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.

XCSP in Constraints.jl {#XCSP-in-Constraints.jl}

# Constraints.xcsp_extensionFunction.
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)
 concept(:conflicts)(x; pair_vars)

Examples

julia
c = concept(:extension)
@@ -36,4 +36,4 @@ import{_ as e,c as a,m as s,a as i,a7 as n,o as t}from"./chunks/framework.aA95Gx
 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


`,22);function L(S,Z,q,J,G,N){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",c,[(t(),a("svg",E,y)),C]),i(" could be defined intentionally as "),s("mjx-container",u,[(t(),a("svg",m,F)),T]),i(".")]),b,s("p",null,[i("We use the "),f,i(" constraint to illustrate how to define an intention constraint in "),x,i(". The "),v,i(" constraint ensures that the distances between marks "),s("mjx-container",_,[(t(),a("svg",B,H)),A]),i(" on a ruler are unique.")]),s("mjx-container",D,[(t(),a("svg",V,M)),I]),P])}const z=e(l,[["render",L]]);export{R as __pageData,z as default}; +c([1, 2, 3, 4, 5]; pair_vars=[[1, 2, 1, 4, 5], [1, 2, 3, 5, 5]])

source


`,22);function S(L,Z,q,J,G,O){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",c,[(t(),a("svg",E,y)),C]),i(" could be defined intentionally as "),s("mjx-container",u,[(t(),a("svg",m,F)),T]),i(".")]),f,s("p",null,[i("We use the "),b,i(" constraint to illustrate how to define an intention constraint in "),x,i(". The "),v,i(" constraint ensures that the distances between marks "),s("mjx-container",_,[(t(),a("svg",B,D)),H]),i(" on a ruler are unique.")]),s("mjx-container",A,[(t(),a("svg",V,M)),P]),I])}const X=e(l,[["render",S]]);export{R as __pageData,X as default}; diff --git a/dev/assets/constraints_generic_constraints.md.COcQcDzW.lean.js b/dev/assets/constraints_generic_constraints.md.Yd2fivbQ.lean.js similarity index 93% rename from dev/assets/constraints_generic_constraints.md.COcQcDzW.lean.js rename to dev/assets/constraints_generic_constraints.md.Yd2fivbQ.lean.js index 5dac329..40e0865 100644 --- a/dev/assets/constraints_generic_constraints.md.COcQcDzW.lean.js +++ b/dev/assets/constraints_generic_constraints.md.Yd2fivbQ.lean.js @@ -1 +1 @@ -import{_ as e,c as a,m as s,a as i,a7 as n,o as t}from"./chunks/framework.aA95Gx5L.js";const R=JSON.parse('{"title":"Generic Constraints","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/generic_constraints.md","filePath":"constraints/generic_constraints.md","lastUpdated":null}'),l={name:"constraints/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),c={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},E={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"},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":"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),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,"y")])],-1),u={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"},Q=n("",1),F=[Q],T=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),b=n("",4),f=s("code",null,"dist_different",-1),x=s("em",null,"Constraints.jl",-1),v=s("code",null,"dist_different",-1),_={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},B={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"},w=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),H=[w],A=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),D={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"},j=n("",1),M=[j],I=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),P=n("",22);function L(S,Z,q,J,G,N){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",c,[(t(),a("svg",E,y)),C]),i(" could be defined intentionally as "),s("mjx-container",u,[(t(),a("svg",m,F)),T]),i(".")]),b,s("p",null,[i("We use the "),f,i(" constraint to illustrate how to define an intention constraint in "),x,i(". The "),v,i(" constraint ensures that the distances between marks "),s("mjx-container",_,[(t(),a("svg",B,H)),A]),i(" on a ruler are unique.")]),s("mjx-container",D,[(t(),a("svg",V,M)),I]),P])}const z=e(l,[["render",L]]);export{R as __pageData,z as default}; +import{_ as e,c as a,m as s,a as i,a7 as n,o as t}from"./chunks/framework.aA95Gx5L.js";const R=JSON.parse('{"title":"Generic Constraints","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/generic_constraints.md","filePath":"constraints/generic_constraints.md","lastUpdated":null}'),l={name:"constraints/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),c={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},E={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"},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":"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),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,"y")])],-1),u={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"},Q=n("",1),F=[Q],T=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),f=n("",4),b=s("code",null,"dist_different",-1),x=s("em",null,"Constraints.jl",-1),v=s("code",null,"dist_different",-1),_={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},B={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"},w=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=[w],H=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"},j=n("",1),M=[j],P=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=n("",22);function S(L,Z,q,J,G,O){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",c,[(t(),a("svg",E,y)),C]),i(" could be defined intentionally as "),s("mjx-container",u,[(t(),a("svg",m,F)),T]),i(".")]),f,s("p",null,[i("We use the "),b,i(" constraint to illustrate how to define an intention constraint in "),x,i(". The "),v,i(" constraint ensures that the distances between marks "),s("mjx-container",_,[(t(),a("svg",B,D)),H]),i(" on a ruler are unique.")]),s("mjx-container",A,[(t(),a("svg",V,M)),P]),I])}const X=e(l,[["render",S]]);export{R as __pageData,X as default}; diff --git a/dev/assets/constraints_graph_constraints.md.M2y2wALd.js b/dev/assets/constraints_graph_constraints.md.CTf_lkG3.js similarity index 99% rename from dev/assets/constraints_graph_constraints.md.M2y2wALd.js rename to dev/assets/constraints_graph_constraints.md.CTf_lkG3.js index 2ffeb70..3385c3c 100644 --- a/dev/assets/constraints_graph_constraints.md.M2y2wALd.js +++ b/dev/assets/constraints_graph_constraints.md.CTf_lkG3.js @@ -4,4 +4,4 @@ import{_ as i,c as s,o as a,a7 as t}from"./chunks/framework.aA95Gx5L.js";const g 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,c,d){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


`,4),h=[e];function l(p,r,k,o,c,d){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_graph_constraints.md.M2y2wALd.lean.js b/dev/assets/constraints_graph_constraints.md.CTf_lkG3.lean.js similarity index 100% rename from dev/assets/constraints_graph_constraints.md.M2y2wALd.lean.js rename to dev/assets/constraints_graph_constraints.md.CTf_lkG3.lean.js diff --git a/dev/assets/constraints_language_constraints.md.tj54bmg8.js b/dev/assets/constraints_language_constraints.md.CE20vPnP.js similarity index 99% rename from dev/assets/constraints_language_constraints.md.tj54bmg8.js rename to dev/assets/constraints_language_constraints.md.CE20vPnP.js index cc485a5..2a4d3f6 100644 --- a/dev/assets/constraints_language_constraints.md.tj54bmg8.js +++ b/dev/assets/constraints_language_constraints.md.CE20vPnP.js @@ -18,7 +18,7 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.aA95Gx5L.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


# 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)
 concept(:mdd)(x; language)

Examples

julia
c = concept(:mdd)
 
 states = [
@@ -45,4 +45,4 @@ import{_ as s,c as i,o as a,a7 as n}from"./chunks/framework.aA95Gx5L.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


`,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_language_constraints.md.tj54bmg8.lean.js b/dev/assets/constraints_language_constraints.md.CE20vPnP.lean.js similarity index 100% rename from dev/assets/constraints_language_constraints.md.tj54bmg8.lean.js rename to dev/assets/constraints_language_constraints.md.CE20vPnP.lean.js diff --git a/dev/assets/constraints_packing_scheduling_constraints.md.CiCQvkg6.js b/dev/assets/constraints_packing_scheduling_constraints.md.CSsKQ9F3.js similarity index 99% rename from dev/assets/constraints_packing_scheduling_constraints.md.CiCQvkg6.js rename to dev/assets/constraints_packing_scheduling_constraints.md.CSsKQ9F3.js index a823b93..4dcbaee 100644 --- a/dev/assets/constraints_packing_scheduling_constraints.md.CiCQvkg6.js +++ b/dev/assets/constraints_packing_scheduling_constraints.md.CSsKQ9F3.js @@ -4,7 +4,7 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.aA95Gx5L.js";const C 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)
+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)
 concept(:no_overlap_with_zero)(x; pair_vars)

Examples

julia
c = concept(:no_overlap)
@@ -15,4 +15,4 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.aA95Gx5L.js";const C
 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


`,6),k=[h];function l(p,e,r,E,d,g){return a(),i("div",null,k)}const y=s(n,[["render",l]]);export{C as __pageData,y 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


`,6),k=[h];function l(p,e,r,E,d,g){return a(),i("div",null,k)}const y=s(n,[["render",l]]);export{C as __pageData,y as default}; diff --git a/dev/assets/constraints_packing_scheduling_constraints.md.CiCQvkg6.lean.js b/dev/assets/constraints_packing_scheduling_constraints.md.CSsKQ9F3.lean.js similarity index 100% rename from dev/assets/constraints_packing_scheduling_constraints.md.CiCQvkg6.lean.js rename to dev/assets/constraints_packing_scheduling_constraints.md.CSsKQ9F3.lean.js diff --git a/dev/assets/cp_getting_started.md.BuWkGTqp.js b/dev/assets/cp_getting_started.md.BYxKzX2X.js similarity index 94% rename from dev/assets/cp_getting_started.md.BuWkGTqp.js rename to dev/assets/cp_getting_started.md.BYxKzX2X.js index 9af1054..d785f04 100644 --- a/dev/assets/cp_getting_started.md.BuWkGTqp.js +++ b/dev/assets/cp_getting_started.md.BYxKzX2X.js @@ -1,9 +1,9 @@ -import{_ as l,c as t,m as s,a as i,a7 as a,o as e}from"./chunks/framework.aA95Gx5L.js";const S=JSON.parse('{"title":"Getting Started with Julia for CP and Optimization","description":"","frontmatter":{},"headers":[],"relativePath":"cp/getting_started.md","filePath":"cp/getting_started.md","lastUpdated":null}'),n={name:"cp/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=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("msub",null,[s("mi",null,"X"),s("mn",null,"1")]),s("mo",null,","),s("mo",null,"⋯"),s("mo",null,","),s("msub",null,[s("mi",null,"X"),s("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=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,"C"),s("mo",null,"="),s("msub",null,[s("mi",null,"C"),s("mn",null,"1")]),s("mo",null,","),s("mo",null,"⋯"),s("mo",null,","),s("msub",null,[s("mi",null,"C"),s("mi",null,"n")])])],-1),v={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},y={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"},b=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),E=[b],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,"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
+import{_ as l,c as t,m as s,a as i,a7 as a,o as e}from"./chunks/framework.aA95Gx5L.js";const H=JSON.parse('{"title":"Getting Started with Julia for CP and Optimization","description":"","frontmatter":{},"headers":[],"relativePath":"cp/getting_started.md","filePath":"cp/getting_started.md","lastUpdated":null}'),n={name:"cp/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=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("msub",null,[s("mi",null,"X"),s("mn",null,"1")]),s("mo",null,","),s("mo",null,"⋯"),s("mo",null,","),s("msub",null,[s("mi",null,"X"),s("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=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,"C"),s("mo",null,"="),s("msub",null,[s("mi",null,"C"),s("mn",null,"1")]),s("mo",null,","),s("mo",null,"⋯"),s("mo",null,","),s("msub",null,[s("mi",null,"C"),s("mi",null,"n")])])],-1),v={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},y={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"},b=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),E=[b],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,"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
+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,D,x,A,L){return e(),t("div",null,[h,s("ol",null,[s("li",null,[i("A collection "),s("mjx-container",o,[(e(),t("svg",p,r)),k]),i(" of variables with each an associated domain.")])]),c,s("ol",null,[s("li",null,[i("A collection of predicates (called constraints) "),s("mjx-container",Q,[(e(),t("svg",g,u)),m]),i(" over (subsets of) "),s("mjx-container",v,[(e(),t("svg",y,E)),C]),i(".")])]),f])}const H=l(n,[["render",_]]);export{S as __pageData,H as default}; +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 _(F,w,D,A,x,B){return e(),t("div",null,[h,s("ol",null,[s("li",null,[i("A collection "),s("mjx-container",o,[(e(),t("svg",p,r)),k]),i(" of variables with each an associated domain.")])]),c,s("ol",null,[s("li",null,[i("A collection of predicates (called constraints) "),s("mjx-container",Q,[(e(),t("svg",g,u)),m]),i(" over (subsets of) "),s("mjx-container",v,[(e(),t("svg",y,E)),C]),i(".")])]),f])}const M=l(n,[["render",_]]);export{H as __pageData,M as default}; diff --git a/dev/assets/cp_getting_started.md.BuWkGTqp.lean.js b/dev/assets/cp_getting_started.md.BYxKzX2X.lean.js similarity index 95% rename from dev/assets/cp_getting_started.md.BuWkGTqp.lean.js rename to dev/assets/cp_getting_started.md.BYxKzX2X.lean.js index 69090e9..26abaa0 100644 --- a/dev/assets/cp_getting_started.md.BuWkGTqp.lean.js +++ b/dev/assets/cp_getting_started.md.BYxKzX2X.lean.js @@ -1 +1 @@ -import{_ as l,c as t,m as s,a as i,a7 as a,o as e}from"./chunks/framework.aA95Gx5L.js";const S=JSON.parse('{"title":"Getting Started with Julia for CP and Optimization","description":"","frontmatter":{},"headers":[],"relativePath":"cp/getting_started.md","filePath":"cp/getting_started.md","lastUpdated":null}'),n={name:"cp/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=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("msub",null,[s("mi",null,"X"),s("mn",null,"1")]),s("mo",null,","),s("mo",null,"⋯"),s("mo",null,","),s("msub",null,[s("mi",null,"X"),s("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=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,"C"),s("mo",null,"="),s("msub",null,[s("mi",null,"C"),s("mn",null,"1")]),s("mo",null,","),s("mo",null,"⋯"),s("mo",null,","),s("msub",null,[s("mi",null,"C"),s("mi",null,"n")])])],-1),v={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},y={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"},b=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),E=[b],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,"X")])],-1),f=a("",9);function _(w,F,D,x,A,L){return e(),t("div",null,[h,s("ol",null,[s("li",null,[i("A collection "),s("mjx-container",o,[(e(),t("svg",p,r)),k]),i(" of variables with each an associated domain.")])]),c,s("ol",null,[s("li",null,[i("A collection of predicates (called constraints) "),s("mjx-container",Q,[(e(),t("svg",g,u)),m]),i(" over (subsets of) "),s("mjx-container",v,[(e(),t("svg",y,E)),C]),i(".")])]),f])}const H=l(n,[["render",_]]);export{S as __pageData,H as default}; +import{_ as l,c as t,m as s,a as i,a7 as a,o as e}from"./chunks/framework.aA95Gx5L.js";const H=JSON.parse('{"title":"Getting Started with Julia for CP and Optimization","description":"","frontmatter":{},"headers":[],"relativePath":"cp/getting_started.md","filePath":"cp/getting_started.md","lastUpdated":null}'),n={name:"cp/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=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("msub",null,[s("mi",null,"X"),s("mn",null,"1")]),s("mo",null,","),s("mo",null,"⋯"),s("mo",null,","),s("msub",null,[s("mi",null,"X"),s("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=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,"C"),s("mo",null,"="),s("msub",null,[s("mi",null,"C"),s("mn",null,"1")]),s("mo",null,","),s("mo",null,"⋯"),s("mo",null,","),s("msub",null,[s("mi",null,"C"),s("mi",null,"n")])])],-1),v={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},y={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"},b=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),E=[b],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,"X")])],-1),f=a("",9);function _(F,w,D,A,x,B){return e(),t("div",null,[h,s("ol",null,[s("li",null,[i("A collection "),s("mjx-container",o,[(e(),t("svg",p,r)),k]),i(" of variables with each an associated domain.")])]),c,s("ol",null,[s("li",null,[i("A collection of predicates (called constraints) "),s("mjx-container",Q,[(e(),t("svg",g,u)),m]),i(" over (subsets of) "),s("mjx-container",v,[(e(),t("svg",y,E)),C]),i(".")])]),f])}const M=l(n,[["render",_]]);export{H as __pageData,M as default}; diff --git a/dev/assets/full_api.md.BY5e_0Y2.js b/dev/assets/full_api.md.BiWge5EP.js similarity index 76% rename from dev/assets/full_api.md.BY5e_0Y2.js rename to dev/assets/full_api.md.BiWge5EP.js index 7e8510f..19ca5cb 100644 --- a/dev/assets/full_api.md.BY5e_0Y2.js +++ b/dev/assets/full_api.md.BiWge5EP.js @@ -7,29 +7,29 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.aA95Gx5L.js";const E :pair_vars, :val, :vals, -]

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


# Base.:*Function.
julia
Base.:*(s1::Symbol, s2::Symbol, connector::AbstractString="_")

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

source


# Base.inMethod.
julia
Base.in(::Any, ::Nothing)

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

source


# Base.isemptyMethod.
julia
Base.isempty(::Nothing)

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

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.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.δ_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

Addtionally, 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(
+]

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.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
Base.:*(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;
     complete_search_limit = 10^6,
     max_samplings = sum(domain_size, domains),
     search = :flexible,
     solutions_limit = floor(Int, sqrt(max_samplings)),
-)

Settings for the exploration of a search space composed by a collection of domains.

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)
+)

Settings for the exploration of a search space composed by a collection of domains.

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)
 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, param = nothing; search_limit = 1000, solutions_limit = 100)

Search (a part of) a search space and returns a pair of vector of configurations: (solutions, non_solutions). If the search space size is over search_limit, then both solutions and non_solutions are limited to solutions_limit.

Beware that if the density of the solutions in the search space is low, solutions_limit needs to be reduced. This process will be automatic in the future (simple reinforcement learning).

Arguments:

  • domains: a collection of domains

  • concept: the concept of the targeted constraint

  • param: an optional parameter of the constraint

  • sol_number: the required number of solutions (half of the number of configurations), default to 100

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 stucture 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 assignements. 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.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, param = nothing; search_limit = 1000, solutions_limit = 100)

Search (a part of) a search space and returns a pair of vector of configurations: (solutions, non_solutions). If the search space size is over search_limit, then both solutions and non_solutions are limited to solutions_limit.

Beware that if the density of the solutions in the search space is low, solutions_limit needs to be reduced. This process will be automatic in the future (simple reinforcement learning).

Arguments:

  • domains: a collection of domains

  • concept: the concept of the targeted constraint

  • param: an optional parameter of the constraint

  • sol_number: the required number of solutions (half of the number of configurations), default to 100

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)
 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_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)
 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_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=+)
 concept(:all_equal)(x; val=nothing, pair_vars=zeros(x), op=+)

Examples

julia
c = concept(:all_equal)
 
 c([0, 0, 0, 0])
@@ -37,7 +37,7 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.aA95Gx5L.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)
+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)
 concept(:cardinality_open)(x; vals)

Examples

julia
c = concept(:cardinality)
@@ -55,7 +55,7 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.aA95Gx5L.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


# 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)
 concept(:channel)(x; dim=1, id=nothing)

Examples

julia
c = concept(:channel)
 
 c([2, 1, 4, 3])
@@ -64,13 +64,13 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.aA95Gx5L.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


# 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)
 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_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)
 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)
@@ -78,19 +78,19 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.aA95Gx5L.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


# 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)
 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_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)
 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)
+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)
 concept(:conflicts)(x; pair_vars)

Examples

julia
c = concept(:extension)
@@ -102,20 +102,20 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.aA95Gx5L.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


# 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)
 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_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)
 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_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)
 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_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)
 concept(:mdd)(x; language)

Examples

julia
c = concept(:mdd)
 
 states = [
@@ -142,11 +142,11 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.aA95Gx5L.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


# 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)
 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)
+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)
 concept(:no_overlap_with_zero)(x; pair_vars)

Examples

julia
c = concept(:no_overlap)
@@ -157,13 +157,13 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.aA95Gx5L.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


# 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)
 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_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)
 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)
@@ -173,7 +173,7 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.aA95Gx5L.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)
+!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)
 concept(:regular)(x; language)

Examples

julia
c = concept(:regular)
@@ -193,19 +193,20 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.aA95Gx5L.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


# 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)
 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_val_paramMethod.
julia
co_abs_diff_val_param(x; param)

Return the absolute difference between x and param.

source


# CompositionalNetworks.co_abs_diff_val_varsMethod.
julia
co_abs_diff_val_vars(x; nvars)

Return the absolute difference between x and the number of variables nvars.

source


# CompositionalNetworks.co_euclidianMethod.
julia
co_euclidian(x; dom_size)

Compute an euclidian norm with domain size dom_size of a scalar.

source


# CompositionalNetworks.co_euclidian_paramMethod.
julia
co_euclidian_param(x; param, dom_size)

Compute an euclidian norm with domain size dom_size, weigthed by param, 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_param_minus_valMethod.
julia
co_param_minus_val(x; param)

Return the difference param - x if positive, 0.0 otherwise.

source


# CompositionalNetworks.co_val_minus_paramMethod.
julia
co_val_minus_param(x; param)

Return the difference x - param if positive, 0.0 otherwise.

source


# CompositionalNetworks.co_val_minus_varsMethod.
julia
co_val_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_valMethod.
julia
co_vars_minus_val(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, weigths=nothing)

Return a function composed by some of the operations of a given ICN. Can be applied to any vector of variables. If weigths 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 paramater 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 (weigths) of a layer with exclusive operations.

source


# CompositionalNetworks.generate_inclusive_operationsMethod.
julia
generate_inclusive_operations(predicate, bits)

Generates the operations (weigths) of a layer with inclusive operations.

source


# CompositionalNetworks.generate_weigthsMethod.
julia
generate_weigths(layers)
-generate_weigths(icn)

Generate the weigths 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.@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_val_paramMethod.
julia
co_abs_diff_val_param(x; param)

Return the absolute difference between x and param.

source


# CompositionalNetworks.co_abs_diff_val_varsMethod.
julia
co_abs_diff_val_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_paramMethod.
julia
co_euclidean_param(x; param, dom_size)

Compute an euclidean norm with domain size dom_size, weighted by param, 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_param_minus_valMethod.
julia
co_param_minus_val(x; param)

Return the difference param - x if positive, 0.0 otherwise.

source


# CompositionalNetworks.co_val_minus_paramMethod.
julia
co_val_minus_param(x; param)

Return the difference x - param if positive, 0.0 otherwise.

source


# CompositionalNetworks.co_val_minus_varsMethod.
julia
co_val_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_valMethod.
julia
co_vars_minus_val(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 (weigths) 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)
 is_viable(icn)
-is_viable(icn, w)

Assert if a pair of layer/icn and weigths compose a viable pattern. If no weigths 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.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(;
     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_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
 basic_transforms = make_transformations(:none)
 
 # Apply an identity transformation
@@ -215,40 +216,40 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.aA95Gx5L.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 weigth 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 weigths, which is proportional to the normalized number of operations selected in the icn layers.

source


# CompositionalNetworks.selected_sizeMethod.
julia
selected_size(layer, layer_weigths)

Return the number of operations selected by layer_weigths 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 formated 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_vals_minusMethod.
julia
tr_contiguous_vals_minus(i, x)
+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_vals_minusMethod.
julia
tr_contiguous_vals_minus(i, x)
 tr_contiguous_vals_minus(x)
-tr_contiguous_vals_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_vals_minus_revMethod.
julia
tr_contiguous_vals_minus_rev(i, x)
+tr_contiguous_vals_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_vals_minus_revMethod.
julia
tr_contiguous_vals_minus_rev(i, x)
 tr_contiguous_vals_minus_rev(x)
-tr_contiguous_vals_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_paramMethod.
julia
tr_count_bounding_param(i, x; param)
+tr_contiguous_vals_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_paramMethod.
julia
tr_count_bounding_param(i, x; param)
 tr_count_bounding_param(x; param)
-tr_count_bounding_param(x, X::AbstractVector; param)

Count the number of elements bounded (not strictly) by x[i] and x[i] + param. An extended method to vector with sig (x, param) 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_param(x, X::AbstractVector; param)

Count the number of elements bounded (not strictly) by x[i] and x[i] + param. An extended method to vector with sig (x, param) 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_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_leftMethod.
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_paramMethod.
julia
tr_count_eq_param(i, x; param)
+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_paramMethod.
julia
tr_count_eq_param(i, x; param)
 tr_count_eq_param(x; param)
-tr_count_eq_param(x, X::AbstractVector; param)

Count the number of elements equal to x[i] + param. Extended method to vector with sig (x, param) 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_param(x, X::AbstractVector; param)

Count the number of elements equal to x[i] + param. Extended method to vector with sig (x, param) 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_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_g_leftMethod.
julia
tr_count_g_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_g_leftMethod.
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_paramMethod.
julia
tr_count_g_param(i, x; param)
+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_paramMethod.
julia
tr_count_g_param(i, x; param)
 tr_count_g_param(x; param)
-tr_count_g_param(x, X::AbstractVector; param)

Count the number of elements greater than x[i] + param. Extended method to vector with sig (x, param) 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_param(x, X::AbstractVector; param)

Count the number of elements greater than x[i] + param. Extended method to vector with sig (x, param) 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_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_greaterMethod.
julia
tr_count_greater(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_greaterMethod.
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_leftMethod.
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_paramMethod.
julia
tr_count_l_param(i, x; param)
+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_paramMethod.
julia
tr_count_l_param(i, x; param)
 tr_count_l_param(x; param)
-tr_count_l_param(x, X::AbstractVector; param)

Count the number of elements lesser than x[i] + param. Extended method to vector with sig (x, param) 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_param(x, X::AbstractVector; param)

Count the number of elements lesser than x[i] + param. Extended method to vector with sig (x, param) 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_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_lesserMethod.
julia
tr_count_lesser(i, 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_lesserMethod.
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_identityMethod.
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_param_minus_valMethod.
julia
tr_param_minus_val(i, x; param)
+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_param_minus_valMethod.
julia
tr_param_minus_val(i, x; param)
 tr_param_minus_val(x; param)
-tr_param_minus_val(x, X::AbstractVector; param)

Return the difference param - x[i] if positive, 0.0 otherwise. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_val_minus_paramMethod.
julia
tr_val_minus_param(i, x; param)
+tr_param_minus_val(x, X::AbstractVector; param)

Return the difference param - x[i] if positive, 0.0 otherwise. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_val_minus_paramMethod.
julia
tr_val_minus_param(i, x; param)
 tr_val_minus_param(x; param)
-tr_val_minus_param(x, X::AbstractVector; param)

Return the difference x[i] - param if positive, 0.0 otherwise. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.transformation_layerFunction.
julia
transformation_layer(param = false)

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

source


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

Set the weigths of an ICN with a BitVector.

source


# CompositionalNetworks.weigthsMethod.
julia
weigths(icn)

Access the current set of weigths of an ICN.

source


# CompositionalNetworks.weigths_biasMethod.
julia
weigths_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_val_minus_param(x, X::AbstractVector; param)

Return the difference x[i] - param if positive, 0.0 otherwise. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.transformation_layerFunction.
julia
transformation_layer(param = false)

Generate the layer of transformations functions of the ICN. Iff param value is true, also includes all the 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


`,371),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/full_api.md.BY5e_0Y2.lean.js b/dev/assets/full_api.md.BiWge5EP.lean.js similarity index 83% rename from dev/assets/full_api.md.BY5e_0Y2.lean.js rename to dev/assets/full_api.md.BiWge5EP.lean.js index c78f59b..f024fbc 100644 --- a/dev/assets/full_api.md.BY5e_0Y2.lean.js +++ b/dev/assets/full_api.md.BiWge5EP.lean.js @@ -1 +1 @@ -import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.aA95Gx5L.js";const E=JSON.parse('{"title":"Full API","description":"","frontmatter":{},"headers":[],"relativePath":"full_api.md","filePath":"full_api.md","lastUpdated":null}'),e={name:"full_api.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}; +import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.aA95Gx5L.js";const E=JSON.parse('{"title":"Full API","description":"","frontmatter":{},"headers":[],"relativePath":"full_api.md","filePath":"full_api.md","lastUpdated":null}'),e={name:"full_api.md"},n=t("",371),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/learning_aggregation.md.CLetyme2.js b/dev/assets/learning_aggregation.md.5RLMQ4Bd.js similarity index 95% rename from dev/assets/learning_aggregation.md.CLetyme2.js rename to dev/assets/learning_aggregation.md.5RLMQ4Bd.js index c13fbf0..2ab6dab 100644 --- a/dev/assets/learning_aggregation.md.CLetyme2.js +++ b/dev/assets/learning_aggregation.md.5RLMQ4Bd.js @@ -1 +1 @@ -import{_ as a,c as e,o as i,a7 as t}from"./chunks/framework.aA95Gx5L.js";const b=JSON.parse('{"title":"Aggregation Layer","description":"","frontmatter":{},"headers":[],"relativePath":"learning/aggregation.md","filePath":"learning/aggregation.md","lastUpdated":null}'),o={name:"learning/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 k=a(o,[["render",n]]);export{b as __pageData,k as default}; +import{_ as a,c as e,o as i,a7 as t}from"./chunks/framework.aA95Gx5L.js";const b=JSON.parse('{"title":"Aggregation Layer","description":"","frontmatter":{},"headers":[],"relativePath":"learning/aggregation.md","filePath":"learning/aggregation.md","lastUpdated":null}'),o={name:"learning/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 k=a(o,[["render",n]]);export{b as __pageData,k as default}; diff --git a/dev/assets/learning_aggregation.md.CLetyme2.lean.js b/dev/assets/learning_aggregation.md.5RLMQ4Bd.lean.js similarity index 100% rename from dev/assets/learning_aggregation.md.CLetyme2.lean.js rename to dev/assets/learning_aggregation.md.5RLMQ4Bd.lean.js diff --git a/dev/assets/learning_arithmetic.md.BCOx2iYR.js b/dev/assets/learning_arithmetic.md.DW5u7RMW.js similarity index 95% rename from dev/assets/learning_arithmetic.md.BCOx2iYR.js rename to dev/assets/learning_arithmetic.md.DW5u7RMW.js index 5b68c84..3b42d9e 100644 --- a/dev/assets/learning_arithmetic.md.BCOx2iYR.js +++ b/dev/assets/learning_arithmetic.md.DW5u7RMW.js @@ -1 +1 @@ -import{_ as e,c as i,o as t,a7 as a}from"./chunks/framework.aA95Gx5L.js";const b=JSON.parse('{"title":"Arithmetic Layer","description":"","frontmatter":{},"headers":[],"relativePath":"learning/arithmetic.md","filePath":"learning/arithmetic.md","lastUpdated":null}'),r={name:"learning/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}; +import{_ as e,c as i,o as t,a7 as a}from"./chunks/framework.aA95Gx5L.js";const b=JSON.parse('{"title":"Arithmetic Layer","description":"","frontmatter":{},"headers":[],"relativePath":"learning/arithmetic.md","filePath":"learning/arithmetic.md","lastUpdated":null}'),r={name:"learning/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_arithmetic.md.BCOx2iYR.lean.js b/dev/assets/learning_arithmetic.md.DW5u7RMW.lean.js similarity index 100% rename from dev/assets/learning_arithmetic.md.BCOx2iYR.lean.js rename to dev/assets/learning_arithmetic.md.DW5u7RMW.lean.js diff --git a/dev/assets/learning_comparison.md.BsnqPWC-.js b/dev/assets/learning_comparison.md.BsnqPWC-.js new file mode 100644 index 0000000..6dcfb65 --- /dev/null +++ b/dev/assets/learning_comparison.md.BsnqPWC-.js @@ -0,0 +1 @@ +import{_ as a,c as i,o as s,a7 as o}from"./chunks/framework.aA95Gx5L.js";const b=JSON.parse('{"title":"Comparison Layer","description":"","frontmatter":{},"headers":[],"relativePath":"learning/comparison.md","filePath":"learning/comparison.md","lastUpdated":null}'),e={name:"learning/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.

# CompositionalNetworks.co_abs_diff_val_varsFunction.
julia
co_abs_diff_val_vars(x; nvars)

Return the absolute difference between x and the number of variables nvars.

source


# CompositionalNetworks.co_val_minus_varsFunction.
julia
co_val_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_valFunction.
julia
co_vars_minus_val(x; nvars)

Return the difference nvars - x if positive, 0.0 otherwise, where nvars denotes the numbers of variables.

source


Param: :val

# CompositionalNetworks.co_abs_diff_val_paramFunction.
julia
co_abs_diff_val_param(x; param)

Return the absolute difference between x and param.

source


# CompositionalNetworks.co_val_minus_paramFunction.
julia
co_val_minus_param(x; param)

Return the difference x - param if positive, 0.0 otherwise.

source


# CompositionalNetworks.co_param_minus_valFunction.
julia
co_param_minus_val(x; param)

Return the difference param - x if positive, 0.0 otherwise.

source


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


',26),t=[r];function n(l,p,c,d,h,m){return s(),i("div",null,t)}const k=a(e,[["render",n]]);export{b as __pageData,k as default}; diff --git a/dev/assets/learning_comparison.md.hDJrmlrj.lean.js b/dev/assets/learning_comparison.md.BsnqPWC-.lean.js similarity index 70% rename from dev/assets/learning_comparison.md.hDJrmlrj.lean.js rename to dev/assets/learning_comparison.md.BsnqPWC-.lean.js index e0d00ac..22d78db 100644 --- a/dev/assets/learning_comparison.md.hDJrmlrj.lean.js +++ b/dev/assets/learning_comparison.md.BsnqPWC-.lean.js @@ -1 +1 @@ -import{_ as a,c as i,o as s,a7 as o}from"./chunks/framework.aA95Gx5L.js";const b=JSON.parse('{"title":"Comparison Layer","description":"","frontmatter":{},"headers":[],"relativePath":"learning/comparison.md","filePath":"learning/comparison.md","lastUpdated":null}'),e={name:"learning/comparison.md"},r=o("",28),t=[r];function n(l,p,d,c,h,m){return s(),i("div",null,t)}const k=a(e,[["render",n]]);export{b as __pageData,k as default}; +import{_ as a,c as i,o as s,a7 as o}from"./chunks/framework.aA95Gx5L.js";const b=JSON.parse('{"title":"Comparison Layer","description":"","frontmatter":{},"headers":[],"relativePath":"learning/comparison.md","filePath":"learning/comparison.md","lastUpdated":null}'),e={name:"learning/comparison.md"},r=o("",26),t=[r];function n(l,p,c,d,h,m){return s(),i("div",null,t)}const k=a(e,[["render",n]]);export{b as __pageData,k as default}; diff --git a/dev/assets/learning_comparison.md.hDJrmlrj.js b/dev/assets/learning_comparison.md.hDJrmlrj.js deleted file mode 100644 index 96f7191..0000000 --- a/dev/assets/learning_comparison.md.hDJrmlrj.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as i,o as s,a7 as o}from"./chunks/framework.aA95Gx5L.js";const b=JSON.parse('{"title":"Comparison Layer","description":"","frontmatter":{},"headers":[],"relativePath":"learning/comparison.md","filePath":"learning/comparison.md","lastUpdated":null}'),e={name:"learning/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


# CompositionalNetworks.co_euclidianFunction.
julia
co_euclidian(x; dom_size)

Compute an euclidian norm with domain size dom_size of a scalar.

source


# CompositionalNetworks.co_abs_diff_val_varsFunction.
julia
co_abs_diff_val_vars(x; nvars)

Return the absolute difference between x and the number of variables nvars.

source


# CompositionalNetworks.co_val_minus_varsFunction.
julia
co_val_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_valFunction.
julia
co_vars_minus_val(x; nvars)

Return the difference nvars - x if positive, 0.0 otherwise, where nvars denotes the numbers of variables.

source


Param: :val

# CompositionalNetworks.co_abs_diff_val_paramFunction.
julia
co_abs_diff_val_param(x; param)

Return the absolute difference between x and param.

source


# CompositionalNetworks.co_val_minus_paramFunction.
julia
co_val_minus_param(x; param)

Return the difference x - param if positive, 0.0 otherwise.

source


# CompositionalNetworks.co_param_minus_valFunction.
julia
co_param_minus_val(x; param)

Return the difference param - x if positive, 0.0 otherwise.

source


# CompositionalNetworks.co_euclidian_paramFunction.
julia
co_euclidian_param(x; param, dom_size)

Compute an euclidian norm with domain size dom_size, weigthed by param, of a scalar.

source


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


',28),t=[r];function n(l,p,d,c,h,m){return s(),i("div",null,t)}const k=a(e,[["render",n]]);export{b as __pageData,k as default}; diff --git a/dev/assets/learning_compositional_networks.md.QU5A8msL.js b/dev/assets/learning_compositional_networks.md.BZgNyUW3.js similarity index 84% rename from dev/assets/learning_compositional_networks.md.QU5A8msL.js rename to dev/assets/learning_compositional_networks.md.BZgNyUW3.js index 0811184..f1e447e 100644 --- a/dev/assets/learning_compositional_networks.md.QU5A8msL.js +++ b/dev/assets/learning_compositional_networks.md.BZgNyUW3.js @@ -1 +1 @@ -import{_ as i,c as s,o,a7 as a}from"./chunks/framework.aA95Gx5L.js";const m=JSON.parse('{"title":"CompositionalNetworks.jl","description":"","frontmatter":{},"headers":[],"relativePath":"learning/compositional_networks.md","filePath":"learning/compositional_networks.md","lastUpdated":null}'),t={name:"learning/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


# CompositionalNetworks.weigths_biasFunction.
julia
weigths_bias(x)

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

source


',25),n=[e];function r(l,p,d,c,h,k){return o(),s("div",null,n)}const u=i(t,[["render",r]]);export{m as __pageData,u as default}; +import{_ as i,c as s,o,a7 as a}from"./chunks/framework.aA95Gx5L.js";const u=JSON.parse('{"title":"CompositionalNetworks.jl","description":"","frontmatter":{},"headers":[],"relativePath":"learning/compositional_networks.md","filePath":"learning/compositional_networks.md","lastUpdated":null}'),t={name:"learning/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 b=i(t,[["render",l]]);export{u as __pageData,b as default}; diff --git a/dev/assets/learning_compositional_networks.md.QU5A8msL.lean.js b/dev/assets/learning_compositional_networks.md.BZgNyUW3.lean.js similarity index 54% rename from dev/assets/learning_compositional_networks.md.QU5A8msL.lean.js rename to dev/assets/learning_compositional_networks.md.BZgNyUW3.lean.js index b2a02cb..526d1fd 100644 --- a/dev/assets/learning_compositional_networks.md.QU5A8msL.lean.js +++ b/dev/assets/learning_compositional_networks.md.BZgNyUW3.lean.js @@ -1 +1 @@ -import{_ as i,c as s,o,a7 as a}from"./chunks/framework.aA95Gx5L.js";const m=JSON.parse('{"title":"CompositionalNetworks.jl","description":"","frontmatter":{},"headers":[],"relativePath":"learning/compositional_networks.md","filePath":"learning/compositional_networks.md","lastUpdated":null}'),t={name:"learning/compositional_networks.md"},e=a("",25),n=[e];function r(l,p,d,c,h,k){return o(),s("div",null,n)}const u=i(t,[["render",r]]);export{m as __pageData,u as default}; +import{_ as i,c as s,o,a7 as a}from"./chunks/framework.aA95Gx5L.js";const u=JSON.parse('{"title":"CompositionalNetworks.jl","description":"","frontmatter":{},"headers":[],"relativePath":"learning/compositional_networks.md","filePath":"learning/compositional_networks.md","lastUpdated":null}'),t={name:"learning/compositional_networks.md"},e=a("",24),n=[e];function l(r,p,d,c,h,k){return o(),s("div",null,n)}const b=i(t,[["render",l]]);export{u as __pageData,b as default}; diff --git a/dev/assets/learning_constraint_learning.md.B9EYEdfb.js b/dev/assets/learning_constraint_learning.md.DAfFojnp.js similarity index 56% rename from dev/assets/learning_constraint_learning.md.B9EYEdfb.js rename to dev/assets/learning_constraint_learning.md.DAfFojnp.js index 763bba8..ac50929 100644 --- a/dev/assets/learning_constraint_learning.md.B9EYEdfb.js +++ b/dev/assets/learning_constraint_learning.md.DAfFojnp.js @@ -1 +1 @@ -import{_ as i,c as s,o as a,a7 as e}from"./chunks/framework.aA95Gx5L.js";const u=JSON.parse('{"title":"ConstraintLearning.jl","description":"","frontmatter":{},"headers":[],"relativePath":"learning/constraint_learning.md","filePath":"learning/constraint_learning.md","lastUpdated":null}'),t={name:"learning/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 weigths 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 weigths 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 weigths (individuals) for the genetic algorithm weigthing 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 ouput 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 weigths of an ICN with a given set of configuration X and solutions X_sols. The best weigths 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 b=i(t,[["render",l]]);export{u as __pageData,b as default}; +import{_ as i,c as s,o as a,a7 as e}from"./chunks/framework.aA95Gx5L.js";const u=JSON.parse('{"title":"ConstraintLearning.jl","description":"","frontmatter":{},"headers":[],"relativePath":"learning/constraint_learning.md","filePath":"learning/constraint_learning.md","lastUpdated":null}'),t={name:"learning/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 b=i(t,[["render",l]]);export{u as __pageData,b as default}; diff --git a/dev/assets/learning_constraint_learning.md.B9EYEdfb.lean.js b/dev/assets/learning_constraint_learning.md.DAfFojnp.lean.js similarity index 100% rename from dev/assets/learning_constraint_learning.md.B9EYEdfb.lean.js rename to dev/assets/learning_constraint_learning.md.DAfFojnp.lean.js diff --git a/dev/assets/learning_layers.md.mhwb2QDA.js b/dev/assets/learning_layers.md.DuFC9ol_.js similarity index 74% rename from dev/assets/learning_layers.md.mhwb2QDA.js rename to dev/assets/learning_layers.md.DuFC9ol_.js index 20cfb2f..d49aa3b 100644 --- a/dev/assets/learning_layers.md.mhwb2QDA.js +++ b/dev/assets/learning_layers.md.DuFC9ol_.js @@ -1,4 +1,4 @@ -import{_ as e,c as i,o as s,a7 as a}from"./chunks/framework.aA95Gx5L.js";const g=JSON.parse('{"title":"A layer structure for any ICN","description":"","frontmatter":{},"headers":[],"relativePath":"learning/layers.md","filePath":"learning/layers.md","lastUpdated":null}'),t={name:"learning/layers.md"},r=a(`

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_weigths)

Return the number of operations selected by layer_weigths in layer.

source


# CompositionalNetworks.is_viableFunction.
julia
is_viable(layer, w)
+import{_ as e,c as i,o as s,a7 as a}from"./chunks/framework.aA95Gx5L.js";const g=JSON.parse('{"title":"A layer structure for any ICN","description":"","frontmatter":{},"headers":[],"relativePath":"learning/layers.md","filePath":"learning/layers.md","lastUpdated":null}'),t={name:"learning/layers.md"},r=a(`

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 weigths compose a viable pattern. If no weigths are given with an icn, it will check the current internal value.

source


# CompositionalNetworks.generate_inclusive_operationsFunction.
julia
generate_inclusive_operations(predicate, bits)

Generates the operations (weigths) of a layer with inclusive operations.

source


# CompositionalNetworks.generate_exclusive_operationFunction.
julia
generate_exclusive_operation(max_op_number)

Generates the operations (weigths) of a layer with exclusive operations.

source


# CompositionalNetworks.generate_weigthsFunction.
julia
generate_weigths(layers)
-generate_weigths(icn)

Generate the weigths of a collection of layers or of an ICN.

source


`,27),o=[r];function l(n,p,d,h,c,u){return s(),i("div",null,o)}const k=e(t,[["render",l]]);export{g as __pageData,k as default}; +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 (weigths) 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 s(),i("div",null,o)}const k=e(t,[["render",l]]);export{g as __pageData,k as default}; diff --git a/dev/assets/learning_layers.md.mhwb2QDA.lean.js b/dev/assets/learning_layers.md.DuFC9ol_.lean.js similarity index 70% rename from dev/assets/learning_layers.md.mhwb2QDA.lean.js rename to dev/assets/learning_layers.md.DuFC9ol_.lean.js index b8cdb61..e8a296a 100644 --- a/dev/assets/learning_layers.md.mhwb2QDA.lean.js +++ b/dev/assets/learning_layers.md.DuFC9ol_.lean.js @@ -1 +1 @@ -import{_ as e,c as i,o as s,a7 as a}from"./chunks/framework.aA95Gx5L.js";const g=JSON.parse('{"title":"A layer structure for any ICN","description":"","frontmatter":{},"headers":[],"relativePath":"learning/layers.md","filePath":"learning/layers.md","lastUpdated":null}'),t={name:"learning/layers.md"},r=a("",27),o=[r];function l(n,p,d,h,c,u){return s(),i("div",null,o)}const k=e(t,[["render",l]]);export{g as __pageData,k as default}; +import{_ as e,c as i,o as s,a7 as a}from"./chunks/framework.aA95Gx5L.js";const g=JSON.parse('{"title":"A layer structure for any ICN","description":"","frontmatter":{},"headers":[],"relativePath":"learning/layers.md","filePath":"learning/layers.md","lastUpdated":null}'),t={name:"learning/layers.md"},r=a("",26),o=[r];function l(n,p,d,c,h,u){return s(),i("div",null,o)}const k=e(t,[["render",l]]);export{g as __pageData,k as default}; diff --git a/dev/assets/learning_transformation.md.DlQiGOD9.js b/dev/assets/learning_transformation.md.BtKPMNbs.js similarity index 96% rename from dev/assets/learning_transformation.md.DlQiGOD9.js rename to dev/assets/learning_transformation.md.BtKPMNbs.js index c8f8bb8..456713f 100644 --- a/dev/assets/learning_transformation.md.DlQiGOD9.js +++ b/dev/assets/learning_transformation.md.BtKPMNbs.js @@ -1,38 +1,38 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.aA95Gx5L.js";const g=JSON.parse('{"title":"Transformations Layer","description":"","frontmatter":{},"headers":[],"relativePath":"learning/transformation.md","filePath":"learning/transformation.md","lastUpdated":null}'),e={name:"learning/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_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(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_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_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_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_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_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_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


# CompositionalNetworks.tr_contiguous_vals_minusFunction.
julia
tr_contiguous_vals_minus(i, 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_contiguous_vals_minusFunction.
julia
tr_contiguous_vals_minus(i, x)
 tr_contiguous_vals_minus(x)
-tr_contiguous_vals_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_vals_minus_revFunction.
julia
tr_contiguous_vals_minus_rev(i, x)
+tr_contiguous_vals_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_vals_minus_revFunction.
julia
tr_contiguous_vals_minus_rev(i, x)
 tr_contiguous_vals_minus_rev(x)
-tr_contiguous_vals_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


Param: :val

# CompositionalNetworks.tr_count_eq_paramFunction.
julia
tr_count_eq_param(i, x; param)
+tr_contiguous_vals_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


Param: :val

# CompositionalNetworks.tr_count_eq_paramFunction.
julia
tr_count_eq_param(i, x; param)
 tr_count_eq_param(x; param)
-tr_count_eq_param(x, X::AbstractVector; param)

Count the number of elements equal to x[i] + param. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_l_paramFunction.
julia
tr_count_l_param(i, x; param)
+tr_count_eq_param(x, X::AbstractVector; param)

Count the number of elements equal to x[i] + param. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_l_paramFunction.
julia
tr_count_l_param(i, x; param)
 tr_count_l_param(x; param)
-tr_count_l_param(x, X::AbstractVector; param)

Count the number of elements lesser than x[i] + param. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_g_paramFunction.
julia
tr_count_g_param(i, x; param)
+tr_count_l_param(x, X::AbstractVector; param)

Count the number of elements lesser than x[i] + param. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_g_paramFunction.
julia
tr_count_g_param(i, x; param)
 tr_count_g_param(x; param)
-tr_count_g_param(x, X::AbstractVector; param)

Count the number of elements greater than x[i] + param. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_bounding_paramFunction.
julia
tr_count_bounding_param(i, x; param)
+tr_count_g_param(x, X::AbstractVector; param)

Count the number of elements greater than x[i] + param. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_bounding_paramFunction.
julia
tr_count_bounding_param(i, x; param)
 tr_count_bounding_param(x; param)
-tr_count_bounding_param(x, X::AbstractVector; param)

Count the number of elements bounded (not strictly) by x[i] and x[i] + param. An extended method to vector with sig (x, param) is generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_val_minus_paramFunction.
julia
tr_val_minus_param(i, x; param)
+tr_count_bounding_param(x, X::AbstractVector; param)

Count the number of elements bounded (not strictly) by x[i] and x[i] + param. An extended method to vector with sig (x, param) is generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_val_minus_paramFunction.
julia
tr_val_minus_param(i, x; param)
 tr_val_minus_param(x; param)
-tr_val_minus_param(x, X::AbstractVector; param)

Return the difference x[i] - param if positive, 0.0 otherwise. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_param_minus_valFunction.
julia
tr_param_minus_val(i, x; param)
+tr_val_minus_param(x, X::AbstractVector; param)

Return the difference x[i] - param if positive, 0.0 otherwise. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_param_minus_valFunction.
julia
tr_param_minus_val(i, x; param)
 tr_param_minus_val(x; param)
-tr_param_minus_val(x, X::AbstractVector; param)

Return the difference param - x[i] if positive, 0.0 otherwise. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


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_param_minus_val(x, X::AbstractVector; param)

Return the difference param - x[i] if positive, 0.0 otherwise. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


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
@@ -42,4 +42,4 @@ import{_ as s,c as i,o as a,a7 as t}from"./chunks/framework.aA95Gx5L.js";const g
 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 = false)

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

source


`,46),r=[n];function o(l,p,h,d,c,k){return a(),i("div",null,r)}const m=s(e,[["render",o]]);export{g as __pageData,m as default}; +count_eq_param_result = val_transforms[:count_eq_param](data, param)

source


# CompositionalNetworks.transformation_layerFunction.
julia
transformation_layer(param = false)

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

source


`,46),r=[n];function o(l,p,h,d,c,k){return a(),i("div",null,r)}const m=s(e,[["render",o]]);export{g as __pageData,m as default}; diff --git a/dev/assets/learning_transformation.md.DlQiGOD9.lean.js b/dev/assets/learning_transformation.md.BtKPMNbs.lean.js similarity index 100% rename from dev/assets/learning_transformation.md.DlQiGOD9.lean.js rename to dev/assets/learning_transformation.md.BtKPMNbs.lean.js diff --git a/dev/assets/perf_perf_checker.md.DEoczPpG.js b/dev/assets/perf_perf_checker.md.CXuw3agL.js similarity index 96% rename from dev/assets/perf_perf_checker.md.DEoczPpG.js rename to dev/assets/perf_perf_checker.md.CXuw3agL.js index ad37dcf..2dc434e 100644 --- a/dev/assets/perf_perf_checker.md.DEoczPpG.js +++ b/dev/assets/perf_perf_checker.md.CXuw3agL.js @@ -1,4 +1,4 @@ -import{_ as e,c as r,o as s,a7 as i}from"./chunks/framework.aA95Gx5L.js";const b=JSON.parse('{"title":"PerfChecker.jl","description":"","frontmatter":{},"headers":[],"relativePath":"perf/perf_checker.md","filePath":"perf/perf_checker.md","lastUpdated":null}'),a={name:"perf/perf_checker.md"},t=i(`

PerfChecker.jl

Documentation 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")
+import{_ as e,c as r,o as s,a7 as i}from"./chunks/framework.aA95Gx5L.js";const b=JSON.parse('{"title":"PerfChecker.jl","description":"","frontmatter":{},"headers":[],"relativePath":"perf/perf_checker.md","filePath":"perf/perf_checker.md","lastUpdated":null}'),a={name:"perf/perf_checker.md"},t=i(`

PerfChecker.jl

Documentation 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"
diff --git a/dev/assets/perf_perf_checker.md.DEoczPpG.lean.js b/dev/assets/perf_perf_checker.md.CXuw3agL.lean.js
similarity index 100%
rename from dev/assets/perf_perf_checker.md.DEoczPpG.lean.js
rename to dev/assets/perf_perf_checker.md.CXuw3agL.lean.js
diff --git a/dev/assets/public_api.md.ByXB8t1V.js b/dev/assets/public_api.md.ByXB8t1V.js
new file mode 100644
index 0000000..bef9d26
--- /dev/null
+++ b/dev/assets/public_api.md.ByXB8t1V.js
@@ -0,0 +1,16 @@
+import{_ as i,c as s,o as a,a7 as t}from"./chunks/framework.aA95Gx5L.js";const b=JSON.parse('{"title":"Public API","description":"","frontmatter":{},"headers":[],"relativePath":"public_api.md","filePath":"public_api.md","lastUpdated":null}'),e={name:"public_api.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.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
Base.:*(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;
+    complete_search_limit = 10^6,
+    max_samplings = sum(domain_size, domains),
+    search = :flexible,
+    solutions_limit = floor(Int, sqrt(max_samplings)),
+)

Settings for the exploration of a search space composed by a collection of domains.

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


# 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, param = nothing; search_limit = 1000, solutions_limit = 100)

Search (a part of) a search space and returns a pair of vector of configurations: (solutions, non_solutions). If the search space size is over search_limit, then both solutions and non_solutions are limited to solutions_limit.

Beware that if the density of the solutions in the search space is low, solutions_limit needs to be reduced. This process will be automatic in the future (simple reinforcement learning).

Arguments:

  • domains: a collection of domains

  • concept: the concept of the targeted constraint

  • param: an optional parameter of the constraint

  • sol_number: the required number of solutions (half of the number of configurations), default to 100

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(;
+    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 = false)

Generate the layer of transformations functions of the ICN. Iff param value is true, also includes all the 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


`,143),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/public_api.md.DHfmf6CX.lean.js b/dev/assets/public_api.md.ByXB8t1V.lean.js similarity index 84% rename from dev/assets/public_api.md.DHfmf6CX.lean.js rename to dev/assets/public_api.md.ByXB8t1V.lean.js index 6487da0..b3693c3 100644 --- a/dev/assets/public_api.md.DHfmf6CX.lean.js +++ b/dev/assets/public_api.md.ByXB8t1V.lean.js @@ -1 +1 @@ -import{_ as i,c as s,o as a,a7 as t}from"./chunks/framework.aA95Gx5L.js";const b=JSON.parse('{"title":"Public API","description":"","frontmatter":{},"headers":[],"relativePath":"public_api.md","filePath":"public_api.md","lastUpdated":null}'),e={name:"public_api.md"},n=t("",141),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}; +import{_ as i,c as s,o as a,a7 as t}from"./chunks/framework.aA95Gx5L.js";const b=JSON.parse('{"title":"Public API","description":"","frontmatter":{},"headers":[],"relativePath":"public_api.md","filePath":"public_api.md","lastUpdated":null}'),e={name:"public_api.md"},n=t("",143),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/public_api.md.DHfmf6CX.js b/dev/assets/public_api.md.DHfmf6CX.js deleted file mode 100644 index 93ee94a..0000000 --- a/dev/assets/public_api.md.DHfmf6CX.js +++ /dev/null @@ -1,16 +0,0 @@ -import{_ as i,c as s,o as a,a7 as t}from"./chunks/framework.aA95Gx5L.js";const b=JSON.parse('{"title":"Public API","description":"","frontmatter":{},"headers":[],"relativePath":"public_api.md","filePath":"public_api.md","lastUpdated":null}'),e={name:"public_api.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.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.δ_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

Addtionally, 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;
-    complete_search_limit = 10^6,
-    max_samplings = sum(domain_size, domains),
-    search = :flexible,
-    solutions_limit = floor(Int, sqrt(max_samplings)),
-)

Settings for the exploration of a search space composed by a collection of domains.

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


# 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, param = nothing; search_limit = 1000, solutions_limit = 100)

Search (a part of) a search space and returns a pair of vector of configurations: (solutions, non_solutions). If the search space size is over search_limit, then both solutions and non_solutions are limited to solutions_limit.

Beware that if the density of the solutions in the search space is low, solutions_limit needs to be reduced. This process will be automatic in the future (simple reinforcement learning).

Arguments:

  • domains: a collection of domains

  • concept: the concept of the targeted constraint

  • param: an optional parameter of the constraint

  • sol_number: the required number of solutions (half of the number of configurations), default to 100

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 stucture 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 assignements. 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, weigths=nothing)

Return a function composed by some of the operations of a given ICN. Can be applied to any vector of variables. If weigths 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 paramater 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(;
-    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 weigth of an ICN.

source


# CompositionalNetworks.regularizationMethod.
julia
regularization(icn)

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

source


# CompositionalNetworks.show_layersMethod.
julia
show_layers(icn)

Return a formated 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 = false)

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

source


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

Set the weigths of an ICN with a BitVector.

source


# CompositionalNetworks.weigthsMethod.
julia
weigths(icn)

Access the current set of weigths of an ICN.

source


# CompositionalNetworks.weigths_biasMethod.
julia
weigths_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


`,141),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/solvers_local_search_solvers.md.Czt-kW-z.js b/dev/assets/solvers_local_search_solvers.md.BuFLqJZe.js similarity index 61% rename from dev/assets/solvers_local_search_solvers.md.Czt-kW-z.js rename to dev/assets/solvers_local_search_solvers.md.BuFLqJZe.js index b86e63c..a62c39d 100644 --- a/dev/assets/solvers_local_search_solvers.md.Czt-kW-z.js +++ b/dev/assets/solvers_local_search_solvers.md.BuFLqJZe.js @@ -1,11 +1,11 @@ -import{_ as s,c as i,o as a,a7 as e}from"./chunks/framework.aA95Gx5L.js";const u=JSON.parse('{"title":"LocalSearchSolvers.jl","description":"","frontmatter":{},"headers":[],"relativePath":"solvers/local_search_solvers.md","filePath":"solvers/local_search_solvers.md","lastUpdated":null}'),l={name:"solvers/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
+import{_ as s,c as i,o as a,a7 as e}from"./chunks/framework.aA95Gx5L.js";const u=JSON.parse('{"title":"LocalSearchSolvers.jl","description":"","frontmatter":{},"headers":[],"relativePath":"solvers/local_search_solvers.md","filePath":"solvers/local_search_solvers.md","lastUpdated":null}'),l={name:"solvers/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}
+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}}
+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}
@@ -20,17 +20,17 @@ import{_ as s,c as i,o as a,a7 as e}from"./chunks/framework.aA95Gx5L.js";const u
 
     # 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._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 contraints 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 contraints 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._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._threads!Method.
julia
_threads!(options, threads) = begin

DOCSTRING

source


# LocalSearchSolvers._threadsMethod.
julia
_threads(options) = begin

DOCSTRING

source


# LocalSearchSolvers._time_limit!Method.
julia
_time_limit!(options, time::Time) = begin

DOCSTRING

source


# LocalSearchSolvers._time_limitMethod.
julia
_time_limit(options) = begin

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}
+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._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._threads!Method.
julia
_threads!(options, threads) = begin

DOCSTRING

source


# LocalSearchSolvers._threadsMethod.
julia
_threads(options) = begin

DOCSTRING

source


# LocalSearchSolvers._time_limit!Method.
julia
_time_limit!(options, time::Time) = begin

DOCSTRING

source


# LocalSearchSolvers._time_limitMethod.
julia
_time_limit(options) = begin

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 cosntraints

  • 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 serie 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
+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


`,286),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}; +x2 = variable([-89,56,28], "x2", domain = :indices)

source


`,286),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_local_search_solvers.md.Czt-kW-z.lean.js b/dev/assets/solvers_local_search_solvers.md.BuFLqJZe.lean.js similarity index 100% rename from dev/assets/solvers_local_search_solvers.md.Czt-kW-z.lean.js rename to dev/assets/solvers_local_search_solvers.md.BuFLqJZe.lean.js diff --git a/dev/constraints/comparison_constraints.html b/dev/constraints/comparison_constraints.html index 59c3410..73789b7 100644 --- a/dev/constraints/comparison_constraints.html +++ b/dev/constraints/comparison_constraints.html @@ -8,11 +8,11 @@ - + - - + + @@ -23,7 +23,7 @@ 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_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=+)
 concept(:all_equal)(x; val=nothing, pair_vars=zeros(x), op=+)

Examples

julia
c = concept(:all_equal)
 
 c([0, 0, 0, 0])
@@ -31,7 +31,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_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)
 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)
@@ -41,8 +41,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/connection_constraints.html b/dev/constraints/connection_constraints.html index c055839..c082e74 100644 --- a/dev/constraints/connection_constraints.html +++ b/dev/constraints/connection_constraints.html @@ -8,11 +8,11 @@ - + - - + + @@ -21,17 +21,17 @@ 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_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)
 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_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)
 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_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)
 concept(:channel)(x; dim=1, id=nothing)

Examples

julia
c = concept(:channel)
 
 c([2, 1, 4, 3])
@@ -40,8 +40,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/constraint_commons.html b/dev/constraints/constraint_commons.html index b30a18c..7e699e9 100644 --- a/dev/constraints/constraint_commons.html +++ b/dev/constraints/constraint_commons.html @@ -8,11 +8,11 @@ - + - - + + @@ -26,8 +26,8 @@ :pair_vars, :val, :vals, -]

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 – TODO

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


Missing docstring.

Missing docstring for Automaton(a::MDD). 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


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

Internal method used by accept with Automaton.

source


Performances – TODO

Extensions

We extended some operations for Nothing and Symbol.

# Base.:*Function.
julia
Base.:*(s1::Symbol, s2::Symbol, connector::AbstractString="_")

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

source


# Base.inMethod.
julia
Base.in(::Any, ::Nothing)

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

source


# Base.isemptyMethod.
julia
Base.isempty(::Nothing)

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

source


Performances – TODO

Sampling

During our constraint learning processes, we use sampling to efficiently make partial exploration of search spaces. Follows some 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 – TODO

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 – TODO

Dictionaries

We provide the everuseful 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 – TODO

- +]

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 – TODO

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


Missing docstring.

Missing docstring for Automaton(a::MDD). 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


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

Internal method used by accept with Automaton.

source


Performances – TODO

Extensions

We extended some operations for Nothing and Symbol.

Missing docstring.

Missing docstring for Base.:*. Check Documenter's build log for details.

Missing docstring.

Missing docstring for Base.in(::Any, ::Nothing). Check Documenter's build log for details.

Missing docstring.

Missing docstring for Base.isempty(::Nothing). Check Documenter's build log for details.

Performances – TODO

Sampling

During our constraint learning processes, we use sampling to efficiently make partial exploration of search spaces. Follows some 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 – TODO

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 – TODO

Dictionaries

We provide the everuseful 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 – TODO

+ \ No newline at end of file diff --git a/dev/constraints/constraint_domains.html b/dev/constraints/constraint_domains.html index 477c532..2b1546d 100644 --- a/dev/constraints/constraint_domains.html +++ b/dev/constraints/constraint_domains.html @@ -8,52 +8,52 @@ - + - - + + -
Skip to content

ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints

ConstraintDomains.jl stands as a critical package within the Julia Constraints ecosystem, focusing on the definition and manipulation of variable domains that underpin the search spaces of constraint programming problems. This package provides the infrastructure necessary for specifying both discrete and continuous domains, thereby enabling a broad range of constraint programming applications.

Key Features and Functionalities

  • AbstractDomain Super Type: 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.

  • Domain Types: The package distinguishes between various domain types to cater to different needs:

    • ContinuousDomain: A supertype for domains representing continuous ranges of real numbers.

    • DiscreteDomain: Serves as a supertype for domains defined by discrete sets or ranges of numbers.

    • EmptyDomain: Handles yet-to-be-defined domains, facilitating dynamic problem formulation.

    • Intervals and RangeDomain: Represent continuous intervals and discrete ranges, respectively, providing flexible domain specification options.

  • Dynamic Domain Manipulation: ConstraintDomains.jl supports dynamic changes to domains, allowing for the addition (add!) and deletion (delete!) of elements, crucial for problems where domain definitions evolve based on the search process or external inputs.

  • Exploration Settings and Methods: The package offers ExploreSettings to configure the exploration of search spaces, including parameters for complete searches, maximum samplings, and solution limits. This feature is pivotal for tailoring the search process to the problem's characteristics and the computational resources available.

  • Support for Advanced Modeling: Beyond basic domain definition and manipulation, ConstraintDomains.jl integrates with learning and parameter exploration tools. For instance, FakeAutomaton facilitates the generation of pseudo-automata for parameter exploration, while the package also provides functions for generating random parameters (generate_parameters), accessing domain internals (get_domain), and merging or intersecting domains (merge_domains, intersect_domains).

Empowering Constraint Programming in Julia

ConstraintDomains.jl embodies the versatility and power of the JuliaConstraints ecosystem, offering users a comprehensive toolkit for defining and exploring variable domains. By abstracting complex domain manipulations and providing a rich set of functionalities, ConstraintDomains.jl enhances the ease and efficiency of modeling constraint programming problems. Whether for educational purposes, research, or practical applications, this package lays the groundwork for advanced problem-solving strategies in the realm of constraint programming.

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

Addtionally, 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)
+    
Skip to content

ConstraintDomains.jl: Defining and Exploring Variable Domains within JuliaConstraints

ConstraintDomains.jl stands as a critical package within the Julia Constraints ecosystem, focusing on the definition and manipulation of variable domains that underpin the search spaces of constraint programming problems. This package provides the infrastructure necessary for specifying both discrete and continuous domains, thereby enabling a broad range of constraint programming applications.

Key Features and Functionalities

  • AbstractDomain Super Type: 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.

  • Domain Types: The package distinguishes between various domain types to cater to different needs:

    • ContinuousDomain: A supertype for domains representing continuous ranges of real numbers.

    • DiscreteDomain: Serves as a supertype for domains defined by discrete sets or ranges of numbers.

    • EmptyDomain: Handles yet-to-be-defined domains, facilitating dynamic problem formulation.

    • Intervals and RangeDomain: Represent continuous intervals and discrete ranges, respectively, providing flexible domain specification options.

  • Dynamic Domain Manipulation: ConstraintDomains.jl supports dynamic changes to domains, allowing for the addition (add!) and deletion (delete!) of elements, crucial for problems where domain definitions evolve based on the search process or external inputs.

  • Exploration Settings and Methods: The package offers ExploreSettings to configure the exploration of search spaces, including parameters for complete searches, maximum samplings, and solution limits. This feature is pivotal for tailoring the search process to the problem's characteristics and the computational resources available.

  • Support for Advanced Modeling: Beyond basic domain definition and manipulation, ConstraintDomains.jl integrates with learning and parameter exploration tools. For instance, FakeAutomaton facilitates the generation of pseudo-automata for parameter exploration, while the package also provides functions for generating random parameters (generate_parameters), accessing domain internals (get_domain), and merging or intersecting domains (merge_domains, intersect_domains).

Empowering Constraint Programming in Julia

ConstraintDomains.jl embodies the versatility and power of the JuliaConstraints ecosystem, offering users a comprehensive toolkit for defining and exploring variable domains. By abstracting complex domain manipulations and providing a rich set of functionalities, ConstraintDomains.jl enhances the ease and efficiency of modeling constraint programming problems. Whether for educational purposes, research, or practical applications, this package lays the groundwork for advanced problem-solving strategies in the realm of constraint programming.

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
Base.in(::Any, ::Nothing)

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

source

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(::Nothing)

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

source

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

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)
+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

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
Base.in(::Any, ::Nothing)

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

source

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


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)
+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


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
Base.in(::Any, ::Nothing)

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

source

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


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(
+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


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)),
-)

Settings for the exploration of a search space composed by a collection of domains.

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, param = nothing; search_limit = 1000, solutions_limit = 100)

Search (a part of) a search space and returns a pair of vector of configurations: (solutions, non_solutions). If the search space size is over search_limit, then both solutions and non_solutions are limited to solutions_limit.

Beware that if the density of the solutions in the search space is low, solutions_limit needs to be reduced. This process will be automatic in the future (simple reinforcement learning).

Arguments:

  • domains: a collection of domains

  • concept: the concept of the targeted constraint

  • param: an optional parameter of the constraint

  • sol_number: the required number of solutions (half of the number of configurations), default to 100

source


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


- +)

Settings for the exploration of a search space composed by a collection of domains.

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, param = nothing; search_limit = 1000, solutions_limit = 100)

Search (a part of) a search space and returns a pair of vector of configurations: (solutions, non_solutions). If the search space size is over search_limit, then both solutions and non_solutions are limited to solutions_limit.

Beware that if the density of the solutions in the search space is low, solutions_limit needs to be reduced. This process will be automatic in the future (simple reinforcement learning).

Arguments:

  • domains: a collection of domains

  • concept: the concept of the targeted constraint

  • param: an optional parameter of the constraint

  • sol_number: the required number of solutions (half of the number of configurations), default to 100

source


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


+ \ No newline at end of file diff --git a/dev/constraints/constraint_models.html b/dev/constraints/constraint_models.html index a843f72..d241c6d 100644 --- a/dev/constraints/constraint_models.html +++ b/dev/constraints/constraint_models.html @@ -8,10 +8,10 @@ - + - + @@ -47,7 +47,7 @@ # Retrieve and display the values solution = value.(grid) display(solution, Val(:sudoku))

source


- + \ No newline at end of file diff --git a/dev/constraints/constraints.html b/dev/constraints/constraints.html index 45893b3..73bbc7a 100644 --- a/dev/constraints/constraints.html +++ b/dev/constraints/constraints.html @@ -8,19 +8,19 @@ - + - - + + -
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

Constraints.jl is a pivotal package within the JuliaConstraints ecosystem, designed to facilitate the definition, manipulation, and application of constraints in constraint programming (CP). This package is central to handling both standard and complex constraints, making it an indispensable tool for developers and researchers working in CP.

Key Features and Functionalities

  • Integration of XCSP3-core Constraints: One of the standout features of Constraints.jl is its incorporation of the XCSP3-core constraints as usual constraints within Julia. This integration ensures that users can define and work with a wide range of standard constraints, following the specifications outlined in the XCSP3-core, directly in Julia. The use of USUAL_CONSTRAINTS dictionary allows for straightforward addition and manipulation of these constraints, enhancing the package's utility and flexibility.

  • Learning Package Integration: Constraints.jl goes beyond traditional constraint handling by offering the capability to include results from various learning packages within the JuliaConstraints organization. This feature allows for the enhancement of usual constraints and those from the Global Constraints Catalog with learned parameters and behaviors, significantly improving constraint applicability and performance in complex CP problems.

  • Constraint Definition and Symmetry Handling: The package provides a simple yet powerful syntax for defining new constraints (@usual) and managing their symmetries through the USUAL_SYMMETRIES dictionary. This approach simplifies the creation of new constraints and the optimization of constraint search spaces by avoiding redundant explorations.

  • Advanced Constraint Functionalities: At the core of Constraints.jl is the Constraint type, encapsulating the essential elements of a constraint, including its concept (a Boolean function determining satisfaction) and an error function (providing a preference measure over invalid assignments). These components are crucial for defining how constraints behave and are evaluated within a CP model.

  • Flexible Constraint Application: The package supports a range of methods for interacting with constraints, such as args, concept, error_f, params_length, symmetries, and xcsp_intension. These methods offer users the ability to examine constraint properties, apply constraints to variable assignments, and work with intensional constraints defined by predicates. Such flexibility is vital for tailoring constraint behavior to specific problems and contexts.

Enabling Advanced Modeling in Constraint Programming

Constraints.jl embodies the JuliaConstraints ecosystem's commitment to providing robust, flexible tools for constraint programming. By integrating standard constraints, facilitating the incorporation of learned behaviors, and offering comprehensive tools for constraint definition and application, Constraints.jl significantly enhances the modeling capabilities available to CP practitioners. Whether for educational purposes, research, or solving practical CP problems, Constraints.jl offers a sophisticated, user-friendly platform for working with constraints in Julia.

Basic tools

# 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 stucture 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 assignements. Return 0.0 if the constraint is satisfied, and a strictly positive real otherwise.

source


# 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


# 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


# Constraints.argsFunction.
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.params_lengthFunction.
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.symmetriesFunction.
julia
symmetries(c::Constraint)

Return the list of symmetries of c.

source


# Constraints.make_errorFunction.
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)
+    
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

Constraints.jl is a pivotal package within the JuliaConstraints ecosystem, designed to facilitate the definition, manipulation, and application of constraints in constraint programming (CP). This package is central to handling both standard and complex constraints, making it an indispensable tool for developers and researchers working in CP.

Key Features and Functionalities

  • Integration of XCSP3-core Constraints: One of the standout features of Constraints.jl is its incorporation of the XCSP3-core constraints as usual constraints within Julia. This integration ensures that users can define and work with a wide range of standard constraints, following the specifications outlined in the XCSP3-core, directly in Julia. The use of USUAL_CONSTRAINTS dictionary allows for straightforward addition and manipulation of these constraints, enhancing the package's utility and flexibility.

  • Learning Package Integration: Constraints.jl goes beyond traditional constraint handling by offering the capability to include results from various learning packages within the JuliaConstraints organization. This feature allows for the enhancement of usual constraints and those from the Global Constraints Catalog with learned parameters and behaviors, significantly improving constraint applicability and performance in complex CP problems.

  • Constraint Definition and Symmetry Handling: The package provides a simple yet powerful syntax for defining new constraints (@usual) and managing their symmetries through the USUAL_SYMMETRIES dictionary. This approach simplifies the creation of new constraints and the optimization of constraint search spaces by avoiding redundant explorations.

  • Advanced Constraint Functionalities: At the core of Constraints.jl is the Constraint type, encapsulating the essential elements of a constraint, including its concept (a Boolean function determining satisfaction) and an error function (providing a preference measure over invalid assignments). These components are crucial for defining how constraints behave and are evaluated within a CP model.

  • Flexible Constraint Application: The package supports a range of methods for interacting with constraints, such as args, concept, error_f, params_length, symmetries, and xcsp_intension. These methods offer users the ability to examine constraint properties, apply constraints to variable assignments, and work with intensional constraints defined by predicates. Such flexibility is vital for tailoring constraint behavior to specific problems and contexts.

Enabling Advanced Modeling in Constraint Programming

Constraints.jl embodies the JuliaConstraints ecosystem's commitment to providing robust, flexible tools for constraint programming. By integrating standard constraints, facilitating the incorporation of learned behaviors, and offering comprehensive tools for constraint definition and application, Constraints.jl significantly enhances the modeling capabilities available to CP practitioners. Whether for educational purposes, research, or solving practical CP problems, Constraints.jl offers a sophisticated, user-friendly platform for working with constraints in Julia.

Basic tools

# 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


# 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


# 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


# Constraints.argsFunction.
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.params_lengthFunction.
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.symmetriesFunction.
julia
symmetries(c::Constraint)

Return the list of symmetries of c.

source


# Constraints.make_errorFunction.
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.shrink_conceptFunction.
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.concept_vs_errorFunction.
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


Usual constraints (based on and including XCSP3-core categories)

# 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


# 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


# 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


# 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


# 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


- +e([1, 1, 3]) # Returns 1.0

source


# Constraints.shrink_conceptFunction.
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.concept_vs_errorFunction.
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


Usual constraints (based on and including XCSP3-core categories)

# 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


# 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


# 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


# 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


# 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


+ \ No newline at end of file diff --git a/dev/constraints/counting_summing_constraints.html b/dev/constraints/counting_summing_constraints.html index 4d01585..08a7160 100644 --- a/dev/constraints/counting_summing_constraints.html +++ b/dev/constraints/counting_summing_constraints.html @@ -8,11 +8,11 @@ - + - - + + @@ -23,7 +23,7 @@ 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_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)
 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)
@@ -31,13 +31,13 @@
 
 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_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)
 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)
+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)
 concept(:cardinality_open)(x; vals)

Examples

julia
c = concept(:cardinality)
@@ -55,8 +55,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/elementary_constraints.html b/dev/constraints/elementary_constraints.html index 528e9fc..136cd67 100644 --- a/dev/constraints/elementary_constraints.html +++ b/dev/constraints/elementary_constraints.html @@ -8,11 +8,11 @@ - + - - + + @@ -21,8 +21,8 @@ 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/generic_constraints.html b/dev/constraints/generic_constraints.html index 1d4a116..450dbbd 100644 --- a/dev/constraints/generic_constraints.html +++ b/dev/constraints/generic_constraints.html @@ -8,11 +8,11 @@ - + - - + + @@ -28,7 +28,7 @@ @usual concept_dist_different(x) = xcsp_intension( 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 intension 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 Intension interface.

julia
concept(:dist_different, x)
+)

Please check the section dedicated to the Golomb Ruler problem to see a use for this constraint. <!– TODO: Golomb Ruler –>

APIs

Note that the intension 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 Intension interface.

julia
concept(:dist_different, x)
 concept(:dist_different)(x)
julia
# Defines the DistDifferent constraint
 c = x -> xcsp_intension(
     list = x,
@@ -43,7 +43,7 @@
 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


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.

XCSP in Constraints.jl {#XCSP-in-Constraints.jl}

# Constraints.xcsp_extensionFunction.
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)
+c([1, 2, 3, 3]) && !c([1, 2, 3, 4])

source


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.

XCSP in Constraints.jl {#XCSP-in-Constraints.jl}

# Constraints.xcsp_extensionFunction.
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)
 concept(:conflicts)(x; pair_vars)

Examples

julia
c = concept(:extension)
@@ -55,8 +55,8 @@
 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


- +c([1, 2, 3, 4, 5]; pair_vars=[[1, 2, 1, 4, 5], [1, 2, 3, 5, 5]])

source


+ \ No newline at end of file diff --git a/dev/constraints/graph_constraints.html b/dev/constraints/graph_constraints.html index f8ecf87..2fca37d 100644 --- a/dev/constraints/graph_constraints.html +++ b/dev/constraints/graph_constraints.html @@ -8,11 +8,11 @@ - + - - + + @@ -23,8 +23,8 @@ 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/intro.html b/dev/constraints/intro.html index df34329..e6e010f 100644 --- a/dev/constraints/intro.html +++ b/dev/constraints/intro.html @@ -8,17 +8,17 @@ - + - +
Skip to content

Introduction to basics cosntraints related tools

About constraints.

- + \ No newline at end of file diff --git a/dev/constraints/language_constraints.html b/dev/constraints/language_constraints.html index c5960f7..122db15 100644 --- a/dev/constraints/language_constraints.html +++ b/dev/constraints/language_constraints.html @@ -8,11 +8,11 @@ - + - - + + @@ -37,7 +37,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_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)
 concept(:mdd)(x; language)

Examples

julia
c = concept(:mdd)
 
 states = [
@@ -64,8 +64,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/packing_scheduling_constraints.html b/dev/constraints/packing_scheduling_constraints.html index a77d80c..020e3d7 100644 --- a/dev/constraints/packing_scheduling_constraints.html +++ b/dev/constraints/packing_scheduling_constraints.html @@ -8,11 +8,11 @@ - + - - + + @@ -23,7 +23,7 @@ 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)
+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)
 concept(:no_overlap_with_zero)(x; pair_vars)

Examples

julia
c = concept(:no_overlap)
@@ -34,8 +34,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/cp/advanced.html b/dev/cp/advanced.html index 991a8a0..864b812 100644 --- a/dev/cp/advanced.html +++ b/dev/cp/advanced.html @@ -8,17 +8,17 @@ - + - +
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/applications.html b/dev/cp/applications.html index e92bf40..b4e0ff4 100644 --- a/dev/cp/applications.html +++ b/dev/cp/applications.html @@ -8,17 +8,17 @@ - + - +
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/contribution.html b/dev/cp/contribution.html index 20ccf71..79c3203 100644 --- a/dev/cp/contribution.html +++ b/dev/cp/contribution.html @@ -8,17 +8,17 @@ - + - +
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/cp/cp101.html b/dev/cp/cp101.html index 24bcb17..e57c10d 100644 --- a/dev/cp/cp101.html +++ b/dev/cp/cp101.html @@ -8,17 +8,17 @@ - + - +
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/ecosystem.html b/dev/cp/ecosystem.html index 8d1c076..58c4c47 100644 --- a/dev/cp/ecosystem.html +++ b/dev/cp/ecosystem.html @@ -8,17 +8,17 @@ - + - +
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/getting_started.html b/dev/cp/getting_started.html index b83fb29..60ed97b 100644 --- a/dev/cp/getting_started.html +++ b/dev/cp/getting_started.html @@ -8,25 +8,25 @@ - + - - + + -
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/intro.html b/dev/cp/intro.html index f114f53..c64fa2c 100644 --- a/dev/cp/intro.html +++ b/dev/cp/intro.html @@ -8,17 +8,17 @@ - + - +
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/models.html b/dev/cp/models.html index e183eae..3cc4a11 100644 --- a/dev/cp/models.html +++ b/dev/cp/models.html @@ -8,17 +8,17 @@ - + - +
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/opt.html b/dev/cp/opt.html index 68a10c1..c8d2ac2 100644 --- a/dev/cp/opt.html +++ b/dev/cp/opt.html @@ -8,17 +8,17 @@ - + - +
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/tuto_xp.html b/dev/cp/tuto_xp.html index b908b60..ad6a820 100644 --- a/dev/cp/tuto_xp.html +++ b/dev/cp/tuto_xp.html @@ -8,17 +8,17 @@ - + - +
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/full_api.html b/dev/full_api.html index 30a20f6..ceeec3a 100644 --- a/dev/full_api.html +++ b/dev/full_api.html @@ -8,11 +8,11 @@ - + - - + + @@ -26,29 +26,29 @@ :pair_vars, :val, :vals, -]

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


# Base.:*Function.
julia
Base.:*(s1::Symbol, s2::Symbol, connector::AbstractString="_")

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

source


# Base.inMethod.
julia
Base.in(::Any, ::Nothing)

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

source


# Base.isemptyMethod.
julia
Base.isempty(::Nothing)

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

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.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.δ_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

Addtionally, 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(
+]

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.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
Base.:*(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;
     complete_search_limit = 10^6,
     max_samplings = sum(domain_size, domains),
     search = :flexible,
     solutions_limit = floor(Int, sqrt(max_samplings)),
-)

Settings for the exploration of a search space composed by a collection of domains.

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)
+)

Settings for the exploration of a search space composed by a collection of domains.

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)
 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, param = nothing; search_limit = 1000, solutions_limit = 100)

Search (a part of) a search space and returns a pair of vector of configurations: (solutions, non_solutions). If the search space size is over search_limit, then both solutions and non_solutions are limited to solutions_limit.

Beware that if the density of the solutions in the search space is low, solutions_limit needs to be reduced. This process will be automatic in the future (simple reinforcement learning).

Arguments:

  • domains: a collection of domains

  • concept: the concept of the targeted constraint

  • param: an optional parameter of the constraint

  • sol_number: the required number of solutions (half of the number of configurations), default to 100

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 stucture 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 assignements. 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.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, param = nothing; search_limit = 1000, solutions_limit = 100)

Search (a part of) a search space and returns a pair of vector of configurations: (solutions, non_solutions). If the search space size is over search_limit, then both solutions and non_solutions are limited to solutions_limit.

Beware that if the density of the solutions in the search space is low, solutions_limit needs to be reduced. This process will be automatic in the future (simple reinforcement learning).

Arguments:

  • domains: a collection of domains

  • concept: the concept of the targeted constraint

  • param: an optional parameter of the constraint

  • sol_number: the required number of solutions (half of the number of configurations), default to 100

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)
 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_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)
 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_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=+)
 concept(:all_equal)(x; val=nothing, pair_vars=zeros(x), op=+)

Examples

julia
c = concept(:all_equal)
 
 c([0, 0, 0, 0])
@@ -56,7 +56,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_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)
+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)
 concept(:cardinality_open)(x; vals)

Examples

julia
c = concept(:cardinality)
@@ -74,7 +74,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_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)
 concept(:channel)(x; dim=1, id=nothing)

Examples

julia
c = concept(:channel)
 
 c([2, 1, 4, 3])
@@ -83,13 +83,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_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)
 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_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)
 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)
@@ -97,19 +97,19 @@
 
 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_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)
 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_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)
 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)
+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)
 concept(:conflicts)(x; pair_vars)

Examples

julia
c = concept(:extension)
@@ -121,20 +121,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_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)
 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_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)
 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_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)
 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_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)
 concept(:mdd)(x; language)

Examples

julia
c = concept(:mdd)
 
 states = [
@@ -161,11 +161,11 @@
 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_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)
 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)
+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)
 concept(:no_overlap_with_zero)(x; pair_vars)

Examples

julia
c = concept(:no_overlap)
@@ -176,13 +176,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_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)
 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_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)
 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)
@@ -192,7 +192,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)
+!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)
 concept(:regular)(x; language)

Examples

julia
c = concept(:regular)
@@ -212,19 +212,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_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)
 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_val_paramMethod.
julia
co_abs_diff_val_param(x; param)

Return the absolute difference between x and param.

source


# CompositionalNetworks.co_abs_diff_val_varsMethod.
julia
co_abs_diff_val_vars(x; nvars)

Return the absolute difference between x and the number of variables nvars.

source


# CompositionalNetworks.co_euclidianMethod.
julia
co_euclidian(x; dom_size)

Compute an euclidian norm with domain size dom_size of a scalar.

source


# CompositionalNetworks.co_euclidian_paramMethod.
julia
co_euclidian_param(x; param, dom_size)

Compute an euclidian norm with domain size dom_size, weigthed by param, 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_param_minus_valMethod.
julia
co_param_minus_val(x; param)

Return the difference param - x if positive, 0.0 otherwise.

source


# CompositionalNetworks.co_val_minus_paramMethod.
julia
co_val_minus_param(x; param)

Return the difference x - param if positive, 0.0 otherwise.

source


# CompositionalNetworks.co_val_minus_varsMethod.
julia
co_val_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_valMethod.
julia
co_vars_minus_val(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, weigths=nothing)

Return a function composed by some of the operations of a given ICN. Can be applied to any vector of variables. If weigths 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 paramater 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 (weigths) of a layer with exclusive operations.

source


# CompositionalNetworks.generate_inclusive_operationsMethod.
julia
generate_inclusive_operations(predicate, bits)

Generates the operations (weigths) of a layer with inclusive operations.

source


# CompositionalNetworks.generate_weigthsMethod.
julia
generate_weigths(layers)
-generate_weigths(icn)

Generate the weigths 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.@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_val_paramMethod.
julia
co_abs_diff_val_param(x; param)

Return the absolute difference between x and param.

source


# CompositionalNetworks.co_abs_diff_val_varsMethod.
julia
co_abs_diff_val_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_paramMethod.
julia
co_euclidean_param(x; param, dom_size)

Compute an euclidean norm with domain size dom_size, weighted by param, 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_param_minus_valMethod.
julia
co_param_minus_val(x; param)

Return the difference param - x if positive, 0.0 otherwise.

source


# CompositionalNetworks.co_val_minus_paramMethod.
julia
co_val_minus_param(x; param)

Return the difference x - param if positive, 0.0 otherwise.

source


# CompositionalNetworks.co_val_minus_varsMethod.
julia
co_val_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_valMethod.
julia
co_vars_minus_val(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 (weigths) 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)
 is_viable(icn)
-is_viable(icn, w)

Assert if a pair of layer/icn and weigths compose a viable pattern. If no weigths 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.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(;
     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_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
 basic_transforms = make_transformations(:none)
 
 # Apply an identity transformation
@@ -234,44 +235,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 weigth 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 weigths, which is proportional to the normalized number of operations selected in the icn layers.

source


# CompositionalNetworks.selected_sizeMethod.
julia
selected_size(layer, layer_weigths)

Return the number of operations selected by layer_weigths 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 formated 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_vals_minusMethod.
julia
tr_contiguous_vals_minus(i, x)
+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_vals_minusMethod.
julia
tr_contiguous_vals_minus(i, x)
 tr_contiguous_vals_minus(x)
-tr_contiguous_vals_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_vals_minus_revMethod.
julia
tr_contiguous_vals_minus_rev(i, x)
+tr_contiguous_vals_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_vals_minus_revMethod.
julia
tr_contiguous_vals_minus_rev(i, x)
 tr_contiguous_vals_minus_rev(x)
-tr_contiguous_vals_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_paramMethod.
julia
tr_count_bounding_param(i, x; param)
+tr_contiguous_vals_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_paramMethod.
julia
tr_count_bounding_param(i, x; param)
 tr_count_bounding_param(x; param)
-tr_count_bounding_param(x, X::AbstractVector; param)

Count the number of elements bounded (not strictly) by x[i] and x[i] + param. An extended method to vector with sig (x, param) 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_param(x, X::AbstractVector; param)

Count the number of elements bounded (not strictly) by x[i] and x[i] + param. An extended method to vector with sig (x, param) 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_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_leftMethod.
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_paramMethod.
julia
tr_count_eq_param(i, x; param)
+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_paramMethod.
julia
tr_count_eq_param(i, x; param)
 tr_count_eq_param(x; param)
-tr_count_eq_param(x, X::AbstractVector; param)

Count the number of elements equal to x[i] + param. Extended method to vector with sig (x, param) 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_param(x, X::AbstractVector; param)

Count the number of elements equal to x[i] + param. Extended method to vector with sig (x, param) 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_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_g_leftMethod.
julia
tr_count_g_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_g_leftMethod.
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_paramMethod.
julia
tr_count_g_param(i, x; param)
+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_paramMethod.
julia
tr_count_g_param(i, x; param)
 tr_count_g_param(x; param)
-tr_count_g_param(x, X::AbstractVector; param)

Count the number of elements greater than x[i] + param. Extended method to vector with sig (x, param) 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_param(x, X::AbstractVector; param)

Count the number of elements greater than x[i] + param. Extended method to vector with sig (x, param) 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_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_greaterMethod.
julia
tr_count_greater(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_greaterMethod.
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_leftMethod.
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_paramMethod.
julia
tr_count_l_param(i, x; param)
+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_paramMethod.
julia
tr_count_l_param(i, x; param)
 tr_count_l_param(x; param)
-tr_count_l_param(x, X::AbstractVector; param)

Count the number of elements lesser than x[i] + param. Extended method to vector with sig (x, param) 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_param(x, X::AbstractVector; param)

Count the number of elements lesser than x[i] + param. Extended method to vector with sig (x, param) 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_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_lesserMethod.
julia
tr_count_lesser(i, 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_lesserMethod.
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_identityMethod.
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_param_minus_valMethod.
julia
tr_param_minus_val(i, x; param)
+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_param_minus_valMethod.
julia
tr_param_minus_val(i, x; param)
 tr_param_minus_val(x; param)
-tr_param_minus_val(x, X::AbstractVector; param)

Return the difference param - x[i] if positive, 0.0 otherwise. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_val_minus_paramMethod.
julia
tr_val_minus_param(i, x; param)
+tr_param_minus_val(x, X::AbstractVector; param)

Return the difference param - x[i] if positive, 0.0 otherwise. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_val_minus_paramMethod.
julia
tr_val_minus_param(i, x; param)
 tr_val_minus_param(x; param)
-tr_val_minus_param(x, X::AbstractVector; param)

Return the difference x[i] - param if positive, 0.0 otherwise. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.transformation_layerFunction.
julia
transformation_layer(param = false)

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

source


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

Set the weigths of an ICN with a BitVector.

source


# CompositionalNetworks.weigthsMethod.
julia
weigths(icn)

Access the current set of weigths of an ICN.

source


# CompositionalNetworks.weigths_biasMethod.
julia
weigths_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_val_minus_param(x, X::AbstractVector; param)

Return the difference x[i] - param if positive, 0.0 otherwise. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.transformation_layerFunction.
julia
transformation_layer(param = false)

Generate the layer of transformations functions of the ICN. Iff param value is true, also includes all the 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


+ \ No newline at end of file diff --git a/dev/hashmap.json b/dev/hashmap.json index 067f460..90c26f7 100644 --- a/dev/hashmap.json +++ b/dev/hashmap.json @@ -1 +1 @@ -{"cp_intro.md":"qCFhsnKE","cp_opt.md":"oWksNiMs","constraints_elementary_constraints.md":"b9VNGoNL","constraints_constraints.md":"bgO76M7m","constraints_constraint_models.md":"DjPMcFlD","cp_cp101.md":"CrtqNaW3","cp_models.md":"DjhzTYet","cp_contribution.md":"CvjPxUVA","cp_ecosystem.md":"BROmdRLS","cp_getting_started.md":"BuWkGTqp","index-old.md":"BzPVACYs","cp_advanced.md":"Dsfkdtcs","constraints_connection_constraints.md":"BVUChQGg","learning_qubo_learning.md":"CLlNBMzd","solvers_cbls.md":"BxYapv-Y","constraints_comparison_constraints.md":"C8bTAbHg","learning_qubo_constraints.md":"DpCFckdQ","public_api.md":"DHfmf6CX","cp_applications.md":"-HdwrgYe","learning_intro.md":"497AVcuz","constraints_constraint_commons.md":"CgCZE1cQ","constraints_language_constraints.md":"tj54bmg8","learning_layers.md":"mhwb2QDA","learning_qubo_encoding.md":"CDyoKOWI","learning_transformation.md":"DlQiGOD9","learning_aggregation.md":"CLetyme2","learning_arithmetic.md":"BCOx2iYR","learning_compositional_networks.md":"QU5A8msL","learning_comparison.md":"hDJrmlrj","constraints_graph_constraints.md":"M2y2wALd","learning_constraint_learning.md":"B9EYEdfb","constraints_constraint_domains.md":"CJq87aJj","perf_perf_checker.md":"DEoczPpG","perf_perf_interface.md":"DaCOMv6z","perf_benchmark_ext.md":"CVYCQYDt","meta_meta_strategist.md":"CuHkGJNL","cp_tuto_xp.md":"CLy9H2hK","constraints_counting_summing_constraints.md":"BT-OmEMD","solvers_intro.md":"BOddHRCt","constraints_generic_constraints.md":"COcQcDzW","constraints_intro.md":"SiDBJ4N_","constraints_packing_scheduling_constraints.md":"CiCQvkg6","index.md":"BcgCFTkL","solvers_local_search_solvers.md":"Czt-kW-z","full_api.md":"BY5e_0Y2"} +{"constraints_comparison_constraints.md":"2Ukc8viw","constraints_connection_constraints.md":"0kSxmxNT","solvers_intro.md":"BOddHRCt","constraints_constraint_models.md":"DjPMcFlD","perf_perf_interface.md":"DaCOMv6z","index-old.md":"BzPVACYs","index.md":"BcgCFTkL","learning_aggregation.md":"5RLMQ4Bd","learning_arithmetic.md":"DW5u7RMW","learning_comparison.md":"BsnqPWC-","learning_compositional_networks.md":"BZgNyUW3","constraints_intro.md":"SiDBJ4N_","learning_intro.md":"497AVcuz","learning_constraint_learning.md":"DAfFojnp","constraints_language_constraints.md":"CE20vPnP","cp_opt.md":"oWksNiMs","solvers_cbls.md":"BxYapv-Y","cp_tuto_xp.md":"CLy9H2hK","cp_models.md":"DjhzTYet","learning_qubo_constraints.md":"DpCFckdQ","cp_contribution.md":"CvjPxUVA","learning_qubo_encoding.md":"CDyoKOWI","learning_qubo_learning.md":"CLlNBMzd","constraints_constraint_domains.md":"Cd0YH57K","constraints_constraints.md":"ijIsQmJK","constraints_packing_scheduling_constraints.md":"CSsKQ9F3","constraints_counting_summing_constraints.md":"BIdrSepq","meta_meta_strategist.md":"CuHkGJNL","constraints_graph_constraints.md":"CTf_lkG3","cp_advanced.md":"Dsfkdtcs","perf_perf_checker.md":"CXuw3agL","cp_ecosystem.md":"BROmdRLS","constraints_generic_constraints.md":"Yd2fivbQ","learning_layers.md":"DuFC9ol_","constraints_elementary_constraints.md":"BbiPuUtE","constraints_constraint_commons.md":"PTLdrUW2","public_api.md":"ByXB8t1V","cp_intro.md":"qCFhsnKE","perf_benchmark_ext.md":"CVYCQYDt","cp_getting_started.md":"BYxKzX2X","cp_applications.md":"-HdwrgYe","cp_cp101.md":"CrtqNaW3","solvers_local_search_solvers.md":"BuFLqJZe","learning_transformation.md":"BtKPMNbs","full_api.md":"BiWge5EP"} diff --git a/dev/index-old.html b/dev/index-old.html index a772b2c..37360fa 100644 --- a/dev/index-old.html +++ b/dev/index-old.html @@ -8,17 +8,17 @@ - + - +
Skip to content

JuliaConstraints

JuliaConstraints is a collection of packages that help you solve constraint programming problems in Julia. Constraint programming involves modeling problems with constraints, such as "x > 5" or "x + y = 10", and finding solutions that satisfy all of the constraints. It is a part of the JuMP ecosystem that focuses on constraint programming in Julia.

The goal of packages in JuliaConstraints are two-fold: some of them provide a generic interface, others are solvers for CP models (either purely in Julia or wrapping). They make it easy to solve constraint-satisfaction problems (CSPs) and constraint-optimisation problems (COPs) in Julia using industry-standard solvers and mixed-integer solvers.

Other packages for CP in Julia include:

Operational Research vs Constraint Programming

Operational research (OR) is a problem-solving approach that uses mathematical models, statistical analysis, and optimization techniques to help organizations make better decisions. OR is concerned with understanding and optimizing complex systems, such as supply chains, transportation networks, and manufacturing processes, to improve efficiency and reduce costs.

On the other hand, constraint programming (CP) is a programming paradigm that focuses on solving problems with constraints. Constraints are conditions that must be satisfied for a solution to be valid. CP is often used to solve combinatorial problems, such as scheduling, routing, and allocation, where the search space of possible solutions is very large.

So, while both OR and CP are concerned with solving complex problems, they approach the problem-solving process from different angles. OR typically uses mathematical models and optimization techniques to analyze and optimize existing systems, while CP focuses on finding valid solutions that satisfy a set of constraints.

Constraint-based local search (CBLS) is a type of constraint programming solver that uses a heuristic search algorithm to find solutions to problems. It starts with an initial solution and tries to improve it by making small changes that satisfy the constraints. CBLS is especially useful for large and complex problems where finding an exact solution may take too much time or be impossible.

In contrast, other constraint programming solvers use a variety of algorithms and techniques to find exact solutions to problems. These solvers try to find a solution that satisfies all of the constraints in the problem. They can be useful for smaller problems where finding an exact solution is feasible, or for problems that have a clear mathematical structure.

In summary, CBLS is a type of constraint programming solver that uses a heuristic search algorithm to find good solutions, while other constraint programming solvers use various techniques to find exact solutions to problems.

- + \ No newline at end of file diff --git a/dev/index.html b/dev/index.html index 88df10f..9734f06 100644 --- a/dev/index.html +++ b/dev/index.html @@ -8,17 +8,17 @@ - + - +
Skip to content

Julia Constraints

Model Smoothly Decide Wisely

A Toolkit for Constraint Programming

JuliaConstraints

<p style="margin-bottom:2cm"></p>

<div class="vp-doc" style="width:80%; margin:auto">

<h1>What is Julia Constraints? (chatGPTed atm)</h1>

<p>The Julia Constraints organization is dedicated to advancing Constraint Programming within the Julia ecosystem, serving as a hub for resources that facilitate the creation, understanding, and solution of constraint programming problems. Our goal is to make Constraint Programming accessible and efficient for users at all levels of expertise, by providing a comprehensive suite of tools that integrate seamlessly with JuMP.jl, a popular Julia package for mathematical optimization.</p>

<h2>Our offerings include:</h2>

<h3>Core Packages:</h3> <p>A foundation of common packages (ConstraintCommons, ConstraintDomains, Constraints, ConstraintModels) that supply essential features for constraint programming, ensuring users have the basic tools necessary for their projects.</p>

<h3>Learning and Translation Tools:</h3> <p>Advanced packages like CompositionalNetworks, QUBOConstraints, and ConstraintsTranslator bridge the gap between ease of modeling and computational efficiency. These tools learn from constraints and convert natural language problems into constraint programming solutions, requiring minimal input from the user beyond the model itself.</p>

<h3>Solvers:</h3> <p>We provide a range of solvers, from native Julia solvers (LocalSearchSolvers) to interfaces with JuMP for external CP solvers, catering to various problem-solving needs.</p>

<h3>MetaStrategist (Emerging Technology):</h3> <p>In its formative stages, MetaStrategist embodies our pioneering spirit. As a burgeoning meta-solving package, it aims to harness the strengths of CP and JuMP. Its vision is to formulate tailored strategies that consider the unique hardware and software resources at hand, offering a new horizon in problem-solving efficiency and adaptability.</p>

<h3>Performance Checker (Community Resource):</h3> <p>PerfChecker.jl transcends its role within Julia Constraints, offering its capabilities to the broader Julia package ecosystem. This indispensable tool for cross-version performance checking not only safeguards the high efficiency and reliability of our packages but also serves the wider community. By facilitating clear and simple performance evaluations, PerfChecker.jl enhances both development and maintenance, contributing to the overall health and progress of Julia's growing library of resources.</p>

<p>At Julia Constraints, our mission is to democratize Constraint Programming by providing robust, user-friendly tools that simplify the modeling process, enhance efficiency, and empower users to solve complex problems with ease.</p>

</div>

- + \ No newline at end of file diff --git a/dev/learning/aggregation.html b/dev/learning/aggregation.html index 4022200..24d2a44 100644 --- a/dev/learning/aggregation.html +++ b/dev/learning/aggregation.html @@ -8,17 +8,17 @@ - + - - + + -
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_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


+ \ No newline at end of file diff --git a/dev/learning/arithmetic.html b/dev/learning/arithmetic.html index d4fc7d1..b0c5032 100644 --- a/dev/learning/arithmetic.html +++ b/dev/learning/arithmetic.html @@ -8,17 +8,17 @@ - + - - + + -
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_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


+ \ No newline at end of file diff --git a/dev/learning/comparison.html b/dev/learning/comparison.html index 7e556a1..bdf7111 100644 --- a/dev/learning/comparison.html +++ b/dev/learning/comparison.html @@ -8,17 +8,17 @@ - + - - + + -
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


# CompositionalNetworks.co_euclidianFunction.
julia
co_euclidian(x; dom_size)

Compute an euclidian norm with domain size dom_size of a scalar.

source


# CompositionalNetworks.co_abs_diff_val_varsFunction.
julia
co_abs_diff_val_vars(x; nvars)

Return the absolute difference between x and the number of variables nvars.

source


# CompositionalNetworks.co_val_minus_varsFunction.
julia
co_val_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_valFunction.
julia
co_vars_minus_val(x; nvars)

Return the difference nvars - x if positive, 0.0 otherwise, where nvars denotes the numbers of variables.

source


Param: :val

# CompositionalNetworks.co_abs_diff_val_paramFunction.
julia
co_abs_diff_val_param(x; param)

Return the absolute difference between x and param.

source


# CompositionalNetworks.co_val_minus_paramFunction.
julia
co_val_minus_param(x; param)

Return the difference x - param if positive, 0.0 otherwise.

source


# CompositionalNetworks.co_param_minus_valFunction.
julia
co_param_minus_val(x; param)

Return the difference param - x if positive, 0.0 otherwise.

source


# CompositionalNetworks.co_euclidian_paramFunction.
julia
co_euclidian_param(x; param, dom_size)

Compute an euclidian norm with domain size dom_size, weigthed by param, of a scalar.

source


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_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.

# CompositionalNetworks.co_abs_diff_val_varsFunction.
julia
co_abs_diff_val_vars(x; nvars)

Return the absolute difference between x and the number of variables nvars.

source


# CompositionalNetworks.co_val_minus_varsFunction.
julia
co_val_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_valFunction.
julia
co_vars_minus_val(x; nvars)

Return the difference nvars - x if positive, 0.0 otherwise, where nvars denotes the numbers of variables.

source


Param: :val

# CompositionalNetworks.co_abs_diff_val_paramFunction.
julia
co_abs_diff_val_param(x; param)

Return the absolute difference between x and param.

source


# CompositionalNetworks.co_val_minus_paramFunction.
julia
co_val_minus_param(x; param)

Return the difference x - param if positive, 0.0 otherwise.

source


# CompositionalNetworks.co_param_minus_valFunction.
julia
co_param_minus_val(x; param)

Return the difference param - x if positive, 0.0 otherwise.

source


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


+ \ No newline at end of file diff --git a/dev/learning/compositional_networks.html b/dev/learning/compositional_networks.html index d8f91d2..a3ad68c 100644 --- a/dev/learning/compositional_networks.html +++ b/dev/learning/compositional_networks.html @@ -8,17 +8,17 @@ - + - - + + -
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


# CompositionalNetworks.weigths_biasFunction.
julia
weigths_bias(x)

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

source


- +
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.

+ \ No newline at end of file diff --git a/dev/learning/constraint_learning.html b/dev/learning/constraint_learning.html index d5ec60d..d8d5331 100644 --- a/dev/learning/constraint_learning.html +++ b/dev/learning/constraint_learning.html @@ -8,17 +8,17 @@ - + - - + + -
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 weigths 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 weigths 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 weigths (individuals) for the genetic algorithm weigthing 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 ouput 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 weigths of an ICN with a given set of configuration X and solutions X_sols. The best weigths 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.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


+ \ No newline at end of file diff --git a/dev/learning/intro.html b/dev/learning/intro.html index 4156fcc..474159f 100644 --- a/dev/learning/intro.html +++ b/dev/learning/intro.html @@ -8,17 +8,17 @@ - + - +
Skip to content

Learning about Constraints

About learning constraints related matters.

- + \ No newline at end of file diff --git a/dev/learning/layers.html b/dev/learning/layers.html index 6c9b68f..20dc950 100644 --- a/dev/learning/layers.html +++ b/dev/learning/layers.html @@ -8,20 +8,20 @@ - + - - + + -
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_weigths)

Return the number of operations selected by layer_weigths 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.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 weigths compose a viable pattern. If no weigths are given with an icn, it will check the current internal value.

source


# CompositionalNetworks.generate_inclusive_operationsFunction.
julia
generate_inclusive_operations(predicate, bits)

Generates the operations (weigths) of a layer with inclusive operations.

source


# CompositionalNetworks.generate_exclusive_operationFunction.
julia
generate_exclusive_operation(max_op_number)

Generates the operations (weigths) of a layer with exclusive operations.

source


# CompositionalNetworks.generate_weigthsFunction.
julia
generate_weigths(layers)
-generate_weigths(icn)

Generate the weigths of a collection of layers or of an ICN.

source


- +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 (weigths) 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/qubo_constraints.html b/dev/learning/qubo_constraints.html index 0e5a0b8..0b1f98c 100644 --- a/dev/learning/qubo_constraints.html +++ b/dev/learning/qubo_constraints.html @@ -8,17 +8,17 @@ - + - +
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


- + \ No newline at end of file diff --git a/dev/learning/qubo_encoding.html b/dev/learning/qubo_encoding.html index 23da8c6..58e191c 100644 --- a/dev/learning/qubo_encoding.html +++ b/dev/learning/qubo_encoding.html @@ -8,17 +8,17 @@ - + - +
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


- + \ No newline at end of file diff --git a/dev/learning/qubo_learning.html b/dev/learning/qubo_learning.html index 76a7765..a530647 100644 --- a/dev/learning/qubo_learning.html +++ b/dev/learning/qubo_learning.html @@ -8,10 +8,10 @@ - + - + @@ -136,7 +136,7 @@ ) return train(X, penalty, to_domains(X, dom_stuff); optimizer, X_test) end - + \ No newline at end of file diff --git a/dev/learning/transformation.html b/dev/learning/transformation.html index 372d766..9bb7c1a 100644 --- a/dev/learning/transformation.html +++ b/dev/learning/transformation.html @@ -8,50 +8,50 @@ - + - - + +
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)
 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_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(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_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_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_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_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_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_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


# CompositionalNetworks.tr_contiguous_vals_minusFunction.
julia
tr_contiguous_vals_minus(i, 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_contiguous_vals_minusFunction.
julia
tr_contiguous_vals_minus(i, x)
 tr_contiguous_vals_minus(x)
-tr_contiguous_vals_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_vals_minus_revFunction.
julia
tr_contiguous_vals_minus_rev(i, x)
+tr_contiguous_vals_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_vals_minus_revFunction.
julia
tr_contiguous_vals_minus_rev(i, x)
 tr_contiguous_vals_minus_rev(x)
-tr_contiguous_vals_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


Param: :val

# CompositionalNetworks.tr_count_eq_paramFunction.
julia
tr_count_eq_param(i, x; param)
+tr_contiguous_vals_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


Param: :val

# CompositionalNetworks.tr_count_eq_paramFunction.
julia
tr_count_eq_param(i, x; param)
 tr_count_eq_param(x; param)
-tr_count_eq_param(x, X::AbstractVector; param)

Count the number of elements equal to x[i] + param. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_l_paramFunction.
julia
tr_count_l_param(i, x; param)
+tr_count_eq_param(x, X::AbstractVector; param)

Count the number of elements equal to x[i] + param. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_l_paramFunction.
julia
tr_count_l_param(i, x; param)
 tr_count_l_param(x; param)
-tr_count_l_param(x, X::AbstractVector; param)

Count the number of elements lesser than x[i] + param. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_g_paramFunction.
julia
tr_count_g_param(i, x; param)
+tr_count_l_param(x, X::AbstractVector; param)

Count the number of elements lesser than x[i] + param. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_g_paramFunction.
julia
tr_count_g_param(i, x; param)
 tr_count_g_param(x; param)
-tr_count_g_param(x, X::AbstractVector; param)

Count the number of elements greater than x[i] + param. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_bounding_paramFunction.
julia
tr_count_bounding_param(i, x; param)
+tr_count_g_param(x, X::AbstractVector; param)

Count the number of elements greater than x[i] + param. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_count_bounding_paramFunction.
julia
tr_count_bounding_param(i, x; param)
 tr_count_bounding_param(x; param)
-tr_count_bounding_param(x, X::AbstractVector; param)

Count the number of elements bounded (not strictly) by x[i] and x[i] + param. An extended method to vector with sig (x, param) is generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_val_minus_paramFunction.
julia
tr_val_minus_param(i, x; param)
+tr_count_bounding_param(x, X::AbstractVector; param)

Count the number of elements bounded (not strictly) by x[i] and x[i] + param. An extended method to vector with sig (x, param) is generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_val_minus_paramFunction.
julia
tr_val_minus_param(i, x; param)
 tr_val_minus_param(x; param)
-tr_val_minus_param(x, X::AbstractVector; param)

Return the difference x[i] - param if positive, 0.0 otherwise. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_param_minus_valFunction.
julia
tr_param_minus_val(i, x; param)
+tr_val_minus_param(x, X::AbstractVector; param)

Return the difference x[i] - param if positive, 0.0 otherwise. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


# CompositionalNetworks.tr_param_minus_valFunction.
julia
tr_param_minus_val(i, x; param)
 tr_param_minus_val(x; param)
-tr_param_minus_val(x, X::AbstractVector; param)

Return the difference param - x[i] if positive, 0.0 otherwise. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


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_param_minus_val(x, X::AbstractVector; param)

Return the difference param - x[i] if positive, 0.0 otherwise. Extended method to vector with sig (x, param) are generated. When X is provided, the result is computed without allocations.

source


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
@@ -61,8 +61,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 = false)

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

source


- +count_eq_param_result = val_transforms[:count_eq_param](data, param)

source


# CompositionalNetworks.transformation_layerFunction.
julia
transformation_layer(param = false)

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

source


+ \ No newline at end of file diff --git a/dev/meta/meta_strategist.html b/dev/meta/meta_strategist.html index 72c3112..17ddd26 100644 --- a/dev/meta/meta_strategist.html +++ b/dev/meta/meta_strategist.html @@ -8,17 +8,17 @@ - + - +
Skip to content

MetaStrategist.jl

Documentation for MetaStrategist.jl.

- + \ No newline at end of file diff --git a/dev/perf/benchmark_ext.html b/dev/perf/benchmark_ext.html index d7c6fbe..02ba5aa 100644 --- a/dev/perf/benchmark_ext.html +++ b/dev/perf/benchmark_ext.html @@ -8,17 +8,17 @@ - + - +
Skip to content

BenchmarkTools Extension

A benchmarking extension, based on BenchmarkTools.jl, has been interfaced with PerfChecker.jl. This section (will) provides some usage examples, documentation, and links to related notebooks.

- + \ No newline at end of file diff --git a/dev/perf/perf_checker.html b/dev/perf/perf_checker.html index 607d6a3..7cf2efa 100644 --- a/dev/perf/perf_checker.html +++ b/dev/perf/perf_checker.html @@ -8,16 +8,16 @@ - + - - + + -
Skip to content

PerfChecker.jl

Documentation 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

PerfChecker.jl

Documentation 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"
@@ -26,7 +26,7 @@
  v"0.1.1"
  v"0.1.3"
  v"0.1.2"

source


- + \ No newline at end of file diff --git a/dev/perf/perf_interface.html b/dev/perf/perf_interface.html index 2658091..8bce5c8 100644 --- a/dev/perf/perf_interface.html +++ b/dev/perf/perf_interface.html @@ -8,17 +8,17 @@ - + - +
Skip to content

Interfacing PerfChecker

PerfChecker was build as an easy to extend interface. This section will cover the few method required.

- + \ No newline at end of file diff --git a/dev/public_api.html b/dev/public_api.html index 08ee432..a646d4e 100644 --- a/dev/public_api.html +++ b/dev/public_api.html @@ -8,32 +8,32 @@ - + - - + + -
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.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.δ_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

Addtionally, 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(
+    
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.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
Base.:*(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;
     complete_search_limit = 10^6,
     max_samplings = sum(domain_size, domains),
     search = :flexible,
     solutions_limit = floor(Int, sqrt(max_samplings)),
-)

Settings for the exploration of a search space composed by a collection of domains.

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


# 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)
+)

Settings for the exploration of a search space composed by a collection of domains.

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


# 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, param = nothing; search_limit = 1000, solutions_limit = 100)

Search (a part of) a search space and returns a pair of vector of configurations: (solutions, non_solutions). If the search space size is over search_limit, then both solutions and non_solutions are limited to solutions_limit.

Beware that if the density of the solutions in the search space is low, solutions_limit needs to be reduced. This process will be automatic in the future (simple reinforcement learning).

Arguments:

  • domains: a collection of domains

  • concept: the concept of the targeted constraint

  • param: an optional parameter of the constraint

  • sol_number: the required number of solutions (half of the number of configurations), default to 100

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 stucture 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 assignements. 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, weigths=nothing)

Return a function composed by some of the operations of a given ICN. Can be applied to any vector of variables. If weigths 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 paramater 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.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, param = nothing; search_limit = 1000, solutions_limit = 100)

Search (a part of) a search space and returns a pair of vector of configurations: (solutions, non_solutions). If the search space size is over search_limit, then both solutions and non_solutions are limited to solutions_limit.

Beware that if the density of the solutions in the search space is low, solutions_limit needs to be reduced. This process will be automatic in the future (simple reinforcement learning).

Arguments:

  • domains: a collection of domains

  • concept: the concept of the targeted constraint

  • param: an optional parameter of the constraint

  • sol_number: the required number of solutions (half of the number of configurations), default to 100

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(;
     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 weigth of an ICN.

source


# CompositionalNetworks.regularizationMethod.
julia
regularization(icn)

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

source


# CompositionalNetworks.show_layersMethod.
julia
show_layers(icn)

Return a formated 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 = false)

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

source


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

Set the weigths of an ICN with a BitVector.

source


# CompositionalNetworks.weigthsMethod.
julia
weigths(icn)

Access the current set of weigths of an ICN.

source


# CompositionalNetworks.weigths_biasMethod.
julia
weigths_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.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 = false)

Generate the layer of transformations functions of the ICN. Iff param value is true, also includes all the 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


+ \ No newline at end of file diff --git a/dev/solvers/cbls.html b/dev/solvers/cbls.html index f59806c..8d6b080 100644 --- a/dev/solvers/cbls.html +++ b/dev/solvers/cbls.html @@ -8,10 +8,10 @@ - + - + @@ -23,7 +23,7 @@ # Generic use @objective(model, ScalarFunction(f, X))

source


# CBLS.SequentialTasksType.

Local constraint ensuring that, given a vector X of size 4, |X[1] - X[2]| ≠ |X[3] - X[4]|).

julia
@constraint(model, X in SequentialTasks())

source


# CBLS.SumEqualParamType.

Global constraint ensuring that the sum of the values of X is equal to a given parameter param.

julia
@constraint(model, X in SumEqualParam(param))

source


# Base.copyMethod.
julia
Base.copy(set::MOIError) = begin

DOCSTRING

source


# Base.copyMethod.
julia
Base.copy(set::DiscreteSet) = begin

DOCSTRING

source


# JuMP.build_variableMethod.
julia
JuMP.build_variable(::Function, info::JuMP.VariableInfo, set::T) where T <: MOI.AbstractScalarSet

DOCSTRING

Arguments:

  • ``: DESCRIPTION

  • info: DESCRIPTION

  • set: DESCRIPTION

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, 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.empty!Method.
julia
MOI.empty!(opt) = begin

DOCSTRING

source


# MathOptInterface.getMethod.
julia
MOI.get(::Optimizer, ::MOI.SolverName) = begin

DOCSTRING

source


# MathOptInterface.is_emptyMethod.
julia
MOI.is_empty(model::Optimizer) = begin

DOCSTRING

source


# MathOptInterface.optimize!Method.
julia
MOI.optimize!(model::Optimizer)

source


# MathOptInterface.setFunction.
julia
MOI.set(::Optimizer, ::MOI.Silent, bool = true) = begin

DOCSTRING

Arguments:

  • ``: DESCRIPTION

  • ``: DESCRIPTION

  • bool: DESCRIPTION

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_incremental_interfaceMethod.

Copy constructor for the optimizer

source


- + \ No newline at end of file diff --git a/dev/solvers/intro.html b/dev/solvers/intro.html index a422876..1e3b51e 100644 --- a/dev/solvers/intro.html +++ b/dev/solvers/intro.html @@ -8,17 +8,17 @@ - + - +
Skip to content
- + \ No newline at end of file diff --git a/dev/solvers/local_search_solvers.html b/dev/solvers/local_search_solvers.html index b0280fa..a0b46b0 100644 --- a/dev/solvers/local_search_solvers.html +++ b/dev/solvers/local_search_solvers.html @@ -8,23 +8,23 @@ - + - - + + -
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.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}
+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}}
+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}
@@ -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._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 contraints 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 contraints 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._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._threads!Method.
julia
_threads!(options, threads) = begin

DOCSTRING

source


# LocalSearchSolvers._threadsMethod.
julia
_threads(options) = begin

DOCSTRING

source


# LocalSearchSolvers._time_limit!Method.
julia
_time_limit!(options, time::Time) = begin

DOCSTRING

source


# LocalSearchSolvers._time_limitMethod.
julia
_time_limit(options) = begin

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}
+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._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._threads!Method.
julia
_threads!(options, threads) = begin

DOCSTRING

source


# LocalSearchSolvers._threadsMethod.
julia
_threads(options) = begin

DOCSTRING

source


# LocalSearchSolvers._time_limit!Method.
julia
_time_limit!(options, time::Time) = begin

DOCSTRING

source


# LocalSearchSolvers._time_limitMethod.
julia
_time_limit(options) = begin

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 cosntraints

  • 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 serie 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
+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


- +x2 = variable([-89,56,28], "x2", domain = :indices)

source


+ \ No newline at end of file