diff --git a/dev/404.html b/dev/404.html index 3a9251b..e513378 100644 --- a/dev/404.html +++ b/dev/404.html @@ -8,14 +8,14 @@ - +
- + \ No newline at end of file diff --git a/dev/api/00_public.html b/dev/api/00_public.html index b9e6225..2268de9 100644 --- a/dev/api/00_public.html +++ b/dev/api/00_public.html @@ -8,16 +8,16 @@ - + - + - + -
Skip to content

Public API

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

A minimal implementation of a deterministic automaton structure.

source

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

A minimal implementation of a multivalued decision diagram structure.

source

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

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

source

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

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

source

ConstraintCommons.consisempty Method
julia
consisempty(::Nothing)

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

source

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

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

source

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

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

source

ConstraintCommons.oversample Method
julia
oversample(X, f)

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

source

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

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

source

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

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

source

ConstraintDomains.AbstractDomain Type
julia
AbstractDomain

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

  • Base.∈(val, ::D)

  • Base.rand(::D)

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

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

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source

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

An abstract supertype for all continuous domains.

source

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

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

source

ConstraintDomains.ExploreSettings Method
julia
ExploreSettings(
+    
Skip to content

Public API

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

A minimal implementation of a deterministic automaton structure.

source

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

A minimal implementation of a multivalued decision diagram structure.

source

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

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

source

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

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

source

ConstraintCommons.consisempty Method
julia
consisempty(::Nothing)

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

source

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

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

source

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

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

source

ConstraintCommons.oversample Method
julia
oversample(X, f)

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

source

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

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

source

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

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

source

ConstraintDomains.AbstractDomain Type
julia
AbstractDomain

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

  • Base.∈(val, ::D)

  • Base.rand(::D)

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

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

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source

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

An abstract supertype for all continuous domains.

source

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

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

source

ConstraintDomains.ExploreSettings Method
julia
ExploreSettings(
     domains;
     complete_search_limit = 10^6,
     max_samplings = sum(domain_size, domains),
@@ -32,15 +32,15 @@
 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 Method
julia
domain()

Construct an EmptyDomain.

source

ConstraintDomains.domain Method
julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+d5 = domain(1,42,86.9)

source

ConstraintDomains.domain Method
julia
domain()

Construct an EmptyDomain.

source

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

Construct a domain of continuous interval(s).

source

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

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

source

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

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

source

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

Return the maximum distance between two points in d.

source

ConstraintDomains.explore! Method
julia
explore!(explorer::Explorer)

Perform exploration on the search space defined by the Explorer object.

This function explores the search space according to the settings specified in the Explorer object. It updates the Explorer's state with found solutions and non-solutions.

Arguments

  • explorer: An Explorer object containing the problem definition and exploration settings.

Returns

Nothing. The Explorer's state is updated in-place.

Example

julia
explorer = Explorer(concepts, domains)
 explore!(explorer)
 println("Solutions found: ", length(explorer.state.solutions))

source

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

Explore a search space defined by domains and a concept.

Arguments

  • domains: A collection of domains representing the search space.

  • concept: The concept function defining the constraint.

  • settings: An ExploreSettings object to configure the exploration process.

  • parameters: Additional parameters to pass to the concept function.

Returns

A tuple containing two sets: (solutions, non_solutions).

Example

julia
domains = [domain([1, 2, 3]), domain([4, 5, 6])]
-solutions, non_solutions = explore(domains, allunique)

source

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

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

source

ConstraintDomains.get_domain Method
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

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

Compute the intersections of two domains.

source

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

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

source

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

Convert various arguments into valid domains format.

source

Constraints.USUAL_CONSTRAINTS Constant
julia
USUAL_CONSTRAINTS::Dict

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

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

Example

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

source

Constraints.USUAL_SYMMETRIES Constant
julia
USUAL_SYMMETRIES

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

source

Constraints.Constraint Type
julia
Constraint

Parametric structure with the following fields.

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

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

source

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

Return the parameters of the constraint s in constraints_dict.

Arguments

  • s::Symbol: the constraint name.

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

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

Example

julia
extract_parameters(:all_different)

source

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

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

source

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

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

source

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

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

Arguments

  • s::Symbol: the constraint name.

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

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

Example

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

source

Constraints.constraints_descriptions Function
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

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

Arguments

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

Example

julia
constraints_descriptions()

source

Constraints.constraints_parameters Function
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

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

Arguments

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

Example

julia
constraints_parameters()

source

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

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

Arguments

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

  • width::Int: width of the table.

Example

julia
describe()

source

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

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

source

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

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

source

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

Return the list of symmetries of c.

source

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

Construct a Composition.

source

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

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

source

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

Construct an Interpretable Compositional Network, with the following arguments:

  • nvars: number of variable in the constraint

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

  • param: optional parameter (default to nothing)

  • transformation: a transformation layer (optional)

  • arithmetic: a arithmetic layer (optional)

  • aggregation: a aggregation layer (optional)

  • comparison: a comparison layer (optional)

source

CompositionalNetworks.aggregation_layer Method
julia
aggregation_layer()

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

source

CompositionalNetworks.arithmetic_layer Method
julia
arithmetic_layer()

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

source

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

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

source

CompositionalNetworks.comparison_layer Function
julia
comparison_layer(param = false)

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

source

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

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

source

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

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

Arguments:

  • concept: the concept to learn

  • name: the name to give to the constraint

  • path: path of the output file

Keywords arguments:

  • domains: domains that defines the search space

  • param: an optional parameter of the constraint

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

  • search: either :partial or :complete search

  • global_iter: number of learning iteration

  • local_iter: number of generation in the genetic algorithm

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

  • popSize: size of the population in the genetic algorithm

source

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

Access the actual method of an ICN composition c.

source

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

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

source

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

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

Arguments:

  • concept: the concept of the targeted constraint

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

  • param: an optional parameter of the constraint

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

  • global_iter: number of learning iteration

  • local_iter: number of generation in the genetic algorithm

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

  • popSize: size of the population in the genetic algorithm

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

source

CompositionalNetworks.hamming Method
julia
hamming(x, X)

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

source

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

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

source

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

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

source

CompositionalNetworks.learn_compose Method
julia
learn_compose(;
+solutions, non_solutions = explore(domains, allunique)

source

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

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

source

ConstraintDomains.get_domain Method
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

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

Compute the intersections of two domains.

source

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

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

source

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

Convert various arguments into valid domains format.

source

Constraints.USUAL_CONSTRAINTS Constant
julia
USUAL_CONSTRAINTS::Dict

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

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

Example

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

source

Constraints.USUAL_SYMMETRIES Constant
julia
USUAL_SYMMETRIES

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

source

Constraints.Constraint Type
julia
Constraint

Parametric structure with the following fields.

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

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

source

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

Return the parameters of the constraint s in constraints_dict.

Arguments

  • s::Symbol: the constraint name.

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

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

Example

julia
extract_parameters(:all_different)

source

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

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

source

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

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

source

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

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

Arguments

  • s::Symbol: the constraint name.

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

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

Example

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

source

Constraints.constraints_descriptions Function
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

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

Arguments

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

Example

julia
constraints_descriptions()

source

Constraints.constraints_parameters Function
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

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

Arguments

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

Example

julia
constraints_parameters()

source

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

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

Arguments

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

  • width::Int: width of the table.

Example

julia
describe()

source

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

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

source

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

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

source

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

Return the list of symmetries of c.

source

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

Construct a Composition.

source

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

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

source

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

Construct an Interpretable Compositional Network, with the following arguments:

  • nvars: number of variable in the constraint

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

  • param: optional parameter (default to nothing)

  • transformation: a transformation layer (optional)

  • arithmetic: a arithmetic layer (optional)

  • aggregation: a aggregation layer (optional)

  • comparison: a comparison layer (optional)

source

CompositionalNetworks.aggregation_layer Method
julia
aggregation_layer()

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

source

CompositionalNetworks.arithmetic_layer Method
julia
arithmetic_layer()

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

source

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

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

source

CompositionalNetworks.comparison_layer Function
julia
comparison_layer(param = false)

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

source

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

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

source

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

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

Arguments:

  • concept: the concept to learn

  • name: the name to give to the constraint

  • path: path of the output file

Keywords arguments:

  • domains: domains that defines the search space

  • param: an optional parameter of the constraint

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

  • search: either :partial or :complete search

  • global_iter: number of learning iteration

  • local_iter: number of generation in the genetic algorithm

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

  • popSize: size of the population in the genetic algorithm

source

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

Access the actual method of an ICN composition c.

source

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

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

source

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

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

Arguments:

  • concept: the concept of the targeted constraint

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

  • param: an optional parameter of the constraint

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

  • global_iter: number of learning iteration

  • local_iter: number of generation in the genetic algorithm

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

  • popSize: size of the population in the genetic algorithm

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

source

CompositionalNetworks.hamming Method
julia
hamming(x, X)

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

source

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

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

source

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

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

source

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

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

source

CompositionalNetworks.manhattan Method
julia
manhattan(x, X)

source

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

source

CompositionalNetworks.nbits Method
julia
nbits(icn)

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

source

CompositionalNetworks.regularization Method
julia
regularization(icn)

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

source

CompositionalNetworks.show_layers Method
julia
show_layers(icn)

Return a formatted string with each layers in the icn.

source

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

Output the composition as a layered collection of Symbols.

source

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

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

source

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

Set the weights of an ICN with a BitVector.

source

CompositionalNetworks.weights Method
julia
weights(icn)

Access the current set of weights of an ICN.

source

CompositionalNetworks.weights_bias Method
julia
weights_bias(x)

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

source

QUBOConstraints.QUBO_linear_sum Method
julia
QUBO_linear_sum(n, σ)

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

source

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

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

source

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

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

source

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

Check if x has a valid format for encoding.

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

source

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

Default train method for any AbstractOptimizer.

source

ConstraintsTranslator.GoogleLLM Type
julia
Google LLM

Structure encapsulating the parameters for accessing the Google LLM API.

  • api_key: an API key for accessing the Google Gemini API (https://ai.google.dev/gemini-api/docs/), read from the environmental variable GOOGLE_API_KEY.

  • model_id: a string identifier for the model to query. See https://ai.google.dev/gemini-api/docs/models/gemini for the list of available models.

  • url: URL for chat completions. Defaults to https://generativelanguage.googleapis.com/v1beta/models/.

source

ConstraintsTranslator.GroqLLM Type
julia
GroqLLM

Structure encapsulating the parameters for accessing the Groq LLM API.

source

ConstraintsTranslator.LlamaCppLLM Type
julia
LlamaCppLLM

Structure encapsulating the parameters for accessing the llama.cpp server API.

  • api_key: an optional API key for accessing the server

  • model_id: a string identifier for the model to query. Unused, kept for API compatibility.

  • url: the URL of the llama.cpp server OpenAI API endpoint (e.g., http://localhost:8080)

NOTE: we do not apply the appropriate chat templates to the prompt. This must be handled either in an external code path or by the server.

source

ConstraintsTranslator.Prompt Type
julia
Prompt

Simple data structure encapsulating a system prompt and a user prompt for LLM generation.

Fields

  • system: the system prompt.

  • user: the user prompt.

source

ConstraintsTranslator.PromptTemplate Type
julia
PromptTemplate

Represents a complete prompt template, comprising metadata, system, and user messages.

Fields

  • metadata::MetadataMessage: The metadata message of the prompt template.

  • system::SystemMessage: The system message of the prompt template.

  • user::UserMessage: The user message of the prompt template.

source

ConstraintsTranslator.format_template Method
julia
format_template(template::PromptTemplate; kwargs...)::Prompt

Formats a PromptTemplate by substituting all variables in the system and user messages with user-provided values.

Arguments

  • template::PromptTemplate: The prompt template containing metadata, system, and user messages.

  • kwargs...: A variable number of keyword arguments where keys are variable names and values are the corresponding replacements.

Returns

  • Prompt: A Prompt struct with the system and user messages containing the substituted values.

Raises

  • ErrorException: If any variables specified in the system or user templates are not present in the kwargs.

  • Warning: If there are extra kwargs that are not used in the templates.

source

ConstraintsTranslator.get_completion Method
julia
get_completion(llm::AbstractLLM, prompt::AbstractPrompt)

Returns a completion for a prompt using the llm model API.

source

ConstraintsTranslator.get_completion Method
julia
get_completion(llm::OpenAILLM, prompt::Prompt)

Returns a completion for the given prompt using an OpenAI API compatible LLM

source

ConstraintsTranslator.get_completion Method
julia
get_completion(llm::GoogleLLM, prompt::Prompt)

Returns a completion for the given prompt using the Google Gemini LLM API.

source

ConstraintsTranslator.parse_code Method
julia
parse_code(s::String)

Parse the code blocks in the input string s delimited by triple backticks and an optional language annotation. Returns a dictionary keyed by language. Code blocks from the same language are concatenated.

source

ConstraintsTranslator.read_template Method
julia
read_template(data_path::String)

Reads a prompt template from a JSON file specified by data_path. The function parses the JSON data and constructs a PromptTemplate object containing metadata, system, and user messages. TODO: validate the JSON data against a schema to ensure it is valid before parsing.

Arguments

  • data_path::String: The path to the JSON file containing the prompt template.

Returns

  • PromptTemplate: A PromptTemplate structure encapsulating the metadata, system, and user messages.

Raises

  • ErrorException: if the template does not match the specification format.

source

ConstraintsTranslator.stream_completion Method
julia
stream_completion(llm::AbstractLLM, prompt::AbstractPrompt)

Returns a completion for a prompt using the llm model API. The completion is streamed to the terminal as it is generated.

source

ConstraintsTranslator.stream_completion Method
julia
stream_completion(llm::OpenAILLM, prompt::Prompt)

Returns a completion for the given prompt using an OpenAI API compatible model. The completion is streamed to the terminal as it is generated.

source

ConstraintsTranslator.stream_completion Method
julia
stream_completion(llm::GoogleLLM, prompt::Prompt)

Returns a completion for the given prompt using the Google Gemini LLM API. The completion is streamed to the terminal as it is generated.

source

ConstraintsTranslator.translate Method
julia
translate(model::AbstractLLM, description::AbstractString; interactive::Bool = false)

Translate the natural-language description of an optimization problem into a Constraint Programming model by querying the Large Language Model model. If interactive, the user will be prompted via the command line to inspect the intermediate outputs of the LLM, and possibly modify them.

source

- + \ No newline at end of file diff --git a/dev/api/10_full.html b/dev/api/10_full.html index 420fdce..8441c08 100644 --- a/dev/api/10_full.html +++ b/dev/api/10_full.html @@ -8,16 +8,16 @@ - + - + - + -
Skip to content

Full API

ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS Constant
julia
const USUAL_CONSTRAINT_PARAMETERS

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

julia
const USUAL_CONSTRAINT_PARAMETERS = [
+    
Skip to content

Full API

ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS Constant
julia
const USUAL_CONSTRAINT_PARAMETERS

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

julia
const USUAL_CONSTRAINT_PARAMETERS = [
     :bool, # boolean parameter
     :dim, # dimension, an integer parameter used along the pair_vars or vals parameters
     :id, # index to target one variable in the input vector
@@ -47,12 +47,12 @@
 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 Method
julia
domain()

Construct an EmptyDomain.

source

ConstraintDomains.domain Method
julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+d5 = domain(1,42,86.9)

source

ConstraintDomains.domain Method
julia
domain()

Construct an EmptyDomain.

source

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

Construct a domain of continuous interval(s).

source

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

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

source

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

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

source

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

Return the maximum distance between two points in d.

source

ConstraintDomains.explore! Method
julia
explore!(explorer::Explorer)

Perform exploration on the search space defined by the Explorer object.

This function explores the search space according to the settings specified in the Explorer object. It updates the Explorer's state with found solutions and non-solutions.

Arguments

  • explorer: An Explorer object containing the problem definition and exploration settings.

Returns

Nothing. The Explorer's state is updated in-place.

Example

julia
explorer = Explorer(concepts, domains)
 explore!(explorer)
 println("Solutions found: ", length(explorer.state.solutions))

source

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

Explore a search space defined by domains and a concept.

Arguments

  • domains: A collection of domains representing the search space.

  • concept: The concept function defining the constraint.

  • settings: An ExploreSettings object to configure the exploration process.

  • parameters: Additional parameters to pass to the concept function.

Returns

A tuple containing two sets: (solutions, non_solutions).

Example

julia
domains = [domain([1, 2, 3]), domain([4, 5, 6])]
-solutions, non_solutions = explore(domains, allunique)

source

ConstraintDomains.fake_automaton Method
julia
fake_automaton(d)

Construct a FakeAutomaton.

source

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

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

source

ConstraintDomains.get_domain Method
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

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

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

Arguments

  • is::IS: a collection of intervals.

  • i::I: an interval.

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

source

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

Compute the intersections of two domains.

source

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

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

source

ConstraintDomains.set! Method
julia
set!(explorer::Explorer, objective::Function)

Set the objective function for the Explorer object.

Arguments

  • explorer: The Explorer object to modify.

  • objective: A function to use as the objective for optimization.

Returns

Nothing. The Explorer object is modified in-place.

Example

julia
explorer = Explorer()
-set!(explorer, x -> sum(x))

source

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

Defines the size of an interval as its span.

source

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

Convert various arguments into valid domains format.

source

Constraints.USUAL_CONSTRAINTS Constant
julia
USUAL_CONSTRAINTS::Dict

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

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

Example

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

source

Constraints.USUAL_SYMMETRIES Constant
julia
USUAL_SYMMETRIES

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

source

Constraints.Constraint Type
julia
Constraint

Parametric structure with the following fields.

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

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

source

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

Return the parameters of the constraint s in constraints_dict.

Arguments

  • s::Symbol: the constraint name.

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

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

Example

julia
extract_parameters(:all_different)

source

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

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

source

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

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

source

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

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

Arguments

  • s::Symbol: the constraint name.

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

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

Example

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

source

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

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

Arguments

  • c: The concept function.

  • e: The error function.

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

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

Returns

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

Examples

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

source

Constraints.constraints_descriptions Function
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

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

Arguments

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

Example

julia
constraints_descriptions()

source

Constraints.constraints_parameters Function
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

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

Arguments

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

Example

julia
constraints_parameters()

source

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

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

Arguments

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

  • width::Int: width of the table.

Example

julia
describe()

source

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

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

source

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

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

Arguments

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

Returns

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

Examples

julia
e = make_error(:all_different)
+solutions, non_solutions = explore(domains, allunique)

source

ConstraintDomains.fake_automaton Method
julia
fake_automaton(d)

Construct a FakeAutomaton.

source

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

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

source

ConstraintDomains.get_domain Method
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

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

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

Arguments

  • is::IS: a collection of intervals.

  • i::I: an interval.

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

source

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

Compute the intersections of two domains.

source

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

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

source

ConstraintDomains.set! Method
julia
set!(explorer::Explorer, objective::Function)

Set the objective function for the Explorer object.

Arguments

  • explorer: The Explorer object to modify.

  • objective: A function to use as the objective for optimization.

Returns

Nothing. The Explorer object is modified in-place.

Example

julia
explorer = Explorer()
+set!(explorer, x -> sum(x))

source

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

Defines the size of an interval as its span.

source

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

Convert various arguments into valid domains format.

source

Constraints.USUAL_CONSTRAINTS Constant
julia
USUAL_CONSTRAINTS::Dict

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

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

Example

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

source

Constraints.USUAL_SYMMETRIES Constant
julia
USUAL_SYMMETRIES

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

source

Constraints.Constraint Type
julia
Constraint

Parametric structure with the following fields.

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

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

source

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

Return the parameters of the constraint s in constraints_dict.

Arguments

  • s::Symbol: the constraint name.

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

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

Example

julia
extract_parameters(:all_different)

source

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

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

source

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

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

source

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

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

Arguments

  • s::Symbol: the constraint name.

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

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

Example

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

source

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

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

Arguments

  • c: The concept function.

  • e: The error function.

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

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

Returns

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

Examples

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

source

Constraints.constraints_descriptions Function
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

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

Arguments

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

Example

julia
constraints_descriptions()

source

Constraints.constraints_parameters Function
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

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

Arguments

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

Example

julia
constraints_parameters()

source

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

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

Arguments

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

  • width::Int: width of the table.

Example

julia
describe()

source

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

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

source

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

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

Arguments

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

Returns

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

Examples

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

source

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

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

source

Constraints.shrink_concept Method
julia
shrink_concept(s)

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

source

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

Return the list of symmetries of c.

source

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

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

Arguments

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

Variants

  • :all_different: Global constraint ensuring that 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)
@@ -280,7 +280,7 @@
 tr_val_minus_var(x, X::AbstractVector; val)

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

source

CompositionalNetworks.tr_var_minus_val Method
julia
tr_var_minus_val(i, x; val)
 tr_var_minus_val(x; val)
 tr_var_minus_val(x, X::AbstractVector; val)

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

source

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

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

source

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

Set the weights of an ICN with a BitVector.

source

CompositionalNetworks.weights Method
julia
weights(icn)

Access the current set of weights of an ICN.

source

CompositionalNetworks.weights_bias Method
julia
weights_bias(x)

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

source

QUBOConstraints.AbstractOptimizer Type
julia
AbstractOptimizer

An abstract type (interface) used to learn QUBO matrices from constraints. Only a train method is required.

source

QUBOConstraints.QUBO_base Function
julia
QUBO_base(n, weight = 1)

A basic QUBO matrix to ensure that binarized variables keep a valid encoding.

source

QUBOConstraints.QUBO_linear_sum Method
julia
QUBO_linear_sum(n, σ)

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

source

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

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

source

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

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

source

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

Check if x has a valid format for encoding.

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

source

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

Default train method for any AbstractOptimizer.

source

ConstraintsTranslator.GoogleLLM Type
julia
Google LLM

Structure encapsulating the parameters for accessing the Google LLM API.

  • api_key: an API key for accessing the Google Gemini API (https://ai.google.dev/gemini-api/docs/), read from the environmental variable GOOGLE_API_KEY.

  • model_id: a string identifier for the model to query. See https://ai.google.dev/gemini-api/docs/models/gemini for the list of available models.

  • url: URL for chat completions. Defaults to https://generativelanguage.googleapis.com/v1beta/models/.

source

ConstraintsTranslator.GroqLLM Type
julia
GroqLLM

Structure encapsulating the parameters for accessing the Groq LLM API.

source

ConstraintsTranslator.LlamaCppLLM Type
julia
LlamaCppLLM

Structure encapsulating the parameters for accessing the llama.cpp server API.

  • api_key: an optional API key for accessing the server

  • model_id: a string identifier for the model to query. Unused, kept for API compatibility.

  • url: the URL of the llama.cpp server OpenAI API endpoint (e.g., http://localhost:8080)

NOTE: we do not apply the appropriate chat templates to the prompt. This must be handled either in an external code path or by the server.

source

ConstraintsTranslator.MetadataMessage Type
julia
MetadataMessage

Represents the metadata information of a prompt template. The templates follow the specifications of PromptingTools.jl.

Fields

  • content::String: The content of the metadata message.

  • description::String: A description of the metadata message.

  • version::String: The version of the metadata message.

source

ConstraintsTranslator.Prompt Type
julia
Prompt

Simple data structure encapsulating a system prompt and a user prompt for LLM generation.

Fields

  • system: the system prompt.

  • user: the user prompt.

source

ConstraintsTranslator.PromptTemplate Type
julia
PromptTemplate

Represents a complete prompt template, comprising metadata, system, and user messages.

Fields

  • metadata::MetadataMessage: The metadata message of the prompt template.

  • system::SystemMessage: The system message of the prompt template.

  • user::UserMessage: The user message of the prompt template.

source

ConstraintsTranslator.SystemMessage Type
julia
SystemMessage

Represents the prompt template of a system message. The template can optionally contain string placeholders enclosed in double curly braces, e.g., . Placeholders must be replaced with actual values when generating prompts.

Fields

  • content::String: The content of the system message.

  • variables::Vector{String}: A list of variables used in the system message.

source

ConstraintsTranslator.UserMessage Type
julia
UserMessage

Represents the prompt template of a user message. The template can optionally contain string placeholders enclosed in double curly braces, e.g., . Placeholders must be replaced with actual values when generating prompts.

Fields

  • content::String: The content of the system message.

  • variables::Vector{String}: A list of variables used in the system message.

source

ConstraintsTranslator.check_syntax_errors Method
julia
check_syntax_errors(s::String)

Parses the string s as Julia code. In the case of syntax errors, it returns the error message of the parser as a string. Otherwise, it returns an empty string.

source

ConstraintsTranslator.edit_in_editor Method
julia
edit_in_vim(s::String)

Edits the input string s in a temporary file using the Vim editor. Returns the modified string after the editor is closed.

source

ConstraintsTranslator.extract_structure Method
julia
extract_structure(model <: AbstractLLM, description <: AbstractString)

Extracts the parameters, decision variables and constraints of an optimization problem given a natural-language description. Returns a Markdown-formatted text containing the above information.

source

ConstraintsTranslator.fix_syntax_errors Method
julia
fix_syntax_errors(model::AbstractLLM, code::AbstractString, error::AbstractString)

Fixes syntax errors in the code by querying the Large Language Model model, based on an error produced by the Julia parser. Returns Markdown-formatted text containing the corrected code in a Julia code block.

source

ConstraintsTranslator.format_template Method
julia
format_template(template::PromptTemplate; kwargs...)::Prompt

Formats a PromptTemplate by substituting all variables in the system and user messages with user-provided values.

Arguments

  • template::PromptTemplate: The prompt template containing metadata, system, and user messages.

  • kwargs...: A variable number of keyword arguments where keys are variable names and values are the corresponding replacements.

Returns

  • Prompt: A Prompt struct with the system and user messages containing the substituted values.

Raises

  • ErrorException: If any variables specified in the system or user templates are not present in the kwargs.

  • Warning: If there are extra kwargs that are not used in the templates.

source

ConstraintsTranslator.get_completion Method
julia
get_completion(llm::AbstractLLM, prompt::AbstractPrompt)

Returns a completion for a prompt using the llm model API.

source

ConstraintsTranslator.get_completion Method
julia
get_completion(llm::OpenAILLM, prompt::Prompt)

Returns a completion for the given prompt using an OpenAI API compatible LLM

source

ConstraintsTranslator.get_completion Method
julia
get_completion(llm::GoogleLLM, prompt::Prompt)

Returns a completion for the given prompt using the Google Gemini LLM API.

source

ConstraintsTranslator.get_package_path Method
julia
get_package_path()

Returns the absolute path of the root directory of ConstraintsTranslator.jl.

source

ConstraintsTranslator.jumpify_model Method
julia
jumpify_model(model::AbstractLLM, description::AbstractString, examples::AbstractString)

Translates the natural language description of an optimization problem into a JuMP constraints programming model to be solved with CBL by querying the Large Language Model model. The examples are snippets from ConstraintModels.jl used as in-context examples to the LLM. To work optimally, the model expects the description to be a structured Markdown-formatted description as the ones generated by extract_structure. Returns a Markdown-formatted text containing Julia code in a code block.

source

ConstraintsTranslator.parse_code Method
julia
parse_code(s::String)

Parse the code blocks in the input string s delimited by triple backticks and an optional language annotation. Returns a dictionary keyed by language. Code blocks from the same language are concatenated.

source

ConstraintsTranslator.read_template Method
julia
read_template(data_path::String)

Reads a prompt template from a JSON file specified by data_path. The function parses the JSON data and constructs a PromptTemplate object containing metadata, system, and user messages. TODO: validate the JSON data against a schema to ensure it is valid before parsing.

Arguments

  • data_path::String: The path to the JSON file containing the prompt template.

Returns

  • PromptTemplate: A PromptTemplate structure encapsulating the metadata, system, and user messages.

Raises

  • ErrorException: if the template does not match the specification format.

source

ConstraintsTranslator.stream_completion Method
julia
stream_completion(llm::AbstractLLM, prompt::AbstractPrompt)

Returns a completion for a prompt using the llm model API. The completion is streamed to the terminal as it is generated.

source

ConstraintsTranslator.stream_completion Method
julia
stream_completion(llm::OpenAILLM, prompt::Prompt)

Returns a completion for the given prompt using an OpenAI API compatible model. The completion is streamed to the terminal as it is generated.

source

ConstraintsTranslator.stream_completion Method
julia
stream_completion(llm::GoogleLLM, prompt::Prompt)

Returns a completion for the given prompt using the Google Gemini LLM API. The completion is streamed to the terminal as it is generated.

source

ConstraintsTranslator.translate Method
julia
translate(model::AbstractLLM, description::AbstractString; interactive::Bool = false)

Translate the natural-language description of an optimization problem into a Constraint Programming model by querying the Large Language Model model. If interactive, the user will be prompted via the command line to inspect the intermediate outputs of the LLM, and possibly modify them.

source

- + \ No newline at end of file diff --git a/dev/assets/api_00_public.md.D5arbpZy.js b/dev/assets/api_00_public.md.Cqf6QMJN.js similarity index 68% rename from dev/assets/api_00_public.md.D5arbpZy.js rename to dev/assets/api_00_public.md.Cqf6QMJN.js index bf7edf0..ecda81d 100644 --- a/dev/assets/api_00_public.md.D5arbpZy.js +++ b/dev/assets/api_00_public.md.Cqf6QMJN.js @@ -13,11 +13,11 @@ import{_ as o,c as p,j as i,a as t,G as n,a5 as e,t as r,B as h,o as d}from"./ch d2 = domain([53.69, 89.2, 0.12]) d3 = domain([2//3, 89//123]) d4 = domain(4.3) -d5 = domain(1,42,86.9)

source

`,4))]),i("details",N,[i("summary",null,[s[60]||(s[60]=i("a",{id:"ConstraintDomains.domain-Tuple{}-api-00_public",href:"#ConstraintDomains.domain-Tuple{}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[61]||(s[61]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[62]||(s[62]=e('
julia
domain()

Construct an EmptyDomain.

source

',3))]),i("details",_,[i("summary",null,[s[63]||(s[63]=i("a",{id:"ConstraintDomains.domain-Union{Tuple{Array{Intervals.Interval{T, L, R}, 1}}, Tuple{R}, Tuple{L}, Tuple{T}} where {T<:Real, L, R}-api-00_public",href:"#ConstraintDomains.domain-Union{Tuple{Array{Intervals.Interval{T, L, R}, 1}}, Tuple{R}, Tuple{L}, Tuple{T}} where {T<:Real, L, R}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[64]||(s[64]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[65]||(s[65]=e(`
julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+d5 = domain(1,42,86.9)

source

`,4))]),i("details",N,[i("summary",null,[s[60]||(s[60]=i("a",{id:"ConstraintDomains.domain-Tuple{}-api-00_public",href:"#ConstraintDomains.domain-Tuple{}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[61]||(s[61]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[62]||(s[62]=e('
julia
domain()

Construct an EmptyDomain.

source

',3))]),i("details",_,[i("summary",null,[s[63]||(s[63]=i("a",{id:"ConstraintDomains.domain-Union{Tuple{Array{Interval{T, L, R}, 1}}, Tuple{R}, Tuple{L}, Tuple{T}} where {T<:Real, L, R}-api-00_public",href:"#ConstraintDomains.domain-Union{Tuple{Array{Interval{T, L, R}, 1}}, Tuple{R}, Tuple{L}, Tuple{T}} where {T<:Real, L, R}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[64]||(s[64]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[65]||(s[65]=e(`
julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
 domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

`,3))]),i("details",O,[i("summary",null,[s[66]||(s[66]=i("a",{id:"ConstraintDomains.domain_size-Tuple{ConstraintDomains.Intervals}-api-00_public",href:"#ConstraintDomains.domain_size-Tuple{ConstraintDomains.Intervals}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[67]||(s[67]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[68]||(s[68]=e('
julia
domain_size(itv::Intervals)

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

source

',3))]),i("details",S,[i("summary",null,[s[69]||(s[69]=i("a",{id:"ConstraintDomains.domain_size-Tuple{D} where D<:AbstractDomain-api-00_public",href:"#ConstraintDomains.domain_size-Tuple{D} where D<:AbstractDomain-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[70]||(s[70]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[71]||(s[71]=e('
julia
domain_size(d <: AbstractDomain)

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

source

',3))]),i("details",I,[i("summary",null,[s[72]||(s[72]=i("a",{id:"ConstraintDomains.domain_size-Tuple{D} where D<:DiscreteDomain-api-00_public",href:"#ConstraintDomains.domain_size-Tuple{D} where D<:DiscreteDomain-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[73]||(s[73]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[74]||(s[74]=e('
julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',3))]),i("details",J,[i("summary",null,[s[75]||(s[75]=i("a",{id:"ConstraintDomains.explore!-Tuple{Explorer}-api-00_public",href:"#ConstraintDomains.explore!-Tuple{Explorer}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.explore!")],-1)),s[76]||(s[76]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[77]||(s[77]=e(`
julia
explore!(explorer::Explorer)

Perform exploration on the search space defined by the Explorer object.

This function explores the search space according to the settings specified in the Explorer object. It updates the Explorer's state with found solutions and non-solutions.

Arguments

  • explorer: An Explorer object containing the problem definition and exploration settings.

Returns

Nothing. The Explorer's state is updated in-place.

Example

julia
explorer = Explorer(concepts, domains)
 explore!(explorer)
 println("Solutions found: ", length(explorer.state.solutions))

source

`,10))]),i("details",R,[i("summary",null,[s[78]||(s[78]=i("a",{id:"ConstraintDomains.explore-Tuple{Any, Any}-api-00_public",href:"#ConstraintDomains.explore-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.explore")],-1)),s[79]||(s[79]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[80]||(s[80]=e(`
julia
explore(domains, concept; settings = ExploreSettings(domains), parameters...)

Explore a search space defined by domains and a concept.

Arguments

  • domains: A collection of domains representing the search space.

  • concept: The concept function defining the constraint.

  • settings: An ExploreSettings object to configure the exploration process.

  • parameters: Additional parameters to pass to the concept function.

Returns

A tuple containing two sets: (solutions, non_solutions).

Example

julia
domains = [domain([1, 2, 3]), domain([4, 5, 6])]
-solutions, non_solutions = explore(domains, allunique)

source

`,9))]),i("details",U,[i("summary",null,[s[81]||(s[81]=i("a",{id:"ConstraintDomains.generate_parameters-Tuple{AbstractDomain, Symbol}-api-00_public",href:"#ConstraintDomains.generate_parameters-Tuple{AbstractDomain, Symbol}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.generate_parameters")],-1)),s[82]||(s[82]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[83]||(s[83]=e('
julia
generate_parameters(d<:AbstractDomain, param)

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

source

',3))]),i("details",P,[i("summary",null,[s[84]||(s[84]=i("a",{id:"ConstraintDomains.get_domain-Tuple{D} where D<:AbstractDomain-api-00_public",href:"#ConstraintDomains.get_domain-Tuple{D} where D<:AbstractDomain-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.get_domain")],-1)),s[85]||(s[85]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[86]||(s[86]=e('
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

',3))]),i("details",z,[i("summary",null,[s[87]||(s[87]=i("a",{id:"ConstraintDomains.intersect_domains-Union{Tuple{I2}, Tuple{I1}, Tuple{I1, I2}} where {I1<:Intervals.Interval, I2<:Intervals.Interval}-api-00_public",href:"#ConstraintDomains.intersect_domains-Union{Tuple{I2}, Tuple{I1}, Tuple{I1, I2}} where {I1<:Intervals.Interval, I2<:Intervals.Interval}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains")],-1)),s[88]||(s[88]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[89]||(s[89]=e('
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

',3))]),i("details",G,[i("summary",null,[s[90]||(s[90]=i("a",{id:"ConstraintDomains.merge_domains-Tuple{RangeDomain, RangeDomain}-api-00_public",href:"#ConstraintDomains.merge_domains-Tuple{RangeDomain, RangeDomain}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.merge_domains")],-1)),s[91]||(s[91]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[92]||(s[92]=e('
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

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

source

',3))]),i("details",q,[i("summary",null,[s[93]||(s[93]=i("a",{id:"ConstraintDomains.to_domains-Tuple{Vector{Int64}}-api-00_public",href:"#ConstraintDomains.to_domains-Tuple{Vector{Int64}}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.to_domains")],-1)),s[94]||(s[94]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[95]||(s[95]=e('
julia
to_domains(args...)

Convert various arguments into valid domains format.

source

',3))]),i("details",Q,[i("summary",null,[s[96]||(s[96]=i("a",{id:"Constraints.USUAL_CONSTRAINTS-api-00_public",href:"#Constraints.USUAL_CONSTRAINTS-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.USUAL_CONSTRAINTS")],-1)),s[97]||(s[97]=t()),n(a,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[98]||(s[98]=e('
julia
USUAL_CONSTRAINTS::Dict

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

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

Example

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

source

',6))]),i("details",V,[i("summary",null,[s[99]||(s[99]=i("a",{id:"Constraints.USUAL_SYMMETRIES-api-00_public",href:"#Constraints.USUAL_SYMMETRIES-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.USUAL_SYMMETRIES")],-1)),s[100]||(s[100]=t()),n(a,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[101]||(s[101]=e('
julia
USUAL_SYMMETRIES

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

source

',3))]),i("details",X,[i("summary",null,[s[102]||(s[102]=i("a",{id:"Constraints.Constraint-api-00_public",href:"#Constraints.Constraint-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.Constraint")],-1)),s[103]||(s[103]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[104]||(s[104]=e('
julia
Constraint

Parametric structure with the following fields.

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

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

source

',4))]),i("details",Y,[i("summary",null,[s[105]||(s[105]=i("a",{id:"ConstraintCommons.extract_parameters-api-00_public",href:"#ConstraintCommons.extract_parameters-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.extract_parameters")],-1)),s[106]||(s[106]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[107]||(s[107]=e('
julia
extract_parameters(s::Symbol, constraints_dict=USUAL_CONSTRAINTS; parameters=ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS)

Return the parameters of the constraint s in constraints_dict.

Arguments

  • s::Symbol: the constraint name.

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

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

Example

julia
extract_parameters(:all_different)

source

',7))]),i("details",$,[i("summary",null,[s[108]||(s[108]=i("a",{id:"Constraints.args-Tuple{Constraint}-api-00_public",href:"#Constraints.args-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.args")],-1)),s[109]||(s[109]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[110]||(s[110]=e('
julia
args(c::Constraint)

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

source

',3))]),i("details",K,[i("summary",null,[s[111]||(s[111]=i("a",{id:"Constraints.concept-Tuple{Constraint}-api-00_public",href:"#Constraints.concept-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[112]||(s[112]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[113]||(s[113]=e('
julia
concept(c::Constraint)

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

source

',3))]),i("details",W,[i("summary",null,[s[114]||(s[114]=i("a",{id:"Constraints.concept-Tuple{Symbol, Vararg{Any}}-api-00_public",href:"#Constraints.concept-Tuple{Symbol, Vararg{Any}}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[115]||(s[115]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[116]||(s[116]=e('
julia
concept(s::Symbol, args...; kargs...)

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

Arguments

  • s::Symbol: the constraint name.

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

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

Example

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

source

',7))]),i("details",H,[i("summary",null,[s[117]||(s[117]=i("a",{id:"Constraints.constraints_descriptions-api-00_public",href:"#Constraints.constraints_descriptions-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.constraints_descriptions")],-1)),s[118]||(s[118]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[119]||(s[119]=e('
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

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

Arguments

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

Example

julia
constraints_descriptions()

source

',7))]),i("details",Z,[i("summary",null,[s[120]||(s[120]=i("a",{id:"Constraints.constraints_parameters-api-00_public",href:"#Constraints.constraints_parameters-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.constraints_parameters")],-1)),s[121]||(s[121]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[122]||(s[122]=e('
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

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

Arguments

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

Example

julia
constraints_parameters()

source

',7))]),i("details",ss,[i("summary",null,[s[123]||(s[123]=i("a",{id:"Constraints.describe-api-00_public",href:"#Constraints.describe-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.describe")],-1)),s[124]||(s[124]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[125]||(s[125]=e('
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

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

Arguments

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

  • width::Int: width of the table.

Example

julia
describe()

source

',7))]),i("details",is,[i("summary",null,[s[126]||(s[126]=i("a",{id:"Constraints.error_f-Tuple{Constraint}-api-00_public",href:"#Constraints.error_f-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.error_f")],-1)),s[127]||(s[127]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[128]||(s[128]=e('
julia
error_f(c::Constraint)

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

source

',3))]),i("details",ts,[i("summary",null,[s[129]||(s[129]=i("a",{id:"Constraints.params_length-Tuple{Constraint}-api-00_public",href:"#Constraints.params_length-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.params_length")],-1)),s[130]||(s[130]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[131]||(s[131]=e('
julia
params_length(c::Constraint)

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

source

',3))]),i("details",as,[i("summary",null,[s[132]||(s[132]=i("a",{id:"Constraints.symmetries-Tuple{Constraint}-api-00_public",href:"#Constraints.symmetries-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.symmetries")],-1)),s[133]||(s[133]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[134]||(s[134]=e('
julia
symmetries(c::Constraint)

Return the list of symmetries of c.

source

',3))]),i("details",ns,[i("summary",null,[s[135]||(s[135]=i("a",{id:"CompositionalNetworks.Composition-Union{Tuple{F}, Tuple{F, Any}} where F<:Function-api-00_public",href:"#CompositionalNetworks.Composition-Union{Tuple{F}, Tuple{F, Any}} where F<:Function-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.Composition")],-1)),s[136]||(s[136]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[137]||(s[137]=e('
julia
Composition(f::F, symbols) where {F<:Function}

Construct a Composition.

source

',3))]),i("details",es,[i("summary",null,[s[138]||(s[138]=i("a",{id:"CompositionalNetworks.Composition-api-00_public",href:"#CompositionalNetworks.Composition-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.Composition")],-1)),s[139]||(s[139]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[140]||(s[140]=e('
julia
struct Composition{F<:Function}

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

source

',3))]),i("details",ls,[i("summary",null,[s[141]||(s[141]=i("a",{id:"CompositionalNetworks.ICN-api-00_public",href:"#CompositionalNetworks.ICN-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.ICN")],-1)),s[142]||(s[142]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[143]||(s[143]=e('
julia
ICN(; nvars, dom_size, param, transformation, arithmetic, aggregation, comparison)

Construct an Interpretable Compositional Network, with the following arguments:

  • nvars: number of variable in the constraint

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

  • param: optional parameter (default to nothing)

  • transformation: a transformation layer (optional)

  • arithmetic: a arithmetic layer (optional)

  • aggregation: a aggregation layer (optional)

  • comparison: a comparison layer (optional)

source

',4))]),i("details",os,[i("summary",null,[s[144]||(s[144]=i("a",{id:"CompositionalNetworks.aggregation_layer-Tuple{}-api-00_public",href:"#CompositionalNetworks.aggregation_layer-Tuple{}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.aggregation_layer")],-1)),s[145]||(s[145]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[146]||(s[146]=e('
julia
aggregation_layer()

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

source

',3))]),i("details",ps,[i("summary",null,[s[147]||(s[147]=i("a",{id:"CompositionalNetworks.arithmetic_layer-Tuple{}-api-00_public",href:"#CompositionalNetworks.arithmetic_layer-Tuple{}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.arithmetic_layer")],-1)),s[148]||(s[148]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[149]||(s[149]=e('
julia
arithmetic_layer()

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

source

',3))]),i("details",rs,[i("summary",null,[s[150]||(s[150]=i("a",{id:"CompositionalNetworks.code-api-00_public",href:"#CompositionalNetworks.code-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.code")],-1)),s[151]||(s[151]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[152]||(s[152]=e('
julia
code(c::Composition, lang=:maths; name="composition")

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

source

',3))]),i("details",hs,[i("summary",null,[s[153]||(s[153]=i("a",{id:"CompositionalNetworks.comparison_layer-api-00_public",href:"#CompositionalNetworks.comparison_layer-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.comparison_layer")],-1)),s[154]||(s[154]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[155]||(s[155]=e('
julia
comparison_layer(param = false)

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

source

',3))]),i("details",ds,[i("summary",null,[s[156]||(s[156]=i("a",{id:"CompositionalNetworks.compose-api-00_public",href:"#CompositionalNetworks.compose-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.compose")],-1)),s[157]||(s[157]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[158]||(s[158]=e('
julia
compose(icn, weights=nothing)

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

source

',3))]),i("details",ks,[i("summary",null,[s[159]||(s[159]=i("a",{id:"CompositionalNetworks.compose_to_file!-Tuple{Any, Any, Any}-api-00_public",href:"#CompositionalNetworks.compose_to_file!-Tuple{Any, Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.compose_to_file!")],-1)),s[160]||(s[160]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[161]||(s[161]=e('
julia
compose_to_file!(concept, name, path; domains, param = nothing, language = :Julia, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200)

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

Arguments:

  • concept: the concept to learn

  • name: the name to give to the constraint

  • path: path of the output file

Keywords arguments:

  • domains: domains that defines the search space

  • param: an optional parameter of the constraint

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

  • search: either :partial or :complete search

  • global_iter: number of learning iteration

  • local_iter: number of generation in the genetic algorithm

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

  • popSize: size of the population in the genetic algorithm

source

',7))]),i("details",cs,[i("summary",null,[s[162]||(s[162]=i("a",{id:"CompositionalNetworks.composition-Tuple{Composition}-api-00_public",href:"#CompositionalNetworks.composition-Tuple{Composition}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.composition")],-1)),s[163]||(s[163]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[164]||(s[164]=e('
julia
composition(c::Composition)

Access the actual method of an ICN composition c.

source

',3))]),i("details",gs,[i("summary",null,[s[165]||(s[165]=i("a",{id:"CompositionalNetworks.composition_to_file!-api-00_public",href:"#CompositionalNetworks.composition_to_file!-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.composition_to_file!")],-1)),s[166]||(s[166]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[167]||(s[167]=e('
julia
composition_to_file!(c::Composition, path, name, language=:Julia)

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

source

',3))]),i("details",us,[i("summary",null,[s[168]||(s[168]=i("a",{id:"CompositionalNetworks.explore_learn_compose-Tuple{Any, Any}-api-00_public",href:"#CompositionalNetworks.explore_learn_compose-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.explore_learn_compose")],-1)),s[169]||(s[169]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[170]||(s[170]=e('
julia
explore_learn_compose(concept; domains, param = nothing, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200, action = :composition)

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

Arguments:

  • concept: the concept of the targeted constraint

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

  • param: an optional parameter of the constraint

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

  • global_iter: number of learning iteration

  • local_iter: number of generation in the genetic algorithm

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

  • popSize: size of the population in the genetic algorithm

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

source

',5))]),i("details",ms,[i("summary",null,[s[171]||(s[171]=i("a",{id:"CompositionalNetworks.hamming-Tuple{Any, Any}-api-00_public",href:"#CompositionalNetworks.hamming-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.hamming")],-1)),s[172]||(s[172]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[173]||(s[173]=e('
julia
hamming(x, X)

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

source

',3))]),i("details",bs,[i("summary",null,[s[174]||(s[174]=i("a",{id:"CompositionalNetworks.lazy-Tuple{Vararg{Function}}-api-00_public",href:"#CompositionalNetworks.lazy-Tuple{Vararg{Function}}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.lazy")],-1)),s[175]||(s[175]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[176]||(s[176]=e('
julia
lazy(funcs::Function...)

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

source

',3))]),i("details",ys,[i("summary",null,[s[177]||(s[177]=i("a",{id:"CompositionalNetworks.lazy_param-Tuple{Vararg{Function}}-api-00_public",href:"#CompositionalNetworks.lazy_param-Tuple{Vararg{Function}}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.lazy_param")],-1)),s[178]||(s[178]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[179]||(s[179]=e('
julia
lazy_param(funcs::Function...)

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

source

',3))]),i("details",Cs,[i("summary",null,[s[180]||(s[180]=i("a",{id:"CompositionalNetworks.learn_compose-Tuple{Any, Any, Any}-api-00_public",href:"#CompositionalNetworks.learn_compose-Tuple{Any, Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.learn_compose")],-1)),s[181]||(s[181]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[182]||(s[182]=e(`
julia
learn_compose(;
+solutions, non_solutions = explore(domains, allunique)

source

`,9))]),i("details",U,[i("summary",null,[s[81]||(s[81]=i("a",{id:"ConstraintDomains.generate_parameters-Tuple{AbstractDomain, Symbol}-api-00_public",href:"#ConstraintDomains.generate_parameters-Tuple{AbstractDomain, Symbol}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.generate_parameters")],-1)),s[82]||(s[82]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[83]||(s[83]=e('
julia
generate_parameters(d<:AbstractDomain, param)

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

source

',3))]),i("details",P,[i("summary",null,[s[84]||(s[84]=i("a",{id:"ConstraintDomains.get_domain-Tuple{D} where D<:AbstractDomain-api-00_public",href:"#ConstraintDomains.get_domain-Tuple{D} where D<:AbstractDomain-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.get_domain")],-1)),s[85]||(s[85]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[86]||(s[86]=e('
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

',3))]),i("details",z,[i("summary",null,[s[87]||(s[87]=i("a",{id:"ConstraintDomains.intersect_domains-Union{Tuple{I2}, Tuple{I1}, Tuple{I1, I2}} where {I1<:Interval, I2<:Interval}-api-00_public",href:"#ConstraintDomains.intersect_domains-Union{Tuple{I2}, Tuple{I1}, Tuple{I1, I2}} where {I1<:Interval, I2<:Interval}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains")],-1)),s[88]||(s[88]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[89]||(s[89]=e('
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

',3))]),i("details",G,[i("summary",null,[s[90]||(s[90]=i("a",{id:"ConstraintDomains.merge_domains-Tuple{RangeDomain, RangeDomain}-api-00_public",href:"#ConstraintDomains.merge_domains-Tuple{RangeDomain, RangeDomain}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.merge_domains")],-1)),s[91]||(s[91]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[92]||(s[92]=e('
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

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

source

',3))]),i("details",q,[i("summary",null,[s[93]||(s[93]=i("a",{id:"ConstraintDomains.to_domains-Tuple{Vector{Int64}}-api-00_public",href:"#ConstraintDomains.to_domains-Tuple{Vector{Int64}}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.to_domains")],-1)),s[94]||(s[94]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[95]||(s[95]=e('
julia
to_domains(args...)

Convert various arguments into valid domains format.

source

',3))]),i("details",Q,[i("summary",null,[s[96]||(s[96]=i("a",{id:"Constraints.USUAL_CONSTRAINTS-api-00_public",href:"#Constraints.USUAL_CONSTRAINTS-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.USUAL_CONSTRAINTS")],-1)),s[97]||(s[97]=t()),n(a,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[98]||(s[98]=e('
julia
USUAL_CONSTRAINTS::Dict

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

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

Example

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

source

',6))]),i("details",V,[i("summary",null,[s[99]||(s[99]=i("a",{id:"Constraints.USUAL_SYMMETRIES-api-00_public",href:"#Constraints.USUAL_SYMMETRIES-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.USUAL_SYMMETRIES")],-1)),s[100]||(s[100]=t()),n(a,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[101]||(s[101]=e('
julia
USUAL_SYMMETRIES

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

source

',3))]),i("details",X,[i("summary",null,[s[102]||(s[102]=i("a",{id:"Constraints.Constraint-api-00_public",href:"#Constraints.Constraint-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.Constraint")],-1)),s[103]||(s[103]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[104]||(s[104]=e('
julia
Constraint

Parametric structure with the following fields.

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

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

source

',4))]),i("details",Y,[i("summary",null,[s[105]||(s[105]=i("a",{id:"ConstraintCommons.extract_parameters-api-00_public",href:"#ConstraintCommons.extract_parameters-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.extract_parameters")],-1)),s[106]||(s[106]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[107]||(s[107]=e('
julia
extract_parameters(s::Symbol, constraints_dict=USUAL_CONSTRAINTS; parameters=ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS)

Return the parameters of the constraint s in constraints_dict.

Arguments

  • s::Symbol: the constraint name.

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

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

Example

julia
extract_parameters(:all_different)

source

',7))]),i("details",$,[i("summary",null,[s[108]||(s[108]=i("a",{id:"Constraints.args-Tuple{Constraint}-api-00_public",href:"#Constraints.args-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.args")],-1)),s[109]||(s[109]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[110]||(s[110]=e('
julia
args(c::Constraint)

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

source

',3))]),i("details",K,[i("summary",null,[s[111]||(s[111]=i("a",{id:"Constraints.concept-Tuple{Constraint}-api-00_public",href:"#Constraints.concept-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[112]||(s[112]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[113]||(s[113]=e('
julia
concept(c::Constraint)

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

source

',3))]),i("details",W,[i("summary",null,[s[114]||(s[114]=i("a",{id:"Constraints.concept-Tuple{Symbol, Vararg{Any}}-api-00_public",href:"#Constraints.concept-Tuple{Symbol, Vararg{Any}}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[115]||(s[115]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[116]||(s[116]=e('
julia
concept(s::Symbol, args...; kargs...)

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

Arguments

  • s::Symbol: the constraint name.

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

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

Example

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

source

',7))]),i("details",H,[i("summary",null,[s[117]||(s[117]=i("a",{id:"Constraints.constraints_descriptions-api-00_public",href:"#Constraints.constraints_descriptions-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.constraints_descriptions")],-1)),s[118]||(s[118]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[119]||(s[119]=e('
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

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

Arguments

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

Example

julia
constraints_descriptions()

source

',7))]),i("details",Z,[i("summary",null,[s[120]||(s[120]=i("a",{id:"Constraints.constraints_parameters-api-00_public",href:"#Constraints.constraints_parameters-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.constraints_parameters")],-1)),s[121]||(s[121]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[122]||(s[122]=e('
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

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

Arguments

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

Example

julia
constraints_parameters()

source

',7))]),i("details",ss,[i("summary",null,[s[123]||(s[123]=i("a",{id:"Constraints.describe-api-00_public",href:"#Constraints.describe-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.describe")],-1)),s[124]||(s[124]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[125]||(s[125]=e('
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

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

Arguments

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

  • width::Int: width of the table.

Example

julia
describe()

source

',7))]),i("details",is,[i("summary",null,[s[126]||(s[126]=i("a",{id:"Constraints.error_f-Tuple{Constraint}-api-00_public",href:"#Constraints.error_f-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.error_f")],-1)),s[127]||(s[127]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[128]||(s[128]=e('
julia
error_f(c::Constraint)

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

source

',3))]),i("details",ts,[i("summary",null,[s[129]||(s[129]=i("a",{id:"Constraints.params_length-Tuple{Constraint}-api-00_public",href:"#Constraints.params_length-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.params_length")],-1)),s[130]||(s[130]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[131]||(s[131]=e('
julia
params_length(c::Constraint)

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

source

',3))]),i("details",as,[i("summary",null,[s[132]||(s[132]=i("a",{id:"Constraints.symmetries-Tuple{Constraint}-api-00_public",href:"#Constraints.symmetries-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.symmetries")],-1)),s[133]||(s[133]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[134]||(s[134]=e('
julia
symmetries(c::Constraint)

Return the list of symmetries of c.

source

',3))]),i("details",ns,[i("summary",null,[s[135]||(s[135]=i("a",{id:"CompositionalNetworks.Composition-Union{Tuple{F}, Tuple{F, Any}} where F<:Function-api-00_public",href:"#CompositionalNetworks.Composition-Union{Tuple{F}, Tuple{F, Any}} where F<:Function-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.Composition")],-1)),s[136]||(s[136]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[137]||(s[137]=e('
julia
Composition(f::F, symbols) where {F<:Function}

Construct a Composition.

source

',3))]),i("details",es,[i("summary",null,[s[138]||(s[138]=i("a",{id:"CompositionalNetworks.Composition-api-00_public",href:"#CompositionalNetworks.Composition-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.Composition")],-1)),s[139]||(s[139]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[140]||(s[140]=e('
julia
struct Composition{F<:Function}

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

source

',3))]),i("details",ls,[i("summary",null,[s[141]||(s[141]=i("a",{id:"CompositionalNetworks.ICN-api-00_public",href:"#CompositionalNetworks.ICN-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.ICN")],-1)),s[142]||(s[142]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[143]||(s[143]=e('
julia
ICN(; nvars, dom_size, param, transformation, arithmetic, aggregation, comparison)

Construct an Interpretable Compositional Network, with the following arguments:

  • nvars: number of variable in the constraint

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

  • param: optional parameter (default to nothing)

  • transformation: a transformation layer (optional)

  • arithmetic: a arithmetic layer (optional)

  • aggregation: a aggregation layer (optional)

  • comparison: a comparison layer (optional)

source

',4))]),i("details",os,[i("summary",null,[s[144]||(s[144]=i("a",{id:"CompositionalNetworks.aggregation_layer-Tuple{}-api-00_public",href:"#CompositionalNetworks.aggregation_layer-Tuple{}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.aggregation_layer")],-1)),s[145]||(s[145]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[146]||(s[146]=e('
julia
aggregation_layer()

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

source

',3))]),i("details",ps,[i("summary",null,[s[147]||(s[147]=i("a",{id:"CompositionalNetworks.arithmetic_layer-Tuple{}-api-00_public",href:"#CompositionalNetworks.arithmetic_layer-Tuple{}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.arithmetic_layer")],-1)),s[148]||(s[148]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[149]||(s[149]=e('
julia
arithmetic_layer()

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

source

',3))]),i("details",rs,[i("summary",null,[s[150]||(s[150]=i("a",{id:"CompositionalNetworks.code-api-00_public",href:"#CompositionalNetworks.code-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.code")],-1)),s[151]||(s[151]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[152]||(s[152]=e('
julia
code(c::Composition, lang=:maths; name="composition")

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

source

',3))]),i("details",hs,[i("summary",null,[s[153]||(s[153]=i("a",{id:"CompositionalNetworks.comparison_layer-api-00_public",href:"#CompositionalNetworks.comparison_layer-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.comparison_layer")],-1)),s[154]||(s[154]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[155]||(s[155]=e('
julia
comparison_layer(param = false)

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

source

',3))]),i("details",ds,[i("summary",null,[s[156]||(s[156]=i("a",{id:"CompositionalNetworks.compose-api-00_public",href:"#CompositionalNetworks.compose-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.compose")],-1)),s[157]||(s[157]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[158]||(s[158]=e('
julia
compose(icn, weights=nothing)

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

source

',3))]),i("details",ks,[i("summary",null,[s[159]||(s[159]=i("a",{id:"CompositionalNetworks.compose_to_file!-Tuple{Any, Any, Any}-api-00_public",href:"#CompositionalNetworks.compose_to_file!-Tuple{Any, Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.compose_to_file!")],-1)),s[160]||(s[160]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[161]||(s[161]=e('
julia
compose_to_file!(concept, name, path; domains, param = nothing, language = :Julia, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200)

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

Arguments:

  • concept: the concept to learn

  • name: the name to give to the constraint

  • path: path of the output file

Keywords arguments:

  • domains: domains that defines the search space

  • param: an optional parameter of the constraint

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

  • search: either :partial or :complete search

  • global_iter: number of learning iteration

  • local_iter: number of generation in the genetic algorithm

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

  • popSize: size of the population in the genetic algorithm

source

',7))]),i("details",cs,[i("summary",null,[s[162]||(s[162]=i("a",{id:"CompositionalNetworks.composition-Tuple{Composition}-api-00_public",href:"#CompositionalNetworks.composition-Tuple{Composition}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.composition")],-1)),s[163]||(s[163]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[164]||(s[164]=e('
julia
composition(c::Composition)

Access the actual method of an ICN composition c.

source

',3))]),i("details",gs,[i("summary",null,[s[165]||(s[165]=i("a",{id:"CompositionalNetworks.composition_to_file!-api-00_public",href:"#CompositionalNetworks.composition_to_file!-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.composition_to_file!")],-1)),s[166]||(s[166]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[167]||(s[167]=e('
julia
composition_to_file!(c::Composition, path, name, language=:Julia)

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

source

',3))]),i("details",us,[i("summary",null,[s[168]||(s[168]=i("a",{id:"CompositionalNetworks.explore_learn_compose-Tuple{Any, Any}-api-00_public",href:"#CompositionalNetworks.explore_learn_compose-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.explore_learn_compose")],-1)),s[169]||(s[169]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[170]||(s[170]=e('
julia
explore_learn_compose(concept; domains, param = nothing, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200, action = :composition)

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

Arguments:

  • concept: the concept of the targeted constraint

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

  • param: an optional parameter of the constraint

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

  • global_iter: number of learning iteration

  • local_iter: number of generation in the genetic algorithm

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

  • popSize: size of the population in the genetic algorithm

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

source

',5))]),i("details",ms,[i("summary",null,[s[171]||(s[171]=i("a",{id:"CompositionalNetworks.hamming-Tuple{Any, Any}-api-00_public",href:"#CompositionalNetworks.hamming-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.hamming")],-1)),s[172]||(s[172]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[173]||(s[173]=e('
julia
hamming(x, X)

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

source

',3))]),i("details",bs,[i("summary",null,[s[174]||(s[174]=i("a",{id:"CompositionalNetworks.lazy-Tuple{Vararg{Function}}-api-00_public",href:"#CompositionalNetworks.lazy-Tuple{Vararg{Function}}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.lazy")],-1)),s[175]||(s[175]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[176]||(s[176]=e('
julia
lazy(funcs::Function...)

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

source

',3))]),i("details",ys,[i("summary",null,[s[177]||(s[177]=i("a",{id:"CompositionalNetworks.lazy_param-Tuple{Vararg{Function}}-api-00_public",href:"#CompositionalNetworks.lazy_param-Tuple{Vararg{Function}}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.lazy_param")],-1)),s[178]||(s[178]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[179]||(s[179]=e('
julia
lazy_param(funcs::Function...)

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

source

',3))]),i("details",Cs,[i("summary",null,[s[180]||(s[180]=i("a",{id:"CompositionalNetworks.learn_compose-Tuple{Any, Any, Any}-api-00_public",href:"#CompositionalNetworks.learn_compose-Tuple{Any, Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.learn_compose")],-1)),s[181]||(s[181]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[182]||(s[182]=e(`
julia
learn_compose(;
     nvars, dom_size, param=nothing, icn=ICN(nvars, dom_size, param),
     X, X_sols, global_iter=100, local_iter=100, metric=hamming, popSize=200
 )

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

source

`,3))]),i("details",Es,[i("summary",null,[s[183]||(s[183]=i("a",{id:"CompositionalNetworks.manhattan-Tuple{Any, Any}-api-00_public",href:"#CompositionalNetworks.manhattan-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.manhattan")],-1)),s[184]||(s[184]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[185]||(s[185]=e('
julia
manhattan(x, X)

source

',2))]),i("details",js,[i("summary",null,[s[186]||(s[186]=i("a",{id:"CompositionalNetworks.minkowski-Tuple{Any, Any, Any}-api-00_public",href:"#CompositionalNetworks.minkowski-Tuple{Any, Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.minkowski")],-1)),s[187]||(s[187]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[188]||(s[188]=e('
julia
minkowski(x, X, p)

source

',2))]),i("details",vs,[i("summary",null,[s[189]||(s[189]=i("a",{id:"CompositionalNetworks.nbits-Tuple{Any}-api-00_public",href:"#CompositionalNetworks.nbits-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.nbits")],-1)),s[190]||(s[190]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[191]||(s[191]=e('
julia
nbits(icn)

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

source

',3))]),i("details",Fs,[i("summary",null,[s[192]||(s[192]=i("a",{id:"CompositionalNetworks.regularization-Tuple{Any}-api-00_public",href:"#CompositionalNetworks.regularization-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.regularization")],-1)),s[193]||(s[193]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[194]||(s[194]=e('
julia
regularization(icn)

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

source

',3))]),i("details",fs,[i("summary",null,[s[195]||(s[195]=i("a",{id:"CompositionalNetworks.show_layers-Tuple{Any}-api-00_public",href:"#CompositionalNetworks.show_layers-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.show_layers")],-1)),s[196]||(s[196]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[197]||(s[197]=e('
julia
show_layers(icn)

Return a formatted string with each layers in the icn.

source

',3))]),i("details",Ts,[i("summary",null,[s[198]||(s[198]=i("a",{id:"CompositionalNetworks.symbols-Tuple{Composition}-api-00_public",href:"#CompositionalNetworks.symbols-Tuple{Composition}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.symbols")],-1)),s[199]||(s[199]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[200]||(s[200]=e('
julia
symbols(c::Composition)

Output the composition as a layered collection of Symbols.

source

',3))]),i("details",As,[i("summary",null,[s[201]||(s[201]=i("a",{id:"CompositionalNetworks.transformation_layer-api-00_public",href:"#CompositionalNetworks.transformation_layer-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.transformation_layer")],-1)),s[202]||(s[202]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[203]||(s[203]=e('
julia
transformation_layer(param = Vector{Symbol}())

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

source

',3))]),i("details",Ds,[i("summary",null,[s[204]||(s[204]=i("a",{id:"CompositionalNetworks.weights!-Tuple{Any, Any}-api-00_public",href:"#CompositionalNetworks.weights!-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.weights!")],-1)),s[205]||(s[205]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[206]||(s[206]=e('
julia
weights!(icn, weights)

Set the weights of an ICN with a BitVector.

source

',3))]),i("details",xs,[i("summary",null,[s[207]||(s[207]=i("a",{id:"CompositionalNetworks.weights-Tuple{Any}-api-00_public",href:"#CompositionalNetworks.weights-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.weights")],-1)),s[208]||(s[208]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[209]||(s[209]=e('
julia
weights(icn)

Access the current set of weights of an ICN.

source

',3))]),i("details",Bs,[i("summary",null,[s[210]||(s[210]=i("a",{id:"CompositionalNetworks.weights_bias-Tuple{Any}-api-00_public",href:"#CompositionalNetworks.weights_bias-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.weights_bias")],-1)),s[211]||(s[211]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[212]||(s[212]=e('
julia
weights_bias(x)

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

source

',3))]),i("details",Ls,[i("summary",null,[s[213]||(s[213]=i("a",{id:"QUBOConstraints.QUBO_linear_sum-Tuple{Any, Any}-api-00_public",href:"#QUBOConstraints.QUBO_linear_sum-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"QUBOConstraints.QUBO_linear_sum")],-1)),s[214]||(s[214]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[215]||(s[215]=e('
julia
QUBO_linear_sum(n, σ)

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

source

',3))]),i("details",ws,[i("summary",null,[s[216]||(s[216]=i("a",{id:"QUBOConstraints.binarize-Union{Tuple{Vector{T}}, Tuple{T}, Tuple{Vector{T}, Any}} where T<:Number-api-00_public",href:"#QUBOConstraints.binarize-Union{Tuple{Vector{T}}, Tuple{T}, Tuple{Vector{T}, Any}} where T<:Number-api-00_public"},[i("span",{class:"jlbinding"},"QUBOConstraints.binarize")],-1)),s[217]||(s[217]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[218]||(s[218]=e('
julia
binarize(x[, domain]; binarization = :one_hot)

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

source

',3))]),i("details",Ms,[i("summary",null,[s[219]||(s[219]=i("a",{id:"QUBOConstraints.debinarize-Tuple{Any}-api-00_public",href:"#QUBOConstraints.debinarize-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"QUBOConstraints.debinarize")],-1)),s[220]||(s[220]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[221]||(s[221]=e('
julia
debinarize(x[, domain]; binarization = :one_hot)

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

source

',3))]),i("details",Ns,[i("summary",null,[s[222]||(s[222]=i("a",{id:"QUBOConstraints.is_valid-api-00_public",href:"#QUBOConstraints.is_valid-api-00_public"},[i("span",{class:"jlbinding"},"QUBOConstraints.is_valid")],-1)),s[223]||(s[223]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[224]||(s[224]=e('
julia
is_valid(x, encoding::Symbol = :none)

Check if x has a valid format for encoding.

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

source

',4))]),i("details",_s,[i("summary",null,[s[225]||(s[225]=i("a",{id:"QUBOConstraints.train-Tuple-api-00_public",href:"#QUBOConstraints.train-Tuple-api-00_public"},[i("span",{class:"jlbinding"},"QUBOConstraints.train")],-1)),s[226]||(s[226]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[227]||(s[227]=e('
julia
train(args...)

Default train method for any AbstractOptimizer.

source

',3))]),i("details",Os,[i("summary",null,[s[228]||(s[228]=i("a",{id:"ConstraintsTranslator.GoogleLLM-api-00_public",href:"#ConstraintsTranslator.GoogleLLM-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.GoogleLLM")],-1)),s[229]||(s[229]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[235]||(s[235]=e('
julia
Google LLM

Structure encapsulating the parameters for accessing the Google LLM API.

',2)),i("ul",null,[s[233]||(s[233]=i("li",null,[i("p",null,[i("code",null,"api_key"),t(": an API key for accessing the Google Gemini API ("),i("code",null,"https://ai.google.dev/gemini-api/docs/"),t("), read from the environmental variable "),i("code",null,"GOOGLE_API_KEY"),t(".")])],-1)),s[234]||(s[234]=i("li",null,[i("p",null,[i("code",null,"model_id"),t(": a string identifier for the model to query. See "),i("code",null,"https://ai.google.dev/gemini-api/docs/models/gemini"),t(" for the list of available models.")])],-1)),i("li",null,[i("p",null,[s[230]||(s[230]=i("code",null,"url",-1)),s[231]||(s[231]=t(": URL for chat completions. Defaults to ")),i("code",null,"https://generativelanguage.googleapis.com/v1beta/models/"+r(l.model_id),1),s[232]||(s[232]=t("."))])])]),s[236]||(s[236]=i("p",null,[i("a",{href:"https://github.com/JuliaConstraints/ConstraintsTranslator.jl/blob/v0.0.2/src/llm.jl#L30-L38",target:"_blank",rel:"noreferrer"},"source")],-1))]),i("details",Ss,[i("summary",null,[s[237]||(s[237]=i("a",{id:"ConstraintsTranslator.GroqLLM-api-00_public",href:"#ConstraintsTranslator.GroqLLM-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.GroqLLM")],-1)),s[238]||(s[238]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[239]||(s[239]=e('
julia
GroqLLM

Structure encapsulating the parameters for accessing the Groq LLM API.

source

',4))]),i("details",Is,[i("summary",null,[s[240]||(s[240]=i("a",{id:"ConstraintsTranslator.LlamaCppLLM-api-00_public",href:"#ConstraintsTranslator.LlamaCppLLM-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.LlamaCppLLM")],-1)),s[241]||(s[241]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[242]||(s[242]=e('
julia
LlamaCppLLM

Structure encapsulating the parameters for accessing the llama.cpp server API.

  • api_key: an optional API key for accessing the server

  • model_id: a string identifier for the model to query. Unused, kept for API compatibility.

  • url: the URL of the llama.cpp server OpenAI API endpoint (e.g., http://localhost:8080)

NOTE: we do not apply the appropriate chat templates to the prompt. This must be handled either in an external code path or by the server.

source

',5))]),i("details",Js,[i("summary",null,[s[243]||(s[243]=i("a",{id:"ConstraintsTranslator.Prompt-api-00_public",href:"#ConstraintsTranslator.Prompt-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.Prompt")],-1)),s[244]||(s[244]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[245]||(s[245]=e('
julia
Prompt

Simple data structure encapsulating a system prompt and a user prompt for LLM generation.

Fields

  • system: the system prompt.

  • user: the user prompt.

source

',5))]),i("details",Rs,[i("summary",null,[s[246]||(s[246]=i("a",{id:"ConstraintsTranslator.PromptTemplate-api-00_public",href:"#ConstraintsTranslator.PromptTemplate-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.PromptTemplate")],-1)),s[247]||(s[247]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[248]||(s[248]=e('
julia
PromptTemplate

Represents a complete prompt template, comprising metadata, system, and user messages.

Fields

  • metadata::MetadataMessage: The metadata message of the prompt template.

  • system::SystemMessage: The system message of the prompt template.

  • user::UserMessage: The user message of the prompt template.

source

',5))]),i("details",Us,[i("summary",null,[s[249]||(s[249]=i("a",{id:"ConstraintsTranslator.format_template-Tuple{PromptTemplate}-api-00_public",href:"#ConstraintsTranslator.format_template-Tuple{PromptTemplate}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.format_template")],-1)),s[250]||(s[250]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[251]||(s[251]=e('
julia
format_template(template::PromptTemplate; kwargs...)::Prompt

Formats a PromptTemplate by substituting all variables in the system and user messages with user-provided values.

Arguments

  • template::PromptTemplate: The prompt template containing metadata, system, and user messages.

  • kwargs...: A variable number of keyword arguments where keys are variable names and values are the corresponding replacements.

Returns

  • Prompt: A Prompt struct with the system and user messages containing the substituted values.

Raises

  • ErrorException: If any variables specified in the system or user templates are not present in the kwargs.

  • Warning: If there are extra kwargs that are not used in the templates.

source

',9))]),i("details",Ps,[i("summary",null,[s[252]||(s[252]=i("a",{id:"ConstraintsTranslator.get_completion-Tuple{AbstractLLM, ConstraintsTranslator.AbstractPrompt}-api-00_public",href:"#ConstraintsTranslator.get_completion-Tuple{AbstractLLM, ConstraintsTranslator.AbstractPrompt}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.get_completion")],-1)),s[253]||(s[253]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[254]||(s[254]=e('
julia
get_completion(llm::AbstractLLM, prompt::AbstractPrompt)

Returns a completion for a prompt using the llm model API.

source

',3))]),i("details",zs,[i("summary",null,[s[255]||(s[255]=i("a",{id:"ConstraintsTranslator.get_completion-Tuple{ConstraintsTranslator.OpenAILLM, Prompt}-api-00_public",href:"#ConstraintsTranslator.get_completion-Tuple{ConstraintsTranslator.OpenAILLM, Prompt}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.get_completion")],-1)),s[256]||(s[256]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[257]||(s[257]=e('
julia
get_completion(llm::OpenAILLM, prompt::Prompt)

Returns a completion for the given prompt using an OpenAI API compatible LLM

source

',3))]),i("details",Gs,[i("summary",null,[s[258]||(s[258]=i("a",{id:"ConstraintsTranslator.get_completion-Tuple{GoogleLLM, Prompt}-api-00_public",href:"#ConstraintsTranslator.get_completion-Tuple{GoogleLLM, Prompt}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.get_completion")],-1)),s[259]||(s[259]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[260]||(s[260]=e('
julia
get_completion(llm::GoogleLLM, prompt::Prompt)

Returns a completion for the given prompt using the Google Gemini LLM API.

source

',3))]),i("details",qs,[i("summary",null,[s[261]||(s[261]=i("a",{id:"ConstraintsTranslator.parse_code-Tuple{String}-api-00_public",href:"#ConstraintsTranslator.parse_code-Tuple{String}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.parse_code")],-1)),s[262]||(s[262]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[263]||(s[263]=e('
julia
parse_code(s::String)

Parse the code blocks in the input string s delimited by triple backticks and an optional language annotation. Returns a dictionary keyed by language. Code blocks from the same language are concatenated.

source

',3))]),i("details",Qs,[i("summary",null,[s[264]||(s[264]=i("a",{id:"ConstraintsTranslator.read_template-Tuple{String}-api-00_public",href:"#ConstraintsTranslator.read_template-Tuple{String}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.read_template")],-1)),s[265]||(s[265]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[266]||(s[266]=e('
julia
read_template(data_path::String)

Reads a prompt template from a JSON file specified by data_path. The function parses the JSON data and constructs a PromptTemplate object containing metadata, system, and user messages. TODO: validate the JSON data against a schema to ensure it is valid before parsing.

Arguments

  • data_path::String: The path to the JSON file containing the prompt template.

Returns

  • PromptTemplate: A PromptTemplate structure encapsulating the metadata, system, and user messages.

Raises

  • ErrorException: if the template does not match the specification format.

source

',9))]),i("details",Vs,[i("summary",null,[s[267]||(s[267]=i("a",{id:"ConstraintsTranslator.stream_completion-Tuple{AbstractLLM, ConstraintsTranslator.AbstractPrompt}-api-00_public",href:"#ConstraintsTranslator.stream_completion-Tuple{AbstractLLM, ConstraintsTranslator.AbstractPrompt}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.stream_completion")],-1)),s[268]||(s[268]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[269]||(s[269]=e('
julia
stream_completion(llm::AbstractLLM, prompt::AbstractPrompt)

Returns a completion for a prompt using the llm model API. The completion is streamed to the terminal as it is generated.

source

',3))]),i("details",Xs,[i("summary",null,[s[270]||(s[270]=i("a",{id:"ConstraintsTranslator.stream_completion-Tuple{ConstraintsTranslator.OpenAILLM, Prompt}-api-00_public",href:"#ConstraintsTranslator.stream_completion-Tuple{ConstraintsTranslator.OpenAILLM, Prompt}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.stream_completion")],-1)),s[271]||(s[271]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[272]||(s[272]=e('
julia
stream_completion(llm::OpenAILLM, prompt::Prompt)

Returns a completion for the given prompt using an OpenAI API compatible model. The completion is streamed to the terminal as it is generated.

source

',3))]),i("details",Ys,[i("summary",null,[s[273]||(s[273]=i("a",{id:"ConstraintsTranslator.stream_completion-Tuple{GoogleLLM, Prompt}-api-00_public",href:"#ConstraintsTranslator.stream_completion-Tuple{GoogleLLM, Prompt}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.stream_completion")],-1)),s[274]||(s[274]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[275]||(s[275]=e('
julia
stream_completion(llm::GoogleLLM, prompt::Prompt)

Returns a completion for the given prompt using the Google Gemini LLM API. The completion is streamed to the terminal as it is generated.

source

',3))]),i("details",$s,[i("summary",null,[s[276]||(s[276]=i("a",{id:"ConstraintsTranslator.translate-Tuple{AbstractLLM, AbstractString}-api-00_public",href:"#ConstraintsTranslator.translate-Tuple{AbstractLLM, AbstractString}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.translate")],-1)),s[277]||(s[277]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[278]||(s[278]=e('
julia
translate(model::AbstractLLM, description::AbstractString; interactive::Bool = false)

Translate the natural-language description of an optimization problem into a Constraint Programming model by querying the Large Language Model model. If interactive, the user will be prompted via the command line to inspect the intermediate outputs of the LLM, and possibly modify them.

source

',3))])])}const ai=o(k,[["render",Ks]]);export{ti as __pageData,ai as default}; diff --git a/dev/assets/api_00_public.md.D5arbpZy.lean.js b/dev/assets/api_00_public.md.Cqf6QMJN.lean.js similarity index 68% rename from dev/assets/api_00_public.md.D5arbpZy.lean.js rename to dev/assets/api_00_public.md.Cqf6QMJN.lean.js index bf7edf0..ecda81d 100644 --- a/dev/assets/api_00_public.md.D5arbpZy.lean.js +++ b/dev/assets/api_00_public.md.Cqf6QMJN.lean.js @@ -13,11 +13,11 @@ import{_ as o,c as p,j as i,a as t,G as n,a5 as e,t as r,B as h,o as d}from"./ch d2 = domain([53.69, 89.2, 0.12]) d3 = domain([2//3, 89//123]) d4 = domain(4.3) -d5 = domain(1,42,86.9)

source

`,4))]),i("details",N,[i("summary",null,[s[60]||(s[60]=i("a",{id:"ConstraintDomains.domain-Tuple{}-api-00_public",href:"#ConstraintDomains.domain-Tuple{}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[61]||(s[61]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[62]||(s[62]=e('
julia
domain()

Construct an EmptyDomain.

source

',3))]),i("details",_,[i("summary",null,[s[63]||(s[63]=i("a",{id:"ConstraintDomains.domain-Union{Tuple{Array{Intervals.Interval{T, L, R}, 1}}, Tuple{R}, Tuple{L}, Tuple{T}} where {T<:Real, L, R}-api-00_public",href:"#ConstraintDomains.domain-Union{Tuple{Array{Intervals.Interval{T, L, R}, 1}}, Tuple{R}, Tuple{L}, Tuple{T}} where {T<:Real, L, R}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[64]||(s[64]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[65]||(s[65]=e(`
julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+d5 = domain(1,42,86.9)

source

`,4))]),i("details",N,[i("summary",null,[s[60]||(s[60]=i("a",{id:"ConstraintDomains.domain-Tuple{}-api-00_public",href:"#ConstraintDomains.domain-Tuple{}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[61]||(s[61]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[62]||(s[62]=e('
julia
domain()

Construct an EmptyDomain.

source

',3))]),i("details",_,[i("summary",null,[s[63]||(s[63]=i("a",{id:"ConstraintDomains.domain-Union{Tuple{Array{Interval{T, L, R}, 1}}, Tuple{R}, Tuple{L}, Tuple{T}} where {T<:Real, L, R}-api-00_public",href:"#ConstraintDomains.domain-Union{Tuple{Array{Interval{T, L, R}, 1}}, Tuple{R}, Tuple{L}, Tuple{T}} where {T<:Real, L, R}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[64]||(s[64]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[65]||(s[65]=e(`
julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
 domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

`,3))]),i("details",O,[i("summary",null,[s[66]||(s[66]=i("a",{id:"ConstraintDomains.domain_size-Tuple{ConstraintDomains.Intervals}-api-00_public",href:"#ConstraintDomains.domain_size-Tuple{ConstraintDomains.Intervals}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[67]||(s[67]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[68]||(s[68]=e('
julia
domain_size(itv::Intervals)

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

source

',3))]),i("details",S,[i("summary",null,[s[69]||(s[69]=i("a",{id:"ConstraintDomains.domain_size-Tuple{D} where D<:AbstractDomain-api-00_public",href:"#ConstraintDomains.domain_size-Tuple{D} where D<:AbstractDomain-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[70]||(s[70]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[71]||(s[71]=e('
julia
domain_size(d <: AbstractDomain)

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

source

',3))]),i("details",I,[i("summary",null,[s[72]||(s[72]=i("a",{id:"ConstraintDomains.domain_size-Tuple{D} where D<:DiscreteDomain-api-00_public",href:"#ConstraintDomains.domain_size-Tuple{D} where D<:DiscreteDomain-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[73]||(s[73]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[74]||(s[74]=e('
julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',3))]),i("details",J,[i("summary",null,[s[75]||(s[75]=i("a",{id:"ConstraintDomains.explore!-Tuple{Explorer}-api-00_public",href:"#ConstraintDomains.explore!-Tuple{Explorer}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.explore!")],-1)),s[76]||(s[76]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[77]||(s[77]=e(`
julia
explore!(explorer::Explorer)

Perform exploration on the search space defined by the Explorer object.

This function explores the search space according to the settings specified in the Explorer object. It updates the Explorer's state with found solutions and non-solutions.

Arguments

  • explorer: An Explorer object containing the problem definition and exploration settings.

Returns

Nothing. The Explorer's state is updated in-place.

Example

julia
explorer = Explorer(concepts, domains)
 explore!(explorer)
 println("Solutions found: ", length(explorer.state.solutions))

source

`,10))]),i("details",R,[i("summary",null,[s[78]||(s[78]=i("a",{id:"ConstraintDomains.explore-Tuple{Any, Any}-api-00_public",href:"#ConstraintDomains.explore-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.explore")],-1)),s[79]||(s[79]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[80]||(s[80]=e(`
julia
explore(domains, concept; settings = ExploreSettings(domains), parameters...)

Explore a search space defined by domains and a concept.

Arguments

  • domains: A collection of domains representing the search space.

  • concept: The concept function defining the constraint.

  • settings: An ExploreSettings object to configure the exploration process.

  • parameters: Additional parameters to pass to the concept function.

Returns

A tuple containing two sets: (solutions, non_solutions).

Example

julia
domains = [domain([1, 2, 3]), domain([4, 5, 6])]
-solutions, non_solutions = explore(domains, allunique)

source

`,9))]),i("details",U,[i("summary",null,[s[81]||(s[81]=i("a",{id:"ConstraintDomains.generate_parameters-Tuple{AbstractDomain, Symbol}-api-00_public",href:"#ConstraintDomains.generate_parameters-Tuple{AbstractDomain, Symbol}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.generate_parameters")],-1)),s[82]||(s[82]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[83]||(s[83]=e('
julia
generate_parameters(d<:AbstractDomain, param)

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

source

',3))]),i("details",P,[i("summary",null,[s[84]||(s[84]=i("a",{id:"ConstraintDomains.get_domain-Tuple{D} where D<:AbstractDomain-api-00_public",href:"#ConstraintDomains.get_domain-Tuple{D} where D<:AbstractDomain-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.get_domain")],-1)),s[85]||(s[85]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[86]||(s[86]=e('
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

',3))]),i("details",z,[i("summary",null,[s[87]||(s[87]=i("a",{id:"ConstraintDomains.intersect_domains-Union{Tuple{I2}, Tuple{I1}, Tuple{I1, I2}} where {I1<:Intervals.Interval, I2<:Intervals.Interval}-api-00_public",href:"#ConstraintDomains.intersect_domains-Union{Tuple{I2}, Tuple{I1}, Tuple{I1, I2}} where {I1<:Intervals.Interval, I2<:Intervals.Interval}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains")],-1)),s[88]||(s[88]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[89]||(s[89]=e('
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

',3))]),i("details",G,[i("summary",null,[s[90]||(s[90]=i("a",{id:"ConstraintDomains.merge_domains-Tuple{RangeDomain, RangeDomain}-api-00_public",href:"#ConstraintDomains.merge_domains-Tuple{RangeDomain, RangeDomain}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.merge_domains")],-1)),s[91]||(s[91]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[92]||(s[92]=e('
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

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

source

',3))]),i("details",q,[i("summary",null,[s[93]||(s[93]=i("a",{id:"ConstraintDomains.to_domains-Tuple{Vector{Int64}}-api-00_public",href:"#ConstraintDomains.to_domains-Tuple{Vector{Int64}}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.to_domains")],-1)),s[94]||(s[94]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[95]||(s[95]=e('
julia
to_domains(args...)

Convert various arguments into valid domains format.

source

',3))]),i("details",Q,[i("summary",null,[s[96]||(s[96]=i("a",{id:"Constraints.USUAL_CONSTRAINTS-api-00_public",href:"#Constraints.USUAL_CONSTRAINTS-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.USUAL_CONSTRAINTS")],-1)),s[97]||(s[97]=t()),n(a,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[98]||(s[98]=e('
julia
USUAL_CONSTRAINTS::Dict

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

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

Example

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

source

',6))]),i("details",V,[i("summary",null,[s[99]||(s[99]=i("a",{id:"Constraints.USUAL_SYMMETRIES-api-00_public",href:"#Constraints.USUAL_SYMMETRIES-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.USUAL_SYMMETRIES")],-1)),s[100]||(s[100]=t()),n(a,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[101]||(s[101]=e('
julia
USUAL_SYMMETRIES

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

source

',3))]),i("details",X,[i("summary",null,[s[102]||(s[102]=i("a",{id:"Constraints.Constraint-api-00_public",href:"#Constraints.Constraint-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.Constraint")],-1)),s[103]||(s[103]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[104]||(s[104]=e('
julia
Constraint

Parametric structure with the following fields.

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

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

source

',4))]),i("details",Y,[i("summary",null,[s[105]||(s[105]=i("a",{id:"ConstraintCommons.extract_parameters-api-00_public",href:"#ConstraintCommons.extract_parameters-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.extract_parameters")],-1)),s[106]||(s[106]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[107]||(s[107]=e('
julia
extract_parameters(s::Symbol, constraints_dict=USUAL_CONSTRAINTS; parameters=ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS)

Return the parameters of the constraint s in constraints_dict.

Arguments

  • s::Symbol: the constraint name.

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

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

Example

julia
extract_parameters(:all_different)

source

',7))]),i("details",$,[i("summary",null,[s[108]||(s[108]=i("a",{id:"Constraints.args-Tuple{Constraint}-api-00_public",href:"#Constraints.args-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.args")],-1)),s[109]||(s[109]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[110]||(s[110]=e('
julia
args(c::Constraint)

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

source

',3))]),i("details",K,[i("summary",null,[s[111]||(s[111]=i("a",{id:"Constraints.concept-Tuple{Constraint}-api-00_public",href:"#Constraints.concept-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[112]||(s[112]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[113]||(s[113]=e('
julia
concept(c::Constraint)

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

source

',3))]),i("details",W,[i("summary",null,[s[114]||(s[114]=i("a",{id:"Constraints.concept-Tuple{Symbol, Vararg{Any}}-api-00_public",href:"#Constraints.concept-Tuple{Symbol, Vararg{Any}}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[115]||(s[115]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[116]||(s[116]=e('
julia
concept(s::Symbol, args...; kargs...)

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

Arguments

  • s::Symbol: the constraint name.

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

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

Example

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

source

',7))]),i("details",H,[i("summary",null,[s[117]||(s[117]=i("a",{id:"Constraints.constraints_descriptions-api-00_public",href:"#Constraints.constraints_descriptions-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.constraints_descriptions")],-1)),s[118]||(s[118]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[119]||(s[119]=e('
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

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

Arguments

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

Example

julia
constraints_descriptions()

source

',7))]),i("details",Z,[i("summary",null,[s[120]||(s[120]=i("a",{id:"Constraints.constraints_parameters-api-00_public",href:"#Constraints.constraints_parameters-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.constraints_parameters")],-1)),s[121]||(s[121]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[122]||(s[122]=e('
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

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

Arguments

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

Example

julia
constraints_parameters()

source

',7))]),i("details",ss,[i("summary",null,[s[123]||(s[123]=i("a",{id:"Constraints.describe-api-00_public",href:"#Constraints.describe-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.describe")],-1)),s[124]||(s[124]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[125]||(s[125]=e('
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

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

Arguments

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

  • width::Int: width of the table.

Example

julia
describe()

source

',7))]),i("details",is,[i("summary",null,[s[126]||(s[126]=i("a",{id:"Constraints.error_f-Tuple{Constraint}-api-00_public",href:"#Constraints.error_f-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.error_f")],-1)),s[127]||(s[127]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[128]||(s[128]=e('
julia
error_f(c::Constraint)

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

source

',3))]),i("details",ts,[i("summary",null,[s[129]||(s[129]=i("a",{id:"Constraints.params_length-Tuple{Constraint}-api-00_public",href:"#Constraints.params_length-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.params_length")],-1)),s[130]||(s[130]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[131]||(s[131]=e('
julia
params_length(c::Constraint)

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

source

',3))]),i("details",as,[i("summary",null,[s[132]||(s[132]=i("a",{id:"Constraints.symmetries-Tuple{Constraint}-api-00_public",href:"#Constraints.symmetries-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.symmetries")],-1)),s[133]||(s[133]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[134]||(s[134]=e('
julia
symmetries(c::Constraint)

Return the list of symmetries of c.

source

',3))]),i("details",ns,[i("summary",null,[s[135]||(s[135]=i("a",{id:"CompositionalNetworks.Composition-Union{Tuple{F}, Tuple{F, Any}} where F<:Function-api-00_public",href:"#CompositionalNetworks.Composition-Union{Tuple{F}, Tuple{F, Any}} where F<:Function-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.Composition")],-1)),s[136]||(s[136]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[137]||(s[137]=e('
julia
Composition(f::F, symbols) where {F<:Function}

Construct a Composition.

source

',3))]),i("details",es,[i("summary",null,[s[138]||(s[138]=i("a",{id:"CompositionalNetworks.Composition-api-00_public",href:"#CompositionalNetworks.Composition-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.Composition")],-1)),s[139]||(s[139]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[140]||(s[140]=e('
julia
struct Composition{F<:Function}

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

source

',3))]),i("details",ls,[i("summary",null,[s[141]||(s[141]=i("a",{id:"CompositionalNetworks.ICN-api-00_public",href:"#CompositionalNetworks.ICN-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.ICN")],-1)),s[142]||(s[142]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[143]||(s[143]=e('
julia
ICN(; nvars, dom_size, param, transformation, arithmetic, aggregation, comparison)

Construct an Interpretable Compositional Network, with the following arguments:

  • nvars: number of variable in the constraint

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

  • param: optional parameter (default to nothing)

  • transformation: a transformation layer (optional)

  • arithmetic: a arithmetic layer (optional)

  • aggregation: a aggregation layer (optional)

  • comparison: a comparison layer (optional)

source

',4))]),i("details",os,[i("summary",null,[s[144]||(s[144]=i("a",{id:"CompositionalNetworks.aggregation_layer-Tuple{}-api-00_public",href:"#CompositionalNetworks.aggregation_layer-Tuple{}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.aggregation_layer")],-1)),s[145]||(s[145]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[146]||(s[146]=e('
julia
aggregation_layer()

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

source

',3))]),i("details",ps,[i("summary",null,[s[147]||(s[147]=i("a",{id:"CompositionalNetworks.arithmetic_layer-Tuple{}-api-00_public",href:"#CompositionalNetworks.arithmetic_layer-Tuple{}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.arithmetic_layer")],-1)),s[148]||(s[148]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[149]||(s[149]=e('
julia
arithmetic_layer()

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

source

',3))]),i("details",rs,[i("summary",null,[s[150]||(s[150]=i("a",{id:"CompositionalNetworks.code-api-00_public",href:"#CompositionalNetworks.code-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.code")],-1)),s[151]||(s[151]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[152]||(s[152]=e('
julia
code(c::Composition, lang=:maths; name="composition")

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

source

',3))]),i("details",hs,[i("summary",null,[s[153]||(s[153]=i("a",{id:"CompositionalNetworks.comparison_layer-api-00_public",href:"#CompositionalNetworks.comparison_layer-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.comparison_layer")],-1)),s[154]||(s[154]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[155]||(s[155]=e('
julia
comparison_layer(param = false)

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

source

',3))]),i("details",ds,[i("summary",null,[s[156]||(s[156]=i("a",{id:"CompositionalNetworks.compose-api-00_public",href:"#CompositionalNetworks.compose-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.compose")],-1)),s[157]||(s[157]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[158]||(s[158]=e('
julia
compose(icn, weights=nothing)

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

source

',3))]),i("details",ks,[i("summary",null,[s[159]||(s[159]=i("a",{id:"CompositionalNetworks.compose_to_file!-Tuple{Any, Any, Any}-api-00_public",href:"#CompositionalNetworks.compose_to_file!-Tuple{Any, Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.compose_to_file!")],-1)),s[160]||(s[160]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[161]||(s[161]=e('
julia
compose_to_file!(concept, name, path; domains, param = nothing, language = :Julia, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200)

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

Arguments:

  • concept: the concept to learn

  • name: the name to give to the constraint

  • path: path of the output file

Keywords arguments:

  • domains: domains that defines the search space

  • param: an optional parameter of the constraint

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

  • search: either :partial or :complete search

  • global_iter: number of learning iteration

  • local_iter: number of generation in the genetic algorithm

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

  • popSize: size of the population in the genetic algorithm

source

',7))]),i("details",cs,[i("summary",null,[s[162]||(s[162]=i("a",{id:"CompositionalNetworks.composition-Tuple{Composition}-api-00_public",href:"#CompositionalNetworks.composition-Tuple{Composition}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.composition")],-1)),s[163]||(s[163]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[164]||(s[164]=e('
julia
composition(c::Composition)

Access the actual method of an ICN composition c.

source

',3))]),i("details",gs,[i("summary",null,[s[165]||(s[165]=i("a",{id:"CompositionalNetworks.composition_to_file!-api-00_public",href:"#CompositionalNetworks.composition_to_file!-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.composition_to_file!")],-1)),s[166]||(s[166]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[167]||(s[167]=e('
julia
composition_to_file!(c::Composition, path, name, language=:Julia)

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

source

',3))]),i("details",us,[i("summary",null,[s[168]||(s[168]=i("a",{id:"CompositionalNetworks.explore_learn_compose-Tuple{Any, Any}-api-00_public",href:"#CompositionalNetworks.explore_learn_compose-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.explore_learn_compose")],-1)),s[169]||(s[169]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[170]||(s[170]=e('
julia
explore_learn_compose(concept; domains, param = nothing, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200, action = :composition)

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

Arguments:

  • concept: the concept of the targeted constraint

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

  • param: an optional parameter of the constraint

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

  • global_iter: number of learning iteration

  • local_iter: number of generation in the genetic algorithm

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

  • popSize: size of the population in the genetic algorithm

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

source

',5))]),i("details",ms,[i("summary",null,[s[171]||(s[171]=i("a",{id:"CompositionalNetworks.hamming-Tuple{Any, Any}-api-00_public",href:"#CompositionalNetworks.hamming-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.hamming")],-1)),s[172]||(s[172]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[173]||(s[173]=e('
julia
hamming(x, X)

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

source

',3))]),i("details",bs,[i("summary",null,[s[174]||(s[174]=i("a",{id:"CompositionalNetworks.lazy-Tuple{Vararg{Function}}-api-00_public",href:"#CompositionalNetworks.lazy-Tuple{Vararg{Function}}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.lazy")],-1)),s[175]||(s[175]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[176]||(s[176]=e('
julia
lazy(funcs::Function...)

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

source

',3))]),i("details",ys,[i("summary",null,[s[177]||(s[177]=i("a",{id:"CompositionalNetworks.lazy_param-Tuple{Vararg{Function}}-api-00_public",href:"#CompositionalNetworks.lazy_param-Tuple{Vararg{Function}}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.lazy_param")],-1)),s[178]||(s[178]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[179]||(s[179]=e('
julia
lazy_param(funcs::Function...)

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

source

',3))]),i("details",Cs,[i("summary",null,[s[180]||(s[180]=i("a",{id:"CompositionalNetworks.learn_compose-Tuple{Any, Any, Any}-api-00_public",href:"#CompositionalNetworks.learn_compose-Tuple{Any, Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.learn_compose")],-1)),s[181]||(s[181]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[182]||(s[182]=e(`
julia
learn_compose(;
+solutions, non_solutions = explore(domains, allunique)

source

`,9))]),i("details",U,[i("summary",null,[s[81]||(s[81]=i("a",{id:"ConstraintDomains.generate_parameters-Tuple{AbstractDomain, Symbol}-api-00_public",href:"#ConstraintDomains.generate_parameters-Tuple{AbstractDomain, Symbol}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.generate_parameters")],-1)),s[82]||(s[82]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[83]||(s[83]=e('
julia
generate_parameters(d<:AbstractDomain, param)

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

source

',3))]),i("details",P,[i("summary",null,[s[84]||(s[84]=i("a",{id:"ConstraintDomains.get_domain-Tuple{D} where D<:AbstractDomain-api-00_public",href:"#ConstraintDomains.get_domain-Tuple{D} where D<:AbstractDomain-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.get_domain")],-1)),s[85]||(s[85]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[86]||(s[86]=e('
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

',3))]),i("details",z,[i("summary",null,[s[87]||(s[87]=i("a",{id:"ConstraintDomains.intersect_domains-Union{Tuple{I2}, Tuple{I1}, Tuple{I1, I2}} where {I1<:Interval, I2<:Interval}-api-00_public",href:"#ConstraintDomains.intersect_domains-Union{Tuple{I2}, Tuple{I1}, Tuple{I1, I2}} where {I1<:Interval, I2<:Interval}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains")],-1)),s[88]||(s[88]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[89]||(s[89]=e('
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

',3))]),i("details",G,[i("summary",null,[s[90]||(s[90]=i("a",{id:"ConstraintDomains.merge_domains-Tuple{RangeDomain, RangeDomain}-api-00_public",href:"#ConstraintDomains.merge_domains-Tuple{RangeDomain, RangeDomain}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.merge_domains")],-1)),s[91]||(s[91]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[92]||(s[92]=e('
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

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

source

',3))]),i("details",q,[i("summary",null,[s[93]||(s[93]=i("a",{id:"ConstraintDomains.to_domains-Tuple{Vector{Int64}}-api-00_public",href:"#ConstraintDomains.to_domains-Tuple{Vector{Int64}}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintDomains.to_domains")],-1)),s[94]||(s[94]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[95]||(s[95]=e('
julia
to_domains(args...)

Convert various arguments into valid domains format.

source

',3))]),i("details",Q,[i("summary",null,[s[96]||(s[96]=i("a",{id:"Constraints.USUAL_CONSTRAINTS-api-00_public",href:"#Constraints.USUAL_CONSTRAINTS-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.USUAL_CONSTRAINTS")],-1)),s[97]||(s[97]=t()),n(a,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[98]||(s[98]=e('
julia
USUAL_CONSTRAINTS::Dict

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

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

Example

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

source

',6))]),i("details",V,[i("summary",null,[s[99]||(s[99]=i("a",{id:"Constraints.USUAL_SYMMETRIES-api-00_public",href:"#Constraints.USUAL_SYMMETRIES-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.USUAL_SYMMETRIES")],-1)),s[100]||(s[100]=t()),n(a,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[101]||(s[101]=e('
julia
USUAL_SYMMETRIES

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

source

',3))]),i("details",X,[i("summary",null,[s[102]||(s[102]=i("a",{id:"Constraints.Constraint-api-00_public",href:"#Constraints.Constraint-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.Constraint")],-1)),s[103]||(s[103]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[104]||(s[104]=e('
julia
Constraint

Parametric structure with the following fields.

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

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

source

',4))]),i("details",Y,[i("summary",null,[s[105]||(s[105]=i("a",{id:"ConstraintCommons.extract_parameters-api-00_public",href:"#ConstraintCommons.extract_parameters-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintCommons.extract_parameters")],-1)),s[106]||(s[106]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[107]||(s[107]=e('
julia
extract_parameters(s::Symbol, constraints_dict=USUAL_CONSTRAINTS; parameters=ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS)

Return the parameters of the constraint s in constraints_dict.

Arguments

  • s::Symbol: the constraint name.

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

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

Example

julia
extract_parameters(:all_different)

source

',7))]),i("details",$,[i("summary",null,[s[108]||(s[108]=i("a",{id:"Constraints.args-Tuple{Constraint}-api-00_public",href:"#Constraints.args-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.args")],-1)),s[109]||(s[109]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[110]||(s[110]=e('
julia
args(c::Constraint)

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

source

',3))]),i("details",K,[i("summary",null,[s[111]||(s[111]=i("a",{id:"Constraints.concept-Tuple{Constraint}-api-00_public",href:"#Constraints.concept-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[112]||(s[112]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[113]||(s[113]=e('
julia
concept(c::Constraint)

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

source

',3))]),i("details",W,[i("summary",null,[s[114]||(s[114]=i("a",{id:"Constraints.concept-Tuple{Symbol, Vararg{Any}}-api-00_public",href:"#Constraints.concept-Tuple{Symbol, Vararg{Any}}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[115]||(s[115]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[116]||(s[116]=e('
julia
concept(s::Symbol, args...; kargs...)

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

Arguments

  • s::Symbol: the constraint name.

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

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

Example

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

source

',7))]),i("details",H,[i("summary",null,[s[117]||(s[117]=i("a",{id:"Constraints.constraints_descriptions-api-00_public",href:"#Constraints.constraints_descriptions-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.constraints_descriptions")],-1)),s[118]||(s[118]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[119]||(s[119]=e('
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

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

Arguments

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

Example

julia
constraints_descriptions()

source

',7))]),i("details",Z,[i("summary",null,[s[120]||(s[120]=i("a",{id:"Constraints.constraints_parameters-api-00_public",href:"#Constraints.constraints_parameters-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.constraints_parameters")],-1)),s[121]||(s[121]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[122]||(s[122]=e('
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

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

Arguments

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

Example

julia
constraints_parameters()

source

',7))]),i("details",ss,[i("summary",null,[s[123]||(s[123]=i("a",{id:"Constraints.describe-api-00_public",href:"#Constraints.describe-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.describe")],-1)),s[124]||(s[124]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[125]||(s[125]=e('
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

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

Arguments

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

  • width::Int: width of the table.

Example

julia
describe()

source

',7))]),i("details",is,[i("summary",null,[s[126]||(s[126]=i("a",{id:"Constraints.error_f-Tuple{Constraint}-api-00_public",href:"#Constraints.error_f-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.error_f")],-1)),s[127]||(s[127]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[128]||(s[128]=e('
julia
error_f(c::Constraint)

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

source

',3))]),i("details",ts,[i("summary",null,[s[129]||(s[129]=i("a",{id:"Constraints.params_length-Tuple{Constraint}-api-00_public",href:"#Constraints.params_length-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.params_length")],-1)),s[130]||(s[130]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[131]||(s[131]=e('
julia
params_length(c::Constraint)

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

source

',3))]),i("details",as,[i("summary",null,[s[132]||(s[132]=i("a",{id:"Constraints.symmetries-Tuple{Constraint}-api-00_public",href:"#Constraints.symmetries-Tuple{Constraint}-api-00_public"},[i("span",{class:"jlbinding"},"Constraints.symmetries")],-1)),s[133]||(s[133]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[134]||(s[134]=e('
julia
symmetries(c::Constraint)

Return the list of symmetries of c.

source

',3))]),i("details",ns,[i("summary",null,[s[135]||(s[135]=i("a",{id:"CompositionalNetworks.Composition-Union{Tuple{F}, Tuple{F, Any}} where F<:Function-api-00_public",href:"#CompositionalNetworks.Composition-Union{Tuple{F}, Tuple{F, Any}} where F<:Function-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.Composition")],-1)),s[136]||(s[136]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[137]||(s[137]=e('
julia
Composition(f::F, symbols) where {F<:Function}

Construct a Composition.

source

',3))]),i("details",es,[i("summary",null,[s[138]||(s[138]=i("a",{id:"CompositionalNetworks.Composition-api-00_public",href:"#CompositionalNetworks.Composition-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.Composition")],-1)),s[139]||(s[139]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[140]||(s[140]=e('
julia
struct Composition{F<:Function}

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

source

',3))]),i("details",ls,[i("summary",null,[s[141]||(s[141]=i("a",{id:"CompositionalNetworks.ICN-api-00_public",href:"#CompositionalNetworks.ICN-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.ICN")],-1)),s[142]||(s[142]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[143]||(s[143]=e('
julia
ICN(; nvars, dom_size, param, transformation, arithmetic, aggregation, comparison)

Construct an Interpretable Compositional Network, with the following arguments:

  • nvars: number of variable in the constraint

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

  • param: optional parameter (default to nothing)

  • transformation: a transformation layer (optional)

  • arithmetic: a arithmetic layer (optional)

  • aggregation: a aggregation layer (optional)

  • comparison: a comparison layer (optional)

source

',4))]),i("details",os,[i("summary",null,[s[144]||(s[144]=i("a",{id:"CompositionalNetworks.aggregation_layer-Tuple{}-api-00_public",href:"#CompositionalNetworks.aggregation_layer-Tuple{}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.aggregation_layer")],-1)),s[145]||(s[145]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[146]||(s[146]=e('
julia
aggregation_layer()

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

source

',3))]),i("details",ps,[i("summary",null,[s[147]||(s[147]=i("a",{id:"CompositionalNetworks.arithmetic_layer-Tuple{}-api-00_public",href:"#CompositionalNetworks.arithmetic_layer-Tuple{}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.arithmetic_layer")],-1)),s[148]||(s[148]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[149]||(s[149]=e('
julia
arithmetic_layer()

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

source

',3))]),i("details",rs,[i("summary",null,[s[150]||(s[150]=i("a",{id:"CompositionalNetworks.code-api-00_public",href:"#CompositionalNetworks.code-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.code")],-1)),s[151]||(s[151]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[152]||(s[152]=e('
julia
code(c::Composition, lang=:maths; name="composition")

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

source

',3))]),i("details",hs,[i("summary",null,[s[153]||(s[153]=i("a",{id:"CompositionalNetworks.comparison_layer-api-00_public",href:"#CompositionalNetworks.comparison_layer-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.comparison_layer")],-1)),s[154]||(s[154]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[155]||(s[155]=e('
julia
comparison_layer(param = false)

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

source

',3))]),i("details",ds,[i("summary",null,[s[156]||(s[156]=i("a",{id:"CompositionalNetworks.compose-api-00_public",href:"#CompositionalNetworks.compose-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.compose")],-1)),s[157]||(s[157]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[158]||(s[158]=e('
julia
compose(icn, weights=nothing)

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

source

',3))]),i("details",ks,[i("summary",null,[s[159]||(s[159]=i("a",{id:"CompositionalNetworks.compose_to_file!-Tuple{Any, Any, Any}-api-00_public",href:"#CompositionalNetworks.compose_to_file!-Tuple{Any, Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.compose_to_file!")],-1)),s[160]||(s[160]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[161]||(s[161]=e('
julia
compose_to_file!(concept, name, path; domains, param = nothing, language = :Julia, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200)

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

Arguments:

  • concept: the concept to learn

  • name: the name to give to the constraint

  • path: path of the output file

Keywords arguments:

  • domains: domains that defines the search space

  • param: an optional parameter of the constraint

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

  • search: either :partial or :complete search

  • global_iter: number of learning iteration

  • local_iter: number of generation in the genetic algorithm

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

  • popSize: size of the population in the genetic algorithm

source

',7))]),i("details",cs,[i("summary",null,[s[162]||(s[162]=i("a",{id:"CompositionalNetworks.composition-Tuple{Composition}-api-00_public",href:"#CompositionalNetworks.composition-Tuple{Composition}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.composition")],-1)),s[163]||(s[163]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[164]||(s[164]=e('
julia
composition(c::Composition)

Access the actual method of an ICN composition c.

source

',3))]),i("details",gs,[i("summary",null,[s[165]||(s[165]=i("a",{id:"CompositionalNetworks.composition_to_file!-api-00_public",href:"#CompositionalNetworks.composition_to_file!-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.composition_to_file!")],-1)),s[166]||(s[166]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[167]||(s[167]=e('
julia
composition_to_file!(c::Composition, path, name, language=:Julia)

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

source

',3))]),i("details",us,[i("summary",null,[s[168]||(s[168]=i("a",{id:"CompositionalNetworks.explore_learn_compose-Tuple{Any, Any}-api-00_public",href:"#CompositionalNetworks.explore_learn_compose-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.explore_learn_compose")],-1)),s[169]||(s[169]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[170]||(s[170]=e('
julia
explore_learn_compose(concept; domains, param = nothing, search = :complete, global_iter = 10, local_iter = 100, metric = hamming, popSize = 200, action = :composition)

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

Arguments:

  • concept: the concept of the targeted constraint

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

  • param: an optional parameter of the constraint

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

  • global_iter: number of learning iteration

  • local_iter: number of generation in the genetic algorithm

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

  • popSize: size of the population in the genetic algorithm

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

source

',5))]),i("details",ms,[i("summary",null,[s[171]||(s[171]=i("a",{id:"CompositionalNetworks.hamming-Tuple{Any, Any}-api-00_public",href:"#CompositionalNetworks.hamming-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.hamming")],-1)),s[172]||(s[172]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[173]||(s[173]=e('
julia
hamming(x, X)

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

source

',3))]),i("details",bs,[i("summary",null,[s[174]||(s[174]=i("a",{id:"CompositionalNetworks.lazy-Tuple{Vararg{Function}}-api-00_public",href:"#CompositionalNetworks.lazy-Tuple{Vararg{Function}}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.lazy")],-1)),s[175]||(s[175]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[176]||(s[176]=e('
julia
lazy(funcs::Function...)

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

source

',3))]),i("details",ys,[i("summary",null,[s[177]||(s[177]=i("a",{id:"CompositionalNetworks.lazy_param-Tuple{Vararg{Function}}-api-00_public",href:"#CompositionalNetworks.lazy_param-Tuple{Vararg{Function}}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.lazy_param")],-1)),s[178]||(s[178]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[179]||(s[179]=e('
julia
lazy_param(funcs::Function...)

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

source

',3))]),i("details",Cs,[i("summary",null,[s[180]||(s[180]=i("a",{id:"CompositionalNetworks.learn_compose-Tuple{Any, Any, Any}-api-00_public",href:"#CompositionalNetworks.learn_compose-Tuple{Any, Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.learn_compose")],-1)),s[181]||(s[181]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[182]||(s[182]=e(`
julia
learn_compose(;
     nvars, dom_size, param=nothing, icn=ICN(nvars, dom_size, param),
     X, X_sols, global_iter=100, local_iter=100, metric=hamming, popSize=200
 )

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

source

`,3))]),i("details",Es,[i("summary",null,[s[183]||(s[183]=i("a",{id:"CompositionalNetworks.manhattan-Tuple{Any, Any}-api-00_public",href:"#CompositionalNetworks.manhattan-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.manhattan")],-1)),s[184]||(s[184]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[185]||(s[185]=e('
julia
manhattan(x, X)

source

',2))]),i("details",js,[i("summary",null,[s[186]||(s[186]=i("a",{id:"CompositionalNetworks.minkowski-Tuple{Any, Any, Any}-api-00_public",href:"#CompositionalNetworks.minkowski-Tuple{Any, Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.minkowski")],-1)),s[187]||(s[187]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[188]||(s[188]=e('
julia
minkowski(x, X, p)

source

',2))]),i("details",vs,[i("summary",null,[s[189]||(s[189]=i("a",{id:"CompositionalNetworks.nbits-Tuple{Any}-api-00_public",href:"#CompositionalNetworks.nbits-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.nbits")],-1)),s[190]||(s[190]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[191]||(s[191]=e('
julia
nbits(icn)

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

source

',3))]),i("details",Fs,[i("summary",null,[s[192]||(s[192]=i("a",{id:"CompositionalNetworks.regularization-Tuple{Any}-api-00_public",href:"#CompositionalNetworks.regularization-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.regularization")],-1)),s[193]||(s[193]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[194]||(s[194]=e('
julia
regularization(icn)

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

source

',3))]),i("details",fs,[i("summary",null,[s[195]||(s[195]=i("a",{id:"CompositionalNetworks.show_layers-Tuple{Any}-api-00_public",href:"#CompositionalNetworks.show_layers-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.show_layers")],-1)),s[196]||(s[196]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[197]||(s[197]=e('
julia
show_layers(icn)

Return a formatted string with each layers in the icn.

source

',3))]),i("details",Ts,[i("summary",null,[s[198]||(s[198]=i("a",{id:"CompositionalNetworks.symbols-Tuple{Composition}-api-00_public",href:"#CompositionalNetworks.symbols-Tuple{Composition}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.symbols")],-1)),s[199]||(s[199]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[200]||(s[200]=e('
julia
symbols(c::Composition)

Output the composition as a layered collection of Symbols.

source

',3))]),i("details",As,[i("summary",null,[s[201]||(s[201]=i("a",{id:"CompositionalNetworks.transformation_layer-api-00_public",href:"#CompositionalNetworks.transformation_layer-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.transformation_layer")],-1)),s[202]||(s[202]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[203]||(s[203]=e('
julia
transformation_layer(param = Vector{Symbol}())

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

source

',3))]),i("details",Ds,[i("summary",null,[s[204]||(s[204]=i("a",{id:"CompositionalNetworks.weights!-Tuple{Any, Any}-api-00_public",href:"#CompositionalNetworks.weights!-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.weights!")],-1)),s[205]||(s[205]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[206]||(s[206]=e('
julia
weights!(icn, weights)

Set the weights of an ICN with a BitVector.

source

',3))]),i("details",xs,[i("summary",null,[s[207]||(s[207]=i("a",{id:"CompositionalNetworks.weights-Tuple{Any}-api-00_public",href:"#CompositionalNetworks.weights-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.weights")],-1)),s[208]||(s[208]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[209]||(s[209]=e('
julia
weights(icn)

Access the current set of weights of an ICN.

source

',3))]),i("details",Bs,[i("summary",null,[s[210]||(s[210]=i("a",{id:"CompositionalNetworks.weights_bias-Tuple{Any}-api-00_public",href:"#CompositionalNetworks.weights_bias-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"CompositionalNetworks.weights_bias")],-1)),s[211]||(s[211]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[212]||(s[212]=e('
julia
weights_bias(x)

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

source

',3))]),i("details",Ls,[i("summary",null,[s[213]||(s[213]=i("a",{id:"QUBOConstraints.QUBO_linear_sum-Tuple{Any, Any}-api-00_public",href:"#QUBOConstraints.QUBO_linear_sum-Tuple{Any, Any}-api-00_public"},[i("span",{class:"jlbinding"},"QUBOConstraints.QUBO_linear_sum")],-1)),s[214]||(s[214]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[215]||(s[215]=e('
julia
QUBO_linear_sum(n, σ)

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

source

',3))]),i("details",ws,[i("summary",null,[s[216]||(s[216]=i("a",{id:"QUBOConstraints.binarize-Union{Tuple{Vector{T}}, Tuple{T}, Tuple{Vector{T}, Any}} where T<:Number-api-00_public",href:"#QUBOConstraints.binarize-Union{Tuple{Vector{T}}, Tuple{T}, Tuple{Vector{T}, Any}} where T<:Number-api-00_public"},[i("span",{class:"jlbinding"},"QUBOConstraints.binarize")],-1)),s[217]||(s[217]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[218]||(s[218]=e('
julia
binarize(x[, domain]; binarization = :one_hot)

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

source

',3))]),i("details",Ms,[i("summary",null,[s[219]||(s[219]=i("a",{id:"QUBOConstraints.debinarize-Tuple{Any}-api-00_public",href:"#QUBOConstraints.debinarize-Tuple{Any}-api-00_public"},[i("span",{class:"jlbinding"},"QUBOConstraints.debinarize")],-1)),s[220]||(s[220]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[221]||(s[221]=e('
julia
debinarize(x[, domain]; binarization = :one_hot)

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

source

',3))]),i("details",Ns,[i("summary",null,[s[222]||(s[222]=i("a",{id:"QUBOConstraints.is_valid-api-00_public",href:"#QUBOConstraints.is_valid-api-00_public"},[i("span",{class:"jlbinding"},"QUBOConstraints.is_valid")],-1)),s[223]||(s[223]=t()),n(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[224]||(s[224]=e('
julia
is_valid(x, encoding::Symbol = :none)

Check if x has a valid format for encoding.

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

source

',4))]),i("details",_s,[i("summary",null,[s[225]||(s[225]=i("a",{id:"QUBOConstraints.train-Tuple-api-00_public",href:"#QUBOConstraints.train-Tuple-api-00_public"},[i("span",{class:"jlbinding"},"QUBOConstraints.train")],-1)),s[226]||(s[226]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[227]||(s[227]=e('
julia
train(args...)

Default train method for any AbstractOptimizer.

source

',3))]),i("details",Os,[i("summary",null,[s[228]||(s[228]=i("a",{id:"ConstraintsTranslator.GoogleLLM-api-00_public",href:"#ConstraintsTranslator.GoogleLLM-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.GoogleLLM")],-1)),s[229]||(s[229]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[235]||(s[235]=e('
julia
Google LLM

Structure encapsulating the parameters for accessing the Google LLM API.

',2)),i("ul",null,[s[233]||(s[233]=i("li",null,[i("p",null,[i("code",null,"api_key"),t(": an API key for accessing the Google Gemini API ("),i("code",null,"https://ai.google.dev/gemini-api/docs/"),t("), read from the environmental variable "),i("code",null,"GOOGLE_API_KEY"),t(".")])],-1)),s[234]||(s[234]=i("li",null,[i("p",null,[i("code",null,"model_id"),t(": a string identifier for the model to query. See "),i("code",null,"https://ai.google.dev/gemini-api/docs/models/gemini"),t(" for the list of available models.")])],-1)),i("li",null,[i("p",null,[s[230]||(s[230]=i("code",null,"url",-1)),s[231]||(s[231]=t(": URL for chat completions. Defaults to ")),i("code",null,"https://generativelanguage.googleapis.com/v1beta/models/"+r(l.model_id),1),s[232]||(s[232]=t("."))])])]),s[236]||(s[236]=i("p",null,[i("a",{href:"https://github.com/JuliaConstraints/ConstraintsTranslator.jl/blob/v0.0.2/src/llm.jl#L30-L38",target:"_blank",rel:"noreferrer"},"source")],-1))]),i("details",Ss,[i("summary",null,[s[237]||(s[237]=i("a",{id:"ConstraintsTranslator.GroqLLM-api-00_public",href:"#ConstraintsTranslator.GroqLLM-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.GroqLLM")],-1)),s[238]||(s[238]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[239]||(s[239]=e('
julia
GroqLLM

Structure encapsulating the parameters for accessing the Groq LLM API.

source

',4))]),i("details",Is,[i("summary",null,[s[240]||(s[240]=i("a",{id:"ConstraintsTranslator.LlamaCppLLM-api-00_public",href:"#ConstraintsTranslator.LlamaCppLLM-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.LlamaCppLLM")],-1)),s[241]||(s[241]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[242]||(s[242]=e('
julia
LlamaCppLLM

Structure encapsulating the parameters for accessing the llama.cpp server API.

  • api_key: an optional API key for accessing the server

  • model_id: a string identifier for the model to query. Unused, kept for API compatibility.

  • url: the URL of the llama.cpp server OpenAI API endpoint (e.g., http://localhost:8080)

NOTE: we do not apply the appropriate chat templates to the prompt. This must be handled either in an external code path or by the server.

source

',5))]),i("details",Js,[i("summary",null,[s[243]||(s[243]=i("a",{id:"ConstraintsTranslator.Prompt-api-00_public",href:"#ConstraintsTranslator.Prompt-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.Prompt")],-1)),s[244]||(s[244]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[245]||(s[245]=e('
julia
Prompt

Simple data structure encapsulating a system prompt and a user prompt for LLM generation.

Fields

  • system: the system prompt.

  • user: the user prompt.

source

',5))]),i("details",Rs,[i("summary",null,[s[246]||(s[246]=i("a",{id:"ConstraintsTranslator.PromptTemplate-api-00_public",href:"#ConstraintsTranslator.PromptTemplate-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.PromptTemplate")],-1)),s[247]||(s[247]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[248]||(s[248]=e('
julia
PromptTemplate

Represents a complete prompt template, comprising metadata, system, and user messages.

Fields

  • metadata::MetadataMessage: The metadata message of the prompt template.

  • system::SystemMessage: The system message of the prompt template.

  • user::UserMessage: The user message of the prompt template.

source

',5))]),i("details",Us,[i("summary",null,[s[249]||(s[249]=i("a",{id:"ConstraintsTranslator.format_template-Tuple{PromptTemplate}-api-00_public",href:"#ConstraintsTranslator.format_template-Tuple{PromptTemplate}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.format_template")],-1)),s[250]||(s[250]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[251]||(s[251]=e('
julia
format_template(template::PromptTemplate; kwargs...)::Prompt

Formats a PromptTemplate by substituting all variables in the system and user messages with user-provided values.

Arguments

  • template::PromptTemplate: The prompt template containing metadata, system, and user messages.

  • kwargs...: A variable number of keyword arguments where keys are variable names and values are the corresponding replacements.

Returns

  • Prompt: A Prompt struct with the system and user messages containing the substituted values.

Raises

  • ErrorException: If any variables specified in the system or user templates are not present in the kwargs.

  • Warning: If there are extra kwargs that are not used in the templates.

source

',9))]),i("details",Ps,[i("summary",null,[s[252]||(s[252]=i("a",{id:"ConstraintsTranslator.get_completion-Tuple{AbstractLLM, ConstraintsTranslator.AbstractPrompt}-api-00_public",href:"#ConstraintsTranslator.get_completion-Tuple{AbstractLLM, ConstraintsTranslator.AbstractPrompt}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.get_completion")],-1)),s[253]||(s[253]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[254]||(s[254]=e('
julia
get_completion(llm::AbstractLLM, prompt::AbstractPrompt)

Returns a completion for a prompt using the llm model API.

source

',3))]),i("details",zs,[i("summary",null,[s[255]||(s[255]=i("a",{id:"ConstraintsTranslator.get_completion-Tuple{ConstraintsTranslator.OpenAILLM, Prompt}-api-00_public",href:"#ConstraintsTranslator.get_completion-Tuple{ConstraintsTranslator.OpenAILLM, Prompt}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.get_completion")],-1)),s[256]||(s[256]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[257]||(s[257]=e('
julia
get_completion(llm::OpenAILLM, prompt::Prompt)

Returns a completion for the given prompt using an OpenAI API compatible LLM

source

',3))]),i("details",Gs,[i("summary",null,[s[258]||(s[258]=i("a",{id:"ConstraintsTranslator.get_completion-Tuple{GoogleLLM, Prompt}-api-00_public",href:"#ConstraintsTranslator.get_completion-Tuple{GoogleLLM, Prompt}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.get_completion")],-1)),s[259]||(s[259]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[260]||(s[260]=e('
julia
get_completion(llm::GoogleLLM, prompt::Prompt)

Returns a completion for the given prompt using the Google Gemini LLM API.

source

',3))]),i("details",qs,[i("summary",null,[s[261]||(s[261]=i("a",{id:"ConstraintsTranslator.parse_code-Tuple{String}-api-00_public",href:"#ConstraintsTranslator.parse_code-Tuple{String}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.parse_code")],-1)),s[262]||(s[262]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[263]||(s[263]=e('
julia
parse_code(s::String)

Parse the code blocks in the input string s delimited by triple backticks and an optional language annotation. Returns a dictionary keyed by language. Code blocks from the same language are concatenated.

source

',3))]),i("details",Qs,[i("summary",null,[s[264]||(s[264]=i("a",{id:"ConstraintsTranslator.read_template-Tuple{String}-api-00_public",href:"#ConstraintsTranslator.read_template-Tuple{String}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.read_template")],-1)),s[265]||(s[265]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[266]||(s[266]=e('
julia
read_template(data_path::String)

Reads a prompt template from a JSON file specified by data_path. The function parses the JSON data and constructs a PromptTemplate object containing metadata, system, and user messages. TODO: validate the JSON data against a schema to ensure it is valid before parsing.

Arguments

  • data_path::String: The path to the JSON file containing the prompt template.

Returns

  • PromptTemplate: A PromptTemplate structure encapsulating the metadata, system, and user messages.

Raises

  • ErrorException: if the template does not match the specification format.

source

',9))]),i("details",Vs,[i("summary",null,[s[267]||(s[267]=i("a",{id:"ConstraintsTranslator.stream_completion-Tuple{AbstractLLM, ConstraintsTranslator.AbstractPrompt}-api-00_public",href:"#ConstraintsTranslator.stream_completion-Tuple{AbstractLLM, ConstraintsTranslator.AbstractPrompt}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.stream_completion")],-1)),s[268]||(s[268]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[269]||(s[269]=e('
julia
stream_completion(llm::AbstractLLM, prompt::AbstractPrompt)

Returns a completion for a prompt using the llm model API. The completion is streamed to the terminal as it is generated.

source

',3))]),i("details",Xs,[i("summary",null,[s[270]||(s[270]=i("a",{id:"ConstraintsTranslator.stream_completion-Tuple{ConstraintsTranslator.OpenAILLM, Prompt}-api-00_public",href:"#ConstraintsTranslator.stream_completion-Tuple{ConstraintsTranslator.OpenAILLM, Prompt}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.stream_completion")],-1)),s[271]||(s[271]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[272]||(s[272]=e('
julia
stream_completion(llm::OpenAILLM, prompt::Prompt)

Returns a completion for the given prompt using an OpenAI API compatible model. The completion is streamed to the terminal as it is generated.

source

',3))]),i("details",Ys,[i("summary",null,[s[273]||(s[273]=i("a",{id:"ConstraintsTranslator.stream_completion-Tuple{GoogleLLM, Prompt}-api-00_public",href:"#ConstraintsTranslator.stream_completion-Tuple{GoogleLLM, Prompt}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.stream_completion")],-1)),s[274]||(s[274]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[275]||(s[275]=e('
julia
stream_completion(llm::GoogleLLM, prompt::Prompt)

Returns a completion for the given prompt using the Google Gemini LLM API. The completion is streamed to the terminal as it is generated.

source

',3))]),i("details",$s,[i("summary",null,[s[276]||(s[276]=i("a",{id:"ConstraintsTranslator.translate-Tuple{AbstractLLM, AbstractString}-api-00_public",href:"#ConstraintsTranslator.translate-Tuple{AbstractLLM, AbstractString}-api-00_public"},[i("span",{class:"jlbinding"},"ConstraintsTranslator.translate")],-1)),s[277]||(s[277]=t()),n(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[278]||(s[278]=e('
julia
translate(model::AbstractLLM, description::AbstractString; interactive::Bool = false)

Translate the natural-language description of an optimization problem into a Constraint Programming model by querying the Large Language Model model. If interactive, the user will be prompted via the command line to inspect the intermediate outputs of the LLM, and possibly modify them.

source

',3))])])}const ai=o(k,[["render",Ks]]);export{ti as __pageData,ai as default}; diff --git a/dev/assets/api_10_full.md.D8vC0wPZ.js b/dev/assets/api_10_full.md.DufIdSXa.js similarity index 93% rename from dev/assets/api_10_full.md.D8vC0wPZ.js rename to dev/assets/api_10_full.md.DufIdSXa.js index a4505dc..873a910 100644 --- a/dev/assets/api_10_full.md.D8vC0wPZ.js +++ b/dev/assets/api_10_full.md.DufIdSXa.js @@ -28,12 +28,12 @@ import{_ as h,c as o,j as i,a,G as n,a5 as l,t as p,B as k,o as r}from"./chunks/ d2 = domain([53.69, 89.2, 0.12]) d3 = domain([2//3, 89//123]) d4 = domain(4.3) -d5 = domain(1,42,86.9)

source

`,4))]),i("details",cs,[i("summary",null,[s[168]||(s[168]=i("a",{id:"ConstraintDomains.domain-Tuple{}",href:"#ConstraintDomains.domain-Tuple{}"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[169]||(s[169]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[170]||(s[170]=l('
julia
domain()

Construct an EmptyDomain.

source

',3))]),i("details",ys,[i("summary",null,[s[171]||(s[171]=i("a",{id:"ConstraintDomains.domain-Union{Tuple{Array{Intervals.Interval{T, L, R}, 1}}, Tuple{R}, Tuple{L}, Tuple{T}} where {T<:Real, L, R}",href:"#ConstraintDomains.domain-Union{Tuple{Array{Intervals.Interval{T, L, R}, 1}}, Tuple{R}, Tuple{L}, Tuple{T}} where {T<:Real, L, R}"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[172]||(s[172]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[173]||(s[173]=l(`
julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+d5 = domain(1,42,86.9)

source

`,4))]),i("details",cs,[i("summary",null,[s[168]||(s[168]=i("a",{id:"ConstraintDomains.domain-Tuple{}",href:"#ConstraintDomains.domain-Tuple{}"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[169]||(s[169]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[170]||(s[170]=l('
julia
domain()

Construct an EmptyDomain.

source

',3))]),i("details",ys,[i("summary",null,[s[171]||(s[171]=i("a",{id:"ConstraintDomains.domain-Union{Tuple{Array{Interval{T, L, R}, 1}}, Tuple{R}, Tuple{L}, Tuple{T}} where {T<:Real, L, R}",href:"#ConstraintDomains.domain-Union{Tuple{Array{Interval{T, L, R}, 1}}, Tuple{R}, Tuple{L}, Tuple{T}} where {T<:Real, L, R}"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[172]||(s[172]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[173]||(s[173]=l(`
julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
 domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

`,3))]),i("details",us,[i("summary",null,[s[174]||(s[174]=i("a",{id:"ConstraintDomains.domain_size-Tuple{ConstraintDomains.Intervals}",href:"#ConstraintDomains.domain_size-Tuple{ConstraintDomains.Intervals}"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[175]||(s[175]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[176]||(s[176]=l('
julia
domain_size(itv::Intervals)

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

source

',3))]),i("details",Cs,[i("summary",null,[s[177]||(s[177]=i("a",{id:"ConstraintDomains.domain_size-Tuple{D} where D<:AbstractDomain",href:"#ConstraintDomains.domain_size-Tuple{D} where D<:AbstractDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[178]||(s[178]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[179]||(s[179]=l('
julia
domain_size(d <: AbstractDomain)

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

source

',3))]),i("details",ms,[i("summary",null,[s[180]||(s[180]=i("a",{id:"ConstraintDomains.domain_size-Tuple{D} where D<:DiscreteDomain",href:"#ConstraintDomains.domain_size-Tuple{D} where D<:DiscreteDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[181]||(s[181]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[182]||(s[182]=l('
julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',3))]),i("details",Fs,[i("summary",null,[s[183]||(s[183]=i("a",{id:"ConstraintDomains.explore!-Tuple{Explorer}",href:"#ConstraintDomains.explore!-Tuple{Explorer}"},[i("span",{class:"jlbinding"},"ConstraintDomains.explore!")],-1)),s[184]||(s[184]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[185]||(s[185]=l(`
julia
explore!(explorer::Explorer)

Perform exploration on the search space defined by the Explorer object.

This function explores the search space according to the settings specified in the Explorer object. It updates the Explorer's state with found solutions and non-solutions.

Arguments

  • explorer: An Explorer object containing the problem definition and exploration settings.

Returns

Nothing. The Explorer's state is updated in-place.

Example

julia
explorer = Explorer(concepts, domains)
 explore!(explorer)
 println("Solutions found: ", length(explorer.state.solutions))

source

`,10))]),i("details",bs,[i("summary",null,[s[186]||(s[186]=i("a",{id:"ConstraintDomains.explore-Tuple{Any, Any}",href:"#ConstraintDomains.explore-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"ConstraintDomains.explore")],-1)),s[187]||(s[187]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[188]||(s[188]=l(`
julia
explore(domains, concept; settings = ExploreSettings(domains), parameters...)

Explore a search space defined by domains and a concept.

Arguments

  • domains: A collection of domains representing the search space.

  • concept: The concept function defining the constraint.

  • settings: An ExploreSettings object to configure the exploration process.

  • parameters: Additional parameters to pass to the concept function.

Returns

A tuple containing two sets: (solutions, non_solutions).

Example

julia
domains = [domain([1, 2, 3]), domain([4, 5, 6])]
-solutions, non_solutions = explore(domains, allunique)

source

`,9))]),i("details",vs,[i("summary",null,[s[189]||(s[189]=i("a",{id:"ConstraintDomains.fake_automaton-Tuple{Any}",href:"#ConstraintDomains.fake_automaton-Tuple{Any}"},[i("span",{class:"jlbinding"},"ConstraintDomains.fake_automaton")],-1)),s[190]||(s[190]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[191]||(s[191]=l('
julia
fake_automaton(d)

Construct a FakeAutomaton.

source

',3))]),i("details",js,[i("summary",null,[s[192]||(s[192]=i("a",{id:"ConstraintDomains.generate_parameters-Tuple{AbstractDomain, Symbol}",href:"#ConstraintDomains.generate_parameters-Tuple{AbstractDomain, Symbol}"},[i("span",{class:"jlbinding"},"ConstraintDomains.generate_parameters")],-1)),s[193]||(s[193]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[194]||(s[194]=l('
julia
generate_parameters(d<:AbstractDomain, param)

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

source

',3))]),i("details",fs,[i("summary",null,[s[195]||(s[195]=i("a",{id:"ConstraintDomains.get_domain-Tuple{D} where D<:AbstractDomain",href:"#ConstraintDomains.get_domain-Tuple{D} where D<:AbstractDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.get_domain")],-1)),s[196]||(s[196]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[197]||(s[197]=l('
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

',3))]),i("details",Bs,[i("summary",null,[s[198]||(s[198]=i("a",{id:"ConstraintDomains.intersect_domains!-Union{Tuple{I}, Tuple{IS}, Tuple{IS, I, Any}} where {IS<:ConstraintDomains.Intervals, I<:Intervals.Interval}",href:"#ConstraintDomains.intersect_domains!-Union{Tuple{I}, Tuple{IS}, Tuple{IS, I, Any}} where {IS<:ConstraintDomains.Intervals, I<:Intervals.Interval}"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains!")],-1)),s[199]||(s[199]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[200]||(s[200]=l('
julia
intersect_domains!(is, i, new_itvls)

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

Arguments

  • is::IS: a collection of intervals.

  • i::I: an interval.

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

source

',5))]),i("details",xs,[i("summary",null,[s[201]||(s[201]=i("a",{id:"ConstraintDomains.intersect_domains-Union{Tuple{I2}, Tuple{I1}, Tuple{I1, I2}} where {I1<:Intervals.Interval, I2<:Intervals.Interval}",href:"#ConstraintDomains.intersect_domains-Union{Tuple{I2}, Tuple{I1}, Tuple{I1, I2}} where {I1<:Intervals.Interval, I2<:Intervals.Interval}"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains")],-1)),s[202]||(s[202]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[203]||(s[203]=l('
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

',3))]),i("details",As,[i("summary",null,[s[204]||(s[204]=i("a",{id:"ConstraintDomains.merge_domains-Tuple{RangeDomain, RangeDomain}",href:"#ConstraintDomains.merge_domains-Tuple{RangeDomain, RangeDomain}"},[i("span",{class:"jlbinding"},"ConstraintDomains.merge_domains")],-1)),s[205]||(s[205]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[206]||(s[206]=l('
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

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

source

',3))]),i("details",Ds,[i("summary",null,[s[207]||(s[207]=i("a",{id:"ConstraintDomains.set!-Tuple{Explorer, Function}",href:"#ConstraintDomains.set!-Tuple{Explorer, Function}"},[i("span",{class:"jlbinding"},"ConstraintDomains.set!")],-1)),s[208]||(s[208]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[209]||(s[209]=l(`
julia
set!(explorer::Explorer, objective::Function)

Set the objective function for the Explorer object.

Arguments

  • explorer: The Explorer object to modify.

  • objective: A function to use as the objective for optimization.

Returns

Nothing. The Explorer object is modified in-place.

Example

julia
explorer = Explorer()
-set!(explorer, x -> sum(x))

source

`,9))]),i("details",Ts,[i("summary",null,[s[210]||(s[210]=i("a",{id:"ConstraintDomains.size-Tuple{I} where I<:Intervals.Interval",href:"#ConstraintDomains.size-Tuple{I} where I<:Intervals.Interval"},[i("span",{class:"jlbinding"},"ConstraintDomains.size")],-1)),s[211]||(s[211]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[212]||(s[212]=l('
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source

',3))]),i("details",ws,[i("summary",null,[s[213]||(s[213]=i("a",{id:"ConstraintDomains.to_domains-Tuple{Vector{Int64}}",href:"#ConstraintDomains.to_domains-Tuple{Vector{Int64}}"},[i("span",{class:"jlbinding"},"ConstraintDomains.to_domains")],-1)),s[214]||(s[214]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[215]||(s[215]=l('
julia
to_domains(args...)

Convert various arguments into valid domains format.

source

',3))]),i("details",Ls,[i("summary",null,[s[216]||(s[216]=i("a",{id:"Constraints.USUAL_CONSTRAINTS",href:"#Constraints.USUAL_CONSTRAINTS"},[i("span",{class:"jlbinding"},"Constraints.USUAL_CONSTRAINTS")],-1)),s[217]||(s[217]=a()),n(t,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[218]||(s[218]=l('
julia
USUAL_CONSTRAINTS::Dict

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

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

Example

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

source

',6))]),i("details",_s,[i("summary",null,[s[219]||(s[219]=i("a",{id:"Constraints.USUAL_SYMMETRIES",href:"#Constraints.USUAL_SYMMETRIES"},[i("span",{class:"jlbinding"},"Constraints.USUAL_SYMMETRIES")],-1)),s[220]||(s[220]=a()),n(t,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[221]||(s[221]=l('
julia
USUAL_SYMMETRIES

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

source

',3))]),i("details",Ms,[i("summary",null,[s[222]||(s[222]=i("a",{id:"Constraints.Constraint",href:"#Constraints.Constraint"},[i("span",{class:"jlbinding"},"Constraints.Constraint")],-1)),s[223]||(s[223]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[224]||(s[224]=l('
julia
Constraint

Parametric structure with the following fields.

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

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

source

',4))]),i("details",Ns,[i("summary",null,[s[225]||(s[225]=i("a",{id:"ConstraintCommons.extract_parameters",href:"#ConstraintCommons.extract_parameters"},[i("span",{class:"jlbinding"},"ConstraintCommons.extract_parameters")],-1)),s[226]||(s[226]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[227]||(s[227]=l('
julia
extract_parameters(s::Symbol, constraints_dict=USUAL_CONSTRAINTS; parameters=ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS)

Return the parameters of the constraint s in constraints_dict.

Arguments

  • s::Symbol: the constraint name.

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

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

Example

julia
extract_parameters(:all_different)

source

',7))]),i("details",Os,[i("summary",null,[s[228]||(s[228]=i("a",{id:"Constraints.args-Tuple{Constraint}",href:"#Constraints.args-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.args")],-1)),s[229]||(s[229]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[230]||(s[230]=l('
julia
args(c::Constraint)

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

source

',3))]),i("details",Is,[i("summary",null,[s[231]||(s[231]=i("a",{id:"Constraints.concept-Tuple{Constraint}",href:"#Constraints.concept-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[232]||(s[232]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[233]||(s[233]=l('
julia
concept(c::Constraint)

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

source

',3))]),i("details",Ss,[i("summary",null,[s[234]||(s[234]=i("a",{id:"Constraints.concept-Tuple{Symbol, Vararg{Any}}",href:"#Constraints.concept-Tuple{Symbol, Vararg{Any}}"},[i("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[235]||(s[235]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[236]||(s[236]=l('
julia
concept(s::Symbol, args...; kargs...)

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

Arguments

  • s::Symbol: the constraint name.

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

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

Example

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

source

',7))]),i("details",Js,[i("summary",null,[s[237]||(s[237]=i("a",{id:"Constraints.concept_vs_error-Tuple{Any, Any, Vararg{Any}}",href:"#Constraints.concept_vs_error-Tuple{Any, Any, Vararg{Any}}"},[i("span",{class:"jlbinding"},"Constraints.concept_vs_error")],-1)),s[238]||(s[238]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[239]||(s[239]=l('
julia
concept_vs_error(c, e, args...; kargs...)

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

Arguments

  • c: The concept function.

  • e: The error function.

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

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

Returns

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

Examples

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

source

',9))]),i("details",Rs,[i("summary",null,[s[240]||(s[240]=i("a",{id:"Constraints.constraints_descriptions",href:"#Constraints.constraints_descriptions"},[i("span",{class:"jlbinding"},"Constraints.constraints_descriptions")],-1)),s[241]||(s[241]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[242]||(s[242]=l('
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

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

Arguments

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

Example

julia
constraints_descriptions()

source

',7))]),i("details",Us,[i("summary",null,[s[243]||(s[243]=i("a",{id:"Constraints.constraints_parameters",href:"#Constraints.constraints_parameters"},[i("span",{class:"jlbinding"},"Constraints.constraints_parameters")],-1)),s[244]||(s[244]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[245]||(s[245]=l('
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

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

Arguments

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

Example

julia
constraints_parameters()

source

',7))]),i("details",Vs,[i("summary",null,[s[246]||(s[246]=i("a",{id:"Constraints.describe",href:"#Constraints.describe"},[i("span",{class:"jlbinding"},"Constraints.describe")],-1)),s[247]||(s[247]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[248]||(s[248]=l('
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

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

Arguments

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

  • width::Int: width of the table.

Example

julia
describe()

source

',7))]),i("details",Ps,[i("summary",null,[s[249]||(s[249]=i("a",{id:"Constraints.error_f-Tuple{Constraint}",href:"#Constraints.error_f-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.error_f")],-1)),s[250]||(s[250]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[251]||(s[251]=l('
julia
error_f(c::Constraint)

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

source

',3))]),i("details",qs,[i("summary",null,[s[252]||(s[252]=i("a",{id:"Constraints.make_error-Tuple{Symbol}",href:"#Constraints.make_error-Tuple{Symbol}"},[i("span",{class:"jlbinding"},"Constraints.make_error")],-1)),s[253]||(s[253]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[254]||(s[254]=l(`
julia
make_error(symb::Symbol)

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

Arguments

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

Returns

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

Examples

julia
e = make_error(:all_different)
+solutions, non_solutions = explore(domains, allunique)

source

`,9))]),i("details",vs,[i("summary",null,[s[189]||(s[189]=i("a",{id:"ConstraintDomains.fake_automaton-Tuple{Any}",href:"#ConstraintDomains.fake_automaton-Tuple{Any}"},[i("span",{class:"jlbinding"},"ConstraintDomains.fake_automaton")],-1)),s[190]||(s[190]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[191]||(s[191]=l('
julia
fake_automaton(d)

Construct a FakeAutomaton.

source

',3))]),i("details",js,[i("summary",null,[s[192]||(s[192]=i("a",{id:"ConstraintDomains.generate_parameters-Tuple{AbstractDomain, Symbol}",href:"#ConstraintDomains.generate_parameters-Tuple{AbstractDomain, Symbol}"},[i("span",{class:"jlbinding"},"ConstraintDomains.generate_parameters")],-1)),s[193]||(s[193]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[194]||(s[194]=l('
julia
generate_parameters(d<:AbstractDomain, param)

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

source

',3))]),i("details",fs,[i("summary",null,[s[195]||(s[195]=i("a",{id:"ConstraintDomains.get_domain-Tuple{D} where D<:AbstractDomain",href:"#ConstraintDomains.get_domain-Tuple{D} where D<:AbstractDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.get_domain")],-1)),s[196]||(s[196]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[197]||(s[197]=l('
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

',3))]),i("details",Bs,[i("summary",null,[s[198]||(s[198]=i("a",{id:"ConstraintDomains.intersect_domains!-Union{Tuple{I}, Tuple{IS}, Tuple{IS, I, Any}} where {IS<:ConstraintDomains.Intervals, I<:Interval}",href:"#ConstraintDomains.intersect_domains!-Union{Tuple{I}, Tuple{IS}, Tuple{IS, I, Any}} where {IS<:ConstraintDomains.Intervals, I<:Interval}"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains!")],-1)),s[199]||(s[199]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[200]||(s[200]=l('
julia
intersect_domains!(is, i, new_itvls)

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

Arguments

  • is::IS: a collection of intervals.

  • i::I: an interval.

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

source

',5))]),i("details",xs,[i("summary",null,[s[201]||(s[201]=i("a",{id:"ConstraintDomains.intersect_domains-Union{Tuple{I2}, Tuple{I1}, Tuple{I1, I2}} where {I1<:Interval, I2<:Interval}",href:"#ConstraintDomains.intersect_domains-Union{Tuple{I2}, Tuple{I1}, Tuple{I1, I2}} where {I1<:Interval, I2<:Interval}"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains")],-1)),s[202]||(s[202]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[203]||(s[203]=l('
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

',3))]),i("details",As,[i("summary",null,[s[204]||(s[204]=i("a",{id:"ConstraintDomains.merge_domains-Tuple{RangeDomain, RangeDomain}",href:"#ConstraintDomains.merge_domains-Tuple{RangeDomain, RangeDomain}"},[i("span",{class:"jlbinding"},"ConstraintDomains.merge_domains")],-1)),s[205]||(s[205]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[206]||(s[206]=l('
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

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

source

',3))]),i("details",Ds,[i("summary",null,[s[207]||(s[207]=i("a",{id:"ConstraintDomains.set!-Tuple{Explorer, Function}",href:"#ConstraintDomains.set!-Tuple{Explorer, Function}"},[i("span",{class:"jlbinding"},"ConstraintDomains.set!")],-1)),s[208]||(s[208]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[209]||(s[209]=l(`
julia
set!(explorer::Explorer, objective::Function)

Set the objective function for the Explorer object.

Arguments

  • explorer: The Explorer object to modify.

  • objective: A function to use as the objective for optimization.

Returns

Nothing. The Explorer object is modified in-place.

Example

julia
explorer = Explorer()
+set!(explorer, x -> sum(x))

source

`,9))]),i("details",Ts,[i("summary",null,[s[210]||(s[210]=i("a",{id:"ConstraintDomains.size-Tuple{I} where I<:Interval",href:"#ConstraintDomains.size-Tuple{I} where I<:Interval"},[i("span",{class:"jlbinding"},"ConstraintDomains.size")],-1)),s[211]||(s[211]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[212]||(s[212]=l('
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source

',3))]),i("details",ws,[i("summary",null,[s[213]||(s[213]=i("a",{id:"ConstraintDomains.to_domains-Tuple{Vector{Int64}}",href:"#ConstraintDomains.to_domains-Tuple{Vector{Int64}}"},[i("span",{class:"jlbinding"},"ConstraintDomains.to_domains")],-1)),s[214]||(s[214]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[215]||(s[215]=l('
julia
to_domains(args...)

Convert various arguments into valid domains format.

source

',3))]),i("details",Ls,[i("summary",null,[s[216]||(s[216]=i("a",{id:"Constraints.USUAL_CONSTRAINTS",href:"#Constraints.USUAL_CONSTRAINTS"},[i("span",{class:"jlbinding"},"Constraints.USUAL_CONSTRAINTS")],-1)),s[217]||(s[217]=a()),n(t,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[218]||(s[218]=l('
julia
USUAL_CONSTRAINTS::Dict

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

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

Example

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

source

',6))]),i("details",_s,[i("summary",null,[s[219]||(s[219]=i("a",{id:"Constraints.USUAL_SYMMETRIES",href:"#Constraints.USUAL_SYMMETRIES"},[i("span",{class:"jlbinding"},"Constraints.USUAL_SYMMETRIES")],-1)),s[220]||(s[220]=a()),n(t,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[221]||(s[221]=l('
julia
USUAL_SYMMETRIES

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

source

',3))]),i("details",Ms,[i("summary",null,[s[222]||(s[222]=i("a",{id:"Constraints.Constraint",href:"#Constraints.Constraint"},[i("span",{class:"jlbinding"},"Constraints.Constraint")],-1)),s[223]||(s[223]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[224]||(s[224]=l('
julia
Constraint

Parametric structure with the following fields.

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

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

source

',4))]),i("details",Ns,[i("summary",null,[s[225]||(s[225]=i("a",{id:"ConstraintCommons.extract_parameters",href:"#ConstraintCommons.extract_parameters"},[i("span",{class:"jlbinding"},"ConstraintCommons.extract_parameters")],-1)),s[226]||(s[226]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[227]||(s[227]=l('
julia
extract_parameters(s::Symbol, constraints_dict=USUAL_CONSTRAINTS; parameters=ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS)

Return the parameters of the constraint s in constraints_dict.

Arguments

  • s::Symbol: the constraint name.

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

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

Example

julia
extract_parameters(:all_different)

source

',7))]),i("details",Os,[i("summary",null,[s[228]||(s[228]=i("a",{id:"Constraints.args-Tuple{Constraint}",href:"#Constraints.args-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.args")],-1)),s[229]||(s[229]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[230]||(s[230]=l('
julia
args(c::Constraint)

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

source

',3))]),i("details",Is,[i("summary",null,[s[231]||(s[231]=i("a",{id:"Constraints.concept-Tuple{Constraint}",href:"#Constraints.concept-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[232]||(s[232]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[233]||(s[233]=l('
julia
concept(c::Constraint)

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

source

',3))]),i("details",Ss,[i("summary",null,[s[234]||(s[234]=i("a",{id:"Constraints.concept-Tuple{Symbol, Vararg{Any}}",href:"#Constraints.concept-Tuple{Symbol, Vararg{Any}}"},[i("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[235]||(s[235]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[236]||(s[236]=l('
julia
concept(s::Symbol, args...; kargs...)

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

Arguments

  • s::Symbol: the constraint name.

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

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

Example

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

source

',7))]),i("details",Js,[i("summary",null,[s[237]||(s[237]=i("a",{id:"Constraints.concept_vs_error-Tuple{Any, Any, Vararg{Any}}",href:"#Constraints.concept_vs_error-Tuple{Any, Any, Vararg{Any}}"},[i("span",{class:"jlbinding"},"Constraints.concept_vs_error")],-1)),s[238]||(s[238]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[239]||(s[239]=l('
julia
concept_vs_error(c, e, args...; kargs...)

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

Arguments

  • c: The concept function.

  • e: The error function.

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

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

Returns

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

Examples

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

source

',9))]),i("details",Rs,[i("summary",null,[s[240]||(s[240]=i("a",{id:"Constraints.constraints_descriptions",href:"#Constraints.constraints_descriptions"},[i("span",{class:"jlbinding"},"Constraints.constraints_descriptions")],-1)),s[241]||(s[241]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[242]||(s[242]=l('
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

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

Arguments

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

Example

julia
constraints_descriptions()

source

',7))]),i("details",Us,[i("summary",null,[s[243]||(s[243]=i("a",{id:"Constraints.constraints_parameters",href:"#Constraints.constraints_parameters"},[i("span",{class:"jlbinding"},"Constraints.constraints_parameters")],-1)),s[244]||(s[244]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[245]||(s[245]=l('
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

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

Arguments

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

Example

julia
constraints_parameters()

source

',7))]),i("details",Vs,[i("summary",null,[s[246]||(s[246]=i("a",{id:"Constraints.describe",href:"#Constraints.describe"},[i("span",{class:"jlbinding"},"Constraints.describe")],-1)),s[247]||(s[247]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[248]||(s[248]=l('
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

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

Arguments

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

  • width::Int: width of the table.

Example

julia
describe()

source

',7))]),i("details",Ps,[i("summary",null,[s[249]||(s[249]=i("a",{id:"Constraints.error_f-Tuple{Constraint}",href:"#Constraints.error_f-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.error_f")],-1)),s[250]||(s[250]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[251]||(s[251]=l('
julia
error_f(c::Constraint)

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

source

',3))]),i("details",qs,[i("summary",null,[s[252]||(s[252]=i("a",{id:"Constraints.make_error-Tuple{Symbol}",href:"#Constraints.make_error-Tuple{Symbol}"},[i("span",{class:"jlbinding"},"Constraints.make_error")],-1)),s[253]||(s[253]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[254]||(s[254]=l(`
julia
make_error(symb::Symbol)

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

Arguments

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

Returns

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

Examples

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

source

`,9))]),i("details",zs,[i("summary",null,[s[255]||(s[255]=i("a",{id:"Constraints.params_length-Tuple{Constraint}",href:"#Constraints.params_length-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.params_length")],-1)),s[256]||(s[256]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[257]||(s[257]=l('
julia
params_length(c::Constraint)

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

source

',3))]),i("details",Gs,[i("summary",null,[s[258]||(s[258]=i("a",{id:"Constraints.shrink_concept-Tuple{Any}",href:"#Constraints.shrink_concept-Tuple{Any}"},[i("span",{class:"jlbinding"},"Constraints.shrink_concept")],-1)),s[259]||(s[259]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[260]||(s[260]=l('
julia
shrink_concept(s)

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

source

',3))]),i("details",Xs,[i("summary",null,[s[261]||(s[261]=i("a",{id:"Constraints.symmetries-Tuple{Constraint}",href:"#Constraints.symmetries-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.symmetries")],-1)),s[262]||(s[262]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[263]||(s[263]=l('
julia
symmetries(c::Constraint)

Return the list of symmetries of c.

source

',3))]),i("details",Qs,[i("summary",null,[s[264]||(s[264]=i("a",{id:"Constraints.xcsp_all_different-Tuple{Any, Nothing}",href:"#Constraints.xcsp_all_different-Tuple{Any, Nothing}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_all_different")],-1)),s[265]||(s[265]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[266]||(s[266]=l(`
julia
xcsp_all_different(list::Vector{Int})

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

Arguments

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

Variants

  • :all_different: Global constraint ensuring that 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)
diff --git a/dev/assets/api_10_full.md.D8vC0wPZ.lean.js b/dev/assets/api_10_full.md.DufIdSXa.lean.js
similarity index 93%
rename from dev/assets/api_10_full.md.D8vC0wPZ.lean.js
rename to dev/assets/api_10_full.md.DufIdSXa.lean.js
index a4505dc..873a910 100644
--- a/dev/assets/api_10_full.md.D8vC0wPZ.lean.js
+++ b/dev/assets/api_10_full.md.DufIdSXa.lean.js
@@ -28,12 +28,12 @@ import{_ as h,c as o,j as i,a,G as n,a5 as l,t as p,B as k,o as r}from"./chunks/
 d2 = domain([53.69, 89.2, 0.12])
 d3 = domain([2//3, 89//123])
 d4 = domain(4.3)
-d5 = domain(1,42,86.9)

source

`,4))]),i("details",cs,[i("summary",null,[s[168]||(s[168]=i("a",{id:"ConstraintDomains.domain-Tuple{}",href:"#ConstraintDomains.domain-Tuple{}"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[169]||(s[169]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[170]||(s[170]=l('
julia
domain()

Construct an EmptyDomain.

source

',3))]),i("details",ys,[i("summary",null,[s[171]||(s[171]=i("a",{id:"ConstraintDomains.domain-Union{Tuple{Array{Intervals.Interval{T, L, R}, 1}}, Tuple{R}, Tuple{L}, Tuple{T}} where {T<:Real, L, R}",href:"#ConstraintDomains.domain-Union{Tuple{Array{Intervals.Interval{T, L, R}, 1}}, Tuple{R}, Tuple{L}, Tuple{T}} where {T<:Real, L, R}"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[172]||(s[172]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[173]||(s[173]=l(`
julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+d5 = domain(1,42,86.9)

source

`,4))]),i("details",cs,[i("summary",null,[s[168]||(s[168]=i("a",{id:"ConstraintDomains.domain-Tuple{}",href:"#ConstraintDomains.domain-Tuple{}"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[169]||(s[169]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[170]||(s[170]=l('
julia
domain()

Construct an EmptyDomain.

source

',3))]),i("details",ys,[i("summary",null,[s[171]||(s[171]=i("a",{id:"ConstraintDomains.domain-Union{Tuple{Array{Interval{T, L, R}, 1}}, Tuple{R}, Tuple{L}, Tuple{T}} where {T<:Real, L, R}",href:"#ConstraintDomains.domain-Union{Tuple{Array{Interval{T, L, R}, 1}}, Tuple{R}, Tuple{L}, Tuple{T}} where {T<:Real, L, R}"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[172]||(s[172]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[173]||(s[173]=l(`
julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
 domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

`,3))]),i("details",us,[i("summary",null,[s[174]||(s[174]=i("a",{id:"ConstraintDomains.domain_size-Tuple{ConstraintDomains.Intervals}",href:"#ConstraintDomains.domain_size-Tuple{ConstraintDomains.Intervals}"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[175]||(s[175]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[176]||(s[176]=l('
julia
domain_size(itv::Intervals)

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

source

',3))]),i("details",Cs,[i("summary",null,[s[177]||(s[177]=i("a",{id:"ConstraintDomains.domain_size-Tuple{D} where D<:AbstractDomain",href:"#ConstraintDomains.domain_size-Tuple{D} where D<:AbstractDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[178]||(s[178]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[179]||(s[179]=l('
julia
domain_size(d <: AbstractDomain)

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

source

',3))]),i("details",ms,[i("summary",null,[s[180]||(s[180]=i("a",{id:"ConstraintDomains.domain_size-Tuple{D} where D<:DiscreteDomain",href:"#ConstraintDomains.domain_size-Tuple{D} where D<:DiscreteDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[181]||(s[181]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[182]||(s[182]=l('
julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',3))]),i("details",Fs,[i("summary",null,[s[183]||(s[183]=i("a",{id:"ConstraintDomains.explore!-Tuple{Explorer}",href:"#ConstraintDomains.explore!-Tuple{Explorer}"},[i("span",{class:"jlbinding"},"ConstraintDomains.explore!")],-1)),s[184]||(s[184]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[185]||(s[185]=l(`
julia
explore!(explorer::Explorer)

Perform exploration on the search space defined by the Explorer object.

This function explores the search space according to the settings specified in the Explorer object. It updates the Explorer's state with found solutions and non-solutions.

Arguments

  • explorer: An Explorer object containing the problem definition and exploration settings.

Returns

Nothing. The Explorer's state is updated in-place.

Example

julia
explorer = Explorer(concepts, domains)
 explore!(explorer)
 println("Solutions found: ", length(explorer.state.solutions))

source

`,10))]),i("details",bs,[i("summary",null,[s[186]||(s[186]=i("a",{id:"ConstraintDomains.explore-Tuple{Any, Any}",href:"#ConstraintDomains.explore-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"ConstraintDomains.explore")],-1)),s[187]||(s[187]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[188]||(s[188]=l(`
julia
explore(domains, concept; settings = ExploreSettings(domains), parameters...)

Explore a search space defined by domains and a concept.

Arguments

  • domains: A collection of domains representing the search space.

  • concept: The concept function defining the constraint.

  • settings: An ExploreSettings object to configure the exploration process.

  • parameters: Additional parameters to pass to the concept function.

Returns

A tuple containing two sets: (solutions, non_solutions).

Example

julia
domains = [domain([1, 2, 3]), domain([4, 5, 6])]
-solutions, non_solutions = explore(domains, allunique)

source

`,9))]),i("details",vs,[i("summary",null,[s[189]||(s[189]=i("a",{id:"ConstraintDomains.fake_automaton-Tuple{Any}",href:"#ConstraintDomains.fake_automaton-Tuple{Any}"},[i("span",{class:"jlbinding"},"ConstraintDomains.fake_automaton")],-1)),s[190]||(s[190]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[191]||(s[191]=l('
julia
fake_automaton(d)

Construct a FakeAutomaton.

source

',3))]),i("details",js,[i("summary",null,[s[192]||(s[192]=i("a",{id:"ConstraintDomains.generate_parameters-Tuple{AbstractDomain, Symbol}",href:"#ConstraintDomains.generate_parameters-Tuple{AbstractDomain, Symbol}"},[i("span",{class:"jlbinding"},"ConstraintDomains.generate_parameters")],-1)),s[193]||(s[193]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[194]||(s[194]=l('
julia
generate_parameters(d<:AbstractDomain, param)

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

source

',3))]),i("details",fs,[i("summary",null,[s[195]||(s[195]=i("a",{id:"ConstraintDomains.get_domain-Tuple{D} where D<:AbstractDomain",href:"#ConstraintDomains.get_domain-Tuple{D} where D<:AbstractDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.get_domain")],-1)),s[196]||(s[196]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[197]||(s[197]=l('
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

',3))]),i("details",Bs,[i("summary",null,[s[198]||(s[198]=i("a",{id:"ConstraintDomains.intersect_domains!-Union{Tuple{I}, Tuple{IS}, Tuple{IS, I, Any}} where {IS<:ConstraintDomains.Intervals, I<:Intervals.Interval}",href:"#ConstraintDomains.intersect_domains!-Union{Tuple{I}, Tuple{IS}, Tuple{IS, I, Any}} where {IS<:ConstraintDomains.Intervals, I<:Intervals.Interval}"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains!")],-1)),s[199]||(s[199]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[200]||(s[200]=l('
julia
intersect_domains!(is, i, new_itvls)

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

Arguments

  • is::IS: a collection of intervals.

  • i::I: an interval.

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

source

',5))]),i("details",xs,[i("summary",null,[s[201]||(s[201]=i("a",{id:"ConstraintDomains.intersect_domains-Union{Tuple{I2}, Tuple{I1}, Tuple{I1, I2}} where {I1<:Intervals.Interval, I2<:Intervals.Interval}",href:"#ConstraintDomains.intersect_domains-Union{Tuple{I2}, Tuple{I1}, Tuple{I1, I2}} where {I1<:Intervals.Interval, I2<:Intervals.Interval}"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains")],-1)),s[202]||(s[202]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[203]||(s[203]=l('
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

',3))]),i("details",As,[i("summary",null,[s[204]||(s[204]=i("a",{id:"ConstraintDomains.merge_domains-Tuple{RangeDomain, RangeDomain}",href:"#ConstraintDomains.merge_domains-Tuple{RangeDomain, RangeDomain}"},[i("span",{class:"jlbinding"},"ConstraintDomains.merge_domains")],-1)),s[205]||(s[205]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[206]||(s[206]=l('
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

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

source

',3))]),i("details",Ds,[i("summary",null,[s[207]||(s[207]=i("a",{id:"ConstraintDomains.set!-Tuple{Explorer, Function}",href:"#ConstraintDomains.set!-Tuple{Explorer, Function}"},[i("span",{class:"jlbinding"},"ConstraintDomains.set!")],-1)),s[208]||(s[208]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[209]||(s[209]=l(`
julia
set!(explorer::Explorer, objective::Function)

Set the objective function for the Explorer object.

Arguments

  • explorer: The Explorer object to modify.

  • objective: A function to use as the objective for optimization.

Returns

Nothing. The Explorer object is modified in-place.

Example

julia
explorer = Explorer()
-set!(explorer, x -> sum(x))

source

`,9))]),i("details",Ts,[i("summary",null,[s[210]||(s[210]=i("a",{id:"ConstraintDomains.size-Tuple{I} where I<:Intervals.Interval",href:"#ConstraintDomains.size-Tuple{I} where I<:Intervals.Interval"},[i("span",{class:"jlbinding"},"ConstraintDomains.size")],-1)),s[211]||(s[211]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[212]||(s[212]=l('
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source

',3))]),i("details",ws,[i("summary",null,[s[213]||(s[213]=i("a",{id:"ConstraintDomains.to_domains-Tuple{Vector{Int64}}",href:"#ConstraintDomains.to_domains-Tuple{Vector{Int64}}"},[i("span",{class:"jlbinding"},"ConstraintDomains.to_domains")],-1)),s[214]||(s[214]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[215]||(s[215]=l('
julia
to_domains(args...)

Convert various arguments into valid domains format.

source

',3))]),i("details",Ls,[i("summary",null,[s[216]||(s[216]=i("a",{id:"Constraints.USUAL_CONSTRAINTS",href:"#Constraints.USUAL_CONSTRAINTS"},[i("span",{class:"jlbinding"},"Constraints.USUAL_CONSTRAINTS")],-1)),s[217]||(s[217]=a()),n(t,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[218]||(s[218]=l('
julia
USUAL_CONSTRAINTS::Dict

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

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

Example

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

source

',6))]),i("details",_s,[i("summary",null,[s[219]||(s[219]=i("a",{id:"Constraints.USUAL_SYMMETRIES",href:"#Constraints.USUAL_SYMMETRIES"},[i("span",{class:"jlbinding"},"Constraints.USUAL_SYMMETRIES")],-1)),s[220]||(s[220]=a()),n(t,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[221]||(s[221]=l('
julia
USUAL_SYMMETRIES

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

source

',3))]),i("details",Ms,[i("summary",null,[s[222]||(s[222]=i("a",{id:"Constraints.Constraint",href:"#Constraints.Constraint"},[i("span",{class:"jlbinding"},"Constraints.Constraint")],-1)),s[223]||(s[223]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[224]||(s[224]=l('
julia
Constraint

Parametric structure with the following fields.

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

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

source

',4))]),i("details",Ns,[i("summary",null,[s[225]||(s[225]=i("a",{id:"ConstraintCommons.extract_parameters",href:"#ConstraintCommons.extract_parameters"},[i("span",{class:"jlbinding"},"ConstraintCommons.extract_parameters")],-1)),s[226]||(s[226]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[227]||(s[227]=l('
julia
extract_parameters(s::Symbol, constraints_dict=USUAL_CONSTRAINTS; parameters=ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS)

Return the parameters of the constraint s in constraints_dict.

Arguments

  • s::Symbol: the constraint name.

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

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

Example

julia
extract_parameters(:all_different)

source

',7))]),i("details",Os,[i("summary",null,[s[228]||(s[228]=i("a",{id:"Constraints.args-Tuple{Constraint}",href:"#Constraints.args-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.args")],-1)),s[229]||(s[229]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[230]||(s[230]=l('
julia
args(c::Constraint)

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

source

',3))]),i("details",Is,[i("summary",null,[s[231]||(s[231]=i("a",{id:"Constraints.concept-Tuple{Constraint}",href:"#Constraints.concept-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[232]||(s[232]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[233]||(s[233]=l('
julia
concept(c::Constraint)

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

source

',3))]),i("details",Ss,[i("summary",null,[s[234]||(s[234]=i("a",{id:"Constraints.concept-Tuple{Symbol, Vararg{Any}}",href:"#Constraints.concept-Tuple{Symbol, Vararg{Any}}"},[i("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[235]||(s[235]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[236]||(s[236]=l('
julia
concept(s::Symbol, args...; kargs...)

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

Arguments

  • s::Symbol: the constraint name.

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

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

Example

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

source

',7))]),i("details",Js,[i("summary",null,[s[237]||(s[237]=i("a",{id:"Constraints.concept_vs_error-Tuple{Any, Any, Vararg{Any}}",href:"#Constraints.concept_vs_error-Tuple{Any, Any, Vararg{Any}}"},[i("span",{class:"jlbinding"},"Constraints.concept_vs_error")],-1)),s[238]||(s[238]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[239]||(s[239]=l('
julia
concept_vs_error(c, e, args...; kargs...)

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

Arguments

  • c: The concept function.

  • e: The error function.

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

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

Returns

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

Examples

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

source

',9))]),i("details",Rs,[i("summary",null,[s[240]||(s[240]=i("a",{id:"Constraints.constraints_descriptions",href:"#Constraints.constraints_descriptions"},[i("span",{class:"jlbinding"},"Constraints.constraints_descriptions")],-1)),s[241]||(s[241]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[242]||(s[242]=l('
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

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

Arguments

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

Example

julia
constraints_descriptions()

source

',7))]),i("details",Us,[i("summary",null,[s[243]||(s[243]=i("a",{id:"Constraints.constraints_parameters",href:"#Constraints.constraints_parameters"},[i("span",{class:"jlbinding"},"Constraints.constraints_parameters")],-1)),s[244]||(s[244]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[245]||(s[245]=l('
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

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

Arguments

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

Example

julia
constraints_parameters()

source

',7))]),i("details",Vs,[i("summary",null,[s[246]||(s[246]=i("a",{id:"Constraints.describe",href:"#Constraints.describe"},[i("span",{class:"jlbinding"},"Constraints.describe")],-1)),s[247]||(s[247]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[248]||(s[248]=l('
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

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

Arguments

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

  • width::Int: width of the table.

Example

julia
describe()

source

',7))]),i("details",Ps,[i("summary",null,[s[249]||(s[249]=i("a",{id:"Constraints.error_f-Tuple{Constraint}",href:"#Constraints.error_f-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.error_f")],-1)),s[250]||(s[250]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[251]||(s[251]=l('
julia
error_f(c::Constraint)

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

source

',3))]),i("details",qs,[i("summary",null,[s[252]||(s[252]=i("a",{id:"Constraints.make_error-Tuple{Symbol}",href:"#Constraints.make_error-Tuple{Symbol}"},[i("span",{class:"jlbinding"},"Constraints.make_error")],-1)),s[253]||(s[253]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[254]||(s[254]=l(`
julia
make_error(symb::Symbol)

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

Arguments

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

Returns

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

Examples

julia
e = make_error(:all_different)
+solutions, non_solutions = explore(domains, allunique)

source

`,9))]),i("details",vs,[i("summary",null,[s[189]||(s[189]=i("a",{id:"ConstraintDomains.fake_automaton-Tuple{Any}",href:"#ConstraintDomains.fake_automaton-Tuple{Any}"},[i("span",{class:"jlbinding"},"ConstraintDomains.fake_automaton")],-1)),s[190]||(s[190]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[191]||(s[191]=l('
julia
fake_automaton(d)

Construct a FakeAutomaton.

source

',3))]),i("details",js,[i("summary",null,[s[192]||(s[192]=i("a",{id:"ConstraintDomains.generate_parameters-Tuple{AbstractDomain, Symbol}",href:"#ConstraintDomains.generate_parameters-Tuple{AbstractDomain, Symbol}"},[i("span",{class:"jlbinding"},"ConstraintDomains.generate_parameters")],-1)),s[193]||(s[193]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[194]||(s[194]=l('
julia
generate_parameters(d<:AbstractDomain, param)

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

source

',3))]),i("details",fs,[i("summary",null,[s[195]||(s[195]=i("a",{id:"ConstraintDomains.get_domain-Tuple{D} where D<:AbstractDomain",href:"#ConstraintDomains.get_domain-Tuple{D} where D<:AbstractDomain"},[i("span",{class:"jlbinding"},"ConstraintDomains.get_domain")],-1)),s[196]||(s[196]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[197]||(s[197]=l('
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

',3))]),i("details",Bs,[i("summary",null,[s[198]||(s[198]=i("a",{id:"ConstraintDomains.intersect_domains!-Union{Tuple{I}, Tuple{IS}, Tuple{IS, I, Any}} where {IS<:ConstraintDomains.Intervals, I<:Interval}",href:"#ConstraintDomains.intersect_domains!-Union{Tuple{I}, Tuple{IS}, Tuple{IS, I, Any}} where {IS<:ConstraintDomains.Intervals, I<:Interval}"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains!")],-1)),s[199]||(s[199]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[200]||(s[200]=l('
julia
intersect_domains!(is, i, new_itvls)

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

Arguments

  • is::IS: a collection of intervals.

  • i::I: an interval.

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

source

',5))]),i("details",xs,[i("summary",null,[s[201]||(s[201]=i("a",{id:"ConstraintDomains.intersect_domains-Union{Tuple{I2}, Tuple{I1}, Tuple{I1, I2}} where {I1<:Interval, I2<:Interval}",href:"#ConstraintDomains.intersect_domains-Union{Tuple{I2}, Tuple{I1}, Tuple{I1, I2}} where {I1<:Interval, I2<:Interval}"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains")],-1)),s[202]||(s[202]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[203]||(s[203]=l('
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

',3))]),i("details",As,[i("summary",null,[s[204]||(s[204]=i("a",{id:"ConstraintDomains.merge_domains-Tuple{RangeDomain, RangeDomain}",href:"#ConstraintDomains.merge_domains-Tuple{RangeDomain, RangeDomain}"},[i("span",{class:"jlbinding"},"ConstraintDomains.merge_domains")],-1)),s[205]||(s[205]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[206]||(s[206]=l('
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

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

source

',3))]),i("details",Ds,[i("summary",null,[s[207]||(s[207]=i("a",{id:"ConstraintDomains.set!-Tuple{Explorer, Function}",href:"#ConstraintDomains.set!-Tuple{Explorer, Function}"},[i("span",{class:"jlbinding"},"ConstraintDomains.set!")],-1)),s[208]||(s[208]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[209]||(s[209]=l(`
julia
set!(explorer::Explorer, objective::Function)

Set the objective function for the Explorer object.

Arguments

  • explorer: The Explorer object to modify.

  • objective: A function to use as the objective for optimization.

Returns

Nothing. The Explorer object is modified in-place.

Example

julia
explorer = Explorer()
+set!(explorer, x -> sum(x))

source

`,9))]),i("details",Ts,[i("summary",null,[s[210]||(s[210]=i("a",{id:"ConstraintDomains.size-Tuple{I} where I<:Interval",href:"#ConstraintDomains.size-Tuple{I} where I<:Interval"},[i("span",{class:"jlbinding"},"ConstraintDomains.size")],-1)),s[211]||(s[211]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[212]||(s[212]=l('
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source

',3))]),i("details",ws,[i("summary",null,[s[213]||(s[213]=i("a",{id:"ConstraintDomains.to_domains-Tuple{Vector{Int64}}",href:"#ConstraintDomains.to_domains-Tuple{Vector{Int64}}"},[i("span",{class:"jlbinding"},"ConstraintDomains.to_domains")],-1)),s[214]||(s[214]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[215]||(s[215]=l('
julia
to_domains(args...)

Convert various arguments into valid domains format.

source

',3))]),i("details",Ls,[i("summary",null,[s[216]||(s[216]=i("a",{id:"Constraints.USUAL_CONSTRAINTS",href:"#Constraints.USUAL_CONSTRAINTS"},[i("span",{class:"jlbinding"},"Constraints.USUAL_CONSTRAINTS")],-1)),s[217]||(s[217]=a()),n(t,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[218]||(s[218]=l('
julia
USUAL_CONSTRAINTS::Dict

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

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

Example

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

source

',6))]),i("details",_s,[i("summary",null,[s[219]||(s[219]=i("a",{id:"Constraints.USUAL_SYMMETRIES",href:"#Constraints.USUAL_SYMMETRIES"},[i("span",{class:"jlbinding"},"Constraints.USUAL_SYMMETRIES")],-1)),s[220]||(s[220]=a()),n(t,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[221]||(s[221]=l('
julia
USUAL_SYMMETRIES

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

source

',3))]),i("details",Ms,[i("summary",null,[s[222]||(s[222]=i("a",{id:"Constraints.Constraint",href:"#Constraints.Constraint"},[i("span",{class:"jlbinding"},"Constraints.Constraint")],-1)),s[223]||(s[223]=a()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[224]||(s[224]=l('
julia
Constraint

Parametric structure with the following fields.

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

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

source

',4))]),i("details",Ns,[i("summary",null,[s[225]||(s[225]=i("a",{id:"ConstraintCommons.extract_parameters",href:"#ConstraintCommons.extract_parameters"},[i("span",{class:"jlbinding"},"ConstraintCommons.extract_parameters")],-1)),s[226]||(s[226]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[227]||(s[227]=l('
julia
extract_parameters(s::Symbol, constraints_dict=USUAL_CONSTRAINTS; parameters=ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS)

Return the parameters of the constraint s in constraints_dict.

Arguments

  • s::Symbol: the constraint name.

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

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

Example

julia
extract_parameters(:all_different)

source

',7))]),i("details",Os,[i("summary",null,[s[228]||(s[228]=i("a",{id:"Constraints.args-Tuple{Constraint}",href:"#Constraints.args-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.args")],-1)),s[229]||(s[229]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[230]||(s[230]=l('
julia
args(c::Constraint)

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

source

',3))]),i("details",Is,[i("summary",null,[s[231]||(s[231]=i("a",{id:"Constraints.concept-Tuple{Constraint}",href:"#Constraints.concept-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[232]||(s[232]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[233]||(s[233]=l('
julia
concept(c::Constraint)

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

source

',3))]),i("details",Ss,[i("summary",null,[s[234]||(s[234]=i("a",{id:"Constraints.concept-Tuple{Symbol, Vararg{Any}}",href:"#Constraints.concept-Tuple{Symbol, Vararg{Any}}"},[i("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[235]||(s[235]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[236]||(s[236]=l('
julia
concept(s::Symbol, args...; kargs...)

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

Arguments

  • s::Symbol: the constraint name.

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

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

Example

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

source

',7))]),i("details",Js,[i("summary",null,[s[237]||(s[237]=i("a",{id:"Constraints.concept_vs_error-Tuple{Any, Any, Vararg{Any}}",href:"#Constraints.concept_vs_error-Tuple{Any, Any, Vararg{Any}}"},[i("span",{class:"jlbinding"},"Constraints.concept_vs_error")],-1)),s[238]||(s[238]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[239]||(s[239]=l('
julia
concept_vs_error(c, e, args...; kargs...)

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

Arguments

  • c: The concept function.

  • e: The error function.

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

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

Returns

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

Examples

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

source

',9))]),i("details",Rs,[i("summary",null,[s[240]||(s[240]=i("a",{id:"Constraints.constraints_descriptions",href:"#Constraints.constraints_descriptions"},[i("span",{class:"jlbinding"},"Constraints.constraints_descriptions")],-1)),s[241]||(s[241]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[242]||(s[242]=l('
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

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

Arguments

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

Example

julia
constraints_descriptions()

source

',7))]),i("details",Us,[i("summary",null,[s[243]||(s[243]=i("a",{id:"Constraints.constraints_parameters",href:"#Constraints.constraints_parameters"},[i("span",{class:"jlbinding"},"Constraints.constraints_parameters")],-1)),s[244]||(s[244]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[245]||(s[245]=l('
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

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

Arguments

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

Example

julia
constraints_parameters()

source

',7))]),i("details",Vs,[i("summary",null,[s[246]||(s[246]=i("a",{id:"Constraints.describe",href:"#Constraints.describe"},[i("span",{class:"jlbinding"},"Constraints.describe")],-1)),s[247]||(s[247]=a()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[248]||(s[248]=l('
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

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

Arguments

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

  • width::Int: width of the table.

Example

julia
describe()

source

',7))]),i("details",Ps,[i("summary",null,[s[249]||(s[249]=i("a",{id:"Constraints.error_f-Tuple{Constraint}",href:"#Constraints.error_f-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.error_f")],-1)),s[250]||(s[250]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[251]||(s[251]=l('
julia
error_f(c::Constraint)

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

source

',3))]),i("details",qs,[i("summary",null,[s[252]||(s[252]=i("a",{id:"Constraints.make_error-Tuple{Symbol}",href:"#Constraints.make_error-Tuple{Symbol}"},[i("span",{class:"jlbinding"},"Constraints.make_error")],-1)),s[253]||(s[253]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[254]||(s[254]=l(`
julia
make_error(symb::Symbol)

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

Arguments

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

Returns

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

Examples

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

source

`,9))]),i("details",zs,[i("summary",null,[s[255]||(s[255]=i("a",{id:"Constraints.params_length-Tuple{Constraint}",href:"#Constraints.params_length-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.params_length")],-1)),s[256]||(s[256]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[257]||(s[257]=l('
julia
params_length(c::Constraint)

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

source

',3))]),i("details",Gs,[i("summary",null,[s[258]||(s[258]=i("a",{id:"Constraints.shrink_concept-Tuple{Any}",href:"#Constraints.shrink_concept-Tuple{Any}"},[i("span",{class:"jlbinding"},"Constraints.shrink_concept")],-1)),s[259]||(s[259]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[260]||(s[260]=l('
julia
shrink_concept(s)

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

source

',3))]),i("details",Xs,[i("summary",null,[s[261]||(s[261]=i("a",{id:"Constraints.symmetries-Tuple{Constraint}",href:"#Constraints.symmetries-Tuple{Constraint}"},[i("span",{class:"jlbinding"},"Constraints.symmetries")],-1)),s[262]||(s[262]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[263]||(s[263]=l('
julia
symmetries(c::Constraint)

Return the list of symmetries of c.

source

',3))]),i("details",Qs,[i("summary",null,[s[264]||(s[264]=i("a",{id:"Constraints.xcsp_all_different-Tuple{Any, Nothing}",href:"#Constraints.xcsp_all_different-Tuple{Any, Nothing}"},[i("span",{class:"jlbinding"},"Constraints.xcsp_all_different")],-1)),s[265]||(s[265]=a()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[266]||(s[266]=l(`
julia
xcsp_all_different(list::Vector{Int})

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

Arguments

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

Variants

  • :all_different: Global constraint ensuring that 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)
diff --git a/dev/assets/app.D4JOo1Qb.js b/dev/assets/app.0vyYWcLK.js
similarity index 95%
rename from dev/assets/app.D4JOo1Qb.js
rename to dev/assets/app.0vyYWcLK.js
index f7062a7..15a7de2 100644
--- a/dev/assets/app.D4JOo1Qb.js
+++ b/dev/assets/app.0vyYWcLK.js
@@ -1 +1 @@
-import{R as p}from"./chunks/theme.C_ksEfTU.js";import{R as o,a6 as u,a7 as c,a8 as l,a9 as f,aa as d,ab as m,ac as h,ad as g,ae as A,af as v,d as P,u as R,v as w,s as y,ag as C,ah as b,ai as E,a4 as S}from"./chunks/framework.CJakPlgM.js";function i(e){if(e.extends){const a=i(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=i(p),T=P({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=R();return w(()=>{y(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&C(),b(),E(),s.setup&&s.setup(),()=>S(s.Layout)}});async function D(){globalThis.__VITEPRESS__=!0;const e=j(),a=_();a.provide(c,e);const t=l(e.route);return a.provide(f,t),a.component("Content",d),a.component("ClientOnly",m),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:h}),{app:a,router:e,data:t}}function _(){return g(T)}function j(){let e=o,a;return A(t=>{let n=v(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=import(n)),o&&(e=!1),r},s.NotFound)}o&&D().then(({app:e,router:a,data:t})=>{a.go().then(()=>{u(a.route,t.site),e.mount("#app")})});export{D as createApp};
+import{R as p}from"./chunks/theme.CrvsPs-y.js";import{R as o,a6 as u,a7 as c,a8 as l,a9 as f,aa as d,ab as m,ac as h,ad as g,ae as A,af as v,d as P,u as R,v as w,s as y,ag as C,ah as b,ai as E,a4 as S}from"./chunks/framework.CJakPlgM.js";function i(e){if(e.extends){const a=i(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=i(p),T=P({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=R();return w(()=>{y(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&C(),b(),E(),s.setup&&s.setup(),()=>S(s.Layout)}});async function D(){globalThis.__VITEPRESS__=!0;const e=j(),a=_();a.provide(c,e);const t=l(e.route);return a.provide(f,t),a.component("Content",d),a.component("ClientOnly",m),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:h}),{app:a,router:e,data:t}}function _(){return g(T)}function j(){let e=o,a;return A(t=>{let n=v(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=import(n)),o&&(e=!1),r},s.NotFound)}o&&D().then(({app:e,router:a,data:t})=>{a.go().then(()=>{u(a.route,t.site),e.mount("#app")})});export{D as createApp};
diff --git a/dev/assets/chunks/@localSearchIndexroot.BsFtsJ1K.js b/dev/assets/chunks/@localSearchIndexroot.BsFtsJ1K.js
deleted file mode 100644
index 7ded913..0000000
--- a/dev/assets/chunks/@localSearchIndexroot.BsFtsJ1K.js
+++ /dev/null
@@ -1 +0,0 @@
-const t='{"documentCount":158,"nextId":158,"documentIds":{"0":"/dev/api/00_public#Public-API","1":"/dev/api/10_full#Full-API","2":"/dev/constraints/00_intro#Introduction-to-basics-constraint-based-modeling-tools","3":"/dev/constraints/00_intro#terminology","4":"/dev/constraints/00_intro#constraint","5":"/dev/constraints/00_intro#Constraint-Instantiation","6":"/dev/constraints/00_intro#configuration","7":"/dev/constraints/00_intro#Constraint-Satisfaction-or-Violation-by-a-Configuration","8":"/dev/constraints/00_intro#Domain-defined-variables","9":"/dev/constraints/00_intro#A-versatile-constraints\'-API","10":"/dev/constraints/00_intro#A-collection-of-models","11":"/dev/constraints/00_intro#Internal-Aspects","12":"/dev/constraints/10_variables_and_domains#Defining-Variables-and-Exploring-Domains","13":"/dev/constraints/10_variables_and_domains#Implementing-the-AbstractDomain-Interface","14":"/dev/constraints/10_variables_and_domains#Discrete-Domains","15":"/dev/constraints/10_variables_and_domains#SetDomain","16":"/dev/constraints/10_variables_and_domains#RangeDomain","17":"/dev/constraints/10_variables_and_domains#Arbitrary-Domains","18":"/dev/constraints/10_variables_and_domains#Continuous-Domains","19":"/dev/constraints/20_constraints#Interacting-with-Constraints-in-Julia","20":"/dev/constraints/20_constraints#Usual-Constraints-and-Parameters","21":"/dev/constraints/20_constraints#Concepts,-Error-Functions,-and-QUBO-matrices","22":"/dev/constraints/21_generic_constraints#Generic-Constraints","23":"/dev/constraints/21_generic_constraints#Intention-Constraints","24":"/dev/constraints/21_generic_constraints#Defining-an-intention-constraint-in-JC-API","25":"/dev/constraints/21_generic_constraints#apis","26":"/dev/constraints/21_generic_constraints#Extension-Constraints","27":"/dev/constraints/22_language_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","28":"/dev/constraints/22_language_constraints#Constraints-defined-from-Languages","29":"/dev/constraints/23_comparison_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","30":"/dev/constraints/23_comparison_constraints#Comparison-based-Constraints","31":"/dev/constraints/24_counting_summing_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","32":"/dev/constraints/24_counting_summing_constraints#Counting-and-Summing-Constraints","33":"/dev/constraints/25_connection_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","34":"/dev/constraints/25_connection_constraints#Connection-Constraints","35":"/dev/constraints/26_packing_scheduling_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","36":"/dev/constraints/26_packing_scheduling_constraints#Packing-and-Scheduling-Constraints","37":"/dev/constraints/27_graph_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","38":"/dev/constraints/27_graph_constraints#Constraints-on-Graphs","39":"/dev/constraints/28_elementary_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","40":"/dev/constraints/28_elementary_constraints#Elementary-Constraints","41":"/dev/constraints/40_constraint_models#constraintmodels-jl","42":"/dev/constraints/60_constraint_commons#constraintcommons-jl","43":"/dev/constraints/60_constraint_commons#parameters","44":"/dev/constraints/60_constraint_commons#performances","45":"/dev/constraints/60_constraint_commons#languages","46":"/dev/constraints/60_constraint_commons#Performances-2","47":"/dev/constraints/60_constraint_commons#extensions","48":"/dev/constraints/60_constraint_commons#Performances-3","49":"/dev/constraints/60_constraint_commons#sampling","50":"/dev/constraints/60_constraint_commons#Performances-4","51":"/dev/constraints/60_constraint_commons#extrema","52":"/dev/constraints/60_constraint_commons#Performances-5","53":"/dev/constraints/60_constraint_commons#dictionaries","54":"/dev/constraints/60_constraint_commons#Performances-6","55":"/dev/constraints/61_constraint_domains#ConstraintDomains.jl:-Defining-Variables-and-Exploring-Domains","56":"/dev/constraints/61_constraint_domains#commons","57":"/dev/constraints/61_constraint_domains#Extension-to-Base-module","58":"/dev/constraints/61_constraint_domains#performances","59":"/dev/constraints/61_constraint_domains#continuous","60":"/dev/constraints/61_constraint_domains#Extension-to-Base-module-2","61":"/dev/constraints/61_constraint_domains#Performances-2","62":"/dev/constraints/61_constraint_domains#discrete","63":"/dev/constraints/61_constraint_domains#Extension-to-Base-module-3","64":"/dev/constraints/61_constraint_domains#Performances-3","65":"/dev/constraints/61_constraint_domains#general","66":"/dev/constraints/61_constraint_domains#exploration","67":"/dev/constraints/61_constraint_domains#Performances-4","68":"/dev/constraints/61_constraint_domains#parameters","69":"/dev/constraints/62_constraints_jl#Interacting-with-Constraints-in-Julia","70":"/dev/constraints/62_constraints_jl#Usual-Parameters","71":"/dev/constraints/62_constraints_jl#Concepts,-Error-Functions,-and-QUBO-matrices","72":"/dev/constraints/62_constraints_jl#Usual-Constraints","73":"/dev/cp/00_intro#Welcome-to-Julia-Constraints","74":"/dev/cp/10_cp101#Constraint-Programming-101","75":"/dev/cp/10_cp101#What-is-Constraint-Programming?","76":"/dev/cp/10_cp101#Basic-Concepts-and-Terminology","77":"/dev/cp/10_cp101#How-CP-differs-from-other-optimization-techniques","78":"/dev/cp/20_opt#Dive-into-Optimization","79":"/dev/cp/20_opt#Understanding-Optimization","80":"/dev/cp/20_opt#Metaheuristics-Overview","81":"/dev/cp/20_opt#Mathematical-Programming-Basics","82":"/dev/cp/30_getting_started#Getting-Started-with-Julia-for-CP-and-Optimization","83":"/dev/cp/30_getting_started#Why-Julia?","84":"/dev/cp/30_getting_started#Setting-Up-Your-Julia-Environment","85":"/dev/cp/30_getting_started#Your-First-Julia-CP-Model","86":"/dev/cp/40_ecosystem#Exploring-JuliaConstraint-Packages","87":"/dev/cp/40_ecosystem#Package-Overviews","88":"/dev/cp/40_ecosystem#Installation-and-Getting-Started-Guides","89":"/dev/cp/50_advanced#Advanced-Constraint-Programming-Techniques","90":"/dev/cp/50_advanced#Global-Constraints-and-Their-Uses","91":"/dev/cp/50_advanced#Search-Strategies-and-Optimization","92":"/dev/cp/60_applications#Applying-Optimization-Methods","93":"/dev/cp/60_applications#Case-Studies-and-Real-World-Applications","94":"/dev/cp/60_applications#From-Theory-to-Practice","95":"/dev/cp/70_models#Building-and-Analyzing-Models","96":"/dev/cp/70_models#Modeling-Best-Practices","97":"/dev/cp/70_models#Performance-Analysis-and-Improvement","98":"/dev/cp/80_tuto_xp#Tutorials-and-Experiments","99":"/dev/cp/80_tuto_xp#Hands-On-Tutorials","100":"/dev/cp/80_tuto_xp#Experimental-Analysis","101":"/dev/cp/90_contribution#Community-and-Contribution","102":"/dev/cp/90_contribution#Joining-the-JuliaConstraint-Community","103":"/dev/cp/90_contribution#Future-Directions","104":"/dev/learning/00_intro#Learning-about-Constraints","105":"/dev/learning/00_intro#parameters","106":"/dev/learning/10_compositional_networks#compositionalnetworks-jl","107":"/dev/learning/10_compositional_networks#utilities","108":"/dev/learning/10_compositional_networks#metrics","109":"/dev/learning/11_layers#A-layer-structure-for-any-ICN","110":"/dev/learning/12_transformation#Transformations-Layer","111":"/dev/learning/12_transformation#List-of-transformations","112":"/dev/learning/12_transformation#non-parametric","113":"/dev/learning/12_transformation#Param:-:val","114":"/dev/learning/12_transformation#Layer-generation","115":"/dev/learning/13_arithmetic#Arithmetic-Layer","116":"/dev/learning/13_arithmetic#List-of-arithmetic-operations","117":"/dev/learning/13_arithmetic#Layer-generation","118":"/dev/learning/14_aggregation#Aggregation-Layer","119":"/dev/learning/14_aggregation#List-of-aggregations","120":"/dev/learning/14_aggregation#Layer-generation","121":"/dev/learning/15_comparison#Comparison-Layer","122":"/dev/learning/15_comparison#List-of-comparisons","123":"/dev/learning/15_comparison#non-parametric","124":"/dev/learning/15_comparison#Param:-:val","125":"/dev/learning/15_comparison#Layer-generation","126":"/dev/learning/20_qubo_constraints#Introduction-to-QUBOConstraints.jl","127":"/dev/learning/20_qubo_constraints#Basic-features","128":"/dev/learning/21_qubo_encoding#Encoding-for-QUBO-programs","129":"/dev/learning/22_qubo_learning#Learning-QUBO-matrices","130":"/dev/learning/22_qubo_learning#interface","131":"/dev/learning/22_qubo_learning#Examples-with-various-optimizers","132":"/dev/learning/22_qubo_learning#Gradient-Descent","133":"/dev/learning/22_qubo_learning#Constraint-based-Local-Search","134":"/dev/learning/30_constraints_translator#constraintstranslator-jl","135":"/dev/learning/90_constraint_learning#constraintlearning-jl","136":"/dev/perf/00_perf_checker#perfchecker-jl","137":"/dev/perf/00_perf_checker#usage","138":"/dev/perf/10_tutorial#tutorial","139":"/dev/perf/20_perf_interface#Extending-PerfChecker","140":"/dev/perf/20_perf_interface#The-Default-Options","141":"/dev/perf/20_perf_interface#Package-initialization","142":"/dev/perf/20_perf_interface#Preparatory-Code:","143":"/dev/perf/20_perf_interface#Main-Code-to-be-Performance-Tested","144":"/dev/perf/20_perf_interface#Post-Performance-Testing-Code","145":"/dev/perf/20_perf_interface#Converting-the-result-into-a-Table","146":"/dev/perf/30_benchmark_ext#BenchmarkTools-Extension","147":"/dev/perf/30_benchmark_ext#usage","148":"/dev/perf/30_benchmark_ext#options","149":"/dev/perf/40_chairmarks_ext#Chairmarks-Extension","150":"/dev/perf/40_chairmarks_ext#usage","151":"/dev/perf/40_chairmarks_ext#options","152":"/dev/perf/90_api#api","153":"/dev/solvers/00_intro#solvers","154":"/dev/solvers/10_cbls#cbls-jl","155":"/dev/solvers/40_constraint_explorer#constraintexplorer-jl","156":"/dev/solvers/50_local_search_solvers#localsearchsolvers-jl","157":"/dev/solvers/80_meta_strategist#metastrategist-jl"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[2,1,795],"1":[2,1,1364],"2":[7,1,54],"3":[1,7,49],"4":[1,8,42],"5":[2,8,40],"6":[1,8,39],"7":[7,8,49],"8":[3,7,28],"9":[5,7,36],"10":[4,7,38],"11":[2,7,40],"12":[5,1,54],"13":[4,5,88],"14":[2,5,20],"15":[1,6,57],"16":[1,6,78],"17":[2,6,37],"18":[2,5,50],"19":[5,1,51],"20":[4,5,172],"21":[6,5,99],"22":[2,1,17],"23":[2,2,77],"24":[7,3,68],"25":[1,3,101],"26":[2,2,109],"27":[9,1,1],"28":[4,9,118],"29":[9,1,79],"30":[3,9,72],"31":[9,1,112],"32":[4,9,131],"33":[9,1,82],"34":[2,9,95],"35":[9,1,66],"36":[4,9,103],"37":[9,1,1],"38":[3,9,68],"39":[9,1,1],"40":[2,9,54],"41":[2,1,283],"42":[2,1,66],"43":[1,2,114],"44":[1,3,1],"45":[1,2,82],"46":[1,3,1],"47":[1,2,43],"48":[1,3,1],"49":[1,2,42],"50":[1,3,1],"51":[1,2,28],"52":[1,3,1],"53":[1,2,34],"54":[1,3,1],"55":[7,1,45],"56":[1,7,133],"57":[4,8,84],"58":[1,8,1],"59":[1,7,123],"60":[4,8,91],"61":[1,8,1],"62":[1,7,133],"63":[4,8,95],"64":[1,8,1],"65":[1,7,16],"66":[1,7,123],"67":[1,8,1],"68":[1,7,111],"69":[5,1,49],"70":[2,5,106],"71":[6,5,100],"72":[2,5,93],"73":[4,1,35],"74":[3,1,1],"75":[5,3,10],"76":[4,3,10],"77":[7,3,10],"78":[3,1,1],"79":[2,3,12],"80":[2,3,11],"81":[3,3,12],"82":[8,1,1],"83":[3,8,16],"84":[5,8,104],"85":[5,8,191],"86":[3,1,1],"87":[2,3,13],"88":[5,1,13],"89":[4,1,1],"90":[5,4,12],"91":[4,4,12],"92":[3,1,1],"93":[6,3,11],"94":[4,3,18],"95":[4,1,1],"96":[3,4,12],"97":[4,4,11],"98":[3,1,1],"99":[3,3,11],"100":[2,3,15],"101":[3,1,1],"102":[4,3,14],"103":[2,3,13],"104":[3,1,6],"105":[1,3,131],"106":[2,1,5],"107":[1,2,93],"108":[1,2,46],"109":[6,1,134],"110":[2,1,30],"111":[3,2,10],"112":[2,5,63],"113":[2,5,55],"114":[2,5,157],"115":[2,1,11],"116":[4,2,19],"117":[2,2,22],"118":[2,1,11],"119":[3,2,23],"120":[2,2,23],"121":[2,1,11],"122":[3,2,10],"123":[2,5,51],"124":[2,5,34],"125":[2,5,42],"126":[4,1,5],"127":[2,4,32],"128":[4,1,61],"129":[3,1,1],"130":[1,3,27],"131":[4,3,1],"132":[2,7,102],"133":[4,7,1],"134":[2,1,5],"135":[2,1,227],"136":[2,1,51],"137":[1,2,150],"138":[1,1,129],"139":[2,1,49],"140":[3,2,53],"141":[2,2,38],"142":[3,2,58],"143":[6,2,61],"144":[4,2,42],"145":[6,2,59],"146":[2,1,26],"147":[1,2,48],"148":[1,2,31],"149":[2,1,26],"150":[1,2,49],"151":[1,2,25],"152":[1,1,53],"153":[1,1,3],"154":[2,1,470],"155":[2,1,5],"156":[2,1,501],"157":[2,1,5]},"averageFieldLength":[2.9936708860759484,3.4873417721519,67.05696202531648],"storedFields":{"0":{"title":"Public API","titles":[]},"1":{"title":"Full API","titles":[]},"2":{"title":"Introduction to basics constraint-based modeling tools","titles":[]},"3":{"title":"Terminology","titles":["Introduction to basics constraint-based modeling tools"]},"4":{"title":"Constraint","titles":["Introduction to basics constraint-based modeling tools","Terminology"]},"5":{"title":"Constraint Instantiation","titles":["Introduction to basics constraint-based modeling tools","Terminology"]},"6":{"title":"Configuration","titles":["Introduction to basics constraint-based modeling tools","Terminology"]},"7":{"title":"Constraint Satisfaction or Violation by a Configuration","titles":["Introduction to basics constraint-based modeling tools","Terminology"]},"8":{"title":"Domain-defined variables","titles":["Introduction to basics constraint-based modeling tools"]},"9":{"title":"A versatile constraints' API","titles":["Introduction to basics constraint-based modeling tools"]},"10":{"title":"A collection of models","titles":["Introduction to basics constraint-based modeling tools"]},"11":{"title":"Internal Aspects","titles":["Introduction to basics constraint-based modeling tools"]},"12":{"title":"Defining Variables and Exploring Domains","titles":[]},"13":{"title":"Implementing the AbstractDomain Interface","titles":["Defining Variables and Exploring Domains"]},"14":{"title":"Discrete Domains","titles":["Defining Variables and Exploring Domains"]},"15":{"title":"SetDomain","titles":["Defining Variables and Exploring Domains","Discrete Domains"]},"16":{"title":"RangeDomain","titles":["Defining Variables and Exploring Domains","Discrete Domains"]},"17":{"title":"Arbitrary Domains","titles":["Defining Variables and Exploring Domains","Discrete Domains"]},"18":{"title":"Continuous Domains","titles":["Defining Variables and Exploring Domains"]},"19":{"title":"Interacting with Constraints in Julia","titles":[]},"20":{"title":"Usual Constraints and Parameters","titles":["Interacting with Constraints in Julia"]},"21":{"title":"Concepts, Error Functions, and QUBO matrices","titles":["Interacting with Constraints in Julia"]},"22":{"title":"Generic Constraints","titles":[]},"23":{"title":"Intention Constraints","titles":["Generic Constraints"]},"24":{"title":"Defining an intention constraint in JC-API","titles":["Generic Constraints","Intention Constraints"]},"25":{"title":"APIs","titles":["Generic Constraints","Intention Constraints"]},"26":{"title":"Extension Constraints","titles":["Generic Constraints"]},"27":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"28":{"title":"Constraints defined from Languages","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"29":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"30":{"title":"Comparison-based Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"31":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"32":{"title":"Counting and Summing Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"33":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"34":{"title":"Connection Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"35":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"36":{"title":"Packing and Scheduling Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"37":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"38":{"title":"Constraints on Graphs","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"39":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"40":{"title":"Elementary Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"41":{"title":"ConstraintModels.jl","titles":[]},"42":{"title":"ConstraintCommons.jl","titles":[]},"43":{"title":"Parameters","titles":["ConstraintCommons.jl"]},"44":{"title":"Performances","titles":["ConstraintCommons.jl","Parameters"]},"45":{"title":"Languages","titles":["ConstraintCommons.jl"]},"46":{"title":"Performances","titles":["ConstraintCommons.jl","Languages"]},"47":{"title":"Extensions","titles":["ConstraintCommons.jl"]},"48":{"title":"Performances","titles":["ConstraintCommons.jl","Extensions"]},"49":{"title":"Sampling","titles":["ConstraintCommons.jl"]},"50":{"title":"Performances","titles":["ConstraintCommons.jl","Sampling"]},"51":{"title":"Extrema","titles":["ConstraintCommons.jl"]},"52":{"title":"Performances","titles":["ConstraintCommons.jl","Extrema"]},"53":{"title":"Dictionaries","titles":["ConstraintCommons.jl"]},"54":{"title":"Performances","titles":["ConstraintCommons.jl","Dictionaries"]},"55":{"title":"ConstraintDomains.jl: Defining Variables and Exploring Domains","titles":[]},"56":{"title":"Commons","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains"]},"57":{"title":"Extension to Base module","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Commons"]},"58":{"title":"Performances","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Commons"]},"59":{"title":"Continuous","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains"]},"60":{"title":"Extension to Base module","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Continuous"]},"61":{"title":"Performances","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Continuous"]},"62":{"title":"Discrete","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains"]},"63":{"title":"Extension to Base module","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Discrete"]},"64":{"title":"Performances","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Discrete"]},"65":{"title":"General","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains"]},"66":{"title":"Exploration","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains"]},"67":{"title":"Performances","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Exploration"]},"68":{"title":"Parameters","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains"]},"69":{"title":"Interacting with Constraints in Julia","titles":[]},"70":{"title":"Usual Parameters","titles":["Interacting with Constraints in Julia"]},"71":{"title":"Concepts, Error Functions, and QUBO matrices","titles":["Interacting with Constraints in Julia"]},"72":{"title":"Usual Constraints","titles":["Interacting with Constraints in Julia"]},"73":{"title":"Welcome to Julia Constraints","titles":[]},"74":{"title":"Constraint Programming 101","titles":[]},"75":{"title":"What is Constraint Programming?","titles":["Constraint Programming 101"]},"76":{"title":"Basic Concepts and Terminology","titles":["Constraint Programming 101"]},"77":{"title":"How CP differs from other optimization techniques","titles":["Constraint Programming 101"]},"78":{"title":"Dive into Optimization","titles":[]},"79":{"title":"Understanding Optimization","titles":["Dive into Optimization"]},"80":{"title":"Metaheuristics Overview","titles":["Dive into Optimization"]},"81":{"title":"Mathematical Programming Basics","titles":["Dive into Optimization"]},"82":{"title":"Getting Started with Julia for CP and Optimization","titles":[]},"83":{"title":"Why Julia?","titles":["Getting Started with Julia for CP and Optimization"]},"84":{"title":"Setting Up Your Julia Environment","titles":["Getting Started with Julia for CP and Optimization"]},"85":{"title":"Your First Julia CP Model","titles":["Getting Started with Julia for CP and Optimization"]},"86":{"title":"Exploring JuliaConstraint Packages","titles":[]},"87":{"title":"Package Overviews","titles":["Exploring JuliaConstraint Packages"]},"88":{"title":"Installation and Getting Started Guides","titles":[]},"89":{"title":"Advanced Constraint Programming Techniques","titles":[]},"90":{"title":"Global Constraints and Their Uses","titles":["Advanced Constraint Programming Techniques"]},"91":{"title":"Search Strategies and Optimization","titles":["Advanced Constraint Programming Techniques"]},"92":{"title":"Applying Optimization Methods","titles":[]},"93":{"title":"Case Studies and Real-World Applications","titles":["Applying Optimization Methods"]},"94":{"title":"From Theory to Practice","titles":["Applying Optimization Methods"]},"95":{"title":"Building and Analyzing Models","titles":[]},"96":{"title":"Modeling Best Practices","titles":["Building and Analyzing Models"]},"97":{"title":"Performance Analysis and Improvement","titles":["Building and Analyzing Models"]},"98":{"title":"Tutorials and Experiments","titles":[]},"99":{"title":"Hands-On Tutorials","titles":["Tutorials and Experiments"]},"100":{"title":"Experimental Analysis","titles":["Tutorials and Experiments"]},"101":{"title":"Community and Contribution","titles":[]},"102":{"title":"Joining the JuliaConstraint Community","titles":["Community and Contribution"]},"103":{"title":"Future Directions","titles":["Community and Contribution"]},"104":{"title":"Learning about Constraints","titles":[]},"105":{"title":"Parameters","titles":["Learning about Constraints"]},"106":{"title":"CompositionalNetworks.jl","titles":[]},"107":{"title":"Utilities","titles":["CompositionalNetworks.jl"]},"108":{"title":"Metrics","titles":["CompositionalNetworks.jl"]},"109":{"title":"A layer structure for any ICN","titles":[]},"110":{"title":"Transformations Layer","titles":[]},"111":{"title":"List of transformations","titles":["Transformations Layer"]},"112":{"title":"Non-parametric","titles":["Transformations Layer","List of transformations"]},"113":{"title":"Param: :val","titles":["Transformations Layer","List of transformations"]},"114":{"title":"Layer generation","titles":["Transformations Layer","List of transformations"]},"115":{"title":"Arithmetic Layer","titles":[]},"116":{"title":"List of arithmetic operations","titles":["Arithmetic Layer"]},"117":{"title":"Layer generation","titles":["Arithmetic Layer"]},"118":{"title":"Aggregation Layer","titles":[]},"119":{"title":"List of aggregations","titles":["Aggregation Layer"]},"120":{"title":"Layer generation","titles":["Aggregation Layer"]},"121":{"title":"Comparison Layer","titles":[]},"122":{"title":"List of comparisons","titles":["Comparison Layer"]},"123":{"title":"Non-parametric","titles":["Comparison Layer","List of comparisons"]},"124":{"title":"Param: :val","titles":["Comparison Layer","List of comparisons"]},"125":{"title":"Layer generation","titles":["Comparison Layer","List of comparisons"]},"126":{"title":"Introduction to QUBOConstraints.jl","titles":[]},"127":{"title":"Basic features","titles":["Introduction to QUBOConstraints.jl"]},"128":{"title":"Encoding for QUBO programs","titles":[]},"129":{"title":"Learning QUBO matrices","titles":[]},"130":{"title":"Interface","titles":["Learning QUBO matrices"]},"131":{"title":"Examples with various optimizers","titles":["Learning QUBO matrices"]},"132":{"title":"Gradient Descent","titles":["Learning QUBO matrices","Examples with various optimizers"]},"133":{"title":"Constraint-based Local Search","titles":["Learning QUBO matrices","Examples with various optimizers"]},"134":{"title":"ConstraintsTranslator.jl","titles":[]},"135":{"title":"ConstraintLearning.jl","titles":[]},"136":{"title":"PerfChecker.jl","titles":[]},"137":{"title":"Usage","titles":["PerfChecker.jl"]},"138":{"title":"Tutorial","titles":[]},"139":{"title":"Extending PerfChecker","titles":[]},"140":{"title":"The Default Options","titles":["Extending PerfChecker"]},"141":{"title":"Package initialization","titles":["Extending PerfChecker"]},"142":{"title":"Preparatory Code:","titles":["Extending PerfChecker"]},"143":{"title":"Main Code to be Performance Tested","titles":["Extending PerfChecker"]},"144":{"title":"Post Performance Testing Code","titles":["Extending PerfChecker"]},"145":{"title":"Converting the result into a Table","titles":["Extending PerfChecker"]},"146":{"title":"BenchmarkTools Extension","titles":[]},"147":{"title":"Usage","titles":["BenchmarkTools Extension"]},"148":{"title":"Options","titles":["BenchmarkTools Extension"]},"149":{"title":"Chairmarks Extension","titles":[]},"150":{"title":"Usage","titles":["Chairmarks Extension"]},"151":{"title":"Options","titles":["Chairmarks Extension"]},"152":{"title":"API","titles":[]},"153":{"title":"Solvers","titles":[]},"154":{"title":"CBLS.jl","titles":[]},"155":{"title":"ConstraintExplorer.jl","titles":[]},"156":{"title":"LocalSearchSolvers.jl","titles":[]},"157":{"title":"MetaStrategist.jl","titles":[]}},"dirtCount":0,"index":[["∅",{"2":{"154":1}}],["∩",{"2":{"154":1}}],["$d",{"2":{"143":1}}],["$block",{"2":{"142":1,"143":1}}],["$kwarg",{"2":{"138":1}}],["θ",{"2":{"132":2}}],["^2",{"2":{"132":1}}],["η",{"2":{"132":6,"135":1}}],["⋯",{"2":{"85":2}}],["×",{"2":{"85":3}}],["`function",{"2":{"156":1}}],["`struct",{"2":{"156":1}}],["``",{"2":{"154":3}}],["`",{"2":{"135":1}}],["`grid`",{"2":{"41":1}}],["`m`",{"2":{"41":1}}],["q",{"2":{"132":18,"135":7}}],["qap",{"2":{"41":1}}],["quite",{"2":{"85":1}}],["quadractic",{"2":{"41":1}}],["queens",{"2":{"41":4}}],["querying",{"2":{"0":1,"1":3}}],["query",{"2":{"0":3,"1":3}}],["quote",{"2":{"141":1,"142":1,"143":1}}],["quot",{"2":{"0":2,"1":12,"36":4,"85":6,"137":2,"142":2}}],["qubooptimizer",{"2":{"135":2}}],["qubogradientoptimizer",{"2":{"135":4}}],["qubo",{"0":{"21":1,"71":1,"128":1,"129":1},"1":{"130":1,"131":1,"132":1,"133":1},"2":{"0":2,"1":5,"21":1,"71":1,"127":4,"130":1,"135":4}}],["quboconstraints",{"0":{"126":1},"1":{"127":1},"2":{"0":5,"1":7,"19":1,"21":1,"71":1,"126":1,"127":2,"128":3,"130":2,"132":1,"135":1}}],["z",{"2":{"31":4,"33":4,"35":4}}],["zeros",{"2":{"132":3}}],["zero",{"2":{"1":11,"36":11,"41":1}}],["≥",{"2":{"29":1,"31":3,"132":1}}],["\\tzero",{"2":{"35":1}}],["\\theights",{"2":{"35":1}}],["\\tlengths",{"2":{"35":2}}],["\\tlist",{"2":{"29":1,"31":2,"33":2}}],["\\torigins",{"2":{"35":2}}],["\\toperator",{"2":{"29":1}}],["\\tcondition",{"2":{"33":1,"35":1}}],["\\tindex",{"2":{"33":1}}],["\\t\\toccurs",{"2":{"31":1}}],["\\t\\texcept",{"2":{"31":1}}],["\\t\\tvalues",{"2":{"31":2}}],["\\t\\tcondition",{"2":{"31":2,"33":1}}],["≠",{"2":{"24":1,"25":3,"26":3}}],["−x",{"2":{"24":2}}],["|the",{"2":{"24":1}}],["|≠|x",{"2":{"24":1}}],["|x",{"2":{"24":1}}],["||",{"2":{"1":2,"154":1}}],["yes",{"2":{"156":1}}],["yet",{"2":{"1":2,"41":1,"56":1,"59":1}}],["you",{"2":{"147":1,"150":1}}],["your",{"0":{"84":1,"85":1}}],["y=5",{"2":{"7":1}}],["y=2",{"2":{"6":1,"7":1}}],["y=1",{"2":{"1":1}}],["y",{"2":{"4":1,"6":1,"23":2,"25":18,"26":19,"29":4,"31":6,"33":4,"35":4,"132":7,"135":4,"156":2}}],["∉",{"2":{"1":3,"154":2}}],["7",{"2":{"1":5,"32":2,"36":3,"41":3,"152":1}}],["≤6",{"2":{"35":1}}],["≤12",{"2":{"35":1}}],["≤1",{"2":{"33":1}}],["≤10",{"2":{"31":3}}],["≤5",{"2":{"29":2,"31":5,"33":6,"35":4}}],["≤2",{"2":{"29":1}}],["≤4",{"2":{"29":2,"31":4,"33":1}}],["≤",{"2":{"1":5,"16":2,"31":2,"35":3,"36":1,"57":4,"60":4,"63":4,"85":2}}],["σ",{"2":{"0":2,"1":2,"127":2}}],["gcsample",{"2":{"148":2}}],["gctrial",{"2":{"148":2}}],["gctimes",{"2":{"138":1,"145":3}}],["gc=d",{"2":{"143":1}}],["gc",{"2":{"140":1,"143":1,"145":1,"151":1}}],["gcc",{"2":{"1":3,"32":3}}],["giving",{"2":{"137":1}}],["gives",{"2":{"29":2,"33":1}}],["give",{"2":{"0":1,"1":1}}],["given",{"2":{"0":11,"1":24,"5":1,"7":2,"21":1,"28":2,"32":7,"41":2,"71":1,"109":2,"125":1,"127":1,"128":1,"135":6,"137":1,"154":6}}],["guide",{"2":{"94":1,"138":1}}],["guides",{"0":{"88":1}}],["game",{"2":{"85":1}}],["gt",{"2":{"24":1,"105":1,"137":6}}],["good",{"2":{"139":1}}],["googleapis",{"2":{"0":1,"1":1}}],["google",{"2":{"0":7,"1":7}}],["googlellm",{"2":{"0":3,"1":3}}],["goes",{"2":{"137":2,"147":1,"150":1}}],["goal",{"2":{"41":1}}],["golomb",{"2":{"1":1,"24":2,"41":2,"154":1}}],["grads",{"2":{"132":2}}],["gradientdescentoptimizer",{"2":{"132":5}}],["gradient",{"0":{"132":1},"2":{"132":1,"135":1}}],["graphs",{"0":{"38":1}}],["graph",{"2":{"1":1,"28":1,"41":4,"154":1,"156":1}}],["grid",{"2":{"41":5,"85":3}}],["greater",{"2":{"1":12,"112":7,"113":1,"114":3}}],["groq",{"2":{"0":6,"1":6}}],["groqllm",{"2":{"0":1,"1":1}}],["g",{"2":{"0":1,"1":18,"41":1,"79":1,"112":8,"113":4,"114":3}}],["global",{"0":{"90":1},"2":{"0":5,"1":36,"30":7,"32":4,"34":6,"36":6,"38":2,"40":2,"85":1,"90":1,"135":2,"154":15}}],["gemini",{"2":{"0":6,"1":6}}],["generalstate",{"2":{"156":2}}],["generally",{"2":{"41":1}}],["general",{"0":{"65":1},"2":{"3":1,"156":1}}],["generating",{"2":{"1":2,"13":1}}],["generativelanguage",{"2":{"0":1,"1":1}}],["generation",{"0":{"114":1,"117":1,"120":1,"125":1},"2":{"0":3,"1":3}}],["generated",{"2":{"0":4,"1":22,"21":1,"71":1,"112":10,"113":6}}],["generates",{"2":{"0":1,"1":5,"68":1,"105":1,"109":2,"114":1}}],["generate",{"2":{"0":7,"1":27,"68":10,"105":11,"107":3,"109":6,"114":2,"117":1,"120":1,"125":2,"135":2}}],["generic",{"0":{"22":1},"1":{"23":1,"24":1,"25":1,"26":1},"2":{"1":1,"5":2,"9":1,"22":1,"42":1,"154":1,"156":2}}],["genetic",{"2":{"0":4,"1":4,"80":1,"135":3}}],["getting",{"0":{"82":1,"88":1},"1":{"83":1,"84":1,"85":1},"2":{"88":1}}],["get",{"2":{"0":4,"1":9,"41":2,"56":1,"85":1,"114":2,"152":2,"154":6,"156":16}}],["joinpath",{"2":{"138":3}}],["join",{"2":{"102":1}}],["joining",{"0":{"102":1}}],["j+1",{"2":{"85":1}}],["j",{"2":{"85":1}}],["jc",{"0":{"24":1},"2":{"2":1,"15":1,"16":1,"18":1,"20":1,"23":1,"25":2,"26":1,"29":3,"31":4,"33":4,"35":2,"70":1}}],["just",{"2":{"142":1}}],["jumpcbls",{"2":{"15":1,"16":1,"18":1}}],["jump",{"2":{"1":1,"2":1,"12":1,"15":2,"16":2,"23":1,"25":2,"26":1,"29":9,"31":12,"33":11,"35":6,"41":17,"55":1,"84":3,"85":2,"154":10,"156":1}}],["jumpify",{"2":{"1":1}}],["julia>",{"2":{"147":1,"150":1}}],["juliajump",{"2":{"154":3}}],["juliajumpify",{"2":{"1":1}}],["juliajulia>",{"2":{"147":1,"150":1,"152":1}}],["juliaup",{"2":{"84":1}}],["juliausermessage",{"2":{"1":1}}],["juliausing",{"2":{"1":1,"15":3,"16":1,"18":1,"25":3,"26":3,"29":9,"31":12,"33":12,"35":6,"84":2,"138":1}}],["juliausual",{"2":{"0":2,"1":3,"20":1,"72":1}}],["juliavariable",{"2":{"156":3}}],["juliavar",{"2":{"57":1,"60":1,"63":1,"156":1}}],["juliavalue",{"2":{"85":1}}],["juliavalsparameterdomain",{"2":{"1":1,"68":1,"105":1}}],["juliavalparameterdomain",{"2":{"1":1,"68":1,"105":1}}],["juliax",{"2":{"57":1,"60":1,"63":1,"156":1}}],["juliaxcsp",{"2":{"1":19,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1}}],["juliaqap",{"2":{"41":1}}],["juliaqubogradientoptimizer",{"2":{"135":1}}],["juliaqubo",{"2":{"0":1,"1":2,"127":2,"135":1}}],["juliano",{"2":{"135":1}}],["julian",{"2":{"41":1}}],["julianbits",{"2":{"0":1,"1":2,"109":1}}],["juliachemical",{"2":{"41":1}}],["juliacheck",{"2":{"1":1}}],["juliac",{"2":{"1":18,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1}}],["juliaco",{"2":{"1":9,"123":5,"124":4}}],["juliacompose",{"2":{"0":2,"1":2}}],["juliacompositionalnetworks",{"2":{"135":2}}],["juliacomposition",{"2":{"0":3,"1":3}}],["juliacomparison",{"2":{"0":1,"1":1,"125":1}}],["juliacode",{"2":{"0":1,"1":1}}],["juliaconcept",{"2":{"0":3,"1":37,"21":3,"28":2,"30":7,"32":9,"34":4,"36":4,"38":1,"40":1,"71":3}}],["juliaconstriction",{"2":{"156":1}}],["juliaconstraintcommons",{"2":{"1":1,"45":1,"68":1,"105":1}}],["juliaconstraints",{"2":{"0":4,"1":4,"20":4,"72":4}}],["juliaconstraint",{"0":{"86":1,"102":1},"1":{"87":1},"2":{"0":1,"1":1,"73":1,"87":1,"103":1,"156":3}}],["juliaconst",{"2":{"1":2,"20":2,"24":1,"43":2,"70":2,"135":2}}],["juliaconsisempty",{"2":{"0":1,"1":1,"47":1}}],["juliaconsin",{"2":{"0":1,"1":1,"47":1}}],["juliacontinuousdomain",{"2":{"0":1,"1":1,"59":1}}],["juliao",{"2":{"156":1}}],["juliaobjective",{"2":{"156":4}}],["juliaoptions",{"2":{"156":1}}],["juliaoptimizer",{"2":{"154":2}}],["juliaoptimize",{"2":{"85":1,"135":1}}],["juliaopparameterdomain",{"2":{"1":1,"68":1,"105":1}}],["juliaoversample",{"2":{"0":1,"1":1,"49":1}}],["juliafunction",{"2":{"140":1,"143":1,"145":1}}],["juliafunctions",{"2":{"1":1,"109":1}}],["juliafor",{"2":{"85":2}}],["juliaformat",{"2":{"0":1,"1":1}}],["juliafix",{"2":{"1":1}}],["juliafake",{"2":{"1":1,"68":1,"105":1}}],["juliafakeautomaton",{"2":{"1":1,"68":1,"105":1}}],["juliapost",{"2":{"156":1}}],["juliaperfchecker",{"2":{"141":1,"142":1,"144":1}}],["juliapredicate",{"2":{"154":1}}],["juliapredict",{"2":{"135":1}}],["juliapreliminaries",{"2":{"135":1}}],["juliaprompttemplate",{"2":{"0":1,"1":1}}],["juliaprompt",{"2":{"0":1,"1":1}}],["juliapush",{"2":{"1":2}}],["juliapairvarsparameterdomain",{"2":{"1":1,"68":1,"105":1}}],["juliaparameter",{"2":{"135":1}}],["juliaparams",{"2":{"0":1,"1":1}}],["juliaparse",{"2":{"0":1,"1":1}}],["juliagolomb",{"2":{"41":1}}],["juliagoogle",{"2":{"0":1,"1":1}}],["juliagroqllm",{"2":{"0":1,"1":1}}],["juliageneralstate",{"2":{"156":1}}],["juliagenerate",{"2":{"0":1,"1":5,"68":1,"105":1,"109":3,"135":1}}],["juliaget",{"2":{"0":4,"1":5,"56":1,"156":12}}],["juliaboolparameterdomain",{"2":{"1":1,"68":1,"105":1}}],["juliabinarize",{"2":{"0":1,"1":1,"128":1}}],["juliabase",{"2":{"0":1,"1":17,"41":4,"57":13,"59":1,"60":12,"62":1,"63":13,"65":2,"68":4,"105":4,"154":5}}],["juliaweights",{"2":{"0":3,"1":3,"108":1}}],["juliatr",{"2":{"1":19,"107":1,"112":11,"113":6}}],["juliatranslate",{"2":{"0":1,"1":1}}],["juliatransformation",{"2":{"0":1,"1":1,"114":1}}],["juliatrain",{"2":{"0":1,"1":1,"130":1,"135":2}}],["juliato",{"2":{"0":1,"1":1,"56":1}}],["juliaremote",{"2":{"156":2}}],["juliareduce",{"2":{"1":1,"107":1}}],["juliaread",{"2":{"0":1,"1":1}}],["juliaregularization",{"2":{"0":1,"1":1}}],["juliarangedomain",{"2":{"0":1,"1":1,"62":1}}],["julialoss",{"2":{"135":1}}],["julialeadsolver",{"2":{"156":1}}],["julialearn",{"2":{"0":1,"1":1}}],["julialength",{"2":{"1":1,"60":1,"63":1,"109":1,"156":5}}],["julialayers",{"2":{"1":1}}],["julialayer",{"2":{"1":1,"109":1}}],["julialanguageparameterdomain",{"2":{"1":1,"68":1,"105":1}}],["julialazy",{"2":{"0":2,"1":2,"107":2}}],["juliallamacppllm",{"2":{"0":1,"1":1}}],["juliahamming",{"2":{"0":1,"1":1,"108":1}}],["juliaidparameterdomain",{"2":{"1":1,"68":1,"105":1}}],["juliais",{"2":{"0":1,"1":2,"109":1,"128":1,"156":2}}],["juliaicnlocalsearchoptimizer",{"2":{"135":1}}],["juliaicngeneticoptimizer",{"2":{"135":1}}],["juliaicnconfig",{"2":{"135":1}}],["juliaicn",{"2":{"0":1,"1":1,"135":1}}],["juliaintention",{"2":{"154":1}}],["juliaintervals",{"2":{"1":1,"59":1}}],["juliaintersect",{"2":{"0":1,"1":2,"59":2,"62":1}}],["juliaincsert",{"2":{"0":1,"1":1,"53":1}}],["juliaempty",{"2":{"156":2}}],["juliaemptydomain",{"2":{"1":1,"56":1}}],["juliaedit",{"2":{"1":1}}],["juliae",{"2":{"1":1}}],["juliaerror",{"2":{"0":1,"1":1,"21":1,"71":1,"154":1}}],["juliaexclu",{"2":{"1":1,"109":1}}],["juliaexplorer",{"2":{"0":1,"1":6,"66":1}}],["juliaexplore",{"2":{"0":3,"1":3,"66":2}}],["juliaexploresettings",{"2":{"0":1,"1":1,"66":1}}],["juliaextract",{"2":{"0":3,"1":4,"43":3}}],["juliamodel",{"2":{"156":1}}],["juliamoi",{"2":{"154":17}}],["juliamoisupports",{"2":{"154":1}}],["juliamoisum",{"2":{"154":1}}],["juliamoiregular",{"2":{"154":1}}],["juliamoiordered",{"2":{"154":1}}],["juliamoinooverlap",{"2":{"154":1}}],["juliamoinvalues",{"2":{"154":1}}],["juliamoimultivalueddecisiondiagram",{"2":{"154":1}}],["juliamoiminimum",{"2":{"154":1}}],["juliamoimaximum",{"2":{"154":1}}],["juliamoiintention",{"2":{"154":1}}],["juliamoiinstantiation",{"2":{"154":1}}],["juliamoiextension",{"2":{"154":1}}],["juliamoierror",{"2":{"154":1}}],["juliamoielement",{"2":{"154":1}}],["juliamoidistdifferent",{"2":{"154":1}}],["juliamoicumulative",{"2":{"154":1}}],["juliamoiconflicts",{"2":{"154":1}}],["juliamoiallequal",{"2":{"154":1}}],["juliamoialldifferent",{"2":{"154":1}}],["juliamutually",{"2":{"135":1}}],["juliamutable",{"2":{"41":1}}],["juliam",{"2":{"85":1}}],["juliamincut",{"2":{"41":1}}],["juliaminkowski",{"2":{"0":1,"1":1,"108":1}}],["juliametadatamessage",{"2":{"1":1}}],["juliamerge",{"2":{"0":1,"1":1,"59":1,"62":1}}],["juliamax",{"2":{"156":1}}],["juliamainsolver",{"2":{"156":1}}],["juliamagic",{"2":{"41":1}}],["juliamap",{"2":{"1":1,"107":1}}],["juliamake",{"2":{"1":3,"114":1,"125":1,"135":3}}],["juliamanhattan",{"2":{"0":1,"1":1,"108":1}}],["juliamdd",{"2":{"0":1,"1":1,"45":1}}],["juliastop",{"2":{"156":1}}],["juliastatus",{"2":{"156":1}}],["juliastream",{"2":{"0":3,"1":3}}],["juliastruct",{"2":{"0":1,"1":1,"132":1,"135":1}}],["juliaspecialize",{"2":{"156":2}}],["juliasolve",{"2":{"156":2}}],["juliasolution",{"2":{"156":1}}],["juliascalarfunction",{"2":{"154":1}}],["juliasub",{"2":{"135":1}}],["juliasudoku",{"2":{"41":1}}],["juliasudokuinstance",{"2":{"41":2}}],["juliasystemmessage",{"2":{"1":1}}],["juliasymbol",{"2":{"1":1,"109":1}}],["juliasymbols",{"2":{"0":1,"1":1}}],["juliasymmetries",{"2":{"0":1,"1":1}}],["juliasymcon",{"2":{"0":1,"1":1,"47":1}}],["juliaselected",{"2":{"1":1,"109":1}}],["juliaset",{"2":{"1":1}}],["juliasetdomain",{"2":{"0":1,"1":1,"62":1}}],["juliashrink",{"2":{"1":1}}],["juliashow",{"2":{"0":1,"1":2,"109":1}}],["julia",{"0":{"19":1,"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1,"69":1,"73":1,"82":1,"83":1,"84":1,"85":1},"1":{"20":1,"21":1,"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1,"70":1,"71":1,"72":1,"83":1,"84":1,"85":1},"2":{"0":5,"1":17,"2":3,"9":1,"11":1,"12":1,"16":3,"18":3,"20":3,"25":1,"26":1,"29":3,"31":4,"33":4,"35":2,"41":5,"42":2,"45":2,"55":1,"62":1,"69":1,"70":2,"72":1,"83":1,"84":7,"85":5,"112":1,"114":1,"123":1,"135":1,"137":3,"139":1,"148":1,"151":1,"154":17,"156":83}}],["juliad",{"2":{"156":1}}],["juliadraw",{"2":{"156":1}}],["juliadist",{"2":{"156":1}}],["juliadiscreteset",{"2":{"154":1}}],["juliadiscretedomain",{"2":{"0":1,"1":1,"62":1}}],["juliadisplay",{"2":{"41":1}}],["juliadimparameterdomain",{"2":{"1":1,"68":1,"105":1}}],["juliadelete",{"2":{"1":2,"156":2}}],["juliadebinarize",{"2":{"0":1,"1":1,"128":1}}],["juliadescribe",{"2":{"0":2,"1":2,"20":2,"72":2,"156":1}}],["juliad1",{"2":{"0":1,"1":1,"56":1,"59":1,"62":1}}],["juliadomain",{"2":{"0":6,"1":6,"56":6,"59":6,"62":6,"135":1,"156":1}}],["juliadomains",{"2":{"0":3,"1":3,"66":3}}],["juliaδ",{"2":{"0":1,"1":1,"51":1,"135":1}}],["juliaas",{"2":{"1":2,"107":2}}],["juliaag",{"2":{"1":2,"119":2}}],["juliaaggregation",{"2":{"0":1,"1":1,"120":1}}],["juliaat",{"2":{"1":1,"45":1}}],["juliaabstractsolver",{"2":{"156":1}}],["juliaabstractoptimizer",{"2":{"1":1,"130":1}}],["juliaabstractmultivalueddecisiondiagram",{"2":{"1":1,"45":1}}],["juliaabstractautomaton",{"2":{"1":1,"45":1}}],["juliaabstractdomain",{"2":{"0":1,"1":1,"13":1,"56":1}}],["juliaar",{"2":{"1":2,"116":2}}],["juliaarbitrarydomain",{"2":{"1":1,"62":1}}],["juliaarithmetic",{"2":{"0":1,"1":1,"117":1}}],["juliaargs",{"2":{"0":1,"1":1}}],["juliaadd",{"2":{"0":1,"1":1,"62":1,"156":3}}],["juliaaccept",{"2":{"0":1,"1":1,"45":1,"68":1,"105":1}}],["juliaautomaton",{"2":{"0":1,"1":1,"45":1}}],["json",{"2":{"0":4,"1":4}}],["jl",{"0":{"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1,"41":1,"42":1,"55":1,"106":1,"126":1,"134":1,"135":1,"136":1,"154":1,"155":1,"156":1,"157":1},"1":{"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"107":1,"108":1,"127":1,"137":1},"2":{"0":1,"1":4,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"19":1,"20":1,"21":2,"23":1,"24":1,"25":1,"41":1,"42":1,"55":1,"69":1,"71":2,"72":1,"84":3,"106":1,"109":1,"126":1,"134":1,"135":1,"136":2,"137":1,"138":4,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":2,"149":2,"152":1,"154":2,"155":1,"156":2,"157":1}}],["kwarg",{"2":{"138":2}}],["kwargs",{"2":{"0":4,"1":4}}],["k",{"2":{"1":2,"116":2,"156":1}}],["keep",{"2":{"1":1,"127":1}}],["kept",{"2":{"0":1,"1":1}}],["keyed",{"2":{"0":1,"1":1}}],["keys",{"2":{"0":1,"1":1}}],["key",{"2":{"0":8,"1":22,"76":1,"142":1,"143":1}}],["keywords",{"2":{"0":1,"1":2,"20":1,"43":1,"70":1}}],["keyword",{"2":{"0":2,"1":10,"20":2,"21":1,"70":2,"71":1,"139":1,"156":1}}],["known",{"2":{"0":2,"1":5,"6":1,"32":3,"41":1,"156":1}}],["kind=",{"2":{"156":1}}],["kinds",{"2":{"14":1,"45":1}}],["kind",{"2":{"0":1,"1":3,"20":1,"43":1,"51":1,"68":1,"70":1,"105":1,"156":6}}],["kargs",{"2":{"0":5,"1":7,"21":4,"43":1,"71":4,"135":6}}],["heuristic",{"2":{"85":1}}],["heavily",{"2":{"20":1,"70":1,"110":1}}],["heavy",{"2":{"19":1,"69":1}}],["here",{"2":{"1":1,"25":1,"137":2,"138":1,"142":2,"143":1,"144":1,"147":1,"150":1,"152":1,"154":1}}],["heights",{"2":{"1":5,"36":5,"154":1}}],["host",{"2":{"84":1}}],["how",{"0":{"77":1},"2":{"21":1,"23":1,"24":1,"29":3,"31":4,"33":4,"35":2,"71":1,"90":1,"97":1,"100":1,"102":1,"111":1,"122":1}}],["however",{"2":{"7":1,"11":1,"85":1}}],["hold",{"2":{"1":4,"34":4,"135":1}}],["hot",{"2":{"0":3,"1":3,"128":3,"132":1}}],["highly",{"2":{"109":1}}],["highlighting",{"2":{"83":1,"102":1}}],["highlight",{"2":{"73":1}}],["higher",{"2":{"23":1,"25":1}}],["highest",{"2":{"0":1,"1":1,"56":1,"59":1,"62":1,"156":1}}],["high",{"2":{"2":1}}],["hide",{"2":{"1":1}}],["http",{"2":{"0":1,"1":1}}],["https",{"2":{"0":7,"1":7,"20":1,"72":1}}],["hardware",{"2":{"84":1}}],["hands",{"0":{"99":1}}],["hand",{"2":{"21":1,"71":1}}],["handle",{"2":{"1":1,"29":3,"31":4,"33":4,"35":2,"56":1,"156":2}}],["handled",{"2":{"0":1,"1":2,"59":1}}],["have",{"2":{"0":4,"1":6,"5":1,"20":1,"41":1,"70":1,"84":1,"93":1,"107":2,"154":1}}],["hamming",{"2":{"0":4,"1":4,"108":2,"135":3}}],["has",{"2":{"0":2,"1":6,"14":1,"49":1,"85":1,"109":1,"128":1,"139":1,"146":1,"149":1,"156":10}}],["9×9",{"2":{"41":4}}],["9",{"2":{"0":1,"1":1,"29":2,"31":1,"41":4,"56":1,"59":1,"62":1,"85":7}}],["8",{"2":{"1":6,"29":1,"31":6,"32":5,"33":2,"36":1,"41":3}}],["8080",{"2":{"0":1,"1":1}}],["86",{"2":{"0":1,"1":1,"56":1,"59":1,"62":1}}],["89",{"2":{"0":2,"1":2,"15":6,"56":2,"59":2,"62":2,"156":1}}],["001",{"2":{"132":1}}],["00514",{"2":{"0":1,"1":1,"20":1,"72":1}}],["0≤z",{"2":{"33":2}}],["0≤x",{"2":{"29":1}}],["0≤y",{"2":{"29":1}}],["0",{"2":{"0":3,"1":73,"6":1,"15":3,"16":6,"21":1,"25":2,"26":2,"28":22,"29":1,"30":14,"31":12,"32":8,"33":1,"34":1,"38":1,"41":54,"56":1,"57":2,"59":1,"60":1,"62":1,"63":1,"71":1,"85":2,"112":4,"113":4,"123":4,"124":4,"132":1,"138":11,"152":8,"154":2,"156":9}}],["+",{"2":{"0":1,"1":8,"66":1,"112":2,"113":4,"119":1,"147":1,"150":1}}],[">",{"2":{"0":1,"1":3,"25":4,"26":4,"29":3,"31":5,"33":4,"35":2,"38":1,"66":1,"132":8,"154":2}}],["63",{"2":{"18":1}}],["6+5=11",{"2":{"7":1}}],["69",{"2":{"0":1,"1":1,"15":3,"56":1,"59":1,"62":1}}],["6",{"2":{"0":3,"1":8,"29":1,"31":1,"34":1,"35":3,"36":3,"40":1,"41":2,"66":3,"139":1,"152":1}}],["56",{"2":{"156":1}}],["53",{"2":{"0":1,"1":1,"15":3,"56":1,"59":1,"62":1}}],["5",{"2":{"0":4,"1":78,"16":3,"29":3,"30":1,"31":32,"32":29,"33":12,"34":11,"35":22,"36":13,"40":3,"41":2,"56":1,"59":1,"62":1,"66":3,"132":1,"137":1,"147":1,"150":1,"152":1,"154":1,"156":1}}],["42",{"2":{"0":1,"1":3,"15":3,"18":3,"32":2,"56":1,"59":1,"62":1}}],["4",{"2":{"0":4,"1":84,"15":3,"16":3,"24":2,"25":7,"26":10,"29":7,"30":12,"31":32,"32":14,"33":23,"34":15,"35":19,"36":18,"38":4,"40":4,"41":3,"56":1,"59":1,"62":1,"66":3,"138":1,"152":1,"154":1,"156":1}}],["3j+1",{"2":{"85":1}}],["3i+1",{"2":{"85":1}}],["324",{"2":{"18":1}}],["3+2=5",{"2":{"7":1}}],["3",{"2":{"0":6,"1":128,"15":9,"16":3,"18":3,"21":1,"24":2,"25":6,"26":9,"29":10,"30":17,"31":47,"32":33,"33":21,"34":15,"35":27,"36":26,"38":6,"40":4,"41":6,"56":2,"59":2,"62":2,"66":3,"71":1,"85":6,"138":1,"152":1,"154":1,"156":1}}],["39",{"0":{"9":1},"2":{"0":3,"1":8,"13":2,"56":1,"57":1,"60":1,"63":1,"66":2,"84":1,"85":1,"105":1,"137":1,"143":1,"152":1,"156":4}}],["28",{"2":{"156":1}}],["200",{"2":{"0":2,"1":2,"135":1}}],["2009",{"2":{"0":1,"1":1,"20":1,"72":1}}],["2",{"2":{"0":8,"1":152,"15":6,"18":4,"21":1,"24":2,"25":5,"26":8,"28":10,"29":10,"30":15,"31":68,"32":40,"33":26,"34":16,"35":33,"36":28,"38":3,"40":4,"41":5,"56":2,"59":2,"62":2,"66":5,"71":1,"85":2,"138":8,"152":1,"154":3,"156":1}}],["ci",{"2":{"136":1,"154":3}}],["circuit",{"2":{"1":12,"38":12}}],["cn",{"2":{"85":1}}],["c=c1",{"2":{"85":1}}],["c=usual",{"2":{"0":2,"1":2,"20":2,"72":2}}],["classic",{"2":{"85":2}}],["closed",{"2":{"1":10,"18":1,"31":1,"32":9,"138":1}}],["c2",{"2":{"31":1,"138":2}}],["c1",{"2":{"31":1}}],["crucial",{"2":{"11":1}}],["creating",{"2":{"137":1}}],["creation",{"2":{"1":1,"114":1}}],["created",{"2":{"154":1,"156":1}}],["creates",{"2":{"1":1,"138":1}}],["create",{"2":{"0":3,"1":4,"41":3,"66":2,"154":3}}],["csps",{"2":{"10":1}}],["cp",{"0":{"77":1,"82":1,"85":1},"1":{"83":1,"84":1,"85":1},"2":{"2":1,"8":1,"19":1,"69":1,"73":1,"75":1,"84":1,"85":2,"91":1,"93":1,"96":1,"100":1}}],["cpp",{"2":{"0":2,"1":2}}],["cblstodo",{"2":{"85":4}}],["cbls",{"0":{"154":1},"2":{"15":8,"16":4,"25":7,"26":7,"29":6,"31":8,"33":11,"35":4,"84":2,"85":3,"135":1,"154":49,"156":1}}],["cbl",{"2":{"1":1}}],["certain",{"2":{"1":6,"34":4,"36":2,"154":2}}],["cut",{"2":{"41":1,"156":1}}],["customize",{"2":{"140":1}}],["custom",{"2":{"8":1,"137":4,"138":1,"141":1,"145":1}}],["curly",{"2":{"1":2}}],["currently",{"2":{"1":1,"25":1,"26":1,"57":2,"60":1,"63":1,"68":1,"105":1,"154":1}}],["current",{"2":{"0":1,"1":2,"109":1,"156":1}}],["cumulative",{"2":{"1":9,"35":9,"36":9,"154":3}}],["cc",{"2":{"1":2,"32":2}}],["choose",{"2":{"156":1}}],["choice",{"2":{"84":1}}],["chosen",{"2":{"20":1,"70":1}}],["chemical",{"2":{"41":3}}],["checked",{"2":{"154":1}}],["checkout",{"2":{"137":1}}],["checkres",{"2":{"137":1,"138":2}}],["checking",{"2":{"13":1}}],["checks",{"2":{"1":6,"28":1,"154":1}}],["check",{"2":{"0":1,"1":28,"24":1,"28":2,"30":3,"32":7,"34":8,"36":1,"38":1,"40":2,"57":1,"60":1,"63":1,"85":1,"109":1,"128":1,"136":2,"137":1,"138":1,"140":1,"143":3,"144":1,"147":1,"150":1,"154":4,"156":10}}],["chair",{"2":{"138":2,"145":6}}],["chairmarks",{"0":{"149":1},"1":{"150":1,"151":1},"2":{"138":5,"139":1,"140":1,"141":2,"142":1,"143":1,"144":1,"145":2,"149":1,"150":1}}],["chairmark",{"2":{"137":1,"138":3,"140":1,"141":1,"142":1,"143":1,"144":1,"150":1}}],["challenge",{"2":{"105":1}}],["challenged",{"2":{"18":1}}],["chapter",{"2":{"12":1,"73":1}}],["characteristics",{"2":{"9":1}}],["change",{"2":{"41":2}}],["changes",{"2":{"0":1,"1":2,"41":1,"59":1,"62":1}}],["channel",{"2":{"1":9,"33":12,"34":9}}],["chat",{"2":{"0":4,"1":4}}],["c",{"2":{"0":24,"1":113,"20":4,"21":8,"25":3,"26":3,"28":10,"29":9,"30":14,"31":11,"32":19,"33":12,"34":15,"35":6,"36":11,"38":4,"40":2,"57":1,"60":1,"63":1,"71":8,"72":4,"138":2,"156":31}}],["capacited",{"2":{"156":1}}],["capacity",{"2":{"156":1}}],["capacities",{"2":{"41":1}}],["cairomakie",{"2":{"138":1}}],["catch",{"2":{"132":1}}],["categorized",{"2":{"22":1}}],["catalog",{"2":{"10":1,"19":1,"69":1}}],["case",{"0":{"93":1},"2":{"1":1,"137":1,"141":1,"144":1,"145":1,"147":1,"150":1}}],["cast",{"2":{"1":1,"85":1}}],["call",{"2":{"138":1}}],["called",{"2":{"1":1,"23":1,"26":1,"85":3,"156":2}}],["calls",{"2":{"1":2}}],["cardinalityclosed",{"2":{"31":1}}],["cardinalityopen",{"2":{"31":1}}],["cardinality",{"2":{"1":20,"31":9,"32":20}}],["care",{"2":{"0":1,"1":1,"20":1,"72":1}}],["cannot",{"2":{"18":1}}],["can",{"2":{"0":3,"1":12,"4":1,"12":1,"13":1,"20":2,"28":1,"32":3,"55":1,"56":1,"70":2,"73":1,"84":1,"85":3,"102":1,"109":5,"114":1,"128":1,"137":3,"139":1,"140":1,"145":1,"147":1,"150":1,"154":2,"156":1}}],["cosntriction",{"2":{"156":1}}],["cost",{"2":{"156":19}}],["costs",{"2":{"156":20}}],["copied",{"2":{"154":7}}],["copy",{"2":{"154":19}}],["covering",{"2":{"99":1}}],["cover",{"2":{"81":1}}],["covers",{"2":{"42":1}}],["collaborate",{"2":{"102":1}}],["collect",{"2":{"25":1,"26":1,"132":1,"138":4}}],["collections",{"2":{"0":1,"1":1,"51":2}}],["collection",{"0":{"10":1},"2":{"0":8,"1":11,"10":1,"20":1,"21":1,"23":1,"24":1,"25":1,"53":1,"57":2,"59":1,"60":1,"63":1,"66":5,"68":1,"70":1,"71":1,"85":4,"105":1,"108":1,"109":1,"135":3,"154":1,"156":5}}],["columns",{"2":{"85":1}}],["column",{"2":{"85":1}}],["col",{"2":{"41":1}}],["coordinates",{"2":{"41":1}}],["couple",{"2":{"20":1,"72":1}}],["could",{"2":{"6":1,"23":1,"26":1}}],["counting",{"0":{"32":1},"2":{"1":1,"114":1}}],["count",{"2":{"1":95,"31":9,"32":6,"112":40,"113":20,"114":21,"119":3,"154":4}}],["counter",{"2":{"0":2,"1":2,"53":2,"156":1}}],["coefficients",{"2":{"1":1,"32":1}}],["coeffs",{"2":{"1":2,"31":1,"32":2}}],["co",{"2":{"1":11,"32":2,"123":5,"124":4}}],["corrected",{"2":{"1":1}}],["correspond",{"2":{"20":1,"70":1}}],["corresponds",{"2":{"1":2,"34":2}}],["correspondence",{"2":{"1":2,"34":2}}],["corresponding",{"2":{"0":1,"1":2,"41":1,"114":1}}],["core",{"2":{"0":1,"1":3,"9":2,"14":1,"20":7,"22":1,"42":1,"43":3,"45":1,"70":5,"72":2}}],["come",{"2":{"154":1}}],["commonly",{"2":{"137":1}}],["commons",{"0":{"56":1},"1":{"57":1,"58":1}}],["community",{"0":{"101":1,"102":1},"1":{"102":1,"103":1},"2":{"102":1}}],["communities",{"2":{"3":1}}],["command",{"2":{"0":1,"1":1,"84":1}}],["combinatorial",{"2":{"2":1,"75":1,"109":1}}],["com",{"2":{"0":4,"1":4}}],["computational",{"2":{"83":1}}],["computes",{"2":{"156":1}}],["computed",{"2":{"1":17,"112":10,"113":6}}],["compute",{"2":{"0":4,"1":7,"41":1,"51":2,"59":2,"62":1,"108":1,"123":1,"124":1,"128":1,"135":1,"154":1,"156":17}}],["compile",{"2":{"1":1,"114":1}}],["complexity",{"2":{"99":1}}],["complex",{"2":{"10":1,"26":1,"90":1}}],["completion",{"2":{"0":21,"1":21}}],["completions",{"2":{"0":3,"1":3}}],["completed",{"2":{"85":1}}],["completely",{"2":{"0":1,"1":1}}],["complete",{"2":{"0":10,"1":11,"66":5}}],["compliance",{"2":{"1":2,"28":2,"154":1}}],["comprehensive",{"2":{"1":2,"154":1}}],["comprising",{"2":{"0":1,"1":1}}],["compare",{"2":{"1":2,"30":1,"154":2}}],["comparisons",{"0":{"122":1},"1":{"123":1,"124":1,"125":1},"2":{"1":4,"114":2,"125":2}}],["comparison",{"0":{"30":1,"121":1},"1":{"122":1,"123":1,"124":1,"125":1},"2":{"0":5,"1":11,"20":1,"30":1,"32":1,"43":1,"70":1,"114":1,"121":1,"122":1,"123":1,"125":3}}],["compatible",{"2":{"0":2,"1":2}}],["compatibility",{"2":{"0":1,"1":1,"9":1}}],["compounds",{"2":{"41":1}}],["components",{"2":{"0":2,"1":2,"10":1,"11":1,"107":2}}],["compose",{"2":{"0":8,"1":12,"85":1,"109":1}}],["composed",{"2":{"0":3,"1":3,"66":1}}],["compositions",{"2":{"1":1,"107":1}}],["compositional",{"2":{"0":1,"1":1,"109":1}}],["compositionalnetworks",{"0":{"106":1},"1":{"107":1,"108":1},"2":{"0":26,"1":78,"19":1,"21":1,"71":1,"106":1,"107":7,"108":4,"109":11,"112":11,"113":6,"114":2,"116":2,"117":1,"119":2,"120":1,"123":5,"124":4,"125":2,"135":3}}],["composition",{"2":{"0":21,"1":24,"107":1}}],["coded",{"2":{"21":1,"71":1}}],["code",{"0":{"142":1,"143":1,"144":1},"2":{"0":8,"1":17,"2":1,"84":1,"107":1,"137":2,"138":1,"142":3,"143":2,"144":1,"147":2,"150":2}}],["conduct",{"2":{"100":1}}],["conditions",{"2":{"1":1,"114":1,"156":1}}],["condition",{"2":{"1":31,"4":1,"31":1,"32":15,"33":1,"34":13,"36":3,"154":6}}],["config",{"2":{"137":3,"140":1,"142":1,"143":1,"144":1}}],["configuring",{"2":{"154":1}}],["configurable",{"2":{"136":1}}],["configuration",{"0":{"6":1,"7":1},"2":{"0":2,"1":8,"3":2,"6":2,"7":4,"41":2,"135":4,"138":1,"142":1,"143":1,"154":6,"156":3}}],["configurations",{"2":{"0":1,"1":5,"49":1,"135":1,"154":4,"156":1}}],["configure",{"2":{"0":2,"1":2,"66":2}}],["conflict",{"2":{"1":1,"154":1}}],["conflicted",{"2":{"1":3,"154":1}}],["conflicts",{"2":{"1":8,"154":4}}],["conflicts=nothing",{"2":{"1":1}}],["concentrations",{"2":{"41":2}}],["concept",{"2":{"0":23,"1":107,"20":1,"21":9,"24":1,"25":2,"26":2,"28":4,"29":7,"30":10,"31":26,"32":15,"33":15,"34":8,"35":9,"36":6,"38":2,"40":2,"66":6,"71":9,"72":1,"154":2}}],["concepts",{"0":{"21":1,"71":1,"76":1},"2":{"0":5,"1":5,"66":5,"76":1,"80":1}}],["concatenated",{"2":{"0":1,"1":1}}],["converting",{"0":{"145":1}}],["converted",{"2":{"144":1,"154":4}}],["convert",{"2":{"0":1,"1":7,"56":1,"65":3,"107":2,"109":1,"145":1,"154":2}}],["contribute",{"2":{"102":1}}],["contribution",{"0":{"101":1},"1":{"102":1,"103":1}}],["contributions",{"2":{"10":1}}],["contributing",{"2":{"11":1}}],["contrast",{"2":{"77":1}}],["content",{"2":{"1":6,"73":1}}],["context",{"2":{"0":1,"1":2,"13":1,"56":1,"109":2}}],["contain",{"2":{"1":2}}],["container",{"2":{"1":1,"109":1,"154":1}}],["contains",{"2":{"0":2,"1":4,"20":1,"72":1,"85":1,"109":1}}],["containing",{"2":{"0":7,"1":11,"66":3,"154":1,"156":1}}],["contiguous",{"2":{"1":12,"112":8,"114":4}}],["contiuous",{"2":{"0":1,"1":1,"59":1,"62":1}}],["continuousdomain",{"2":{"0":1,"1":2,"59":2}}],["continuous",{"0":{"18":1,"59":1},"1":{"60":1,"61":1},"2":{"0":3,"1":3,"8":1,"12":1,"13":1,"18":1,"41":1,"55":1,"56":2,"59":2,"62":1}}],["connection",{"0":{"34":1}}],["connecting",{"2":{"0":1,"1":1,"47":1}}],["connector",{"2":{"0":1,"1":1,"47":1}}],["cons=dictionary",{"2":{"156":1}}],["cons",{"2":{"156":31}}],["consecutive",{"2":{"16":1}}],["console",{"2":{"0":1,"1":1}}],["constriction",{"2":{"156":4}}],["constrains",{"2":{"156":1}}],["constrained",{"2":{"154":2,"156":2}}],["constraintexplorer",{"0":{"155":1},"2":{"155":1}}],["constraintlearning",{"0":{"135":1},"2":{"19":1,"135":27,"152":1}}],["constraintmodels",{"0":{"41":1},"2":{"1":1,"10":1,"41":14}}],["constraintstranslator",{"0":{"134":1},"2":{"0":15,"1":25,"134":1}}],["constraints",{"0":{"9":1,"19":1,"20":1,"22":1,"23":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"69":1,"72":1,"73":1,"90":1,"104":1},"1":{"20":1,"21":1,"23":1,"24":2,"25":2,"26":1,"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1,"70":1,"71":1,"72":1,"105":1},"2":{"0":40,"1":76,"2":2,"9":3,"11":1,"12":2,"18":1,"19":3,"20":34,"21":4,"22":2,"23":3,"24":3,"25":4,"26":4,"28":2,"29":9,"30":3,"31":12,"32":4,"33":12,"34":4,"35":6,"36":2,"38":1,"40":1,"42":1,"43":9,"45":3,"55":2,"69":4,"70":8,"71":4,"72":26,"76":1,"84":1,"85":2,"90":1,"104":1,"105":1,"130":1,"135":1,"154":1,"156":23}}],["constraintdomains",{"0":{"55":1},"1":{"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1},"2":{"0":21,"1":40,"8":1,"12":1,"13":2,"15":1,"16":1,"18":1,"55":1,"56":6,"59":8,"62":10,"66":4,"68":11,"105":11}}],["constraint",{"0":{"2":1,"4":1,"5":1,"7":1,"24":1,"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1,"74":1,"75":1,"89":1,"133":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1,"75":1,"76":1,"77":1,"90":1,"91":1},"2":{"0":40,"1":157,"2":2,"3":5,"4":3,"5":5,"7":6,"9":1,"10":1,"13":1,"14":1,"15":4,"16":2,"19":1,"20":11,"21":12,"23":5,"24":5,"25":8,"26":8,"28":6,"29":7,"30":7,"31":12,"32":20,"33":9,"34":24,"35":6,"36":20,"38":7,"40":7,"42":1,"43":9,"49":1,"55":1,"57":3,"60":3,"63":3,"66":2,"69":1,"70":3,"71":12,"72":8,"73":1,"85":7,"109":1,"114":3,"127":1,"135":4,"154":66,"156":33}}],["constraintcommons",{"0":{"42":1},"1":{"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1},"2":{"0":12,"1":18,"11":1,"20":1,"42":1,"43":3,"45":6,"47":3,"49":1,"51":1,"53":1,"68":2,"70":1,"105":2,"154":2}}],["constructor",{"2":{"17":1,"41":1,"135":3,"156":1}}],["constructing",{"2":{"10":1,"41":1}}],["constructs",{"2":{"0":1,"1":1}}],["construct",{"2":{"0":5,"1":6,"41":3,"56":3,"59":3,"62":3,"68":1,"105":1,"156":3}}],["considers",{"2":{"45":1}}],["consider",{"2":{"4":1}}],["considered",{"2":{"1":2,"32":2,"156":1}}],["consistent",{"2":{"1":1,"3":1}}],["consisempty",{"2":{"0":1,"1":1,"47":1}}],["consin",{"2":{"0":1,"1":1,"47":1}}],["nine",{"2":{"85":1}}],["n²",{"2":{"41":1}}],["n×n",{"2":{"41":1}}],["nvalues",{"2":{"1":8,"31":9,"32":8,"154":1}}],["nvars",{"2":{"0":4,"1":12,"123":8}}],["n5",{"2":{"1":2,"28":2}}],["n4",{"2":{"1":3,"28":3}}],["n3",{"2":{"1":2,"28":2}}],["n2",{"2":{"1":2,"28":2}}],["n1",{"2":{"1":2,"28":2}}],["numerous",{"2":{"18":1}}],["numerical",{"2":{"15":1,"17":1}}],["numeric",{"2":{"1":1,"62":1}}],["numbers",{"2":{"1":2,"123":2,"137":1}}],["number",{"2":{"0":19,"1":53,"13":1,"32":11,"41":2,"56":1,"60":3,"62":2,"63":3,"66":2,"108":1,"109":5,"112":8,"113":4,"119":1,"123":1,"128":3,"135":2,"137":1,"154":23,"156":12}}],["n",{"2":{"0":2,"1":7,"41":16,"107":4,"127":3,"132":9}}],["nbits",{"2":{"0":1,"1":2,"109":1}}],["neighbours",{"2":{"156":2}}],["neighbourhood",{"2":{"156":2}}],["neither",{"2":{"1":1}}],["never",{"2":{"156":1}}],["necessarily",{"2":{"84":1}}],["necessary",{"2":{"12":1,"156":3}}],["need",{"2":{"51":1,"85":2,"139":1}}],["needs",{"2":{"0":1,"1":2,"114":1}}],["net",{"2":{"41":1}}],["network",{"2":{"0":1,"1":1,"109":1}}],["next",{"2":{"1":2,"38":2,"137":3,"152":2}}],["negation",{"2":{"1":1}}],["newly",{"2":{"1":2}}],["new",{"2":{"0":3,"1":10,"10":1,"20":3,"59":3,"72":3,"137":1,"154":1,"156":2}}],["navigate",{"2":{"20":1,"72":1}}],["natural",{"2":{"0":1,"1":3,"23":1,"25":1}}],["nature",{"2":{"0":1,"1":2,"20":2,"43":1,"59":1,"62":1,"70":2}}],["names",{"2":{"0":1,"1":2,"114":1}}],["name=",{"2":{"0":1,"1":1}}],["name",{"2":{"0":8,"1":9,"20":2,"21":1,"43":1,"70":1,"71":1,"72":1,"137":4,"154":2,"156":8}}],["now",{"2":{"41":1,"85":1}}],["nooverlap",{"2":{"35":4,"154":2}}],["normal",{"2":{"1":1,"114":1}}],["normalized",{"2":{"0":1,"1":1}}],["norm",{"2":{"1":2,"123":1,"124":1}}],["node",{"2":{"1":3,"28":3,"41":2,"154":3}}],["no",{"2":{"1":24,"35":6,"36":20,"41":4,"107":1,"109":1,"114":1,"135":1,"154":1}}],["notebooks",{"2":{"84":1,"146":1,"149":1}}],["note",{"2":{"0":1,"1":1,"19":1,"21":1,"23":1,"25":1,"29":2,"33":1,"43":1,"71":1,"84":1,"85":1,"154":1}}],["not",{"2":{"0":6,"1":22,"4":1,"16":1,"19":1,"21":1,"23":1,"25":1,"32":1,"36":6,"41":2,"59":1,"69":1,"71":1,"84":1,"85":3,"108":1,"113":1,"114":1,"128":1,"154":4,"156":1}}],["nothing",{"2":{"0":13,"1":22,"21":2,"30":1,"32":2,"47":5,"66":2,"71":2,"107":1,"132":1,"135":2,"138":1,"140":2,"142":1,"151":2,"154":15}}],["nonnegative",{"2":{"154":1}}],["nonlinear",{"2":{"79":1}}],["none",{"2":{"0":1,"1":4,"114":3,"128":1,"132":2,"140":1,"148":1,"151":1,"154":1}}],["non",{"0":{"112":1,"123":1},"2":{"0":4,"1":5,"16":1,"17":1,"62":1,"66":3,"114":1,"135":4,"156":1}}],["lst",{"2":{"156":5}}],["ls",{"2":{"154":1}}],["l=n²",{"2":{"41":1}}],["l",{"2":{"1":15,"41":1,"112":4,"113":4,"114":3,"145":5,"154":2}}],["llama",{"2":{"0":2,"1":2}}],["llamacppllm",{"2":{"0":1,"1":1}}],["llm",{"2":{"0":16,"1":17}}],["log",{"2":{"156":1}}],["loggingextra",{"2":{"156":1}}],["logging",{"2":{"156":1}}],["logical",{"2":{"23":1}}],["logic",{"2":{"1":2,"154":1}}],["load",{"2":{"141":1}}],["loss",{"2":{"132":2,"135":2}}],["loop",{"2":{"156":8}}],["loops",{"2":{"1":3,"38":2}}],["looks",{"2":{"137":1,"138":1,"140":1,"141":1,"143":1}}],["look",{"2":{"84":1,"85":1}}],["locations",{"2":{"41":5}}],["localsearchsolverscblstodo",{"2":{"84":1}}],["localsearchsolvers",{"0":{"156":1},"2":{"84":2,"135":1,"154":1,"156":141}}],["localhost",{"2":{"0":1,"1":1}}],["local",{"0":{"133":1},"2":{"0":5,"1":5,"109":1,"135":1,"137":1,"154":1,"156":7}}],["lower",{"2":{"0":1,"1":1,"108":1}}],["lowest",{"2":{"0":1,"1":1,"56":1,"59":1,"62":1}}],["launch",{"2":{"156":1}}],["labels",{"2":{"1":2,"28":2,"154":2}}],["labeled",{"2":{"1":2,"28":2,"154":2}}],["last",{"2":{"1":1,"28":1,"85":1,"137":5,"152":2,"154":1,"156":1}}],["large",{"2":{"0":1,"1":3,"85":1}}],["lazy",{"2":{"0":2,"1":2,"107":2,"110":2}}],["lang",{"2":{"0":1,"1":3}}],["languages",{"0":{"28":1,"45":1},"1":{"46":1},"2":{"1":1,"23":1,"42":1,"45":1,"68":1,"105":1}}],["languageparameterdomain",{"2":{"1":1,"68":1,"105":1}}],["language=",{"2":{"0":1,"1":1}}],["language",{"2":{"0":10,"1":34,"20":2,"25":1,"28":17,"43":2,"70":2,"84":3,"154":4}}],["lang=",{"2":{"0":1,"1":1}}],["layered",{"2":{"0":1,"1":1}}],["layers",{"2":{"0":4,"1":9,"109":2,"114":1}}],["layer",{"0":{"109":1,"110":1,"114":1,"115":1,"117":1,"118":1,"120":1,"121":1,"125":1},"1":{"111":1,"112":1,"113":1,"114":1,"116":1,"117":1,"119":1,"120":1,"122":1,"123":1,"124":1,"125":1},"2":{"0":16,"1":42,"42":1,"60":2,"63":2,"107":1,"109":28,"110":1,"114":3,"115":1,"117":3,"118":1,"120":3,"121":1,"123":1,"125":3,"135":4}}],["let",{"2":{"85":1}}],["leverage",{"2":{"9":1}}],["levels",{"2":{"99":1}}],["level",{"2":{"1":3,"2":1,"23":1,"25":1,"28":3,"156":9}}],["less",{"2":{"7":1,"23":1,"85":1,"154":1}}],["lesser",{"2":{"1":11,"112":6,"113":1,"114":3}}],["left",{"2":{"1":18,"112":10,"114":3}}],["leadsolvers",{"2":{"156":3}}],["leadsolver",{"2":{"156":1}}],["least",{"2":{"1":4,"18":1,"31":6,"32":4,"135":2,"154":1}}],["learning",{"0":{"104":1,"129":1},"1":{"105":1,"130":1,"131":1,"132":1,"133":1},"2":{"0":2,"1":3,"9":1,"12":1,"19":1,"42":1,"49":1,"55":2,"69":1,"104":1,"105":1,"109":2,"135":1}}],["learn",{"2":{"0":6,"1":7,"73":1,"109":1,"130":1,"135":5}}],["learned",{"2":{"0":1,"1":1,"19":1,"69":1,"135":1}}],["lengths",{"2":{"1":9,"30":3,"36":6}}],["length",{"2":{"0":7,"1":24,"13":2,"36":3,"56":2,"57":1,"59":1,"60":6,"62":1,"63":6,"66":1,"109":2,"116":2,"132":4,"145":1,"156":12}}],["liking",{"2":{"140":1}}],["like",{"2":{"77":1,"80":1,"137":2,"138":1,"140":1,"141":1,"143":1,"147":1,"150":1}}],["likely",{"2":{"42":1}}],["links",{"2":{"41":1,"146":1,"149":1,"156":1}}],["line",{"2":{"0":1,"1":1,"41":9,"84":1}}],["linear",{"2":{"0":3,"1":3,"77":1,"79":1,"127":3}}],["lies",{"2":{"20":1,"70":1}}],["littledict",{"2":{"1":2,"109":2,"114":1}}],["listing",{"2":{"26":1}}],["listed",{"2":{"1":2,"154":3}}],["list=x",{"2":{"0":1,"1":2,"20":1,"72":1}}],["list",{"0":{"111":1,"116":1,"119":1,"122":1},"1":{"112":1,"113":1,"114":1,"123":1,"124":1,"125":1},"2":{"0":5,"1":96,"20":4,"24":1,"25":1,"26":1,"28":8,"29":2,"30":13,"31":2,"32":24,"33":2,"34":16,"36":5,"38":5,"40":6,"43":5,"62":1,"63":1,"70":4,"111":1,"122":1,"137":2,"154":1,"156":11}}],["limit",{"2":{"0":6,"1":8,"36":2,"66":4,"154":1,"156":10}}],["lt",{"2":{"0":2,"1":11,"13":1,"23":1,"24":1,"28":3,"41":1,"45":2,"56":1,"57":4,"60":4,"62":1,"63":4,"105":1,"154":2,"156":3}}],["runtime",{"2":{"156":1}}],["runs",{"2":{"142":1,"143":1}}],["running",{"2":{"142":1}}],["run",{"2":{"41":1,"85":1,"135":1,"142":1,"143":1,"144":1,"154":1,"156":5}}],["rules",{"2":{"1":2,"28":2,"154":1}}],["ruler",{"2":{"1":2,"24":4,"41":1,"154":2}}],["round",{"2":{"132":1,"156":1}}],["routing",{"2":{"1":2,"38":2}}],["role",{"2":{"81":1}}],["roles",{"2":{"20":1,"70":1}}],["rows",{"2":{"85":1}}],["row",{"2":{"41":1,"85":1}}],["robust",{"2":{"11":1}}],["root",{"2":{"1":1}}],["right",{"2":{"1":18,"112":15,"114":3}}],["rawoptimizerattribute",{"2":{"154":2}}],["raw",{"2":{"41":2}}],["rates",{"2":{"41":1}}],["rate",{"2":{"41":1}}],["raises",{"2":{"0":2,"1":2}}],["rangeset",{"2":{"16":3}}],["ranges",{"2":{"0":1,"1":1,"62":1}}],["rangedomain",{"0":{"16":1},"2":{"0":3,"1":5,"25":1,"26":1,"56":1,"59":1,"62":3,"65":2}}],["range",{"2":{"0":3,"1":4,"8":1,"9":1,"13":1,"16":3,"28":1,"56":1,"59":1,"62":3,"154":1}}],["randomly",{"2":{"1":1,"57":2,"60":1,"63":1,"68":1,"105":1,"156":1}}],["random",{"2":{"0":1,"1":10,"13":1,"57":2,"60":1,"63":1,"68":10,"105":10,"156":2}}],["rand",{"2":{"0":1,"1":13,"13":2,"56":1,"57":16,"60":9,"63":9,"68":8,"105":8,"138":1,"156":2}}],["r",{"2":{"0":2,"1":5,"28":3,"41":2,"56":2,"59":2,"62":2,"71":1,"132":8}}],["re",{"2":{"156":1}}],["remote",{"2":{"156":2}}],["remotely",{"2":{"156":1}}],["removed",{"2":{"16":1}}],["remove",{"2":{"1":4}}],["ref",{"2":{"110":1,"156":6}}],["reference",{"2":{"139":1}}],["refer",{"2":{"41":4}}],["refers",{"2":{"5":1,"7":1}}],["registries",{"2":{"152":1}}],["regions",{"2":{"85":1}}],["regularconstraint",{"2":{"154":1}}],["regular",{"2":{"1":10,"20":1,"28":9,"42":1,"43":1,"70":1,"154":2}}],["regularization",{"2":{"0":2,"1":2}}],["recognize",{"2":{"45":1}}],["recommended",{"2":{"16":1,"154":1,"156":1}}],["retrieve",{"2":{"41":1}}],["returned",{"2":{"1":1}}],["returns",{"2":{"0":15,"1":43,"47":2,"57":3,"60":2,"63":2,"66":4,"68":1,"105":1,"114":1,"147":1,"150":1,"152":1,"154":19,"156":1}}],["return",{"2":{"0":20,"1":63,"20":3,"21":4,"28":1,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"41":1,"43":1,"45":3,"56":3,"57":5,"59":3,"60":8,"62":3,"63":8,"68":2,"71":4,"72":3,"105":2,"107":1,"109":5,"112":2,"113":2,"123":3,"124":3,"132":8,"135":4,"138":1,"140":1,"143":1,"145":1,"154":1,"156":20}}],["reusable",{"2":{"10":1}}],["relies",{"2":{"110":1}}],["relevant",{"2":{"2":1}}],["relationships",{"2":{"26":1}}],["relation",{"2":{"4":1}}],["relatively",{"2":{"1":1,"107":1,"156":1}}],["relate",{"2":{"1":1,"114":1}}],["related",{"2":{"0":1,"1":1,"12":1,"55":1,"104":1,"114":1,"135":1,"145":1,"146":1,"149":1}}],["requires",{"2":{"138":1}}],["required",{"2":{"1":1,"130":1}}],["requirements",{"2":{"1":2,"45":2}}],["reverse",{"2":{"1":1,"41":1,"114":1,"138":2}}],["rev",{"2":{"1":5,"112":4,"114":1}}],["reduce",{"2":{"1":3,"107":1,"116":2}}],["resume",{"2":{"156":1}}],["result",{"0":{"145":1},"2":{"1":23,"107":1,"112":10,"113":6,"114":2,"142":1,"143":1,"144":1}}],["results",{"2":{"1":3,"41":1,"59":2,"137":3,"138":1}}],["restart",{"2":{"156":6}}],["restricting",{"2":{"156":2}}],["restriction",{"2":{"0":2,"1":2}}],["restricted",{"2":{"57":1,"60":1,"63":1,"156":4}}],["restricts",{"2":{"1":3,"32":3}}],["research",{"2":{"103":1}}],["resource",{"2":{"10":1}}],["respectively",{"2":{"41":2}}],["respective",{"2":{"6":1,"12":1}}],["respect",{"2":{"1":1,"114":1}}],["reproducible",{"2":{"136":1}}],["represented",{"2":{"1":2,"28":2,"142":1,"154":1}}],["represents",{"2":{"0":1,"1":5,"6":1,"154":3}}],["representing",{"2":{"0":3,"1":4,"28":1,"66":3,"154":3}}],["repl",{"2":{"84":1}}],["replace",{"2":{"156":1}}],["replaced",{"2":{"1":2,"16":1}}],["replacements",{"2":{"0":1,"1":1}}],["reactants",{"2":{"41":2}}],["reactions",{"2":{"41":1}}],["reaction",{"2":{"41":4}}],["reach",{"2":{"0":1,"1":1,"108":1}}],["readers",{"2":{"73":1,"94":1,"102":1}}],["reads",{"2":{"0":1,"1":1}}],["read",{"2":{"0":3,"1":3}}],["ready",{"2":{"0":1,"1":1,"66":1}}],["real",{"0":{"93":1},"2":{"0":6,"1":7,"56":3,"59":5,"62":4,"73":1,"94":1,"154":2}}],["δ",{"2":{"0":1,"1":1,"51":1,"132":1,"135":1}}],["epoch",{"2":{"156":1}}],["err",{"2":{"154":3}}],["errors",{"2":{"1":6}}],["errorexception",{"2":{"0":2,"1":2}}],["error",{"0":{"21":1,"71":1},"2":{"0":6,"1":27,"21":9,"71":9,"135":1,"154":4,"156":4}}],["ecosystem",{"2":{"12":1,"19":1,"42":1,"55":1,"69":1,"84":1}}],["etc",{"2":{"8":1,"137":1}}],["estimation",{"2":{"21":1,"71":1}}],["establishes",{"2":{"1":2,"34":2}}],["essential",{"2":{"13":1,"42":1,"139":1}}],["essentially",{"2":{"5":1}}],["edits",{"2":{"1":1}}],["editors",{"2":{"84":1}}],["editor",{"2":{"1":3}}],["edit",{"2":{"1":1}}],["edge",{"2":{"1":2,"28":2,"154":2}}],["efficiently",{"2":{"41":1,"49":1,"154":1}}],["efficient",{"2":{"1":1,"2":1,"11":1,"16":1,"21":1,"71":1,"96":1,"107":1}}],["eq",{"2":{"1":22,"112":12,"113":4,"114":6}}],["equiped",{"2":{"41":1}}],["equilibrium",{"2":{"41":4}}],["equivalent",{"2":{"1":1,"57":1,"60":1,"63":1}}],["equalities",{"2":{"1":2,"114":2}}],["equal",{"2":{"1":17,"7":1,"29":5,"30":8,"32":1,"34":2,"41":1,"112":3,"113":1,"114":1,"154":4}}],["euclidean",{"2":{"1":6,"123":3,"124":3}}],["earlier",{"2":{"152":1}}],["easy",{"2":{"136":1,"139":1}}],["easily",{"2":{"136":1,"137":1}}],["easier",{"2":{"1":1}}],["ease",{"2":{"83":1}}],["eachrow",{"2":{"132":4}}],["each",{"2":{"0":3,"1":13,"9":1,"20":3,"28":2,"34":2,"38":2,"41":3,"43":2,"60":1,"63":1,"66":1,"70":3,"85":5,"87":1,"88":1,"109":1,"110":1,"139":1,"154":2,"156":1}}],["embodies",{"2":{"1":2,"154":1}}],["empty",{"2":{"0":1,"1":2,"114":1,"135":2,"154":7,"156":11}}],["emptydomain",{"2":{"0":1,"1":2,"56":2,"59":1,"62":1}}],["evolves",{"2":{"156":1}}],["evolution",{"2":{"138":2}}],["evals=d",{"2":{"143":1}}],["evals",{"2":{"138":1,"140":1,"143":1,"148":2,"151":1}}],["evaluated",{"2":{"156":1}}],["evaluates",{"2":{"1":2}}],["evaluation",{"2":{"135":1}}],["ever",{"2":{"53":1}}],["even",{"2":{"41":1}}],["eventually",{"2":{"1":2,"38":2}}],["else",{"2":{"132":4}}],["elementary",{"0":{"40":1}}],["element",{"2":{"1":9,"16":1,"33":9,"34":9,"135":2,"152":1,"154":2,"156":1}}],["elements",{"2":{"0":2,"1":18,"13":2,"17":1,"41":1,"49":1,"56":1,"107":1,"109":1,"112":8,"113":4,"119":1}}],["eltype",{"2":{"1":3,"65":3,"135":2}}],["enabled",{"2":{"156":1}}],["enumerate",{"2":{"132":1}}],["environment",{"0":{"84":1},"2":{"137":1,"138":1}}],["environmental",{"2":{"0":2,"1":2}}],["energy",{"2":{"41":1}}],["entry",{"2":{"1":3,"156":1}}],["enforcing",{"2":{"1":2,"154":1}}],["ensuring",{"2":{"1":17,"9":1,"30":7,"32":5,"114":1,"135":3,"154":18}}],["ensures",{"2":{"1":12,"24":2,"28":2,"36":6,"38":2,"40":2,"85":1,"154":2}}],["ensure",{"2":{"0":1,"1":2,"85":1,"127":1}}],["enough",{"2":{"1":1,"68":1,"105":1}}],["end``",{"2":{"156":1}}],["end",{"2":{"1":2,"25":1,"26":1,"45":2,"85":2,"132":15,"137":2,"138":3,"140":1,"141":1,"142":1,"143":2,"145":1,"147":2,"150":2,"154":1,"156":3}}],["endpoint",{"2":{"0":1,"1":1}}],["enclosed",{"2":{"1":2}}],["encourage",{"2":{"84":2,"102":1}}],["encode",{"2":{"135":1}}],["encoded",{"2":{"1":2,"28":2,"154":1}}],["encoding",{"0":{"128":1},"2":{"0":4,"1":5,"127":1,"128":4}}],["encompass",{"2":{"1":1}}],["encapsulate",{"2":{"1":1,"114":1,"156":2}}],["encapsulating",{"2":{"0":5,"1":5}}],["encapsuler",{"2":{"1":1,"59":1}}],["e",{"2":{"0":2,"1":18,"28":4,"36":4,"38":2,"41":1,"79":1,"108":1,"132":3,"156":1}}],["either",{"2":{"0":5,"1":9,"21":1,"26":2,"36":4,"56":1,"59":1,"62":1,"71":1}}],["existing",{"2":{"1":2}}],["exists",{"2":{"1":3,"85":1,"142":1}}],["ex",{"2":{"1":3}}],["exactly",{"2":{"1":4,"31":7,"32":4,"154":3}}],["examples",{"0":{"131":1},"1":{"132":1,"133":1},"2":{"1":25,"17":1,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"49":1,"84":1,"114":1,"138":1,"146":1,"149":1}}],["example",{"2":{"0":10,"1":17,"2":1,"4":1,"5":1,"6":1,"7":1,"20":4,"21":1,"23":2,"25":1,"26":1,"29":2,"33":1,"43":1,"66":4,"71":1,"72":4,"84":1,"139":1,"142":1,"147":2,"150":2,"152":1}}],["exclu",{"2":{"1":3,"109":3}}],["exclude",{"2":{"1":1,"32":1}}],["excluded",{"2":{"1":1,"154":2}}],["exclusive",{"2":{"0":3,"1":11,"109":9,"117":1,"120":1,"125":1,"135":3}}],["except",{"2":{"1":2,"32":2}}],["except=vals",{"2":{"0":1,"1":2,"20":1,"72":1}}],["exceeds",{"2":{"7":1}}],["exceed",{"2":{"1":2,"4":1,"36":2}}],["experimental",{"0":{"100":1},"2":{"100":1}}],["experiments",{"0":{"98":1},"1":{"99":1,"100":1},"2":{"100":1}}],["expectations",{"2":{"84":1}}],["expect",{"2":{"73":1}}],["expects",{"2":{"1":1}}],["expected",{"2":{"0":3,"1":4}}],["express",{"2":{"154":1}}],["expressing",{"2":{"18":1}}],["expressions",{"2":{"109":1}}],["expression",{"2":{"1":8,"23":1,"32":1}}],["expresses",{"2":{"4":1}}],["expr",{"2":{"1":2,"141":1,"142":3,"143":3}}],["explanation",{"2":{"1":1,"79":1}}],["explicitly",{"2":{"1":2,"26":1,"154":3}}],["explicit",{"2":{"1":2,"154":1}}],["exploring",{"0":{"12":1,"55":1,"86":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"87":1},"2":{"105":1}}],["explored",{"2":{"0":1,"1":1}}],["explores",{"2":{"0":1,"1":1,"66":1}}],["exploresettings",{"2":{"0":7,"1":7,"66":7}}],["explore",{"2":{"0":8,"1":11,"12":1,"55":1,"66":5}}],["explorer",{"2":{"0":17,"1":55,"66":17}}],["explorations",{"2":{"12":1,"55":1}}],["exploration",{"0":{"66":1},"1":{"67":1},"2":{"0":6,"1":8,"49":1,"66":6,"68":1,"105":1}}],["export",{"2":{"0":1,"1":1,"156":1}}],["extensibility",{"2":{"11":1}}],["extensions",{"0":{"47":1},"1":{"48":1},"2":{"42":1,"147":1,"150":1}}],["extensionally",{"2":{"26":1}}],["extensional",{"2":{"26":1}}],["extension",{"0":{"26":1,"57":1,"60":1,"63":1,"146":1,"149":1},"1":{"147":1,"148":1,"150":1,"151":1},"2":{"1":8,"22":1,"139":4,"146":1,"147":1,"149":1,"150":1,"154":4}}],["extending",{"0":{"139":1},"1":{"140":1,"141":1,"142":1,"143":1,"144":1,"145":1},"2":{"139":1}}],["extended",{"2":{"0":2,"1":19,"107":2,"112":10,"113":6,"139":1}}],["extend",{"2":{"0":1,"1":2,"13":1,"47":1,"56":1,"65":1,"139":1,"145":1}}],["extends",{"2":{"0":3,"1":7,"41":4,"47":3,"57":5,"60":3,"63":3,"65":1,"68":2,"105":2,"135":3}}],["externally",{"2":{"156":1}}],["external",{"2":{"0":1,"1":2,"114":1}}],["extra",{"2":{"0":1,"1":1}}],["extracted",{"2":{"9":1,"19":1,"20":1,"69":1,"72":1}}],["extracts",{"2":{"0":1,"1":3,"43":1}}],["extract",{"2":{"0":2,"1":4,"21":1,"43":2,"71":1}}],["extremal",{"2":{"16":1}}],["extrema",{"0":{"51":1},"1":{"52":1},"2":{"0":2,"1":2,"42":1,"51":3,"132":1,"135":1,"156":3}}],["x``or",{"2":{"135":1}}],["x̅",{"2":{"135":4}}],["xn",{"2":{"85":1}}],["xi",{"2":{"25":2,"26":2}}],["x4",{"2":{"15":1}}],["x=x1",{"2":{"85":1}}],["x=6",{"2":{"7":1}}],["x=3",{"2":{"6":1,"7":1}}],["x+y≤10",{"2":{"4":1,"5":1,"7":1}}],["x3",{"2":{"1":1,"15":1,"28":1}}],["x3c",{"2":{"0":18,"1":49,"25":4,"26":4,"29":2,"30":4,"31":4,"32":2,"35":2,"36":1,"41":3,"45":3,"56":6,"57":9,"59":11,"60":8,"62":12,"63":8,"68":12,"105":12,"132":2,"135":1,"154":70,"156":91}}],["x2",{"2":{"1":1,"5":1,"15":1,"16":1,"28":1,"156":2}}],["x26",{"2":{"1":2}}],["x1+x2≤10",{"2":{"5":1}}],["x1",{"2":{"1":1,"5":1,"15":1,"16":1,"28":1,"156":2}}],["xto",{"2":{"0":1,"1":1,"108":1}}],["xcsp³",{"2":{"22":1}}],["xcsp",{"2":{"0":1,"1":21,"2":1,"20":3,"24":1,"25":1,"26":1,"28":2,"29":3,"30":3,"31":4,"32":4,"33":4,"34":4,"35":2,"36":2,"38":1,"40":1,"70":2,"72":1}}],["xcsp3",{"2":{"0":1,"1":3,"9":1,"20":6,"43":3,"45":1,"70":4,"72":2}}],["x",{"2":{"0":36,"1":305,"4":1,"6":1,"20":1,"21":4,"23":2,"24":8,"25":10,"26":11,"28":8,"29":12,"30":23,"31":22,"32":28,"33":16,"34":8,"35":8,"36":8,"38":2,"40":2,"41":4,"49":2,"51":2,"57":10,"60":10,"63":10,"66":3,"71":4,"72":1,"85":6,"107":8,"108":10,"112":76,"113":43,"116":4,"119":3,"123":8,"124":7,"128":8,"132":42,"135":33,"138":4,"147":1,"150":1,"154":50,"156":68}}],["15",{"2":{"31":1,"147":1,"150":1}}],["1≤z",{"2":{"31":2,"35":2}}],["1≤y",{"2":{"29":1,"31":3,"33":2,"35":2}}],["1≤x",{"2":{"29":2,"31":7,"33":4,"35":2}}],["14",{"2":{"15":3}}],["101",{"0":{"74":1},"1":{"75":1,"76":1,"77":1}}],["10000",{"2":{"156":1}}],["1000",{"2":{"138":4}}],["100",{"2":{"0":2,"1":2,"138":1,"156":1}}],["10",{"2":{"0":2,"1":29,"4":1,"6":1,"7":2,"25":3,"26":3,"31":22,"32":27,"33":2,"35":2,"138":1,"147":1,"150":1,"156":2}}],["10^6",{"2":{"0":1,"1":1,"66":1}}],["123",{"2":{"0":1,"1":1,"15":3,"56":1,"59":1,"62":1}}],["12",{"2":{"0":1,"1":2,"15":3,"35":1,"36":1,"56":1,"59":1,"62":1}}],["1",{"2":{"0":11,"1":184,"15":3,"16":9,"18":1,"21":2,"24":2,"25":8,"26":11,"28":15,"29":30,"30":19,"31":122,"32":34,"33":44,"34":17,"35":61,"36":41,"38":4,"40":4,"41":3,"53":2,"56":2,"59":2,"62":2,"66":5,"71":2,"85":5,"112":2,"127":1,"128":1,"132":4,"138":3,"140":2,"145":4,"148":1,"151":2,"152":8,"154":4,"156":4}}],["=0",{"2":{"41":1}}],["=>",{"2":{"1":15,"28":15,"132":1,"137":2,"138":7,"140":6,"147":3,"148":10,"150":3,"151":6}}],["==",{"2":{"0":1,"1":9,"31":9,"32":2,"33":9,"34":4,"38":1,"57":1,"128":1,"132":2,"154":3}}],["=usual",{"2":{"0":1,"1":1,"20":1,"72":1}}],["=",{"2":{"0":47,"1":143,"15":10,"16":6,"18":3,"20":2,"21":2,"24":5,"25":10,"26":10,"28":16,"29":12,"30":3,"31":83,"32":16,"33":34,"34":12,"35":32,"36":17,"38":5,"40":1,"41":11,"43":1,"53":2,"56":5,"57":4,"59":5,"60":4,"62":5,"63":4,"66":17,"70":1,"71":2,"72":1,"85":1,"107":1,"114":5,"116":2,"125":1,"127":1,"128":3,"132":34,"135":12,"137":8,"138":7,"141":1,"142":1,"143":1,"144":1,"145":9,"154":19,"156":47}}],["vov",{"2":{"154":5}}],["vf",{"2":{"138":5}}],["v4",{"2":{"15":2}}],["v3",{"2":{"15":2,"31":3}}],["v2",{"2":{"15":2,"16":1,"31":3}}],["vec",{"2":{"85":1}}],["vectorofvariables",{"2":{"154":3}}],["vectors",{"2":{"1":3,"112":1,"116":2,"138":1}}],["vector",{"2":{"0":10,"1":65,"20":3,"28":2,"30":6,"32":9,"43":5,"45":1,"56":1,"57":4,"59":4,"60":3,"62":1,"63":3,"68":1,"70":3,"105":1,"107":2,"112":10,"113":6,"114":1,"116":2,"119":1,"128":2,"132":5,"137":2,"138":1,"152":2,"154":17,"156":1}}],["verbose",{"2":{"156":4}}],["verbosity",{"2":{"154":1,"156":1}}],["versionnumber",{"2":{"137":1,"152":1}}],["versions",{"2":{"21":1,"71":1,"137":4,"138":1,"152":3}}],["version",{"2":{"1":4,"84":1,"114":1,"137":5,"152":3,"154":1}}],["versatile",{"0":{"9":1},"2":{"1":2,"154":1}}],["versa",{"2":{"1":3,"34":2,"114":1}}],["verifies",{"2":{"1":2,"28":2,"154":1}}],["vi",{"2":{"154":3}}],["vision",{"2":{"103":1}}],["visuals",{"2":{"138":4}}],["visualization",{"2":{"136":1,"137":1}}],["visual",{"2":{"84":1}}],["violated",{"2":{"7":2,"21":1,"71":1}}],["violates",{"2":{"7":1}}],["violation",{"0":{"7":1},"2":{"3":1}}],["vim",{"2":{"1":2}}],["vice",{"2":{"1":3,"34":2,"114":1}}],["via",{"2":{"0":1,"1":1,"136":1,"139":1,"140":1,"144":1}}],["viable",{"2":{"0":1,"1":6,"109":5}}],["vs",{"2":{"1":3}}],["v1",{"2":{"0":1,"1":1,"15":2,"16":3,"31":3}}],["v1beta",{"2":{"0":1,"1":1}}],["v",{"2":{"0":2,"1":3,"107":3,"138":5,"152":7,"154":12,"156":3}}],["var",{"2":{"1":20,"113":8,"123":6,"124":6,"156":12}}],["vars=dictionary",{"2":{"156":1}}],["vars=ones",{"2":{"1":2,"32":2}}],["vars=nothing",{"2":{"1":10,"30":10}}],["vars=",{"2":{"1":11,"30":4,"40":2}}],["vars=zeros",{"2":{"1":2,"30":2}}],["vars",{"2":{"1":51,"20":2,"35":9,"36":15,"40":2,"43":2,"70":2,"112":8,"123":6,"154":20,"156":24}}],["varies",{"2":{"3":1}}],["variant",{"2":{"1":2,"36":2}}],["variants",{"2":{"1":19,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"85":1}}],["variableconstrainedoncreation",{"2":{"154":1}}],["variableinfo",{"2":{"154":2}}],["variables",{"0":{"8":1,"12":1,"55":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1},"2":{"0":6,"1":39,"3":3,"4":3,"5":3,"6":3,"8":1,"12":2,"18":1,"25":1,"26":2,"28":1,"32":8,"34":8,"38":2,"40":2,"55":1,"68":1,"76":1,"85":3,"105":2,"108":1,"123":3,"127":2,"154":9,"156":26}}],["variable",{"2":{"0":7,"1":19,"7":1,"13":1,"15":8,"16":4,"20":2,"23":2,"25":2,"26":4,"29":5,"31":12,"33":8,"34":6,"35":6,"43":2,"57":3,"60":3,"63":3,"66":1,"70":2,"85":2,"154":9,"156":40}}],["various",{"0":{"131":1},"1":{"132":1,"133":1},"2":{"0":1,"1":2,"8":1,"19":1,"51":1,"56":1,"69":1,"84":1,"91":1,"99":1,"114":1,"136":2}}],["val=3",{"2":{"1":1,"31":1,"32":1}}],["val=2",{"2":{"1":4,"31":2,"32":3,"33":1,"34":1}}],["val=15",{"2":{"1":2,"31":2,"32":2}}],["val=1",{"2":{"1":4,"30":2,"32":1,"33":1,"34":1}}],["val=nothing",{"2":{"1":4,"30":2,"34":2}}],["valparameterdomain",{"2":{"1":1,"68":1,"105":1}}],["vals=",{"2":{"1":15,"30":2,"31":7,"32":13}}],["vals=nothing",{"2":{"0":1,"1":2,"20":1,"72":1}}],["valsparameterdomain",{"2":{"1":1,"68":1,"105":1}}],["vals",{"2":{"1":24,"20":2,"29":1,"30":2,"31":19,"32":18,"43":2,"70":2,"114":2,"154":7}}],["validity",{"2":{"1":1,"154":1}}],["validate",{"2":{"0":1,"1":1}}],["valid",{"2":{"0":6,"1":11,"28":1,"56":1,"127":2,"128":3,"154":7}}],["value2",{"2":{"137":1,"147":1,"150":1}}],["value1",{"2":{"137":1,"147":1,"150":1}}],["valued",{"2":{"1":1,"28":1,"154":1}}],["value",{"2":{"0":13,"1":59,"20":1,"25":2,"26":2,"28":3,"29":5,"30":1,"31":12,"32":5,"33":8,"34":13,"35":6,"38":4,"41":1,"43":1,"57":8,"60":7,"62":2,"63":10,"68":2,"70":1,"85":3,"105":2,"109":1,"114":8,"125":2,"128":1,"137":1,"154":15,"156":20}}],["values",{"2":{"0":8,"1":72,"3":1,"6":1,"15":1,"20":1,"21":2,"26":2,"28":2,"30":13,"32":24,"34":4,"38":3,"40":6,"41":4,"43":1,"56":2,"59":2,"62":4,"68":3,"70":1,"71":2,"85":2,"105":3,"114":5,"137":1,"148":1,"151":1,"154":12,"156":11}}],["val",{"0":{"113":1,"124":1},"2":{"0":3,"1":124,"13":1,"20":1,"30":3,"31":24,"32":21,"33":8,"34":8,"35":7,"36":6,"38":4,"41":4,"43":1,"53":2,"56":1,"70":1,"113":54,"114":8,"124":16,"138":2,"140":2,"141":2,"142":2,"143":2,"144":2,"154":16,"156":8}}],["upcoming",{"2":{"103":1}}],["up",{"0":{"84":1},"2":{"17":1,"156":1}}],["update",{"2":{"1":2}}],["updated",{"2":{"0":1,"1":1,"66":1}}],["updates",{"2":{"0":1,"1":1,"66":1}}],["utilities",{"0":{"107":1},"2":{"11":1,"49":1}}],["utilized",{"2":{"1":1,"42":1,"154":1}}],["url",{"2":{"0":6,"1":6}}],["us",{"2":{"154":1}}],["usage",{"0":{"137":1,"147":1,"150":1},"2":{"25":1,"137":1,"146":1,"149":1}}],["using",{"2":{"0":7,"1":8,"16":2,"20":1,"25":2,"26":2,"72":1,"85":1,"135":1,"136":1,"137":3,"138":3,"141":1,"147":2,"150":2,"154":1}}],["uses",{"0":{"90":1},"2":{"1":1,"114":1,"135":1}}],["useful",{"2":{"1":1,"53":1,"109":1,"154":4,"156":1}}],["users",{"2":{"11":1,"42":1,"55":1,"84":2,"139":1,"140":1}}],["usermessage",{"2":{"0":1,"1":2}}],["user",{"2":{"0":14,"1":15,"9":1,"20":1,"70":1,"142":1,"143":1,"156":2}}],["use",{"2":{"0":2,"1":6,"11":1,"21":2,"24":2,"30":2,"32":1,"42":1,"49":1,"55":1,"62":1,"71":2,"83":1,"84":2,"85":1,"110":1,"136":1,"139":1,"154":2,"156":2}}],["used",{"2":{"0":2,"1":44,"11":1,"13":1,"20":2,"28":1,"34":6,"36":8,"38":2,"40":2,"43":2,"45":3,"55":1,"56":1,"68":8,"70":2,"84":1,"105":8,"107":2,"109":2,"130":1,"135":2,"137":3,"147":1,"150":1,"154":4,"156":1}}],["usually",{"2":{"1":1,"156":1}}],["usual",{"0":{"20":1,"70":1,"72":1},"2":{"0":14,"1":24,"20":14,"21":3,"23":1,"24":3,"25":1,"43":8,"70":5,"71":3,"72":9,"110":1,"115":1,"118":1,"121":1}}],["unfold",{"2":{"138":2}}],["undefkeyworderror",{"2":{"132":1}}],["understanding",{"0":{"79":1}}],["under",{"2":{"1":1,"114":1}}],["unlikely",{"2":{"11":1}}],["unacceptable",{"2":{"1":2,"154":1}}],["unique",{"2":{"1":3,"24":2,"34":2,"154":2}}],["union",{"2":{"0":4,"1":12,"32":1,"34":4,"43":1,"45":2,"53":1,"57":2,"60":1,"63":1,"65":2,"68":2,"105":2,"154":4,"156":69}}],["unused",{"2":{"0":1,"1":1}}],["unordered",{"2":{"0":1,"1":1,"15":1,"62":1}}],["until",{"2":{"0":1,"1":1,"17":1,"49":1}}],["branch",{"2":{"137":1}}],["braces",{"2":{"1":2}}],["breaking",{"2":{"137":3,"152":3}}],["but",{"2":{"41":1,"85":1,"145":1}}],["building",{"0":{"95":1},"1":{"96":1,"97":1},"2":{"96":1}}],["build",{"2":{"25":1,"26":1,"139":1,"154":2}}],["blank",{"2":{"41":2}}],["block",{"2":{"1":2,"85":1,"137":1,"142":4,"143":2}}],["blocks",{"2":{"0":2,"1":2,"9":1,"85":2}}],["b2",{"2":{"31":1}}],["b1",{"2":{"31":1}}],["bariable",{"2":{"156":1}}],["basis",{"2":{"85":1}}],["basics",{"0":{"2":1,"81":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1}}],["basic",{"0":{"76":1,"127":1},"2":{"1":5,"42":1,"84":1,"114":4,"127":1,"135":1,"145":1}}],["based",{"0":{"2":1,"30":1,"133":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1},"2":{"0":4,"1":10,"2":1,"20":4,"43":3,"53":1,"68":1,"70":3,"72":1,"105":1,"109":1,"114":2,"128":1,"135":2,"146":1,"149":1,"154":1}}],["base",{"0":{"57":1,"60":1,"63":1},"2":{"0":6,"1":31,"2":1,"13":3,"41":9,"42":1,"47":2,"56":3,"57":12,"60":8,"63":9,"65":3,"68":4,"105":4,"109":1,"127":2,"154":5,"156":4}}],["backend",{"2":{"137":3,"141":1,"145":1,"148":1,"151":1}}],["backends",{"2":{"136":1,"137":1}}],["backward",{"2":{"41":1}}],["back",{"2":{"1":2,"38":2}}],["backticks",{"2":{"0":1,"1":1}}],["bijective",{"2":{"1":2,"34":2}}],["binary",{"2":{"0":1,"1":1,"26":1,"128":1}}],["binarization==",{"2":{"132":1}}],["binarization",{"2":{"0":4,"1":4,"128":4,"132":13,"135":2}}],["binarized",{"2":{"1":1,"127":1}}],["binarize",{"2":{"0":2,"1":2,"128":2,"132":3}}],["bias",{"2":{"0":3,"1":3,"108":3}}],["bit",{"2":{"0":2,"1":2,"108":1,"128":1}}],["bitvector",{"2":{"0":1,"1":5,"107":4}}],["bits",{"2":{"0":1,"1":3,"109":2}}],["better",{"2":{"156":2}}],["between",{"2":{"0":7,"1":15,"3":1,"4":1,"13":1,"24":2,"26":1,"31":1,"34":2,"41":2,"43":1,"51":2,"56":3,"59":2,"62":2,"123":1,"124":1,"154":4,"156":1}}],["benchmarked",{"2":{"147":1,"150":1}}],["benchmarking",{"2":{"146":1,"149":1}}],["benchmark",{"2":{"145":1,"147":1}}],["benchmarktools",{"0":{"146":1},"1":{"147":1,"148":1},"2":{"137":1,"146":1,"147":2,"148":8,"150":1}}],["below",{"2":{"138":1}}],["belongs",{"2":{"57":1,"60":1,"63":1,"156":2}}],["begin",{"2":{"137":2,"138":2,"147":2,"150":2,"154":4,"156":22}}],["best",{"0":{"96":1},"2":{"84":1,"96":1,"135":1,"156":1}}],["been",{"2":{"14":1,"93":1,"146":1,"149":1,"156":7}}],["because",{"2":{"7":2,"23":1,"26":1}}],["behavior",{"2":{"1":1,"13":1,"17":1}}],["before",{"2":{"0":1,"1":9,"36":8,"142":1}}],["be",{"0":{"143":1},"2":{"0":8,"1":31,"3":1,"4":1,"5":1,"6":1,"11":1,"12":2,"16":3,"17":1,"18":1,"23":2,"26":3,"28":3,"32":2,"34":2,"41":2,"55":1,"56":1,"84":1,"85":1,"105":1,"109":5,"114":1,"117":1,"120":1,"125":1,"128":1,"135":2,"137":4,"139":1,"140":1,"141":1,"142":2,"143":2,"144":2,"145":2,"147":2,"150":2,"154":18,"156":3}}],["b",{"2":{"0":1,"1":11,"28":2,"56":1,"57":8,"59":1,"60":8,"62":1,"63":8}}],["boxplots",{"2":{"138":4}}],["boxes",{"2":{"85":1}}],["bold",{"2":{"3":1}}],["bounded",{"2":{"1":1,"113":1}}],["bounding",{"2":{"1":6,"113":4,"114":2}}],["bounds",{"2":{"0":1,"1":1,"13":1,"56":1}}],["bool=true",{"2":{"1":1,"31":1,"32":1}}],["bool=false",{"2":{"1":3,"31":1,"32":3}}],["boolparameterdomain",{"2":{"1":1,"68":1,"105":1}}],["bool",{"2":{"0":5,"1":10,"20":1,"32":1,"36":3,"43":1,"56":4,"59":4,"62":4,"70":1,"132":1,"137":1,"154":8,"156":4}}],["boolean",{"2":{"0":2,"1":5,"20":1,"43":1,"49":1,"68":1,"70":1,"105":1,"137":1}}],["both",{"2":{"0":1,"1":5,"12":1,"41":2,"42":1,"51":1,"55":1,"154":1}}],["bytes",{"2":{"138":1,"145":4}}],["by",{"0":{"7":1},"2":{"0":14,"1":35,"19":2,"20":1,"21":1,"23":2,"26":3,"28":4,"32":1,"34":2,"41":1,"42":1,"45":1,"47":2,"57":1,"60":1,"62":1,"63":1,"66":3,"69":2,"70":1,"71":1,"88":1,"99":1,"107":1,"109":1,"113":1,"124":1,"135":4,"142":2,"154":4,"156":10}}],["ptm",{"2":{"156":1}}],["png",{"2":{"138":2}}],["pkgextensions",{"2":{"139":1}}],["pkg",{"2":{"137":1,"139":1,"152":2}}],["pkgs",{"2":{"137":1,"138":1}}],["pôpulation",{"2":{"135":1}}],["penalty",{"2":{"132":20,"135":9}}],["perfchecker",{"0":{"136":1,"139":1},"1":{"137":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1},"2":{"136":1,"137":2,"138":3,"139":2,"140":3,"141":1,"142":1,"143":2,"144":1,"145":3,"146":1,"147":1,"149":1,"150":1,"152":5}}],["performances",{"0":{"44":1,"46":1,"48":1,"50":1,"52":1,"54":1,"58":1,"61":1,"64":1,"67":1}}],["performance",{"0":{"97":1,"143":1,"144":1},"2":{"11":1,"83":1,"97":1,"136":2,"137":4,"138":2,"140":1,"142":1,"143":1,"144":1,"156":1}}],["perform",{"2":{"0":1,"1":1,"66":1,"156":1}}],["per",{"2":{"0":1,"1":1,"19":1,"69":1,"128":1}}],["pivotal",{"2":{"69":1}}],["plainly",{"2":{"141":1}}],["placeholder",{"2":{"17":1}}],["placeholders",{"2":{"1":4}}],["place",{"2":{"0":1,"1":4,"66":1}}],["plots",{"2":{"138":2}}],["plotting",{"2":{"138":1,"145":1}}],["pluto",{"2":{"84":1}}],["please",{"2":{"24":1,"84":1}}],["phase",{"2":{"1":1,"109":2}}],["purpose",{"2":{"87":1}}],["purposes",{"2":{"1":1,"135":1}}],["puzzles",{"2":{"85":1}}],["puzzle",{"2":{"85":3}}],["push",{"2":{"1":4,"132":1}}],["public",{"0":{"0":1}}],["pseudo",{"2":{"1":1,"68":1,"105":1}}],["p",{"2":{"0":1,"1":1,"41":2,"108":1,"154":1}}],["pool",{"2":{"156":1}}],["point",{"2":{"1":4,"36":2,"57":3,"60":2,"63":2,"68":1,"105":1}}],["points",{"2":{"0":4,"1":5,"56":1,"59":1,"60":1,"62":3,"63":2}}],["posed",{"2":{"85":1}}],["post",{"0":{"144":1},"2":{"73":1,"144":2,"145":1,"156":1}}],["pos",{"2":{"41":2}}],["possible",{"2":{"6":1,"84":1,"111":1,"122":1,"154":1,"156":2}}],["possibly",{"2":{"0":1,"1":3,"17":1,"62":1}}],["positional",{"2":{"1":1}}],["positive",{"2":{"0":4,"1":15,"112":2,"113":2,"119":3,"123":2,"124":2}}],["populate",{"2":{"140":1}}],["population",{"2":{"0":2,"1":2,"135":2}}],["pop",{"2":{"135":2}}],["popsize=100",{"2":{"135":1}}],["popsize=200",{"2":{"0":1,"1":1}}],["popsize",{"2":{"0":4,"1":4}}],["pacakge",{"2":{"137":1}}],["packing",{"0":{"36":1}}],["package",{"0":{"87":1,"141":1},"2":{"1":2,"12":1,"42":3,"43":1,"55":1,"69":1,"87":1,"88":1,"136":2,"137":1,"138":1,"141":1,"152":1}}],["packages",{"0":{"86":1},"1":{"87":1},"2":{"1":2,"42":2,"45":2,"136":1}}],["page",{"2":{"84":1}}],["patterfolds",{"2":{"138":1}}],["patterns",{"2":{"138":1}}],["pattern",{"2":{"1":1,"109":1}}],["patternfolds",{"2":{"1":1,"59":1,"138":3}}],["patch",{"2":{"137":2,"152":2}}],["patches",{"2":{"137":1,"152":1}}],["path",{"2":{"0":10,"1":14,"28":1,"137":2,"138":1,"147":1,"150":1,"154":1,"156":5}}],["pairs",{"2":{"1":1,"41":2,"154":2}}],["pairvarsparameterdomain",{"2":{"1":1,"68":1,"105":1}}],["paired",{"2":{"1":2,"20":1,"43":1,"68":1,"70":1,"105":1}}],["pair",{"2":{"1":63,"20":2,"30":16,"32":2,"35":9,"36":15,"40":4,"41":5,"43":2,"70":2,"109":1,"135":3,"154":15}}],["passed",{"2":{"1":2}}],["pass",{"2":{"0":1,"1":1,"66":1}}],["paradigm",{"2":{"2":1}}],["param=nothing",{"2":{"0":1,"1":1}}],["params",{"2":{"0":1,"1":2,"132":1}}],["parameterization",{"2":{"1":1,"114":1}}],["parameter",{"2":{"0":4,"1":19,"20":4,"28":2,"43":3,"68":1,"70":4,"105":1,"107":2,"114":6,"125":1,"127":1,"135":1,"142":1,"154":1}}],["parameters=constraintcommons",{"2":{"0":1,"1":1,"43":1}}],["parameters",{"0":{"20":1,"43":1,"68":1,"70":1,"105":1},"1":{"44":1},"2":{"0":28,"1":48,"20":12,"42":1,"43":19,"66":3,"68":12,"70":8,"72":4,"105":14,"111":1,"114":2,"122":1,"135":5,"148":8}}],["parametric",{"0":{"112":1,"123":1},"2":{"0":3,"1":4,"114":2,"125":1,"135":1}}],["param",{"0":{"113":1,"124":1},"2":{"0":20,"1":38,"21":4,"68":2,"71":4,"105":2,"107":6,"114":16,"125":3}}],["parts",{"2":{"11":1}}],["particularly",{"2":{"109":1}}],["particular",{"2":{"5":1}}],["partially",{"2":{"0":1,"1":1,"85":1}}],["partial",{"2":{"0":4,"1":5,"49":1,"66":2,"156":1}}],["part",{"2":{"1":1,"18":1,"19":1,"69":1,"84":1}}],["parsing",{"2":{"0":1,"1":1}}],["parser",{"2":{"1":2}}],["parses",{"2":{"0":1,"1":2}}],["parse",{"2":{"0":2,"1":3}}],["practices",{"0":{"96":1},"2":{"96":1}}],["practice",{"0":{"94":1}}],["practical",{"2":{"17":1,"19":1,"69":1}}],["primary",{"2":{"87":1,"137":1}}],["primarily",{"2":{"55":1}}],["printing",{"2":{"156":2}}],["print",{"2":{"85":1,"156":8}}],["println",{"2":{"0":1,"1":1,"66":1}}],["principles",{"2":{"3":1}}],["prelimnary",{"2":{"147":1,"150":1}}],["preliminaries",{"2":{"132":3,"135":2}}],["prep",{"2":{"142":3}}],["preparatory",{"0":{"142":1},"2":{"137":1,"142":1}}],["previous",{"2":{"137":3}}],["previously",{"2":{"25":1}}],["precision",{"2":{"132":6,"135":1}}],["predictions",{"2":{"135":1}}],["prediction",{"2":{"135":1}}],["predict",{"2":{"132":9,"135":1}}],["predicates",{"2":{"85":2}}],["predicate",{"2":{"1":9,"3":1,"4":1,"23":1,"24":4,"25":2,"26":1,"109":1,"154":7}}],["predefined",{"2":{"10":1}}],["prefixed",{"2":{"20":1,"70":1}}],["prefix",{"2":{"1":3}}],["preferences",{"2":{"0":1,"1":1}}],["present",{"2":{"0":1,"1":2,"2":1,"41":1,"138":1}}],["pretty",{"2":{"0":3,"1":3,"20":3,"72":3,"132":1,"156":2}}],["projects",{"2":{"103":1}}],["proceeds",{"2":{"41":1}}],["processes",{"2":{"49":1}}],["processing",{"2":{"1":1,"114":1}}],["process",{"2":{"0":2,"1":3,"10":1,"66":2,"94":1,"114":1,"135":1,"137":1,"156":7}}],["programs",{"0":{"128":1}}],["programming",{"0":{"74":1,"75":1,"81":1,"89":1},"1":{"75":1,"76":1,"77":1,"90":1,"91":1},"2":{"0":1,"1":22,"2":2,"14":1,"19":1,"26":1,"32":3,"34":6,"36":6,"38":2,"40":2,"42":1,"69":1,"73":1,"77":1,"79":1,"81":1,"85":1,"114":1,"154":1}}],["progress",{"2":{"21":1,"71":1}}],["produced",{"2":{"1":1}}],["produce",{"2":{"1":1,"107":1}}],["products",{"2":{"41":2}}],["product",{"2":{"1":1,"116":1}}],["prod",{"2":{"1":2,"116":2}}],["provide",{"2":{"13":1,"14":1,"17":1,"18":1,"20":1,"21":1,"23":2,"25":2,"26":1,"53":1,"71":1,"72":1,"84":1,"88":1,"99":1,"105":1,"137":1,"140":1,"146":1,"149":1,"154":1}}],["provides",{"2":{"2":1,"10":1,"11":1,"12":1,"42":1,"73":1,"85":1,"136":2}}],["provided",{"2":{"0":1,"1":19,"112":10,"113":6,"137":2,"142":1}}],["providing",{"2":{"1":2,"9":1,"154":1}}],["prompts",{"2":{"1":2}}],["promptingtools",{"2":{"1":1}}],["prompted",{"2":{"0":1,"1":1}}],["prompttemplate",{"2":{"0":7,"1":7}}],["prompt",{"2":{"0":32,"1":35}}],["property",{"2":{"23":1}}],["properties",{"2":{"13":1,"41":1}}],["properly",{"2":{"0":1,"1":1,"13":1,"56":1}}],["proportional",{"2":{"0":1,"1":1}}],["problems",{"2":{"0":1,"1":12,"2":1,"10":1,"18":1,"28":1,"36":6,"38":2,"41":2,"66":1,"73":1,"75":1,"79":1,"85":1,"90":1,"91":1,"154":2,"156":1}}],["problem",{"2":{"0":3,"1":5,"5":3,"24":1,"41":6,"66":2,"85":1,"94":1,"156":3}}],["∈",{"2":{"0":2,"1":9,"13":2,"47":1,"56":1,"57":7,"60":7,"63":7,"154":2,"156":3}}],["o",{"2":{"135":1,"156":16}}],["own",{"2":{"84":1,"85":1,"156":1}}],["objs=dictionary",{"2":{"156":1}}],["objs",{"2":{"156":7}}],["objectives",{"2":{"156":10}}],["objective",{"2":{"0":5,"1":9,"66":5,"85":1,"154":4,"156":24}}],["object",{"2":{"0":9,"1":23,"66":8}}],["observable",{"2":{"41":1}}],["odd",{"2":{"17":1}}],["out",{"2":{"85":1}}],["output",{"2":{"0":2,"1":2,"135":1,"142":1,"143":1,"144":1,"145":1}}],["outputs",{"2":{"0":2,"1":2,"152":3}}],["our",{"2":{"5":1,"20":1,"49":1,"70":1,"85":2}}],["other",{"0":{"77":1},"2":{"2":1,"41":1,"77":1,"84":1,"85":4,"137":1,"145":1,"147":1,"150":1,"156":2}}],["otherwise",{"2":{"0":3,"1":29,"7":1,"21":1,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"45":1,"57":1,"60":1,"63":1,"68":1,"71":1,"105":1,"112":2,"113":2,"123":2,"124":2,"154":4,"156":1}}],["occurrences",{"2":{"1":7,"32":7,"154":4}}],["occurs",{"2":{"1":2,"31":1,"32":2}}],["opt",{"2":{"154":2}}],["optmizers",{"2":{"135":1}}],["option",{"2":{"137":4,"154":1}}],["option2",{"2":{"137":1,"147":1,"150":1}}],["option1",{"2":{"137":1,"147":1,"150":1}}],["options",{"0":{"140":1,"148":1,"151":1},"2":{"135":2,"137":3,"140":3,"148":1,"151":1,"154":5,"156":34}}],["optionally",{"2":{"0":2,"1":4,"21":2,"71":2}}],["optional",{"2":{"0":12,"1":12,"41":1,"66":1,"128":1,"135":1,"137":1,"156":2}}],["optimally",{"2":{"1":1}}],["optimizing",{"2":{"156":7}}],["optimized",{"2":{"154":1}}],["optimizers",{"0":{"131":1},"1":{"132":1,"133":1},"2":{"135":1}}],["optimizer",{"2":{"15":11,"16":7,"25":7,"26":7,"29":3,"31":4,"33":4,"35":2,"85":1,"132":8,"135":6,"154":59,"156":3}}],["optimize",{"2":{"0":1,"1":1,"25":2,"26":2,"29":3,"31":4,"33":4,"35":2,"41":1,"135":11,"154":4}}],["optimization",{"0":{"77":1,"78":1,"79":1,"82":1,"91":1,"92":1},"1":{"79":1,"80":1,"81":1,"83":1,"84":1,"85":1,"93":1,"94":1},"2":{"0":2,"1":5,"3":1,"10":1,"14":1,"66":1,"73":1,"79":2,"81":1,"83":1,"93":1,"94":1,"96":1,"156":2}}],["op=>",{"2":{"1":2,"30":2}}],["op=≤",{"2":{"1":9,"29":1,"30":6,"32":3}}],["op===",{"2":{"1":6,"32":4,"34":2}}],["op==",{"2":{"1":1,"32":1}}],["op=≥",{"2":{"1":3,"30":2,"31":1,"32":1}}],["op=",{"2":{"1":6,"29":1,"30":6}}],["op=+",{"2":{"1":2,"30":2}}],["opparameterdomain",{"2":{"1":1,"68":1,"105":1}}],["op",{"2":{"1":29,"20":1,"29":1,"31":16,"32":10,"33":6,"34":8,"35":4,"36":4,"38":4,"43":1,"70":1,"109":2,"154":9}}],["open",{"2":{"1":6,"18":1,"31":1,"32":6,"110":1,"138":1}}],["openaillm",{"2":{"0":2,"1":2}}],["openai",{"2":{"0":4,"1":4}}],["operate",{"2":{"1":1,"114":1}}],["operation",{"2":{"1":5,"16":1,"107":1,"109":5,"135":2}}],["operations",{"0":{"116":1},"2":{"0":7,"1":21,"47":1,"60":2,"63":2,"108":1,"109":13,"114":1,"117":2,"120":1,"125":1,"135":3}}],["operators",{"2":{"1":1,"68":1,"105":1}}],["operator",{"2":{"1":6,"20":2,"30":3,"32":1,"43":2,"70":2}}],["once",{"2":{"84":1}}],["ongoing",{"2":{"1":2,"36":2}}],["ones",{"2":{"1":1,"8":1}}],["one",{"2":{"0":10,"1":16,"20":2,"21":1,"43":2,"68":1,"70":2,"71":1,"85":3,"105":2,"107":2,"109":2,"117":1,"120":1,"125":1,"127":1,"128":4,"132":1,"135":2,"137":1,"154":1,"156":3}}],["only",{"2":{"0":3,"1":6,"19":1,"32":1,"42":1,"69":1,"85":1,"109":2,"117":1,"120":1,"125":1,"130":1,"154":2,"156":1}}],["on",{"0":{"38":1,"99":1},"2":{"0":5,"1":17,"2":1,"13":1,"16":1,"20":4,"23":1,"24":2,"40":2,"41":1,"43":3,"56":1,"66":1,"68":1,"70":3,"72":1,"84":1,"91":1,"105":1,"110":1,"114":2,"128":1,"135":3,"137":1,"143":1,"146":1,"149":1,"154":4,"156":2}}],["overhead",{"2":{"148":2}}],["overloading",{"2":{"144":1}}],["overloaded",{"2":{"140":1,"141":1,"142":1,"143":1,"144":1,"145":2}}],["overlap",{"2":{"1":21,"35":6,"36":21,"154":1}}],["oversampling",{"2":{"132":6,"135":1}}],["oversample",{"2":{"0":2,"1":2,"49":2,"132":1}}],["overviews",{"0":{"87":1}}],["overview",{"0":{"80":1},"2":{"73":1}}],["over",{"2":{"0":3,"1":6,"51":1,"85":2,"108":1,"135":1,"136":1,"156":1}}],["oriented",{"2":{"42":1}}],["originating",{"2":{"1":1,"154":2}}],["origins",{"2":{"1":6,"36":6}}],["ordered",{"2":{"1":8,"29":6,"30":6,"109":1,"154":2,"156":1}}],["order",{"2":{"1":9,"30":6,"40":2,"41":1,"114":1,"154":3}}],["organization",{"2":{"73":1,"87":1}}],["org",{"2":{"0":1,"1":1,"20":1,"72":1}}],["or",{"0":{"7":1},"2":{"0":12,"1":31,"3":1,"4":1,"7":2,"8":1,"13":2,"19":1,"20":3,"21":4,"23":1,"26":2,"32":1,"36":4,"41":1,"42":2,"43":4,"47":1,"53":1,"56":2,"57":1,"59":1,"60":1,"62":1,"63":1,"66":1,"70":3,"71":4,"84":1,"85":1,"103":1,"109":1,"114":5,"128":1,"137":7,"152":3,"154":2,"156":6}}],["official",{"2":{"84":1}}],["offers",{"2":{"10":1}}],["often",{"2":{"1":8,"36":6,"38":2,"137":1}}],["of",{"0":{"10":1,"111":1,"116":1,"119":1,"122":1},"1":{"112":1,"113":1,"114":1,"123":1,"124":1,"125":1},"2":{"0":103,"1":325,"2":4,"3":2,"4":1,"5":3,"6":2,"7":1,"8":1,"9":3,"10":1,"11":3,"13":4,"14":2,"15":1,"17":1,"18":2,"19":3,"20":20,"21":11,"26":4,"28":10,"30":14,"32":35,"34":17,"36":14,"38":8,"40":6,"41":33,"42":1,"43":12,"45":3,"49":3,"51":4,"56":3,"57":5,"59":7,"60":10,"62":7,"63":11,"66":9,"68":2,"69":3,"70":11,"71":11,"72":9,"73":2,"79":2,"81":1,"83":2,"84":1,"85":11,"94":1,"97":1,"100":1,"103":1,"105":5,"107":7,"108":3,"109":18,"110":3,"112":13,"113":4,"114":8,"117":2,"119":2,"120":2,"123":4,"124":1,"125":2,"128":3,"135":14,"136":1,"137":15,"138":2,"141":1,"142":1,"143":1,"144":1,"145":1,"152":2,"154":48,"156":78}}],["i+1",{"2":{"85":1}}],["iconic",{"2":{"85":1}}],["icnlocalsearchoptimizer",{"2":{"135":3}}],["icngeneticoptimizer",{"2":{"135":4}}],["icnoptimizer",{"2":{"135":3}}],["icnconfig",{"2":{"135":4}}],["icns",{"2":{"109":1,"110":1,"115":1,"118":1,"121":1,"135":1}}],["icn=icn",{"2":{"0":1,"1":1}}],["icn",{"0":{"109":1},"2":{"0":23,"1":36,"60":2,"63":2,"109":9,"114":1,"117":1,"120":1,"125":1,"135":12}}],["io",{"2":{"41":2}}],["illustrate",{"2":{"24":1}}],["ignores",{"2":{"1":1,"36":1}}],["ignore",{"2":{"1":1,"36":1}}],["ignored",{"2":{"1":2,"35":1,"36":2}}],["i`",{"2":{"1":1,"57":1,"60":1,"63":1}}],["identity",{"2":{"1":14,"112":6,"114":4,"123":4}}],["identified",{"2":{"1":1}}],["identifier",{"2":{"0":3,"1":3}}],["id=1",{"2":{"1":3,"33":3,"34":3}}],["id=3",{"2":{"1":1,"33":1,"34":1}}],["id=nothing",{"2":{"1":4,"34":4}}],["ids",{"2":{"1":1,"68":1,"105":1}}],["idparameterdomain",{"2":{"1":1,"68":1,"105":1}}],["id",{"2":{"0":4,"1":5,"20":1,"33":3,"41":2,"43":1,"70":1,"154":2,"156":13}}],["i",{"2":{"0":3,"1":64,"36":4,"38":2,"57":10,"59":7,"60":8,"62":3,"63":8,"68":2,"85":4,"105":2,"107":2,"108":1,"109":2,"112":23,"113":13,"132":2,"138":4,"145":8,"154":2,"156":1}}],["improving",{"2":{"156":1}}],["improve",{"2":{"97":1}}],["improvement",{"0":{"97":1},"2":{"156":1}}],["impact",{"2":{"91":1}}],["importance",{"2":{"73":1,"100":1}}],["import",{"2":{"15":1,"16":1,"25":1,"26":1}}],["implemented",{"2":{"16":2,"17":1}}],["implementing",{"0":{"13":1}}],["implements",{"2":{"9":1}}],["implement",{"2":{"0":1,"1":2,"13":1,"45":1,"56":1,"68":1,"105":1}}],["implementations",{"2":{"13":1}}],["implementation",{"2":{"0":2,"1":2,"45":2,"110":1}}],["immutable",{"2":{"0":1,"1":1,"62":1}}],["ith",{"2":{"1":1,"57":2,"60":1,"63":1,"68":1,"105":1}}],["iterate",{"2":{"156":1}}],["iterators",{"2":{"132":1}}],["iterations",{"2":{"156":3}}],["iteration",{"2":{"0":2,"1":2,"156":8}}],["iter=100",{"2":{"0":2,"1":2}}],["iter",{"2":{"0":8,"1":8,"135":3,"156":1}}],["itvls",{"2":{"1":3,"59":3}}],["itv",{"2":{"0":2,"1":9,"56":2,"57":8,"59":2,"60":7,"62":2,"63":7,"68":3,"105":3,"138":2}}],["itself",{"2":{"0":1,"1":1}}],["its",{"2":{"0":4,"1":9,"11":1,"14":1,"41":1,"59":1,"62":1,"66":1,"73":1,"75":1,"81":1,"83":1,"84":2,"85":1,"87":1,"107":2,"137":1,"156":2}}],["it",{"2":{"0":11,"1":72,"4":1,"5":1,"6":1,"7":1,"9":1,"11":1,"13":1,"16":2,"17":1,"19":1,"20":2,"23":1,"24":1,"25":1,"28":1,"32":2,"36":6,"38":2,"42":2,"55":1,"56":1,"66":1,"68":8,"69":1,"72":2,"84":1,"85":4,"105":8,"109":1,"111":1,"114":1,"122":1,"128":1,"135":1,"136":1,"137":1,"138":2,"139":1,"140":2,"141":1,"143":1,"152":1,"154":7,"156":6}}],["isa",{"2":{"132":1}}],["issue",{"2":{"105":1,"110":1}}],["isempty",{"2":{"0":1,"1":4,"47":1,"57":3}}],["is",{"0":{"75":1},"2":{"0":34,"1":167,"2":1,"4":1,"5":1,"6":1,"7":5,"11":1,"13":3,"15":1,"16":2,"19":1,"20":6,"21":6,"23":3,"24":1,"25":3,"28":9,"32":15,"34":10,"36":10,"38":5,"40":3,"41":9,"42":1,"43":3,"47":2,"55":1,"56":2,"57":5,"59":3,"60":4,"63":4,"66":1,"68":9,"69":1,"70":1,"71":6,"72":5,"84":1,"85":6,"105":10,"107":1,"109":7,"112":20,"113":13,"114":4,"117":1,"120":1,"125":2,"128":4,"130":1,"135":5,"136":1,"137":2,"138":3,"139":1,"141":1,"144":2,"154":32,"156":17}}],["inner",{"2":{"135":1,"156":1}}],["initpkgs",{"2":{"141":2}}],["initialization",{"0":{"141":1}}],["initializes",{"2":{"1":1}}],["init",{"2":{"132":1}}],["inf",{"2":{"156":1}}],["info",{"2":{"25":2,"26":2,"29":12,"31":25,"33":23,"35":15,"154":2,"156":6}}],["information",{"2":{"0":1,"1":3,"19":2,"69":2,"84":1,"135":1,"154":1,"156":1}}],["infrastructure",{"2":{"12":1}}],["involves",{"2":{"4":1}}],["involving",{"2":{"1":1,"3":1,"114":1}}],["invalid",{"2":{"0":1,"1":3,"154":1}}],["inputs",{"2":{"1":1}}],["input",{"2":{"0":1,"1":8,"20":3,"41":1,"43":3,"70":3,"137":3,"139":1}}],["inside",{"2":{"139":1,"142":1,"143":1}}],["inspired",{"2":{"20":1,"70":1}}],["inspect",{"2":{"0":1,"1":1}}],["instructions",{"2":{"88":1}}],["installing",{"2":{"88":1}}],["installation",{"0":{"88":1}}],["installed",{"2":{"84":1,"152":1}}],["install",{"2":{"84":1}}],["instantiated",{"2":{"5":1}}],["instantiation",{"0":{"5":1},"2":{"1":9,"3":1,"5":1,"7":2,"40":9,"154":2}}],["instances",{"2":{"84":1}}],["instance",{"2":{"0":1,"1":3,"20":1,"28":2,"41":4,"70":1,"128":1,"154":13,"156":2}}],["instead",{"2":{"0":3,"1":4,"20":1,"43":1,"70":1,"107":2,"128":1,"154":2,"156":1}}],["insertion",{"2":{"0":1,"1":1,"53":1,"154":1}}],["insert",{"2":{"0":1,"1":1,"53":1,"156":3}}],["introduce",{"2":{"76":1,"80":1,"87":1,"156":1}}],["introductory",{"2":{"73":1}}],["introduction",{"0":{"2":1,"126":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"127":1},"2":{"126":1}}],["integration",{"0":{"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1},"1":{"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1}}],["integers",{"2":{"16":1}}],["integer",{"2":{"1":2,"20":1,"32":1,"41":3,"43":1,"70":1,"79":1,"137":1,"154":5}}],["intend",{"2":{"156":1}}],["intended",{"2":{"137":1}}],["intentionally",{"2":{"23":1}}],["intentional",{"2":{"23":1}}],["intention",{"0":{"23":1,"24":1},"1":{"24":1,"25":1},"2":{"22":1,"23":2,"24":2,"25":5,"26":3,"29":3,"31":4,"33":4,"35":2,"154":17}}],["intensional",{"2":{"1":1}}],["intension",{"2":{"1":2}}],["interoperability",{"2":{"42":1}}],["interdiction",{"2":{"41":2,"156":2}}],["interacting",{"0":{"19":1,"69":1},"1":{"20":1,"21":1,"70":1,"71":1,"72":1},"2":{"109":1}}],["interactive",{"2":{"0":2,"1":2}}],["interpreted",{"2":{"1":2,"16":1,"28":2,"154":1}}],["interpretable",{"2":{"0":1,"1":1,"109":1}}],["intermediate",{"2":{"0":1,"1":1}}],["intersect",{"2":{"0":1,"1":2,"59":2,"62":1}}],["intersections",{"2":{"0":1,"1":2,"59":2,"62":1}}],["intersection",{"2":{"0":1,"1":1,"43":1}}],["internally",{"2":{"1":1,"107":1}}],["internals",{"2":{"1":1,"2":1}}],["internal",{"0":{"11":1},"2":{"0":1,"1":4,"11":1,"41":2,"45":1,"56":1,"109":1,"156":4}}],["interval",{"2":{"0":1,"1":8,"18":3,"56":1,"57":2,"59":6,"60":2,"62":3,"63":2,"68":1,"105":1,"138":1}}],["intervalsfold",{"2":{"138":1}}],["intervals",{"2":{"0":2,"1":11,"8":1,"18":2,"56":2,"57":5,"59":5,"60":4,"62":2,"63":4,"65":2,"68":2,"105":2,"138":2}}],["interfaced",{"2":{"146":1,"149":1}}],["interfaces",{"2":{"55":1,"84":1,"136":1}}],["interface",{"0":{"13":1,"130":1},"2":{"0":1,"1":4,"9":1,"13":1,"21":1,"23":1,"25":1,"45":2,"56":1,"71":1,"84":2,"130":1,"136":1,"139":1,"154":4}}],["into",{"0":{"78":1,"145":1},"1":{"79":1,"80":1,"81":1},"2":{"0":4,"1":8,"22":1,"41":1,"56":1,"90":1,"107":1,"109":1,"119":1,"128":1,"135":1,"144":1,"145":1,"156":1}}],["int",{"2":{"0":4,"1":38,"16":1,"20":1,"25":2,"26":2,"28":2,"29":5,"30":8,"31":12,"32":9,"33":8,"34":1,"35":6,"38":1,"41":11,"57":2,"60":2,"63":2,"66":1,"72":1,"85":1,"107":8,"132":2,"154":9,"156":30}}],["inc",{"2":{"156":6}}],["increment",{"2":{"156":3}}],["incremental",{"2":{"154":4}}],["increasing",{"2":{"1":10,"29":1,"30":10}}],["increase",{"2":{"0":1,"1":1,"53":1}}],["inception",{"2":{"14":1}}],["inclusive",{"2":{"1":3,"109":3}}],["include",{"2":{"154":1}}],["included",{"2":{"1":1,"154":1}}],["includes",{"2":{"0":2,"1":3,"9":1,"36":1,"114":1,"125":1}}],["incsert",{"2":{"0":1,"1":1,"53":2}}],["individuals",{"2":{"135":1}}],["indice",{"2":{"156":1}}],["indices",{"2":{"0":1,"1":2,"66":1,"156":6}}],["indicate",{"2":{"156":2}}],["indicates",{"2":{"0":2,"1":2,"41":1}}],["independently",{"2":{"156":1}}],["independent",{"2":{"1":1,"20":1,"43":1,"70":1,"156":1}}],["indexed",{"2":{"1":2,"34":2}}],["index",{"2":{"1":10,"20":1,"34":3,"38":2,"43":1,"70":1,"154":7,"156":1}}],["ind",{"2":{"0":1,"1":1,"53":1,"156":2}}],["in",{"0":{"19":1,"24":1,"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1,"69":1},"1":{"20":1,"21":1,"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1,"70":1,"71":1,"72":1},"2":{"0":36,"1":156,"3":3,"5":1,"6":1,"8":1,"12":2,"13":2,"14":1,"15":4,"16":2,"18":1,"19":1,"20":11,"21":1,"22":1,"23":2,"24":1,"25":6,"26":6,"29":8,"30":6,"31":17,"32":24,"33":12,"34":14,"35":8,"36":18,"38":6,"40":4,"41":9,"42":1,"43":4,"45":2,"47":1,"51":1,"53":1,"55":1,"56":4,"57":6,"59":3,"60":8,"62":5,"63":9,"66":2,"68":1,"69":1,"70":7,"71":1,"72":4,"73":1,"75":1,"81":1,"84":1,"85":7,"100":1,"105":1,"107":3,"108":1,"109":7,"110":1,"112":1,"114":1,"123":2,"132":2,"135":3,"137":1,"138":3,"139":1,"141":1,"142":1,"144":1,"145":5,"147":2,"150":2,"152":1,"154":39,"156":16}}],["iff",{"2":{"0":2,"1":2,"114":1,"125":1}}],["if",{"2":{"0":14,"1":67,"5":1,"7":1,"13":1,"21":1,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"45":3,"56":1,"57":10,"60":9,"63":9,"68":2,"71":1,"84":1,"85":1,"105":2,"109":4,"112":2,"113":2,"123":2,"124":2,"128":4,"132":4,"135":1,"154":9,"156":14}}],["would",{"2":{"1":1,"5":1}}],["worse",{"2":{"156":3}}],["world",{"0":{"93":1},"2":{"73":1,"94":1}}],["work",{"2":{"1":1,"21":1,"71":1}}],["works",{"2":{"0":1,"1":1,"139":1,"140":1}}],["word",{"2":{"0":1,"1":8,"28":2,"45":6,"68":2,"105":2,"154":1}}],["want",{"2":{"147":1,"150":1}}],["was",{"2":{"139":1,"156":1}}],["way",{"2":{"1":3,"12":1,"23":1,"25":1,"26":1,"55":1,"105":1,"147":1,"150":1,"154":1}}],["warning",{"2":{"0":1,"1":2,"3":1,"41":1}}],["well",{"2":{"85":1}}],["welcome",{"0":{"73":1},"2":{"10":1}}],["weigths",{"2":{"41":1}}],["weighting",{"2":{"135":1}}],["weighted",{"2":{"1":1,"124":1}}],["weight",{"2":{"0":1,"1":2,"41":1,"127":1}}],["weights",{"2":{"0":8,"1":18,"41":3,"108":1,"109":10,"135":5}}],["weights=nothing",{"2":{"0":1,"1":1}}],["we",{"2":{"0":1,"1":1,"2":1,"3":1,"5":1,"14":1,"17":1,"18":1,"19":1,"20":1,"23":1,"24":1,"25":1,"47":1,"49":1,"51":1,"53":1,"69":1,"72":1,"84":4,"85":6,"105":1}}],["write",{"2":{"0":2,"1":2}}],["while",{"2":{"156":5}}],["which",{"2":{"0":1,"1":6,"7":2,"20":1,"28":2,"41":7,"57":1,"70":1,"85":1,"107":1,"109":1,"136":1,"139":1,"154":1}}],["why",{"0":{"83":1}}],["what",{"0":{"75":1},"2":{"1":1,"73":1,"85":1}}],["whole",{"2":{"0":1,"1":1,"156":1}}],["whether",{"2":{"1":4,"3":1,"7":1,"32":1,"36":1,"154":1}}],["where",{"2":{"0":7,"1":19,"13":1,"28":1,"32":1,"38":2,"41":1,"56":5,"57":5,"59":5,"60":4,"62":5,"63":4,"68":2,"93":1,"105":2,"123":2,"132":1,"137":1,"154":8,"156":69}}],["when",{"2":{"0":2,"1":23,"2":1,"41":1,"47":2,"85":1,"112":10,"113":6,"114":2,"135":2,"137":1,"154":1,"156":2}}],["wip",{"2":{"136":1}}],["wikipedia",{"2":{"41":2,"85":1}}],["wide",{"2":{"1":1,"9":1,"28":1,"154":1}}],["width",{"2":{"0":2,"1":2,"20":2,"72":2}}],["width=150",{"2":{"0":1,"1":1,"20":1,"72":1}}],["will",{"2":{"0":8,"1":9,"2":1,"12":1,"16":1,"17":1,"20":1,"43":1,"72":1,"84":2,"85":1,"109":1,"117":1,"120":1,"125":1,"128":1,"135":1,"146":1,"149":1,"154":2}}],["without",{"2":{"1":17,"18":1,"112":10,"113":6}}],["within",{"2":{"1":8,"12":1,"13":1,"28":2,"42":1,"69":1,"84":1,"87":1,"110":1,"115":1,"118":1,"121":1,"154":6,"156":1}}],["with",{"0":{"19":1,"69":1,"82":1,"131":1},"1":{"20":1,"21":1,"70":1,"71":1,"72":1,"83":1,"84":1,"85":1,"132":1,"133":1},"2":{"0":13,"1":63,"3":1,"5":1,"6":1,"9":1,"10":1,"16":1,"17":1,"20":5,"28":4,"36":3,"41":8,"43":1,"45":1,"59":1,"66":1,"68":1,"70":1,"72":4,"77":1,"85":5,"88":1,"105":1,"107":2,"108":1,"109":4,"112":10,"113":6,"114":3,"123":1,"124":1,"125":1,"135":3,"137":2,"138":1,"140":1,"141":1,"146":1,"148":1,"149":1,"151":1,"154":6,"156":8}}],["w",{"2":{"0":2,"1":4,"45":2,"68":2,"105":2,"109":2,"135":2}}],["ds",{"2":{"135":2}}],["df",{"2":{"132":24,"135":2}}],["due",{"2":{"84":1}}],["during",{"2":{"0":1,"1":2,"49":1,"66":1,"109":2}}],["d1",{"2":{"15":1,"16":1,"18":1}}],["draw",{"2":{"1":1,"57":2,"60":1,"63":1,"68":1,"105":1,"156":5}}],["datatype",{"2":{"156":1}}],["dataframe",{"2":{"132":2,"135":1}}],["data",{"2":{"0":6,"1":8,"114":2,"156":1}}],["done",{"2":{"144":1}}],["download",{"2":{"84":1}}],["doc",{"2":{"3":1}}],["documentation",{"2":{"2":1,"41":1,"84":1,"106":1,"134":1,"135":1,"137":1,"146":1,"149":1,"154":1,"155":1,"156":1,"157":1}}],["docstring",{"2":{"154":23,"156":29}}],["docs",{"2":{"0":3,"1":3}}],["double",{"2":{"1":2}}],["doesn",{"2":{"1":3,"137":1}}],["does",{"2":{"0":1,"1":10,"36":2,"154":4}}],["do",{"2":{"0":2,"1":7,"36":4,"108":1,"114":1}}],["domath",{"2":{"147":1,"150":1}}],["domains",{"0":{"12":1,"14":1,"17":1,"18":1,"55":1},"1":{"13":1,"14":1,"15":2,"16":2,"17":2,"18":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1},"2":{"0":35,"1":42,"6":2,"8":2,"12":3,"13":1,"14":1,"16":1,"17":1,"18":2,"41":1,"55":2,"56":4,"57":3,"59":9,"60":2,"62":7,"63":2,"65":2,"66":18,"68":1,"76":1,"105":3,"132":11,"135":2,"156":3}}],["domain",{"0":{"8":1},"2":{"0":39,"1":64,"8":1,"13":7,"15":4,"16":3,"18":3,"32":1,"41":1,"56":19,"57":1,"59":12,"60":1,"62":15,"63":1,"66":7,"68":9,"85":1,"105":9,"123":1,"124":1,"128":4,"135":3,"156":20}}],["dom",{"2":{"0":4,"1":8,"123":2,"124":2,"132":4,"135":2}}],["d₂",{"2":{"0":2,"1":2,"59":2,"62":2}}],["d₁",{"2":{"0":2,"1":2,"59":2,"62":2}}],["d5",{"2":{"0":1,"1":1,"56":1,"59":1,"62":1}}],["d4",{"2":{"0":1,"1":1,"15":1,"56":1,"59":1,"62":1}}],["d3",{"2":{"0":1,"1":1,"15":1,"18":1,"56":1,"59":1,"62":1}}],["d2",{"2":{"0":1,"1":1,"15":1,"16":1,"18":1,"56":1,"59":1,"62":1}}],["dynamic",{"2":{"0":1,"1":3,"13":1,"16":1,"41":1,"56":1,"59":1,"114":1,"156":11}}],["dir",{"2":{"138":4,"147":1,"150":1}}],["direct",{"2":{"11":1}}],["directory",{"2":{"1":1}}],["directions",{"0":{"103":1},"2":{"1":1,"114":1}}],["directed",{"2":{"1":1,"28":1,"154":1}}],["directly",{"2":{"1":1,"23":1,"25":1,"154":1}}],["digits",{"2":{"85":2}}],["dive",{"0":{"78":1},"1":{"79":1,"80":1,"81":1},"2":{"90":1}}],["differs",{"0":{"77":1}}],["different",{"2":{"0":4,"1":28,"3":1,"11":1,"20":4,"21":1,"23":1,"24":6,"25":3,"26":2,"29":5,"30":8,"41":1,"43":1,"70":2,"71":1,"72":2,"84":1,"85":1,"114":3,"136":1,"138":1,"154":1,"156":1}}],["difference",{"2":{"0":2,"1":12,"20":1,"51":2,"56":1,"59":1,"62":1,"70":1,"112":2,"113":2,"123":3,"124":3}}],["diff",{"2":{"1":4,"123":2,"124":2}}],["dim=2",{"2":{"1":2,"33":2,"34":2}}],["dim=1",{"2":{"1":2,"34":2}}],["dimparameterdomain",{"2":{"1":1,"68":1,"105":1}}],["dimensions",{"2":{"1":1,"68":1,"105":1}}],["dimension",{"2":{"1":1,"20":1,"43":1,"70":1,"154":5,"156":1}}],["dim",{"2":{"1":3,"20":1,"33":1,"35":1,"36":2,"43":1,"70":1,"132":3,"154":7,"156":4}}],["dictionaries",{"0":{"53":1},"1":{"54":1},"2":{"42":1,"53":1}}],["dictionaryview",{"2":{"156":1}}],["dictionary",{"2":{"0":9,"1":19,"20":5,"41":3,"43":1,"53":1,"72":5,"114":2,"136":1,"137":1,"138":1,"140":2,"142":1,"143":1,"156":6}}],["dict=usual",{"2":{"0":1,"1":1,"43":1}}],["dict",{"2":{"0":8,"1":12,"20":5,"28":4,"43":3,"72":5,"137":1,"138":1,"140":2,"142":3,"143":3,"144":3,"147":1,"150":1}}],["discuss",{"2":{"83":1,"91":1,"100":1}}],["discreteset",{"2":{"15":8,"25":1,"26":1,"154":6}}],["discretedomain",{"2":{"0":3,"1":7,"56":1,"57":3,"59":1,"60":3,"62":4,"63":3,"68":1,"105":1,"132":1}}],["discrete",{"0":{"14":1,"62":1},"1":{"15":1,"16":1,"17":1,"63":1,"64":1},"2":{"0":5,"1":5,"8":1,"12":1,"13":1,"14":2,"16":1,"55":1,"56":1,"59":1,"62":4,"135":1,"154":5,"156":1}}],["displays",{"2":{"41":1}}],["display",{"2":{"41":13}}],["dispatch",{"2":{"1":1,"114":1,"135":1,"156":2}}],["distributed",{"2":{"156":1}}],["distdifferent",{"2":{"25":3,"26":3,"154":1}}],["distinct",{"2":{"1":2,"32":2,"85":2,"154":1}}],["dist",{"2":{"1":4,"23":1,"24":6,"25":3,"26":2,"156":1}}],["distances",{"2":{"1":1,"24":2,"41":4,"154":1}}],["distance",{"2":{"0":5,"1":8,"13":1,"41":1,"56":2,"59":1,"62":1,"108":1,"154":3,"156":1}}],["diagrams",{"2":{"1":1,"45":2}}],["diagram",{"2":{"0":1,"1":5,"28":4,"45":1,"154":1}}],["d",{"2":{"0":22,"1":54,"13":7,"28":4,"53":1,"56":14,"57":29,"59":7,"60":23,"62":9,"63":26,"65":1,"68":12,"105":12,"132":2,"135":2,"138":3,"143":2,"144":2,"156":9}}],["deepcopy",{"2":{"156":1}}],["deeper",{"2":{"90":1}}],["debugging",{"2":{"156":1}}],["debinarize",{"2":{"0":1,"1":1,"128":1}}],["deprecated",{"2":{"154":1}}],["dependencies",{"2":{"138":1}}],["depending",{"2":{"84":1,"137":1}}],["depend",{"2":{"1":1,"114":1}}],["depends",{"2":{"0":1,"1":1,"13":1,"56":1,"156":1}}],["dedicated",{"2":{"24":1}}],["descent",{"0":{"132":1},"2":{"135":1}}],["description",{"2":{"0":4,"1":13,"20":1,"24":1,"72":1,"154":12,"156":10}}],["descriptions",{"2":{"0":4,"1":4,"20":4,"72":4}}],["describes",{"2":{"41":1}}],["described",{"2":{"20":1,"70":1}}],["describe",{"2":{"0":2,"1":3,"20":4,"43":1,"70":2,"72":2,"110":1,"115":1,"118":1,"121":1,"132":1,"156":3}}],["design",{"2":{"19":1,"69":1}}],["designed",{"2":{"19":1,"23":1,"25":1,"42":1,"69":1,"136":1}}],["detailed",{"2":{"12":1}}],["determining",{"2":{"13":1}}],["deterministic",{"2":{"0":1,"1":1,"45":1}}],["determined",{"2":{"156":1}}],["determine",{"2":{"0":1,"1":2}}],["denotes",{"2":{"1":2,"123":2}}],["decrement",{"2":{"156":1}}],["decrease",{"2":{"156":2}}],["decreasing",{"2":{"1":8,"30":8}}],["decay",{"2":{"156":3}}],["declare",{"2":{"1":1,"154":1}}],["decision",{"2":{"0":1,"1":4,"28":1,"45":3,"154":1}}],["derived",{"2":{"1":1,"154":1}}],["delta",{"2":{"156":6}}],["delegates",{"2":{"1":1,"114":1}}],["delete",{"2":{"0":4,"1":9,"13":1,"56":1,"63":3,"156":13}}],["delineation",{"2":{"1":2,"154":1}}],["delimited",{"2":{"0":1,"1":1}}],["devops",{"2":{"137":2,"138":1}}],["develop",{"2":{"137":1}}],["developers",{"2":{"42":1}}],["development",{"2":{"42":1,"137":1}}],["developing",{"2":{"2":1}}],["dev",{"2":{"0":2,"1":2}}],["default",{"0":{"140":1},"2":{"0":9,"1":16,"17":1,"20":3,"21":1,"32":1,"41":9,"43":3,"57":1,"71":1,"72":3,"128":1,"130":1,"135":4,"137":3,"140":2,"148":9,"151":1,"156":2}}],["defaults",{"2":{"0":4,"1":10,"30":1,"43":1,"53":1,"135":2}}],["defines",{"2":{"0":1,"1":2,"25":1,"26":1,"59":1,"62":1,"109":1,"154":1}}],["define",{"2":{"0":2,"1":6,"12":1,"20":1,"23":1,"24":2,"26":1,"55":1,"72":1,"75":1,"85":1,"154":1}}],["defined",{"0":{"8":1,"28":1},"2":{"0":4,"1":11,"8":1,"12":1,"16":1,"20":1,"23":3,"26":3,"32":1,"56":1,"62":1,"66":2,"72":1,"85":2,"112":1,"123":1,"135":2,"137":1,"148":1,"151":1,"154":4,"156":1}}],["defining",{"0":{"12":1,"24":1,"55":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1},"2":{"0":2,"1":2,"13":1,"20":1,"23":1,"25":1,"66":1,"72":1,"154":2}}],["definition",{"0":{"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1},"1":{"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1},"2":{"0":1,"1":2,"4":1,"5":1,"6":1,"7":1,"19":1,"66":1,"69":1}}],["myperfextension",{"2":{"140":1,"141":1,"142":1,"143":1,"144":1}}],["mypackagename",{"2":{"137":1}}],["mkpath",{"2":{"138":1}}],["mmds",{"2":{"45":1}}],["might",{"2":{"85":2}}],["mission",{"2":{"73":1}}],["missing",{"2":{"25":1,"26":1}}],["minor",{"2":{"137":2}}],["min",{"2":{"132":2,"154":1}}],["mincut",{"2":{"41":1,"156":2}}],["minus",{"2":{"1":28,"112":8,"113":8,"114":4,"123":4,"124":4}}],["minkowski",{"2":{"0":1,"1":1,"108":1}}],["minimization",{"2":{"154":1}}],["minimizing",{"2":{"41":1}}],["minimum",{"2":{"0":1,"1":12,"33":6,"34":11,"41":1,"51":1,"132":2,"154":4}}],["minimal",{"2":{"0":3,"1":4,"16":1,"45":2,"107":1,"108":1,"156":3}}],["move",{"2":{"156":3}}],["moved",{"2":{"105":1}}],["moisupports",{"2":{"154":1}}],["moisum",{"2":{"154":1}}],["moiregular",{"2":{"154":1}}],["moiordered",{"2":{"154":1}}],["moinooverlap",{"2":{"154":1}}],["moinvalues",{"2":{"154":1}}],["moimultivalueddecisiondiagram",{"2":{"154":1}}],["moiminimum",{"2":{"154":1}}],["moimaximum",{"2":{"154":1}}],["moiintention",{"2":{"154":17}}],["moiinstantiation",{"2":{"154":1}}],["moiextension",{"2":{"154":1}}],["moierror",{"2":{"154":5}}],["moielement",{"2":{"154":1}}],["moidistdifferent",{"2":{"154":1}}],["moicumulative",{"2":{"154":1}}],["moiconflicts",{"2":{"154":1}}],["moiallequal",{"2":{"154":1}}],["moialldifferent",{"2":{"154":1}}],["moi",{"2":{"2":1,"12":1,"15":10,"16":8,"18":3,"25":5,"26":5,"29":3,"31":4,"33":4,"35":2,"41":1,"55":1,"154":38}}],["more",{"2":{"1":2,"10":1,"16":1,"107":1,"137":1}}],["mode",{"2":{"154":1}}],["modeled",{"2":{"156":1}}],["modeler",{"2":{"41":13}}],["modellike",{"2":{"154":2}}],["modelize",{"2":{"41":1}}],["modeling",{"0":{"2":1,"96":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1},"2":{"10":1,"23":1,"25":1,"84":2,"85":1}}],["models",{"0":{"10":1,"95":1},"1":{"96":1,"97":1},"2":{"0":5,"1":6,"2":1,"10":3,"12":1,"13":1,"85":1,"96":1,"97":1,"114":1}}],["model",{"0":{"85":1},"2":{"0":14,"1":28,"15":1,"16":1,"25":7,"26":7,"28":1,"29":19,"31":36,"33":28,"35":18,"41":14,"85":3,"154":45,"156":74}}],["module",{"0":{"57":1,"60":1,"63":1},"2":{"1":1}}],["modified",{"2":{"1":4}}],["modify",{"2":{"0":1,"1":6}}],["mostly",{"2":{"145":1}}],["most",{"2":{"0":1,"1":5,"9":1,"11":1,"31":6,"32":4,"55":1,"85":1,"128":1,"154":1}}],["memory",{"2":{"148":2}}],["membership",{"2":{"13":1}}],["meets",{"2":{"3":1}}],["means",{"2":{"1":5,"31":1,"34":2}}],["meaningful",{"2":{"100":1}}],["meaning",{"2":{"1":2,"32":2,"109":1}}],["measurement",{"2":{"156":1}}],["measure",{"2":{"0":2,"1":2}}],["message",{"2":{"0":3,"1":13}}],["messages",{"2":{"0":6,"1":6}}],["metastrategist",{"0":{"157":1},"2":{"157":1}}],["metasolver",{"2":{"156":4}}],["metaheuristics",{"0":{"80":1},"2":{"77":1}}],["metadatamessage",{"2":{"0":1,"1":2}}],["metadata",{"2":{"0":6,"1":10}}],["metrics",{"0":{"108":1},"2":{"136":1,"138":1}}],["metric=hamming",{"2":{"0":1,"1":1,"135":1}}],["metric",{"2":{"0":8,"1":8,"108":2,"135":6}}],["methods",{"0":{"92":1},"1":{"93":1,"94":1},"2":{"0":3,"1":4,"3":1,"13":2,"20":1,"42":2,"45":1,"56":1,"68":1,"72":1,"77":1,"105":1,"107":2,"156":3}}],["method",{"2":{"0":5,"1":28,"21":1,"43":1,"45":1,"56":1,"57":3,"59":1,"60":3,"62":1,"63":3,"71":1,"112":10,"113":6,"130":2,"135":3,"140":1,"141":2,"142":2,"143":1,"144":2,"145":1,"156":1}}],["merge",{"2":{"0":2,"1":2,"59":2,"62":2,"156":1}}],["mutable",{"2":{"156":2}}],["mutually",{"2":{"0":3,"1":4,"109":1,"117":1,"120":1,"125":1,"135":1}}],["much",{"2":{"21":1,"71":1}}],["must",{"2":{"0":3,"1":11,"4":2,"13":2,"23":1,"26":2,"28":2,"32":2,"41":2,"56":1,"62":1,"154":7}}],["multithreading",{"2":{"156":1}}],["multithreaded",{"2":{"156":1}}],["multiplied",{"2":{"41":1}}],["multiplication",{"2":{"0":1,"1":1,"47":1}}],["multimedia",{"2":{"41":4}}],["multi",{"2":{"1":1,"28":1,"154":1}}],["multivalued",{"2":{"0":1,"1":2,"45":3}}],["magic",{"2":{"41":2}}],["major",{"2":{"21":1,"71":1,"105":1,"137":2,"152":2}}],["machinery",{"2":{"19":1,"69":1}}],["macro",{"2":{"0":2,"1":5,"20":2,"72":2,"110":1,"136":1,"138":1,"140":1,"154":1}}],["makie",{"2":{"136":1,"137":1}}],["making",{"2":{"17":1}}],["makes",{"2":{"7":1}}],["make",{"2":{"1":9,"49":1,"110":2,"114":3,"125":1,"132":2,"135":3,"138":1,"156":1}}],["may",{"2":{"17":1}}],["markdown",{"2":{"1":4}}],["marks",{"2":{"1":2,"24":2,"41":1,"154":2}}],["map",{"2":{"1":1,"107":1,"132":5,"156":4}}],["mapping",{"2":{"1":1,"114":1}}],["matter",{"2":{"137":1,"154":1}}],["matters",{"2":{"104":1}}],["mathoptinterface",{"2":{"2":1,"15":1,"16":1,"25":1,"26":1,"41":2,"154":17}}],["mathematical",{"0":{"81":1},"2":{"2":1,"3":1,"4":1,"81":1}}],["maths",{"2":{"0":1,"1":1}}],["matrices",{"0":{"21":1,"71":1,"129":1},"1":{"130":1,"131":1,"132":1,"133":1},"2":{"1":1,"21":1,"71":1,"130":1,"135":1}}],["matrix",{"2":{"0":1,"1":2,"41":4,"127":2,"135":2}}],["matches",{"2":{"1":3,"154":2}}],["match",{"2":{"0":1,"1":4,"154":2}}],["mainsolver",{"2":{"154":1,"156":7}}],["mainly",{"2":{"1":1,"12":1,"17":1}}],["main",{"0":{"143":1},"2":{"0":1,"1":1,"20":1,"22":1,"70":1,"108":1,"136":1,"140":1,"141":1,"154":1,"156":5}}],["manages",{"2":{"156":1}}],["manage",{"2":{"156":1}}],["managed",{"2":{"156":1}}],["manager",{"2":{"84":1}}],["manipulating",{"2":{"109":1}}],["manipulation",{"2":{"1":1,"19":1,"69":1,"114":1}}],["manhattan",{"2":{"0":1,"1":1,"108":1}}],["many",{"2":{"0":1,"1":1,"49":1,"137":1}}],["max",{"2":{"0":3,"1":7,"66":3,"107":2,"109":2,"154":1,"156":10}}],["maximum",{"2":{"0":6,"1":17,"33":5,"34":11,"51":1,"56":1,"59":1,"62":1,"66":3,"154":4,"156":6}}],["m",{"2":{"0":2,"1":2,"15":5,"16":3,"41":6,"43":2,"85":5,"156":139}}],["mddconstraint",{"2":{"154":2}}],["mdd",{"2":{"0":2,"1":16,"20":1,"28":12,"43":1,"45":3,"68":1,"70":1,"105":1,"154":2}}],["fetch",{"2":{"156":1}}],["feasible",{"2":{"85":2}}],["feature",{"2":{"21":1,"42":1,"71":1,"139":1}}],["features",{"0":{"127":1},"2":{"9":1,"12":1,"19":1,"55":1,"69":1,"87":1,"105":1,"136":1}}],["f2",{"2":{"156":2}}],["fraction",{"2":{"145":1}}],["framework",{"2":{"2":1,"11":1}}],["front",{"2":{"110":1}}],["from",{"0":{"28":1,"77":1,"94":1},"2":{"0":6,"1":21,"5":1,"9":1,"20":1,"28":1,"41":2,"57":4,"60":2,"63":3,"68":2,"72":1,"73":1,"85":2,"94":1,"105":3,"107":1,"114":2,"130":1,"135":1,"136":1,"138":4,"142":1,"143":1,"144":1,"145":1,"154":6,"156":17}}],["free",{"2":{"41":1}}],["friendly",{"2":{"9":1}}],["faster",{"2":{"156":1}}],["facilities",{"2":{"41":6}}],["facilitate",{"2":{"19":1,"42":1,"69":1}}],["facilitates",{"2":{"1":1,"114":1}}],["fails",{"2":{"3":1}}],["fake",{"2":{"1":1,"68":1,"105":1}}],["fakeautomaton",{"2":{"1":5,"45":2,"57":2,"60":1,"63":1,"68":5,"105":5}}],["fa",{"2":{"1":3,"45":1,"57":4,"60":2,"63":2,"68":3,"105":3}}],["fallback",{"2":{"0":1,"1":4,"56":1,"57":2,"59":1,"60":2,"62":1,"63":2}}],["false",{"2":{"0":6,"1":32,"7":1,"18":1,"25":1,"26":1,"29":4,"30":3,"31":4,"32":4,"33":9,"34":10,"36":2,"38":1,"40":1,"45":1,"47":1,"49":1,"57":2,"60":2,"63":2,"68":1,"105":1,"125":1,"132":3,"154":4,"156":2}}],["future",{"0":{"103":1},"2":{"43":1}}],["further",{"2":{"41":1,"84":1}}],["fundamentals",{"2":{"81":1}}],["fundamental",{"2":{"1":1,"154":1}}],["func",{"2":{"156":6}}],["funcs",{"2":{"0":2,"1":2,"107":2}}],["functionalities",{"2":{"11":1,"13":1}}],["functioning",{"2":{"11":1}}],["functions",{"0":{"21":1,"71":1},"2":{"0":2,"1":9,"41":1,"42":1,"109":3,"114":4,"125":2,"139":1,"145":2}}],["function",{"2":{"0":25,"1":63,"20":1,"21":5,"23":1,"28":1,"43":1,"49":1,"53":1,"66":5,"71":5,"72":1,"85":1,"107":6,"110":1,"112":1,"114":4,"123":1,"132":7,"135":3,"145":1,"154":29,"156":12}}],["full",{"0":{"1":1}}],["filter",{"2":{"132":1}}],["filled",{"2":{"85":1}}],["fill",{"2":{"41":4,"85":1}}],["file",{"2":{"0":9,"1":10,"109":1}}],["finally",{"2":{"21":1,"71":1}}],["finer",{"2":{"21":1,"71":1}}],["finds",{"2":{"152":1}}],["find",{"2":{"20":1,"70":1,"156":2}}],["finish",{"2":{"1":2,"28":2}}],["finishes",{"2":{"1":8,"36":8}}],["fixes",{"2":{"1":1}}],["fix",{"2":{"1":1}}],["first",{"0":{"85":1},"2":{"1":15,"28":1,"31":1,"34":2,"36":8,"85":1,"132":4,"135":1,"137":4,"152":1,"154":1,"156":1}}],["fields",{"2":{"0":3,"1":6,"154":1}}],["flatten",{"2":{"132":1}}],["flexibility",{"2":{"84":1}}],["flexible",{"2":{"0":4,"1":6,"2":1,"26":1,"66":2,"114":1}}],["flows",{"2":{"41":1}}],["flow",{"2":{"41":1}}],["float64",{"2":{"1":2,"132":1,"154":1,"156":5}}],["floor",{"2":{"0":1,"1":1,"66":1}}],["folder",{"2":{"138":2}}],["fold",{"2":{"138":1}}],["follwing",{"2":{"136":1}}],["follows",{"2":{"85":1,"137":1,"154":1}}],["follow",{"2":{"1":1,"43":1}}],["following",{"2":{"0":6,"1":8,"3":1,"13":1,"32":1,"49":1,"56":1,"107":2,"114":1,"128":1,"138":1,"147":1,"150":1,"156":1}}],["foundational",{"2":{"42":1}}],["foundation",{"2":{"13":1}}],["found",{"2":{"0":2,"1":2,"66":2,"109":1}}],["foreseeable",{"2":{"43":1}}],["forwarded",{"2":{"156":1}}],["forward",{"2":{"41":2,"85":1}}],["forbidden",{"2":{"1":1,"41":1,"154":2}}],["formulating",{"2":{"94":1}}],["formal",{"2":{"4":1,"156":1}}],["formats",{"2":{"0":1,"1":1}}],["formatted",{"2":{"0":1,"1":6,"107":1}}],["format",{"2":{"0":4,"1":5,"20":1,"41":9,"43":1,"56":1,"70":1,"128":1}}],["form",{"2":{"1":2,"38":2}}],["for",{"0":{"82":1,"109":1,"128":1},"1":{"83":1,"84":1,"85":1},"2":{"0":37,"1":81,"2":3,"6":1,"7":1,"10":1,"11":1,"12":1,"13":5,"16":2,"17":1,"20":1,"21":2,"23":1,"24":1,"25":2,"26":2,"29":2,"31":1,"33":1,"34":4,"36":6,"41":12,"43":1,"45":3,"47":1,"53":1,"56":3,"57":3,"59":2,"60":3,"62":2,"63":3,"65":2,"66":5,"68":2,"70":1,"71":2,"83":1,"84":3,"85":2,"88":1,"96":1,"103":1,"105":2,"106":1,"107":3,"109":2,"112":1,"114":5,"123":1,"125":1,"127":1,"128":2,"130":1,"132":2,"134":1,"135":8,"136":3,"137":5,"138":5,"139":2,"140":1,"142":2,"143":1,"145":5,"152":1,"154":14,"155":1,"156":18,"157":1}}],["f",{"2":{"0":14,"1":16,"21":6,"45":1,"49":2,"71":5,"107":6,"154":40,"156":7}}],["t2",{"2":{"154":4}}],["t1",{"2":{"154":3}}],["tbw",{"2":{"135":4,"156":2}}],["tutorial",{"0":{"138":1}}],["tutorials",{"0":{"98":1,"99":1},"1":{"99":1,"100":1},"2":{"99":1}}],["tuple",{"2":{"0":6,"1":20,"34":7,"36":1,"41":2,"56":5,"59":5,"62":5,"66":1,"137":1,"154":9}}],["tuples",{"2":{"0":1,"1":7,"26":2,"66":1,"154":4}}],["tips",{"2":{"96":1}}],["timelimitsec",{"2":{"154":1}}],["time",{"2":{"1":10,"36":8,"41":1,"109":2,"114":1,"145":1,"148":2,"154":1,"156":26}}],["times",{"2":{"1":3,"31":1,"32":3,"138":2,"145":3}}],["tests",{"2":{"137":1}}],["tested",{"0":{"143":1},"2":{"137":1,"142":1}}],["test",{"2":{"132":6,"135":2,"136":1,"137":2}}],["testing",{"0":{"144":1},"2":{"1":1,"135":1,"136":1,"138":2,"140":1,"143":1,"144":1}}],["teach",{"2":{"97":1}}],["techniques",{"0":{"77":1,"89":1},"1":{"90":1,"91":1}}],["tendency",{"2":{"41":1}}],["terminology",{"0":{"3":1,"76":1},"1":{"4":1,"5":1,"6":1,"7":1},"2":{"3":1}}],["terminal",{"2":{"0":3,"1":3}}],["text",{"2":{"1":3,"110":1,"115":1,"118":1,"121":1}}],["temporary",{"2":{"1":1,"156":1}}],["template",{"2":{"0":14,"1":19}}],["templates",{"2":{"0":3,"1":4,"10":1}}],["try",{"2":{"3":1,"84":1,"132":1}}],["tr",{"2":{"1":58,"107":4,"112":33,"113":18}}],["triple",{"2":{"0":1,"1":1}}],["track",{"2":{"140":1,"148":1,"151":1}}],["transpose",{"2":{"132":3}}],["transported",{"2":{"41":1}}],["translates",{"2":{"1":1}}],["translate",{"2":{"0":2,"1":2}}],["transforms",{"2":{"1":4,"114":4}}],["transform",{"2":{"0":1,"1":1,"128":1}}],["transformations",{"0":{"110":1,"111":1},"1":{"111":1,"112":2,"113":2,"114":2},"2":{"0":3,"1":16,"111":1,"114":15,"125":1}}],["transformation",{"2":{"0":4,"1":12,"107":1,"110":3,"114":8}}],["train",{"2":{"0":2,"1":3,"130":3,"132":5,"135":2}}],["training",{"2":{"0":1,"1":1,"135":7}}],["true",{"2":{"0":4,"1":28,"7":1,"18":1,"25":1,"26":1,"29":4,"30":3,"31":10,"32":4,"33":5,"34":6,"35":1,"36":2,"38":1,"40":1,"45":3,"47":1,"49":1,"57":2,"60":2,"63":2,"68":1,"105":1,"109":1,"135":1,"138":1,"140":1,"151":1,"154":6,"156":3}}],["tag",{"2":{"137":1}}],["tags",{"2":{"137":2,"138":1}}],["tackle",{"2":{"105":1}}],["tabu",{"2":{"80":1,"156":46}}],["table",{"0":{"145":1},"2":{"0":4,"1":4,"20":4,"72":4,"132":1,"144":2,"145":4}}],["task",{"2":{"1":16,"36":16}}],["tasks",{"2":{"1":18,"36":18,"154":1,"156":1}}],["target",{"2":{"1":1,"20":1,"43":1,"70":1}}],["targeted",{"2":{"0":1,"1":1,"84":1,"156":3}}],["taken",{"2":{"138":1}}],["takes",{"2":{"1":4,"40":2,"154":1}}],["take",{"2":{"0":2,"1":2,"20":1,"66":1,"72":1,"85":1,"137":1}}],["two",{"2":{"0":4,"1":12,"4":1,"22":1,"26":1,"34":2,"36":4,"41":1,"45":1,"56":1,"59":3,"62":3,"66":1,"154":1}}],["thus",{"2":{"41":1}}],["those",{"2":{"19":1,"20":1,"21":1,"69":1,"70":1,"71":1,"109":1}}],["th",{"2":{"1":1,"109":1}}],["throw",{"2":{"132":1}}],["through",{"2":{"1":3,"8":1,"12":1,"21":2,"23":3,"25":2,"55":1,"71":2,"84":3,"94":1,"116":2,"119":1,"135":2}}],["threads",{"2":{"137":2,"140":1,"148":1,"151":1,"156":12}}],["three",{"2":{"14":1}}],["threshold",{"2":{"1":1,"114":1}}],["third",{"2":{"1":2,"34":2}}],["this",{"2":{"0":3,"1":18,"2":1,"3":1,"4":1,"7":1,"10":1,"12":1,"17":1,"21":3,"24":1,"28":2,"29":2,"33":1,"34":2,"36":2,"41":1,"43":1,"55":1,"66":1,"71":3,"85":2,"105":1,"109":2,"114":1,"137":2,"138":2,"139":1,"140":2,"141":2,"142":2,"143":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"154":8,"156":3}}],["than",{"2":{"1":11,"7":1,"10":1,"23":1,"112":5,"113":2,"114":1,"154":1}}],["that",{"2":{"0":17,"1":102,"4":3,"12":1,"13":1,"20":2,"21":1,"23":4,"24":2,"25":1,"26":4,"28":5,"29":2,"30":7,"32":11,"33":1,"34":14,"36":12,"38":2,"40":4,"41":2,"42":1,"43":2,"56":2,"57":2,"59":1,"60":2,"62":3,"63":2,"70":1,"71":1,"72":1,"73":1,"84":1,"85":6,"107":2,"108":1,"109":3,"114":3,"117":1,"120":1,"125":2,"127":1,"135":3,"136":1,"139":1,"145":1,"154":33,"156":10}}],["theory",{"0":{"94":1}}],["they",{"2":{"23":3,"26":3,"41":1,"90":1,"102":1}}],["their",{"0":{"90":1},"2":{"1":1,"4":1,"6":1,"8":1,"12":2,"18":1,"20":1,"70":1,"84":1,"85":1,"91":1,"114":1,"136":1,"140":1,"148":1,"151":1}}],["these",{"2":{"1":1,"13":1,"23":1,"26":2,"43":1,"145":1}}],["then",{"2":{"1":2,"5":1,"24":1,"156":2}}],["them",{"2":{"0":1,"1":2,"154":1,"156":1}}],["there",{"2":{"0":1,"1":3,"28":1,"41":3,"139":1,"145":1,"154":1}}],["the",{"0":{"13":1,"102":1,"140":1,"145":1},"2":{"0":215,"1":617,"2":1,"3":3,"4":2,"5":5,"6":2,"7":7,"9":1,"10":2,"11":2,"12":4,"13":8,"14":1,"19":5,"20":35,"21":17,"22":1,"23":6,"24":9,"25":6,"26":5,"28":17,"29":2,"30":10,"31":1,"32":41,"33":1,"34":25,"36":33,"38":16,"40":3,"41":50,"42":3,"43":17,"45":2,"47":3,"49":2,"51":5,"53":2,"55":2,"56":8,"57":4,"59":8,"60":8,"62":6,"63":9,"66":18,"68":5,"69":5,"70":20,"71":17,"72":15,"73":3,"81":1,"83":1,"84":9,"85":13,"87":1,"94":1,"97":1,"100":1,"102":1,"103":1,"105":7,"107":5,"108":3,"109":20,"110":5,"111":2,"112":25,"113":12,"114":12,"115":1,"117":3,"118":1,"119":1,"120":3,"121":1,"122":2,"123":7,"124":3,"125":6,"127":1,"128":1,"135":17,"136":2,"137":19,"138":10,"139":3,"140":2,"141":2,"142":6,"143":5,"144":5,"145":3,"147":3,"150":3,"152":5,"154":155,"156":120}}],["typeof",{"2":{"154":1}}],["typemax",{"2":{"132":1,"156":1}}],["types",{"2":{"1":2,"8":1,"13":1,"22":1,"26":1,"42":1,"79":1,"114":2,"156":8}}],["type",{"2":{"0":4,"1":9,"13":4,"41":6,"56":4,"62":2,"65":1,"114":1,"130":1,"135":3,"154":8,"156":6}}],["tolerance",{"2":{"148":4}}],["topics",{"2":{"99":1}}],["tools",{"0":{"2":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1},"2":{"19":1,"69":1}}],["total",{"2":{"1":1,"60":1,"63":1}}],["todo",{"2":{"0":1,"1":2,"24":1,"29":3,"31":4,"33":4,"35":2,"84":1,"85":4,"156":1}}],["towards",{"2":{"0":1,"1":1,"108":1}}],["to",{"0":{"2":1,"57":1,"60":1,"63":1,"73":1,"94":1,"126":1,"143":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"127":1},"2":{"0":62,"1":220,"3":3,"5":2,"6":1,"7":2,"9":1,"10":1,"11":3,"12":2,"13":1,"16":2,"19":1,"20":7,"21":9,"23":1,"24":6,"25":1,"26":1,"28":4,"29":3,"30":9,"31":4,"32":13,"33":4,"34":12,"35":2,"36":2,"38":3,"40":2,"41":16,"42":2,"43":2,"45":1,"47":1,"49":1,"51":1,"53":1,"55":3,"56":4,"57":6,"59":3,"60":4,"62":1,"63":4,"66":7,"68":18,"69":1,"70":3,"71":9,"72":4,"73":1,"84":4,"85":6,"97":1,"100":1,"102":1,"105":21,"107":7,"108":1,"109":3,"110":2,"112":18,"113":7,"114":7,"115":1,"116":2,"118":1,"121":1,"126":1,"127":1,"128":1,"130":1,"132":1,"135":12,"136":3,"137":10,"138":3,"139":3,"140":4,"141":2,"142":3,"143":2,"144":3,"145":5,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"154":36,"156":49}}],["t",{"2":{"0":14,"1":29,"28":2,"41":10,"45":2,"56":8,"59":11,"62":14,"68":5,"105":5,"137":1,"154":25,"156":7}}],["swap",{"2":{"156":2}}],["switch",{"2":{"0":1,"1":1,"108":1}}],["src",{"2":{"154":2}}],["sltns",{"2":{"135":2}}],["square",{"2":{"41":3}}],["sqrt",{"2":{"0":1,"1":1,"66":1}}],["snippets",{"2":{"1":1}}],["shifted",{"2":{"132":3}}],["share",{"2":{"96":1,"103":1}}],["shared",{"2":{"11":1,"42":1}}],["shrink",{"2":{"1":2}}],["showcase",{"2":{"93":1}}],["show",{"2":{"0":1,"1":4,"107":1,"109":1}}],["should",{"2":{"0":2,"1":11,"23":1,"25":1,"34":6,"55":1,"107":2,"154":4,"156":3}}],["shortcut",{"2":{"0":1,"1":1,"21":1,"71":1}}],["script",{"2":{"138":1}}],["scatterlines",{"2":{"137":1,"138":1}}],["scalarfunction",{"2":{"154":3}}],["scalars",{"2":{"1":1,"123":1}}],["scalar",{"2":{"1":5,"20":2,"43":2,"70":2,"119":1,"123":1,"124":1,"154":1}}],["scenario",{"2":{"94":1}}],["science",{"2":{"83":1}}],["scheduling",{"0":{"36":1},"2":{"1":6,"36":6}}],["schema",{"2":{"0":1,"1":1}}],["syntaxes",{"2":{"2":1,"12":1}}],["syntax",{"2":{"1":6,"21":1,"71":1,"84":1,"85":1,"154":1,"156":1}}],["systemmessage",{"2":{"0":1,"1":2}}],["system",{"2":{"0":12,"1":17,"41":1}}],["symb",{"2":{"1":2}}],["symbols",{"2":{"0":6,"1":11,"47":2,"107":4,"109":1,"137":2}}],["symbol",{"2":{"0":14,"1":34,"20":4,"21":2,"43":4,"47":3,"71":2,"72":4,"109":1,"114":5,"125":1,"128":1,"132":1,"137":1,"139":1,"156":3}}],["symmetry",{"2":{"0":1,"1":1}}],["symmetries",{"2":{"0":4,"1":4}}],["symcon",{"2":{"0":1,"1":1,"47":1}}],["split",{"2":{"135":1}}],["specialize",{"2":{"156":10}}],["specialized",{"2":{"1":2,"112":1,"123":1,"156":10}}],["specializing",{"2":{"156":1}}],["specify",{"2":{"55":1}}],["specifying",{"2":{"1":2,"12":1,"154":5}}],["specific",{"2":{"1":6,"3":2,"5":1,"6":1,"7":1,"40":4,"114":1,"135":2,"148":1,"151":1,"154":2}}],["specifically",{"2":{"1":2,"57":2,"60":1,"63":1,"68":1,"105":1,"154":1}}],["specification",{"2":{"0":1,"1":1,"43":1}}],["specifications",{"2":{"0":1,"1":2,"20":1,"43":2,"72":1}}],["specifies",{"2":{"1":8,"4":1,"23":1,"26":1,"32":1,"34":6,"114":1}}],["specified",{"2":{"0":3,"1":5,"41":2,"57":2,"60":1,"63":1,"66":1,"68":1,"105":1,"114":1,"154":2}}],["span",{"2":{"1":1,"59":1,"62":1}}],["spaces",{"2":{"14":1,"49":1}}],["space",{"2":{"0":14,"1":17,"66":9,"154":3,"156":1}}],["sat",{"2":{"156":3}}],["satisfying",{"2":{"156":2}}],["satisfy",{"2":{"1":3,"4":1,"23":1,"26":1,"32":3,"154":2}}],["satisfied",{"2":{"0":1,"1":10,"7":2,"21":1,"28":1,"34":4,"36":2,"38":1,"40":1,"71":1,"154":1,"156":1}}],["satisfies",{"2":{"0":1,"1":8,"7":1,"28":1,"32":6,"154":4}}],["satisfaction",{"0":{"7":1},"2":{"0":1,"1":3,"3":1,"10":1,"66":1,"154":1,"156":3}}],["save",{"2":{"138":2}}],["say",{"2":{"0":1,"1":1,"128":1}}],["same",{"2":{"0":3,"1":5,"20":1,"41":2,"59":1,"62":1,"72":1,"154":1}}],["sampling",{"0":{"49":1},"1":{"50":1},"2":{"42":1,"49":2}}],["samplings",{"2":{"0":3,"1":3,"66":3}}],["samples=d",{"2":{"143":1}}],["samples",{"2":{"0":1,"1":1,"66":1,"138":1,"140":1,"143":1,"145":5,"148":2,"151":1}}],["stop",{"2":{"156":5}}],["storing",{"2":{"138":1}}],["storage",{"2":{"16":1}}],["stored",{"2":{"142":1,"143":1}}],["stores",{"2":{"0":1,"1":2,"62":2,"138":2}}],["store",{"2":{"0":2,"1":16,"19":1,"59":3,"66":1,"68":8,"69":1,"105":8,"107":1,"109":2,"156":3}}],["stuff",{"2":{"132":2}}],["studies",{"0":{"93":1},"2":{"93":1}}],["studio",{"2":{"84":1}}],["stdout",{"2":{"41":1}}],["still",{"2":{"21":1,"71":1}}],["stipulates",{"2":{"1":1,"154":2}}],["step",{"2":{"1":2,"88":2,"99":2,"156":3}}],["stamp",{"2":{"156":3}}],["status",{"2":{"156":4}}],["static",{"2":{"156":1}}],["statement",{"2":{"4":1}}],["states",{"2":{"1":4,"28":4}}],["state",{"2":{"0":3,"1":3,"6":1,"41":3,"66":3,"156":36}}],["standard",{"2":{"12":1,"20":1,"22":1,"41":3,"55":1,"70":1}}],["standards",{"2":{"2":1,"9":1}}],["stands",{"2":{"12":1}}],["started",{"0":{"82":1,"88":1},"1":{"83":1,"84":1,"85":1},"2":{"88":1}}],["start=",{"2":{"41":1}}],["start",{"2":{"1":4,"28":2,"38":2,"41":1,"85":1,"137":1}}],["starts",{"2":{"1":9,"36":8,"156":2}}],["starting",{"2":{"1":1,"41":2,"156":1}}],["str",{"2":{"156":1}}],["strategies",{"0":{"91":1},"2":{"91":1}}],["strategy",{"2":{"0":1,"1":1,"66":1}}],["straight",{"2":{"85":1}}],["straightforward",{"2":{"23":1,"154":1}}],["strongly",{"2":{"3":1}}],["streamlining",{"0":{"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1},"1":{"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1}}],["streamline",{"2":{"10":1}}],["streamed",{"2":{"0":3,"1":3}}],["stream",{"2":{"0":3,"1":3}}],["struct",{"2":{"0":1,"1":2,"41":3,"56":1,"156":4}}],["structures",{"2":{"42":1}}],["structured",{"2":{"1":1}}],["structure",{"0":{"109":1},"2":{"0":10,"1":15,"13":1,"17":1,"41":1,"45":3,"56":2,"68":1,"105":1,"109":4,"135":1,"156":5}}],["string",{"2":{"0":8,"1":31,"41":1,"57":4,"60":4,"63":4,"107":1,"109":1,"137":1,"154":1,"156":1}}],["strictly",{"2":{"0":3,"1":13,"30":8,"113":1,"119":1}}],["sound",{"2":{"17":1}}],["source",{"2":{"0":91,"1":219,"13":1,"20":5,"21":3,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"41":21,"43":3,"45":7,"47":3,"49":1,"51":1,"53":1,"56":10,"57":15,"59":12,"60":15,"62":14,"63":16,"65":2,"66":4,"68":17,"70":1,"71":3,"72":4,"105":17,"107":7,"108":4,"109":12,"112":11,"113":6,"114":2,"116":2,"117":1,"119":2,"120":1,"123":5,"124":4,"125":2,"127":2,"128":3,"130":2,"135":28,"152":4,"154":74,"156":144}}],["soon",{"2":{"16":1,"154":1}}],["so",{"2":{"1":2,"41":1,"85":1}}],["solve",{"2":{"41":1,"85":1,"156":3}}],["solverversion",{"2":{"154":1}}],["solvername",{"2":{"154":1}}],["solvers",{"0":{"153":1},"2":{"84":3,"85":4,"109":1,"153":1,"156":2}}],["solver",{"2":{"41":6,"85":2,"135":1,"154":11,"156":29}}],["solved",{"2":{"1":1}}],["solving",{"2":{"2":1,"73":1,"75":1,"84":1,"91":1,"94":1,"156":4}}],["sols",{"2":{"0":1,"1":1,"135":4}}],["solution",{"2":{"0":1,"1":3,"29":2,"33":1,"41":2,"85":3,"108":1,"154":3,"156":4}}],["solutions",{"2":{"0":15,"1":15,"42":1,"66":11,"108":1,"135":8,"156":9}}],["something",{"2":{"1":1}}],["some",{"2":{"0":1,"1":1,"17":1,"47":1,"49":1,"85":1,"105":1,"110":1,"115":1,"118":1,"121":1,"135":1,"137":1,"146":1,"149":1,"154":1}}],["silent",{"2":{"154":4,"156":1}}],["situations",{"2":{"51":1}}],["sink",{"2":{"41":3}}],["since",{"2":{"14":1,"23":1,"25":1,"156":1}}],["single",{"2":{"1":3,"85":1,"116":2,"119":1}}],["significance",{"2":{"75":1}}],["signature",{"2":{"0":2,"1":2,"107":2}}],["sig",{"2":{"1":17,"112":10,"113":6}}],["simulated",{"2":{"80":1}}],["simplify",{"2":{"90":1}}],["simplified",{"2":{"1":3}}],["simply",{"2":{"1":2,"15":1,"21":1,"57":2,"60":1,"63":1,"68":1,"71":1,"85":1,"105":1,"137":1}}],["simple",{"2":{"0":2,"1":2,"20":1,"72":1,"85":2}}],["similar",{"2":{"0":1,"1":1,"13":1,"31":1,"56":1}}],["size",{"2":{"0":16,"1":32,"13":1,"20":1,"38":3,"41":3,"43":1,"56":5,"59":8,"62":8,"66":2,"70":1,"107":1,"109":2,"123":3,"124":3,"132":2,"135":7,"156":4}}],["successfully",{"2":{"93":1}}],["such",{"2":{"1":5,"2":1,"8":1,"18":1,"19":1,"20":2,"23":3,"25":2,"28":1,"41":2,"43":2,"70":2,"76":1,"109":1,"114":1,"154":1,"156":4}}],["sudoku",{"2":{"41":17,"85":4,"156":1}}],["sudokuinstances",{"2":{"41":1}}],["sudokuinstance",{"2":{"41":19}}],["sub",{"2":{"135":1,"156":1}}],["subgrid",{"2":{"85":1}}],["subgrids",{"2":{"85":1}}],["subtype",{"2":{"41":1}}],["subtract",{"2":{"1":1,"114":1}}],["subtraction",{"2":{"1":1,"114":1}}],["subs",{"2":{"156":3}}],["subsolvers",{"2":{"156":4}}],["subsolver",{"2":{"156":6}}],["subsets",{"2":{"85":2}}],["subset",{"2":{"5":1,"154":1}}],["substituted",{"2":{"0":1,"1":1}}],["substituting",{"2":{"0":1,"1":1}}],["supplies",{"2":{"41":1}}],["support",{"2":{"1":1,"154":1}}],["supported",{"2":{"1":4,"154":2}}],["supports",{"2":{"1":7,"8":1,"154":13}}],["supports=nothing",{"2":{"1":1}}],["supertype",{"2":{"0":2,"1":2,"13":1,"59":1,"62":1}}],["super",{"2":{"0":1,"1":1,"13":1,"56":1}}],["summing",{"0":{"32":1}}],["sum",{"2":{"0":5,"1":24,"4":1,"31":8,"32":8,"36":2,"41":1,"60":1,"63":1,"66":2,"116":3,"119":2,"127":3,"154":3}}],["series",{"2":{"85":1,"156":1}}],["serves",{"2":{"42":1}}],["server",{"2":{"0":4,"1":4}}],["segment",{"2":{"41":3}}],["sec",{"2":{"156":1}}],["section",{"2":{"24":1,"43":1,"146":1,"149":1}}],["seconds=d",{"2":{"143":1}}],["seconds",{"2":{"138":1,"140":1,"143":1,"148":2,"151":1,"156":1}}],["second",{"2":{"1":10,"34":2,"36":8}}],["several",{"2":{"11":1,"51":1,"84":1,"109":1}}],["separator",{"2":{"41":1}}],["separates",{"2":{"1":1,"107":1}}],["sep",{"2":{"1":2,"41":2,"107":2}}],["select",{"2":{"137":1,"156":4}}],["selection",{"2":{"1":1,"114":1}}],["selected",{"2":{"0":4,"1":8,"109":6,"117":1,"120":1,"125":1,"135":2,"156":1}}],["sequence",{"2":{"1":10,"28":4,"38":6,"154":3}}],["seen",{"2":{"4":1}}],["see",{"2":{"0":2,"1":2,"18":2,"24":1,"156":1}}],["searching",{"2":{"0":2,"1":2,"66":1}}],["search",{"0":{"91":1,"133":1},"2":{"0":27,"1":28,"49":1,"66":16,"80":1,"91":1,"109":1,"154":1,"156":1}}],["setter",{"2":{"85":1}}],["setting",{"0":{"84":1},"2":{"156":1}}],["settings",{"2":{"0":8,"1":8,"66":8,"156":1}}],["setup",{"2":{"84":1}}],["sets",{"2":{"0":1,"1":3,"8":1,"16":1,"17":1,"34":2,"66":1,"135":3}}],["setdomain",{"0":{"15":1},"2":{"0":5,"1":5,"15":1,"16":1,"56":1,"59":1,"62":3,"63":2}}],["set",{"2":{"0":11,"1":34,"4":1,"6":1,"7":1,"15":1,"18":1,"26":2,"32":3,"34":4,"40":2,"41":4,"45":1,"47":2,"57":2,"60":1,"62":3,"63":1,"68":1,"105":1,"107":1,"114":1,"125":1,"128":2,"135":11,"154":68,"156":22}}],["s2",{"2":{"0":1,"1":1,"47":1}}],["s1",{"2":{"0":1,"1":1,"47":1}}],["s",{"2":{"0":18,"1":26,"13":2,"21":4,"41":5,"43":3,"45":6,"56":2,"59":1,"62":1,"66":2,"71":4,"85":1,"141":1,"143":1,"152":1,"156":109}}],["authors",{"2":{"136":1}}],["auto",{"2":{"132":1}}],["automated",{"2":{"1":1}}],["automatically",{"2":{"1":1}}],["automata",{"2":{"1":1,"45":2}}],["automaton",{"2":{"0":3,"1":17,"20":1,"28":8,"43":1,"45":5,"68":4,"70":1,"105":4,"154":2}}],["among",{"2":{"135":1,"156":1}}],["amount",{"2":{"41":1}}],["aka",{"2":{"55":1}}],["a2",{"2":{"31":2}}],["a1",{"2":{"31":2}}],["about",{"0":{"104":1},"1":{"105":1},"2":{"12":1,"19":1,"55":1,"69":1,"104":1,"153":1,"154":1,"156":1}}],["above",{"2":{"1":1}}],["absolute",{"2":{"1":3,"123":1,"124":1}}],["abs",{"2":{"0":1,"1":5,"20":1,"24":2,"25":6,"26":6,"72":1,"123":2,"124":2}}],["abstractstate",{"2":{"156":1}}],["abstractstring",{"2":{"0":1,"1":6,"156":2}}],["abstractstring=",{"2":{"0":1,"1":1,"47":1}}],["abstractsolver",{"2":{"156":70}}],["abstractscalarset",{"2":{"154":2}}],["abstractscalarfunction",{"2":{"154":1}}],["abstractmatrix",{"2":{"41":4}}],["abstractmultivalueddecisiondiagram",{"2":{"0":1,"1":3,"45":3,"154":1}}],["abstractvectorset",{"2":{"154":22}}],["abstractvector",{"2":{"1":31,"34":4,"36":5,"38":1,"40":2,"107":1,"112":11,"113":6,"156":1}}],["abstractprompt",{"2":{"0":2,"1":2}}],["abstractllm",{"2":{"0":3,"1":6}}],["abstractoptimizer",{"2":{"0":1,"1":2,"130":2,"132":1,"135":2,"154":1}}],["abstractrange",{"2":{"0":2,"1":2,"56":1,"59":1,"62":2}}],["abstract",{"2":{"0":3,"1":6,"13":2,"42":1,"45":2,"56":1,"59":1,"62":1,"130":1,"135":2,"156":2}}],["abstractdomain",{"0":{"13":1},"2":{"0":10,"1":27,"13":5,"56":5,"57":6,"59":4,"60":5,"62":4,"63":5,"65":1,"68":10,"105":10,"156":6}}],["abstractdictionary",{"2":{"0":1,"1":1,"53":1}}],["abstractdict",{"2":{"0":1,"1":1,"53":1}}],["abstractautomaton",{"2":{"0":1,"1":7,"28":3,"45":3,"68":1,"105":1,"154":2}}],["after",{"2":{"1":1,"144":1}}],["affects",{"2":{"111":1,"122":1}}],["affect",{"2":{"0":1,"1":1,"108":1}}],["advantages",{"2":{"83":1}}],["advanced",{"0":{"89":1},"1":{"90":1,"91":1},"2":{"42":1}}],["adjusted",{"2":{"1":1}}],["adds",{"2":{"1":4}}],["added",{"2":{"1":2,"24":1,"25":1,"154":1}}],["adding",{"2":{"0":2,"1":2,"20":2,"72":2}}],["additional",{"2":{"0":1,"1":1,"66":1}}],["additionally",{"2":{"0":1,"1":1,"13":1,"56":1}}],["add",{"2":{"0":3,"1":7,"13":1,"15":8,"16":4,"23":1,"24":1,"25":3,"26":3,"56":1,"62":2,"84":1,"85":4,"154":9,"156":19}}],["aggragation",{"2":{"118":1}}],["aggregate",{"2":{"1":1,"119":1}}],["aggregations",{"0":{"119":1},"2":{"0":1,"1":1,"120":1}}],["aggregation",{"0":{"118":1},"1":{"119":1,"120":1},"2":{"0":4,"1":4,"120":1}}],["again",{"2":{"41":1}}],["against",{"2":{"0":1,"1":3,"40":1,"114":1}}],["ag",{"2":{"1":2,"119":2}}],["ai",{"2":{"0":2,"1":2}}],["achieve",{"2":{"136":1}}],["across",{"2":{"11":1,"138":1}}],["acts",{"2":{"19":1,"69":1}}],["action",{"2":{"0":2,"1":2}}],["actual",{"2":{"0":1,"1":3,"5":1,"138":1}}],["accurate",{"2":{"132":2}}],["accessing",{"2":{"0":6,"1":6}}],["access",{"2":{"0":4,"1":5,"56":1,"109":1,"156":20}}],["acceptable",{"2":{"1":2,"154":1}}],["accepted",{"2":{"0":2,"1":4,"28":2,"154":1}}],["accepts",{"2":{"0":1,"1":3,"41":4,"45":3,"68":1,"105":1}}],["accept",{"2":{"0":1,"1":7,"45":6,"68":3,"105":3}}],["according",{"2":{"0":1,"1":2,"66":1,"114":1,"138":1,"154":1}}],["alternative",{"2":{"109":1}}],["alternatively",{"2":{"25":1,"26":1}}],["although",{"2":{"84":1}}],["already",{"2":{"1":3,"85":1,"112":1,"123":1,"135":1,"156":1}}],["along",{"2":{"1":1,"2":1,"20":1,"43":1,"70":1,"84":1}}],["algorithms",{"2":{"80":1}}],["algorithm",{"2":{"0":4,"1":4,"135":3}}],["also",{"2":{"0":2,"1":5,"6":1,"12":1,"19":1,"32":3,"69":1,"85":1,"114":1,"125":1,"145":1}}],["allequal",{"2":{"29":1,"154":2}}],["alldifferent",{"2":{"29":2,"85":5,"154":2}}],["allocs",{"2":{"138":1,"145":4}}],["allocations",{"2":{"1":17,"112":10,"113":6,"138":1}}],["allow",{"2":{"26":1}}],["allows",{"2":{"16":1}}],["allowing",{"2":{"1":3,"114":1,"154":1}}],["allunique",{"2":{"0":1,"1":1,"66":1}}],["all",{"2":{"0":11,"1":46,"2":1,"13":1,"20":4,"21":1,"26":1,"29":10,"30":24,"32":1,"41":1,"43":1,"51":1,"59":1,"70":1,"71":1,"72":3,"84":1,"85":2,"107":2,"114":1,"125":1,"147":1,"150":1,"152":2,"154":6,"156":4}}],["avoid",{"2":{"0":1,"1":2,"154":2,"156":1}}],["available",{"2":{"0":3,"1":4,"20":1,"23":1,"25":1,"41":2,"72":1,"84":2,"114":1,"156":1}}],["approach",{"2":{"85":1}}],["appropriate",{"2":{"0":1,"1":2,"114":1,"143":1,"145":1}}],["appear",{"2":{"1":3,"32":3}}],["applications",{"0":{"93":1}}],["application",{"2":{"1":1,"3":1,"5":1,"19":1,"69":1,"107":1}}],["applies",{"2":{"1":1,"107":1,"154":1}}],["applied",{"2":{"0":2,"1":3,"5":1,"21":1,"71":1,"85":1,"93":1,"114":1,"154":1,"156":2}}],["applying",{"0":{"92":1},"1":{"93":1,"94":1}}],["apply",{"2":{"0":6,"1":8,"21":4,"71":4,"114":2}}],["apixcspjumpmoi",{"2":{"25":1,"26":1,"29":3,"31":4,"33":4,"35":2}}],["apis",{"0":{"25":1}}],["apicbls",{"2":{"15":1,"16":1,"18":1}}],["api",{"0":{"0":1,"1":1,"9":1,"24":1,"152":1},"2":{"0":24,"1":24,"2":1,"20":2,"23":1,"25":1,"70":2,"152":1}}],["attribution",{"2":{"156":1}}],["attributed",{"2":{"156":6}}],["attribute",{"2":{"156":2}}],["attached",{"2":{"156":1}}],["atoms",{"2":{"41":1}}],["atmost",{"2":{"31":1,"154":2}}],["atleast",{"2":{"31":1,"154":2}}],["at",{"2":{"0":3,"1":15,"13":1,"18":1,"20":1,"31":12,"32":8,"36":2,"41":1,"45":1,"72":1,"84":1,"109":2,"128":1,"135":2,"154":3,"156":1}}],["arrange",{"2":{"152":3}}],["arrangement",{"2":{"135":1}}],["array",{"2":{"31":1}}],["ar",{"2":{"1":2,"116":2}}],["arbitrary",{"0":{"17":1},"2":{"1":2,"17":1,"62":1,"142":1}}],["arbitrarydomain",{"2":{"1":1,"62":1}}],["arithmetic",{"0":{"115":1,"116":1},"1":{"116":1,"117":1},"2":{"0":5,"1":6,"20":1,"43":1,"70":1,"115":1,"117":2}}],["arxiv",{"2":{"0":1,"1":1,"20":1,"72":1}}],["areas",{"2":{"103":1}}],["are",{"2":{"0":11,"1":49,"8":1,"10":1,"11":1,"12":1,"13":1,"16":1,"17":1,"20":3,"21":2,"22":1,"23":4,"24":2,"26":4,"30":10,"36":2,"41":5,"42":1,"43":1,"49":1,"55":1,"59":1,"62":1,"70":3,"71":2,"85":1,"109":2,"112":10,"113":5,"114":1,"117":1,"120":1,"125":1,"137":1,"139":1,"142":1,"143":1,"145":2,"148":1,"151":1,"154":8,"156":2}}],["argmax",{"2":{"156":3}}],["argument",{"2":{"1":7,"20":1,"41":4,"70":1,"154":1}}],["arguments",{"2":{"0":21,"1":54,"20":4,"21":3,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"41":1,"43":1,"56":1,"59":1,"66":4,"70":1,"71":3,"72":3,"154":27,"156":8}}],["args",{"2":{"0":10,"1":13,"13":3,"21":4,"56":4,"71":4,"130":1,"135":3}}],["aspect",{"2":{"12":1}}],["aspects",{"0":{"11":1}}],["assert",{"2":{"1":1,"109":1}}],["assigned",{"2":{"6":1}}],["assign",{"2":{"0":1,"1":1,"41":1,"156":1}}],["assignments",{"2":{"0":1,"1":1,"7":1}}],["assignment",{"2":{"0":1,"1":1,"3":1,"6":1,"41":1}}],["associated",{"2":{"0":1,"1":2,"41":1,"66":1,"85":1,"109":1,"141":1}}],["as",{"2":{"0":11,"1":37,"2":1,"4":1,"6":1,"8":1,"12":1,"15":1,"16":5,"17":2,"18":2,"19":2,"20":6,"23":3,"25":3,"26":1,"28":2,"32":3,"41":3,"42":1,"43":2,"45":1,"49":1,"59":1,"62":3,"69":1,"70":3,"72":3,"76":1,"84":1,"85":1,"107":2,"109":1,"112":1,"114":1,"123":1,"135":1,"137":5,"139":1,"148":1,"151":1,"152":1,"154":4,"156":6}}],["analyze",{"2":{"97":1}}],["analyzing",{"0":{"95":1},"1":{"96":1,"97":1}}],["analysis",{"0":{"97":1,"100":1},"2":{"100":1}}],["annealing",{"2":{"80":1}}],["annotation",{"2":{"0":1,"1":1}}],["anonymous",{"2":{"1":1,"107":1}}],["another",{"2":{"1":2,"21":1,"34":2,"71":1}}],["an",{"0":{"24":1},"2":{"0":33,"1":79,"2":1,"6":1,"13":2,"20":3,"24":1,"25":1,"28":3,"30":3,"32":1,"41":3,"42":1,"43":3,"45":2,"47":1,"56":2,"59":6,"60":1,"62":3,"63":1,"66":7,"70":3,"73":2,"85":1,"94":1,"107":4,"109":6,"110":1,"113":1,"114":1,"123":1,"124":1,"130":1,"135":7,"136":1,"137":1,"138":1,"139":1,"145":1,"154":12,"156":11}}],["any",{"0":{"109":1},"2":{"0":9,"1":20,"13":1,"36":6,"41":1,"47":1,"56":2,"57":1,"60":1,"63":1,"130":1,"137":1,"154":4,"156":1}}],["and",{"0":{"12":1,"20":1,"21":1,"27":1,"29":1,"31":1,"32":1,"33":1,"35":1,"36":1,"37":1,"39":1,"55":1,"71":1,"76":1,"82":1,"88":1,"90":1,"91":1,"93":1,"95":1,"97":1,"98":1,"101":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"83":1,"84":1,"85":1,"96":1,"97":1,"99":1,"100":1,"102":1,"103":1},"2":{"0":37,"1":81,"2":3,"3":1,"4":2,"5":1,"6":2,"7":3,"8":1,"9":2,"10":2,"11":2,"12":5,"13":3,"16":1,"19":3,"20":1,"21":4,"22":1,"23":1,"26":1,"28":1,"31":2,"32":1,"34":2,"38":2,"41":13,"42":4,"43":1,"45":1,"47":1,"49":1,"51":1,"55":2,"56":2,"59":2,"62":1,"66":4,"68":2,"69":3,"71":4,"72":1,"73":2,"75":1,"76":1,"77":1,"80":1,"81":1,"83":2,"84":2,"85":4,"87":1,"88":1,"90":1,"91":1,"93":1,"94":1,"96":2,"97":1,"99":1,"100":1,"102":1,"103":1,"105":2,"107":1,"109":3,"111":1,"112":5,"113":1,"114":3,"122":1,"123":1,"124":1,"127":1,"128":1,"135":10,"137":1,"138":2,"140":1,"146":1,"149":1,"152":1,"154":10,"156":11}}],["a",{"0":{"7":1,"9":1,"10":1,"109":1,"145":1},"2":{"0":105,"1":332,"2":1,"3":5,"4":6,"5":5,"6":4,"7":3,"9":2,"10":1,"13":4,"15":2,"16":2,"17":2,"19":1,"20":10,"21":5,"23":10,"24":2,"25":3,"26":4,"28":29,"29":2,"30":3,"32":13,"33":1,"34":22,"36":8,"38":8,"40":8,"41":26,"42":1,"43":4,"45":11,"53":2,"56":9,"57":19,"59":8,"60":17,"62":8,"63":17,"66":11,"68":15,"69":2,"70":4,"71":5,"72":6,"84":2,"85":12,"94":1,"105":15,"107":8,"108":4,"109":17,"110":1,"114":10,"116":2,"119":2,"123":1,"124":1,"127":2,"128":7,"130":1,"135":23,"136":3,"137":8,"138":1,"139":2,"140":1,"144":1,"145":1,"146":1,"149":1,"152":3,"154":48,"156":51}}]],"serializationVersion":2}';export{t as default};
diff --git a/dev/assets/chunks/@localSearchIndexroot.YbY6v__g.js b/dev/assets/chunks/@localSearchIndexroot.YbY6v__g.js
new file mode 100644
index 0000000..a016163
--- /dev/null
+++ b/dev/assets/chunks/@localSearchIndexroot.YbY6v__g.js
@@ -0,0 +1 @@
+const t='{"documentCount":159,"nextId":159,"documentIds":{"0":"/dev/api/00_public#Public-API","1":"/dev/api/10_full#Full-API","2":"/dev/constraints/00_intro#Introduction-to-basics-constraint-based-modeling-tools","3":"/dev/constraints/00_intro#terminology","4":"/dev/constraints/00_intro#constraint","5":"/dev/constraints/00_intro#Constraint-Instantiation","6":"/dev/constraints/00_intro#configuration","7":"/dev/constraints/00_intro#Constraint-Satisfaction-or-Violation-by-a-Configuration","8":"/dev/constraints/00_intro#Domain-defined-variables","9":"/dev/constraints/00_intro#A-versatile-constraints\'-API","10":"/dev/constraints/00_intro#A-collection-of-models","11":"/dev/constraints/00_intro#Internal-Aspects","12":"/dev/constraints/10_variables_and_domains#Defining-Variables-and-Exploring-Domains","13":"/dev/constraints/10_variables_and_domains#Implementing-the-AbstractDomain-Interface","14":"/dev/constraints/10_variables_and_domains#Discrete-Domains","15":"/dev/constraints/10_variables_and_domains#SetDomain","16":"/dev/constraints/10_variables_and_domains#RangeDomain","17":"/dev/constraints/10_variables_and_domains#Arbitrary-Domains","18":"/dev/constraints/10_variables_and_domains#Continuous-Domains","19":"/dev/constraints/20_constraints#Interacting-with-Constraints-in-Julia","20":"/dev/constraints/20_constraints#Usual-Constraints-and-Parameters","21":"/dev/constraints/20_constraints#Concepts,-Error-Functions,-and-QUBO-matrices","22":"/dev/constraints/21_generic_constraints#Generic-Constraints","23":"/dev/constraints/21_generic_constraints#Intention-Constraints","24":"/dev/constraints/21_generic_constraints#Defining-an-intention-constraint-in-JC-API","25":"/dev/constraints/21_generic_constraints#apis","26":"/dev/constraints/21_generic_constraints#Extension-Constraints","27":"/dev/constraints/22_language_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","28":"/dev/constraints/22_language_constraints#Constraints-defined-from-Languages","29":"/dev/constraints/23_comparison_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","30":"/dev/constraints/23_comparison_constraints#Comparison-based-Constraints","31":"/dev/constraints/24_counting_summing_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","32":"/dev/constraints/24_counting_summing_constraints#Counting-and-Summing-Constraints","33":"/dev/constraints/25_connection_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","34":"/dev/constraints/25_connection_constraints#Connection-Constraints","35":"/dev/constraints/26_packing_scheduling_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","36":"/dev/constraints/26_packing_scheduling_constraints#Packing-and-Scheduling-Constraints","37":"/dev/constraints/27_graph_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","38":"/dev/constraints/27_graph_constraints#Constraints-on-Graphs","39":"/dev/constraints/28_elementary_constraints#Constraints.jl:-Streamlining-Constraint-Definition-and-Integration-in-Julia","40":"/dev/constraints/28_elementary_constraints#Elementary-Constraints","41":"/dev/constraints/40_constraint_models#constraintmodels-jl","42":"/dev/constraints/60_constraint_commons#constraintcommons-jl","43":"/dev/constraints/60_constraint_commons#parameters","44":"/dev/constraints/60_constraint_commons#performances","45":"/dev/constraints/60_constraint_commons#languages","46":"/dev/constraints/60_constraint_commons#Performances-2","47":"/dev/constraints/60_constraint_commons#extensions","48":"/dev/constraints/60_constraint_commons#Performances-3","49":"/dev/constraints/60_constraint_commons#sampling","50":"/dev/constraints/60_constraint_commons#Performances-4","51":"/dev/constraints/60_constraint_commons#extrema","52":"/dev/constraints/60_constraint_commons#Performances-5","53":"/dev/constraints/60_constraint_commons#dictionaries","54":"/dev/constraints/60_constraint_commons#Performances-6","55":"/dev/constraints/61_pattern_folds#patternfolds-jl","56":"/dev/constraints/62_constraint_domains#ConstraintDomains.jl:-Defining-Variables-and-Exploring-Domains","57":"/dev/constraints/62_constraint_domains#commons","58":"/dev/constraints/62_constraint_domains#Extension-to-Base-module","59":"/dev/constraints/62_constraint_domains#performances","60":"/dev/constraints/62_constraint_domains#continuous","61":"/dev/constraints/62_constraint_domains#Extension-to-Base-module-2","62":"/dev/constraints/62_constraint_domains#Performances-2","63":"/dev/constraints/62_constraint_domains#discrete","64":"/dev/constraints/62_constraint_domains#Extension-to-Base-module-3","65":"/dev/constraints/62_constraint_domains#Performances-3","66":"/dev/constraints/62_constraint_domains#general","67":"/dev/constraints/62_constraint_domains#exploration","68":"/dev/constraints/62_constraint_domains#Performances-4","69":"/dev/constraints/62_constraint_domains#parameters","70":"/dev/constraints/63_constraints_jl#Interacting-with-Constraints-in-Julia","71":"/dev/constraints/63_constraints_jl#Usual-Parameters","72":"/dev/constraints/63_constraints_jl#Concepts,-Error-Functions,-and-QUBO-matrices","73":"/dev/constraints/63_constraints_jl#Usual-Constraints","74":"/dev/cp/00_intro#Welcome-to-Julia-Constraints","75":"/dev/cp/10_cp101#Constraint-Programming-101","76":"/dev/cp/10_cp101#What-is-Constraint-Programming?","77":"/dev/cp/10_cp101#Basic-Concepts-and-Terminology","78":"/dev/cp/10_cp101#How-CP-differs-from-other-optimization-techniques","79":"/dev/cp/20_opt#Dive-into-Optimization","80":"/dev/cp/20_opt#Understanding-Optimization","81":"/dev/cp/20_opt#Metaheuristics-Overview","82":"/dev/cp/20_opt#Mathematical-Programming-Basics","83":"/dev/cp/30_getting_started#Getting-Started-with-Julia-for-CP-and-Optimization","84":"/dev/cp/30_getting_started#Why-Julia?","85":"/dev/cp/30_getting_started#Setting-Up-Your-Julia-Environment","86":"/dev/cp/30_getting_started#Your-First-Julia-CP-Model","87":"/dev/cp/40_ecosystem#Exploring-JuliaConstraint-Packages","88":"/dev/cp/40_ecosystem#Package-Overviews","89":"/dev/cp/40_ecosystem#Installation-and-Getting-Started-Guides","90":"/dev/cp/50_advanced#Advanced-Constraint-Programming-Techniques","91":"/dev/cp/50_advanced#Global-Constraints-and-Their-Uses","92":"/dev/cp/50_advanced#Search-Strategies-and-Optimization","93":"/dev/cp/60_applications#Applying-Optimization-Methods","94":"/dev/cp/60_applications#Case-Studies-and-Real-World-Applications","95":"/dev/cp/60_applications#From-Theory-to-Practice","96":"/dev/cp/70_models#Building-and-Analyzing-Models","97":"/dev/cp/70_models#Modeling-Best-Practices","98":"/dev/cp/70_models#Performance-Analysis-and-Improvement","99":"/dev/cp/80_tuto_xp#Tutorials-and-Experiments","100":"/dev/cp/80_tuto_xp#Hands-On-Tutorials","101":"/dev/cp/80_tuto_xp#Experimental-Analysis","102":"/dev/cp/90_contribution#Community-and-Contribution","103":"/dev/cp/90_contribution#Joining-the-JuliaConstraint-Community","104":"/dev/cp/90_contribution#Future-Directions","105":"/dev/learning/00_intro#Learning-about-Constraints","106":"/dev/learning/00_intro#parameters","107":"/dev/learning/10_compositional_networks#compositionalnetworks-jl","108":"/dev/learning/10_compositional_networks#utilities","109":"/dev/learning/10_compositional_networks#metrics","110":"/dev/learning/11_layers#A-layer-structure-for-any-ICN","111":"/dev/learning/12_transformation#Transformations-Layer","112":"/dev/learning/12_transformation#List-of-transformations","113":"/dev/learning/12_transformation#non-parametric","114":"/dev/learning/12_transformation#Param:-:val","115":"/dev/learning/12_transformation#Layer-generation","116":"/dev/learning/14_aggregation#Aggregation-Layer","117":"/dev/learning/14_aggregation#List-of-aggregations","118":"/dev/learning/14_aggregation#Layer-generation","119":"/dev/learning/13_arithmetic#Arithmetic-Layer","120":"/dev/learning/13_arithmetic#List-of-arithmetic-operations","121":"/dev/learning/13_arithmetic#Layer-generation","122":"/dev/learning/15_comparison#Comparison-Layer","123":"/dev/learning/15_comparison#List-of-comparisons","124":"/dev/learning/15_comparison#non-parametric","125":"/dev/learning/15_comparison#Param:-:val","126":"/dev/learning/15_comparison#Layer-generation","127":"/dev/learning/20_qubo_constraints#Introduction-to-QUBOConstraints.jl","128":"/dev/learning/20_qubo_constraints#Basic-features","129":"/dev/learning/21_qubo_encoding#Encoding-for-QUBO-programs","130":"/dev/learning/30_constraints_translator#constraintstranslator-jl","131":"/dev/learning/22_qubo_learning#Learning-QUBO-matrices","132":"/dev/learning/22_qubo_learning#interface","133":"/dev/learning/22_qubo_learning#Examples-with-various-optimizers","134":"/dev/learning/22_qubo_learning#Gradient-Descent","135":"/dev/learning/22_qubo_learning#Constraint-based-Local-Search","136":"/dev/learning/90_constraint_learning#constraintlearning-jl","137":"/dev/perf/00_perf_checker#perfchecker-jl","138":"/dev/perf/00_perf_checker#usage","139":"/dev/perf/20_perf_interface#Extending-PerfChecker","140":"/dev/perf/20_perf_interface#The-Default-Options","141":"/dev/perf/20_perf_interface#Package-initialization","142":"/dev/perf/20_perf_interface#Preparatory-Code:","143":"/dev/perf/20_perf_interface#Main-Code-to-be-Performance-Tested","144":"/dev/perf/20_perf_interface#Post-Performance-Testing-Code","145":"/dev/perf/20_perf_interface#Converting-the-result-into-a-Table","146":"/dev/perf/30_benchmark_ext#BenchmarkTools-Extension","147":"/dev/perf/30_benchmark_ext#usage","148":"/dev/perf/30_benchmark_ext#options","149":"/dev/perf/10_tutorial#tutorial","150":"/dev/perf/40_chairmarks_ext#Chairmarks-Extension","151":"/dev/perf/40_chairmarks_ext#usage","152":"/dev/perf/40_chairmarks_ext#options","153":"/dev/perf/90_api#api","154":"/dev/solvers/00_intro#solvers","155":"/dev/solvers/10_cbls#cbls-jl","156":"/dev/solvers/40_constraint_explorer#constraintexplorer-jl","157":"/dev/solvers/50_local_search_solvers#localsearchsolvers-jl","158":"/dev/solvers/80_meta_strategist#metastrategist-jl"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[2,1,795],"1":[2,1,1364],"2":[7,1,54],"3":[1,7,49],"4":[1,8,42],"5":[2,8,40],"6":[1,8,39],"7":[7,8,49],"8":[3,7,28],"9":[5,7,36],"10":[4,7,38],"11":[2,7,40],"12":[5,1,54],"13":[4,5,88],"14":[2,5,20],"15":[1,6,57],"16":[1,6,78],"17":[2,6,37],"18":[2,5,50],"19":[5,1,51],"20":[4,5,172],"21":[6,5,99],"22":[2,1,17],"23":[2,2,77],"24":[7,3,68],"25":[1,3,101],"26":[2,2,109],"27":[9,1,1],"28":[4,9,118],"29":[9,1,79],"30":[3,9,72],"31":[9,1,112],"32":[4,9,131],"33":[9,1,82],"34":[2,9,95],"35":[9,1,66],"36":[4,9,103],"37":[9,1,1],"38":[3,9,68],"39":[9,1,1],"40":[2,9,54],"41":[2,1,283],"42":[2,1,66],"43":[1,2,114],"44":[1,3,1],"45":[1,2,82],"46":[1,3,1],"47":[1,2,43],"48":[1,3,1],"49":[1,2,42],"50":[1,3,1],"51":[1,2,28],"52":[1,3,1],"53":[1,2,34],"54":[1,3,1],"55":[2,1,197],"56":[7,1,45],"57":[1,7,133],"58":[4,8,100],"59":[1,8,1],"60":[1,7,123],"61":[4,8,107],"62":[1,8,1],"63":[1,7,133],"64":[4,8,111],"65":[1,8,1],"66":[1,7,16],"67":[1,7,123],"68":[1,8,1],"69":[1,7,127],"70":[5,1,49],"71":[2,5,106],"72":[6,5,100],"73":[2,5,93],"74":[4,1,35],"75":[3,1,1],"76":[5,3,10],"77":[4,3,10],"78":[7,3,10],"79":[3,1,1],"80":[2,3,12],"81":[2,3,11],"82":[3,3,12],"83":[8,1,1],"84":[3,8,16],"85":[5,8,104],"86":[5,8,191],"87":[3,1,1],"88":[2,3,13],"89":[5,1,13],"90":[4,1,1],"91":[5,4,12],"92":[4,4,12],"93":[3,1,1],"94":[6,3,11],"95":[4,3,18],"96":[4,1,1],"97":[3,4,12],"98":[4,4,11],"99":[3,1,1],"100":[3,3,11],"101":[2,3,15],"102":[3,1,1],"103":[4,3,14],"104":[2,3,13],"105":[3,1,6],"106":[1,3,147],"107":[2,1,5],"108":[1,2,93],"109":[1,2,46],"110":[6,1,134],"111":[2,1,30],"112":[3,2,10],"113":[2,5,63],"114":[2,5,55],"115":[2,5,157],"116":[2,1,11],"117":[3,2,23],"118":[2,2,23],"119":[2,1,11],"120":[4,2,19],"121":[2,2,22],"122":[2,1,11],"123":[3,2,10],"124":[2,5,51],"125":[2,5,34],"126":[2,5,42],"127":[4,1,5],"128":[2,4,32],"129":[4,1,61],"130":[2,1,5],"131":[3,1,1],"132":[1,3,27],"133":[4,3,1],"134":[2,7,102],"135":[4,7,1],"136":[2,1,227],"137":[2,1,51],"138":[1,2,150],"139":[2,1,49],"140":[3,2,53],"141":[2,2,38],"142":[3,2,58],"143":[6,2,61],"144":[4,2,42],"145":[6,2,59],"146":[2,1,26],"147":[1,2,48],"148":[1,2,31],"149":[1,1,129],"150":[2,1,26],"151":[1,2,49],"152":[1,2,25],"153":[1,1,53],"154":[1,1,3],"155":[2,1,470],"156":[2,1,5],"157":[2,1,501],"158":[2,1,5]},"averageFieldLength":[2.9874213836477983,3.4716981132075486,68.37735849056601],"storedFields":{"0":{"title":"Public API","titles":[]},"1":{"title":"Full API","titles":[]},"2":{"title":"Introduction to basics constraint-based modeling tools","titles":[]},"3":{"title":"Terminology","titles":["Introduction to basics constraint-based modeling tools"]},"4":{"title":"Constraint","titles":["Introduction to basics constraint-based modeling tools","Terminology"]},"5":{"title":"Constraint Instantiation","titles":["Introduction to basics constraint-based modeling tools","Terminology"]},"6":{"title":"Configuration","titles":["Introduction to basics constraint-based modeling tools","Terminology"]},"7":{"title":"Constraint Satisfaction or Violation by a Configuration","titles":["Introduction to basics constraint-based modeling tools","Terminology"]},"8":{"title":"Domain-defined variables","titles":["Introduction to basics constraint-based modeling tools"]},"9":{"title":"A versatile constraints' API","titles":["Introduction to basics constraint-based modeling tools"]},"10":{"title":"A collection of models","titles":["Introduction to basics constraint-based modeling tools"]},"11":{"title":"Internal Aspects","titles":["Introduction to basics constraint-based modeling tools"]},"12":{"title":"Defining Variables and Exploring Domains","titles":[]},"13":{"title":"Implementing the AbstractDomain Interface","titles":["Defining Variables and Exploring Domains"]},"14":{"title":"Discrete Domains","titles":["Defining Variables and Exploring Domains"]},"15":{"title":"SetDomain","titles":["Defining Variables and Exploring Domains","Discrete Domains"]},"16":{"title":"RangeDomain","titles":["Defining Variables and Exploring Domains","Discrete Domains"]},"17":{"title":"Arbitrary Domains","titles":["Defining Variables and Exploring Domains","Discrete Domains"]},"18":{"title":"Continuous Domains","titles":["Defining Variables and Exploring Domains"]},"19":{"title":"Interacting with Constraints in Julia","titles":[]},"20":{"title":"Usual Constraints and Parameters","titles":["Interacting with Constraints in Julia"]},"21":{"title":"Concepts, Error Functions, and QUBO matrices","titles":["Interacting with Constraints in Julia"]},"22":{"title":"Generic Constraints","titles":[]},"23":{"title":"Intention Constraints","titles":["Generic Constraints"]},"24":{"title":"Defining an intention constraint in JC-API","titles":["Generic Constraints","Intention Constraints"]},"25":{"title":"APIs","titles":["Generic Constraints","Intention Constraints"]},"26":{"title":"Extension Constraints","titles":["Generic Constraints"]},"27":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"28":{"title":"Constraints defined from Languages","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"29":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"30":{"title":"Comparison-based Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"31":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"32":{"title":"Counting and Summing Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"33":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"34":{"title":"Connection Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"35":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"36":{"title":"Packing and Scheduling Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"37":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"38":{"title":"Constraints on Graphs","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"39":{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","titles":[]},"40":{"title":"Elementary Constraints","titles":["Constraints.jl: Streamlining Constraint Definition and Integration in Julia"]},"41":{"title":"ConstraintModels.jl","titles":[]},"42":{"title":"ConstraintCommons.jl","titles":[]},"43":{"title":"Parameters","titles":["ConstraintCommons.jl"]},"44":{"title":"Performances","titles":["ConstraintCommons.jl","Parameters"]},"45":{"title":"Languages","titles":["ConstraintCommons.jl"]},"46":{"title":"Performances","titles":["ConstraintCommons.jl","Languages"]},"47":{"title":"Extensions","titles":["ConstraintCommons.jl"]},"48":{"title":"Performances","titles":["ConstraintCommons.jl","Extensions"]},"49":{"title":"Sampling","titles":["ConstraintCommons.jl"]},"50":{"title":"Performances","titles":["ConstraintCommons.jl","Sampling"]},"51":{"title":"Extrema","titles":["ConstraintCommons.jl"]},"52":{"title":"Performances","titles":["ConstraintCommons.jl","Extrema"]},"53":{"title":"Dictionaries","titles":["ConstraintCommons.jl"]},"54":{"title":"Performances","titles":["ConstraintCommons.jl","Dictionaries"]},"55":{"title":"PatternFolds.jl","titles":[]},"56":{"title":"ConstraintDomains.jl: Defining Variables and Exploring Domains","titles":[]},"57":{"title":"Commons","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains"]},"58":{"title":"Extension to Base module","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Commons"]},"59":{"title":"Performances","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Commons"]},"60":{"title":"Continuous","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains"]},"61":{"title":"Extension to Base module","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Continuous"]},"62":{"title":"Performances","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Continuous"]},"63":{"title":"Discrete","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains"]},"64":{"title":"Extension to Base module","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Discrete"]},"65":{"title":"Performances","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Discrete"]},"66":{"title":"General","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains"]},"67":{"title":"Exploration","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains"]},"68":{"title":"Performances","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains","Exploration"]},"69":{"title":"Parameters","titles":["ConstraintDomains.jl: Defining Variables and Exploring Domains"]},"70":{"title":"Interacting with Constraints in Julia","titles":[]},"71":{"title":"Usual Parameters","titles":["Interacting with Constraints in Julia"]},"72":{"title":"Concepts, Error Functions, and QUBO matrices","titles":["Interacting with Constraints in Julia"]},"73":{"title":"Usual Constraints","titles":["Interacting with Constraints in Julia"]},"74":{"title":"Welcome to Julia Constraints","titles":[]},"75":{"title":"Constraint Programming 101","titles":[]},"76":{"title":"What is Constraint Programming?","titles":["Constraint Programming 101"]},"77":{"title":"Basic Concepts and Terminology","titles":["Constraint Programming 101"]},"78":{"title":"How CP differs from other optimization techniques","titles":["Constraint Programming 101"]},"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":"Getting Started with Julia for CP and Optimization","titles":[]},"84":{"title":"Why Julia?","titles":["Getting Started with Julia for CP and Optimization"]},"85":{"title":"Setting Up Your Julia Environment","titles":["Getting Started with Julia for CP and Optimization"]},"86":{"title":"Your First Julia CP Model","titles":["Getting Started with Julia for CP and Optimization"]},"87":{"title":"Exploring JuliaConstraint Packages","titles":[]},"88":{"title":"Package Overviews","titles":["Exploring JuliaConstraint Packages"]},"89":{"title":"Installation and Getting Started Guides","titles":[]},"90":{"title":"Advanced Constraint Programming Techniques","titles":[]},"91":{"title":"Global Constraints and Their Uses","titles":["Advanced Constraint Programming Techniques"]},"92":{"title":"Search Strategies and Optimization","titles":["Advanced Constraint Programming Techniques"]},"93":{"title":"Applying Optimization Methods","titles":[]},"94":{"title":"Case Studies and Real-World Applications","titles":["Applying Optimization Methods"]},"95":{"title":"From Theory to Practice","titles":["Applying Optimization Methods"]},"96":{"title":"Building and Analyzing Models","titles":[]},"97":{"title":"Modeling Best Practices","titles":["Building and Analyzing Models"]},"98":{"title":"Performance Analysis and Improvement","titles":["Building and Analyzing Models"]},"99":{"title":"Tutorials and Experiments","titles":[]},"100":{"title":"Hands-On Tutorials","titles":["Tutorials and Experiments"]},"101":{"title":"Experimental Analysis","titles":["Tutorials and Experiments"]},"102":{"title":"Community and Contribution","titles":[]},"103":{"title":"Joining the JuliaConstraint Community","titles":["Community and Contribution"]},"104":{"title":"Future Directions","titles":["Community and Contribution"]},"105":{"title":"Learning about Constraints","titles":[]},"106":{"title":"Parameters","titles":["Learning about Constraints"]},"107":{"title":"CompositionalNetworks.jl","titles":[]},"108":{"title":"Utilities","titles":["CompositionalNetworks.jl"]},"109":{"title":"Metrics","titles":["CompositionalNetworks.jl"]},"110":{"title":"A layer structure for any ICN","titles":[]},"111":{"title":"Transformations Layer","titles":[]},"112":{"title":"List of transformations","titles":["Transformations Layer"]},"113":{"title":"Non-parametric","titles":["Transformations Layer","List of transformations"]},"114":{"title":"Param: :val","titles":["Transformations Layer","List of transformations"]},"115":{"title":"Layer generation","titles":["Transformations Layer","List of transformations"]},"116":{"title":"Aggregation Layer","titles":[]},"117":{"title":"List of aggregations","titles":["Aggregation Layer"]},"118":{"title":"Layer generation","titles":["Aggregation Layer"]},"119":{"title":"Arithmetic Layer","titles":[]},"120":{"title":"List of arithmetic operations","titles":["Arithmetic Layer"]},"121":{"title":"Layer generation","titles":["Arithmetic Layer"]},"122":{"title":"Comparison Layer","titles":[]},"123":{"title":"List of comparisons","titles":["Comparison Layer"]},"124":{"title":"Non-parametric","titles":["Comparison Layer","List of comparisons"]},"125":{"title":"Param: :val","titles":["Comparison Layer","List of comparisons"]},"126":{"title":"Layer generation","titles":["Comparison Layer","List of comparisons"]},"127":{"title":"Introduction to QUBOConstraints.jl","titles":[]},"128":{"title":"Basic features","titles":["Introduction to QUBOConstraints.jl"]},"129":{"title":"Encoding for QUBO programs","titles":[]},"130":{"title":"ConstraintsTranslator.jl","titles":[]},"131":{"title":"Learning QUBO matrices","titles":[]},"132":{"title":"Interface","titles":["Learning QUBO matrices"]},"133":{"title":"Examples with various optimizers","titles":["Learning QUBO matrices"]},"134":{"title":"Gradient Descent","titles":["Learning QUBO matrices","Examples with various optimizers"]},"135":{"title":"Constraint-based Local Search","titles":["Learning QUBO matrices","Examples with various optimizers"]},"136":{"title":"ConstraintLearning.jl","titles":[]},"137":{"title":"PerfChecker.jl","titles":[]},"138":{"title":"Usage","titles":["PerfChecker.jl"]},"139":{"title":"Extending PerfChecker","titles":[]},"140":{"title":"The Default Options","titles":["Extending PerfChecker"]},"141":{"title":"Package initialization","titles":["Extending PerfChecker"]},"142":{"title":"Preparatory Code:","titles":["Extending PerfChecker"]},"143":{"title":"Main Code to be Performance Tested","titles":["Extending PerfChecker"]},"144":{"title":"Post Performance Testing Code","titles":["Extending PerfChecker"]},"145":{"title":"Converting the result into a Table","titles":["Extending PerfChecker"]},"146":{"title":"BenchmarkTools Extension","titles":[]},"147":{"title":"Usage","titles":["BenchmarkTools Extension"]},"148":{"title":"Options","titles":["BenchmarkTools Extension"]},"149":{"title":"Tutorial","titles":[]},"150":{"title":"Chairmarks Extension","titles":[]},"151":{"title":"Usage","titles":["Chairmarks Extension"]},"152":{"title":"Options","titles":["Chairmarks Extension"]},"153":{"title":"API","titles":[]},"154":{"title":"Solvers","titles":[]},"155":{"title":"CBLS.jl","titles":[]},"156":{"title":"ConstraintExplorer.jl","titles":[]},"157":{"title":"LocalSearchSolvers.jl","titles":[]},"158":{"title":"MetaStrategist.jl","titles":[]}},"dirtCount":0,"index":[["∅",{"2":{"155":1}}],["∩",{"2":{"155":1}}],["$kwarg",{"2":{"149":1}}],["$d",{"2":{"143":1}}],["$block",{"2":{"142":1,"143":1}}],["θ",{"2":{"134":2}}],["^2",{"2":{"134":1}}],["η",{"2":{"134":6,"136":1}}],["⋯",{"2":{"86":2}}],["×",{"2":{"86":3}}],["`function",{"2":{"157":1}}],["`struct",{"2":{"157":1}}],["``",{"2":{"155":3}}],["`",{"2":{"55":1,"58":2,"61":1,"64":1,"69":1,"106":1,"136":1}}],["`vector",{"2":{"55":1,"58":2,"61":1,"64":1,"69":1,"106":1}}],["`base",{"2":{"55":1,"58":2,"61":1,"64":1,"69":1,"106":1}}],["`grid`",{"2":{"41":1}}],["`m`",{"2":{"41":1}}],["q",{"2":{"134":18,"136":7}}],["qap",{"2":{"41":1}}],["quite",{"2":{"86":1}}],["quadractic",{"2":{"41":1}}],["queens",{"2":{"41":4}}],["querying",{"2":{"0":1,"1":3}}],["query",{"2":{"0":3,"1":3}}],["quote",{"2":{"141":1,"142":1,"143":1}}],["quot",{"2":{"0":2,"1":12,"36":4,"86":6,"138":2,"142":2}}],["qubooptimizer",{"2":{"136":2}}],["qubogradientoptimizer",{"2":{"136":4}}],["qubo",{"0":{"21":1,"72":1,"129":1,"131":1},"1":{"132":1,"133":1,"134":1,"135":1},"2":{"0":2,"1":5,"21":1,"72":1,"128":4,"132":1,"136":4}}],["quboconstraints",{"0":{"127":1},"1":{"128":1},"2":{"0":5,"1":7,"19":1,"21":1,"72":1,"127":1,"128":2,"129":3,"132":2,"134":1,"136":1}}],["z",{"2":{"31":4,"33":4,"35":4}}],["zeros",{"2":{"134":3}}],["zero",{"2":{"1":11,"36":11,"41":1}}],["≥",{"2":{"29":1,"31":3,"134":1}}],["\\tzero",{"2":{"35":1}}],["\\theights",{"2":{"35":1}}],["\\tlengths",{"2":{"35":2}}],["\\tlist",{"2":{"29":1,"31":2,"33":2}}],["\\torigins",{"2":{"35":2}}],["\\toperator",{"2":{"29":1}}],["\\tcondition",{"2":{"33":1,"35":1}}],["\\tindex",{"2":{"33":1}}],["\\t\\toccurs",{"2":{"31":1}}],["\\t\\texcept",{"2":{"31":1}}],["\\t\\tvalues",{"2":{"31":2}}],["\\t\\tcondition",{"2":{"31":2,"33":1}}],["≠",{"2":{"24":1,"25":3,"26":3}}],["−x",{"2":{"24":2}}],["|the",{"2":{"24":1}}],["|≠|x",{"2":{"24":1}}],["|x",{"2":{"24":1}}],["||",{"2":{"1":2,"155":1}}],["yes",{"2":{"157":1}}],["yet",{"2":{"1":2,"41":1,"57":1,"60":1}}],["you",{"2":{"147":1,"151":1}}],["your",{"0":{"85":1,"86":1}}],["y=5",{"2":{"7":1}}],["y=2",{"2":{"6":1,"7":1}}],["y=1",{"2":{"1":1}}],["y",{"2":{"4":1,"6":1,"23":2,"25":18,"26":19,"29":4,"31":6,"33":4,"35":4,"134":7,"136":4,"157":2}}],["∉",{"2":{"1":3,"155":2}}],["7",{"2":{"1":5,"32":2,"36":3,"41":3,"153":1}}],["≤6",{"2":{"35":1}}],["≤12",{"2":{"35":1}}],["≤1",{"2":{"33":1}}],["≤10",{"2":{"31":3}}],["≤5",{"2":{"29":2,"31":5,"33":6,"35":4}}],["≤2",{"2":{"29":1}}],["≤4",{"2":{"29":2,"31":4,"33":1}}],["≤",{"2":{"1":5,"16":2,"31":2,"35":3,"36":1,"58":4,"61":4,"64":4,"86":2}}],["σ",{"2":{"0":2,"1":2,"128":2}}],["gcsample",{"2":{"148":2}}],["gctrial",{"2":{"148":2}}],["gctimes",{"2":{"145":3,"149":1}}],["gc=d",{"2":{"143":1}}],["gc",{"2":{"140":1,"143":1,"145":1,"152":1}}],["gcc",{"2":{"1":3,"32":3}}],["giving",{"2":{"138":1}}],["gives",{"2":{"29":2,"33":1,"55":1}}],["give",{"2":{"0":1,"1":1}}],["given",{"2":{"0":11,"1":24,"5":1,"7":2,"21":1,"28":2,"32":7,"41":2,"72":1,"110":2,"126":1,"128":1,"129":1,"136":6,"138":1,"155":6}}],["guide",{"2":{"95":1,"149":1}}],["guides",{"0":{"89":1}}],["game",{"2":{"86":1}}],["gap",{"2":{"55":6}}],["gt",{"2":{"24":1,"106":1,"138":6}}],["good",{"2":{"139":1}}],["googleapis",{"2":{"0":1,"1":1}}],["google",{"2":{"0":7,"1":7}}],["googlellm",{"2":{"0":3,"1":3}}],["goes",{"2":{"138":2,"147":1,"151":1}}],["goal",{"2":{"41":1}}],["golomb",{"2":{"1":1,"24":2,"41":2,"155":1}}],["grads",{"2":{"134":2}}],["gradientdescentoptimizer",{"2":{"134":5}}],["gradient",{"0":{"134":1},"2":{"134":1,"136":1}}],["graphs",{"0":{"38":1}}],["graph",{"2":{"1":1,"28":1,"41":4,"155":1,"157":1}}],["grid",{"2":{"41":5,"86":3}}],["greater",{"2":{"1":12,"113":7,"114":1,"115":3}}],["groq",{"2":{"0":6,"1":6}}],["groqllm",{"2":{"0":1,"1":1}}],["g",{"2":{"0":1,"1":18,"41":1,"80":1,"113":8,"114":4,"115":3}}],["global",{"0":{"91":1},"2":{"0":5,"1":36,"30":7,"32":4,"34":6,"36":6,"38":2,"40":2,"86":1,"91":1,"136":2,"155":15}}],["gemini",{"2":{"0":6,"1":6}}],["generalstate",{"2":{"157":2}}],["generally",{"2":{"41":1}}],["general",{"0":{"66":1},"2":{"3":1,"157":1}}],["generating",{"2":{"1":2,"13":1}}],["generativelanguage",{"2":{"0":1,"1":1}}],["generation",{"0":{"115":1,"118":1,"121":1,"126":1},"2":{"0":3,"1":3}}],["generated",{"2":{"0":4,"1":22,"21":1,"72":1,"113":10,"114":6}}],["generates",{"2":{"0":1,"1":5,"69":1,"106":1,"110":2,"115":1}}],["generate",{"2":{"0":7,"1":27,"69":10,"106":11,"108":3,"110":6,"115":2,"118":1,"121":1,"126":2,"136":2}}],["generic",{"0":{"22":1},"1":{"23":1,"24":1,"25":1,"26":1},"2":{"1":1,"5":2,"9":1,"22":1,"42":1,"155":1,"157":2}}],["genetic",{"2":{"0":4,"1":4,"81":1,"136":3}}],["getting",{"0":{"83":1,"89":1},"1":{"84":1,"85":1,"86":1},"2":{"89":1}}],["get",{"2":{"0":4,"1":9,"41":2,"57":1,"86":1,"115":2,"153":2,"155":6,"157":16}}],["joinpath",{"2":{"149":3}}],["join",{"2":{"103":1}}],["joining",{"0":{"103":1}}],["j+1",{"2":{"86":1}}],["j",{"2":{"86":1}}],["jc",{"0":{"24":1},"2":{"2":1,"15":1,"16":1,"18":1,"20":1,"23":1,"25":2,"26":1,"29":3,"31":4,"33":4,"35":2,"71":1}}],["just",{"2":{"142":1}}],["jumpcbls",{"2":{"15":1,"16":1,"18":1}}],["jump",{"2":{"1":1,"2":1,"12":1,"15":2,"16":2,"23":1,"25":2,"26":1,"29":9,"31":12,"33":11,"35":6,"41":17,"56":1,"85":3,"86":2,"155":10,"157":1}}],["jumpify",{"2":{"1":1}}],["julia>",{"2":{"147":1,"151":1}}],["juliajump",{"2":{"155":3}}],["juliajumpify",{"2":{"1":1}}],["juliajulia>",{"2":{"147":1,"151":1,"153":1}}],["juliax",{"2":{"58":1,"61":1,"64":1,"157":1}}],["juliaxcsp",{"2":{"1":19,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1}}],["juliaup",{"2":{"85":1}}],["juliaunfold",{"2":{"55":1}}],["juliausermessage",{"2":{"1":1}}],["juliausing",{"2":{"1":1,"15":3,"16":1,"18":1,"25":3,"26":3,"29":9,"31":12,"33":12,"35":6,"85":2,"149":1}}],["juliausual",{"2":{"0":2,"1":3,"20":1,"73":1}}],["juliavariable",{"2":{"157":3}}],["juliavar",{"2":{"58":1,"61":1,"64":1,"157":1}}],["juliavalue",{"2":{"86":1}}],["juliavalsparameterdomain",{"2":{"1":1,"69":1,"106":1}}],["juliavalparameterdomain",{"2":{"1":1,"69":1,"106":1}}],["juliavectorfold",{"2":{"55":2}}],["juliaqap",{"2":{"41":1}}],["juliaqubogradientoptimizer",{"2":{"136":1}}],["juliaqubo",{"2":{"0":1,"1":2,"128":2,"136":1}}],["juliano",{"2":{"136":1}}],["julian",{"2":{"41":1}}],["julianbits",{"2":{"0":1,"1":2,"110":1}}],["juliachemical",{"2":{"41":1}}],["juliacheck",{"2":{"1":1}}],["juliac",{"2":{"1":18,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1}}],["juliaco",{"2":{"1":9,"124":5,"125":4}}],["juliacompose",{"2":{"0":2,"1":2}}],["juliacompositionalnetworks",{"2":{"136":2}}],["juliacomposition",{"2":{"0":3,"1":3}}],["juliacomparison",{"2":{"0":1,"1":1,"126":1}}],["juliacode",{"2":{"0":1,"1":1}}],["juliaconcept",{"2":{"0":3,"1":37,"21":3,"28":2,"30":7,"32":9,"34":4,"36":4,"38":1,"40":1,"72":3}}],["juliaconstriction",{"2":{"157":1}}],["juliaconstraintcommons",{"2":{"1":1,"45":1,"69":1,"106":1}}],["juliaconstraints",{"2":{"0":4,"1":4,"20":4,"73":4}}],["juliaconstraint",{"0":{"87":1,"103":1},"1":{"88":1},"2":{"0":1,"1":1,"74":1,"88":1,"104":1,"157":3}}],["juliaconst",{"2":{"1":2,"20":2,"24":1,"43":2,"71":2,"136":2}}],["juliaconsisempty",{"2":{"0":1,"1":1,"47":1}}],["juliaconsin",{"2":{"0":1,"1":1,"47":1}}],["juliacontinuousdomain",{"2":{"0":1,"1":1,"60":1}}],["juliao",{"2":{"157":1}}],["juliaobjective",{"2":{"157":4}}],["juliaoptions",{"2":{"157":1}}],["juliaoptimizer",{"2":{"155":2}}],["juliaoptimize",{"2":{"86":1,"136":1}}],["juliaopparameterdomain",{"2":{"1":1,"69":1,"106":1}}],["juliaoversample",{"2":{"0":1,"1":1,"49":1}}],["juliafunction",{"2":{"140":1,"143":1,"145":1}}],["juliafunctions",{"2":{"1":1,"110":1}}],["juliafor",{"2":{"86":2}}],["juliaformat",{"2":{"0":1,"1":1}}],["juliafolds",{"2":{"55":1}}],["juliafold",{"2":{"55":1}}],["juliafix",{"2":{"1":1}}],["juliafake",{"2":{"1":1,"69":1,"106":1}}],["juliafakeautomaton",{"2":{"1":1,"69":1,"106":1}}],["juliapost",{"2":{"157":1}}],["juliaperfchecker",{"2":{"141":1,"142":1,"144":1}}],["juliapredicate",{"2":{"155":1}}],["juliapredict",{"2":{"136":1}}],["juliapreliminaries",{"2":{"136":1}}],["juliaprompttemplate",{"2":{"0":1,"1":1}}],["juliaprompt",{"2":{"0":1,"1":1}}],["juliapush",{"2":{"1":2}}],["juliapattern",{"2":{"55":3}}],["juliapatternfold",{"2":{"55":2}}],["juliapairvarsparameterdomain",{"2":{"1":1,"69":1,"106":1}}],["juliaparameter",{"2":{"136":1}}],["juliaparams",{"2":{"0":1,"1":1}}],["juliaparse",{"2":{"0":1,"1":1}}],["juliagap",{"2":{"55":1}}],["juliagolomb",{"2":{"41":1}}],["juliagoogle",{"2":{"0":1,"1":1}}],["juliagroqllm",{"2":{"0":1,"1":1}}],["juliageneralstate",{"2":{"157":1}}],["juliagenerate",{"2":{"0":1,"1":5,"69":1,"106":1,"110":3,"136":1}}],["juliaget",{"2":{"0":4,"1":5,"57":1,"157":12}}],["juliaboolparameterdomain",{"2":{"1":1,"69":1,"106":1}}],["juliabinarize",{"2":{"0":1,"1":1,"129":1}}],["juliabase",{"2":{"0":1,"1":17,"41":4,"55":2,"58":17,"60":1,"61":14,"63":1,"64":15,"66":2,"69":6,"106":6,"155":5}}],["juliaweights",{"2":{"0":3,"1":3,"109":1}}],["juliatr",{"2":{"1":19,"108":1,"113":11,"114":6}}],["juliatranslate",{"2":{"0":1,"1":1}}],["juliatransformation",{"2":{"0":1,"1":1,"115":1}}],["juliatrain",{"2":{"0":1,"1":1,"132":1,"136":2}}],["juliato",{"2":{"0":1,"1":1,"57":1}}],["juliarand",{"2":{"55":1,"58":2,"61":1,"64":1,"69":1,"106":1}}],["juliarangedomain",{"2":{"0":1,"1":1,"63":1}}],["juliaremote",{"2":{"157":2}}],["juliareset",{"2":{"55":1}}],["juliareduce",{"2":{"1":1,"108":1}}],["juliaread",{"2":{"0":1,"1":1}}],["juliaregularization",{"2":{"0":1,"1":1}}],["julialoss",{"2":{"136":1}}],["julialeadsolver",{"2":{"157":1}}],["julialearn",{"2":{"0":1,"1":1}}],["julialength",{"2":{"1":1,"55":1,"61":2,"64":2,"110":1,"157":5}}],["julialayers",{"2":{"1":1}}],["julialayer",{"2":{"1":1,"110":1}}],["julialanguageparameterdomain",{"2":{"1":1,"69":1,"106":1}}],["julialazy",{"2":{"0":2,"1":2,"108":2}}],["juliallamacppllm",{"2":{"0":1,"1":1}}],["juliahamming",{"2":{"0":1,"1":1,"109":1}}],["juliaiterate",{"2":{"55":1}}],["juliaidparameterdomain",{"2":{"1":1,"69":1,"106":1}}],["juliais",{"2":{"0":1,"1":2,"110":1,"129":1,"157":2}}],["juliaicnlocalsearchoptimizer",{"2":{"136":1}}],["juliaicngeneticoptimizer",{"2":{"136":1}}],["juliaicnconfig",{"2":{"136":1}}],["juliaicn",{"2":{"0":1,"1":1,"136":1}}],["juliaintention",{"2":{"155":1}}],["juliaintervals",{"2":{"1":1,"60":1}}],["juliaintersect",{"2":{"0":1,"1":2,"60":2,"63":1}}],["juliaincsert",{"2":{"0":1,"1":1,"53":1}}],["juliaempty",{"2":{"157":2}}],["juliaemptydomain",{"2":{"1":1,"57":1}}],["juliaedit",{"2":{"1":1}}],["juliae",{"2":{"1":1}}],["juliaerror",{"2":{"0":1,"1":1,"21":1,"72":1,"155":1}}],["juliaexclu",{"2":{"1":1,"110":1}}],["juliaexplorer",{"2":{"0":1,"1":6,"67":1}}],["juliaexplore",{"2":{"0":3,"1":3,"67":2}}],["juliaexploresettings",{"2":{"0":1,"1":1,"67":1}}],["juliaextract",{"2":{"0":3,"1":4,"43":3}}],["juliamodel",{"2":{"157":1}}],["juliamoi",{"2":{"155":17}}],["juliamoisupports",{"2":{"155":1}}],["juliamoisum",{"2":{"155":1}}],["juliamoiregular",{"2":{"155":1}}],["juliamoiordered",{"2":{"155":1}}],["juliamoinooverlap",{"2":{"155":1}}],["juliamoinvalues",{"2":{"155":1}}],["juliamoimultivalueddecisiondiagram",{"2":{"155":1}}],["juliamoiminimum",{"2":{"155":1}}],["juliamoimaximum",{"2":{"155":1}}],["juliamoiintention",{"2":{"155":1}}],["juliamoiinstantiation",{"2":{"155":1}}],["juliamoiextension",{"2":{"155":1}}],["juliamoierror",{"2":{"155":1}}],["juliamoielement",{"2":{"155":1}}],["juliamoidistdifferent",{"2":{"155":1}}],["juliamoicumulative",{"2":{"155":1}}],["juliamoiconflicts",{"2":{"155":1}}],["juliamoiallequal",{"2":{"155":1}}],["juliamoialldifferent",{"2":{"155":1}}],["juliamutually",{"2":{"136":1}}],["juliamutable",{"2":{"41":1}}],["juliam",{"2":{"86":1}}],["juliamincut",{"2":{"41":1}}],["juliaminkowski",{"2":{"0":1,"1":1,"109":1}}],["juliametadatamessage",{"2":{"1":1}}],["juliamerge",{"2":{"0":1,"1":1,"60":1,"63":1}}],["juliamax",{"2":{"157":1}}],["juliamainsolver",{"2":{"157":1}}],["juliamagic",{"2":{"41":1}}],["juliamap",{"2":{"1":1,"108":1}}],["juliamake",{"2":{"1":3,"55":1,"115":1,"126":1,"136":3}}],["juliamanhattan",{"2":{"0":1,"1":1,"109":1}}],["juliamdd",{"2":{"0":1,"1":1,"45":1}}],["juliastop",{"2":{"157":1}}],["juliastatus",{"2":{"157":1}}],["juliastream",{"2":{"0":3,"1":3}}],["juliastruct",{"2":{"0":1,"1":1,"134":1,"136":1}}],["juliaspecialize",{"2":{"157":2}}],["juliasolve",{"2":{"157":2}}],["juliasolution",{"2":{"157":1}}],["juliascalarfunction",{"2":{"155":1}}],["juliasub",{"2":{"136":1}}],["juliasudoku",{"2":{"41":1}}],["juliasudokuinstance",{"2":{"41":2}}],["juliasystemmessage",{"2":{"1":1}}],["juliasymbol",{"2":{"1":1,"110":1}}],["juliasymbols",{"2":{"0":1,"1":1}}],["juliasymmetries",{"2":{"0":1,"1":1}}],["juliasymcon",{"2":{"0":1,"1":1,"47":1}}],["juliaselected",{"2":{"1":1,"110":1}}],["juliaset",{"2":{"1":1,"55":1}}],["juliasetdomain",{"2":{"0":1,"1":1,"63":1}}],["juliashrink",{"2":{"1":1}}],["juliashow",{"2":{"0":1,"1":2,"110":1}}],["julia",{"0":{"19":1,"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1,"70":1,"74":1,"83":1,"84":1,"85":1,"86":1},"1":{"20":1,"21":1,"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1,"71":1,"72":1,"73":1,"84":1,"85":1,"86":1},"2":{"0":5,"1":17,"2":3,"9":1,"11":1,"12":1,"16":3,"18":3,"20":3,"25":1,"26":1,"29":3,"31":4,"33":4,"35":2,"41":5,"42":2,"45":2,"56":1,"63":1,"70":1,"71":2,"73":1,"84":1,"85":7,"86":5,"113":1,"115":1,"124":1,"136":1,"138":3,"139":1,"148":1,"152":1,"155":17,"157":83}}],["juliad",{"2":{"157":1}}],["juliadraw",{"2":{"157":1}}],["juliadist",{"2":{"157":1}}],["juliadiscreteset",{"2":{"155":1}}],["juliadiscretedomain",{"2":{"0":1,"1":1,"63":1}}],["juliadisplay",{"2":{"41":1}}],["juliadimparameterdomain",{"2":{"1":1,"69":1,"106":1}}],["juliadelete",{"2":{"1":2,"157":2}}],["juliadebinarize",{"2":{"0":1,"1":1,"129":1}}],["juliadescribe",{"2":{"0":2,"1":2,"20":2,"73":2,"157":1}}],["juliad1",{"2":{"0":1,"1":1,"57":1,"60":1,"63":1}}],["juliadomain",{"2":{"0":6,"1":6,"57":6,"60":6,"63":6,"136":1,"157":1}}],["juliadomains",{"2":{"0":3,"1":3,"67":3}}],["juliaδ",{"2":{"0":1,"1":1,"51":1,"136":1}}],["juliaas",{"2":{"1":2,"108":2}}],["juliaag",{"2":{"1":2,"117":2}}],["juliaaggregation",{"2":{"0":1,"1":1,"118":1}}],["juliaat",{"2":{"1":1,"45":1}}],["juliaabstractsolver",{"2":{"157":1}}],["juliaabstractvectorfold",{"2":{"55":1}}],["juliaabstractoptimizer",{"2":{"1":1,"132":1}}],["juliaabstractmultivalueddecisiondiagram",{"2":{"1":1,"45":1}}],["juliaabstractautomaton",{"2":{"1":1,"45":1}}],["juliaabstractdomain",{"2":{"0":1,"1":1,"13":1,"57":1}}],["juliaar",{"2":{"1":2,"120":2}}],["juliaarbitrarydomain",{"2":{"1":1,"63":1}}],["juliaarithmetic",{"2":{"0":1,"1":1,"121":1}}],["juliaargs",{"2":{"0":1,"1":1}}],["juliaadd",{"2":{"0":1,"1":1,"63":1,"157":3}}],["juliaaccept",{"2":{"0":1,"1":1,"45":1,"69":1,"106":1}}],["juliaautomaton",{"2":{"0":1,"1":1,"45":1}}],["json",{"2":{"0":4,"1":4}}],["jl",{"0":{"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1,"41":1,"42":1,"55":1,"56":1,"107":1,"127":1,"130":1,"136":1,"137":1,"155":1,"156":1,"157":1,"158":1},"1":{"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"108":1,"109":1,"128":1,"138":1},"2":{"0":1,"1":4,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"19":1,"20":1,"21":2,"23":1,"24":1,"25":1,"41":1,"42":1,"55":1,"56":1,"70":1,"72":2,"73":1,"85":3,"107":1,"110":1,"127":1,"130":1,"136":1,"137":2,"138":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":2,"149":4,"150":2,"153":1,"155":2,"156":1,"157":2,"158":1}}],["kwarg",{"2":{"149":2}}],["kwargs",{"2":{"0":4,"1":4}}],["k",{"2":{"1":2,"120":2,"157":1}}],["keep",{"2":{"1":1,"55":1,"128":1}}],["kept",{"2":{"0":1,"1":1}}],["keyed",{"2":{"0":1,"1":1}}],["keys",{"2":{"0":1,"1":1}}],["key",{"2":{"0":8,"1":22,"77":1,"142":1,"143":1}}],["keywords",{"2":{"0":1,"1":2,"20":1,"43":1,"71":1}}],["keyword",{"2":{"0":2,"1":10,"20":2,"21":1,"71":2,"72":1,"139":1,"157":1}}],["known",{"2":{"0":2,"1":5,"6":1,"32":3,"41":1,"157":1}}],["kind=",{"2":{"157":1}}],["kinds",{"2":{"14":1,"45":1}}],["kind",{"2":{"0":1,"1":3,"20":1,"43":1,"51":1,"55":2,"69":1,"71":1,"106":1,"157":6}}],["kargs",{"2":{"0":5,"1":7,"21":4,"43":1,"72":4,"136":6}}],["heuristic",{"2":{"86":1}}],["heavily",{"2":{"20":1,"71":1,"111":1}}],["heavy",{"2":{"19":1,"70":1}}],["here",{"2":{"1":1,"25":1,"138":2,"142":2,"143":1,"144":1,"147":1,"149":1,"151":1,"153":1,"155":1}}],["heights",{"2":{"1":5,"36":5,"155":1}}],["host",{"2":{"85":1}}],["how",{"0":{"78":1},"2":{"21":1,"23":1,"24":1,"29":3,"31":4,"33":4,"35":2,"72":1,"91":1,"98":1,"101":1,"103":1,"112":1,"123":1}}],["however",{"2":{"7":1,"11":1,"55":1,"86":1}}],["hold",{"2":{"1":4,"34":4,"136":1}}],["hot",{"2":{"0":3,"1":3,"129":3,"134":1}}],["highly",{"2":{"110":1}}],["highlighting",{"2":{"84":1,"103":1}}],["highlight",{"2":{"74":1}}],["higher",{"2":{"23":1,"25":1}}],["highest",{"2":{"0":1,"1":1,"57":1,"60":1,"63":1,"157":1}}],["high",{"2":{"2":1}}],["hide",{"2":{"1":1}}],["http",{"2":{"0":1,"1":1}}],["https",{"2":{"0":7,"1":7,"20":1,"73":1}}],["hardware",{"2":{"85":1}}],["hands",{"0":{"100":1}}],["hand",{"2":{"21":1,"72":1}}],["handle",{"2":{"1":1,"29":3,"31":4,"33":4,"35":2,"57":1,"157":2}}],["handled",{"2":{"0":1,"1":2,"60":1}}],["have",{"2":{"0":4,"1":6,"5":1,"20":1,"41":1,"71":1,"85":1,"94":1,"108":2,"155":1}}],["hamming",{"2":{"0":4,"1":4,"109":2,"136":3}}],["has",{"2":{"0":2,"1":6,"14":1,"49":1,"86":1,"110":1,"129":1,"139":1,"146":1,"150":1,"157":10}}],["9×9",{"2":{"41":4}}],["9",{"2":{"0":1,"1":1,"29":2,"31":1,"41":4,"57":1,"60":1,"63":1,"86":7}}],["8",{"2":{"1":6,"29":1,"31":6,"32":5,"33":2,"36":1,"41":3}}],["8080",{"2":{"0":1,"1":1}}],["86",{"2":{"0":1,"1":1,"57":1,"60":1,"63":1}}],["89",{"2":{"0":2,"1":2,"15":6,"57":2,"60":2,"63":2,"157":1}}],["001",{"2":{"134":1}}],["00514",{"2":{"0":1,"1":1,"20":1,"73":1}}],["0≤z",{"2":{"33":2}}],["0≤x",{"2":{"29":1}}],["0≤y",{"2":{"29":1}}],["0",{"2":{"0":3,"1":73,"6":1,"15":3,"16":6,"21":1,"25":2,"26":2,"28":22,"29":1,"30":14,"31":12,"32":8,"33":1,"34":1,"38":1,"41":54,"55":2,"57":1,"58":2,"60":1,"61":1,"63":1,"64":1,"72":1,"86":2,"113":4,"114":4,"124":4,"125":4,"134":1,"149":11,"153":8,"155":2,"157":9}}],["+",{"2":{"0":1,"1":8,"55":1,"67":1,"113":2,"114":4,"117":1,"147":1,"151":1}}],[">",{"2":{"0":1,"1":3,"25":4,"26":4,"29":3,"31":5,"33":4,"35":2,"38":1,"67":1,"134":8,"155":2}}],["63",{"2":{"18":1}}],["6+5=11",{"2":{"7":1}}],["69",{"2":{"0":1,"1":1,"15":3,"57":1,"60":1,"63":1}}],["6",{"2":{"0":3,"1":8,"29":1,"31":1,"34":1,"35":3,"36":3,"40":1,"41":2,"67":3,"139":1,"153":1}}],["56",{"2":{"157":1}}],["53",{"2":{"0":1,"1":1,"15":3,"57":1,"60":1,"63":1}}],["5",{"2":{"0":4,"1":78,"16":3,"29":3,"30":1,"31":32,"32":29,"33":12,"34":11,"35":22,"36":13,"40":3,"41":2,"57":1,"60":1,"63":1,"67":3,"134":1,"138":1,"147":1,"151":1,"153":1,"155":1,"157":1}}],["42",{"2":{"0":1,"1":3,"15":3,"18":3,"32":2,"57":1,"60":1,"63":1}}],["4",{"2":{"0":4,"1":84,"15":3,"16":3,"24":2,"25":7,"26":10,"29":7,"30":12,"31":32,"32":14,"33":23,"34":15,"35":19,"36":18,"38":4,"40":4,"41":3,"57":1,"60":1,"63":1,"67":3,"149":1,"153":1,"155":1,"157":1}}],["3j+1",{"2":{"86":1}}],["3i+1",{"2":{"86":1}}],["324",{"2":{"18":1}}],["3+2=5",{"2":{"7":1}}],["3",{"2":{"0":6,"1":128,"15":9,"16":3,"18":3,"21":1,"24":2,"25":6,"26":9,"29":10,"30":17,"31":47,"32":33,"33":21,"34":15,"35":27,"36":26,"38":6,"40":4,"41":6,"57":2,"60":2,"63":2,"67":3,"72":1,"86":6,"149":1,"153":1,"155":1,"157":1}}],["39",{"0":{"9":1},"2":{"0":3,"1":8,"13":2,"57":1,"58":1,"61":1,"64":1,"67":2,"85":1,"86":1,"106":1,"138":1,"143":1,"153":1,"157":4}}],["28",{"2":{"157":1}}],["20",{"2":{"55":1}}],["200",{"2":{"0":2,"1":2,"136":1}}],["2009",{"2":{"0":1,"1":1,"20":1,"73":1}}],["2",{"2":{"0":8,"1":152,"15":6,"18":4,"21":1,"24":2,"25":5,"26":8,"28":10,"29":10,"30":15,"31":68,"32":40,"33":26,"34":16,"35":33,"36":28,"38":3,"40":4,"41":5,"57":2,"60":2,"63":2,"67":5,"72":1,"86":2,"149":8,"153":1,"155":3,"157":1}}],["ci",{"2":{"137":1,"155":3}}],["circuit",{"2":{"1":12,"38":12}}],["cn",{"2":{"86":1}}],["c=c1",{"2":{"86":1}}],["c=usual",{"2":{"0":2,"1":2,"20":2,"73":2}}],["classic",{"2":{"86":2}}],["closed",{"2":{"1":10,"18":1,"31":1,"32":9,"149":1}}],["c2",{"2":{"31":1,"149":2}}],["c1",{"2":{"31":1}}],["critical",{"2":{"55":1}}],["crucial",{"2":{"11":1}}],["creating",{"2":{"138":1}}],["creation",{"2":{"1":1,"115":1}}],["created",{"2":{"155":1,"157":1}}],["creates",{"2":{"1":1,"149":1}}],["create",{"2":{"0":3,"1":4,"41":3,"67":2,"155":3}}],["csps",{"2":{"10":1}}],["cp",{"0":{"78":1,"83":1,"86":1},"1":{"84":1,"85":1,"86":1},"2":{"2":1,"8":1,"19":1,"70":1,"74":1,"76":1,"85":1,"86":2,"92":1,"94":1,"97":1,"101":1}}],["cpp",{"2":{"0":2,"1":2}}],["cblstodo",{"2":{"86":4}}],["cbls",{"0":{"155":1},"2":{"15":8,"16":4,"25":7,"26":7,"29":6,"31":8,"33":11,"35":4,"85":2,"86":3,"136":1,"155":49,"157":1}}],["cbl",{"2":{"1":1}}],["certain",{"2":{"1":6,"34":4,"36":2,"155":2}}],["cut",{"2":{"41":1,"157":1}}],["customize",{"2":{"140":1}}],["custom",{"2":{"8":1,"138":4,"141":1,"145":1,"149":1}}],["curly",{"2":{"1":2}}],["currently",{"2":{"1":1,"25":1,"26":1,"58":2,"61":1,"64":1,"69":1,"106":1,"155":1}}],["current",{"2":{"0":1,"1":2,"55":3,"110":1,"157":1}}],["cumulative",{"2":{"1":9,"35":9,"36":9,"155":3}}],["cc",{"2":{"1":2,"32":2}}],["choose",{"2":{"157":1}}],["choice",{"2":{"85":1}}],["chosen",{"2":{"20":1,"71":1}}],["chemical",{"2":{"41":3}}],["checked",{"2":{"155":1}}],["checkout",{"2":{"138":1}}],["checkres",{"2":{"138":1,"149":2}}],["checking",{"2":{"13":1}}],["checks",{"2":{"1":6,"28":1,"155":1}}],["check",{"2":{"0":1,"1":28,"24":1,"28":2,"30":3,"32":7,"34":8,"36":1,"38":1,"40":2,"58":1,"61":1,"64":1,"86":1,"110":1,"129":1,"137":2,"138":1,"140":1,"143":3,"144":1,"147":1,"149":1,"151":1,"155":4,"157":10}}],["chair",{"2":{"145":6,"149":2}}],["chairmarks",{"0":{"150":1},"1":{"151":1,"152":1},"2":{"139":1,"140":1,"141":2,"142":1,"143":1,"144":1,"145":2,"149":5,"150":1,"151":1}}],["chairmark",{"2":{"138":1,"140":1,"141":1,"142":1,"143":1,"144":1,"149":3,"151":1}}],["challenge",{"2":{"106":1}}],["challenged",{"2":{"18":1}}],["chapter",{"2":{"12":1,"74":1}}],["characteristics",{"2":{"9":1}}],["change",{"2":{"41":2}}],["changes",{"2":{"0":1,"1":2,"41":1,"60":1,"63":1}}],["channel",{"2":{"1":9,"33":12,"34":9}}],["chat",{"2":{"0":4,"1":4}}],["c",{"2":{"0":24,"1":113,"20":4,"21":8,"25":3,"26":3,"28":10,"29":9,"30":14,"31":11,"32":19,"33":12,"34":15,"35":6,"36":11,"38":4,"40":2,"58":1,"61":1,"64":1,"72":8,"73":4,"149":2,"157":31}}],["capacited",{"2":{"157":1}}],["capacity",{"2":{"157":1}}],["capacities",{"2":{"41":1}}],["cairomakie",{"2":{"149":1}}],["catch",{"2":{"134":1}}],["categorized",{"2":{"22":1}}],["catalog",{"2":{"10":1,"19":1,"70":1}}],["cases",{"2":{"55":1}}],["case",{"0":{"94":1},"2":{"1":1,"55":1,"138":1,"141":1,"144":1,"145":1,"147":1,"151":1}}],["cast",{"2":{"1":1,"86":1}}],["call",{"2":{"149":1}}],["called",{"2":{"1":1,"23":1,"26":1,"86":3,"157":2}}],["calls",{"2":{"1":2}}],["cardinalityclosed",{"2":{"31":1}}],["cardinalityopen",{"2":{"31":1}}],["cardinality",{"2":{"1":20,"31":9,"32":20}}],["care",{"2":{"0":1,"1":1,"20":1,"73":1}}],["cannot",{"2":{"18":1}}],["can",{"2":{"0":3,"1":12,"4":1,"12":1,"13":1,"20":2,"28":1,"32":3,"55":2,"56":1,"57":1,"71":2,"74":1,"85":1,"86":3,"103":1,"110":5,"115":1,"129":1,"138":3,"139":1,"140":1,"145":1,"147":1,"151":1,"155":2,"157":1}}],["cosntriction",{"2":{"157":1}}],["cost",{"2":{"157":19}}],["costs",{"2":{"157":20}}],["copied",{"2":{"155":7}}],["copy",{"2":{"155":19}}],["covering",{"2":{"100":1}}],["cover",{"2":{"82":1}}],["covers",{"2":{"42":1}}],["collaborate",{"2":{"103":1}}],["collect",{"2":{"25":1,"26":1,"134":1,"149":4}}],["collections",{"2":{"0":1,"1":1,"51":2}}],["collection",{"0":{"10":1},"2":{"0":8,"1":11,"10":1,"20":1,"21":1,"23":1,"24":1,"25":1,"53":1,"58":2,"60":1,"61":1,"64":1,"67":5,"69":1,"71":1,"72":1,"86":4,"106":1,"109":1,"110":1,"136":3,"155":1,"157":5}}],["columns",{"2":{"86":1}}],["column",{"2":{"86":1}}],["col",{"2":{"41":1}}],["coordinates",{"2":{"41":1}}],["couple",{"2":{"20":1,"73":1}}],["could",{"2":{"6":1,"23":1,"26":1}}],["counting",{"0":{"32":1},"2":{"1":1,"115":1}}],["count",{"2":{"1":95,"31":9,"32":6,"113":40,"114":20,"115":21,"117":3,"155":4}}],["counter",{"2":{"0":2,"1":2,"53":2,"157":1}}],["coefficients",{"2":{"1":1,"32":1}}],["coeffs",{"2":{"1":2,"31":1,"32":2}}],["co",{"2":{"1":11,"32":2,"124":5,"125":4}}],["corrected",{"2":{"1":1}}],["correspond",{"2":{"20":1,"71":1}}],["corresponds",{"2":{"1":2,"34":2}}],["correspondence",{"2":{"1":2,"34":2}}],["corresponding",{"2":{"0":1,"1":2,"41":1,"115":1}}],["core",{"2":{"0":1,"1":3,"9":2,"14":1,"20":7,"22":1,"42":1,"43":3,"45":1,"71":5,"73":2}}],["come",{"2":{"155":1}}],["commonly",{"2":{"138":1}}],["commons",{"0":{"57":1},"1":{"58":1,"59":1}}],["community",{"0":{"102":1,"103":1},"1":{"103":1,"104":1},"2":{"103":1}}],["communities",{"2":{"3":1}}],["command",{"2":{"0":1,"1":1,"85":1}}],["combinatorial",{"2":{"2":1,"76":1,"110":1}}],["com",{"2":{"0":4,"1":4}}],["computational",{"2":{"84":1}}],["computes",{"2":{"157":1}}],["computed",{"2":{"1":17,"113":10,"114":6}}],["compute",{"2":{"0":4,"1":7,"41":1,"51":2,"60":2,"63":1,"109":1,"124":1,"125":1,"129":1,"136":1,"155":1,"157":17}}],["compile",{"2":{"1":1,"115":1}}],["complexity",{"2":{"100":1}}],["complex",{"2":{"10":1,"26":1,"91":1}}],["completion",{"2":{"0":21,"1":21}}],["completions",{"2":{"0":3,"1":3}}],["completed",{"2":{"86":1}}],["completely",{"2":{"0":1,"1":1}}],["complete",{"2":{"0":10,"1":11,"67":5}}],["compliance",{"2":{"1":2,"28":2,"155":1}}],["comprehensive",{"2":{"1":2,"155":1}}],["comprising",{"2":{"0":1,"1":1}}],["compared",{"2":{"55":1}}],["compare",{"2":{"1":2,"30":1,"155":2}}],["comparisons",{"0":{"123":1},"1":{"124":1,"125":1,"126":1},"2":{"1":4,"115":2,"126":2}}],["comparison",{"0":{"30":1,"122":1},"1":{"123":1,"124":1,"125":1,"126":1},"2":{"0":5,"1":11,"20":1,"30":1,"32":1,"43":1,"71":1,"115":1,"122":1,"123":1,"124":1,"126":3}}],["compatible",{"2":{"0":2,"1":2}}],["compatibility",{"2":{"0":1,"1":1,"9":1}}],["compounds",{"2":{"41":1}}],["components",{"2":{"0":2,"1":2,"10":1,"11":1,"108":2}}],["compose",{"2":{"0":8,"1":12,"86":1,"110":1}}],["composed",{"2":{"0":3,"1":3,"67":1}}],["compositions",{"2":{"1":1,"108":1}}],["compositional",{"2":{"0":1,"1":1,"110":1}}],["compositionalnetworks",{"0":{"107":1},"1":{"108":1,"109":1},"2":{"0":26,"1":78,"19":1,"21":1,"72":1,"107":1,"108":7,"109":4,"110":11,"113":11,"114":6,"115":2,"117":2,"118":1,"120":2,"121":1,"124":5,"125":4,"126":2,"136":3}}],["composition",{"2":{"0":21,"1":24,"108":1}}],["coded",{"2":{"21":1,"72":1}}],["code",{"0":{"142":1,"143":1,"144":1},"2":{"0":8,"1":17,"2":1,"55":1,"85":1,"108":1,"138":2,"142":3,"143":2,"144":1,"147":2,"149":1,"151":2}}],["conduct",{"2":{"101":1}}],["conditions",{"2":{"1":1,"115":1,"157":1}}],["condition",{"2":{"1":31,"4":1,"31":1,"32":15,"33":1,"34":13,"36":3,"155":6}}],["config",{"2":{"138":3,"140":1,"142":1,"143":1,"144":1}}],["configuring",{"2":{"155":1}}],["configurable",{"2":{"137":1}}],["configuration",{"0":{"6":1,"7":1},"2":{"0":2,"1":8,"3":2,"6":2,"7":4,"41":2,"136":4,"142":1,"143":1,"149":1,"155":6,"157":3}}],["configurations",{"2":{"0":1,"1":5,"49":1,"136":1,"155":4,"157":1}}],["configure",{"2":{"0":2,"1":2,"67":2}}],["conflict",{"2":{"1":1,"155":1}}],["conflicted",{"2":{"1":3,"155":1}}],["conflicts",{"2":{"1":8,"155":4}}],["conflicts=nothing",{"2":{"1":1}}],["concentrations",{"2":{"41":2}}],["concept",{"2":{"0":23,"1":107,"20":1,"21":9,"24":1,"25":2,"26":2,"28":4,"29":7,"30":10,"31":26,"32":15,"33":15,"34":8,"35":9,"36":6,"38":2,"40":2,"67":6,"72":9,"73":1,"155":2}}],["concepts",{"0":{"21":1,"72":1,"77":1},"2":{"0":5,"1":5,"67":5,"77":1,"81":1}}],["concatenated",{"2":{"0":1,"1":1}}],["converting",{"0":{"145":1}}],["converted",{"2":{"144":1,"155":4}}],["convert",{"2":{"0":1,"1":7,"57":1,"66":3,"108":2,"110":1,"145":1,"155":2}}],["contribute",{"2":{"103":1}}],["contribution",{"0":{"102":1},"1":{"103":1,"104":1}}],["contributions",{"2":{"10":1}}],["contributing",{"2":{"11":1}}],["contrast",{"2":{"78":1}}],["content",{"2":{"1":6,"74":1}}],["context",{"2":{"0":1,"1":2,"13":1,"57":1,"110":2}}],["contain",{"2":{"1":2}}],["container",{"2":{"1":1,"110":1,"155":1}}],["contains",{"2":{"0":2,"1":4,"20":1,"73":1,"86":1,"110":1}}],["containing",{"2":{"0":7,"1":11,"67":3,"155":1,"157":1}}],["contiguous",{"2":{"1":12,"113":8,"115":4}}],["contiuous",{"2":{"0":1,"1":1,"60":1,"63":1}}],["continuousdomain",{"2":{"0":1,"1":2,"60":2}}],["continuous",{"0":{"18":1,"60":1},"1":{"61":1,"62":1},"2":{"0":3,"1":3,"8":1,"12":1,"13":1,"18":1,"41":1,"56":1,"57":2,"60":2,"63":1}}],["connection",{"0":{"34":1}}],["connecting",{"2":{"0":1,"1":1,"47":1}}],["connector",{"2":{"0":1,"1":1,"47":1}}],["cons=dictionary",{"2":{"157":1}}],["cons",{"2":{"157":31}}],["consecutive",{"2":{"16":1,"55":1}}],["console",{"2":{"0":1,"1":1}}],["constriction",{"2":{"157":4}}],["constrains",{"2":{"157":1}}],["constrained",{"2":{"155":2,"157":2}}],["constraintexplorer",{"0":{"156":1},"2":{"156":1}}],["constraintlearning",{"0":{"136":1},"2":{"19":1,"136":27,"153":1}}],["constraintmodels",{"0":{"41":1},"2":{"1":1,"10":1,"41":14}}],["constraintstranslator",{"0":{"130":1},"2":{"0":15,"1":25,"130":1}}],["constraints",{"0":{"9":1,"19":1,"20":1,"22":1,"23":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"70":1,"73":1,"74":1,"91":1,"105":1},"1":{"20":1,"21":1,"23":1,"24":2,"25":2,"26":1,"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1,"71":1,"72":1,"73":1,"106":1},"2":{"0":40,"1":76,"2":2,"9":3,"11":1,"12":2,"18":1,"19":3,"20":34,"21":4,"22":2,"23":3,"24":3,"25":4,"26":4,"28":2,"29":9,"30":3,"31":12,"32":4,"33":12,"34":4,"35":6,"36":2,"38":1,"40":1,"42":1,"43":9,"45":3,"56":2,"70":4,"71":8,"72":4,"73":26,"77":1,"85":1,"86":2,"91":1,"105":1,"106":1,"132":1,"136":1,"155":1,"157":23}}],["constraintdomains",{"0":{"56":1},"1":{"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1},"2":{"0":21,"1":40,"8":1,"12":1,"13":2,"15":1,"16":1,"18":1,"56":1,"57":6,"60":8,"63":10,"67":4,"69":11,"106":11}}],["constraint",{"0":{"2":1,"4":1,"5":1,"7":1,"24":1,"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1,"75":1,"76":1,"90":1,"135":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1,"76":1,"77":1,"78":1,"91":1,"92":1},"2":{"0":40,"1":157,"2":2,"3":5,"4":3,"5":5,"7":6,"9":1,"10":1,"13":1,"14":1,"15":4,"16":2,"19":1,"20":11,"21":12,"23":5,"24":5,"25":8,"26":8,"28":6,"29":7,"30":7,"31":12,"32":20,"33":9,"34":24,"35":6,"36":20,"38":7,"40":7,"42":1,"43":9,"49":1,"56":1,"58":3,"61":3,"64":3,"67":2,"70":1,"71":3,"72":12,"73":8,"74":1,"86":7,"110":1,"115":3,"128":1,"136":4,"155":66,"157":33}}],["constraintcommons",{"0":{"42":1},"1":{"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1},"2":{"0":12,"1":18,"11":1,"20":1,"42":1,"43":3,"45":6,"47":3,"49":1,"51":1,"53":1,"69":2,"71":1,"106":2,"155":2}}],["constructor",{"2":{"17":1,"41":1,"136":3,"157":1}}],["constructing",{"2":{"10":1,"41":1}}],["constructs",{"2":{"0":1,"1":1}}],["construct",{"2":{"0":5,"1":6,"41":3,"55":2,"57":3,"60":3,"63":3,"69":1,"106":1,"157":3}}],["considers",{"2":{"45":1}}],["consider",{"2":{"4":1}}],["considered",{"2":{"1":2,"32":2,"157":1}}],["consistent",{"2":{"1":1,"3":1}}],["consisempty",{"2":{"0":1,"1":1,"47":1}}],["consin",{"2":{"0":1,"1":1,"47":1}}],["nine",{"2":{"86":1}}],["n²",{"2":{"41":1}}],["n×n",{"2":{"41":1}}],["nvalues",{"2":{"1":8,"31":9,"32":8,"155":1}}],["nvars",{"2":{"0":4,"1":12,"124":8}}],["n5",{"2":{"1":2,"28":2}}],["n4",{"2":{"1":3,"28":3}}],["n3",{"2":{"1":2,"28":2}}],["n2",{"2":{"1":2,"28":2}}],["n1",{"2":{"1":2,"28":2}}],["numerous",{"2":{"18":1}}],["numerical",{"2":{"15":1,"17":1}}],["numeric",{"2":{"1":1,"63":1}}],["numbers",{"2":{"1":2,"124":2,"138":1}}],["number",{"2":{"0":19,"1":53,"13":1,"32":11,"41":2,"55":1,"57":1,"61":3,"63":2,"64":3,"67":2,"109":1,"110":5,"113":8,"114":4,"117":1,"124":1,"129":3,"136":2,"138":1,"155":23,"157":12}}],["n",{"2":{"0":2,"1":7,"41":16,"108":4,"128":3,"134":9}}],["nbits",{"2":{"0":1,"1":2,"110":1}}],["neighbours",{"2":{"157":2}}],["neighbourhood",{"2":{"157":2}}],["neither",{"2":{"1":1}}],["never",{"2":{"157":1}}],["necessarily",{"2":{"85":1}}],["necessary",{"2":{"12":1,"157":3}}],["need",{"2":{"51":1,"86":2,"139":1}}],["needs",{"2":{"0":1,"1":2,"115":1}}],["net",{"2":{"41":1}}],["network",{"2":{"0":1,"1":1,"110":1}}],["next",{"2":{"1":2,"38":2,"55":1,"138":3,"153":2}}],["negation",{"2":{"1":1}}],["newly",{"2":{"1":2}}],["new",{"2":{"0":3,"1":10,"10":1,"20":3,"55":4,"60":3,"73":3,"138":1,"155":1,"157":2}}],["navigate",{"2":{"20":1,"73":1}}],["natural",{"2":{"0":1,"1":3,"23":1,"25":1}}],["nature",{"2":{"0":1,"1":2,"20":2,"43":1,"60":1,"63":1,"71":2}}],["names",{"2":{"0":1,"1":2,"115":1}}],["name=",{"2":{"0":1,"1":1}}],["name",{"2":{"0":8,"1":9,"20":2,"21":1,"43":1,"71":1,"72":1,"73":1,"138":4,"155":2,"157":8}}],["now",{"2":{"41":1,"86":1}}],["nooverlap",{"2":{"35":4,"155":2}}],["normal",{"2":{"1":1,"115":1}}],["normalized",{"2":{"0":1,"1":1}}],["norm",{"2":{"1":2,"124":1,"125":1}}],["node",{"2":{"1":3,"28":3,"41":2,"155":3}}],["no",{"2":{"1":24,"35":6,"36":20,"41":4,"108":1,"110":1,"115":1,"136":1,"155":1}}],["notebooks",{"2":{"85":1,"146":1,"150":1}}],["note",{"2":{"0":1,"1":1,"19":1,"21":1,"23":1,"25":1,"29":2,"33":1,"43":1,"55":4,"72":1,"85":1,"86":1,"155":1}}],["not",{"2":{"0":6,"1":22,"4":1,"16":1,"19":1,"21":1,"23":1,"25":1,"32":1,"36":6,"41":2,"55":1,"60":1,"70":1,"72":1,"85":1,"86":3,"109":1,"114":1,"115":1,"129":1,"155":4,"157":1}}],["nothing",{"2":{"0":13,"1":22,"21":2,"30":1,"32":2,"47":5,"67":2,"72":2,"108":1,"134":1,"136":2,"140":2,"142":1,"149":1,"152":2,"155":15}}],["nonnegative",{"2":{"155":1}}],["nonlinear",{"2":{"80":1}}],["none",{"2":{"0":1,"1":4,"115":3,"129":1,"134":2,"140":1,"148":1,"152":1,"155":1}}],["non",{"0":{"113":1,"124":1},"2":{"0":4,"1":5,"16":1,"17":1,"63":1,"67":3,"115":1,"136":4,"157":1}}],["lst",{"2":{"157":5}}],["ls",{"2":{"155":1}}],["l=n²",{"2":{"41":1}}],["l",{"2":{"1":15,"41":1,"113":4,"114":4,"115":3,"145":5,"155":2}}],["llama",{"2":{"0":2,"1":2}}],["llamacppllm",{"2":{"0":1,"1":1}}],["llm",{"2":{"0":16,"1":17}}],["log",{"2":{"157":1}}],["loggingextra",{"2":{"157":1}}],["logging",{"2":{"157":1}}],["logical",{"2":{"23":1}}],["logic",{"2":{"1":2,"155":1}}],["load",{"2":{"141":1}}],["loss",{"2":{"134":2,"136":2}}],["loop",{"2":{"157":8}}],["loops",{"2":{"1":3,"38":2}}],["looks",{"2":{"138":1,"140":1,"141":1,"143":1,"149":1}}],["look",{"2":{"85":1,"86":1}}],["locations",{"2":{"41":5}}],["localsearchsolverscblstodo",{"2":{"85":1}}],["localsearchsolvers",{"0":{"157":1},"2":{"85":2,"136":1,"155":1,"157":141}}],["localhost",{"2":{"0":1,"1":1}}],["local",{"0":{"135":1},"2":{"0":5,"1":5,"110":1,"136":1,"138":1,"155":1,"157":7}}],["lower",{"2":{"0":1,"1":1,"109":1}}],["lowest",{"2":{"0":1,"1":1,"57":1,"60":1,"63":1}}],["launch",{"2":{"157":1}}],["labels",{"2":{"1":2,"28":2,"155":2}}],["labeled",{"2":{"1":2,"28":2,"155":2}}],["last",{"2":{"1":1,"28":1,"86":1,"138":5,"153":2,"155":1,"157":1}}],["large",{"2":{"0":1,"1":3,"86":1}}],["lazy",{"2":{"0":2,"1":2,"108":2,"111":2}}],["lang",{"2":{"0":1,"1":3}}],["languages",{"0":{"28":1,"45":1},"1":{"46":1},"2":{"1":1,"23":1,"42":1,"45":1,"69":1,"106":1}}],["languageparameterdomain",{"2":{"1":1,"69":1,"106":1}}],["language=",{"2":{"0":1,"1":1}}],["language",{"2":{"0":10,"1":34,"20":2,"25":1,"28":17,"43":2,"71":2,"85":3,"155":4}}],["lang=",{"2":{"0":1,"1":1}}],["layered",{"2":{"0":1,"1":1}}],["layers",{"2":{"0":4,"1":9,"110":2,"115":1}}],["layer",{"0":{"110":1,"111":1,"115":1,"116":1,"118":1,"119":1,"121":1,"122":1,"126":1},"1":{"112":1,"113":1,"114":1,"115":1,"117":1,"118":1,"120":1,"121":1,"123":1,"124":1,"125":1,"126":1},"2":{"0":16,"1":42,"42":1,"61":2,"64":2,"108":1,"110":28,"111":1,"115":3,"116":1,"118":3,"119":1,"121":3,"122":1,"124":1,"126":3,"136":4}}],["let",{"2":{"86":1}}],["leverage",{"2":{"9":1}}],["levels",{"2":{"100":1}}],["level",{"2":{"1":3,"2":1,"23":1,"25":1,"28":3,"157":9}}],["less",{"2":{"7":1,"23":1,"86":1,"155":1}}],["lesser",{"2":{"1":11,"113":6,"114":1,"115":3}}],["left",{"2":{"1":18,"113":10,"115":3}}],["leadsolvers",{"2":{"157":3}}],["leadsolver",{"2":{"157":1}}],["least",{"2":{"1":4,"18":1,"31":6,"32":4,"136":2,"155":1}}],["learning",{"0":{"105":1,"131":1},"1":{"106":1,"132":1,"133":1,"134":1,"135":1},"2":{"0":2,"1":3,"9":1,"12":1,"19":1,"42":1,"49":1,"56":2,"70":1,"105":1,"106":1,"110":2,"136":1}}],["learn",{"2":{"0":6,"1":7,"74":1,"110":1,"132":1,"136":5}}],["learned",{"2":{"0":1,"1":1,"19":1,"70":1,"136":1}}],["lengths",{"2":{"1":9,"30":3,"36":6}}],["length",{"2":{"0":7,"1":24,"13":2,"36":3,"55":7,"57":2,"58":1,"60":1,"61":7,"63":1,"64":7,"67":1,"110":2,"120":2,"134":4,"145":1,"157":12}}],["liking",{"2":{"140":1}}],["like",{"2":{"78":1,"81":1,"138":2,"140":1,"141":1,"143":1,"147":1,"149":1,"151":1}}],["likely",{"2":{"42":1}}],["links",{"2":{"41":1,"146":1,"150":1,"157":1}}],["line",{"2":{"0":1,"1":1,"41":9,"85":1}}],["linear",{"2":{"0":3,"1":3,"78":1,"80":1,"128":3}}],["lies",{"2":{"20":1,"71":1}}],["littledict",{"2":{"1":2,"110":2,"115":1}}],["listing",{"2":{"26":1}}],["listed",{"2":{"1":2,"155":3}}],["list=x",{"2":{"0":1,"1":2,"20":1,"73":1}}],["list",{"0":{"112":1,"117":1,"120":1,"123":1},"1":{"113":1,"114":1,"115":1,"124":1,"125":1,"126":1},"2":{"0":5,"1":96,"20":4,"24":1,"25":1,"26":1,"28":8,"29":2,"30":13,"31":2,"32":24,"33":2,"34":16,"36":5,"38":5,"40":6,"43":5,"63":1,"64":1,"71":4,"112":1,"123":1,"138":2,"155":1,"157":11}}],["limit",{"2":{"0":6,"1":8,"36":2,"67":4,"155":1,"157":10}}],["lt",{"2":{"0":2,"1":11,"13":1,"23":1,"24":1,"28":3,"41":1,"45":2,"57":1,"58":4,"61":4,"63":1,"64":4,"106":1,"155":2,"157":3}}],["runtime",{"2":{"157":1}}],["runs",{"2":{"142":1,"143":1}}],["running",{"2":{"142":1}}],["run",{"2":{"41":1,"86":1,"136":1,"142":1,"143":1,"144":1,"155":1,"157":5}}],["rules",{"2":{"1":2,"28":2,"155":1}}],["ruler",{"2":{"1":2,"24":4,"41":1,"155":2}}],["round",{"2":{"134":1,"157":1}}],["routing",{"2":{"1":2,"38":2}}],["role",{"2":{"82":1}}],["roles",{"2":{"20":1,"71":1}}],["rows",{"2":{"86":1}}],["row",{"2":{"41":1,"86":1}}],["robust",{"2":{"11":1}}],["root",{"2":{"1":1}}],["right",{"2":{"1":18,"113":15,"115":3}}],["rawoptimizerattribute",{"2":{"155":2}}],["raw",{"2":{"41":2}}],["rates",{"2":{"41":1}}],["rate",{"2":{"41":1}}],["raises",{"2":{"0":2,"1":2}}],["rangeset",{"2":{"16":3}}],["ranges",{"2":{"0":1,"1":1,"63":1}}],["rangedomain",{"0":{"16":1},"2":{"0":3,"1":5,"25":1,"26":1,"57":1,"60":1,"63":3,"66":2}}],["range",{"2":{"0":3,"1":4,"8":1,"9":1,"13":1,"16":3,"28":1,"57":1,"60":1,"63":3,"155":1}}],["rand`",{"2":{"55":1,"58":2,"61":1,"64":1,"69":1,"106":1}}],["randomly",{"2":{"1":1,"58":2,"61":1,"64":1,"69":1,"106":1,"157":1}}],["random",{"2":{"0":1,"1":10,"13":1,"55":1,"58":4,"61":2,"64":2,"69":11,"106":11,"157":2}}],["rand",{"2":{"0":1,"1":13,"13":2,"55":8,"57":1,"58":22,"61":12,"64":12,"69":11,"106":11,"149":1,"157":2}}],["r",{"2":{"0":2,"1":5,"28":3,"41":2,"57":2,"60":2,"63":2,"72":1,"134":8}}],["re",{"2":{"157":1}}],["remote",{"2":{"157":2}}],["remotely",{"2":{"157":1}}],["removed",{"2":{"16":1}}],["remove",{"2":{"1":4}}],["ref",{"2":{"111":1,"157":6}}],["reference",{"2":{"139":1}}],["refer",{"2":{"41":4}}],["refers",{"2":{"5":1,"7":1}}],["registries",{"2":{"153":1}}],["regions",{"2":{"86":1}}],["regularconstraint",{"2":{"155":1}}],["regular",{"2":{"1":10,"20":1,"28":9,"42":1,"43":1,"71":1,"155":2}}],["regularization",{"2":{"0":2,"1":2}}],["redefine",{"2":{"55":1}}],["reduce",{"2":{"1":3,"108":1,"120":2}}],["recognize",{"2":{"45":1}}],["recommended",{"2":{"16":1,"55":1,"155":1,"157":1}}],["retrieve",{"2":{"41":1}}],["returned",{"2":{"1":1}}],["returns",{"2":{"0":15,"1":43,"47":2,"55":3,"58":5,"61":3,"64":3,"67":4,"69":2,"106":2,"115":1,"147":1,"151":1,"153":1,"155":19,"157":1}}],["return",{"2":{"0":20,"1":63,"20":3,"21":4,"28":1,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"41":1,"43":1,"45":3,"55":6,"57":3,"58":5,"60":3,"61":9,"63":3,"64":9,"69":2,"72":4,"73":3,"106":2,"108":1,"110":5,"113":2,"114":2,"124":3,"125":3,"134":8,"136":4,"140":1,"143":1,"145":1,"149":1,"155":1,"157":20}}],["reusable",{"2":{"10":1}}],["relies",{"2":{"111":1}}],["relevant",{"2":{"2":1}}],["relationships",{"2":{"26":1}}],["relation",{"2":{"4":1}}],["relatively",{"2":{"1":1,"108":1,"157":1}}],["relate",{"2":{"1":1,"115":1}}],["related",{"2":{"0":1,"1":1,"12":1,"56":1,"105":1,"115":1,"136":1,"145":1,"146":1,"150":1}}],["requires",{"2":{"149":1}}],["required",{"2":{"1":1,"132":1}}],["requirements",{"2":{"1":2,"45":2}}],["reverse",{"2":{"1":1,"41":1,"55":1,"115":1,"149":2}}],["rev",{"2":{"1":5,"113":4,"115":1}}],["resume",{"2":{"157":1}}],["result",{"0":{"145":1},"2":{"1":23,"108":1,"113":10,"114":6,"115":2,"142":1,"143":1,"144":1}}],["results",{"2":{"1":3,"41":1,"60":2,"138":3,"149":1}}],["restart",{"2":{"157":6}}],["restricting",{"2":{"157":2}}],["restriction",{"2":{"0":2,"1":2}}],["restricted",{"2":{"58":1,"61":1,"64":1,"157":4}}],["restricts",{"2":{"1":3,"32":3}}],["research",{"2":{"104":1}}],["reset",{"2":{"55":2}}],["resource",{"2":{"10":1}}],["respectively",{"2":{"41":2}}],["respective",{"2":{"6":1,"12":1}}],["respect",{"2":{"1":1,"115":1}}],["reproducible",{"2":{"137":1}}],["represented",{"2":{"1":2,"28":2,"142":1,"155":1}}],["represents",{"2":{"0":1,"1":5,"6":1,"155":3}}],["representing",{"2":{"0":3,"1":4,"28":1,"67":3,"155":3}}],["repl",{"2":{"85":1}}],["replace",{"2":{"157":1}}],["replaced",{"2":{"1":2,"16":1}}],["replacements",{"2":{"0":1,"1":1}}],["reactants",{"2":{"41":2}}],["reactions",{"2":{"41":1}}],["reaction",{"2":{"41":4}}],["reach",{"2":{"0":1,"1":1,"109":1}}],["readers",{"2":{"74":1,"95":1,"103":1}}],["reads",{"2":{"0":1,"1":1}}],["read",{"2":{"0":3,"1":3}}],["ready",{"2":{"0":1,"1":1,"67":1}}],["real",{"0":{"94":1},"2":{"0":6,"1":7,"57":3,"60":5,"63":4,"74":1,"95":1,"155":2}}],["δ",{"2":{"0":1,"1":1,"51":1,"134":1,"136":1}}],["epoch",{"2":{"157":1}}],["err",{"2":{"155":3}}],["errors",{"2":{"1":6}}],["errorexception",{"2":{"0":2,"1":2}}],["error",{"0":{"21":1,"72":1},"2":{"0":6,"1":27,"21":9,"72":9,"136":1,"155":4,"157":4}}],["ecosystem",{"2":{"12":1,"19":1,"42":1,"56":1,"70":1,"85":1}}],["etc",{"2":{"8":1,"138":1}}],["estimation",{"2":{"21":1,"72":1}}],["establishes",{"2":{"1":2,"34":2}}],["essential",{"2":{"13":1,"42":1,"139":1}}],["essentially",{"2":{"5":1}}],["edits",{"2":{"1":1}}],["editors",{"2":{"85":1}}],["editor",{"2":{"1":3}}],["edit",{"2":{"1":1}}],["edge",{"2":{"1":2,"28":2,"155":2}}],["efficiently",{"2":{"41":1,"49":1,"155":1}}],["efficient",{"2":{"1":1,"2":1,"11":1,"16":1,"21":1,"72":1,"97":1,"108":1}}],["eq",{"2":{"1":22,"113":12,"114":4,"115":6}}],["equiped",{"2":{"41":1}}],["equilibrium",{"2":{"41":4}}],["equivalent",{"2":{"1":1,"58":1,"61":1,"64":1}}],["equalities",{"2":{"1":2,"115":2}}],["equal",{"2":{"1":17,"7":1,"29":5,"30":8,"32":1,"34":2,"41":1,"113":3,"114":1,"115":1,"155":4}}],["euclidean",{"2":{"1":6,"124":3,"125":3}}],["earlier",{"2":{"153":1}}],["easy",{"2":{"137":1,"139":1}}],["easily",{"2":{"137":1,"138":1}}],["easier",{"2":{"1":1}}],["ease",{"2":{"84":1}}],["eachrow",{"2":{"134":4}}],["each",{"2":{"0":3,"1":13,"9":1,"20":3,"28":2,"34":2,"38":2,"41":3,"43":2,"61":1,"64":1,"67":1,"71":3,"86":5,"88":1,"89":1,"110":1,"111":1,"139":1,"155":2,"157":1}}],["embodies",{"2":{"1":2,"155":1}}],["empty",{"2":{"0":1,"1":2,"115":1,"136":2,"155":7,"157":11}}],["emptydomain",{"2":{"0":1,"1":2,"57":2,"60":1,"63":1}}],["evolves",{"2":{"157":1}}],["evolution",{"2":{"149":2}}],["evals=d",{"2":{"143":1}}],["evals",{"2":{"140":1,"143":1,"148":2,"149":1,"152":1}}],["evaluated",{"2":{"157":1}}],["evaluates",{"2":{"1":2}}],["evaluation",{"2":{"136":1}}],["ever",{"2":{"53":1}}],["even",{"2":{"41":1}}],["eventually",{"2":{"1":2,"38":2}}],["else",{"2":{"134":4}}],["elementary",{"0":{"40":1}}],["element",{"2":{"1":9,"16":1,"33":9,"34":9,"55":1,"136":2,"153":1,"155":2,"157":1}}],["elements",{"2":{"0":2,"1":18,"13":2,"17":1,"41":1,"49":1,"57":1,"108":1,"110":1,"113":8,"114":4,"117":1}}],["eltype",{"2":{"1":3,"66":3,"136":2}}],["enabled",{"2":{"157":1}}],["enumerate",{"2":{"134":1}}],["environment",{"0":{"85":1},"2":{"138":1,"149":1}}],["environmental",{"2":{"0":2,"1":2}}],["energy",{"2":{"41":1}}],["entry",{"2":{"1":3,"157":1}}],["enforcing",{"2":{"1":2,"155":1}}],["ensuring",{"2":{"1":17,"9":1,"30":7,"32":5,"115":1,"136":3,"155":18}}],["ensures",{"2":{"1":12,"24":2,"28":2,"36":6,"38":2,"40":2,"86":1,"155":2}}],["ensure",{"2":{"0":1,"1":2,"86":1,"128":1}}],["enough",{"2":{"1":1,"69":1,"106":1}}],["end``",{"2":{"157":1}}],["end",{"2":{"1":2,"25":1,"26":1,"45":2,"86":2,"134":15,"138":2,"140":1,"141":1,"142":1,"143":2,"145":1,"147":2,"149":3,"151":2,"155":1,"157":3}}],["endpoint",{"2":{"0":1,"1":1}}],["enclosed",{"2":{"1":2}}],["encourage",{"2":{"85":2,"103":1}}],["encode",{"2":{"136":1}}],["encoded",{"2":{"1":2,"28":2,"155":1}}],["encoding",{"0":{"129":1},"2":{"0":4,"1":5,"128":1,"129":4}}],["encompass",{"2":{"1":1}}],["encapsulate",{"2":{"1":1,"115":1,"157":2}}],["encapsulating",{"2":{"0":5,"1":5}}],["encapsuler",{"2":{"1":1,"60":1}}],["e",{"2":{"0":2,"1":18,"28":4,"36":4,"38":2,"41":1,"80":1,"109":1,"134":3,"157":1}}],["either",{"2":{"0":5,"1":9,"21":1,"26":2,"36":4,"55":1,"57":1,"60":1,"63":1,"72":1}}],["existing",{"2":{"1":2}}],["exists",{"2":{"1":3,"86":1,"142":1}}],["ex",{"2":{"1":3}}],["exactly",{"2":{"1":4,"31":7,"32":4,"155":3}}],["examples",{"0":{"133":1},"1":{"134":1,"135":1},"2":{"1":25,"17":1,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"49":1,"85":1,"115":1,"146":1,"149":1,"150":1}}],["example",{"2":{"0":10,"1":17,"2":1,"4":1,"5":1,"6":1,"7":1,"20":4,"21":1,"23":2,"25":1,"26":1,"29":2,"33":1,"43":1,"67":4,"72":1,"73":4,"85":1,"139":1,"142":1,"147":2,"151":2,"153":1}}],["exclu",{"2":{"1":3,"110":3}}],["exclude",{"2":{"1":1,"32":1}}],["excluded",{"2":{"1":1,"155":2}}],["exclusive",{"2":{"0":3,"1":11,"110":9,"118":1,"121":1,"126":1,"136":3}}],["except",{"2":{"1":2,"32":2}}],["except=vals",{"2":{"0":1,"1":2,"20":1,"73":1}}],["exceeds",{"2":{"7":1}}],["exceed",{"2":{"1":2,"4":1,"36":2}}],["experimental",{"0":{"101":1},"2":{"101":1}}],["experiments",{"0":{"99":1},"1":{"100":1,"101":1},"2":{"101":1}}],["expectations",{"2":{"85":1}}],["expect",{"2":{"74":1}}],["expects",{"2":{"1":1}}],["expected",{"2":{"0":3,"1":4}}],["express",{"2":{"155":1}}],["expressing",{"2":{"18":1}}],["expressions",{"2":{"110":1}}],["expression",{"2":{"1":8,"23":1,"32":1}}],["expresses",{"2":{"4":1}}],["expr",{"2":{"1":2,"141":1,"142":3,"143":3}}],["explanation",{"2":{"1":1,"80":1}}],["explicitly",{"2":{"1":2,"26":1,"155":3}}],["explicit",{"2":{"1":2,"155":1}}],["exploring",{"0":{"12":1,"56":1,"87":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"88":1},"2":{"106":1}}],["explored",{"2":{"0":1,"1":1}}],["explores",{"2":{"0":1,"1":1,"67":1}}],["exploresettings",{"2":{"0":7,"1":7,"67":7}}],["explore",{"2":{"0":8,"1":11,"12":1,"56":1,"67":5}}],["explorer",{"2":{"0":17,"1":55,"67":17}}],["explorations",{"2":{"12":1,"56":1}}],["exploration",{"0":{"67":1},"1":{"68":1},"2":{"0":6,"1":8,"49":1,"67":6,"69":1,"106":1}}],["export",{"2":{"0":1,"1":1,"157":1}}],["extensibility",{"2":{"11":1}}],["extensions",{"0":{"47":1},"1":{"48":1},"2":{"42":1,"147":1,"151":1}}],["extensionally",{"2":{"26":1}}],["extensional",{"2":{"26":1}}],["extension",{"0":{"26":1,"58":1,"61":1,"64":1,"146":1,"150":1},"1":{"147":1,"148":1,"151":1,"152":1},"2":{"1":8,"22":1,"139":4,"146":1,"147":1,"150":1,"151":1,"155":4}}],["extending",{"0":{"139":1},"1":{"140":1,"141":1,"142":1,"143":1,"144":1,"145":1},"2":{"139":1}}],["extended",{"2":{"0":2,"1":19,"108":2,"113":10,"114":6,"139":1}}],["extend",{"2":{"0":1,"1":2,"13":1,"47":1,"55":2,"57":1,"58":4,"61":2,"64":2,"66":1,"69":2,"106":2,"139":1,"145":1}}],["extends",{"2":{"0":3,"1":7,"41":4,"47":3,"55":3,"58":5,"61":3,"64":3,"66":1,"69":2,"106":2,"136":3}}],["externally",{"2":{"157":1}}],["external",{"2":{"0":1,"1":2,"55":1,"115":1}}],["extra",{"2":{"0":1,"1":1}}],["extracted",{"2":{"9":1,"19":1,"20":1,"70":1,"73":1}}],["extracts",{"2":{"0":1,"1":3,"43":1}}],["extract",{"2":{"0":2,"1":4,"21":1,"43":2,"72":1}}],["extremal",{"2":{"16":1}}],["extrema",{"0":{"51":1},"1":{"52":1},"2":{"0":2,"1":2,"42":1,"51":3,"134":1,"136":1,"157":3}}],["x``or",{"2":{"136":1}}],["x̅",{"2":{"136":4}}],["xn",{"2":{"86":1}}],["xi",{"2":{"25":2,"26":2}}],["x4",{"2":{"15":1}}],["x=x1",{"2":{"86":1}}],["x=6",{"2":{"7":1}}],["x=3",{"2":{"6":1,"7":1}}],["x+y≤10",{"2":{"4":1,"5":1,"7":1}}],["x3",{"2":{"1":1,"15":1,"28":1}}],["x3c",{"2":{"0":18,"1":49,"25":4,"26":4,"29":2,"30":4,"31":4,"32":2,"35":2,"36":1,"41":3,"45":3,"55":9,"57":6,"58":11,"60":11,"61":10,"63":12,"64":10,"69":13,"106":13,"134":2,"136":1,"155":70,"157":91}}],["x2",{"2":{"1":1,"5":1,"15":1,"16":1,"28":1,"157":2}}],["x26",{"2":{"1":2}}],["x1+x2≤10",{"2":{"5":1}}],["x1",{"2":{"1":1,"5":1,"15":1,"16":1,"28":1,"157":2}}],["xto",{"2":{"0":1,"1":1,"109":1}}],["xcsp³",{"2":{"22":1}}],["xcsp",{"2":{"0":1,"1":21,"2":1,"20":3,"24":1,"25":1,"26":1,"28":2,"29":3,"30":3,"31":4,"32":4,"33":4,"34":4,"35":2,"36":2,"38":1,"40":1,"71":2,"73":1}}],["xcsp3",{"2":{"0":1,"1":3,"9":1,"20":6,"43":3,"45":1,"71":4,"73":2}}],["x",{"2":{"0":36,"1":305,"4":1,"6":1,"20":1,"21":4,"23":2,"24":8,"25":10,"26":11,"28":8,"29":12,"30":23,"31":22,"32":28,"33":16,"34":8,"35":8,"36":8,"38":2,"40":2,"41":4,"49":2,"51":2,"58":10,"61":10,"64":10,"67":3,"72":4,"73":1,"86":6,"108":8,"109":10,"113":76,"114":43,"117":3,"120":4,"124":8,"125":7,"129":8,"134":42,"136":33,"147":1,"149":4,"151":1,"155":50,"157":68}}],["15",{"2":{"31":1,"147":1,"151":1}}],["1≤z",{"2":{"31":2,"35":2}}],["1≤y",{"2":{"29":1,"31":3,"33":2,"35":2}}],["1≤x",{"2":{"29":2,"31":7,"33":4,"35":2}}],["14",{"2":{"15":3}}],["101",{"0":{"75":1},"1":{"76":1,"77":1,"78":1}}],["10000",{"2":{"157":1}}],["1000",{"2":{"149":4}}],["100",{"2":{"0":2,"1":2,"149":1,"157":1}}],["10",{"2":{"0":2,"1":29,"4":1,"6":1,"7":2,"25":3,"26":3,"31":22,"32":27,"33":2,"35":2,"147":1,"149":1,"151":1,"157":2}}],["10^6",{"2":{"0":1,"1":1,"67":1}}],["123",{"2":{"0":1,"1":1,"15":3,"57":1,"60":1,"63":1}}],["12",{"2":{"0":1,"1":2,"15":3,"35":1,"36":1,"57":1,"60":1,"63":1}}],["1",{"2":{"0":11,"1":184,"15":3,"16":9,"18":1,"21":2,"24":2,"25":8,"26":11,"28":15,"29":30,"30":19,"31":122,"32":34,"33":44,"34":17,"35":61,"36":41,"38":4,"40":4,"41":3,"53":2,"55":1,"57":2,"60":2,"63":2,"67":5,"72":2,"86":5,"113":2,"128":1,"129":1,"134":4,"140":2,"145":4,"148":1,"149":3,"152":2,"153":8,"155":4,"157":4}}],["=0",{"2":{"41":1}}],["=>",{"2":{"1":15,"28":15,"134":1,"138":2,"140":6,"147":3,"148":10,"149":7,"151":3,"152":6}}],["==",{"2":{"0":1,"1":9,"31":9,"32":2,"33":9,"34":4,"38":1,"58":1,"129":1,"134":2,"155":3}}],["=usual",{"2":{"0":1,"1":1,"20":1,"73":1}}],["=",{"2":{"0":47,"1":143,"15":10,"16":6,"18":3,"20":2,"21":2,"24":5,"25":10,"26":10,"28":16,"29":12,"30":3,"31":83,"32":16,"33":34,"34":12,"35":32,"36":17,"38":5,"40":1,"41":11,"43":1,"53":2,"55":4,"57":5,"58":4,"60":5,"61":4,"63":5,"64":4,"67":17,"71":1,"72":2,"73":1,"86":1,"108":1,"115":5,"120":2,"126":1,"128":1,"129":3,"134":34,"136":12,"138":8,"141":1,"142":1,"143":1,"144":1,"145":9,"149":7,"155":19,"157":47}}],["vov",{"2":{"155":5}}],["vf",{"2":{"55":6,"149":5}}],["v4",{"2":{"15":2}}],["v3",{"2":{"15":2,"31":3}}],["v2",{"2":{"15":2,"16":1,"31":3}}],["vec",{"2":{"86":1}}],["vectorofvariables",{"2":{"155":3}}],["vectorfold",{"2":{"55":7}}],["vectors",{"2":{"1":3,"55":1,"113":1,"120":2,"149":1}}],["vector",{"2":{"0":10,"1":65,"20":3,"28":2,"30":6,"32":9,"43":5,"45":1,"55":10,"57":1,"58":10,"60":4,"61":6,"63":1,"64":6,"69":4,"71":3,"106":4,"108":2,"113":10,"114":6,"115":1,"117":1,"120":2,"129":2,"134":5,"138":2,"149":1,"153":2,"155":17,"157":1}}],["verbose",{"2":{"157":4}}],["verbosity",{"2":{"155":1,"157":1}}],["versionnumber",{"2":{"138":1,"153":1}}],["versions",{"2":{"21":1,"72":1,"138":4,"149":1,"153":3}}],["version",{"2":{"1":4,"55":1,"85":1,"115":1,"138":5,"153":3,"155":1}}],["versatile",{"0":{"9":1},"2":{"1":2,"155":1}}],["versa",{"2":{"1":3,"34":2,"115":1}}],["verifies",{"2":{"1":2,"28":2,"155":1}}],["vi",{"2":{"155":3}}],["vision",{"2":{"104":1}}],["visuals",{"2":{"149":4}}],["visualization",{"2":{"137":1,"138":1}}],["visual",{"2":{"85":1}}],["violated",{"2":{"7":2,"21":1,"72":1}}],["violates",{"2":{"7":1}}],["violation",{"0":{"7":1},"2":{"3":1}}],["vim",{"2":{"1":2}}],["vice",{"2":{"1":3,"34":2,"115":1}}],["via",{"2":{"0":1,"1":1,"137":1,"139":1,"140":1,"144":1}}],["viable",{"2":{"0":1,"1":6,"110":5}}],["vs",{"2":{"1":3}}],["v1",{"2":{"0":1,"1":1,"15":2,"16":3,"31":3}}],["v1beta",{"2":{"0":1,"1":1}}],["v",{"2":{"0":2,"1":3,"55":5,"108":3,"149":5,"153":7,"155":12,"157":3}}],["var",{"2":{"1":20,"114":8,"124":6,"125":6,"157":12}}],["vars=dictionary",{"2":{"157":1}}],["vars=ones",{"2":{"1":2,"32":2}}],["vars=nothing",{"2":{"1":10,"30":10}}],["vars=",{"2":{"1":11,"30":4,"40":2}}],["vars=zeros",{"2":{"1":2,"30":2}}],["vars",{"2":{"1":51,"20":2,"35":9,"36":15,"40":2,"43":2,"71":2,"113":8,"124":6,"155":20,"157":24}}],["varies",{"2":{"3":1}}],["variant",{"2":{"1":2,"36":2}}],["variants",{"2":{"1":19,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"86":1}}],["variableconstrainedoncreation",{"2":{"155":1}}],["variableinfo",{"2":{"155":2}}],["variables",{"0":{"8":1,"12":1,"56":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1},"2":{"0":6,"1":39,"3":3,"4":3,"5":3,"6":3,"8":1,"12":2,"18":1,"25":1,"26":2,"28":1,"32":8,"34":8,"38":2,"40":2,"56":1,"69":1,"77":1,"86":3,"106":2,"109":1,"124":3,"128":2,"155":9,"157":26}}],["variable",{"2":{"0":7,"1":19,"7":1,"13":1,"15":8,"16":4,"20":2,"23":2,"25":2,"26":4,"29":5,"31":12,"33":8,"34":6,"35":6,"43":2,"58":3,"61":3,"64":3,"67":1,"71":2,"86":2,"155":9,"157":40}}],["various",{"0":{"133":1},"1":{"134":1,"135":1},"2":{"0":1,"1":2,"8":1,"19":1,"51":1,"57":1,"70":1,"85":1,"92":1,"100":1,"115":1,"137":2}}],["val=3",{"2":{"1":1,"31":1,"32":1}}],["val=2",{"2":{"1":4,"31":2,"32":3,"33":1,"34":1}}],["val=15",{"2":{"1":2,"31":2,"32":2}}],["val=1",{"2":{"1":4,"30":2,"32":1,"33":1,"34":1}}],["val=nothing",{"2":{"1":4,"30":2,"34":2}}],["valparameterdomain",{"2":{"1":1,"69":1,"106":1}}],["vals=",{"2":{"1":15,"30":2,"31":7,"32":13}}],["vals=nothing",{"2":{"0":1,"1":2,"20":1,"73":1}}],["valsparameterdomain",{"2":{"1":1,"69":1,"106":1}}],["vals",{"2":{"1":24,"20":2,"29":1,"30":2,"31":19,"32":18,"43":2,"71":2,"115":2,"155":7}}],["validity",{"2":{"1":1,"155":1}}],["validate",{"2":{"0":1,"1":1}}],["valid",{"2":{"0":6,"1":11,"28":1,"57":1,"128":2,"129":3,"155":7}}],["value2",{"2":{"138":1,"147":1,"151":1}}],["value1",{"2":{"138":1,"147":1,"151":1}}],["valued",{"2":{"1":1,"28":1,"155":1}}],["value",{"2":{"0":13,"1":59,"20":1,"25":2,"26":2,"28":3,"29":5,"30":1,"31":12,"32":5,"33":8,"34":13,"35":6,"38":4,"41":1,"43":1,"55":1,"58":10,"61":8,"63":2,"64":11,"69":3,"71":1,"86":3,"106":3,"110":1,"115":8,"126":2,"129":1,"138":1,"155":15,"157":20}}],["values",{"2":{"0":8,"1":72,"3":1,"6":1,"15":1,"20":1,"21":2,"26":2,"28":2,"30":13,"32":24,"34":4,"38":3,"40":6,"41":4,"43":1,"57":2,"60":2,"63":4,"69":3,"71":1,"72":2,"86":2,"106":3,"115":5,"138":1,"148":1,"152":1,"155":12,"157":11}}],["val",{"0":{"114":1,"125":1},"2":{"0":3,"1":124,"13":1,"20":1,"30":3,"31":24,"32":21,"33":8,"34":8,"35":7,"36":6,"38":4,"41":4,"43":1,"53":2,"57":1,"71":1,"114":54,"115":8,"125":16,"140":2,"141":2,"142":2,"143":2,"144":2,"149":2,"155":16,"157":8}}],["upcoming",{"2":{"104":1}}],["up",{"0":{"85":1},"2":{"17":1,"157":1}}],["update",{"2":{"1":2}}],["updated",{"2":{"0":1,"1":1,"67":1}}],["updates",{"2":{"0":1,"1":1,"67":1}}],["utilities",{"0":{"108":1},"2":{"11":1,"49":1}}],["utilized",{"2":{"1":1,"42":1,"155":1}}],["url",{"2":{"0":6,"1":6}}],["us",{"2":{"155":1}}],["usage",{"0":{"138":1,"147":1,"151":1},"2":{"25":1,"138":1,"146":1,"150":1}}],["using",{"2":{"0":7,"1":8,"16":2,"20":1,"25":2,"26":2,"55":2,"73":1,"86":1,"136":1,"137":1,"138":3,"141":1,"147":2,"149":3,"151":2,"155":1}}],["uses",{"0":{"91":1},"2":{"1":1,"115":1,"136":1}}],["useful",{"2":{"1":1,"53":1,"110":1,"155":4,"157":1}}],["users",{"2":{"11":1,"42":1,"56":1,"85":2,"139":1,"140":1}}],["usermessage",{"2":{"0":1,"1":2}}],["user",{"2":{"0":14,"1":15,"9":1,"20":1,"71":1,"142":1,"143":1,"157":2}}],["use",{"2":{"0":2,"1":6,"11":1,"21":2,"24":2,"30":2,"32":1,"42":1,"49":1,"56":1,"63":1,"72":2,"84":1,"85":2,"86":1,"111":1,"137":1,"139":1,"155":2,"157":2}}],["used",{"2":{"0":2,"1":44,"11":1,"13":1,"20":2,"28":1,"34":6,"36":8,"38":2,"40":2,"43":2,"45":3,"55":2,"56":1,"57":1,"69":8,"71":2,"85":1,"106":8,"108":2,"110":2,"132":1,"136":2,"138":3,"147":1,"151":1,"155":4,"157":1}}],["usually",{"2":{"1":1,"157":1}}],["usual",{"0":{"20":1,"71":1,"73":1},"2":{"0":14,"1":24,"20":14,"21":3,"23":1,"24":3,"25":1,"43":8,"71":5,"72":3,"73":9,"111":1,"116":1,"119":1,"122":1}}],["undefkeyworderror",{"2":{"134":1}}],["understanding",{"0":{"80":1}}],["under",{"2":{"1":1,"115":1}}],["unfold",{"2":{"55":2,"149":2}}],["unfolded",{"2":{"55":7,"58":2,"61":2,"64":2,"69":1,"106":1}}],["unlikely",{"2":{"11":1}}],["unacceptable",{"2":{"1":2,"155":1}}],["unique",{"2":{"1":3,"24":2,"34":2,"155":2}}],["union",{"2":{"0":4,"1":12,"32":1,"34":4,"43":1,"45":2,"53":1,"55":2,"58":2,"61":1,"64":1,"66":2,"69":2,"106":2,"155":4,"157":69}}],["unused",{"2":{"0":1,"1":1}}],["unordered",{"2":{"0":1,"1":1,"15":1,"63":1}}],["until",{"2":{"0":1,"1":1,"17":1,"49":1}}],["branch",{"2":{"138":1}}],["braces",{"2":{"1":2}}],["breaking",{"2":{"138":3,"153":3}}],["but",{"2":{"41":1,"55":1,"86":1,"145":1}}],["building",{"0":{"96":1},"1":{"97":1,"98":1},"2":{"97":1}}],["build",{"2":{"25":1,"26":1,"139":1,"155":2}}],["blank",{"2":{"41":2}}],["block",{"2":{"1":2,"86":1,"138":1,"142":4,"143":2}}],["blocks",{"2":{"0":2,"1":2,"9":1,"86":2}}],["b2",{"2":{"31":1}}],["b1",{"2":{"31":1}}],["bariable",{"2":{"157":1}}],["basis",{"2":{"86":1}}],["basics",{"0":{"2":1,"82":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1}}],["basic",{"0":{"77":1,"128":1},"2":{"1":5,"42":1,"55":1,"85":1,"115":4,"128":1,"136":1,"145":1}}],["based",{"0":{"2":1,"30":1,"135":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1},"2":{"0":4,"1":10,"2":1,"20":4,"43":3,"53":1,"55":1,"69":1,"71":3,"73":1,"106":1,"110":1,"115":2,"129":1,"136":2,"146":1,"150":1,"155":1}}],["base",{"0":{"58":1,"61":1,"64":1},"2":{"0":6,"1":31,"2":1,"13":3,"41":9,"42":1,"47":2,"55":7,"57":3,"58":14,"61":9,"64":10,"66":3,"69":5,"106":5,"110":1,"128":2,"155":5,"157":4}}],["backend",{"2":{"138":3,"141":1,"145":1,"148":1,"152":1}}],["backends",{"2":{"137":1,"138":1}}],["backward",{"2":{"41":1}}],["back",{"2":{"1":2,"38":2}}],["backticks",{"2":{"0":1,"1":1}}],["bijective",{"2":{"1":2,"34":2}}],["binary",{"2":{"0":1,"1":1,"26":1,"129":1}}],["binarization==",{"2":{"134":1}}],["binarization",{"2":{"0":4,"1":4,"129":4,"134":13,"136":2}}],["binarized",{"2":{"1":1,"128":1}}],["binarize",{"2":{"0":2,"1":2,"129":2,"134":3}}],["bias",{"2":{"0":3,"1":3,"109":3}}],["bit",{"2":{"0":2,"1":2,"109":1,"129":1}}],["bitvector",{"2":{"0":1,"1":5,"108":4}}],["bits",{"2":{"0":1,"1":3,"110":2}}],["better",{"2":{"157":2}}],["between",{"2":{"0":7,"1":15,"3":1,"4":1,"13":1,"24":2,"26":1,"31":1,"34":2,"41":2,"43":1,"51":2,"55":1,"57":3,"60":2,"63":2,"124":1,"125":1,"155":4,"157":1}}],["below",{"2":{"149":1}}],["belongs",{"2":{"58":1,"61":1,"64":1,"157":2}}],["begin",{"2":{"138":2,"147":2,"149":2,"151":2,"155":4,"157":22}}],["best",{"0":{"97":1},"2":{"85":1,"97":1,"136":1,"157":1}}],["benchmarked",{"2":{"147":1,"151":1}}],["benchmarking",{"2":{"146":1,"150":1}}],["benchmarktools",{"0":{"146":1},"1":{"147":1,"148":1},"2":{"138":1,"146":1,"147":2,"148":8,"151":1}}],["benchmark",{"2":{"55":1,"145":1,"147":1}}],["been",{"2":{"14":1,"94":1,"146":1,"150":1,"157":7}}],["because",{"2":{"7":2,"23":1,"26":1}}],["behavior",{"2":{"1":1,"13":1,"17":1,"55":1}}],["before",{"2":{"0":1,"1":9,"36":8,"142":1}}],["be",{"0":{"143":1},"2":{"0":8,"1":31,"3":1,"4":1,"5":1,"6":1,"11":1,"12":2,"16":3,"17":1,"18":1,"23":2,"26":3,"28":3,"32":2,"34":2,"41":2,"55":3,"56":1,"57":1,"85":1,"86":1,"106":1,"110":5,"115":1,"118":1,"121":1,"126":1,"129":1,"136":2,"138":4,"139":1,"140":1,"141":1,"142":2,"143":2,"144":2,"145":2,"147":2,"151":2,"155":18,"157":3}}],["b",{"2":{"0":1,"1":11,"28":2,"57":1,"58":8,"60":1,"61":8,"63":1,"64":8}}],["boxplots",{"2":{"149":4}}],["boxes",{"2":{"86":1}}],["bold",{"2":{"3":1}}],["bounded",{"2":{"1":1,"114":1}}],["bounding",{"2":{"1":6,"114":4,"115":2}}],["bounds",{"2":{"0":1,"1":1,"13":1,"57":1}}],["bool=true",{"2":{"1":1,"31":1,"32":1}}],["bool=false",{"2":{"1":3,"31":1,"32":3}}],["boolparameterdomain",{"2":{"1":1,"69":1,"106":1}}],["bool",{"2":{"0":5,"1":10,"20":1,"32":1,"36":3,"43":1,"57":4,"60":4,"63":4,"71":1,"134":1,"138":1,"155":8,"157":4}}],["boolean",{"2":{"0":2,"1":5,"20":1,"43":1,"49":1,"69":1,"71":1,"106":1,"138":1}}],["both",{"2":{"0":1,"1":5,"12":1,"41":2,"42":1,"51":1,"55":4,"56":1,"155":1}}],["bytes",{"2":{"145":4,"149":1}}],["by",{"0":{"7":1},"2":{"0":14,"1":35,"19":2,"20":1,"21":1,"23":2,"26":3,"28":4,"32":1,"34":2,"41":1,"42":1,"45":1,"47":2,"55":1,"58":1,"61":1,"63":1,"64":1,"67":3,"70":2,"71":1,"72":1,"89":1,"100":1,"108":1,"110":1,"114":1,"125":1,"136":4,"142":2,"155":4,"157":10}}],["ptm",{"2":{"157":1}}],["png",{"2":{"149":2}}],["pkgextensions",{"2":{"139":1}}],["pkg",{"2":{"138":1,"139":1,"153":2}}],["pkgs",{"2":{"138":1,"149":1}}],["pôpulation",{"2":{"136":1}}],["penalty",{"2":{"134":20,"136":9}}],["perfchecker",{"0":{"137":1,"139":1},"1":{"138":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1},"2":{"137":1,"138":2,"139":2,"140":3,"141":1,"142":1,"143":2,"144":1,"145":3,"146":1,"147":1,"149":3,"150":1,"151":1,"153":5}}],["performances",{"0":{"44":1,"46":1,"48":1,"50":1,"52":1,"54":1,"59":1,"62":1,"65":1,"68":1}}],["performance",{"0":{"98":1,"143":1,"144":1},"2":{"11":1,"84":1,"98":1,"137":2,"138":4,"140":1,"142":1,"143":1,"144":1,"149":2,"157":1}}],["perform",{"2":{"0":1,"1":1,"67":1,"157":1}}],["per",{"2":{"0":1,"1":1,"19":1,"70":1,"129":1}}],["pivotal",{"2":{"70":1}}],["pf",{"2":{"55":6,"58":4,"61":4,"64":4,"69":2,"106":2}}],["plots",{"2":{"149":2}}],["plotting",{"2":{"145":1,"149":1}}],["plainly",{"2":{"141":1}}],["placeholder",{"2":{"17":1}}],["placeholders",{"2":{"1":4}}],["place",{"2":{"0":1,"1":4,"67":1}}],["pluto",{"2":{"85":1}}],["please",{"2":{"24":1,"55":1,"85":1}}],["phase",{"2":{"1":1,"110":2}}],["purpose",{"2":{"88":1}}],["purposes",{"2":{"1":1,"136":1}}],["puzzles",{"2":{"86":1}}],["puzzle",{"2":{"86":3}}],["push",{"2":{"1":4,"134":1}}],["public",{"0":{"0":1}}],["pseudo",{"2":{"1":1,"69":1,"106":1}}],["p",{"2":{"0":1,"1":1,"41":2,"55":10,"109":1,"155":1}}],["pool",{"2":{"157":1}}],["pointer",{"2":{"55":1}}],["point",{"2":{"1":4,"36":2,"58":3,"61":2,"64":2,"69":1,"106":1}}],["points",{"2":{"0":4,"1":5,"57":1,"60":1,"61":1,"63":3,"64":2}}],["posed",{"2":{"86":1}}],["post",{"0":{"144":1},"2":{"74":1,"144":2,"145":1,"157":1}}],["pos",{"2":{"41":2}}],["possible",{"2":{"6":1,"85":1,"112":1,"123":1,"155":1,"157":2}}],["possibly",{"2":{"0":1,"1":3,"17":1,"63":1}}],["positional",{"2":{"1":1}}],["positive",{"2":{"0":4,"1":15,"113":2,"114":2,"117":3,"124":2,"125":2}}],["populate",{"2":{"140":1}}],["population",{"2":{"0":2,"1":2,"136":2}}],["pop",{"2":{"136":2}}],["popsize=100",{"2":{"136":1}}],["popsize=200",{"2":{"0":1,"1":1}}],["popsize",{"2":{"0":4,"1":4}}],["pacakge",{"2":{"138":1}}],["packing",{"0":{"36":1}}],["package",{"0":{"88":1,"141":1},"2":{"1":2,"12":1,"42":3,"43":1,"56":1,"70":1,"88":1,"89":1,"137":2,"138":1,"141":1,"149":1,"153":1}}],["packages",{"0":{"87":1},"1":{"88":1},"2":{"1":2,"42":2,"45":2,"137":1}}],["page",{"2":{"85":1}}],["patterfolds",{"2":{"149":1}}],["patterns",{"2":{"55":1,"149":1}}],["patternfold",{"2":{"55":10,"58":2,"61":2,"64":2,"69":1,"106":1}}],["patternfolds",{"0":{"55":1},"2":{"1":1,"55":15,"60":1,"149":3}}],["pattern",{"2":{"1":1,"55":18,"110":1}}],["patch",{"2":{"138":2,"153":2}}],["patches",{"2":{"138":1,"153":1}}],["path",{"2":{"0":10,"1":14,"28":1,"138":2,"147":1,"149":1,"151":1,"155":1,"157":5}}],["pairs",{"2":{"1":1,"41":2,"155":2}}],["pairvarsparameterdomain",{"2":{"1":1,"69":1,"106":1}}],["paired",{"2":{"1":2,"20":1,"43":1,"69":1,"71":1,"106":1}}],["pair",{"2":{"1":63,"20":2,"30":16,"32":2,"35":9,"36":15,"40":4,"41":5,"43":2,"71":2,"110":1,"136":3,"155":15}}],["passed",{"2":{"1":2}}],["pass",{"2":{"0":1,"1":1,"67":1}}],["paradigm",{"2":{"2":1}}],["param=nothing",{"2":{"0":1,"1":1}}],["params",{"2":{"0":1,"1":2,"134":1}}],["parameterization",{"2":{"1":1,"115":1}}],["parameter",{"2":{"0":4,"1":19,"20":4,"28":2,"43":3,"69":1,"71":4,"106":1,"108":2,"115":6,"126":1,"128":1,"136":1,"142":1,"155":1}}],["parameters=constraintcommons",{"2":{"0":1,"1":1,"43":1}}],["parameters",{"0":{"20":1,"43":1,"69":1,"71":1,"106":1},"1":{"44":1},"2":{"0":28,"1":48,"20":12,"42":1,"43":19,"55":1,"67":3,"69":12,"71":8,"73":4,"106":14,"112":1,"115":2,"123":1,"136":5,"148":8}}],["parametric",{"0":{"113":1,"124":1},"2":{"0":3,"1":4,"115":2,"126":1,"136":1}}],["param",{"0":{"114":1,"125":1},"2":{"0":20,"1":38,"21":4,"69":2,"72":4,"106":2,"108":6,"115":16,"126":3}}],["parts",{"2":{"11":1}}],["particularly",{"2":{"110":1}}],["particular",{"2":{"5":1}}],["partially",{"2":{"0":1,"1":1,"86":1}}],["partial",{"2":{"0":4,"1":5,"49":1,"67":2,"157":1}}],["part",{"2":{"1":1,"18":1,"19":1,"70":1,"85":1}}],["parsing",{"2":{"0":1,"1":1}}],["parser",{"2":{"1":2}}],["parses",{"2":{"0":1,"1":2}}],["parse",{"2":{"0":2,"1":3}}],["practices",{"0":{"97":1},"2":{"97":1}}],["practice",{"0":{"95":1}}],["practical",{"2":{"17":1,"19":1,"70":1}}],["primary",{"2":{"88":1,"138":1}}],["primarily",{"2":{"56":1}}],["printing",{"2":{"157":2}}],["print",{"2":{"86":1,"157":8}}],["println",{"2":{"0":1,"1":1,"67":1}}],["principles",{"2":{"3":1}}],["prelimnary",{"2":{"147":1,"151":1}}],["preliminaries",{"2":{"134":3,"136":2}}],["prep",{"2":{"142":3}}],["preparatory",{"0":{"142":1},"2":{"138":1,"142":1}}],["previous",{"2":{"138":3}}],["previously",{"2":{"25":1}}],["precision",{"2":{"134":6,"136":1}}],["predictions",{"2":{"136":1}}],["prediction",{"2":{"136":1}}],["predict",{"2":{"134":9,"136":1}}],["predicates",{"2":{"86":2}}],["predicate",{"2":{"1":9,"3":1,"4":1,"23":1,"24":4,"25":2,"26":1,"110":1,"155":7}}],["predefined",{"2":{"10":1}}],["prefixed",{"2":{"20":1,"71":1}}],["prefix",{"2":{"1":3}}],["preferences",{"2":{"0":1,"1":1}}],["present",{"2":{"0":1,"1":2,"2":1,"41":1,"149":1}}],["pretty",{"2":{"0":3,"1":3,"20":3,"73":3,"134":1,"157":2}}],["projects",{"2":{"104":1}}],["proceeds",{"2":{"41":1}}],["processes",{"2":{"49":1}}],["processing",{"2":{"1":1,"115":1}}],["process",{"2":{"0":2,"1":3,"10":1,"67":2,"95":1,"115":1,"136":1,"138":1,"157":7}}],["programs",{"0":{"129":1}}],["programming",{"0":{"75":1,"76":1,"82":1,"90":1},"1":{"76":1,"77":1,"78":1,"91":1,"92":1},"2":{"0":1,"1":22,"2":2,"14":1,"19":1,"26":1,"32":3,"34":6,"36":6,"38":2,"40":2,"42":1,"70":1,"74":1,"78":1,"80":1,"82":1,"86":1,"115":1,"155":1}}],["progress",{"2":{"21":1,"72":1}}],["produced",{"2":{"1":1}}],["produce",{"2":{"1":1,"108":1}}],["products",{"2":{"41":2}}],["product",{"2":{"1":1,"120":1}}],["prod",{"2":{"1":2,"120":2}}],["provide",{"2":{"13":1,"14":1,"17":1,"18":1,"20":1,"21":1,"23":2,"25":2,"26":1,"53":1,"72":1,"73":1,"85":1,"89":1,"100":1,"106":1,"138":1,"140":1,"146":1,"150":1,"155":1}}],["provides",{"2":{"2":1,"10":1,"11":1,"12":1,"42":1,"74":1,"86":1,"137":2}}],["provided",{"2":{"0":1,"1":19,"113":10,"114":6,"138":2,"142":1}}],["providing",{"2":{"1":2,"9":1,"155":1}}],["prompts",{"2":{"1":2}}],["promptingtools",{"2":{"1":1}}],["prompted",{"2":{"0":1,"1":1}}],["prompttemplate",{"2":{"0":7,"1":7}}],["prompt",{"2":{"0":32,"1":35}}],["property",{"2":{"23":1}}],["properties",{"2":{"13":1,"41":1}}],["properly",{"2":{"0":1,"1":1,"13":1,"57":1}}],["proportional",{"2":{"0":1,"1":1}}],["problems",{"2":{"0":1,"1":12,"2":1,"10":1,"18":1,"28":1,"36":6,"38":2,"41":2,"67":1,"74":1,"76":1,"80":1,"86":1,"91":1,"92":1,"155":2,"157":1}}],["problem",{"2":{"0":3,"1":5,"5":3,"24":1,"41":6,"67":2,"86":1,"95":1,"157":3}}],["∈",{"2":{"0":2,"1":9,"13":2,"47":1,"57":1,"58":7,"61":7,"64":7,"155":2,"157":3}}],["o",{"2":{"136":1,"157":16}}],["own",{"2":{"85":1,"86":1,"157":1}}],["objs=dictionary",{"2":{"157":1}}],["objs",{"2":{"157":7}}],["objectives",{"2":{"157":10}}],["objective",{"2":{"0":5,"1":9,"67":5,"86":1,"155":4,"157":24}}],["object",{"2":{"0":9,"1":23,"67":8}}],["observable",{"2":{"41":1}}],["odd",{"2":{"17":1}}],["out",{"2":{"86":1}}],["output",{"2":{"0":2,"1":2,"136":1,"142":1,"143":1,"144":1,"145":1}}],["outputs",{"2":{"0":2,"1":2,"153":3}}],["our",{"2":{"5":1,"20":1,"49":1,"71":1,"86":2}}],["other",{"0":{"78":1},"2":{"2":1,"41":1,"78":1,"85":1,"86":4,"138":1,"145":1,"147":1,"151":1,"157":2}}],["otherwise",{"2":{"0":3,"1":29,"7":1,"21":1,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"45":1,"58":1,"61":1,"64":1,"69":1,"72":1,"106":1,"113":2,"114":2,"124":2,"125":2,"155":4,"157":1}}],["occurrences",{"2":{"1":7,"32":7,"55":1,"155":4}}],["occurs",{"2":{"1":2,"31":1,"32":2}}],["opt",{"2":{"155":2}}],["optmizers",{"2":{"136":1}}],["option",{"2":{"138":4,"155":1}}],["option2",{"2":{"138":1,"147":1,"151":1}}],["option1",{"2":{"138":1,"147":1,"151":1}}],["options",{"0":{"140":1,"148":1,"152":1},"2":{"55":1,"136":2,"138":3,"140":3,"148":1,"152":1,"155":5,"157":34}}],["optionally",{"2":{"0":2,"1":4,"21":2,"72":2}}],["optional",{"2":{"0":12,"1":12,"41":1,"67":1,"129":1,"136":1,"138":1,"157":2}}],["optimally",{"2":{"1":1}}],["optimizing",{"2":{"157":7}}],["optimized",{"2":{"155":1}}],["optimizers",{"0":{"133":1},"1":{"134":1,"135":1},"2":{"136":1}}],["optimizer",{"2":{"15":11,"16":7,"25":7,"26":7,"29":3,"31":4,"33":4,"35":2,"86":1,"134":8,"136":6,"155":59,"157":3}}],["optimize",{"2":{"0":1,"1":1,"25":2,"26":2,"29":3,"31":4,"33":4,"35":2,"41":1,"136":11,"155":4}}],["optimization",{"0":{"78":1,"79":1,"80":1,"83":1,"92":1,"93":1},"1":{"80":1,"81":1,"82":1,"84":1,"85":1,"86":1,"94":1,"95":1},"2":{"0":2,"1":5,"3":1,"10":1,"14":1,"67":1,"74":1,"80":2,"82":1,"84":1,"94":1,"95":1,"97":1,"157":2}}],["op=>",{"2":{"1":2,"30":2}}],["op=≤",{"2":{"1":9,"29":1,"30":6,"32":3}}],["op===",{"2":{"1":6,"32":4,"34":2}}],["op==",{"2":{"1":1,"32":1}}],["op=≥",{"2":{"1":3,"30":2,"31":1,"32":1}}],["op=",{"2":{"1":6,"29":1,"30":6}}],["op=+",{"2":{"1":2,"30":2}}],["opparameterdomain",{"2":{"1":1,"69":1,"106":1}}],["op",{"2":{"1":29,"20":1,"29":1,"31":16,"32":10,"33":6,"34":8,"35":4,"36":4,"38":4,"43":1,"71":1,"110":2,"155":9}}],["open",{"2":{"1":6,"18":1,"31":1,"32":6,"111":1,"149":1}}],["openaillm",{"2":{"0":2,"1":2}}],["openai",{"2":{"0":4,"1":4}}],["operate",{"2":{"1":1,"115":1}}],["operation",{"2":{"1":5,"16":1,"108":1,"110":5,"136":2}}],["operations",{"0":{"120":1},"2":{"0":7,"1":21,"47":1,"61":2,"64":2,"109":1,"110":13,"115":1,"118":1,"121":2,"126":1,"136":3}}],["operators",{"2":{"1":1,"69":1,"106":1}}],["operator",{"2":{"1":6,"20":2,"30":3,"32":1,"43":2,"71":2}}],["once",{"2":{"85":1}}],["ongoing",{"2":{"1":2,"36":2}}],["ones",{"2":{"1":1,"8":1}}],["one",{"2":{"0":10,"1":16,"20":2,"21":1,"43":2,"55":1,"69":1,"71":2,"72":1,"86":3,"106":2,"108":2,"110":2,"118":1,"121":1,"126":1,"128":1,"129":4,"134":1,"136":2,"138":1,"155":1,"157":3}}],["only",{"2":{"0":3,"1":6,"19":1,"32":1,"42":1,"70":1,"86":1,"110":2,"118":1,"121":1,"126":1,"132":1,"155":2,"157":1}}],["on",{"0":{"38":1,"100":1},"2":{"0":5,"1":17,"2":1,"13":1,"16":1,"20":4,"23":1,"24":2,"40":2,"41":1,"43":3,"55":3,"57":1,"67":1,"69":1,"71":3,"73":1,"85":1,"92":1,"106":1,"111":1,"115":2,"129":1,"136":3,"138":1,"143":1,"146":1,"150":1,"155":4,"157":2}}],["overhead",{"2":{"148":2}}],["overloading",{"2":{"144":1}}],["overloaded",{"2":{"140":1,"141":1,"142":1,"143":1,"144":1,"145":2}}],["overlap",{"2":{"1":21,"35":6,"36":21,"155":1}}],["oversampling",{"2":{"134":6,"136":1}}],["oversample",{"2":{"0":2,"1":2,"49":2,"134":1}}],["overviews",{"0":{"88":1}}],["overview",{"0":{"81":1},"2":{"74":1}}],["over",{"2":{"0":3,"1":6,"51":1,"86":2,"109":1,"136":1,"137":1,"157":1}}],["oriented",{"2":{"42":1}}],["original",{"2":{"55":1}}],["originating",{"2":{"1":1,"155":2}}],["origins",{"2":{"1":6,"36":6}}],["ordered",{"2":{"1":8,"29":6,"30":6,"110":1,"155":2,"157":1}}],["order",{"2":{"1":9,"30":6,"40":2,"41":1,"115":1,"155":3}}],["organization",{"2":{"74":1,"88":1}}],["org",{"2":{"0":1,"1":1,"20":1,"73":1}}],["or",{"0":{"7":1},"2":{"0":12,"1":31,"3":1,"4":1,"7":2,"8":1,"13":2,"19":1,"20":3,"21":4,"23":1,"26":2,"32":1,"36":4,"41":1,"42":2,"43":4,"47":1,"53":1,"55":1,"57":2,"58":1,"60":1,"61":1,"63":1,"64":1,"67":1,"71":3,"72":4,"85":1,"86":1,"104":1,"110":1,"115":5,"129":1,"138":7,"153":3,"155":2,"157":6}}],["official",{"2":{"85":1}}],["offers",{"2":{"10":1}}],["often",{"2":{"1":8,"36":6,"38":2,"138":1}}],["of",{"0":{"10":1,"112":1,"117":1,"120":1,"123":1},"1":{"113":1,"114":1,"115":1,"124":1,"125":1,"126":1},"2":{"0":103,"1":325,"2":4,"3":2,"4":1,"5":3,"6":2,"7":1,"8":1,"9":3,"10":1,"11":3,"13":4,"14":2,"15":1,"17":1,"18":2,"19":3,"20":20,"21":11,"26":4,"28":10,"30":14,"32":35,"34":17,"36":14,"38":8,"40":6,"41":33,"42":1,"43":12,"45":3,"49":3,"51":4,"55":13,"57":3,"58":7,"60":7,"61":12,"63":7,"64":13,"67":9,"69":3,"70":3,"71":11,"72":11,"73":9,"74":2,"80":2,"82":1,"84":2,"85":1,"86":11,"95":1,"98":1,"101":1,"104":1,"106":6,"108":7,"109":3,"110":18,"111":3,"113":13,"114":4,"115":8,"117":2,"118":2,"121":2,"124":4,"125":1,"126":2,"129":3,"136":14,"137":1,"138":15,"141":1,"142":1,"143":1,"144":1,"145":1,"149":2,"153":2,"155":48,"157":78}}],["i+1",{"2":{"86":1}}],["iconic",{"2":{"86":1}}],["icnlocalsearchoptimizer",{"2":{"136":3}}],["icngeneticoptimizer",{"2":{"136":4}}],["icnoptimizer",{"2":{"136":3}}],["icnconfig",{"2":{"136":4}}],["icns",{"2":{"110":1,"111":1,"116":1,"119":1,"122":1,"136":1}}],["icn=icn",{"2":{"0":1,"1":1}}],["icn",{"0":{"110":1},"2":{"0":23,"1":36,"61":2,"64":2,"110":9,"115":1,"118":1,"121":1,"126":1,"136":12}}],["ivectorfold",{"2":{"55":3}}],["io",{"2":{"41":2}}],["illustrate",{"2":{"24":1}}],["ignores",{"2":{"1":1,"36":1}}],["ignore",{"2":{"1":1,"36":1}}],["ignored",{"2":{"1":2,"35":1,"36":2}}],["i`",{"2":{"1":1,"58":1,"61":1,"64":1}}],["identity",{"2":{"1":14,"113":6,"115":4,"124":4}}],["identified",{"2":{"1":1}}],["identifier",{"2":{"0":3,"1":3}}],["id=1",{"2":{"1":3,"33":3,"34":3}}],["id=3",{"2":{"1":1,"33":1,"34":1}}],["id=nothing",{"2":{"1":4,"34":4}}],["ids",{"2":{"1":1,"69":1,"106":1}}],["idparameterdomain",{"2":{"1":1,"69":1,"106":1}}],["id",{"2":{"0":4,"1":5,"20":1,"33":3,"41":2,"43":1,"71":1,"155":2,"157":13}}],["i",{"2":{"0":3,"1":64,"36":4,"38":2,"58":10,"60":7,"61":8,"63":3,"64":8,"69":2,"86":4,"106":2,"108":2,"109":1,"110":2,"113":23,"114":13,"134":2,"145":8,"149":4,"155":2,"157":1}}],["improving",{"2":{"157":1}}],["improve",{"2":{"98":1}}],["improvement",{"0":{"98":1},"2":{"157":1}}],["impact",{"2":{"92":1}}],["importance",{"2":{"74":1,"101":1}}],["import",{"2":{"15":1,"16":1,"25":1,"26":1}}],["implemented",{"2":{"16":2,"17":1}}],["implementing",{"0":{"13":1}}],["implements",{"2":{"9":1}}],["implement",{"2":{"0":1,"1":2,"13":1,"45":1,"55":2,"57":1,"69":1,"106":1}}],["implementations",{"2":{"13":1}}],["implementation",{"2":{"0":2,"1":2,"45":2,"111":1}}],["immutable",{"2":{"0":1,"1":1,"55":1,"63":1}}],["ith",{"2":{"1":1,"58":2,"61":1,"64":1,"69":1,"106":1}}],["iterator",{"2":{"55":1}}],["iterators",{"2":{"55":1,"134":1}}],["iterate",{"2":{"55":2,"157":1}}],["iterations",{"2":{"157":3}}],["iteration",{"2":{"0":2,"1":2,"55":1,"157":8}}],["iter=100",{"2":{"0":2,"1":2}}],["iter",{"2":{"0":8,"1":8,"55":1,"136":3,"157":1}}],["itvls",{"2":{"1":3,"60":3}}],["itv",{"2":{"0":2,"1":9,"57":2,"58":8,"60":2,"61":7,"63":2,"64":7,"69":3,"106":3,"149":2}}],["itself",{"2":{"0":1,"1":1}}],["its",{"2":{"0":4,"1":9,"11":1,"14":1,"41":1,"55":1,"60":1,"63":1,"67":1,"74":1,"76":1,"82":1,"84":1,"85":2,"86":1,"88":1,"108":2,"138":1,"157":2}}],["it",{"2":{"0":11,"1":72,"4":1,"5":1,"6":1,"7":1,"9":1,"11":1,"13":1,"16":2,"17":1,"19":1,"20":2,"23":1,"24":1,"25":1,"28":1,"32":2,"36":6,"38":2,"42":2,"55":5,"56":1,"57":1,"58":2,"61":1,"64":1,"67":1,"69":9,"70":1,"73":2,"85":1,"86":4,"106":9,"110":1,"112":1,"115":1,"123":1,"129":1,"136":1,"137":1,"138":1,"139":1,"140":2,"141":1,"143":1,"149":2,"153":1,"155":7,"157":6}}],["isa",{"2":{"134":1}}],["issue",{"2":{"106":1,"111":1}}],["isempty",{"2":{"0":1,"1":4,"47":1,"58":3}}],["is",{"0":{"76":1},"2":{"0":34,"1":167,"2":1,"4":1,"5":1,"6":1,"7":5,"11":1,"13":3,"15":1,"16":2,"19":1,"20":6,"21":6,"23":3,"24":1,"25":3,"28":9,"32":15,"34":10,"36":10,"38":5,"40":3,"41":9,"42":1,"43":3,"47":2,"55":5,"56":1,"57":2,"58":5,"60":3,"61":4,"64":4,"67":1,"69":9,"70":1,"71":1,"72":6,"73":5,"85":1,"86":6,"106":10,"108":1,"110":7,"113":20,"114":13,"115":4,"118":1,"121":1,"126":2,"129":4,"132":1,"136":5,"137":1,"138":2,"139":1,"141":1,"144":2,"149":3,"155":32,"157":17}}],["inner",{"2":{"136":1,"157":1}}],["initpkgs",{"2":{"141":2}}],["initialization",{"0":{"141":1}}],["initializes",{"2":{"1":1}}],["init",{"2":{"134":1}}],["inherit",{"2":{"55":2}}],["inf",{"2":{"157":1}}],["infinite",{"2":{"55":1}}],["info",{"2":{"25":2,"26":2,"29":12,"31":25,"33":23,"35":15,"155":2,"157":6}}],["information",{"2":{"0":1,"1":3,"19":2,"70":2,"85":1,"136":1,"155":1,"157":1}}],["infrastructure",{"2":{"12":1}}],["involves",{"2":{"4":1}}],["involving",{"2":{"1":1,"3":1,"115":1}}],["invalid",{"2":{"0":1,"1":3,"155":1}}],["inputs",{"2":{"1":1}}],["input",{"2":{"0":1,"1":8,"20":3,"41":1,"43":3,"71":3,"138":3,"139":1}}],["inside",{"2":{"139":1,"142":1,"143":1}}],["inspired",{"2":{"20":1,"71":1}}],["inspect",{"2":{"0":1,"1":1}}],["instructions",{"2":{"89":1}}],["installing",{"2":{"89":1}}],["installation",{"0":{"89":1}}],["installed",{"2":{"85":1,"153":1}}],["install",{"2":{"85":1}}],["instantiated",{"2":{"5":1}}],["instantiation",{"0":{"5":1},"2":{"1":9,"3":1,"5":1,"7":2,"40":9,"155":2}}],["instances",{"2":{"85":1}}],["instance",{"2":{"0":1,"1":3,"20":1,"28":2,"41":4,"71":1,"129":1,"155":13,"157":2}}],["instead",{"2":{"0":3,"1":4,"20":1,"43":1,"71":1,"108":2,"129":1,"155":2,"157":1}}],["insertion",{"2":{"0":1,"1":1,"53":1,"155":1}}],["insert",{"2":{"0":1,"1":1,"53":1,"157":3}}],["introduce",{"2":{"77":1,"81":1,"88":1,"157":1}}],["introductory",{"2":{"74":1}}],["introduction",{"0":{"2":1,"127":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"128":1},"2":{"127":1}}],["integration",{"0":{"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1},"1":{"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1}}],["integers",{"2":{"16":1}}],["integer",{"2":{"1":2,"20":1,"32":1,"41":3,"43":1,"71":1,"80":1,"138":1,"155":5}}],["intend",{"2":{"157":1}}],["intended",{"2":{"138":1}}],["intentionally",{"2":{"23":1}}],["intentional",{"2":{"23":1}}],["intention",{"0":{"23":1,"24":1},"1":{"24":1,"25":1},"2":{"22":1,"23":2,"24":2,"25":5,"26":3,"29":3,"31":4,"33":4,"35":2,"155":17}}],["intensional",{"2":{"1":1}}],["intension",{"2":{"1":2}}],["interoperability",{"2":{"42":1}}],["interdiction",{"2":{"41":2,"157":2}}],["interacting",{"0":{"19":1,"70":1},"1":{"20":1,"21":1,"71":1,"72":1,"73":1},"2":{"110":1}}],["interactive",{"2":{"0":2,"1":2}}],["interpreted",{"2":{"1":2,"16":1,"28":2,"155":1}}],["interpretable",{"2":{"0":1,"1":1,"110":1}}],["intermediate",{"2":{"0":1,"1":1}}],["intersect",{"2":{"0":1,"1":2,"60":2,"63":1}}],["intersections",{"2":{"0":1,"1":2,"60":2,"63":1}}],["intersection",{"2":{"0":1,"1":1,"43":1}}],["internally",{"2":{"1":1,"108":1}}],["internals",{"2":{"1":1,"2":1}}],["internal",{"0":{"11":1},"2":{"0":1,"1":4,"11":1,"41":2,"45":1,"57":1,"110":1,"157":4}}],["interval",{"2":{"0":1,"1":8,"18":3,"57":1,"58":2,"60":6,"61":2,"63":3,"64":2,"69":1,"106":1,"149":1}}],["intervalsfold",{"2":{"55":3,"58":4,"61":2,"64":2,"69":2,"106":2,"149":1}}],["intervals",{"2":{"0":2,"1":11,"8":1,"18":2,"57":2,"58":5,"60":5,"61":4,"63":2,"64":4,"66":2,"69":2,"106":2,"149":2}}],["interfaced",{"2":{"146":1,"150":1}}],["interfaces",{"2":{"56":1,"85":1,"137":1}}],["interface",{"0":{"13":1,"132":1},"2":{"0":1,"1":4,"9":1,"13":1,"21":1,"23":1,"25":1,"45":2,"55":4,"57":1,"72":1,"85":2,"132":1,"137":1,"139":1,"155":4}}],["into",{"0":{"79":1,"145":1},"1":{"80":1,"81":1,"82":1},"2":{"0":4,"1":8,"22":1,"41":1,"57":1,"91":1,"108":1,"110":1,"117":1,"129":1,"136":1,"144":1,"145":1,"157":1}}],["int",{"2":{"0":4,"1":38,"16":1,"20":1,"25":2,"26":2,"28":2,"29":5,"30":8,"31":12,"32":9,"33":8,"34":1,"35":6,"38":1,"41":11,"55":2,"58":2,"61":2,"64":2,"67":1,"73":1,"86":1,"108":8,"134":2,"155":9,"157":30}}],["inc",{"2":{"157":6}}],["increment",{"2":{"157":3}}],["incremental",{"2":{"155":4}}],["increasing",{"2":{"1":10,"29":1,"30":10}}],["increase",{"2":{"0":1,"1":1,"53":1}}],["inception",{"2":{"14":1}}],["inclusive",{"2":{"1":3,"110":3}}],["include",{"2":{"155":1}}],["included",{"2":{"1":1,"155":1}}],["includes",{"2":{"0":2,"1":3,"9":1,"36":1,"115":1,"126":1}}],["incsert",{"2":{"0":1,"1":1,"53":2}}],["individuals",{"2":{"136":1}}],["indice",{"2":{"157":1}}],["indices",{"2":{"0":1,"1":2,"67":1,"157":6}}],["indicate",{"2":{"157":2}}],["indicates",{"2":{"0":2,"1":2,"41":1}}],["independently",{"2":{"157":1}}],["independent",{"2":{"1":1,"20":1,"43":1,"71":1,"157":1}}],["indexed",{"2":{"1":2,"34":2}}],["index",{"2":{"1":10,"20":1,"34":3,"38":2,"43":1,"55":2,"71":1,"155":7,"157":1}}],["ind",{"2":{"0":1,"1":1,"53":1,"157":2}}],["in",{"0":{"19":1,"24":1,"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1,"70":1},"1":{"20":1,"21":1,"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1,"71":1,"72":1,"73":1},"2":{"0":36,"1":156,"3":3,"5":1,"6":1,"8":1,"12":2,"13":2,"14":1,"15":4,"16":2,"18":1,"19":1,"20":11,"21":1,"22":1,"23":2,"24":1,"25":6,"26":6,"29":8,"30":6,"31":17,"32":24,"33":12,"34":14,"35":8,"36":18,"38":6,"40":4,"41":9,"42":1,"43":4,"45":2,"47":1,"51":1,"53":1,"55":2,"56":1,"57":4,"58":6,"60":3,"61":8,"63":5,"64":9,"67":2,"69":1,"70":1,"71":7,"72":1,"73":4,"74":1,"76":1,"82":1,"85":1,"86":7,"101":1,"106":1,"108":3,"109":1,"110":7,"111":1,"113":1,"115":1,"124":2,"134":2,"136":3,"138":1,"139":1,"141":1,"142":1,"144":1,"145":5,"147":2,"149":3,"151":2,"153":1,"155":39,"157":16}}],["iff",{"2":{"0":2,"1":2,"115":1,"126":1}}],["if",{"2":{"0":14,"1":67,"5":1,"7":1,"13":1,"21":1,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"45":3,"55":2,"57":1,"58":12,"61":11,"64":11,"69":3,"72":1,"85":1,"86":1,"106":3,"110":4,"113":2,"114":2,"124":2,"125":2,"129":4,"134":4,"136":1,"155":9,"157":14}}],["would",{"2":{"1":1,"5":1}}],["worse",{"2":{"157":3}}],["world",{"0":{"94":1},"2":{"74":1,"95":1}}],["work",{"2":{"1":1,"21":1,"72":1}}],["works",{"2":{"0":1,"1":1,"139":1,"140":1}}],["word",{"2":{"0":1,"1":8,"28":2,"45":6,"69":2,"106":2,"155":1}}],["want",{"2":{"147":1,"151":1}}],["was",{"2":{"55":1,"58":2,"61":1,"64":1,"69":1,"106":1,"139":1,"157":1}}],["way",{"2":{"1":3,"12":1,"23":1,"25":1,"26":1,"56":1,"106":1,"147":1,"151":1,"155":1}}],["warning",{"2":{"0":1,"1":2,"3":1,"41":1}}],["well",{"2":{"86":1}}],["welcome",{"0":{"74":1},"2":{"10":1}}],["weigths",{"2":{"41":1}}],["weighting",{"2":{"136":1}}],["weighted",{"2":{"1":1,"125":1}}],["weight",{"2":{"0":1,"1":2,"41":1,"128":1}}],["weights",{"2":{"0":8,"1":18,"41":3,"109":1,"110":10,"136":5}}],["weights=nothing",{"2":{"0":1,"1":1}}],["we",{"2":{"0":1,"1":1,"2":1,"3":1,"5":1,"14":1,"17":1,"18":1,"19":1,"20":1,"23":1,"24":1,"25":1,"47":1,"49":1,"51":1,"53":1,"70":1,"73":1,"85":4,"86":6,"106":1}}],["write",{"2":{"0":2,"1":2}}],["while",{"2":{"157":5}}],["which",{"2":{"0":1,"1":6,"7":2,"20":1,"28":2,"41":7,"55":2,"58":1,"71":1,"86":1,"108":1,"110":1,"137":1,"139":1,"155":1}}],["why",{"0":{"84":1}}],["what",{"0":{"76":1},"2":{"1":1,"74":1,"86":1}}],["whole",{"2":{"0":1,"1":1,"157":1}}],["whether",{"2":{"1":4,"3":1,"7":1,"32":1,"36":1,"155":1}}],["where",{"2":{"0":7,"1":19,"13":1,"28":1,"32":1,"38":2,"41":1,"57":5,"58":5,"60":5,"61":4,"63":5,"64":4,"69":2,"94":1,"106":2,"124":2,"134":1,"138":1,"155":8,"157":69}}],["when",{"2":{"0":2,"1":23,"2":1,"41":1,"47":2,"55":1,"86":1,"113":10,"114":6,"115":2,"136":2,"138":1,"155":1,"157":2}}],["wip",{"2":{"137":1}}],["wikipedia",{"2":{"41":2,"86":1}}],["wide",{"2":{"1":1,"9":1,"28":1,"155":1}}],["width",{"2":{"0":2,"1":2,"20":2,"73":2}}],["width=150",{"2":{"0":1,"1":1,"20":1,"73":1}}],["will",{"2":{"0":8,"1":9,"2":1,"12":1,"16":1,"17":1,"20":1,"43":1,"73":1,"85":2,"86":1,"110":1,"118":1,"121":1,"126":1,"129":1,"136":1,"146":1,"150":1,"155":2}}],["without",{"2":{"1":17,"18":1,"113":10,"114":6}}],["within",{"2":{"1":8,"12":1,"13":1,"28":2,"42":1,"70":1,"85":1,"88":1,"111":1,"116":1,"119":1,"122":1,"155":6,"157":1}}],["with",{"0":{"19":1,"70":1,"83":1,"133":1},"1":{"20":1,"21":1,"71":1,"72":1,"73":1,"84":1,"85":1,"86":1,"134":1,"135":1},"2":{"0":13,"1":63,"3":1,"5":1,"6":1,"9":1,"10":1,"16":1,"17":1,"20":5,"28":4,"36":3,"41":8,"43":1,"45":1,"55":1,"60":1,"67":1,"69":1,"71":1,"73":4,"78":1,"86":5,"89":1,"106":1,"108":2,"109":1,"110":4,"113":10,"114":6,"115":3,"124":1,"125":1,"126":1,"136":3,"138":2,"140":1,"141":1,"146":1,"148":1,"149":1,"150":1,"152":1,"155":6,"157":8}}],["w",{"2":{"0":2,"1":4,"45":2,"69":2,"106":2,"110":2,"136":2}}],["ds",{"2":{"136":2}}],["df",{"2":{"134":24,"136":2}}],["due",{"2":{"85":1}}],["during",{"2":{"0":1,"1":2,"49":1,"67":1,"110":2}}],["d1",{"2":{"15":1,"16":1,"18":1}}],["draw",{"2":{"1":1,"58":2,"61":1,"64":1,"69":1,"106":1,"157":5}}],["datatype",{"2":{"157":1}}],["dataframe",{"2":{"134":2,"136":1}}],["data",{"2":{"0":6,"1":8,"115":2,"157":1}}],["done",{"2":{"144":1}}],["download",{"2":{"85":1}}],["doc",{"2":{"3":1}}],["documentation",{"2":{"2":1,"41":1,"55":1,"85":1,"107":1,"130":1,"136":1,"138":1,"146":1,"150":1,"155":1,"156":1,"157":1,"158":1}}],["docstring",{"2":{"155":23,"157":29}}],["docs",{"2":{"0":3,"1":3}}],["double",{"2":{"1":2}}],["doesn",{"2":{"1":3,"138":1}}],["does",{"2":{"0":1,"1":10,"36":2,"155":4}}],["do",{"2":{"0":2,"1":7,"36":4,"109":1,"115":1}}],["domath",{"2":{"147":1,"151":1}}],["domains",{"0":{"12":1,"14":1,"17":1,"18":1,"56":1},"1":{"13":1,"14":1,"15":2,"16":2,"17":2,"18":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1},"2":{"0":35,"1":42,"6":2,"8":2,"12":3,"13":1,"14":1,"16":1,"17":1,"18":2,"41":1,"56":2,"57":4,"58":3,"60":9,"61":2,"63":7,"64":2,"66":2,"67":18,"69":1,"77":1,"106":3,"134":11,"136":2,"157":3}}],["domain",{"0":{"8":1},"2":{"0":39,"1":64,"8":1,"13":7,"15":4,"16":3,"18":3,"32":1,"41":1,"57":19,"58":1,"60":12,"61":1,"63":15,"64":1,"67":7,"69":9,"86":1,"106":9,"124":1,"125":1,"129":4,"136":3,"157":20}}],["dom",{"2":{"0":4,"1":8,"124":2,"125":2,"134":4,"136":2}}],["d₂",{"2":{"0":2,"1":2,"60":2,"63":2}}],["d₁",{"2":{"0":2,"1":2,"60":2,"63":2}}],["d5",{"2":{"0":1,"1":1,"57":1,"60":1,"63":1}}],["d4",{"2":{"0":1,"1":1,"15":1,"57":1,"60":1,"63":1}}],["d3",{"2":{"0":1,"1":1,"15":1,"18":1,"57":1,"60":1,"63":1}}],["d2",{"2":{"0":1,"1":1,"15":1,"16":1,"18":1,"57":1,"60":1,"63":1}}],["dynamic",{"2":{"0":1,"1":3,"13":1,"16":1,"41":1,"57":1,"60":1,"115":1,"157":11}}],["dir",{"2":{"147":1,"149":4,"151":1}}],["direct",{"2":{"11":1}}],["directory",{"2":{"1":1}}],["directions",{"0":{"104":1},"2":{"1":1,"115":1}}],["directed",{"2":{"1":1,"28":1,"155":1}}],["directly",{"2":{"1":1,"23":1,"25":1,"155":1}}],["digits",{"2":{"86":2}}],["dive",{"0":{"79":1},"1":{"80":1,"81":1,"82":1},"2":{"91":1}}],["differs",{"0":{"78":1}}],["different",{"2":{"0":4,"1":28,"3":1,"11":1,"20":4,"21":1,"23":1,"24":6,"25":3,"26":2,"29":5,"30":8,"41":1,"43":1,"71":2,"72":1,"73":2,"85":1,"86":1,"115":3,"137":1,"149":1,"155":1,"157":1}}],["difference",{"2":{"0":2,"1":12,"20":1,"51":2,"57":1,"60":1,"63":1,"71":1,"113":2,"114":2,"124":3,"125":3}}],["diff",{"2":{"1":4,"124":2,"125":2}}],["dim=2",{"2":{"1":2,"33":2,"34":2}}],["dim=1",{"2":{"1":2,"34":2}}],["dimparameterdomain",{"2":{"1":1,"69":1,"106":1}}],["dimensions",{"2":{"1":1,"69":1,"106":1}}],["dimension",{"2":{"1":1,"20":1,"43":1,"71":1,"155":5,"157":1}}],["dim",{"2":{"1":3,"20":1,"33":1,"35":1,"36":2,"43":1,"71":1,"134":3,"155":7,"157":4}}],["dictionaries",{"0":{"53":1},"1":{"54":1},"2":{"42":1,"53":1}}],["dictionaryview",{"2":{"157":1}}],["dictionary",{"2":{"0":9,"1":19,"20":5,"41":3,"43":1,"53":1,"73":5,"115":2,"137":1,"138":1,"140":2,"142":1,"143":1,"149":1,"157":6}}],["dict=usual",{"2":{"0":1,"1":1,"43":1}}],["dict",{"2":{"0":8,"1":12,"20":5,"28":4,"43":3,"73":5,"138":1,"140":2,"142":3,"143":3,"144":3,"147":1,"149":1,"151":1}}],["discuss",{"2":{"84":1,"92":1,"101":1}}],["discreteset",{"2":{"15":8,"25":1,"26":1,"155":6}}],["discretedomain",{"2":{"0":3,"1":7,"57":1,"58":3,"60":1,"61":3,"63":4,"64":3,"69":1,"106":1,"134":1}}],["discrete",{"0":{"14":1,"63":1},"1":{"15":1,"16":1,"17":1,"64":1,"65":1},"2":{"0":5,"1":5,"8":1,"12":1,"13":1,"14":2,"16":1,"56":1,"57":1,"60":1,"63":4,"136":1,"155":5,"157":1}}],["displays",{"2":{"41":1}}],["display",{"2":{"41":13}}],["dispatcher",{"2":{"55":1}}],["dispatch",{"2":{"1":1,"115":1,"136":1,"157":2}}],["distributed",{"2":{"157":1}}],["distdifferent",{"2":{"25":3,"26":3,"155":1}}],["distinct",{"2":{"1":2,"32":2,"86":2,"155":1}}],["dist",{"2":{"1":4,"23":1,"24":6,"25":3,"26":2,"157":1}}],["distances",{"2":{"1":1,"24":2,"41":4,"155":1}}],["distance",{"2":{"0":5,"1":8,"13":1,"41":1,"57":2,"60":1,"63":1,"109":1,"155":3,"157":1}}],["diagrams",{"2":{"1":1,"45":2}}],["diagram",{"2":{"0":1,"1":5,"28":4,"45":1,"155":1}}],["d",{"2":{"0":22,"1":54,"13":7,"28":4,"53":1,"57":14,"58":29,"60":7,"61":23,"63":9,"64":26,"66":1,"69":12,"106":12,"134":2,"136":2,"143":2,"144":2,"149":3,"157":9}}],["deepcopy",{"2":{"157":1}}],["deeper",{"2":{"91":1}}],["debugging",{"2":{"157":1}}],["debinarize",{"2":{"0":1,"1":1,"129":1}}],["deprecated",{"2":{"155":1}}],["depth",{"2":{"55":1}}],["dependencies",{"2":{"149":1}}],["depending",{"2":{"85":1,"138":1}}],["depend",{"2":{"1":1,"115":1}}],["depends",{"2":{"0":1,"1":1,"13":1,"55":1,"57":1,"157":1}}],["dedicated",{"2":{"24":1}}],["descent",{"0":{"134":1},"2":{"136":1}}],["description",{"2":{"0":4,"1":13,"20":1,"24":1,"73":1,"155":12,"157":10}}],["descriptions",{"2":{"0":4,"1":4,"20":4,"73":4}}],["describes",{"2":{"41":1}}],["described",{"2":{"20":1,"71":1}}],["describe",{"2":{"0":2,"1":3,"20":4,"43":1,"71":2,"73":2,"111":1,"116":1,"119":1,"122":1,"134":1,"157":3}}],["design",{"2":{"19":1,"70":1}}],["designed",{"2":{"19":1,"23":1,"25":1,"42":1,"70":1,"137":1}}],["detailed",{"2":{"12":1}}],["determining",{"2":{"13":1}}],["deterministic",{"2":{"0":1,"1":1,"45":1}}],["determined",{"2":{"157":1}}],["determine",{"2":{"0":1,"1":2}}],["denotes",{"2":{"1":2,"124":2}}],["decrement",{"2":{"157":1}}],["decrease",{"2":{"157":2}}],["decreasing",{"2":{"1":8,"30":8}}],["decay",{"2":{"157":3}}],["declare",{"2":{"1":1,"155":1}}],["decision",{"2":{"0":1,"1":4,"28":1,"45":3,"155":1}}],["derived",{"2":{"1":1,"155":1}}],["delta",{"2":{"157":6}}],["delegates",{"2":{"1":1,"115":1}}],["delete",{"2":{"0":4,"1":9,"13":1,"57":1,"64":3,"157":13}}],["delineation",{"2":{"1":2,"155":1}}],["delimited",{"2":{"0":1,"1":1}}],["devops",{"2":{"138":2,"149":1}}],["develop",{"2":{"138":1}}],["developers",{"2":{"42":1}}],["development",{"2":{"42":1,"138":1}}],["developing",{"2":{"2":1}}],["dev",{"2":{"0":2,"1":2}}],["default",{"0":{"140":1},"2":{"0":9,"1":16,"17":1,"20":3,"21":1,"32":1,"41":9,"43":3,"55":3,"58":1,"72":1,"73":3,"129":1,"132":1,"136":4,"138":3,"140":2,"148":9,"152":1,"157":2}}],["defaults",{"2":{"0":4,"1":10,"30":1,"43":1,"53":1,"136":2}}],["defines",{"2":{"0":1,"1":2,"25":1,"26":1,"55":1,"60":1,"63":1,"110":1,"155":1}}],["define",{"2":{"0":2,"1":6,"12":1,"20":1,"23":1,"24":2,"26":1,"55":2,"56":1,"73":1,"76":1,"86":1,"155":1}}],["defined",{"0":{"8":1,"28":1},"2":{"0":4,"1":11,"8":1,"12":1,"16":1,"20":1,"23":3,"26":3,"32":1,"57":1,"63":1,"67":2,"73":1,"86":2,"113":1,"124":1,"136":2,"138":1,"148":1,"152":1,"155":4,"157":1}}],["defining",{"0":{"12":1,"24":1,"56":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1},"2":{"0":2,"1":2,"13":1,"20":1,"23":1,"25":1,"67":1,"73":1,"155":2}}],["definition",{"0":{"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1},"1":{"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1},"2":{"0":1,"1":2,"4":1,"5":1,"6":1,"7":1,"19":1,"67":1,"70":1}}],["mkpath",{"2":{"149":1}}],["myperfextension",{"2":{"140":1,"141":1,"142":1,"143":1,"144":1}}],["mypackagename",{"2":{"138":1}}],["myfold",{"2":{"55":2}}],["mvf",{"2":{"55":2}}],["mvectorfold",{"2":{"55":1}}],["mmds",{"2":{"45":1}}],["might",{"2":{"86":2}}],["mission",{"2":{"74":1}}],["missing",{"2":{"25":1,"26":1}}],["minor",{"2":{"138":2}}],["min",{"2":{"134":2,"155":1}}],["mincut",{"2":{"41":1,"157":2}}],["minus",{"2":{"1":28,"113":8,"114":8,"115":4,"124":4,"125":4}}],["minkowski",{"2":{"0":1,"1":1,"109":1}}],["minimization",{"2":{"155":1}}],["minimizing",{"2":{"41":1}}],["minimum",{"2":{"0":1,"1":12,"33":6,"34":11,"41":1,"51":1,"134":2,"155":4}}],["minimal",{"2":{"0":3,"1":4,"16":1,"45":2,"108":1,"109":1,"157":3}}],["moved",{"2":{"106":1}}],["move",{"2":{"55":1,"157":3}}],["moisupports",{"2":{"155":1}}],["moisum",{"2":{"155":1}}],["moiregular",{"2":{"155":1}}],["moiordered",{"2":{"155":1}}],["moinooverlap",{"2":{"155":1}}],["moinvalues",{"2":{"155":1}}],["moimultivalueddecisiondiagram",{"2":{"155":1}}],["moiminimum",{"2":{"155":1}}],["moimaximum",{"2":{"155":1}}],["moiintention",{"2":{"155":17}}],["moiinstantiation",{"2":{"155":1}}],["moiextension",{"2":{"155":1}}],["moierror",{"2":{"155":5}}],["moielement",{"2":{"155":1}}],["moidistdifferent",{"2":{"155":1}}],["moicumulative",{"2":{"155":1}}],["moiconflicts",{"2":{"155":1}}],["moiallequal",{"2":{"155":1}}],["moialldifferent",{"2":{"155":1}}],["moi",{"2":{"2":1,"12":1,"15":10,"16":8,"18":3,"25":5,"26":5,"29":3,"31":4,"33":4,"35":2,"41":1,"56":1,"155":38}}],["more",{"2":{"1":2,"10":1,"16":1,"108":1,"138":1}}],["mode",{"2":{"155":1}}],["modeled",{"2":{"157":1}}],["modeler",{"2":{"41":13}}],["modellike",{"2":{"155":2}}],["modelize",{"2":{"41":1}}],["modeling",{"0":{"2":1,"97":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1},"2":{"10":1,"23":1,"25":1,"85":2,"86":1}}],["models",{"0":{"10":1,"96":1},"1":{"97":1,"98":1},"2":{"0":5,"1":6,"2":1,"10":3,"12":1,"13":1,"86":1,"97":1,"98":1,"115":1}}],["model",{"0":{"86":1},"2":{"0":14,"1":28,"15":1,"16":1,"25":7,"26":7,"28":1,"29":19,"31":36,"33":28,"35":18,"41":14,"86":3,"155":45,"157":74}}],["module",{"0":{"58":1,"61":1,"64":1},"2":{"1":1}}],["modified",{"2":{"1":4}}],["modify",{"2":{"0":1,"1":6}}],["mostly",{"2":{"145":1}}],["most",{"2":{"0":1,"1":5,"9":1,"11":1,"31":6,"32":4,"55":1,"56":1,"86":1,"129":1,"155":1}}],["memory",{"2":{"55":1,"148":2}}],["membership",{"2":{"13":1}}],["meets",{"2":{"3":1}}],["means",{"2":{"1":5,"31":1,"34":2}}],["meaningful",{"2":{"101":1}}],["meaning",{"2":{"1":2,"32":2,"110":1}}],["measurement",{"2":{"157":1}}],["measure",{"2":{"0":2,"1":2}}],["message",{"2":{"0":3,"1":13}}],["messages",{"2":{"0":6,"1":6}}],["metastrategist",{"0":{"158":1},"2":{"158":1}}],["metasolver",{"2":{"157":4}}],["metaheuristics",{"0":{"81":1},"2":{"78":1}}],["metadatamessage",{"2":{"0":1,"1":2}}],["metadata",{"2":{"0":6,"1":10}}],["metrics",{"0":{"109":1},"2":{"137":1,"149":1}}],["metric=hamming",{"2":{"0":1,"1":1,"136":1}}],["metric",{"2":{"0":8,"1":8,"109":2,"136":6}}],["methods",{"0":{"93":1},"1":{"94":1,"95":1},"2":{"0":3,"1":4,"3":1,"13":2,"20":1,"42":2,"45":1,"55":5,"57":1,"69":1,"73":1,"78":1,"106":1,"108":2,"157":3}}],["method",{"2":{"0":5,"1":28,"21":1,"43":1,"45":1,"57":1,"58":3,"60":1,"61":3,"63":1,"64":3,"72":1,"113":10,"114":6,"132":2,"136":3,"140":1,"141":2,"142":2,"143":1,"144":2,"145":1,"157":1}}],["merge",{"2":{"0":2,"1":2,"60":2,"63":2,"157":1}}],["mutable",{"2":{"55":3,"157":2}}],["mutually",{"2":{"0":3,"1":4,"110":1,"118":1,"121":1,"126":1,"136":1}}],["much",{"2":{"21":1,"72":1}}],["must",{"2":{"0":3,"1":11,"4":2,"13":2,"23":1,"26":2,"28":2,"32":2,"41":2,"55":4,"57":1,"63":1,"155":7}}],["multithreading",{"2":{"157":1}}],["multithreaded",{"2":{"157":1}}],["multiplied",{"2":{"41":1}}],["multiplication",{"2":{"0":1,"1":1,"47":1}}],["multimedia",{"2":{"41":4}}],["multi",{"2":{"1":1,"28":1,"155":1}}],["multivalued",{"2":{"0":1,"1":2,"45":3}}],["magic",{"2":{"41":2}}],["major",{"2":{"21":1,"72":1,"106":1,"138":2,"153":2}}],["machinery",{"2":{"19":1,"70":1}}],["macro",{"2":{"0":2,"1":5,"20":2,"73":2,"111":1,"137":1,"140":1,"149":1,"155":1}}],["makie",{"2":{"137":1,"138":1}}],["making",{"2":{"17":1}}],["makes",{"2":{"7":1}}],["make",{"2":{"1":9,"49":1,"55":1,"111":2,"115":3,"126":1,"134":2,"136":3,"149":1,"157":1}}],["may",{"2":{"17":1}}],["markdown",{"2":{"1":4}}],["marks",{"2":{"1":2,"24":2,"41":1,"155":2}}],["map",{"2":{"1":1,"108":1,"134":5,"157":4}}],["mapping",{"2":{"1":1,"115":1}}],["matter",{"2":{"138":1,"155":1}}],["matters",{"2":{"105":1}}],["mathoptinterface",{"2":{"2":1,"15":1,"16":1,"25":1,"26":1,"41":2,"155":17}}],["mathematical",{"0":{"82":1},"2":{"2":1,"3":1,"4":1,"82":1}}],["maths",{"2":{"0":1,"1":1}}],["matrices",{"0":{"21":1,"72":1,"131":1},"1":{"132":1,"133":1,"134":1,"135":1},"2":{"1":1,"21":1,"72":1,"132":1,"136":1}}],["matrix",{"2":{"0":1,"1":2,"41":4,"128":2,"136":2}}],["matches",{"2":{"1":3,"155":2}}],["match",{"2":{"0":1,"1":4,"155":2}}],["mainsolver",{"2":{"155":1,"157":7}}],["mainly",{"2":{"1":1,"12":1,"17":1}}],["main",{"0":{"143":1},"2":{"0":1,"1":1,"20":1,"22":1,"71":1,"109":1,"137":1,"140":1,"141":1,"155":1,"157":5}}],["manages",{"2":{"157":1}}],["manage",{"2":{"157":1}}],["managed",{"2":{"157":1}}],["manager",{"2":{"85":1}}],["manipulating",{"2":{"110":1}}],["manipulation",{"2":{"1":1,"19":1,"70":1,"115":1}}],["manhattan",{"2":{"0":1,"1":1,"109":1}}],["many",{"2":{"0":1,"1":1,"49":1,"138":1}}],["max",{"2":{"0":3,"1":7,"67":3,"108":2,"110":2,"155":1,"157":10}}],["maximum",{"2":{"0":6,"1":17,"33":5,"34":11,"51":1,"57":1,"60":1,"63":1,"67":3,"155":4,"157":6}}],["m",{"2":{"0":2,"1":2,"15":5,"16":3,"41":6,"43":2,"86":5,"157":139}}],["mddconstraint",{"2":{"155":2}}],["mdd",{"2":{"0":2,"1":16,"20":1,"28":12,"43":1,"45":3,"69":1,"71":1,"106":1,"155":2}}],["fetch",{"2":{"157":1}}],["feasible",{"2":{"86":2}}],["feature",{"2":{"21":1,"42":1,"72":1,"139":1}}],["features",{"0":{"128":1},"2":{"9":1,"12":1,"19":1,"56":1,"70":1,"88":1,"106":1,"137":1}}],["f2",{"2":{"157":2}}],["fraction",{"2":{"145":1}}],["framework",{"2":{"2":1,"11":1}}],["front",{"2":{"111":1}}],["from=1",{"2":{"55":1}}],["from",{"0":{"28":1,"78":1,"95":1},"2":{"0":6,"1":21,"5":1,"9":1,"20":1,"28":1,"41":2,"55":3,"58":4,"61":2,"64":3,"69":2,"73":1,"74":1,"86":2,"95":1,"106":3,"108":1,"115":2,"132":1,"136":1,"137":1,"142":1,"143":1,"144":1,"145":1,"149":4,"155":6,"157":17}}],["free",{"2":{"41":1}}],["friendly",{"2":{"9":1}}],["faster",{"2":{"55":2,"157":1}}],["facilities",{"2":{"41":6}}],["facilitate",{"2":{"19":1,"42":1,"70":1}}],["facilitates",{"2":{"1":1,"115":1}}],["fails",{"2":{"3":1}}],["fake",{"2":{"1":1,"69":1,"106":1}}],["fakeautomaton",{"2":{"1":5,"45":2,"58":2,"61":1,"64":1,"69":5,"106":5}}],["fa",{"2":{"1":3,"45":1,"58":4,"61":2,"64":2,"69":3,"106":3}}],["fallback",{"2":{"0":1,"1":4,"57":1,"58":2,"60":1,"61":2,"63":1,"64":2}}],["false",{"2":{"0":6,"1":32,"7":1,"18":1,"25":1,"26":1,"29":4,"30":3,"31":4,"32":4,"33":9,"34":10,"36":2,"38":1,"40":1,"45":1,"47":1,"49":1,"58":2,"61":2,"64":2,"69":1,"106":1,"126":1,"134":3,"155":4,"157":2}}],["future",{"0":{"104":1},"2":{"43":1}}],["further",{"2":{"41":1,"85":1}}],["fundamentals",{"2":{"82":1}}],["fundamental",{"2":{"1":1,"155":1}}],["func",{"2":{"157":6}}],["funcs",{"2":{"0":2,"1":2,"108":2}}],["functionalities",{"2":{"11":1,"13":1}}],["functioning",{"2":{"11":1}}],["functions",{"0":{"21":1,"72":1},"2":{"0":2,"1":9,"41":1,"42":1,"110":3,"115":4,"126":2,"139":1,"145":2}}],["function",{"2":{"0":25,"1":63,"20":1,"21":5,"23":1,"28":1,"43":1,"49":1,"53":1,"55":2,"58":4,"61":2,"64":2,"67":5,"69":2,"72":5,"73":1,"86":1,"106":2,"108":6,"111":1,"113":1,"115":4,"124":1,"134":7,"136":3,"145":1,"155":29,"157":12}}],["full",{"0":{"1":1}}],["filter",{"2":{"134":1}}],["filled",{"2":{"86":1}}],["fill",{"2":{"41":4,"86":1}}],["file",{"2":{"0":9,"1":10,"110":1}}],["finally",{"2":{"21":1,"55":1,"72":1}}],["finer",{"2":{"21":1,"72":1}}],["finds",{"2":{"153":1}}],["find",{"2":{"20":1,"71":1,"157":2}}],["finish",{"2":{"1":2,"28":2}}],["finishes",{"2":{"1":8,"36":8}}],["fixes",{"2":{"1":1}}],["fix",{"2":{"1":1}}],["first",{"0":{"86":1},"2":{"1":15,"28":1,"31":1,"34":2,"36":8,"55":2,"86":1,"134":4,"136":1,"138":4,"153":1,"155":1,"157":1}}],["fields",{"2":{"0":3,"1":6,"55":2,"155":1}}],["flatten",{"2":{"134":1}}],["flexibility",{"2":{"85":1}}],["flexible",{"2":{"0":4,"1":6,"2":1,"26":1,"67":2,"115":1}}],["flows",{"2":{"41":1}}],["flow",{"2":{"41":1}}],["float64",{"2":{"1":2,"134":1,"155":1,"157":5}}],["floor",{"2":{"0":1,"1":1,"67":1}}],["follwing",{"2":{"137":1}}],["follows",{"2":{"86":1,"138":1,"155":1}}],["follow",{"2":{"1":1,"43":1}}],["following",{"2":{"0":6,"1":8,"3":1,"13":1,"32":1,"49":1,"57":1,"108":2,"115":1,"129":1,"147":1,"149":1,"151":1,"157":1}}],["folder",{"2":{"149":2}}],["folded",{"2":{"55":7}}],["fold",{"2":{"55":12,"149":1}}],["folds",{"2":{"55":5}}],["foundational",{"2":{"42":1}}],["foundation",{"2":{"13":1}}],["found",{"2":{"0":2,"1":2,"67":2,"110":1}}],["foreseeable",{"2":{"43":1}}],["forwarded",{"2":{"157":1}}],["forward",{"2":{"41":2,"55":1,"86":1}}],["forbidden",{"2":{"1":1,"41":1,"155":2}}],["formulating",{"2":{"95":1}}],["formal",{"2":{"4":1,"157":1}}],["formats",{"2":{"0":1,"1":1}}],["formatted",{"2":{"0":1,"1":6,"108":1}}],["format",{"2":{"0":4,"1":5,"20":1,"41":9,"43":1,"57":1,"71":1,"129":1}}],["form",{"2":{"1":2,"38":2}}],["for",{"0":{"83":1,"110":1,"129":1},"1":{"84":1,"85":1,"86":1},"2":{"0":37,"1":81,"2":3,"6":1,"7":1,"10":1,"11":1,"12":1,"13":5,"16":2,"17":1,"20":1,"21":2,"23":1,"24":1,"25":2,"26":2,"29":2,"31":1,"33":1,"34":4,"36":6,"41":12,"43":1,"45":3,"47":1,"53":1,"55":5,"57":3,"58":3,"60":2,"61":3,"63":2,"64":3,"66":2,"67":5,"69":2,"71":1,"72":2,"84":1,"85":3,"86":2,"89":1,"97":1,"104":1,"106":2,"107":1,"108":3,"110":2,"113":1,"115":5,"124":1,"126":1,"128":1,"129":2,"130":1,"132":1,"134":2,"136":8,"137":3,"138":5,"139":2,"140":1,"142":2,"143":1,"145":5,"149":5,"153":1,"155":14,"156":1,"157":18,"158":1}}],["f",{"2":{"0":14,"1":16,"21":6,"45":1,"49":2,"72":5,"108":6,"155":40,"157":7}}],["t2",{"2":{"155":4}}],["t1",{"2":{"155":3}}],["tbw",{"2":{"136":4,"157":2}}],["tutorial",{"0":{"149":1}}],["tutorials",{"0":{"99":1,"100":1},"1":{"100":1,"101":1},"2":{"100":1}}],["tuple",{"2":{"0":6,"1":20,"34":7,"36":1,"41":2,"57":5,"60":5,"63":5,"67":1,"138":1,"155":9}}],["tuples",{"2":{"0":1,"1":7,"26":2,"67":1,"155":4}}],["tips",{"2":{"97":1}}],["timelimitsec",{"2":{"155":1}}],["time",{"2":{"1":10,"36":8,"41":1,"110":2,"115":1,"145":1,"148":2,"155":1,"157":26}}],["times",{"2":{"1":3,"31":1,"32":3,"145":3,"149":2}}],["ts",{"2":{"55":1}}],["tests",{"2":{"138":1}}],["tested",{"0":{"143":1},"2":{"138":1,"142":1}}],["test",{"2":{"134":6,"136":2,"137":1,"138":2}}],["testing",{"0":{"144":1},"2":{"1":1,"136":1,"137":1,"140":1,"143":1,"144":1,"149":2}}],["teach",{"2":{"98":1}}],["techniques",{"0":{"78":1,"90":1},"1":{"91":1,"92":1}}],["tendency",{"2":{"41":1}}],["terminology",{"0":{"3":1,"77":1},"1":{"4":1,"5":1,"6":1,"7":1},"2":{"3":1}}],["terminal",{"2":{"0":3,"1":3}}],["text",{"2":{"1":3,"111":1,"116":1,"119":1,"122":1}}],["temporary",{"2":{"1":1,"157":1}}],["template",{"2":{"0":14,"1":19}}],["templates",{"2":{"0":3,"1":4,"10":1}}],["tructure",{"2":{"55":1}}],["true",{"2":{"0":4,"1":28,"7":1,"18":1,"25":1,"26":1,"29":4,"30":3,"31":10,"32":4,"33":5,"34":6,"35":1,"36":2,"38":1,"40":1,"45":3,"47":1,"49":1,"58":2,"61":2,"64":2,"69":1,"106":1,"110":1,"136":1,"140":1,"149":1,"152":1,"155":6,"157":3}}],["try",{"2":{"3":1,"85":1,"134":1}}],["tr",{"2":{"1":58,"108":4,"113":33,"114":18}}],["triple",{"2":{"0":1,"1":1}}],["track",{"2":{"140":1,"148":1,"152":1}}],["transpose",{"2":{"134":3}}],["transported",{"2":{"41":1}}],["translates",{"2":{"1":1}}],["translate",{"2":{"0":2,"1":2}}],["transforms",{"2":{"1":4,"115":4}}],["transform",{"2":{"0":1,"1":1,"129":1}}],["transformations",{"0":{"111":1,"112":1},"1":{"112":1,"113":2,"114":2,"115":2},"2":{"0":3,"1":16,"112":1,"115":15,"126":1}}],["transformation",{"2":{"0":4,"1":12,"108":1,"111":3,"115":8}}],["train",{"2":{"0":2,"1":3,"132":3,"134":5,"136":2}}],["training",{"2":{"0":1,"1":1,"136":7}}],["tag",{"2":{"138":1}}],["tags",{"2":{"138":2,"149":1}}],["tackle",{"2":{"106":1}}],["tabu",{"2":{"81":1,"157":46}}],["table",{"0":{"145":1},"2":{"0":4,"1":4,"20":4,"73":4,"134":1,"144":2,"145":4}}],["task",{"2":{"1":16,"36":16}}],["tasks",{"2":{"1":18,"36":18,"155":1,"157":1}}],["target",{"2":{"1":1,"20":1,"43":1,"71":1}}],["targeted",{"2":{"0":1,"1":1,"85":1,"157":3}}],["taken",{"2":{"149":1}}],["takes",{"2":{"1":4,"40":2,"155":1}}],["take",{"2":{"0":2,"1":2,"20":1,"67":1,"73":1,"86":1,"138":1}}],["two",{"2":{"0":4,"1":12,"4":1,"22":1,"26":1,"34":2,"36":4,"41":1,"45":1,"57":1,"60":3,"63":3,"67":1,"155":1}}],["thus",{"2":{"41":1}}],["those",{"2":{"19":1,"20":1,"21":1,"70":1,"71":1,"72":1,"110":1}}],["th",{"2":{"1":1,"110":1}}],["throw",{"2":{"134":1}}],["through",{"2":{"1":3,"8":1,"12":1,"21":2,"23":3,"25":2,"56":1,"72":2,"85":3,"95":1,"117":1,"120":2,"136":2}}],["threads",{"2":{"138":2,"140":1,"148":1,"152":1,"157":12}}],["three",{"2":{"14":1,"55":2}}],["threshold",{"2":{"1":1,"115":1}}],["third",{"2":{"1":2,"34":2}}],["this",{"2":{"0":3,"1":18,"2":1,"3":1,"4":1,"7":1,"10":1,"12":1,"17":1,"21":3,"24":1,"28":2,"29":2,"33":1,"34":2,"36":2,"41":1,"43":1,"55":2,"56":1,"67":1,"72":3,"86":2,"106":1,"110":2,"115":1,"138":2,"139":1,"140":2,"141":2,"142":2,"143":1,"146":1,"147":1,"148":1,"149":2,"150":1,"151":1,"152":1,"155":8,"157":3}}],["than",{"2":{"1":11,"7":1,"10":1,"23":1,"113":5,"114":2,"115":1,"155":1}}],["that",{"2":{"0":17,"1":102,"4":3,"12":1,"13":1,"20":2,"21":1,"23":4,"24":2,"25":1,"26":4,"28":5,"29":2,"30":7,"32":11,"33":1,"34":14,"36":12,"38":2,"40":4,"41":2,"42":1,"43":2,"55":6,"57":2,"58":2,"60":1,"61":2,"63":3,"64":2,"71":1,"72":1,"73":1,"74":1,"85":1,"86":6,"108":2,"109":1,"110":3,"115":3,"118":1,"121":1,"126":2,"128":1,"136":3,"137":1,"139":1,"145":1,"155":33,"157":10}}],["theory",{"0":{"95":1}}],["they",{"2":{"23":3,"26":3,"41":1,"91":1,"103":1}}],["their",{"0":{"91":1},"2":{"1":1,"4":1,"6":1,"8":1,"12":2,"18":1,"20":1,"71":1,"85":1,"86":1,"92":1,"115":1,"137":1,"140":1,"148":1,"152":1}}],["these",{"2":{"1":1,"13":1,"23":1,"26":2,"43":1,"145":1}}],["then",{"2":{"1":2,"5":1,"24":1,"157":2}}],["them",{"2":{"0":1,"1":2,"155":1,"157":1}}],["there",{"2":{"0":1,"1":3,"28":1,"41":3,"139":1,"145":1,"155":1}}],["the",{"0":{"13":1,"103":1,"140":1,"145":1},"2":{"0":215,"1":617,"2":1,"3":3,"4":2,"5":5,"6":2,"7":7,"9":1,"10":2,"11":2,"12":4,"13":8,"14":1,"19":5,"20":35,"21":17,"22":1,"23":6,"24":9,"25":6,"26":5,"28":17,"29":2,"30":10,"31":1,"32":41,"33":1,"34":25,"36":33,"38":16,"40":3,"41":50,"42":3,"43":17,"45":2,"47":3,"49":2,"51":5,"53":2,"55":30,"56":2,"57":8,"58":8,"60":8,"61":11,"63":6,"64":12,"67":18,"69":7,"70":5,"71":20,"72":17,"73":15,"74":3,"82":1,"84":1,"85":9,"86":13,"88":1,"95":1,"98":1,"101":1,"103":1,"104":1,"106":9,"108":5,"109":3,"110":20,"111":5,"112":2,"113":25,"114":12,"115":12,"116":1,"117":1,"118":3,"119":1,"121":3,"122":1,"123":2,"124":7,"125":3,"126":6,"128":1,"129":1,"136":17,"137":2,"138":19,"139":3,"140":2,"141":2,"142":6,"143":5,"144":5,"145":3,"147":3,"149":10,"151":3,"153":5,"155":155,"157":120}}],["typeof",{"2":{"155":1}}],["typemax",{"2":{"134":1,"157":1}}],["types",{"2":{"1":2,"8":1,"13":1,"22":1,"26":1,"42":1,"80":1,"115":2,"157":8}}],["type",{"2":{"0":4,"1":9,"13":4,"41":6,"55":3,"57":4,"63":2,"66":1,"115":1,"132":1,"136":3,"155":8,"157":6}}],["tolerance",{"2":{"148":4}}],["topics",{"2":{"100":1}}],["to=folds",{"2":{"55":1}}],["tools",{"0":{"2":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1},"2":{"19":1,"70":1}}],["total",{"2":{"1":1,"61":1,"64":1}}],["todo",{"2":{"0":1,"1":2,"24":1,"29":3,"31":4,"33":4,"35":2,"85":1,"86":4,"157":1}}],["towards",{"2":{"0":1,"1":1,"109":1}}],["to",{"0":{"2":1,"58":1,"61":1,"64":1,"74":1,"95":1,"127":1,"143":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"128":1},"2":{"0":62,"1":220,"3":3,"5":2,"6":1,"7":2,"9":1,"10":1,"11":3,"12":2,"13":1,"16":2,"19":1,"20":7,"21":9,"23":1,"24":6,"25":1,"26":1,"28":4,"29":3,"30":9,"31":4,"32":13,"33":4,"34":12,"35":2,"36":2,"38":3,"40":2,"41":16,"42":2,"43":2,"45":1,"47":1,"49":1,"51":1,"53":1,"55":14,"56":3,"57":4,"58":10,"60":3,"61":6,"63":1,"64":6,"67":7,"69":20,"70":1,"71":3,"72":9,"73":4,"74":1,"85":4,"86":6,"98":1,"101":1,"103":1,"106":23,"108":7,"109":1,"110":3,"111":2,"113":18,"114":7,"115":7,"116":1,"119":1,"120":2,"122":1,"127":1,"128":1,"129":1,"132":1,"134":1,"136":12,"137":3,"138":10,"139":3,"140":4,"141":2,"142":3,"143":2,"144":3,"145":5,"146":1,"147":1,"148":1,"149":3,"150":1,"151":1,"152":1,"155":36,"157":49}}],["t",{"2":{"0":14,"1":29,"28":2,"41":10,"45":2,"55":12,"57":8,"60":11,"63":14,"69":5,"106":5,"138":1,"155":25,"157":7}}],["swap",{"2":{"157":2}}],["switch",{"2":{"0":1,"1":1,"109":1}}],["src",{"2":{"155":2}}],["sltns",{"2":{"136":2}}],["square",{"2":{"41":3}}],["sqrt",{"2":{"0":1,"1":1,"67":1}}],["snippets",{"2":{"1":1}}],["shifted",{"2":{"134":3}}],["share",{"2":{"97":1,"104":1}}],["shared",{"2":{"11":1,"42":1}}],["shrink",{"2":{"1":2}}],["showcase",{"2":{"94":1}}],["show",{"2":{"0":1,"1":4,"108":1,"110":1}}],["should",{"2":{"0":2,"1":11,"23":1,"25":1,"34":6,"56":1,"108":2,"155":4,"157":3}}],["shortcut",{"2":{"0":1,"1":1,"21":1,"72":1}}],["script",{"2":{"149":1}}],["scatterlines",{"2":{"138":1,"149":1}}],["scalarfunction",{"2":{"155":3}}],["scalars",{"2":{"1":1,"124":1}}],["scalar",{"2":{"1":5,"20":2,"43":2,"71":2,"117":1,"124":1,"125":1,"155":1}}],["scenario",{"2":{"95":1}}],["science",{"2":{"84":1}}],["scheduling",{"0":{"36":1},"2":{"1":6,"36":6}}],["schema",{"2":{"0":1,"1":1}}],["syntaxes",{"2":{"2":1,"12":1}}],["syntax",{"2":{"1":6,"21":1,"72":1,"85":1,"86":1,"155":1,"157":1}}],["systemmessage",{"2":{"0":1,"1":2}}],["system",{"2":{"0":12,"1":17,"41":1}}],["symb",{"2":{"1":2}}],["symbols",{"2":{"0":6,"1":11,"47":2,"108":4,"110":1,"138":2}}],["symbol",{"2":{"0":14,"1":34,"20":4,"21":2,"43":4,"47":3,"72":2,"73":4,"110":1,"115":5,"126":1,"129":1,"134":1,"138":1,"139":1,"157":3}}],["symmetry",{"2":{"0":1,"1":1}}],["symmetries",{"2":{"0":4,"1":4}}],["symcon",{"2":{"0":1,"1":1,"47":1}}],["split",{"2":{"136":1}}],["specialize",{"2":{"157":10}}],["specialized",{"2":{"1":2,"113":1,"124":1,"157":10}}],["specializing",{"2":{"157":1}}],["specify",{"2":{"56":1}}],["specifying",{"2":{"1":2,"12":1,"155":5}}],["specific",{"2":{"1":6,"3":2,"5":1,"6":1,"7":1,"40":4,"115":1,"136":2,"148":1,"152":1,"155":2}}],["specifically",{"2":{"1":2,"58":2,"61":1,"64":1,"69":1,"106":1,"155":1}}],["specification",{"2":{"0":1,"1":1,"43":1}}],["specifications",{"2":{"0":1,"1":2,"20":1,"43":2,"73":1}}],["specifies",{"2":{"1":8,"4":1,"23":1,"26":1,"32":1,"34":6,"115":1}}],["specified",{"2":{"0":3,"1":5,"41":2,"58":2,"61":1,"64":1,"67":1,"69":1,"106":1,"115":1,"155":2}}],["span",{"2":{"1":1,"60":1,"63":1}}],["spaces",{"2":{"14":1,"49":1}}],["space",{"2":{"0":14,"1":17,"67":9,"155":3,"157":1}}],["sat",{"2":{"157":3}}],["satisfying",{"2":{"157":2}}],["satisfy",{"2":{"1":3,"4":1,"23":1,"26":1,"32":3,"155":2}}],["satisfied",{"2":{"0":1,"1":10,"7":2,"21":1,"28":1,"34":4,"36":2,"38":1,"40":1,"72":1,"155":1,"157":1}}],["satisfies",{"2":{"0":1,"1":8,"7":1,"28":1,"32":6,"155":4}}],["satisfaction",{"0":{"7":1},"2":{"0":1,"1":3,"3":1,"10":1,"67":1,"155":1,"157":3}}],["save",{"2":{"149":2}}],["say",{"2":{"0":1,"1":1,"129":1}}],["same",{"2":{"0":3,"1":5,"20":1,"41":2,"55":1,"60":1,"63":1,"73":1,"155":1}}],["sampling",{"0":{"49":1},"1":{"50":1},"2":{"42":1,"49":2}}],["samplings",{"2":{"0":3,"1":3,"67":3}}],["samples=d",{"2":{"143":1}}],["samples",{"2":{"0":1,"1":1,"67":1,"140":1,"143":1,"145":5,"148":2,"149":1,"152":1}}],["stop",{"2":{"157":5}}],["storing",{"2":{"149":1}}],["storage",{"2":{"16":1}}],["stored",{"2":{"142":1,"143":1}}],["stores",{"2":{"0":1,"1":2,"63":2,"149":2}}],["store",{"2":{"0":2,"1":16,"19":1,"60":3,"67":1,"69":8,"70":1,"106":8,"108":1,"110":2,"157":3}}],["stuff",{"2":{"134":2}}],["studies",{"0":{"94":1},"2":{"94":1}}],["studio",{"2":{"85":1}}],["stdout",{"2":{"41":1}}],["still",{"2":{"21":1,"72":1}}],["stipulates",{"2":{"1":1,"155":2}}],["step",{"2":{"1":2,"89":2,"100":2,"157":3}}],["stamp",{"2":{"157":3}}],["status",{"2":{"157":4}}],["static",{"2":{"157":1}}],["statement",{"2":{"4":1}}],["states",{"2":{"1":4,"28":4}}],["state",{"2":{"0":3,"1":3,"6":1,"41":3,"67":3,"157":36}}],["standard",{"2":{"12":1,"20":1,"22":1,"41":3,"56":1,"71":1}}],["standards",{"2":{"2":1,"9":1}}],["stands",{"2":{"12":1}}],["started",{"0":{"83":1,"89":1},"1":{"84":1,"85":1,"86":1},"2":{"89":1}}],["start=",{"2":{"41":1}}],["start",{"2":{"1":4,"28":2,"38":2,"41":1,"86":1,"138":1}}],["starts",{"2":{"1":9,"36":8,"55":1,"157":2}}],["starting",{"2":{"1":1,"41":2,"157":1}}],["str",{"2":{"157":1}}],["strategies",{"0":{"92":1},"2":{"92":1}}],["strategy",{"2":{"0":1,"1":1,"67":1}}],["straight",{"2":{"86":1}}],["straightforward",{"2":{"23":1,"155":1}}],["strongly",{"2":{"3":1}}],["streamlining",{"0":{"27":1,"29":1,"31":1,"33":1,"35":1,"37":1,"39":1},"1":{"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1}}],["streamline",{"2":{"10":1}}],["streamed",{"2":{"0":3,"1":3}}],["stream",{"2":{"0":3,"1":3}}],["struct",{"2":{"0":1,"1":2,"41":3,"57":1,"157":4}}],["structures",{"2":{"42":1}}],["structured",{"2":{"1":1}}],["structure",{"0":{"110":1},"2":{"0":10,"1":15,"13":1,"17":1,"41":1,"45":3,"55":6,"57":2,"69":1,"106":1,"110":4,"136":1,"157":5}}],["string",{"2":{"0":8,"1":31,"41":1,"58":4,"61":4,"64":4,"108":1,"110":1,"138":1,"155":1,"157":1}}],["strictly",{"2":{"0":3,"1":13,"30":8,"114":1,"117":1}}],["sound",{"2":{"17":1}}],["source",{"2":{"0":91,"1":219,"13":1,"20":5,"21":3,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"41":21,"43":3,"45":7,"47":3,"49":1,"51":1,"53":1,"55":19,"57":10,"58":21,"60":12,"61":19,"63":14,"64":20,"66":2,"67":4,"69":20,"71":1,"72":3,"73":4,"106":20,"108":7,"109":4,"110":12,"113":11,"114":6,"115":2,"117":2,"118":1,"120":2,"121":1,"124":5,"125":4,"126":2,"128":2,"129":3,"132":2,"136":28,"153":4,"155":74,"157":144}}],["soon",{"2":{"16":1,"155":1}}],["so",{"2":{"1":2,"41":1,"86":1}}],["solve",{"2":{"41":1,"86":1,"157":3}}],["solverversion",{"2":{"155":1}}],["solvername",{"2":{"155":1}}],["solvers",{"0":{"154":1},"2":{"85":3,"86":4,"110":1,"154":1,"157":2}}],["solver",{"2":{"41":6,"86":2,"136":1,"155":11,"157":29}}],["solved",{"2":{"1":1}}],["solving",{"2":{"2":1,"74":1,"76":1,"85":1,"92":1,"95":1,"157":4}}],["sols",{"2":{"0":1,"1":1,"136":4}}],["solution",{"2":{"0":1,"1":3,"29":2,"33":1,"41":2,"86":3,"109":1,"155":3,"157":4}}],["solutions",{"2":{"0":15,"1":15,"42":1,"67":11,"109":1,"136":8,"157":9}}],["something",{"2":{"1":1}}],["some",{"2":{"0":1,"1":1,"17":1,"47":1,"49":1,"86":1,"106":1,"111":1,"116":1,"119":1,"122":1,"136":1,"138":1,"146":1,"150":1,"155":1}}],["silent",{"2":{"155":4,"157":1}}],["situations",{"2":{"51":1}}],["sink",{"2":{"41":3}}],["since",{"2":{"14":1,"23":1,"25":1,"157":1}}],["single",{"2":{"1":3,"86":1,"117":1,"120":2}}],["significance",{"2":{"76":1}}],["signature",{"2":{"0":2,"1":2,"108":2}}],["sig",{"2":{"1":17,"113":10,"114":6}}],["simulated",{"2":{"81":1}}],["simplify",{"2":{"91":1}}],["simplified",{"2":{"1":3}}],["simply",{"2":{"1":2,"15":1,"21":1,"58":2,"61":1,"64":1,"69":1,"72":1,"86":1,"106":1,"138":1}}],["simple",{"2":{"0":2,"1":2,"20":1,"73":1,"86":2}}],["similar",{"2":{"0":1,"1":1,"13":1,"31":1,"55":1,"57":1}}],["size",{"2":{"0":16,"1":32,"13":1,"20":1,"38":3,"41":3,"43":1,"57":5,"60":8,"63":8,"67":2,"71":1,"108":1,"110":2,"124":3,"125":3,"134":2,"136":7,"157":4}}],["successfully",{"2":{"94":1}}],["such",{"2":{"1":5,"2":1,"8":1,"18":1,"19":1,"20":2,"23":3,"25":2,"28":1,"41":2,"43":2,"55":2,"71":2,"77":1,"110":1,"115":1,"155":1,"157":4}}],["suitable",{"2":{"55":1}}],["sudoku",{"2":{"41":17,"86":4,"157":1}}],["sudokuinstances",{"2":{"41":1}}],["sudokuinstance",{"2":{"41":19}}],["sub",{"2":{"136":1,"157":1}}],["subgrid",{"2":{"86":1}}],["subgrids",{"2":{"86":1}}],["subtype",{"2":{"41":1}}],["subtract",{"2":{"1":1,"115":1}}],["subtraction",{"2":{"1":1,"115":1}}],["subs",{"2":{"157":3}}],["subsolvers",{"2":{"157":4}}],["subsolver",{"2":{"157":6}}],["subsets",{"2":{"86":2}}],["subset",{"2":{"5":1,"155":1}}],["substituted",{"2":{"0":1,"1":1}}],["substituting",{"2":{"0":1,"1":1}}],["supplies",{"2":{"41":1}}],["support",{"2":{"1":1,"155":1}}],["supported",{"2":{"1":4,"155":2}}],["supports",{"2":{"1":7,"8":1,"155":13}}],["supports=nothing",{"2":{"1":1}}],["supertype",{"2":{"0":2,"1":2,"13":1,"60":1,"63":1}}],["super",{"2":{"0":1,"1":1,"13":1,"57":1}}],["summing",{"0":{"32":1}}],["sum",{"2":{"0":5,"1":24,"4":1,"31":8,"32":8,"36":2,"41":1,"61":1,"64":1,"67":2,"117":2,"120":3,"128":3,"155":3}}],["series",{"2":{"86":1,"157":1}}],["serves",{"2":{"42":1}}],["server",{"2":{"0":4,"1":4}}],["segment",{"2":{"41":3}}],["sec",{"2":{"157":1}}],["section",{"2":{"24":1,"43":1,"146":1,"150":1}}],["seconds=d",{"2":{"143":1}}],["seconds",{"2":{"140":1,"143":1,"148":2,"149":1,"152":1,"157":1}}],["second",{"2":{"1":10,"34":2,"36":8}}],["several",{"2":{"11":1,"51":1,"85":1,"110":1}}],["separator",{"2":{"41":1}}],["separates",{"2":{"1":1,"108":1}}],["sep",{"2":{"1":2,"41":2,"108":2}}],["select",{"2":{"138":1,"157":4}}],["selection",{"2":{"1":1,"115":1}}],["selected",{"2":{"0":4,"1":8,"110":6,"118":1,"121":1,"126":1,"136":2,"157":1}}],["sequence",{"2":{"1":10,"28":4,"38":6,"155":3}}],["seen",{"2":{"4":1}}],["see",{"2":{"0":2,"1":2,"18":2,"24":1,"157":1}}],["searching",{"2":{"0":2,"1":2,"67":1}}],["search",{"0":{"92":1,"135":1},"2":{"0":27,"1":28,"49":1,"67":16,"81":1,"92":1,"110":1,"155":1,"157":1}}],["setter",{"2":{"86":1}}],["setting",{"0":{"85":1},"2":{"157":1}}],["settings",{"2":{"0":8,"1":8,"67":8,"157":1}}],["setup",{"2":{"85":1}}],["sets",{"2":{"0":1,"1":3,"8":1,"16":1,"17":1,"34":2,"67":1,"136":3}}],["setdomain",{"0":{"15":1},"2":{"0":5,"1":5,"15":1,"16":1,"57":1,"60":1,"63":3,"64":2}}],["set",{"2":{"0":11,"1":34,"4":1,"6":1,"7":1,"15":1,"18":1,"26":2,"32":3,"34":4,"40":2,"41":4,"45":1,"47":2,"55":3,"58":2,"61":1,"63":3,"64":1,"69":1,"106":1,"108":1,"115":1,"126":1,"129":2,"136":11,"155":68,"157":22}}],["s2",{"2":{"0":1,"1":1,"47":1}}],["s1",{"2":{"0":1,"1":1,"47":1}}],["s",{"2":{"0":18,"1":26,"13":2,"21":4,"41":5,"43":3,"45":6,"57":2,"60":1,"63":1,"67":2,"72":4,"86":1,"141":1,"143":1,"153":1,"157":109}}],["authors",{"2":{"137":1}}],["auto",{"2":{"134":1}}],["automated",{"2":{"1":1}}],["automatically",{"2":{"1":1}}],["automata",{"2":{"1":1,"45":2}}],["automaton",{"2":{"0":3,"1":17,"20":1,"28":8,"43":1,"45":5,"69":4,"71":1,"106":4,"155":2}}],["among",{"2":{"136":1,"157":1}}],["amount",{"2":{"41":1}}],["aka",{"2":{"56":1}}],["a2",{"2":{"31":2}}],["a1",{"2":{"31":2}}],["about",{"0":{"105":1},"1":{"106":1},"2":{"12":1,"19":1,"55":1,"56":1,"70":1,"105":1,"154":1,"155":1,"157":1}}],["above",{"2":{"1":1}}],["absolute",{"2":{"1":3,"124":1,"125":1}}],["abs",{"2":{"0":1,"1":5,"20":1,"24":2,"25":6,"26":6,"73":1,"124":2,"125":2}}],["abstractstate",{"2":{"157":1}}],["abstractstring",{"2":{"0":1,"1":6,"157":2}}],["abstractstring=",{"2":{"0":1,"1":1,"47":1}}],["abstractsolver",{"2":{"157":70}}],["abstractscalarset",{"2":{"155":2}}],["abstractscalarfunction",{"2":{"155":1}}],["abstractmatrix",{"2":{"41":4}}],["abstractmultivalueddecisiondiagram",{"2":{"0":1,"1":3,"45":3,"155":1}}],["abstractvectorset",{"2":{"155":22}}],["abstractvectorfold",{"2":{"55":4,"58":4,"61":2,"64":2,"69":2,"106":2}}],["abstractvector",{"2":{"1":31,"34":4,"36":5,"38":1,"40":2,"55":4,"108":1,"113":11,"114":6,"157":1}}],["abstractprompt",{"2":{"0":2,"1":2}}],["abstractllm",{"2":{"0":3,"1":6}}],["abstractoptimizer",{"2":{"0":1,"1":2,"132":2,"134":1,"136":2,"155":1}}],["abstractrange",{"2":{"0":2,"1":2,"57":1,"60":1,"63":2}}],["abstract",{"2":{"0":3,"1":6,"13":2,"42":1,"45":2,"55":1,"57":1,"60":1,"63":1,"132":1,"136":2,"157":2}}],["abstractdomain",{"0":{"13":1},"2":{"0":10,"1":27,"13":5,"57":5,"58":6,"60":4,"61":5,"63":4,"64":5,"66":1,"69":10,"106":10,"157":6}}],["abstractdictionary",{"2":{"0":1,"1":1,"53":1}}],["abstractdict",{"2":{"0":1,"1":1,"53":1}}],["abstractautomaton",{"2":{"0":1,"1":7,"28":3,"45":3,"69":1,"106":1,"155":2}}],["after",{"2":{"1":1,"55":1,"144":1}}],["affects",{"2":{"112":1,"123":1}}],["affect",{"2":{"0":1,"1":1,"109":1}}],["advantages",{"2":{"84":1}}],["advanced",{"0":{"90":1},"1":{"91":1,"92":1},"2":{"42":1}}],["adjusted",{"2":{"1":1}}],["adds",{"2":{"1":4}}],["added",{"2":{"1":2,"24":1,"25":1,"155":1}}],["adding",{"2":{"0":2,"1":2,"20":2,"73":2}}],["additional",{"2":{"0":1,"1":1,"67":1}}],["additionally",{"2":{"0":1,"1":1,"13":1,"57":1}}],["add",{"2":{"0":3,"1":7,"13":1,"15":8,"16":4,"23":1,"24":1,"25":3,"26":3,"57":1,"63":2,"85":1,"86":4,"155":9,"157":19}}],["aggragation",{"2":{"116":1}}],["aggregate",{"2":{"1":1,"117":1}}],["aggregations",{"0":{"117":1},"2":{"0":1,"1":1,"118":1}}],["aggregation",{"0":{"116":1},"1":{"117":1,"118":1},"2":{"0":4,"1":4,"118":1}}],["again",{"2":{"41":1}}],["against",{"2":{"0":1,"1":3,"40":1,"115":1}}],["ag",{"2":{"1":2,"117":2}}],["ai",{"2":{"0":2,"1":2}}],["achieve",{"2":{"137":1}}],["across",{"2":{"11":1,"149":1}}],["active",{"2":{"55":1}}],["action",{"2":{"0":2,"1":2}}],["acts",{"2":{"19":1,"70":1}}],["actual",{"2":{"0":1,"1":3,"5":1,"149":1}}],["accurate",{"2":{"134":2}}],["accessing",{"2":{"0":6,"1":6}}],["access",{"2":{"0":4,"1":5,"57":1,"110":1,"157":20}}],["acceptable",{"2":{"1":2,"155":1}}],["accepted",{"2":{"0":2,"1":4,"28":2,"155":1}}],["accepts",{"2":{"0":1,"1":3,"41":4,"45":3,"69":1,"106":1}}],["accept",{"2":{"0":1,"1":7,"45":6,"69":3,"106":3}}],["according",{"2":{"0":1,"1":2,"67":1,"115":1,"149":1,"155":1}}],["alternative",{"2":{"110":1}}],["alternatively",{"2":{"25":1,"26":1}}],["although",{"2":{"85":1}}],["already",{"2":{"1":3,"86":1,"113":1,"124":1,"136":1,"157":1}}],["along",{"2":{"1":1,"2":1,"20":1,"43":1,"71":1,"85":1}}],["algorithms",{"2":{"81":1}}],["algorithm",{"2":{"0":4,"1":4,"136":3}}],["also",{"2":{"0":2,"1":5,"6":1,"12":1,"19":1,"32":3,"70":1,"86":1,"115":1,"126":1,"145":1}}],["allequal",{"2":{"29":1,"155":2}}],["alldifferent",{"2":{"29":2,"86":5,"155":2}}],["allocs",{"2":{"145":4,"149":1}}],["allocation",{"2":{"55":1}}],["allocations",{"2":{"1":17,"113":10,"114":6,"149":1}}],["allow",{"2":{"26":1,"55":1}}],["allows",{"2":{"16":1}}],["allowing",{"2":{"1":3,"115":1,"155":1}}],["allunique",{"2":{"0":1,"1":1,"67":1}}],["all",{"2":{"0":11,"1":46,"2":1,"13":1,"20":4,"21":1,"26":1,"29":10,"30":24,"32":1,"41":1,"43":1,"51":1,"60":1,"71":1,"72":1,"73":3,"85":1,"86":2,"108":2,"115":1,"126":1,"147":1,"151":1,"153":2,"155":6,"157":4}}],["avoid",{"2":{"0":1,"1":2,"55":1,"155":2,"157":1}}],["available",{"2":{"0":3,"1":4,"20":1,"23":1,"25":1,"41":2,"55":2,"73":1,"85":2,"115":1,"157":1}}],["approach",{"2":{"86":1}}],["appropriate",{"2":{"0":1,"1":2,"115":1,"143":1,"145":1}}],["appear",{"2":{"1":3,"32":3}}],["applications",{"0":{"94":1}}],["application",{"2":{"1":1,"3":1,"5":1,"19":1,"70":1,"108":1}}],["applies",{"2":{"1":1,"108":1,"155":1}}],["applied",{"2":{"0":2,"1":3,"5":1,"21":1,"72":1,"86":1,"94":1,"115":1,"155":1,"157":2}}],["applying",{"0":{"93":1},"1":{"94":1,"95":1}}],["apply",{"2":{"0":6,"1":8,"21":4,"72":4,"115":2}}],["apixcspjumpmoi",{"2":{"25":1,"26":1,"29":3,"31":4,"33":4,"35":2}}],["apis",{"0":{"25":1}}],["apicbls",{"2":{"15":1,"16":1,"18":1}}],["api",{"0":{"0":1,"1":1,"9":1,"24":1,"153":1},"2":{"0":24,"1":24,"2":1,"20":2,"23":1,"25":1,"71":2,"153":1}}],["attribution",{"2":{"157":1}}],["attributed",{"2":{"157":6}}],["attribute",{"2":{"157":2}}],["attached",{"2":{"157":1}}],["atoms",{"2":{"41":1}}],["atmost",{"2":{"31":1,"155":2}}],["atleast",{"2":{"31":1,"155":2}}],["at",{"2":{"0":3,"1":15,"13":1,"18":1,"20":1,"31":12,"32":8,"36":2,"41":1,"45":1,"55":1,"73":1,"85":1,"110":2,"129":1,"136":2,"155":3,"157":1}}],["arrange",{"2":{"153":3}}],["arrangement",{"2":{"136":1}}],["array",{"2":{"31":1}}],["ar",{"2":{"1":2,"120":2}}],["arbitrary",{"0":{"17":1},"2":{"1":2,"17":1,"63":1,"142":1}}],["arbitrarydomain",{"2":{"1":1,"63":1}}],["arithmetic",{"0":{"119":1,"120":1},"1":{"120":1,"121":1},"2":{"0":5,"1":6,"20":1,"43":1,"71":1,"119":1,"121":2}}],["arxiv",{"2":{"0":1,"1":1,"20":1,"73":1}}],["areas",{"2":{"104":1}}],["are",{"2":{"0":11,"1":49,"8":1,"10":1,"11":1,"12":1,"13":1,"16":1,"17":1,"20":3,"21":2,"22":1,"23":4,"24":2,"26":4,"30":10,"36":2,"41":5,"42":1,"43":1,"49":1,"56":1,"60":1,"63":1,"71":3,"72":2,"86":1,"110":2,"113":10,"114":5,"115":1,"118":1,"121":1,"126":1,"138":1,"139":1,"142":1,"143":1,"145":2,"148":1,"152":1,"155":8,"157":2}}],["argmax",{"2":{"157":3}}],["argument",{"2":{"1":7,"20":1,"41":4,"71":1,"155":1}}],["arguments",{"2":{"0":21,"1":54,"20":4,"21":3,"28":2,"30":3,"32":4,"34":4,"36":2,"38":1,"40":1,"41":1,"43":1,"57":1,"60":1,"67":4,"71":1,"72":3,"73":3,"155":27,"157":8}}],["args",{"2":{"0":10,"1":13,"13":3,"21":4,"57":4,"72":4,"132":1,"136":3}}],["aspect",{"2":{"12":1}}],["aspects",{"0":{"11":1}}],["assert",{"2":{"1":1,"110":1}}],["assigned",{"2":{"6":1}}],["assign",{"2":{"0":1,"1":1,"41":1,"157":1}}],["assignments",{"2":{"0":1,"1":1,"7":1}}],["assignment",{"2":{"0":1,"1":1,"3":1,"6":1,"41":1}}],["associated",{"2":{"0":1,"1":2,"41":1,"67":1,"86":1,"110":1,"141":1}}],["as",{"2":{"0":11,"1":37,"2":1,"4":1,"6":1,"8":1,"12":1,"15":1,"16":5,"17":2,"18":2,"19":2,"20":6,"23":3,"25":3,"26":1,"28":2,"32":3,"41":3,"42":1,"43":2,"45":1,"49":1,"55":6,"58":2,"60":1,"61":1,"63":3,"64":1,"69":1,"70":1,"71":3,"73":3,"77":1,"85":1,"86":1,"106":1,"108":2,"110":1,"113":1,"115":1,"124":1,"136":1,"138":5,"139":1,"148":1,"152":1,"153":1,"155":4,"157":6}}],["analyze",{"2":{"98":1}}],["analyzing",{"0":{"96":1},"1":{"97":1,"98":1}}],["analysis",{"0":{"98":1,"101":1},"2":{"101":1}}],["annealing",{"2":{"81":1}}],["annotation",{"2":{"0":1,"1":1}}],["anonymous",{"2":{"1":1,"108":1}}],["another",{"2":{"1":2,"21":1,"34":2,"72":1}}],["an",{"0":{"24":1},"2":{"0":33,"1":79,"2":1,"6":1,"13":2,"20":3,"24":1,"25":1,"28":3,"30":3,"32":1,"41":3,"42":1,"43":3,"45":2,"47":1,"55":6,"57":2,"60":6,"61":1,"63":3,"64":1,"67":7,"71":3,"74":2,"86":1,"95":1,"108":4,"110":6,"111":1,"114":1,"115":1,"124":1,"125":1,"132":1,"136":7,"137":1,"138":1,"139":1,"145":1,"149":1,"155":12,"157":11}}],["any",{"0":{"110":1},"2":{"0":9,"1":20,"13":1,"36":6,"41":1,"47":1,"55":1,"57":2,"58":1,"61":1,"64":1,"132":1,"138":1,"155":4,"157":1}}],["and",{"0":{"12":1,"20":1,"21":1,"27":1,"29":1,"31":1,"32":1,"33":1,"35":1,"36":1,"37":1,"39":1,"56":1,"72":1,"77":1,"83":1,"89":1,"91":1,"92":1,"94":1,"96":1,"98":1,"99":1,"102":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"28":1,"30":1,"32":1,"34":1,"36":1,"38":1,"40":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"84":1,"85":1,"86":1,"97":1,"98":1,"100":1,"101":1,"103":1,"104":1},"2":{"0":37,"1":81,"2":3,"3":1,"4":2,"5":1,"6":2,"7":3,"8":1,"9":2,"10":2,"11":2,"12":5,"13":3,"16":1,"19":3,"20":1,"21":4,"22":1,"23":1,"26":1,"28":1,"31":2,"32":1,"34":2,"38":2,"41":13,"42":4,"43":1,"45":1,"47":1,"49":1,"51":1,"55":7,"56":2,"57":2,"60":2,"63":1,"67":4,"69":2,"70":3,"72":4,"73":1,"74":2,"76":1,"77":1,"78":1,"81":1,"82":1,"84":2,"85":2,"86":4,"88":1,"89":1,"91":1,"92":1,"94":1,"95":1,"97":2,"98":1,"100":1,"101":1,"103":1,"104":1,"106":2,"108":1,"110":3,"112":1,"113":5,"114":1,"115":3,"123":1,"124":1,"125":1,"128":1,"129":1,"136":10,"138":1,"140":1,"146":1,"149":2,"150":1,"153":1,"155":10,"157":11}}],["a",{"0":{"7":1,"9":1,"10":1,"110":1,"145":1},"2":{"0":105,"1":332,"2":1,"3":5,"4":6,"5":5,"6":4,"7":3,"9":2,"10":1,"13":4,"15":2,"16":2,"17":2,"19":1,"20":10,"21":5,"23":10,"24":2,"25":3,"26":4,"28":29,"29":2,"30":3,"32":13,"33":1,"34":22,"36":8,"38":8,"40":8,"41":26,"42":1,"43":4,"45":11,"53":2,"55":10,"57":9,"58":21,"60":8,"61":18,"63":8,"64":18,"67":11,"69":16,"70":2,"71":4,"72":5,"73":6,"85":2,"86":12,"95":1,"106":16,"108":8,"109":4,"110":17,"111":1,"115":10,"117":2,"120":2,"124":1,"125":1,"128":2,"129":7,"132":1,"136":23,"137":3,"138":8,"139":2,"140":1,"144":1,"145":1,"146":1,"149":1,"150":1,"153":3,"155":48,"157":51}}]],"serializationVersion":2}';export{t as default};
diff --git a/dev/assets/chunks/VPLocalSearchBox.ChJ1UMYp.js b/dev/assets/chunks/VPLocalSearchBox.B1FKPByJ.js
similarity index 99%
rename from dev/assets/chunks/VPLocalSearchBox.ChJ1UMYp.js
rename to dev/assets/chunks/VPLocalSearchBox.B1FKPByJ.js
index 32a82bd..3dcb840 100644
--- a/dev/assets/chunks/VPLocalSearchBox.ChJ1UMYp.js
+++ b/dev/assets/chunks/VPLocalSearchBox.B1FKPByJ.js
@@ -1,4 +1,4 @@
-var Nt=Object.defineProperty;var Ft=(a,e,t)=>e in a?Nt(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var Re=(a,e,t)=>Ft(a,typeof e!="symbol"?e+"":e,t);import{V as Ot,p as se,h as pe,aj as Xe,ak as Rt,al as Ct,q as je,am as Mt,d as At,D as ye,an as et,ao as Lt,ap as Dt,s as zt,aq as Pt,v as Ce,P as ue,O as we,ar as jt,as as Vt,W as $t,R as Bt,$ as Wt,o as q,b as Kt,j as S,a0 as Jt,k as D,at as Ut,au as qt,av as Gt,c as Y,n as tt,e as xe,C as st,F as nt,a as de,t as he,aw as Ht,ax as it,ay as Qt,a9 as Yt,af as Zt,az as Xt,_ as es}from"./framework.CJakPlgM.js";import{u as ts,c as ss}from"./theme.C_ksEfTU.js";const ns={root:()=>Ot(()=>import("./@localSearchIndexroot.BsFtsJ1K.js"),[])};/*!
+var Nt=Object.defineProperty;var Ft=(a,e,t)=>e in a?Nt(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var Re=(a,e,t)=>Ft(a,typeof e!="symbol"?e+"":e,t);import{V as Ot,p as se,h as pe,aj as Xe,ak as Rt,al as Ct,q as je,am as Mt,d as At,D as ye,an as et,ao as Lt,ap as Dt,s as zt,aq as Pt,v as Ce,P as ue,O as we,ar as jt,as as Vt,W as $t,R as Bt,$ as Wt,o as q,b as Kt,j as S,a0 as Jt,k as D,at as Ut,au as qt,av as Gt,c as Y,n as tt,e as xe,C as st,F as nt,a as de,t as he,aw as Ht,ax as it,ay as Qt,a9 as Yt,af as Zt,az as Xt,_ as es}from"./framework.CJakPlgM.js";import{u as ts,c as ss}from"./theme.CrvsPs-y.js";const ns={root:()=>Ot(()=>import("./@localSearchIndexroot.YbY6v__g.js"),[])};/*!
 * tabbable 6.2.0
 * @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE
 */var vt=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],Ie=vt.join(","),mt=typeof Element>"u",ie=mt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,ke=!mt&&Element.prototype.getRootNode?function(a){var e;return a==null||(e=a.getRootNode)===null||e===void 0?void 0:e.call(a)}:function(a){return a==null?void 0:a.ownerDocument},Ne=function a(e,t){var s;t===void 0&&(t=!0);var n=e==null||(s=e.getAttribute)===null||s===void 0?void 0:s.call(e,"inert"),r=n===""||n==="true",i=r||t&&e&&a(e.parentNode);return i},is=function(e){var t,s=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return s===""||s==="true"},gt=function(e,t,s){if(Ne(e))return[];var n=Array.prototype.slice.apply(e.querySelectorAll(Ie));return t&&ie.call(e,Ie)&&n.unshift(e),n=n.filter(s),n},bt=function a(e,t,s){for(var n=[],r=Array.from(e);r.length;){var i=r.shift();if(!Ne(i,!1))if(i.tagName==="SLOT"){var o=i.assignedElements(),l=o.length?o:i.children,c=a(l,!0,s);s.flatten?n.push.apply(n,c):n.push({scopeParent:i,candidates:c})}else{var h=ie.call(i,Ie);h&&s.filter(i)&&(t||!e.includes(i))&&n.push(i);var v=i.shadowRoot||typeof s.getShadowRoot=="function"&&s.getShadowRoot(i),p=!Ne(v,!1)&&(!s.shadowRootFilter||s.shadowRootFilter(i));if(v&&p){var b=a(v===!0?i.children:v.children,!0,s);s.flatten?n.push.apply(n,b):n.push({scopeParent:i,candidates:b})}else r.unshift.apply(r,i.children)}}return n},yt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},ne=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||is(e))&&!yt(e)?0:e.tabIndex},rs=function(e,t){var s=ne(e);return s<0&&t&&!yt(e)?0:s},as=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},wt=function(e){return e.tagName==="INPUT"},os=function(e){return wt(e)&&e.type==="hidden"},ls=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(s){return s.tagName==="SUMMARY"});return t},cs=function(e,t){for(var s=0;ssummary:first-of-type"),i=r?e.parentElement:e;if(ie.call(i,"details:not([open]) *"))return!0;if(!s||s==="full"||s==="legacy-full"){if(typeof n=="function"){for(var o=e;e;){var l=e.parentElement,c=ke(e);if(l&&!l.shadowRoot&&n(l)===!0)return rt(e);e.assignedSlot?e=e.assignedSlot:!l&&c!==e.ownerDocument?e=c.host:e=l}e=o}if(fs(e))return!e.getClientRects().length;if(s!=="legacy-full")return!0}else if(s==="non-zero-area")return rt(e);return!1},vs=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var s=0;s=0)},gs=function a(e){var t=[],s=[];return e.forEach(function(n,r){var i=!!n.scopeParent,o=i?n.scopeParent:n,l=rs(o,i),c=i?a(n.candidates):o;l===0?i?t.push.apply(t,c):t.push(o):s.push({documentOrder:r,tabIndex:l,item:n,isScope:i,content:c})}),s.sort(as).reduce(function(n,r){return r.isScope?n.push.apply(n,r.content):n.push(r.content),n},[]).concat(t)},bs=function(e,t){t=t||{};var s;return t.getShadowRoot?s=bt([e],t.includeContainer,{filter:Ve.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:ms}):s=gt(e,t.includeContainer,Ve.bind(null,t)),gs(s)},ys=function(e,t){t=t||{};var s;return t.getShadowRoot?s=bt([e],t.includeContainer,{filter:Fe.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):s=gt(e,t.includeContainer,Fe.bind(null,t)),s},re=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ie.call(e,Ie)===!1?!1:Ve(t,e)},ws=vt.concat("iframe").join(","),Me=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ie.call(e,ws)===!1?!1:Fe(t,e)};/*!
diff --git a/dev/assets/chunks/theme.C_ksEfTU.js b/dev/assets/chunks/theme.CrvsPs-y.js
similarity index 99%
rename from dev/assets/chunks/theme.C_ksEfTU.js
rename to dev/assets/chunks/theme.CrvsPs-y.js
index 97ebb38..3bba294 100644
--- a/dev/assets/chunks/theme.C_ksEfTU.js
+++ b/dev/assets/chunks/theme.CrvsPs-y.js
@@ -1,2 +1,2 @@
-const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPLocalSearchBox.ChJ1UMYp.js","assets/chunks/framework.CJakPlgM.js"])))=>i.map(i=>d[i]);
-import{d as m,o as a,c as u,r as c,n as I,a as O,t as w,b as g,w as f,e as h,T as de,_ as $,u as je,i as Ge,f as ze,g as ve,h as y,j as p,k as r,l as K,m as re,p as T,q as F,s as Z,v as z,x as pe,y as fe,z as Ke,A as Re,B as R,F as M,C as B,D as Ve,E as x,G as k,H as E,I as Le,J as ee,K as G,L as q,M as We,N as Te,O as ie,P as Ne,Q as we,R as te,S as qe,U as Je,V as Ye,W as Ie,X as he,Y as Xe,Z as Qe,$ as Ze,a0 as xe,a1 as Me,a2 as et,a3 as tt,a4 as nt}from"./framework.CJakPlgM.js";const st=m({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(o){return(e,t)=>(a(),u("span",{class:I(["VPBadge",e.type])},[c(e.$slots,"default",{},()=>[O(w(e.text),1)])],2))}}),ot={key:0,class:"VPBackdrop"},at=m({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(o){return(e,t)=>(a(),g(de,{name:"fade"},{default:f(()=>[e.show?(a(),u("div",ot)):h("",!0)]),_:1}))}}),rt=$(at,[["__scopeId","data-v-b06cdb19"]]),L=je;function it(o,e){let t,s=!1;return()=>{t&&clearTimeout(t),s?t=setTimeout(o,e):(o(),(s=!0)&&setTimeout(()=>s=!1,e))}}function le(o){return/^\//.test(o)?o:`/${o}`}function me(o){const{pathname:e,search:t,hash:s,protocol:n}=new URL(o,"http://a.com");if(Ge(o)||o.startsWith("#")||!n.startsWith("http")||!ze(e))return o;const{site:i}=L(),l=e.endsWith("/")||e.endsWith(".html")?o:o.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,i.value.cleanUrls?"":".html")}${t}${s}`);return ve(l)}function Y({correspondingLink:o=!1}={}){const{site:e,localeIndex:t,page:s,theme:n,hash:i}=L(),l=y(()=>{var d,_;return{label:(d=e.value.locales[t.value])==null?void 0:d.label,link:((_=e.value.locales[t.value])==null?void 0:_.link)||(t.value==="root"?"/":`/${t.value}/`)}});return{localeLinks:y(()=>Object.entries(e.value.locales).flatMap(([d,_])=>l.value.label===_.label?[]:{text:_.label,link:lt(_.link||(d==="root"?"/":`/${d}/`),n.value.i18nRouting!==!1&&o,s.value.relativePath.slice(l.value.link.length-1),!e.value.cleanUrls)+i.value})),currentLang:l}}function lt(o,e,t,s){return e?o.replace(/\/$/,"")+le(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,s?".html":"")):o}const ct={class:"NotFound"},ut={class:"code"},dt={class:"title"},vt={class:"quote"},pt={class:"action"},ft=["href","aria-label"],ht=m({__name:"NotFound",setup(o){const{theme:e}=L(),{currentLang:t}=Y();return(s,n)=>{var i,l,v,d,_;return a(),u("div",ct,[p("p",ut,w(((i=r(e).notFound)==null?void 0:i.code)??"404"),1),p("h1",dt,w(((l=r(e).notFound)==null?void 0:l.title)??"PAGE NOT FOUND"),1),n[0]||(n[0]=p("div",{class:"divider"},null,-1)),p("blockquote",vt,w(((v=r(e).notFound)==null?void 0:v.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),p("div",pt,[p("a",{class:"link",href:r(ve)(r(t).link),"aria-label":((d=r(e).notFound)==null?void 0:d.linkLabel)??"go to home"},w(((_=r(e).notFound)==null?void 0:_.linkText)??"Take me home"),9,ft)])])}}}),mt=$(ht,[["__scopeId","data-v-951cab6c"]]);function Ae(o,e){if(Array.isArray(o))return X(o);if(o==null)return[];e=le(e);const t=Object.keys(o).sort((n,i)=>i.split("/").length-n.split("/").length).find(n=>e.startsWith(le(n))),s=t?o[t]:[];return Array.isArray(s)?X(s):X(s.items,s.base)}function _t(o){const e=[];let t=0;for(const s in o){const n=o[s];if(n.items){t=e.push(n);continue}e[t]||e.push({items:[]}),e[t].items.push(n)}return e}function bt(o){const e=[];function t(s){for(const n of s)n.text&&n.link&&e.push({text:n.text,link:n.link,docFooterText:n.docFooterText}),n.items&&t(n.items)}return t(o),e}function ce(o,e){return Array.isArray(e)?e.some(t=>ce(o,t)):K(o,e.link)?!0:e.items?ce(o,e.items):!1}function X(o,e){return[...o].map(t=>{const s={...t},n=s.base||e;return n&&s.link&&(s.link=n+s.link),s.items&&(s.items=X(s.items,n)),s})}function U(){const{frontmatter:o,page:e,theme:t}=L(),s=re("(min-width: 960px)"),n=T(!1),i=y(()=>{const C=t.value.sidebar,N=e.value.relativePath;return C?Ae(C,N):[]}),l=T(i.value);F(i,(C,N)=>{JSON.stringify(C)!==JSON.stringify(N)&&(l.value=i.value)});const v=y(()=>o.value.sidebar!==!1&&l.value.length>0&&o.value.layout!=="home"),d=y(()=>_?o.value.aside==null?t.value.aside==="left":o.value.aside==="left":!1),_=y(()=>o.value.layout==="home"?!1:o.value.aside!=null?!!o.value.aside:t.value.aside!==!1),V=y(()=>v.value&&s.value),b=y(()=>v.value?_t(l.value):[]);function P(){n.value=!0}function S(){n.value=!1}function A(){n.value?S():P()}return{isOpen:n,sidebar:l,sidebarGroups:b,hasSidebar:v,hasAside:_,leftAside:d,isSidebarEnabled:V,open:P,close:S,toggle:A}}function kt(o,e){let t;Z(()=>{t=o.value?document.activeElement:void 0}),z(()=>{window.addEventListener("keyup",s)}),pe(()=>{window.removeEventListener("keyup",s)});function s(n){n.key==="Escape"&&o.value&&(e(),t==null||t.focus())}}function gt(o){const{page:e,hash:t}=L(),s=T(!1),n=y(()=>o.value.collapsed!=null),i=y(()=>!!o.value.link),l=T(!1),v=()=>{l.value=K(e.value.relativePath,o.value.link)};F([e,o,t],v),z(v);const d=y(()=>l.value?!0:o.value.items?ce(e.value.relativePath,o.value.items):!1),_=y(()=>!!(o.value.items&&o.value.items.length));Z(()=>{s.value=!!(n.value&&o.value.collapsed)}),fe(()=>{(l.value||d.value)&&(s.value=!1)});function V(){n.value&&(s.value=!s.value)}return{collapsed:s,collapsible:n,isLink:i,isActiveLink:l,hasActiveLink:d,hasChildren:_,toggle:V}}function $t(){const{hasSidebar:o}=U(),e=re("(min-width: 960px)"),t=re("(min-width: 1280px)");return{isAsideEnabled:y(()=>!t.value&&!e.value?!1:o.value?t.value:e.value)}}const ue=[];function Ce(o){return typeof o.outline=="object"&&!Array.isArray(o.outline)&&o.outline.label||o.outlineTitle||"On this page"}function _e(o){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const s=Number(t.tagName[1]);return{element:t,title:yt(t),link:"#"+t.id,level:s}});return Pt(e,o)}function yt(o){let e="";for(const t of o.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor")||t.classList.contains("ignore-header"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function Pt(o,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[s,n]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;o=o.filter(l=>l.level>=s&&l.level<=n),ue.length=0;for(const{element:l,link:v}of o)ue.push({element:l,link:v});const i=[];e:for(let l=0;l=0;d--){const _=o[d];if(_.level{requestAnimationFrame(i),window.addEventListener("scroll",s)}),Ke(()=>{l(location.hash)}),pe(()=>{window.removeEventListener("scroll",s)});function i(){if(!t.value)return;const v=window.scrollY,d=window.innerHeight,_=document.body.offsetHeight,V=Math.abs(v+d-_)<1,b=ue.map(({element:S,link:A})=>({link:A,top:Vt(S)})).filter(({top:S})=>!Number.isNaN(S)).sort((S,A)=>S.top-A.top);if(!b.length){l(null);return}if(v<1){l(null);return}if(V){l(b[b.length-1].link);return}let P=null;for(const{link:S,top:A}of b){if(A>v+Re()+4)break;P=S}l(P)}function l(v){n&&n.classList.remove("active"),v==null?n=null:n=o.value.querySelector(`a[href="${decodeURIComponent(v)}"]`);const d=n;d?(d.classList.add("active"),e.value.style.top=d.offsetTop+39+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function Vt(o){let e=0;for(;o!==document.body;){if(o===null)return NaN;e+=o.offsetTop,o=o.offsetParent}return e}const Lt=["href","title"],Tt=m({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(o){function e({target:t}){const s=t.href.split("#")[1],n=document.getElementById(decodeURIComponent(s));n==null||n.focus({preventScroll:!0})}return(t,s)=>{const n=R("VPDocOutlineItem",!0);return a(),u("ul",{class:I(["VPDocOutlineItem",t.root?"root":"nested"])},[(a(!0),u(M,null,B(t.headers,({children:i,link:l,title:v})=>(a(),u("li",null,[p("a",{class:"outline-link",href:l,onClick:e,title:v},w(v),9,Lt),i!=null&&i.length?(a(),g(n,{key:0,headers:i},null,8,["headers"])):h("",!0)]))),256))],2)}}}),Be=$(Tt,[["__scopeId","data-v-3f927ebe"]]),Nt={class:"content"},wt={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},It=m({__name:"VPDocAsideOutline",setup(o){const{frontmatter:e,theme:t}=L(),s=Ve([]);x(()=>{s.value=_e(e.value.outline??t.value.outline)});const n=T(),i=T();return St(n,i),(l,v)=>(a(),u("nav",{"aria-labelledby":"doc-outline-aria-label",class:I(["VPDocAsideOutline",{"has-outline":s.value.length>0}]),ref_key:"container",ref:n},[p("div",Nt,[p("div",{class:"outline-marker",ref_key:"marker",ref:i},null,512),p("div",wt,w(r(Ce)(r(t))),1),k(Be,{headers:s.value,root:!0},null,8,["headers"])])],2))}}),Mt=$(It,[["__scopeId","data-v-b38bf2ff"]]),At={class:"VPDocAsideCarbonAds"},Ct=m({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(o){const e=()=>null;return(t,s)=>(a(),u("div",At,[k(r(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),Bt={class:"VPDocAside"},Ht=m({__name:"VPDocAside",setup(o){const{theme:e}=L();return(t,s)=>(a(),u("div",Bt,[c(t.$slots,"aside-top",{},void 0,!0),c(t.$slots,"aside-outline-before",{},void 0,!0),k(Mt),c(t.$slots,"aside-outline-after",{},void 0,!0),s[0]||(s[0]=p("div",{class:"spacer"},null,-1)),c(t.$slots,"aside-ads-before",{},void 0,!0),r(e).carbonAds?(a(),g(Ct,{key:0,"carbon-ads":r(e).carbonAds},null,8,["carbon-ads"])):h("",!0),c(t.$slots,"aside-ads-after",{},void 0,!0),c(t.$slots,"aside-bottom",{},void 0,!0)]))}}),Et=$(Ht,[["__scopeId","data-v-6d7b3c46"]]);function Dt(){const{theme:o,page:e}=L();return y(()=>{const{text:t="Edit this page",pattern:s=""}=o.value.editLink||{};let n;return typeof s=="function"?n=s(e.value):n=s.replace(/:path/g,e.value.filePath),{url:n,text:t}})}function Ft(){const{page:o,theme:e,frontmatter:t}=L();return y(()=>{var _,V,b,P,S,A,C,N;const s=Ae(e.value.sidebar,o.value.relativePath),n=bt(s),i=Ot(n,H=>H.link.replace(/[?#].*$/,"")),l=i.findIndex(H=>K(o.value.relativePath,H.link)),v=((_=e.value.docFooter)==null?void 0:_.prev)===!1&&!t.value.prev||t.value.prev===!1,d=((V=e.value.docFooter)==null?void 0:V.next)===!1&&!t.value.next||t.value.next===!1;return{prev:v?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((b=i[l-1])==null?void 0:b.docFooterText)??((P=i[l-1])==null?void 0:P.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((S=i[l-1])==null?void 0:S.link)},next:d?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((A=i[l+1])==null?void 0:A.docFooterText)??((C=i[l+1])==null?void 0:C.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((N=i[l+1])==null?void 0:N.link)}}})}function Ot(o,e){const t=new Set;return o.filter(s=>{const n=e(s);return t.has(n)?!1:t.add(n)})}const D=m({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(o){const e=o,t=y(()=>e.tag??(e.href?"a":"span")),s=y(()=>e.href&&Le.test(e.href)||e.target==="_blank");return(n,i)=>(a(),g(E(t.value),{class:I(["VPLink",{link:n.href,"vp-external-link-icon":s.value,"no-icon":n.noIcon}]),href:n.href?r(me)(n.href):void 0,target:n.target??(s.value?"_blank":void 0),rel:n.rel??(s.value?"noreferrer":void 0)},{default:f(()=>[c(n.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Ut={class:"VPLastUpdated"},jt=["datetime"],Gt=m({__name:"VPDocFooterLastUpdated",setup(o){const{theme:e,page:t,lang:s}=L(),n=y(()=>new Date(t.value.lastUpdated)),i=y(()=>n.value.toISOString()),l=T("");return z(()=>{Z(()=>{var v,d,_;l.value=new Intl.DateTimeFormat((d=(v=e.value.lastUpdated)==null?void 0:v.formatOptions)!=null&&d.forceLocale?s.value:void 0,((_=e.value.lastUpdated)==null?void 0:_.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(n.value)})}),(v,d)=>{var _;return a(),u("p",Ut,[O(w(((_=r(e).lastUpdated)==null?void 0:_.text)||r(e).lastUpdatedText||"Last updated")+": ",1),p("time",{datetime:i.value},w(l.value),9,jt)])}}}),zt=$(Gt,[["__scopeId","data-v-475f71b8"]]),Kt={key:0,class:"VPDocFooter"},Rt={key:0,class:"edit-info"},Wt={key:0,class:"edit-link"},qt={key:1,class:"last-updated"},Jt={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},Yt={class:"pager"},Xt=["innerHTML"],Qt=["innerHTML"],Zt={class:"pager"},xt=["innerHTML"],en=["innerHTML"],tn=m({__name:"VPDocFooter",setup(o){const{theme:e,page:t,frontmatter:s}=L(),n=Dt(),i=Ft(),l=y(()=>e.value.editLink&&s.value.editLink!==!1),v=y(()=>t.value.lastUpdated),d=y(()=>l.value||v.value||i.value.prev||i.value.next);return(_,V)=>{var b,P,S,A;return d.value?(a(),u("footer",Kt,[c(_.$slots,"doc-footer-before",{},void 0,!0),l.value||v.value?(a(),u("div",Rt,[l.value?(a(),u("div",Wt,[k(D,{class:"edit-link-button",href:r(n).url,"no-icon":!0},{default:f(()=>[V[0]||(V[0]=p("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),O(" "+w(r(n).text),1)]),_:1},8,["href"])])):h("",!0),v.value?(a(),u("div",qt,[k(zt)])):h("",!0)])):h("",!0),(b=r(i).prev)!=null&&b.link||(P=r(i).next)!=null&&P.link?(a(),u("nav",Jt,[V[1]||(V[1]=p("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),p("div",Yt,[(S=r(i).prev)!=null&&S.link?(a(),g(D,{key:0,class:"pager-link prev",href:r(i).prev.link},{default:f(()=>{var C;return[p("span",{class:"desc",innerHTML:((C=r(e).docFooter)==null?void 0:C.prev)||"Previous page"},null,8,Xt),p("span",{class:"title",innerHTML:r(i).prev.text},null,8,Qt)]}),_:1},8,["href"])):h("",!0)]),p("div",Zt,[(A=r(i).next)!=null&&A.link?(a(),g(D,{key:0,class:"pager-link next",href:r(i).next.link},{default:f(()=>{var C;return[p("span",{class:"desc",innerHTML:((C=r(e).docFooter)==null?void 0:C.next)||"Next page"},null,8,xt),p("span",{class:"title",innerHTML:r(i).next.text},null,8,en)]}),_:1},8,["href"])):h("",!0)])])):h("",!0)])):h("",!0)}}}),nn=$(tn,[["__scopeId","data-v-4f9813fa"]]),sn={class:"container"},on={class:"aside-container"},an={class:"aside-content"},rn={class:"content"},ln={class:"content-container"},cn={class:"main"},un=m({__name:"VPDoc",setup(o){const{theme:e}=L(),t=ee(),{hasSidebar:s,hasAside:n,leftAside:i}=U(),l=y(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(v,d)=>{const _=R("Content");return a(),u("div",{class:I(["VPDoc",{"has-sidebar":r(s),"has-aside":r(n)}])},[c(v.$slots,"doc-top",{},void 0,!0),p("div",sn,[r(n)?(a(),u("div",{key:0,class:I(["aside",{"left-aside":r(i)}])},[d[0]||(d[0]=p("div",{class:"aside-curtain"},null,-1)),p("div",on,[p("div",an,[k(Et,null,{"aside-top":f(()=>[c(v.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":f(()=>[c(v.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":f(()=>[c(v.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[c(v.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[c(v.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[c(v.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):h("",!0),p("div",rn,[p("div",ln,[c(v.$slots,"doc-before",{},void 0,!0),p("main",cn,[k(_,{class:I(["vp-doc",[l.value,r(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),k(nn,null,{"doc-footer-before":f(()=>[c(v.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),c(v.$slots,"doc-after",{},void 0,!0)])])]),c(v.$slots,"doc-bottom",{},void 0,!0)],2)}}}),dn=$(un,[["__scopeId","data-v-83890dd9"]]),vn=m({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(o){const e=o,t=y(()=>e.href&&Le.test(e.href)),s=y(()=>e.tag||e.href?"a":"button");return(n,i)=>(a(),g(E(s.value),{class:I(["VPButton",[n.size,n.theme]]),href:n.href?r(me)(n.href):void 0,target:e.target??(t.value?"_blank":void 0),rel:e.rel??(t.value?"noreferrer":void 0)},{default:f(()=>[O(w(n.text),1)]),_:1},8,["class","href","target","rel"]))}}),pn=$(vn,[["__scopeId","data-v-14206e74"]]),fn=["src","alt"],hn=m({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(o){return(e,t)=>{const s=R("VPImage",!0);return e.image?(a(),u(M,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),u("img",G({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:r(ve)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,fn)):(a(),u(M,{key:1},[k(s,G({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),k(s,G({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):h("",!0)}}}),Q=$(hn,[["__scopeId","data-v-35a7d0b8"]]),mn={class:"container"},_n={class:"main"},bn={key:0,class:"name"},kn=["innerHTML"],gn=["innerHTML"],$n=["innerHTML"],yn={key:0,class:"actions"},Pn={key:0,class:"image"},Sn={class:"image-container"},Vn=m({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(o){const e=q("hero-image-slot-exists");return(t,s)=>(a(),u("div",{class:I(["VPHero",{"has-image":t.image||r(e)}])},[p("div",mn,[p("div",_n,[c(t.$slots,"home-hero-info-before",{},void 0,!0),c(t.$slots,"home-hero-info",{},()=>[t.name?(a(),u("h1",bn,[p("span",{innerHTML:t.name,class:"clip"},null,8,kn)])):h("",!0),t.text?(a(),u("p",{key:1,innerHTML:t.text,class:"text"},null,8,gn)):h("",!0),t.tagline?(a(),u("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,$n)):h("",!0)],!0),c(t.$slots,"home-hero-info-after",{},void 0,!0),t.actions?(a(),u("div",yn,[(a(!0),u(M,null,B(t.actions,n=>(a(),u("div",{key:n.link,class:"action"},[k(pn,{tag:"a",size:"medium",theme:n.theme,text:n.text,href:n.link,target:n.target,rel:n.rel},null,8,["theme","text","href","target","rel"])]))),128))])):h("",!0),c(t.$slots,"home-hero-actions-after",{},void 0,!0)]),t.image||r(e)?(a(),u("div",Pn,[p("div",Sn,[s[0]||(s[0]=p("div",{class:"image-bg"},null,-1)),c(t.$slots,"home-hero-image",{},()=>[t.image?(a(),g(Q,{key:0,class:"image-src",image:t.image},null,8,["image"])):h("",!0)],!0)])])):h("",!0)])],2))}}),Ln=$(Vn,[["__scopeId","data-v-955009fc"]]),Tn=m({__name:"VPHomeHero",setup(o){const{frontmatter:e}=L();return(t,s)=>r(e).hero?(a(),g(Ln,{key:0,class:"VPHomeHero",name:r(e).hero.name,text:r(e).hero.text,tagline:r(e).hero.tagline,image:r(e).hero.image,actions:r(e).hero.actions},{"home-hero-info-before":f(()=>[c(t.$slots,"home-hero-info-before")]),"home-hero-info":f(()=>[c(t.$slots,"home-hero-info")]),"home-hero-info-after":f(()=>[c(t.$slots,"home-hero-info-after")]),"home-hero-actions-after":f(()=>[c(t.$slots,"home-hero-actions-after")]),"home-hero-image":f(()=>[c(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):h("",!0)}}),Nn={class:"box"},wn={key:0,class:"icon"},In=["innerHTML"],Mn=["innerHTML"],An=["innerHTML"],Cn={key:4,class:"link-text"},Bn={class:"link-text-value"},Hn=m({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(o){return(e,t)=>(a(),g(D,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:f(()=>[p("article",Nn,[typeof e.icon=="object"&&e.icon.wrap?(a(),u("div",wn,[k(Q,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(a(),g(Q,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(a(),u("div",{key:2,class:"icon",innerHTML:e.icon},null,8,In)):h("",!0),p("h2",{class:"title",innerHTML:e.title},null,8,Mn),e.details?(a(),u("p",{key:3,class:"details",innerHTML:e.details},null,8,An)):h("",!0),e.linkText?(a(),u("div",Cn,[p("p",Bn,[O(w(e.linkText)+" ",1),t[0]||(t[0]=p("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):h("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),En=$(Hn,[["__scopeId","data-v-f5e9645b"]]),Dn={key:0,class:"VPFeatures"},Fn={class:"container"},On={class:"items"},Un=m({__name:"VPFeatures",props:{features:{}},setup(o){const e=o,t=y(()=>{const s=e.features.length;if(s){if(s===2)return"grid-2";if(s===3)return"grid-3";if(s%3===0)return"grid-6";if(s>3)return"grid-4"}else return});return(s,n)=>s.features?(a(),u("div",Dn,[p("div",Fn,[p("div",On,[(a(!0),u(M,null,B(s.features,i=>(a(),u("div",{key:i.title,class:I(["item",[t.value]])},[k(En,{icon:i.icon,title:i.title,details:i.details,link:i.link,"link-text":i.linkText,rel:i.rel,target:i.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):h("",!0)}}),jn=$(Un,[["__scopeId","data-v-d0a190d7"]]),Gn=m({__name:"VPHomeFeatures",setup(o){const{frontmatter:e}=L();return(t,s)=>r(e).features?(a(),g(jn,{key:0,class:"VPHomeFeatures",features:r(e).features},null,8,["features"])):h("",!0)}}),zn=m({__name:"VPHomeContent",setup(o){const{width:e}=We({initialWidth:0,includeScrollbar:!1});return(t,s)=>(a(),u("div",{class:"vp-doc container",style:Te(r(e)?{"--vp-offset":`calc(50% - ${r(e)/2}px)`}:{})},[c(t.$slots,"default",{},void 0,!0)],4))}}),Kn=$(zn,[["__scopeId","data-v-7a48a447"]]),Rn={class:"VPHome"},Wn=m({__name:"VPHome",setup(o){const{frontmatter:e}=L();return(t,s)=>{const n=R("Content");return a(),u("div",Rn,[c(t.$slots,"home-hero-before",{},void 0,!0),k(Tn,null,{"home-hero-info-before":f(()=>[c(t.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[c(t.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[c(t.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[c(t.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[c(t.$slots,"home-hero-image",{},void 0,!0)]),_:3}),c(t.$slots,"home-hero-after",{},void 0,!0),c(t.$slots,"home-features-before",{},void 0,!0),k(Gn),c(t.$slots,"home-features-after",{},void 0,!0),r(e).markdownStyles!==!1?(a(),g(Kn,{key:0},{default:f(()=>[k(n)]),_:1})):(a(),g(n,{key:1}))])}}}),qn=$(Wn,[["__scopeId","data-v-cbb6ec48"]]),Jn={},Yn={class:"VPPage"};function Xn(o,e){const t=R("Content");return a(),u("div",Yn,[c(o.$slots,"page-top"),k(t),c(o.$slots,"page-bottom")])}const Qn=$(Jn,[["render",Xn]]),Zn=m({__name:"VPContent",setup(o){const{page:e,frontmatter:t}=L(),{hasSidebar:s}=U();return(n,i)=>(a(),u("div",{class:I(["VPContent",{"has-sidebar":r(s),"is-home":r(t).layout==="home"}]),id:"VPContent"},[r(e).isNotFound?c(n.$slots,"not-found",{key:0},()=>[k(mt)],!0):r(t).layout==="page"?(a(),g(Qn,{key:1},{"page-top":f(()=>[c(n.$slots,"page-top",{},void 0,!0)]),"page-bottom":f(()=>[c(n.$slots,"page-bottom",{},void 0,!0)]),_:3})):r(t).layout==="home"?(a(),g(qn,{key:2},{"home-hero-before":f(()=>[c(n.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":f(()=>[c(n.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[c(n.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[c(n.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[c(n.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[c(n.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":f(()=>[c(n.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":f(()=>[c(n.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":f(()=>[c(n.$slots,"home-features-after",{},void 0,!0)]),_:3})):r(t).layout&&r(t).layout!=="doc"?(a(),g(E(r(t).layout),{key:3})):(a(),g(dn,{key:4},{"doc-top":f(()=>[c(n.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":f(()=>[c(n.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":f(()=>[c(n.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":f(()=>[c(n.$slots,"doc-before",{},void 0,!0)]),"doc-after":f(()=>[c(n.$slots,"doc-after",{},void 0,!0)]),"aside-top":f(()=>[c(n.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":f(()=>[c(n.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[c(n.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[c(n.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[c(n.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":f(()=>[c(n.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),xn=$(Zn,[["__scopeId","data-v-91765379"]]),es={class:"container"},ts=["innerHTML"],ns=["innerHTML"],ss=m({__name:"VPFooter",setup(o){const{theme:e,frontmatter:t}=L(),{hasSidebar:s}=U();return(n,i)=>r(e).footer&&r(t).footer!==!1?(a(),u("footer",{key:0,class:I(["VPFooter",{"has-sidebar":r(s)}])},[p("div",es,[r(e).footer.message?(a(),u("p",{key:0,class:"message",innerHTML:r(e).footer.message},null,8,ts)):h("",!0),r(e).footer.copyright?(a(),u("p",{key:1,class:"copyright",innerHTML:r(e).footer.copyright},null,8,ns)):h("",!0)])],2)):h("",!0)}}),os=$(ss,[["__scopeId","data-v-c970a860"]]);function as(){const{theme:o,frontmatter:e}=L(),t=Ve([]),s=y(()=>t.value.length>0);return x(()=>{t.value=_e(e.value.outline??o.value.outline)}),{headers:t,hasLocalNav:s}}const rs={class:"menu-text"},is={class:"header"},ls={class:"outline"},cs=m({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(o){const e=o,{theme:t}=L(),s=T(!1),n=T(0),i=T(),l=T();function v(b){var P;(P=i.value)!=null&&P.contains(b.target)||(s.value=!1)}F(s,b=>{if(b){document.addEventListener("click",v);return}document.removeEventListener("click",v)}),ie("Escape",()=>{s.value=!1}),x(()=>{s.value=!1});function d(){s.value=!s.value,n.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function _(b){b.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Ne(()=>{s.value=!1}))}function V(){s.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(b,P)=>(a(),u("div",{class:"VPLocalNavOutlineDropdown",style:Te({"--vp-vh":n.value+"px"}),ref_key:"main",ref:i},[b.headers.length>0?(a(),u("button",{key:0,onClick:d,class:I({open:s.value})},[p("span",rs,w(r(Ce)(r(t))),1),P[0]||(P[0]=p("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(a(),u("button",{key:1,onClick:V},w(r(t).returnToTopLabel||"Return to top"),1)),k(de,{name:"flyout"},{default:f(()=>[s.value?(a(),u("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:_},[p("div",is,[p("a",{class:"top-link",href:"#",onClick:V},w(r(t).returnToTopLabel||"Return to top"),1)]),p("div",ls,[k(Be,{headers:b.headers},null,8,["headers"])])],512)):h("",!0)]),_:1})],4))}}),us=$(cs,[["__scopeId","data-v-bc9dc845"]]),ds={class:"container"},vs=["aria-expanded"],ps={class:"menu-text"},fs=m({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(o){const{theme:e,frontmatter:t}=L(),{hasSidebar:s}=U(),{headers:n}=as(),{y:i}=we(),l=T(0);z(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),x(()=>{n.value=_e(t.value.outline??e.value.outline)});const v=y(()=>n.value.length===0),d=y(()=>v.value&&!s.value),_=y(()=>({VPLocalNav:!0,"has-sidebar":s.value,empty:v.value,fixed:d.value}));return(V,b)=>r(t).layout!=="home"&&(!d.value||r(i)>=l.value)?(a(),u("div",{key:0,class:I(_.value)},[p("div",ds,[r(s)?(a(),u("button",{key:0,class:"menu","aria-expanded":V.open,"aria-controls":"VPSidebarNav",onClick:b[0]||(b[0]=P=>V.$emit("open-menu"))},[b[1]||(b[1]=p("span",{class:"vpi-align-left menu-icon"},null,-1)),p("span",ps,w(r(e).sidebarMenuLabel||"Menu"),1)],8,vs)):h("",!0),k(us,{headers:r(n),navHeight:l.value},null,8,["headers","navHeight"])])],2)):h("",!0)}}),hs=$(fs,[["__scopeId","data-v-070ab83d"]]);function ms(){const o=T(!1);function e(){o.value=!0,window.addEventListener("resize",n)}function t(){o.value=!1,window.removeEventListener("resize",n)}function s(){o.value?t():e()}function n(){window.outerWidth>=768&&t()}const i=ee();return F(()=>i.path,t),{isScreenOpen:o,openScreen:e,closeScreen:t,toggleScreen:s}}const _s={},bs={class:"VPSwitch",type:"button",role:"switch"},ks={class:"check"},gs={key:0,class:"icon"};function $s(o,e){return a(),u("button",bs,[p("span",ks,[o.$slots.default?(a(),u("span",gs,[c(o.$slots,"default",{},void 0,!0)])):h("",!0)])])}const ys=$(_s,[["render",$s],["__scopeId","data-v-4a1c76db"]]),Ps=m({__name:"VPSwitchAppearance",setup(o){const{isDark:e,theme:t}=L(),s=q("toggle-appearance",()=>{e.value=!e.value}),n=T("");return fe(()=>{n.value=e.value?t.value.lightModeSwitchTitle||"Switch to light theme":t.value.darkModeSwitchTitle||"Switch to dark theme"}),(i,l)=>(a(),g(ys,{title:n.value,class:"VPSwitchAppearance","aria-checked":r(e),onClick:r(s)},{default:f(()=>l[0]||(l[0]=[p("span",{class:"vpi-sun sun"},null,-1),p("span",{class:"vpi-moon moon"},null,-1)])),_:1},8,["title","aria-checked","onClick"]))}}),be=$(Ps,[["__scopeId","data-v-e40a8bb6"]]),Ss={key:0,class:"VPNavBarAppearance"},Vs=m({__name:"VPNavBarAppearance",setup(o){const{site:e}=L();return(t,s)=>r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),u("div",Ss,[k(be)])):h("",!0)}}),Ls=$(Vs,[["__scopeId","data-v-af096f4a"]]),ke=T();let He=!1,ae=0;function Ts(o){const e=T(!1);if(te){!He&&Ns(),ae++;const t=F(ke,s=>{var n,i,l;s===o.el.value||(n=o.el.value)!=null&&n.contains(s)?(e.value=!0,(i=o.onFocus)==null||i.call(o)):(e.value=!1,(l=o.onBlur)==null||l.call(o))});pe(()=>{t(),ae--,ae||ws()})}return qe(e)}function Ns(){document.addEventListener("focusin",Ee),He=!0,ke.value=document.activeElement}function ws(){document.removeEventListener("focusin",Ee)}function Ee(){ke.value=document.activeElement}const Is={class:"VPMenuLink"},Ms=m({__name:"VPMenuLink",props:{item:{}},setup(o){const{page:e}=L();return(t,s)=>(a(),u("div",Is,[k(D,{class:I({active:r(K)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:f(()=>[O(w(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}}),ne=$(Ms,[["__scopeId","data-v-8b74d055"]]),As={class:"VPMenuGroup"},Cs={key:0,class:"title"},Bs=m({__name:"VPMenuGroup",props:{text:{},items:{}},setup(o){return(e,t)=>(a(),u("div",As,[e.text?(a(),u("p",Cs,w(e.text),1)):h("",!0),(a(!0),u(M,null,B(e.items,s=>(a(),u(M,null,["link"in s?(a(),g(ne,{key:0,item:s},null,8,["item"])):h("",!0)],64))),256))]))}}),Hs=$(Bs,[["__scopeId","data-v-48c802d0"]]),Es={class:"VPMenu"},Ds={key:0,class:"items"},Fs=m({__name:"VPMenu",props:{items:{}},setup(o){return(e,t)=>(a(),u("div",Es,[e.items?(a(),u("div",Ds,[(a(!0),u(M,null,B(e.items,s=>(a(),u(M,{key:JSON.stringify(s)},["link"in s?(a(),g(ne,{key:0,item:s},null,8,["item"])):"component"in s?(a(),g(E(s.component),G({key:1,ref_for:!0},s.props),null,16)):(a(),g(Hs,{key:2,text:s.text,items:s.items},null,8,["text","items"]))],64))),128))])):h("",!0),c(e.$slots,"default",{},void 0,!0)]))}}),Os=$(Fs,[["__scopeId","data-v-7dd3104a"]]),Us=["aria-expanded","aria-label"],js={key:0,class:"text"},Gs=["innerHTML"],zs={key:1,class:"vpi-more-horizontal icon"},Ks={class:"menu"},Rs=m({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(o){const e=T(!1),t=T();Ts({el:t,onBlur:s});function s(){e.value=!1}return(n,i)=>(a(),u("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:i[1]||(i[1]=l=>e.value=!0),onMouseleave:i[2]||(i[2]=l=>e.value=!1)},[p("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":n.label,onClick:i[0]||(i[0]=l=>e.value=!e.value)},[n.button||n.icon?(a(),u("span",js,[n.icon?(a(),u("span",{key:0,class:I([n.icon,"option-icon"])},null,2)):h("",!0),n.button?(a(),u("span",{key:1,innerHTML:n.button},null,8,Gs)):h("",!0),i[3]||(i[3]=p("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(a(),u("span",zs))],8,Us),p("div",Ks,[k(Os,{items:n.items},{default:f(()=>[c(n.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),ge=$(Rs,[["__scopeId","data-v-e5380155"]]),Ws=["href","aria-label","innerHTML"],qs=m({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(o){const e=o,t=y(()=>typeof e.icon=="object"?e.icon.svg:``);return(s,n)=>(a(),u("a",{class:"VPSocialLink no-icon",href:s.link,"aria-label":s.ariaLabel??(typeof s.icon=="string"?s.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,Ws))}}),Js=$(qs,[["__scopeId","data-v-717b8b75"]]),Ys={class:"VPSocialLinks"},Xs=m({__name:"VPSocialLinks",props:{links:{}},setup(o){return(e,t)=>(a(),u("div",Ys,[(a(!0),u(M,null,B(e.links,({link:s,icon:n,ariaLabel:i})=>(a(),g(Js,{key:s,icon:n,link:s,ariaLabel:i},null,8,["icon","link","ariaLabel"]))),128))]))}}),$e=$(Xs,[["__scopeId","data-v-ee7a9424"]]),Qs={key:0,class:"group translations"},Zs={class:"trans-title"},xs={key:1,class:"group"},eo={class:"item appearance"},to={class:"label"},no={class:"appearance-action"},so={key:2,class:"group"},oo={class:"item social-links"},ao=m({__name:"VPNavBarExtra",setup(o){const{site:e,theme:t}=L(),{localeLinks:s,currentLang:n}=Y({correspondingLink:!0}),i=y(()=>s.value.length&&n.value.label||e.value.appearance||t.value.socialLinks);return(l,v)=>i.value?(a(),g(ge,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:f(()=>[r(s).length&&r(n).label?(a(),u("div",Qs,[p("p",Zs,w(r(n).label),1),(a(!0),u(M,null,B(r(s),d=>(a(),g(ne,{key:d.link,item:d},null,8,["item"]))),128))])):h("",!0),r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),u("div",xs,[p("div",eo,[p("p",to,w(r(t).darkModeSwitchLabel||"Appearance"),1),p("div",no,[k(be)])])])):h("",!0),r(t).socialLinks?(a(),u("div",so,[p("div",oo,[k($e,{class:"social-links-list",links:r(t).socialLinks},null,8,["links"])])])):h("",!0)]),_:1})):h("",!0)}}),ro=$(ao,[["__scopeId","data-v-925effce"]]),io=["aria-expanded"],lo=m({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(o){return(e,t)=>(a(),u("button",{type:"button",class:I(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=s=>e.$emit("click"))},t[1]||(t[1]=[p("span",{class:"container"},[p("span",{class:"top"}),p("span",{class:"middle"}),p("span",{class:"bottom"})],-1)]),10,io))}}),co=$(lo,[["__scopeId","data-v-5dea55bf"]]),uo=["innerHTML"],vo=m({__name:"VPNavBarMenuLink",props:{item:{}},setup(o){const{page:e}=L();return(t,s)=>(a(),g(D,{class:I({VPNavBarMenuLink:!0,active:r(K)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,noIcon:t.item.noIcon,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:f(()=>[p("span",{innerHTML:t.item.text},null,8,uo)]),_:1},8,["class","href","noIcon","target","rel"]))}}),po=$(vo,[["__scopeId","data-v-ed5ac1f6"]]),fo=m({__name:"VPNavBarMenuGroup",props:{item:{}},setup(o){const e=o,{page:t}=L(),s=i=>"component"in i?!1:"link"in i?K(t.value.relativePath,i.link,!!e.item.activeMatch):i.items.some(s),n=y(()=>s(e.item));return(i,l)=>(a(),g(ge,{class:I({VPNavBarMenuGroup:!0,active:r(K)(r(t).relativePath,i.item.activeMatch,!!i.item.activeMatch)||n.value}),button:i.item.text,items:i.item.items},null,8,["class","button","items"]))}}),ho={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},mo=m({__name:"VPNavBarMenu",setup(o){const{theme:e}=L();return(t,s)=>r(e).nav?(a(),u("nav",ho,[s[0]||(s[0]=p("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(a(!0),u(M,null,B(r(e).nav,n=>(a(),u(M,{key:JSON.stringify(n)},["link"in n?(a(),g(po,{key:0,item:n},null,8,["item"])):"component"in n?(a(),g(E(n.component),G({key:1,ref_for:!0},n.props),null,16)):(a(),g(fo,{key:2,item:n},null,8,["item"]))],64))),128))])):h("",!0)}}),_o=$(mo,[["__scopeId","data-v-e6d46098"]]);function bo(o){const{localeIndex:e,theme:t}=L();function s(n){var A,C,N;const i=n.split("."),l=(A=t.value.search)==null?void 0:A.options,v=l&&typeof l=="object",d=v&&((N=(C=l.locales)==null?void 0:C[e.value])==null?void 0:N.translations)||null,_=v&&l.translations||null;let V=d,b=_,P=o;const S=i.pop();for(const H of i){let j=null;const W=P==null?void 0:P[H];W&&(j=P=W);const se=b==null?void 0:b[H];se&&(j=b=se);const oe=V==null?void 0:V[H];oe&&(j=V=oe),W||(P=j),se||(b=j),oe||(V=j)}return(V==null?void 0:V[S])??(b==null?void 0:b[S])??(P==null?void 0:P[S])??""}return s}const ko=["aria-label"],go={class:"DocSearch-Button-Container"},$o={class:"DocSearch-Button-Placeholder"},ye=m({__name:"VPNavBarSearchButton",setup(o){const t=bo({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(s,n)=>(a(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":r(t)("button.buttonAriaLabel")},[p("span",go,[n[0]||(n[0]=p("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1)),p("span",$o,w(r(t)("button.buttonText")),1)]),n[1]||(n[1]=p("span",{class:"DocSearch-Button-Keys"},[p("kbd",{class:"DocSearch-Button-Key"}),p("kbd",{class:"DocSearch-Button-Key"},"K")],-1))],8,ko))}}),yo={class:"VPNavBarSearch"},Po={id:"local-search"},So={key:1,id:"docsearch"},Vo=m({__name:"VPNavBarSearch",setup(o){const e=Je(()=>Ye(()=>import("./VPLocalSearchBox.ChJ1UMYp.js"),__vite__mapDeps([0,1]))),t=()=>null,{theme:s}=L(),n=T(!1),i=T(!1);z(()=>{});function l(){n.value||(n.value=!0,setTimeout(v,16))}function v(){const b=new Event("keydown");b.key="k",b.metaKey=!0,window.dispatchEvent(b),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||v()},16)}function d(b){const P=b.target,S=P.tagName;return P.isContentEditable||S==="INPUT"||S==="SELECT"||S==="TEXTAREA"}const _=T(!1);ie("k",b=>{(b.ctrlKey||b.metaKey)&&(b.preventDefault(),_.value=!0)}),ie("/",b=>{d(b)||(b.preventDefault(),_.value=!0)});const V="local";return(b,P)=>{var S;return a(),u("div",yo,[r(V)==="local"?(a(),u(M,{key:0},[_.value?(a(),g(r(e),{key:0,onClose:P[0]||(P[0]=A=>_.value=!1)})):h("",!0),p("div",Po,[k(ye,{onClick:P[1]||(P[1]=A=>_.value=!0)})])],64)):r(V)==="algolia"?(a(),u(M,{key:1},[n.value?(a(),g(r(t),{key:0,algolia:((S=r(s).search)==null?void 0:S.options)??r(s).algolia,onVnodeBeforeMount:P[2]||(P[2]=A=>i.value=!0)},null,8,["algolia"])):h("",!0),i.value?h("",!0):(a(),u("div",So,[k(ye,{onClick:l})]))],64)):h("",!0)])}}}),Lo=m({__name:"VPNavBarSocialLinks",setup(o){const{theme:e}=L();return(t,s)=>r(e).socialLinks?(a(),g($e,{key:0,class:"VPNavBarSocialLinks",links:r(e).socialLinks},null,8,["links"])):h("",!0)}}),To=$(Lo,[["__scopeId","data-v-164c457f"]]),No=["href","rel","target"],wo={key:1},Io={key:2},Mo=m({__name:"VPNavBarTitle",setup(o){const{site:e,theme:t}=L(),{hasSidebar:s}=U(),{currentLang:n}=Y(),i=y(()=>{var d;return typeof t.value.logoLink=="string"?t.value.logoLink:(d=t.value.logoLink)==null?void 0:d.link}),l=y(()=>{var d;return typeof t.value.logoLink=="string"||(d=t.value.logoLink)==null?void 0:d.rel}),v=y(()=>{var d;return typeof t.value.logoLink=="string"||(d=t.value.logoLink)==null?void 0:d.target});return(d,_)=>(a(),u("div",{class:I(["VPNavBarTitle",{"has-sidebar":r(s)}])},[p("a",{class:"title",href:i.value??r(me)(r(n).link),rel:l.value,target:v.value},[c(d.$slots,"nav-bar-title-before",{},void 0,!0),r(t).logo?(a(),g(Q,{key:0,class:"logo",image:r(t).logo},null,8,["image"])):h("",!0),r(t).siteTitle?(a(),u("span",wo,w(r(t).siteTitle),1)):r(t).siteTitle===void 0?(a(),u("span",Io,w(r(e).title),1)):h("",!0),c(d.$slots,"nav-bar-title-after",{},void 0,!0)],8,No)],2))}}),Ao=$(Mo,[["__scopeId","data-v-28a961f9"]]),Co={class:"items"},Bo={class:"title"},Ho=m({__name:"VPNavBarTranslations",setup(o){const{theme:e}=L(),{localeLinks:t,currentLang:s}=Y({correspondingLink:!0});return(n,i)=>r(t).length&&r(s).label?(a(),g(ge,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:r(e).langMenuLabel||"Change language"},{default:f(()=>[p("div",Co,[p("p",Bo,w(r(s).label),1),(a(!0),u(M,null,B(r(t),l=>(a(),g(ne,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):h("",!0)}}),Eo=$(Ho,[["__scopeId","data-v-c80d9ad0"]]),Do={class:"wrapper"},Fo={class:"container"},Oo={class:"title"},Uo={class:"content"},jo={class:"content-body"},Go=m({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(o){const e=o,{y:t}=we(),{hasSidebar:s}=U(),{frontmatter:n}=L(),i=T({});return fe(()=>{i.value={"has-sidebar":s.value,home:n.value.layout==="home",top:t.value===0,"screen-open":e.isScreenOpen}}),(l,v)=>(a(),u("div",{class:I(["VPNavBar",i.value])},[p("div",Do,[p("div",Fo,[p("div",Oo,[k(Ao,null,{"nav-bar-title-before":f(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),p("div",Uo,[p("div",jo,[c(l.$slots,"nav-bar-content-before",{},void 0,!0),k(Vo,{class:"search"}),k(_o,{class:"menu"}),k(Eo,{class:"translations"}),k(Ls,{class:"appearance"}),k(To,{class:"social-links"}),k(ro,{class:"extra"}),c(l.$slots,"nav-bar-content-after",{},void 0,!0),k(co,{class:"hamburger",active:l.isScreenOpen,onClick:v[0]||(v[0]=d=>l.$emit("toggle-screen"))},null,8,["active"])])])])]),v[1]||(v[1]=p("div",{class:"divider"},[p("div",{class:"divider-line"})],-1))],2))}}),zo=$(Go,[["__scopeId","data-v-822684d1"]]),Ko={key:0,class:"VPNavScreenAppearance"},Ro={class:"text"},Wo=m({__name:"VPNavScreenAppearance",setup(o){const{site:e,theme:t}=L();return(s,n)=>r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),u("div",Ko,[p("p",Ro,w(r(t).darkModeSwitchLabel||"Appearance"),1),k(be)])):h("",!0)}}),qo=$(Wo,[["__scopeId","data-v-ffb44008"]]),Jo=m({__name:"VPNavScreenMenuLink",props:{item:{}},setup(o){const e=q("close-screen");return(t,s)=>(a(),g(D,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e),innerHTML:t.item.text},null,8,["href","target","rel","onClick","innerHTML"]))}}),Yo=$(Jo,[["__scopeId","data-v-27d04aeb"]]),Xo=m({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(o){const e=q("close-screen");return(t,s)=>(a(),g(D,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e)},{default:f(()=>[O(w(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),De=$(Xo,[["__scopeId","data-v-7179dbb7"]]),Qo={class:"VPNavScreenMenuGroupSection"},Zo={key:0,class:"title"},xo=m({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(o){return(e,t)=>(a(),u("div",Qo,[e.text?(a(),u("p",Zo,w(e.text),1)):h("",!0),(a(!0),u(M,null,B(e.items,s=>(a(),g(De,{key:s.text,item:s},null,8,["item"]))),128))]))}}),ea=$(xo,[["__scopeId","data-v-4b8941ac"]]),ta=["aria-controls","aria-expanded"],na=["innerHTML"],sa=["id"],oa={key:0,class:"item"},aa={key:1,class:"item"},ra={key:2,class:"group"},ia=m({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(o){const e=o,t=T(!1),s=y(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function n(){t.value=!t.value}return(i,l)=>(a(),u("div",{class:I(["VPNavScreenMenuGroup",{open:t.value}])},[p("button",{class:"button","aria-controls":s.value,"aria-expanded":t.value,onClick:n},[p("span",{class:"button-text",innerHTML:i.text},null,8,na),l[0]||(l[0]=p("span",{class:"vpi-plus button-icon"},null,-1))],8,ta),p("div",{id:s.value,class:"items"},[(a(!0),u(M,null,B(i.items,v=>(a(),u(M,{key:JSON.stringify(v)},["link"in v?(a(),u("div",oa,[k(De,{item:v},null,8,["item"])])):"component"in v?(a(),u("div",aa,[(a(),g(E(v.component),G({ref_for:!0},v.props,{"screen-menu":""}),null,16))])):(a(),u("div",ra,[k(ea,{text:v.text,items:v.items},null,8,["text","items"])]))],64))),128))],8,sa)],2))}}),la=$(ia,[["__scopeId","data-v-875057a5"]]),ca={key:0,class:"VPNavScreenMenu"},ua=m({__name:"VPNavScreenMenu",setup(o){const{theme:e}=L();return(t,s)=>r(e).nav?(a(),u("nav",ca,[(a(!0),u(M,null,B(r(e).nav,n=>(a(),u(M,{key:JSON.stringify(n)},["link"in n?(a(),g(Yo,{key:0,item:n},null,8,["item"])):"component"in n?(a(),g(E(n.component),G({key:1,ref_for:!0},n.props,{"screen-menu":""}),null,16)):(a(),g(la,{key:2,text:n.text||"",items:n.items},null,8,["text","items"]))],64))),128))])):h("",!0)}}),da=m({__name:"VPNavScreenSocialLinks",setup(o){const{theme:e}=L();return(t,s)=>r(e).socialLinks?(a(),g($e,{key:0,class:"VPNavScreenSocialLinks",links:r(e).socialLinks},null,8,["links"])):h("",!0)}}),va={class:"list"},pa=m({__name:"VPNavScreenTranslations",setup(o){const{localeLinks:e,currentLang:t}=Y({correspondingLink:!0}),s=T(!1);function n(){s.value=!s.value}return(i,l)=>r(e).length&&r(t).label?(a(),u("div",{key:0,class:I(["VPNavScreenTranslations",{open:s.value}])},[p("button",{class:"title",onClick:n},[l[0]||(l[0]=p("span",{class:"vpi-languages icon lang"},null,-1)),O(" "+w(r(t).label)+" ",1),l[1]||(l[1]=p("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),p("ul",va,[(a(!0),u(M,null,B(r(e),v=>(a(),u("li",{key:v.link,class:"item"},[k(D,{class:"link",href:v.link},{default:f(()=>[O(w(v.text),1)]),_:2},1032,["href"])]))),128))])],2)):h("",!0)}}),fa=$(pa,[["__scopeId","data-v-362991c2"]]),ha={class:"container"},ma=m({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(o){const e=T(null),t=Ie(te?document.body:null);return(s,n)=>(a(),g(de,{name:"fade",onEnter:n[0]||(n[0]=i=>t.value=!0),onAfterLeave:n[1]||(n[1]=i=>t.value=!1)},{default:f(()=>[s.open?(a(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[p("div",ha,[c(s.$slots,"nav-screen-content-before",{},void 0,!0),k(ua,{class:"menu"}),k(fa,{class:"translations"}),k(qo,{class:"appearance"}),k(da,{class:"social-links"}),c(s.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):h("",!0)]),_:3}))}}),_a=$(ma,[["__scopeId","data-v-833aabba"]]),ba={key:0,class:"VPNav"},ka=m({__name:"VPNav",setup(o){const{isScreenOpen:e,closeScreen:t,toggleScreen:s}=ms(),{frontmatter:n}=L(),i=y(()=>n.value.navbar!==!1);return he("close-screen",t),Z(()=>{te&&document.documentElement.classList.toggle("hide-nav",!i.value)}),(l,v)=>i.value?(a(),u("header",ba,[k(zo,{"is-screen-open":r(e),onToggleScreen:r(s)},{"nav-bar-title-before":f(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":f(()=>[c(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":f(()=>[c(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),k(_a,{open:r(e)},{"nav-screen-content-before":f(()=>[c(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":f(()=>[c(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):h("",!0)}}),ga=$(ka,[["__scopeId","data-v-f1e365da"]]),$a=["role","tabindex"],ya={key:1,class:"items"},Pa=m({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(o){const e=o,{collapsed:t,collapsible:s,isLink:n,isActiveLink:i,hasActiveLink:l,hasChildren:v,toggle:d}=gt(y(()=>e.item)),_=y(()=>v.value?"section":"div"),V=y(()=>n.value?"a":"div"),b=y(()=>v.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),P=y(()=>n.value?void 0:"button"),S=y(()=>[[`level-${e.depth}`],{collapsible:s.value},{collapsed:t.value},{"is-link":n.value},{"is-active":i.value},{"has-active":l.value}]);function A(N){"key"in N&&N.key!=="Enter"||!e.item.link&&d()}function C(){e.item.link&&d()}return(N,H)=>{const j=R("VPSidebarItem",!0);return a(),g(E(_.value),{class:I(["VPSidebarItem",S.value])},{default:f(()=>[N.item.text?(a(),u("div",G({key:0,class:"item",role:P.value},Qe(N.item.items?{click:A,keydown:A}:{},!0),{tabindex:N.item.items&&0}),[H[1]||(H[1]=p("div",{class:"indicator"},null,-1)),N.item.link?(a(),g(D,{key:0,tag:V.value,class:"link",href:N.item.link,rel:N.item.rel,target:N.item.target},{default:f(()=>[(a(),g(E(b.value),{class:"text",innerHTML:N.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),g(E(b.value),{key:1,class:"text",innerHTML:N.item.text},null,8,["innerHTML"])),N.item.collapsed!=null&&N.item.items&&N.item.items.length?(a(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:C,onKeydown:Xe(C,["enter"]),tabindex:"0"},H[0]||(H[0]=[p("span",{class:"vpi-chevron-right caret-icon"},null,-1)]),32)):h("",!0)],16,$a)):h("",!0),N.item.items&&N.item.items.length?(a(),u("div",ya,[N.depth<5?(a(!0),u(M,{key:0},B(N.item.items,W=>(a(),g(j,{key:W.text,item:W,depth:N.depth+1},null,8,["item","depth"]))),128)):h("",!0)])):h("",!0)]),_:1},8,["class"])}}}),Sa=$(Pa,[["__scopeId","data-v-196b2e5f"]]),Va=m({__name:"VPSidebarGroup",props:{items:{}},setup(o){const e=T(!0);let t=null;return z(()=>{t=setTimeout(()=>{t=null,e.value=!1},300)}),Ze(()=>{t!=null&&(clearTimeout(t),t=null)}),(s,n)=>(a(!0),u(M,null,B(s.items,i=>(a(),u("div",{key:i.text,class:I(["group",{"no-transition":e.value}])},[k(Sa,{item:i,depth:0},null,8,["item"])],2))),128))}}),La=$(Va,[["__scopeId","data-v-9e426adc"]]),Ta={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Na=m({__name:"VPSidebar",props:{open:{type:Boolean}},setup(o){const{sidebarGroups:e,hasSidebar:t}=U(),s=o,n=T(null),i=Ie(te?document.body:null);F([s,n],()=>{var v;s.open?(i.value=!0,(v=n.value)==null||v.focus()):i.value=!1},{immediate:!0,flush:"post"});const l=T(0);return F(e,()=>{l.value+=1},{deep:!0}),(v,d)=>r(t)?(a(),u("aside",{key:0,class:I(["VPSidebar",{open:v.open}]),ref_key:"navEl",ref:n,onClick:d[0]||(d[0]=xe(()=>{},["stop"]))},[d[2]||(d[2]=p("div",{class:"curtain"},null,-1)),p("nav",Ta,[d[1]||(d[1]=p("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),c(v.$slots,"sidebar-nav-before",{},void 0,!0),(a(),g(La,{items:r(e),key:l.value},null,8,["items"])),c(v.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):h("",!0)}}),wa=$(Na,[["__scopeId","data-v-18756405"]]),Ia=m({__name:"VPSkipLink",setup(o){const e=ee(),t=T();F(()=>e.path,()=>t.value.focus());function s({target:n}){const i=document.getElementById(decodeURIComponent(n.hash).slice(1));if(i){const l=()=>{i.removeAttribute("tabindex"),i.removeEventListener("blur",l)};i.setAttribute("tabindex","-1"),i.addEventListener("blur",l),i.focus(),window.scrollTo(0,0)}}return(n,i)=>(a(),u(M,null,[p("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),p("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:s}," Skip to content ")],64))}}),Ma=$(Ia,[["__scopeId","data-v-c3508ec8"]]),Aa=m({__name:"Layout",setup(o){const{isOpen:e,open:t,close:s}=U(),n=ee();F(()=>n.path,s),kt(e,s);const{frontmatter:i}=L(),l=Me(),v=y(()=>!!l["home-hero-image"]);return he("hero-image-slot-exists",v),(d,_)=>{const V=R("Content");return r(i).layout!==!1?(a(),u("div",{key:0,class:I(["Layout",r(i).pageClass])},[c(d.$slots,"layout-top",{},void 0,!0),k(Ma),k(rt,{class:"backdrop",show:r(e),onClick:r(s)},null,8,["show","onClick"]),k(ga,null,{"nav-bar-title-before":f(()=>[c(d.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[c(d.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":f(()=>[c(d.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":f(()=>[c(d.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":f(()=>[c(d.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":f(()=>[c(d.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),k(hs,{open:r(e),onOpenMenu:r(t)},null,8,["open","onOpenMenu"]),k(wa,{open:r(e)},{"sidebar-nav-before":f(()=>[c(d.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":f(()=>[c(d.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),k(xn,null,{"page-top":f(()=>[c(d.$slots,"page-top",{},void 0,!0)]),"page-bottom":f(()=>[c(d.$slots,"page-bottom",{},void 0,!0)]),"not-found":f(()=>[c(d.$slots,"not-found",{},void 0,!0)]),"home-hero-before":f(()=>[c(d.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":f(()=>[c(d.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[c(d.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[c(d.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[c(d.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[c(d.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":f(()=>[c(d.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":f(()=>[c(d.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":f(()=>[c(d.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":f(()=>[c(d.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":f(()=>[c(d.$slots,"doc-before",{},void 0,!0)]),"doc-after":f(()=>[c(d.$slots,"doc-after",{},void 0,!0)]),"doc-top":f(()=>[c(d.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":f(()=>[c(d.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":f(()=>[c(d.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":f(()=>[c(d.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":f(()=>[c(d.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[c(d.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[c(d.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[c(d.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),k(os),c(d.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),g(V,{key:1}))}}}),Ca=$(Aa,[["__scopeId","data-v-a9a9e638"]]),Pe={Layout:Ca,enhanceApp:({app:o})=>{o.component("Badge",st)}},Ba=o=>{if(typeof document>"u")return{stabilizeScrollPosition:n=>async(...i)=>n(...i)};const e=document.documentElement;return{stabilizeScrollPosition:s=>async(...n)=>{const i=s(...n),l=o.value;if(!l)return i;const v=l.offsetTop-e.scrollTop;return await Ne(),e.scrollTop=l.offsetTop-v,i}}},Fe="vitepress:tabSharedState",J=typeof localStorage<"u"?localStorage:null,Oe="vitepress:tabsSharedState",Ha=()=>{const o=J==null?void 0:J.getItem(Oe);if(o)try{return JSON.parse(o)}catch{}return{}},Ea=o=>{J&&J.setItem(Oe,JSON.stringify(o))},Da=o=>{const e=et({});F(()=>e.content,(t,s)=>{t&&s&&Ea(t)},{deep:!0}),o.provide(Fe,e)},Fa=(o,e)=>{const t=q(Fe);if(!t)throw new Error("[vitepress-plugin-tabs] TabsSharedState should be injected");z(()=>{t.content||(t.content=Ha())});const s=T(),n=y({get(){var d;const l=e.value,v=o.value;if(l){const _=(d=t.content)==null?void 0:d[l];if(_&&v.includes(_))return _}else{const _=s.value;if(_)return _}return v[0]},set(l){const v=e.value;v?t.content&&(t.content[v]=l):s.value=l}});return{selected:n,select:l=>{n.value=l}}};let Se=0;const Oa=()=>(Se++,""+Se);function Ua(){const o=Me();return y(()=>{var s;const t=(s=o.default)==null?void 0:s.call(o);return t?t.filter(n=>typeof n.type=="object"&&"__name"in n.type&&n.type.__name==="PluginTabsTab"&&n.props).map(n=>{var i;return(i=n.props)==null?void 0:i.label}):[]})}const Ue="vitepress:tabSingleState",ja=o=>{he(Ue,o)},Ga=()=>{const o=q(Ue);if(!o)throw new Error("[vitepress-plugin-tabs] TabsSingleState should be injected");return o},za={class:"plugin-tabs"},Ka=["id","aria-selected","aria-controls","tabindex","onClick"],Ra=m({__name:"PluginTabs",props:{sharedStateKey:{}},setup(o){const e=o,t=Ua(),{selected:s,select:n}=Fa(t,tt(e,"sharedStateKey")),i=T(),{stabilizeScrollPosition:l}=Ba(i),v=l(n),d=T([]),_=b=>{var A;const P=t.value.indexOf(s.value);let S;b.key==="ArrowLeft"?S=P>=1?P-1:t.value.length-1:b.key==="ArrowRight"&&(S=P(a(),u("div",za,[p("div",{ref_key:"tablist",ref:i,class:"plugin-tabs--tab-list",role:"tablist",onKeydown:_},[(a(!0),u(M,null,B(r(t),S=>(a(),u("button",{id:`tab-${S}-${r(V)}`,ref_for:!0,ref_key:"buttonRefs",ref:d,key:S,role:"tab",class:"plugin-tabs--tab","aria-selected":S===r(s),"aria-controls":`panel-${S}-${r(V)}`,tabindex:S===r(s)?0:-1,onClick:()=>r(v)(S)},w(S),9,Ka))),128))],544),c(b.$slots,"default")]))}}),Wa=["id","aria-labelledby"],qa=m({__name:"PluginTabsTab",props:{label:{}},setup(o){const{uid:e,selected:t}=Ga();return(s,n)=>r(t)===s.label?(a(),u("div",{key:0,id:`panel-${s.label}-${r(e)}`,class:"plugin-tabs--content",role:"tabpanel",tabindex:"0","aria-labelledby":`tab-${s.label}-${r(e)}`},[c(s.$slots,"default",{},void 0,!0)],8,Wa)):h("",!0)}}),Ja=$(qa,[["__scopeId","data-v-9b0d03d2"]]),Ya=o=>{Da(o),o.component("PluginTabs",Ra),o.component("PluginTabsTab",Ja)},Qa={extends:Pe,Layout(){return nt(Pe.Layout,null,{})},enhanceApp({app:o,router:e,siteData:t}){Ya(o)}};export{Qa as R,bo as c,L as u};
+const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPLocalSearchBox.B1FKPByJ.js","assets/chunks/framework.CJakPlgM.js"])))=>i.map(i=>d[i]);
+import{d as m,o as a,c as u,r as c,n as I,a as O,t as w,b as g,w as f,e as h,T as de,_ as $,u as je,i as Ge,f as ze,g as ve,h as y,j as p,k as r,l as K,m as re,p as T,q as F,s as Z,v as z,x as pe,y as fe,z as Ke,A as Re,B as R,F as M,C as B,D as Ve,E as x,G as k,H as E,I as Le,J as ee,K as G,L as q,M as We,N as Te,O as ie,P as Ne,Q as we,R as te,S as qe,U as Je,V as Ye,W as Ie,X as he,Y as Xe,Z as Qe,$ as Ze,a0 as xe,a1 as Me,a2 as et,a3 as tt,a4 as nt}from"./framework.CJakPlgM.js";const st=m({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(o){return(e,t)=>(a(),u("span",{class:I(["VPBadge",e.type])},[c(e.$slots,"default",{},()=>[O(w(e.text),1)])],2))}}),ot={key:0,class:"VPBackdrop"},at=m({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(o){return(e,t)=>(a(),g(de,{name:"fade"},{default:f(()=>[e.show?(a(),u("div",ot)):h("",!0)]),_:1}))}}),rt=$(at,[["__scopeId","data-v-b06cdb19"]]),L=je;function it(o,e){let t,s=!1;return()=>{t&&clearTimeout(t),s?t=setTimeout(o,e):(o(),(s=!0)&&setTimeout(()=>s=!1,e))}}function le(o){return/^\//.test(o)?o:`/${o}`}function me(o){const{pathname:e,search:t,hash:s,protocol:n}=new URL(o,"http://a.com");if(Ge(o)||o.startsWith("#")||!n.startsWith("http")||!ze(e))return o;const{site:i}=L(),l=e.endsWith("/")||e.endsWith(".html")?o:o.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,i.value.cleanUrls?"":".html")}${t}${s}`);return ve(l)}function Y({correspondingLink:o=!1}={}){const{site:e,localeIndex:t,page:s,theme:n,hash:i}=L(),l=y(()=>{var d,_;return{label:(d=e.value.locales[t.value])==null?void 0:d.label,link:((_=e.value.locales[t.value])==null?void 0:_.link)||(t.value==="root"?"/":`/${t.value}/`)}});return{localeLinks:y(()=>Object.entries(e.value.locales).flatMap(([d,_])=>l.value.label===_.label?[]:{text:_.label,link:lt(_.link||(d==="root"?"/":`/${d}/`),n.value.i18nRouting!==!1&&o,s.value.relativePath.slice(l.value.link.length-1),!e.value.cleanUrls)+i.value})),currentLang:l}}function lt(o,e,t,s){return e?o.replace(/\/$/,"")+le(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,s?".html":"")):o}const ct={class:"NotFound"},ut={class:"code"},dt={class:"title"},vt={class:"quote"},pt={class:"action"},ft=["href","aria-label"],ht=m({__name:"NotFound",setup(o){const{theme:e}=L(),{currentLang:t}=Y();return(s,n)=>{var i,l,v,d,_;return a(),u("div",ct,[p("p",ut,w(((i=r(e).notFound)==null?void 0:i.code)??"404"),1),p("h1",dt,w(((l=r(e).notFound)==null?void 0:l.title)??"PAGE NOT FOUND"),1),n[0]||(n[0]=p("div",{class:"divider"},null,-1)),p("blockquote",vt,w(((v=r(e).notFound)==null?void 0:v.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),p("div",pt,[p("a",{class:"link",href:r(ve)(r(t).link),"aria-label":((d=r(e).notFound)==null?void 0:d.linkLabel)??"go to home"},w(((_=r(e).notFound)==null?void 0:_.linkText)??"Take me home"),9,ft)])])}}}),mt=$(ht,[["__scopeId","data-v-951cab6c"]]);function Ae(o,e){if(Array.isArray(o))return X(o);if(o==null)return[];e=le(e);const t=Object.keys(o).sort((n,i)=>i.split("/").length-n.split("/").length).find(n=>e.startsWith(le(n))),s=t?o[t]:[];return Array.isArray(s)?X(s):X(s.items,s.base)}function _t(o){const e=[];let t=0;for(const s in o){const n=o[s];if(n.items){t=e.push(n);continue}e[t]||e.push({items:[]}),e[t].items.push(n)}return e}function bt(o){const e=[];function t(s){for(const n of s)n.text&&n.link&&e.push({text:n.text,link:n.link,docFooterText:n.docFooterText}),n.items&&t(n.items)}return t(o),e}function ce(o,e){return Array.isArray(e)?e.some(t=>ce(o,t)):K(o,e.link)?!0:e.items?ce(o,e.items):!1}function X(o,e){return[...o].map(t=>{const s={...t},n=s.base||e;return n&&s.link&&(s.link=n+s.link),s.items&&(s.items=X(s.items,n)),s})}function U(){const{frontmatter:o,page:e,theme:t}=L(),s=re("(min-width: 960px)"),n=T(!1),i=y(()=>{const C=t.value.sidebar,N=e.value.relativePath;return C?Ae(C,N):[]}),l=T(i.value);F(i,(C,N)=>{JSON.stringify(C)!==JSON.stringify(N)&&(l.value=i.value)});const v=y(()=>o.value.sidebar!==!1&&l.value.length>0&&o.value.layout!=="home"),d=y(()=>_?o.value.aside==null?t.value.aside==="left":o.value.aside==="left":!1),_=y(()=>o.value.layout==="home"?!1:o.value.aside!=null?!!o.value.aside:t.value.aside!==!1),V=y(()=>v.value&&s.value),b=y(()=>v.value?_t(l.value):[]);function P(){n.value=!0}function S(){n.value=!1}function A(){n.value?S():P()}return{isOpen:n,sidebar:l,sidebarGroups:b,hasSidebar:v,hasAside:_,leftAside:d,isSidebarEnabled:V,open:P,close:S,toggle:A}}function kt(o,e){let t;Z(()=>{t=o.value?document.activeElement:void 0}),z(()=>{window.addEventListener("keyup",s)}),pe(()=>{window.removeEventListener("keyup",s)});function s(n){n.key==="Escape"&&o.value&&(e(),t==null||t.focus())}}function gt(o){const{page:e,hash:t}=L(),s=T(!1),n=y(()=>o.value.collapsed!=null),i=y(()=>!!o.value.link),l=T(!1),v=()=>{l.value=K(e.value.relativePath,o.value.link)};F([e,o,t],v),z(v);const d=y(()=>l.value?!0:o.value.items?ce(e.value.relativePath,o.value.items):!1),_=y(()=>!!(o.value.items&&o.value.items.length));Z(()=>{s.value=!!(n.value&&o.value.collapsed)}),fe(()=>{(l.value||d.value)&&(s.value=!1)});function V(){n.value&&(s.value=!s.value)}return{collapsed:s,collapsible:n,isLink:i,isActiveLink:l,hasActiveLink:d,hasChildren:_,toggle:V}}function $t(){const{hasSidebar:o}=U(),e=re("(min-width: 960px)"),t=re("(min-width: 1280px)");return{isAsideEnabled:y(()=>!t.value&&!e.value?!1:o.value?t.value:e.value)}}const ue=[];function Ce(o){return typeof o.outline=="object"&&!Array.isArray(o.outline)&&o.outline.label||o.outlineTitle||"On this page"}function _e(o){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const s=Number(t.tagName[1]);return{element:t,title:yt(t),link:"#"+t.id,level:s}});return Pt(e,o)}function yt(o){let e="";for(const t of o.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor")||t.classList.contains("ignore-header"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function Pt(o,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[s,n]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;o=o.filter(l=>l.level>=s&&l.level<=n),ue.length=0;for(const{element:l,link:v}of o)ue.push({element:l,link:v});const i=[];e:for(let l=0;l=0;d--){const _=o[d];if(_.level{requestAnimationFrame(i),window.addEventListener("scroll",s)}),Ke(()=>{l(location.hash)}),pe(()=>{window.removeEventListener("scroll",s)});function i(){if(!t.value)return;const v=window.scrollY,d=window.innerHeight,_=document.body.offsetHeight,V=Math.abs(v+d-_)<1,b=ue.map(({element:S,link:A})=>({link:A,top:Vt(S)})).filter(({top:S})=>!Number.isNaN(S)).sort((S,A)=>S.top-A.top);if(!b.length){l(null);return}if(v<1){l(null);return}if(V){l(b[b.length-1].link);return}let P=null;for(const{link:S,top:A}of b){if(A>v+Re()+4)break;P=S}l(P)}function l(v){n&&n.classList.remove("active"),v==null?n=null:n=o.value.querySelector(`a[href="${decodeURIComponent(v)}"]`);const d=n;d?(d.classList.add("active"),e.value.style.top=d.offsetTop+39+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function Vt(o){let e=0;for(;o!==document.body;){if(o===null)return NaN;e+=o.offsetTop,o=o.offsetParent}return e}const Lt=["href","title"],Tt=m({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(o){function e({target:t}){const s=t.href.split("#")[1],n=document.getElementById(decodeURIComponent(s));n==null||n.focus({preventScroll:!0})}return(t,s)=>{const n=R("VPDocOutlineItem",!0);return a(),u("ul",{class:I(["VPDocOutlineItem",t.root?"root":"nested"])},[(a(!0),u(M,null,B(t.headers,({children:i,link:l,title:v})=>(a(),u("li",null,[p("a",{class:"outline-link",href:l,onClick:e,title:v},w(v),9,Lt),i!=null&&i.length?(a(),g(n,{key:0,headers:i},null,8,["headers"])):h("",!0)]))),256))],2)}}}),Be=$(Tt,[["__scopeId","data-v-3f927ebe"]]),Nt={class:"content"},wt={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},It=m({__name:"VPDocAsideOutline",setup(o){const{frontmatter:e,theme:t}=L(),s=Ve([]);x(()=>{s.value=_e(e.value.outline??t.value.outline)});const n=T(),i=T();return St(n,i),(l,v)=>(a(),u("nav",{"aria-labelledby":"doc-outline-aria-label",class:I(["VPDocAsideOutline",{"has-outline":s.value.length>0}]),ref_key:"container",ref:n},[p("div",Nt,[p("div",{class:"outline-marker",ref_key:"marker",ref:i},null,512),p("div",wt,w(r(Ce)(r(t))),1),k(Be,{headers:s.value,root:!0},null,8,["headers"])])],2))}}),Mt=$(It,[["__scopeId","data-v-b38bf2ff"]]),At={class:"VPDocAsideCarbonAds"},Ct=m({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(o){const e=()=>null;return(t,s)=>(a(),u("div",At,[k(r(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),Bt={class:"VPDocAside"},Ht=m({__name:"VPDocAside",setup(o){const{theme:e}=L();return(t,s)=>(a(),u("div",Bt,[c(t.$slots,"aside-top",{},void 0,!0),c(t.$slots,"aside-outline-before",{},void 0,!0),k(Mt),c(t.$slots,"aside-outline-after",{},void 0,!0),s[0]||(s[0]=p("div",{class:"spacer"},null,-1)),c(t.$slots,"aside-ads-before",{},void 0,!0),r(e).carbonAds?(a(),g(Ct,{key:0,"carbon-ads":r(e).carbonAds},null,8,["carbon-ads"])):h("",!0),c(t.$slots,"aside-ads-after",{},void 0,!0),c(t.$slots,"aside-bottom",{},void 0,!0)]))}}),Et=$(Ht,[["__scopeId","data-v-6d7b3c46"]]);function Dt(){const{theme:o,page:e}=L();return y(()=>{const{text:t="Edit this page",pattern:s=""}=o.value.editLink||{};let n;return typeof s=="function"?n=s(e.value):n=s.replace(/:path/g,e.value.filePath),{url:n,text:t}})}function Ft(){const{page:o,theme:e,frontmatter:t}=L();return y(()=>{var _,V,b,P,S,A,C,N;const s=Ae(e.value.sidebar,o.value.relativePath),n=bt(s),i=Ot(n,H=>H.link.replace(/[?#].*$/,"")),l=i.findIndex(H=>K(o.value.relativePath,H.link)),v=((_=e.value.docFooter)==null?void 0:_.prev)===!1&&!t.value.prev||t.value.prev===!1,d=((V=e.value.docFooter)==null?void 0:V.next)===!1&&!t.value.next||t.value.next===!1;return{prev:v?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((b=i[l-1])==null?void 0:b.docFooterText)??((P=i[l-1])==null?void 0:P.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((S=i[l-1])==null?void 0:S.link)},next:d?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((A=i[l+1])==null?void 0:A.docFooterText)??((C=i[l+1])==null?void 0:C.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((N=i[l+1])==null?void 0:N.link)}}})}function Ot(o,e){const t=new Set;return o.filter(s=>{const n=e(s);return t.has(n)?!1:t.add(n)})}const D=m({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(o){const e=o,t=y(()=>e.tag??(e.href?"a":"span")),s=y(()=>e.href&&Le.test(e.href)||e.target==="_blank");return(n,i)=>(a(),g(E(t.value),{class:I(["VPLink",{link:n.href,"vp-external-link-icon":s.value,"no-icon":n.noIcon}]),href:n.href?r(me)(n.href):void 0,target:n.target??(s.value?"_blank":void 0),rel:n.rel??(s.value?"noreferrer":void 0)},{default:f(()=>[c(n.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Ut={class:"VPLastUpdated"},jt=["datetime"],Gt=m({__name:"VPDocFooterLastUpdated",setup(o){const{theme:e,page:t,lang:s}=L(),n=y(()=>new Date(t.value.lastUpdated)),i=y(()=>n.value.toISOString()),l=T("");return z(()=>{Z(()=>{var v,d,_;l.value=new Intl.DateTimeFormat((d=(v=e.value.lastUpdated)==null?void 0:v.formatOptions)!=null&&d.forceLocale?s.value:void 0,((_=e.value.lastUpdated)==null?void 0:_.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(n.value)})}),(v,d)=>{var _;return a(),u("p",Ut,[O(w(((_=r(e).lastUpdated)==null?void 0:_.text)||r(e).lastUpdatedText||"Last updated")+": ",1),p("time",{datetime:i.value},w(l.value),9,jt)])}}}),zt=$(Gt,[["__scopeId","data-v-475f71b8"]]),Kt={key:0,class:"VPDocFooter"},Rt={key:0,class:"edit-info"},Wt={key:0,class:"edit-link"},qt={key:1,class:"last-updated"},Jt={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},Yt={class:"pager"},Xt=["innerHTML"],Qt=["innerHTML"],Zt={class:"pager"},xt=["innerHTML"],en=["innerHTML"],tn=m({__name:"VPDocFooter",setup(o){const{theme:e,page:t,frontmatter:s}=L(),n=Dt(),i=Ft(),l=y(()=>e.value.editLink&&s.value.editLink!==!1),v=y(()=>t.value.lastUpdated),d=y(()=>l.value||v.value||i.value.prev||i.value.next);return(_,V)=>{var b,P,S,A;return d.value?(a(),u("footer",Kt,[c(_.$slots,"doc-footer-before",{},void 0,!0),l.value||v.value?(a(),u("div",Rt,[l.value?(a(),u("div",Wt,[k(D,{class:"edit-link-button",href:r(n).url,"no-icon":!0},{default:f(()=>[V[0]||(V[0]=p("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),O(" "+w(r(n).text),1)]),_:1},8,["href"])])):h("",!0),v.value?(a(),u("div",qt,[k(zt)])):h("",!0)])):h("",!0),(b=r(i).prev)!=null&&b.link||(P=r(i).next)!=null&&P.link?(a(),u("nav",Jt,[V[1]||(V[1]=p("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),p("div",Yt,[(S=r(i).prev)!=null&&S.link?(a(),g(D,{key:0,class:"pager-link prev",href:r(i).prev.link},{default:f(()=>{var C;return[p("span",{class:"desc",innerHTML:((C=r(e).docFooter)==null?void 0:C.prev)||"Previous page"},null,8,Xt),p("span",{class:"title",innerHTML:r(i).prev.text},null,8,Qt)]}),_:1},8,["href"])):h("",!0)]),p("div",Zt,[(A=r(i).next)!=null&&A.link?(a(),g(D,{key:0,class:"pager-link next",href:r(i).next.link},{default:f(()=>{var C;return[p("span",{class:"desc",innerHTML:((C=r(e).docFooter)==null?void 0:C.next)||"Next page"},null,8,xt),p("span",{class:"title",innerHTML:r(i).next.text},null,8,en)]}),_:1},8,["href"])):h("",!0)])])):h("",!0)])):h("",!0)}}}),nn=$(tn,[["__scopeId","data-v-4f9813fa"]]),sn={class:"container"},on={class:"aside-container"},an={class:"aside-content"},rn={class:"content"},ln={class:"content-container"},cn={class:"main"},un=m({__name:"VPDoc",setup(o){const{theme:e}=L(),t=ee(),{hasSidebar:s,hasAside:n,leftAside:i}=U(),l=y(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(v,d)=>{const _=R("Content");return a(),u("div",{class:I(["VPDoc",{"has-sidebar":r(s),"has-aside":r(n)}])},[c(v.$slots,"doc-top",{},void 0,!0),p("div",sn,[r(n)?(a(),u("div",{key:0,class:I(["aside",{"left-aside":r(i)}])},[d[0]||(d[0]=p("div",{class:"aside-curtain"},null,-1)),p("div",on,[p("div",an,[k(Et,null,{"aside-top":f(()=>[c(v.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":f(()=>[c(v.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":f(()=>[c(v.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[c(v.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[c(v.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[c(v.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):h("",!0),p("div",rn,[p("div",ln,[c(v.$slots,"doc-before",{},void 0,!0),p("main",cn,[k(_,{class:I(["vp-doc",[l.value,r(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),k(nn,null,{"doc-footer-before":f(()=>[c(v.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),c(v.$slots,"doc-after",{},void 0,!0)])])]),c(v.$slots,"doc-bottom",{},void 0,!0)],2)}}}),dn=$(un,[["__scopeId","data-v-83890dd9"]]),vn=m({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(o){const e=o,t=y(()=>e.href&&Le.test(e.href)),s=y(()=>e.tag||e.href?"a":"button");return(n,i)=>(a(),g(E(s.value),{class:I(["VPButton",[n.size,n.theme]]),href:n.href?r(me)(n.href):void 0,target:e.target??(t.value?"_blank":void 0),rel:e.rel??(t.value?"noreferrer":void 0)},{default:f(()=>[O(w(n.text),1)]),_:1},8,["class","href","target","rel"]))}}),pn=$(vn,[["__scopeId","data-v-14206e74"]]),fn=["src","alt"],hn=m({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(o){return(e,t)=>{const s=R("VPImage",!0);return e.image?(a(),u(M,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),u("img",G({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:r(ve)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,fn)):(a(),u(M,{key:1},[k(s,G({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),k(s,G({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):h("",!0)}}}),Q=$(hn,[["__scopeId","data-v-35a7d0b8"]]),mn={class:"container"},_n={class:"main"},bn={key:0,class:"name"},kn=["innerHTML"],gn=["innerHTML"],$n=["innerHTML"],yn={key:0,class:"actions"},Pn={key:0,class:"image"},Sn={class:"image-container"},Vn=m({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(o){const e=q("hero-image-slot-exists");return(t,s)=>(a(),u("div",{class:I(["VPHero",{"has-image":t.image||r(e)}])},[p("div",mn,[p("div",_n,[c(t.$slots,"home-hero-info-before",{},void 0,!0),c(t.$slots,"home-hero-info",{},()=>[t.name?(a(),u("h1",bn,[p("span",{innerHTML:t.name,class:"clip"},null,8,kn)])):h("",!0),t.text?(a(),u("p",{key:1,innerHTML:t.text,class:"text"},null,8,gn)):h("",!0),t.tagline?(a(),u("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,$n)):h("",!0)],!0),c(t.$slots,"home-hero-info-after",{},void 0,!0),t.actions?(a(),u("div",yn,[(a(!0),u(M,null,B(t.actions,n=>(a(),u("div",{key:n.link,class:"action"},[k(pn,{tag:"a",size:"medium",theme:n.theme,text:n.text,href:n.link,target:n.target,rel:n.rel},null,8,["theme","text","href","target","rel"])]))),128))])):h("",!0),c(t.$slots,"home-hero-actions-after",{},void 0,!0)]),t.image||r(e)?(a(),u("div",Pn,[p("div",Sn,[s[0]||(s[0]=p("div",{class:"image-bg"},null,-1)),c(t.$slots,"home-hero-image",{},()=>[t.image?(a(),g(Q,{key:0,class:"image-src",image:t.image},null,8,["image"])):h("",!0)],!0)])])):h("",!0)])],2))}}),Ln=$(Vn,[["__scopeId","data-v-955009fc"]]),Tn=m({__name:"VPHomeHero",setup(o){const{frontmatter:e}=L();return(t,s)=>r(e).hero?(a(),g(Ln,{key:0,class:"VPHomeHero",name:r(e).hero.name,text:r(e).hero.text,tagline:r(e).hero.tagline,image:r(e).hero.image,actions:r(e).hero.actions},{"home-hero-info-before":f(()=>[c(t.$slots,"home-hero-info-before")]),"home-hero-info":f(()=>[c(t.$slots,"home-hero-info")]),"home-hero-info-after":f(()=>[c(t.$slots,"home-hero-info-after")]),"home-hero-actions-after":f(()=>[c(t.$slots,"home-hero-actions-after")]),"home-hero-image":f(()=>[c(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):h("",!0)}}),Nn={class:"box"},wn={key:0,class:"icon"},In=["innerHTML"],Mn=["innerHTML"],An=["innerHTML"],Cn={key:4,class:"link-text"},Bn={class:"link-text-value"},Hn=m({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(o){return(e,t)=>(a(),g(D,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:f(()=>[p("article",Nn,[typeof e.icon=="object"&&e.icon.wrap?(a(),u("div",wn,[k(Q,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(a(),g(Q,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(a(),u("div",{key:2,class:"icon",innerHTML:e.icon},null,8,In)):h("",!0),p("h2",{class:"title",innerHTML:e.title},null,8,Mn),e.details?(a(),u("p",{key:3,class:"details",innerHTML:e.details},null,8,An)):h("",!0),e.linkText?(a(),u("div",Cn,[p("p",Bn,[O(w(e.linkText)+" ",1),t[0]||(t[0]=p("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):h("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),En=$(Hn,[["__scopeId","data-v-f5e9645b"]]),Dn={key:0,class:"VPFeatures"},Fn={class:"container"},On={class:"items"},Un=m({__name:"VPFeatures",props:{features:{}},setup(o){const e=o,t=y(()=>{const s=e.features.length;if(s){if(s===2)return"grid-2";if(s===3)return"grid-3";if(s%3===0)return"grid-6";if(s>3)return"grid-4"}else return});return(s,n)=>s.features?(a(),u("div",Dn,[p("div",Fn,[p("div",On,[(a(!0),u(M,null,B(s.features,i=>(a(),u("div",{key:i.title,class:I(["item",[t.value]])},[k(En,{icon:i.icon,title:i.title,details:i.details,link:i.link,"link-text":i.linkText,rel:i.rel,target:i.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):h("",!0)}}),jn=$(Un,[["__scopeId","data-v-d0a190d7"]]),Gn=m({__name:"VPHomeFeatures",setup(o){const{frontmatter:e}=L();return(t,s)=>r(e).features?(a(),g(jn,{key:0,class:"VPHomeFeatures",features:r(e).features},null,8,["features"])):h("",!0)}}),zn=m({__name:"VPHomeContent",setup(o){const{width:e}=We({initialWidth:0,includeScrollbar:!1});return(t,s)=>(a(),u("div",{class:"vp-doc container",style:Te(r(e)?{"--vp-offset":`calc(50% - ${r(e)/2}px)`}:{})},[c(t.$slots,"default",{},void 0,!0)],4))}}),Kn=$(zn,[["__scopeId","data-v-7a48a447"]]),Rn={class:"VPHome"},Wn=m({__name:"VPHome",setup(o){const{frontmatter:e}=L();return(t,s)=>{const n=R("Content");return a(),u("div",Rn,[c(t.$slots,"home-hero-before",{},void 0,!0),k(Tn,null,{"home-hero-info-before":f(()=>[c(t.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[c(t.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[c(t.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[c(t.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[c(t.$slots,"home-hero-image",{},void 0,!0)]),_:3}),c(t.$slots,"home-hero-after",{},void 0,!0),c(t.$slots,"home-features-before",{},void 0,!0),k(Gn),c(t.$slots,"home-features-after",{},void 0,!0),r(e).markdownStyles!==!1?(a(),g(Kn,{key:0},{default:f(()=>[k(n)]),_:1})):(a(),g(n,{key:1}))])}}}),qn=$(Wn,[["__scopeId","data-v-cbb6ec48"]]),Jn={},Yn={class:"VPPage"};function Xn(o,e){const t=R("Content");return a(),u("div",Yn,[c(o.$slots,"page-top"),k(t),c(o.$slots,"page-bottom")])}const Qn=$(Jn,[["render",Xn]]),Zn=m({__name:"VPContent",setup(o){const{page:e,frontmatter:t}=L(),{hasSidebar:s}=U();return(n,i)=>(a(),u("div",{class:I(["VPContent",{"has-sidebar":r(s),"is-home":r(t).layout==="home"}]),id:"VPContent"},[r(e).isNotFound?c(n.$slots,"not-found",{key:0},()=>[k(mt)],!0):r(t).layout==="page"?(a(),g(Qn,{key:1},{"page-top":f(()=>[c(n.$slots,"page-top",{},void 0,!0)]),"page-bottom":f(()=>[c(n.$slots,"page-bottom",{},void 0,!0)]),_:3})):r(t).layout==="home"?(a(),g(qn,{key:2},{"home-hero-before":f(()=>[c(n.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":f(()=>[c(n.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[c(n.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[c(n.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[c(n.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[c(n.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":f(()=>[c(n.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":f(()=>[c(n.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":f(()=>[c(n.$slots,"home-features-after",{},void 0,!0)]),_:3})):r(t).layout&&r(t).layout!=="doc"?(a(),g(E(r(t).layout),{key:3})):(a(),g(dn,{key:4},{"doc-top":f(()=>[c(n.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":f(()=>[c(n.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":f(()=>[c(n.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":f(()=>[c(n.$slots,"doc-before",{},void 0,!0)]),"doc-after":f(()=>[c(n.$slots,"doc-after",{},void 0,!0)]),"aside-top":f(()=>[c(n.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":f(()=>[c(n.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[c(n.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[c(n.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[c(n.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":f(()=>[c(n.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),xn=$(Zn,[["__scopeId","data-v-91765379"]]),es={class:"container"},ts=["innerHTML"],ns=["innerHTML"],ss=m({__name:"VPFooter",setup(o){const{theme:e,frontmatter:t}=L(),{hasSidebar:s}=U();return(n,i)=>r(e).footer&&r(t).footer!==!1?(a(),u("footer",{key:0,class:I(["VPFooter",{"has-sidebar":r(s)}])},[p("div",es,[r(e).footer.message?(a(),u("p",{key:0,class:"message",innerHTML:r(e).footer.message},null,8,ts)):h("",!0),r(e).footer.copyright?(a(),u("p",{key:1,class:"copyright",innerHTML:r(e).footer.copyright},null,8,ns)):h("",!0)])],2)):h("",!0)}}),os=$(ss,[["__scopeId","data-v-c970a860"]]);function as(){const{theme:o,frontmatter:e}=L(),t=Ve([]),s=y(()=>t.value.length>0);return x(()=>{t.value=_e(e.value.outline??o.value.outline)}),{headers:t,hasLocalNav:s}}const rs={class:"menu-text"},is={class:"header"},ls={class:"outline"},cs=m({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(o){const e=o,{theme:t}=L(),s=T(!1),n=T(0),i=T(),l=T();function v(b){var P;(P=i.value)!=null&&P.contains(b.target)||(s.value=!1)}F(s,b=>{if(b){document.addEventListener("click",v);return}document.removeEventListener("click",v)}),ie("Escape",()=>{s.value=!1}),x(()=>{s.value=!1});function d(){s.value=!s.value,n.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function _(b){b.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Ne(()=>{s.value=!1}))}function V(){s.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(b,P)=>(a(),u("div",{class:"VPLocalNavOutlineDropdown",style:Te({"--vp-vh":n.value+"px"}),ref_key:"main",ref:i},[b.headers.length>0?(a(),u("button",{key:0,onClick:d,class:I({open:s.value})},[p("span",rs,w(r(Ce)(r(t))),1),P[0]||(P[0]=p("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(a(),u("button",{key:1,onClick:V},w(r(t).returnToTopLabel||"Return to top"),1)),k(de,{name:"flyout"},{default:f(()=>[s.value?(a(),u("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:_},[p("div",is,[p("a",{class:"top-link",href:"#",onClick:V},w(r(t).returnToTopLabel||"Return to top"),1)]),p("div",ls,[k(Be,{headers:b.headers},null,8,["headers"])])],512)):h("",!0)]),_:1})],4))}}),us=$(cs,[["__scopeId","data-v-bc9dc845"]]),ds={class:"container"},vs=["aria-expanded"],ps={class:"menu-text"},fs=m({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(o){const{theme:e,frontmatter:t}=L(),{hasSidebar:s}=U(),{headers:n}=as(),{y:i}=we(),l=T(0);z(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),x(()=>{n.value=_e(t.value.outline??e.value.outline)});const v=y(()=>n.value.length===0),d=y(()=>v.value&&!s.value),_=y(()=>({VPLocalNav:!0,"has-sidebar":s.value,empty:v.value,fixed:d.value}));return(V,b)=>r(t).layout!=="home"&&(!d.value||r(i)>=l.value)?(a(),u("div",{key:0,class:I(_.value)},[p("div",ds,[r(s)?(a(),u("button",{key:0,class:"menu","aria-expanded":V.open,"aria-controls":"VPSidebarNav",onClick:b[0]||(b[0]=P=>V.$emit("open-menu"))},[b[1]||(b[1]=p("span",{class:"vpi-align-left menu-icon"},null,-1)),p("span",ps,w(r(e).sidebarMenuLabel||"Menu"),1)],8,vs)):h("",!0),k(us,{headers:r(n),navHeight:l.value},null,8,["headers","navHeight"])])],2)):h("",!0)}}),hs=$(fs,[["__scopeId","data-v-070ab83d"]]);function ms(){const o=T(!1);function e(){o.value=!0,window.addEventListener("resize",n)}function t(){o.value=!1,window.removeEventListener("resize",n)}function s(){o.value?t():e()}function n(){window.outerWidth>=768&&t()}const i=ee();return F(()=>i.path,t),{isScreenOpen:o,openScreen:e,closeScreen:t,toggleScreen:s}}const _s={},bs={class:"VPSwitch",type:"button",role:"switch"},ks={class:"check"},gs={key:0,class:"icon"};function $s(o,e){return a(),u("button",bs,[p("span",ks,[o.$slots.default?(a(),u("span",gs,[c(o.$slots,"default",{},void 0,!0)])):h("",!0)])])}const ys=$(_s,[["render",$s],["__scopeId","data-v-4a1c76db"]]),Ps=m({__name:"VPSwitchAppearance",setup(o){const{isDark:e,theme:t}=L(),s=q("toggle-appearance",()=>{e.value=!e.value}),n=T("");return fe(()=>{n.value=e.value?t.value.lightModeSwitchTitle||"Switch to light theme":t.value.darkModeSwitchTitle||"Switch to dark theme"}),(i,l)=>(a(),g(ys,{title:n.value,class:"VPSwitchAppearance","aria-checked":r(e),onClick:r(s)},{default:f(()=>l[0]||(l[0]=[p("span",{class:"vpi-sun sun"},null,-1),p("span",{class:"vpi-moon moon"},null,-1)])),_:1},8,["title","aria-checked","onClick"]))}}),be=$(Ps,[["__scopeId","data-v-e40a8bb6"]]),Ss={key:0,class:"VPNavBarAppearance"},Vs=m({__name:"VPNavBarAppearance",setup(o){const{site:e}=L();return(t,s)=>r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),u("div",Ss,[k(be)])):h("",!0)}}),Ls=$(Vs,[["__scopeId","data-v-af096f4a"]]),ke=T();let He=!1,ae=0;function Ts(o){const e=T(!1);if(te){!He&&Ns(),ae++;const t=F(ke,s=>{var n,i,l;s===o.el.value||(n=o.el.value)!=null&&n.contains(s)?(e.value=!0,(i=o.onFocus)==null||i.call(o)):(e.value=!1,(l=o.onBlur)==null||l.call(o))});pe(()=>{t(),ae--,ae||ws()})}return qe(e)}function Ns(){document.addEventListener("focusin",Ee),He=!0,ke.value=document.activeElement}function ws(){document.removeEventListener("focusin",Ee)}function Ee(){ke.value=document.activeElement}const Is={class:"VPMenuLink"},Ms=m({__name:"VPMenuLink",props:{item:{}},setup(o){const{page:e}=L();return(t,s)=>(a(),u("div",Is,[k(D,{class:I({active:r(K)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:f(()=>[O(w(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}}),ne=$(Ms,[["__scopeId","data-v-8b74d055"]]),As={class:"VPMenuGroup"},Cs={key:0,class:"title"},Bs=m({__name:"VPMenuGroup",props:{text:{},items:{}},setup(o){return(e,t)=>(a(),u("div",As,[e.text?(a(),u("p",Cs,w(e.text),1)):h("",!0),(a(!0),u(M,null,B(e.items,s=>(a(),u(M,null,["link"in s?(a(),g(ne,{key:0,item:s},null,8,["item"])):h("",!0)],64))),256))]))}}),Hs=$(Bs,[["__scopeId","data-v-48c802d0"]]),Es={class:"VPMenu"},Ds={key:0,class:"items"},Fs=m({__name:"VPMenu",props:{items:{}},setup(o){return(e,t)=>(a(),u("div",Es,[e.items?(a(),u("div",Ds,[(a(!0),u(M,null,B(e.items,s=>(a(),u(M,{key:JSON.stringify(s)},["link"in s?(a(),g(ne,{key:0,item:s},null,8,["item"])):"component"in s?(a(),g(E(s.component),G({key:1,ref_for:!0},s.props),null,16)):(a(),g(Hs,{key:2,text:s.text,items:s.items},null,8,["text","items"]))],64))),128))])):h("",!0),c(e.$slots,"default",{},void 0,!0)]))}}),Os=$(Fs,[["__scopeId","data-v-7dd3104a"]]),Us=["aria-expanded","aria-label"],js={key:0,class:"text"},Gs=["innerHTML"],zs={key:1,class:"vpi-more-horizontal icon"},Ks={class:"menu"},Rs=m({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(o){const e=T(!1),t=T();Ts({el:t,onBlur:s});function s(){e.value=!1}return(n,i)=>(a(),u("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:i[1]||(i[1]=l=>e.value=!0),onMouseleave:i[2]||(i[2]=l=>e.value=!1)},[p("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":n.label,onClick:i[0]||(i[0]=l=>e.value=!e.value)},[n.button||n.icon?(a(),u("span",js,[n.icon?(a(),u("span",{key:0,class:I([n.icon,"option-icon"])},null,2)):h("",!0),n.button?(a(),u("span",{key:1,innerHTML:n.button},null,8,Gs)):h("",!0),i[3]||(i[3]=p("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(a(),u("span",zs))],8,Us),p("div",Ks,[k(Os,{items:n.items},{default:f(()=>[c(n.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),ge=$(Rs,[["__scopeId","data-v-e5380155"]]),Ws=["href","aria-label","innerHTML"],qs=m({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(o){const e=o,t=y(()=>typeof e.icon=="object"?e.icon.svg:``);return(s,n)=>(a(),u("a",{class:"VPSocialLink no-icon",href:s.link,"aria-label":s.ariaLabel??(typeof s.icon=="string"?s.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,Ws))}}),Js=$(qs,[["__scopeId","data-v-717b8b75"]]),Ys={class:"VPSocialLinks"},Xs=m({__name:"VPSocialLinks",props:{links:{}},setup(o){return(e,t)=>(a(),u("div",Ys,[(a(!0),u(M,null,B(e.links,({link:s,icon:n,ariaLabel:i})=>(a(),g(Js,{key:s,icon:n,link:s,ariaLabel:i},null,8,["icon","link","ariaLabel"]))),128))]))}}),$e=$(Xs,[["__scopeId","data-v-ee7a9424"]]),Qs={key:0,class:"group translations"},Zs={class:"trans-title"},xs={key:1,class:"group"},eo={class:"item appearance"},to={class:"label"},no={class:"appearance-action"},so={key:2,class:"group"},oo={class:"item social-links"},ao=m({__name:"VPNavBarExtra",setup(o){const{site:e,theme:t}=L(),{localeLinks:s,currentLang:n}=Y({correspondingLink:!0}),i=y(()=>s.value.length&&n.value.label||e.value.appearance||t.value.socialLinks);return(l,v)=>i.value?(a(),g(ge,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:f(()=>[r(s).length&&r(n).label?(a(),u("div",Qs,[p("p",Zs,w(r(n).label),1),(a(!0),u(M,null,B(r(s),d=>(a(),g(ne,{key:d.link,item:d},null,8,["item"]))),128))])):h("",!0),r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),u("div",xs,[p("div",eo,[p("p",to,w(r(t).darkModeSwitchLabel||"Appearance"),1),p("div",no,[k(be)])])])):h("",!0),r(t).socialLinks?(a(),u("div",so,[p("div",oo,[k($e,{class:"social-links-list",links:r(t).socialLinks},null,8,["links"])])])):h("",!0)]),_:1})):h("",!0)}}),ro=$(ao,[["__scopeId","data-v-925effce"]]),io=["aria-expanded"],lo=m({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(o){return(e,t)=>(a(),u("button",{type:"button",class:I(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=s=>e.$emit("click"))},t[1]||(t[1]=[p("span",{class:"container"},[p("span",{class:"top"}),p("span",{class:"middle"}),p("span",{class:"bottom"})],-1)]),10,io))}}),co=$(lo,[["__scopeId","data-v-5dea55bf"]]),uo=["innerHTML"],vo=m({__name:"VPNavBarMenuLink",props:{item:{}},setup(o){const{page:e}=L();return(t,s)=>(a(),g(D,{class:I({VPNavBarMenuLink:!0,active:r(K)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,noIcon:t.item.noIcon,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:f(()=>[p("span",{innerHTML:t.item.text},null,8,uo)]),_:1},8,["class","href","noIcon","target","rel"]))}}),po=$(vo,[["__scopeId","data-v-ed5ac1f6"]]),fo=m({__name:"VPNavBarMenuGroup",props:{item:{}},setup(o){const e=o,{page:t}=L(),s=i=>"component"in i?!1:"link"in i?K(t.value.relativePath,i.link,!!e.item.activeMatch):i.items.some(s),n=y(()=>s(e.item));return(i,l)=>(a(),g(ge,{class:I({VPNavBarMenuGroup:!0,active:r(K)(r(t).relativePath,i.item.activeMatch,!!i.item.activeMatch)||n.value}),button:i.item.text,items:i.item.items},null,8,["class","button","items"]))}}),ho={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},mo=m({__name:"VPNavBarMenu",setup(o){const{theme:e}=L();return(t,s)=>r(e).nav?(a(),u("nav",ho,[s[0]||(s[0]=p("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(a(!0),u(M,null,B(r(e).nav,n=>(a(),u(M,{key:JSON.stringify(n)},["link"in n?(a(),g(po,{key:0,item:n},null,8,["item"])):"component"in n?(a(),g(E(n.component),G({key:1,ref_for:!0},n.props),null,16)):(a(),g(fo,{key:2,item:n},null,8,["item"]))],64))),128))])):h("",!0)}}),_o=$(mo,[["__scopeId","data-v-e6d46098"]]);function bo(o){const{localeIndex:e,theme:t}=L();function s(n){var A,C,N;const i=n.split("."),l=(A=t.value.search)==null?void 0:A.options,v=l&&typeof l=="object",d=v&&((N=(C=l.locales)==null?void 0:C[e.value])==null?void 0:N.translations)||null,_=v&&l.translations||null;let V=d,b=_,P=o;const S=i.pop();for(const H of i){let j=null;const W=P==null?void 0:P[H];W&&(j=P=W);const se=b==null?void 0:b[H];se&&(j=b=se);const oe=V==null?void 0:V[H];oe&&(j=V=oe),W||(P=j),se||(b=j),oe||(V=j)}return(V==null?void 0:V[S])??(b==null?void 0:b[S])??(P==null?void 0:P[S])??""}return s}const ko=["aria-label"],go={class:"DocSearch-Button-Container"},$o={class:"DocSearch-Button-Placeholder"},ye=m({__name:"VPNavBarSearchButton",setup(o){const t=bo({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(s,n)=>(a(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":r(t)("button.buttonAriaLabel")},[p("span",go,[n[0]||(n[0]=p("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1)),p("span",$o,w(r(t)("button.buttonText")),1)]),n[1]||(n[1]=p("span",{class:"DocSearch-Button-Keys"},[p("kbd",{class:"DocSearch-Button-Key"}),p("kbd",{class:"DocSearch-Button-Key"},"K")],-1))],8,ko))}}),yo={class:"VPNavBarSearch"},Po={id:"local-search"},So={key:1,id:"docsearch"},Vo=m({__name:"VPNavBarSearch",setup(o){const e=Je(()=>Ye(()=>import("./VPLocalSearchBox.B1FKPByJ.js"),__vite__mapDeps([0,1]))),t=()=>null,{theme:s}=L(),n=T(!1),i=T(!1);z(()=>{});function l(){n.value||(n.value=!0,setTimeout(v,16))}function v(){const b=new Event("keydown");b.key="k",b.metaKey=!0,window.dispatchEvent(b),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||v()},16)}function d(b){const P=b.target,S=P.tagName;return P.isContentEditable||S==="INPUT"||S==="SELECT"||S==="TEXTAREA"}const _=T(!1);ie("k",b=>{(b.ctrlKey||b.metaKey)&&(b.preventDefault(),_.value=!0)}),ie("/",b=>{d(b)||(b.preventDefault(),_.value=!0)});const V="local";return(b,P)=>{var S;return a(),u("div",yo,[r(V)==="local"?(a(),u(M,{key:0},[_.value?(a(),g(r(e),{key:0,onClose:P[0]||(P[0]=A=>_.value=!1)})):h("",!0),p("div",Po,[k(ye,{onClick:P[1]||(P[1]=A=>_.value=!0)})])],64)):r(V)==="algolia"?(a(),u(M,{key:1},[n.value?(a(),g(r(t),{key:0,algolia:((S=r(s).search)==null?void 0:S.options)??r(s).algolia,onVnodeBeforeMount:P[2]||(P[2]=A=>i.value=!0)},null,8,["algolia"])):h("",!0),i.value?h("",!0):(a(),u("div",So,[k(ye,{onClick:l})]))],64)):h("",!0)])}}}),Lo=m({__name:"VPNavBarSocialLinks",setup(o){const{theme:e}=L();return(t,s)=>r(e).socialLinks?(a(),g($e,{key:0,class:"VPNavBarSocialLinks",links:r(e).socialLinks},null,8,["links"])):h("",!0)}}),To=$(Lo,[["__scopeId","data-v-164c457f"]]),No=["href","rel","target"],wo={key:1},Io={key:2},Mo=m({__name:"VPNavBarTitle",setup(o){const{site:e,theme:t}=L(),{hasSidebar:s}=U(),{currentLang:n}=Y(),i=y(()=>{var d;return typeof t.value.logoLink=="string"?t.value.logoLink:(d=t.value.logoLink)==null?void 0:d.link}),l=y(()=>{var d;return typeof t.value.logoLink=="string"||(d=t.value.logoLink)==null?void 0:d.rel}),v=y(()=>{var d;return typeof t.value.logoLink=="string"||(d=t.value.logoLink)==null?void 0:d.target});return(d,_)=>(a(),u("div",{class:I(["VPNavBarTitle",{"has-sidebar":r(s)}])},[p("a",{class:"title",href:i.value??r(me)(r(n).link),rel:l.value,target:v.value},[c(d.$slots,"nav-bar-title-before",{},void 0,!0),r(t).logo?(a(),g(Q,{key:0,class:"logo",image:r(t).logo},null,8,["image"])):h("",!0),r(t).siteTitle?(a(),u("span",wo,w(r(t).siteTitle),1)):r(t).siteTitle===void 0?(a(),u("span",Io,w(r(e).title),1)):h("",!0),c(d.$slots,"nav-bar-title-after",{},void 0,!0)],8,No)],2))}}),Ao=$(Mo,[["__scopeId","data-v-28a961f9"]]),Co={class:"items"},Bo={class:"title"},Ho=m({__name:"VPNavBarTranslations",setup(o){const{theme:e}=L(),{localeLinks:t,currentLang:s}=Y({correspondingLink:!0});return(n,i)=>r(t).length&&r(s).label?(a(),g(ge,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:r(e).langMenuLabel||"Change language"},{default:f(()=>[p("div",Co,[p("p",Bo,w(r(s).label),1),(a(!0),u(M,null,B(r(t),l=>(a(),g(ne,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):h("",!0)}}),Eo=$(Ho,[["__scopeId","data-v-c80d9ad0"]]),Do={class:"wrapper"},Fo={class:"container"},Oo={class:"title"},Uo={class:"content"},jo={class:"content-body"},Go=m({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(o){const e=o,{y:t}=we(),{hasSidebar:s}=U(),{frontmatter:n}=L(),i=T({});return fe(()=>{i.value={"has-sidebar":s.value,home:n.value.layout==="home",top:t.value===0,"screen-open":e.isScreenOpen}}),(l,v)=>(a(),u("div",{class:I(["VPNavBar",i.value])},[p("div",Do,[p("div",Fo,[p("div",Oo,[k(Ao,null,{"nav-bar-title-before":f(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),p("div",Uo,[p("div",jo,[c(l.$slots,"nav-bar-content-before",{},void 0,!0),k(Vo,{class:"search"}),k(_o,{class:"menu"}),k(Eo,{class:"translations"}),k(Ls,{class:"appearance"}),k(To,{class:"social-links"}),k(ro,{class:"extra"}),c(l.$slots,"nav-bar-content-after",{},void 0,!0),k(co,{class:"hamburger",active:l.isScreenOpen,onClick:v[0]||(v[0]=d=>l.$emit("toggle-screen"))},null,8,["active"])])])])]),v[1]||(v[1]=p("div",{class:"divider"},[p("div",{class:"divider-line"})],-1))],2))}}),zo=$(Go,[["__scopeId","data-v-822684d1"]]),Ko={key:0,class:"VPNavScreenAppearance"},Ro={class:"text"},Wo=m({__name:"VPNavScreenAppearance",setup(o){const{site:e,theme:t}=L();return(s,n)=>r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),u("div",Ko,[p("p",Ro,w(r(t).darkModeSwitchLabel||"Appearance"),1),k(be)])):h("",!0)}}),qo=$(Wo,[["__scopeId","data-v-ffb44008"]]),Jo=m({__name:"VPNavScreenMenuLink",props:{item:{}},setup(o){const e=q("close-screen");return(t,s)=>(a(),g(D,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e),innerHTML:t.item.text},null,8,["href","target","rel","onClick","innerHTML"]))}}),Yo=$(Jo,[["__scopeId","data-v-27d04aeb"]]),Xo=m({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(o){const e=q("close-screen");return(t,s)=>(a(),g(D,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e)},{default:f(()=>[O(w(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),De=$(Xo,[["__scopeId","data-v-7179dbb7"]]),Qo={class:"VPNavScreenMenuGroupSection"},Zo={key:0,class:"title"},xo=m({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(o){return(e,t)=>(a(),u("div",Qo,[e.text?(a(),u("p",Zo,w(e.text),1)):h("",!0),(a(!0),u(M,null,B(e.items,s=>(a(),g(De,{key:s.text,item:s},null,8,["item"]))),128))]))}}),ea=$(xo,[["__scopeId","data-v-4b8941ac"]]),ta=["aria-controls","aria-expanded"],na=["innerHTML"],sa=["id"],oa={key:0,class:"item"},aa={key:1,class:"item"},ra={key:2,class:"group"},ia=m({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(o){const e=o,t=T(!1),s=y(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function n(){t.value=!t.value}return(i,l)=>(a(),u("div",{class:I(["VPNavScreenMenuGroup",{open:t.value}])},[p("button",{class:"button","aria-controls":s.value,"aria-expanded":t.value,onClick:n},[p("span",{class:"button-text",innerHTML:i.text},null,8,na),l[0]||(l[0]=p("span",{class:"vpi-plus button-icon"},null,-1))],8,ta),p("div",{id:s.value,class:"items"},[(a(!0),u(M,null,B(i.items,v=>(a(),u(M,{key:JSON.stringify(v)},["link"in v?(a(),u("div",oa,[k(De,{item:v},null,8,["item"])])):"component"in v?(a(),u("div",aa,[(a(),g(E(v.component),G({ref_for:!0},v.props,{"screen-menu":""}),null,16))])):(a(),u("div",ra,[k(ea,{text:v.text,items:v.items},null,8,["text","items"])]))],64))),128))],8,sa)],2))}}),la=$(ia,[["__scopeId","data-v-875057a5"]]),ca={key:0,class:"VPNavScreenMenu"},ua=m({__name:"VPNavScreenMenu",setup(o){const{theme:e}=L();return(t,s)=>r(e).nav?(a(),u("nav",ca,[(a(!0),u(M,null,B(r(e).nav,n=>(a(),u(M,{key:JSON.stringify(n)},["link"in n?(a(),g(Yo,{key:0,item:n},null,8,["item"])):"component"in n?(a(),g(E(n.component),G({key:1,ref_for:!0},n.props,{"screen-menu":""}),null,16)):(a(),g(la,{key:2,text:n.text||"",items:n.items},null,8,["text","items"]))],64))),128))])):h("",!0)}}),da=m({__name:"VPNavScreenSocialLinks",setup(o){const{theme:e}=L();return(t,s)=>r(e).socialLinks?(a(),g($e,{key:0,class:"VPNavScreenSocialLinks",links:r(e).socialLinks},null,8,["links"])):h("",!0)}}),va={class:"list"},pa=m({__name:"VPNavScreenTranslations",setup(o){const{localeLinks:e,currentLang:t}=Y({correspondingLink:!0}),s=T(!1);function n(){s.value=!s.value}return(i,l)=>r(e).length&&r(t).label?(a(),u("div",{key:0,class:I(["VPNavScreenTranslations",{open:s.value}])},[p("button",{class:"title",onClick:n},[l[0]||(l[0]=p("span",{class:"vpi-languages icon lang"},null,-1)),O(" "+w(r(t).label)+" ",1),l[1]||(l[1]=p("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),p("ul",va,[(a(!0),u(M,null,B(r(e),v=>(a(),u("li",{key:v.link,class:"item"},[k(D,{class:"link",href:v.link},{default:f(()=>[O(w(v.text),1)]),_:2},1032,["href"])]))),128))])],2)):h("",!0)}}),fa=$(pa,[["__scopeId","data-v-362991c2"]]),ha={class:"container"},ma=m({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(o){const e=T(null),t=Ie(te?document.body:null);return(s,n)=>(a(),g(de,{name:"fade",onEnter:n[0]||(n[0]=i=>t.value=!0),onAfterLeave:n[1]||(n[1]=i=>t.value=!1)},{default:f(()=>[s.open?(a(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[p("div",ha,[c(s.$slots,"nav-screen-content-before",{},void 0,!0),k(ua,{class:"menu"}),k(fa,{class:"translations"}),k(qo,{class:"appearance"}),k(da,{class:"social-links"}),c(s.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):h("",!0)]),_:3}))}}),_a=$(ma,[["__scopeId","data-v-833aabba"]]),ba={key:0,class:"VPNav"},ka=m({__name:"VPNav",setup(o){const{isScreenOpen:e,closeScreen:t,toggleScreen:s}=ms(),{frontmatter:n}=L(),i=y(()=>n.value.navbar!==!1);return he("close-screen",t),Z(()=>{te&&document.documentElement.classList.toggle("hide-nav",!i.value)}),(l,v)=>i.value?(a(),u("header",ba,[k(zo,{"is-screen-open":r(e),onToggleScreen:r(s)},{"nav-bar-title-before":f(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":f(()=>[c(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":f(()=>[c(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),k(_a,{open:r(e)},{"nav-screen-content-before":f(()=>[c(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":f(()=>[c(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):h("",!0)}}),ga=$(ka,[["__scopeId","data-v-f1e365da"]]),$a=["role","tabindex"],ya={key:1,class:"items"},Pa=m({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(o){const e=o,{collapsed:t,collapsible:s,isLink:n,isActiveLink:i,hasActiveLink:l,hasChildren:v,toggle:d}=gt(y(()=>e.item)),_=y(()=>v.value?"section":"div"),V=y(()=>n.value?"a":"div"),b=y(()=>v.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),P=y(()=>n.value?void 0:"button"),S=y(()=>[[`level-${e.depth}`],{collapsible:s.value},{collapsed:t.value},{"is-link":n.value},{"is-active":i.value},{"has-active":l.value}]);function A(N){"key"in N&&N.key!=="Enter"||!e.item.link&&d()}function C(){e.item.link&&d()}return(N,H)=>{const j=R("VPSidebarItem",!0);return a(),g(E(_.value),{class:I(["VPSidebarItem",S.value])},{default:f(()=>[N.item.text?(a(),u("div",G({key:0,class:"item",role:P.value},Qe(N.item.items?{click:A,keydown:A}:{},!0),{tabindex:N.item.items&&0}),[H[1]||(H[1]=p("div",{class:"indicator"},null,-1)),N.item.link?(a(),g(D,{key:0,tag:V.value,class:"link",href:N.item.link,rel:N.item.rel,target:N.item.target},{default:f(()=>[(a(),g(E(b.value),{class:"text",innerHTML:N.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),g(E(b.value),{key:1,class:"text",innerHTML:N.item.text},null,8,["innerHTML"])),N.item.collapsed!=null&&N.item.items&&N.item.items.length?(a(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:C,onKeydown:Xe(C,["enter"]),tabindex:"0"},H[0]||(H[0]=[p("span",{class:"vpi-chevron-right caret-icon"},null,-1)]),32)):h("",!0)],16,$a)):h("",!0),N.item.items&&N.item.items.length?(a(),u("div",ya,[N.depth<5?(a(!0),u(M,{key:0},B(N.item.items,W=>(a(),g(j,{key:W.text,item:W,depth:N.depth+1},null,8,["item","depth"]))),128)):h("",!0)])):h("",!0)]),_:1},8,["class"])}}}),Sa=$(Pa,[["__scopeId","data-v-196b2e5f"]]),Va=m({__name:"VPSidebarGroup",props:{items:{}},setup(o){const e=T(!0);let t=null;return z(()=>{t=setTimeout(()=>{t=null,e.value=!1},300)}),Ze(()=>{t!=null&&(clearTimeout(t),t=null)}),(s,n)=>(a(!0),u(M,null,B(s.items,i=>(a(),u("div",{key:i.text,class:I(["group",{"no-transition":e.value}])},[k(Sa,{item:i,depth:0},null,8,["item"])],2))),128))}}),La=$(Va,[["__scopeId","data-v-9e426adc"]]),Ta={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Na=m({__name:"VPSidebar",props:{open:{type:Boolean}},setup(o){const{sidebarGroups:e,hasSidebar:t}=U(),s=o,n=T(null),i=Ie(te?document.body:null);F([s,n],()=>{var v;s.open?(i.value=!0,(v=n.value)==null||v.focus()):i.value=!1},{immediate:!0,flush:"post"});const l=T(0);return F(e,()=>{l.value+=1},{deep:!0}),(v,d)=>r(t)?(a(),u("aside",{key:0,class:I(["VPSidebar",{open:v.open}]),ref_key:"navEl",ref:n,onClick:d[0]||(d[0]=xe(()=>{},["stop"]))},[d[2]||(d[2]=p("div",{class:"curtain"},null,-1)),p("nav",Ta,[d[1]||(d[1]=p("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),c(v.$slots,"sidebar-nav-before",{},void 0,!0),(a(),g(La,{items:r(e),key:l.value},null,8,["items"])),c(v.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):h("",!0)}}),wa=$(Na,[["__scopeId","data-v-18756405"]]),Ia=m({__name:"VPSkipLink",setup(o){const e=ee(),t=T();F(()=>e.path,()=>t.value.focus());function s({target:n}){const i=document.getElementById(decodeURIComponent(n.hash).slice(1));if(i){const l=()=>{i.removeAttribute("tabindex"),i.removeEventListener("blur",l)};i.setAttribute("tabindex","-1"),i.addEventListener("blur",l),i.focus(),window.scrollTo(0,0)}}return(n,i)=>(a(),u(M,null,[p("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),p("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:s}," Skip to content ")],64))}}),Ma=$(Ia,[["__scopeId","data-v-c3508ec8"]]),Aa=m({__name:"Layout",setup(o){const{isOpen:e,open:t,close:s}=U(),n=ee();F(()=>n.path,s),kt(e,s);const{frontmatter:i}=L(),l=Me(),v=y(()=>!!l["home-hero-image"]);return he("hero-image-slot-exists",v),(d,_)=>{const V=R("Content");return r(i).layout!==!1?(a(),u("div",{key:0,class:I(["Layout",r(i).pageClass])},[c(d.$slots,"layout-top",{},void 0,!0),k(Ma),k(rt,{class:"backdrop",show:r(e),onClick:r(s)},null,8,["show","onClick"]),k(ga,null,{"nav-bar-title-before":f(()=>[c(d.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[c(d.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":f(()=>[c(d.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":f(()=>[c(d.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":f(()=>[c(d.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":f(()=>[c(d.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),k(hs,{open:r(e),onOpenMenu:r(t)},null,8,["open","onOpenMenu"]),k(wa,{open:r(e)},{"sidebar-nav-before":f(()=>[c(d.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":f(()=>[c(d.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),k(xn,null,{"page-top":f(()=>[c(d.$slots,"page-top",{},void 0,!0)]),"page-bottom":f(()=>[c(d.$slots,"page-bottom",{},void 0,!0)]),"not-found":f(()=>[c(d.$slots,"not-found",{},void 0,!0)]),"home-hero-before":f(()=>[c(d.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":f(()=>[c(d.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[c(d.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[c(d.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[c(d.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[c(d.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":f(()=>[c(d.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":f(()=>[c(d.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":f(()=>[c(d.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":f(()=>[c(d.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":f(()=>[c(d.$slots,"doc-before",{},void 0,!0)]),"doc-after":f(()=>[c(d.$slots,"doc-after",{},void 0,!0)]),"doc-top":f(()=>[c(d.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":f(()=>[c(d.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":f(()=>[c(d.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":f(()=>[c(d.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":f(()=>[c(d.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[c(d.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[c(d.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[c(d.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),k(os),c(d.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),g(V,{key:1}))}}}),Ca=$(Aa,[["__scopeId","data-v-a9a9e638"]]),Pe={Layout:Ca,enhanceApp:({app:o})=>{o.component("Badge",st)}},Ba=o=>{if(typeof document>"u")return{stabilizeScrollPosition:n=>async(...i)=>n(...i)};const e=document.documentElement;return{stabilizeScrollPosition:s=>async(...n)=>{const i=s(...n),l=o.value;if(!l)return i;const v=l.offsetTop-e.scrollTop;return await Ne(),e.scrollTop=l.offsetTop-v,i}}},Fe="vitepress:tabSharedState",J=typeof localStorage<"u"?localStorage:null,Oe="vitepress:tabsSharedState",Ha=()=>{const o=J==null?void 0:J.getItem(Oe);if(o)try{return JSON.parse(o)}catch{}return{}},Ea=o=>{J&&J.setItem(Oe,JSON.stringify(o))},Da=o=>{const e=et({});F(()=>e.content,(t,s)=>{t&&s&&Ea(t)},{deep:!0}),o.provide(Fe,e)},Fa=(o,e)=>{const t=q(Fe);if(!t)throw new Error("[vitepress-plugin-tabs] TabsSharedState should be injected");z(()=>{t.content||(t.content=Ha())});const s=T(),n=y({get(){var d;const l=e.value,v=o.value;if(l){const _=(d=t.content)==null?void 0:d[l];if(_&&v.includes(_))return _}else{const _=s.value;if(_)return _}return v[0]},set(l){const v=e.value;v?t.content&&(t.content[v]=l):s.value=l}});return{selected:n,select:l=>{n.value=l}}};let Se=0;const Oa=()=>(Se++,""+Se);function Ua(){const o=Me();return y(()=>{var s;const t=(s=o.default)==null?void 0:s.call(o);return t?t.filter(n=>typeof n.type=="object"&&"__name"in n.type&&n.type.__name==="PluginTabsTab"&&n.props).map(n=>{var i;return(i=n.props)==null?void 0:i.label}):[]})}const Ue="vitepress:tabSingleState",ja=o=>{he(Ue,o)},Ga=()=>{const o=q(Ue);if(!o)throw new Error("[vitepress-plugin-tabs] TabsSingleState should be injected");return o},za={class:"plugin-tabs"},Ka=["id","aria-selected","aria-controls","tabindex","onClick"],Ra=m({__name:"PluginTabs",props:{sharedStateKey:{}},setup(o){const e=o,t=Ua(),{selected:s,select:n}=Fa(t,tt(e,"sharedStateKey")),i=T(),{stabilizeScrollPosition:l}=Ba(i),v=l(n),d=T([]),_=b=>{var A;const P=t.value.indexOf(s.value);let S;b.key==="ArrowLeft"?S=P>=1?P-1:t.value.length-1:b.key==="ArrowRight"&&(S=P(a(),u("div",za,[p("div",{ref_key:"tablist",ref:i,class:"plugin-tabs--tab-list",role:"tablist",onKeydown:_},[(a(!0),u(M,null,B(r(t),S=>(a(),u("button",{id:`tab-${S}-${r(V)}`,ref_for:!0,ref_key:"buttonRefs",ref:d,key:S,role:"tab",class:"plugin-tabs--tab","aria-selected":S===r(s),"aria-controls":`panel-${S}-${r(V)}`,tabindex:S===r(s)?0:-1,onClick:()=>r(v)(S)},w(S),9,Ka))),128))],544),c(b.$slots,"default")]))}}),Wa=["id","aria-labelledby"],qa=m({__name:"PluginTabsTab",props:{label:{}},setup(o){const{uid:e,selected:t}=Ga();return(s,n)=>r(t)===s.label?(a(),u("div",{key:0,id:`panel-${s.label}-${r(e)}`,class:"plugin-tabs--content",role:"tabpanel",tabindex:"0","aria-labelledby":`tab-${s.label}-${r(e)}`},[c(s.$slots,"default",{},void 0,!0)],8,Wa)):h("",!0)}}),Ja=$(qa,[["__scopeId","data-v-9b0d03d2"]]),Ya=o=>{Da(o),o.component("PluginTabs",Ra),o.component("PluginTabsTab",Ja)},Qa={extends:Pe,Layout(){return nt(Pe.Layout,null,{})},enhanceApp({app:o,router:e,siteData:t}){Ya(o)}};export{Qa as R,bo as c,L as u};
diff --git a/dev/assets/constraints_10_variables_and_domains.md.DMTHJoC3.js b/dev/assets/constraints_10_variables_and_domains.md.2DoRmBqU.js
similarity index 96%
rename from dev/assets/constraints_10_variables_and_domains.md.DMTHJoC3.js
rename to dev/assets/constraints_10_variables_and_domains.md.2DoRmBqU.js
index 64ba878..72266df 100644
--- a/dev/assets/constraints_10_variables_and_domains.md.DMTHJoC3.js
+++ b/dev/assets/constraints_10_variables_and_domains.md.2DoRmBqU.js
@@ -1,4 +1,4 @@
-import{_ as p,c as t,a5 as n,j as i,a,G as h,B as k,o as e}from"./chunks/framework.CJakPlgM.js";const b=JSON.parse('{"title":"Defining Variables and Exploring Domains","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/10_variables_and_domains.md","filePath":"constraints/10_variables_and_domains.md","lastUpdated":null}'),r={name:"constraints/10_variables_and_domains.md"},d={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.509ex",height:"1.312ex",role:"img",focusable:"false",viewBox:"0 -540 667 580","aria-hidden":"true"},E={class:"jldocstring custom-block",open:""};function g(y,s,c,m,C,F){const l=k("Badge");return e(),t("div",null,[s[17]||(s[17]=n('

Defining Variables and Exploring Domains

ConstraintDomains.jl stands as the standard way to define variables and explore domains within the Julia Constraints ecosystem. This package provides the infrastructure necessary for specifying both discrete and continuous domains. Explorations features are mainly related to the learning about constraints aspect and will be detailed in that chapter.

Variables and their domains can also be defined through MOI and JuMP syntaxes in their respective models.

Implementing the AbstractDomain Interface

',4)),i("p",null,[s[2]||(s[2]=a("At the foundation of ")),s[3]||(s[3]=i("em",null,"ConstraintDomains.jl",-1)),s[4]||(s[4]=a(" is the ")),s[5]||(s[5]=i("code",null,"AbstractDomain",-1)),s[6]||(s[6]=a(" type, an abstract supertype for all domain types. Implementations of ")),s[7]||(s[7]=i("code",null,"AbstractDomain",-1)),s[8]||(s[8]=a(" must provide methods for checking membership (")),i("mjx-container",d,[(e(),t("svg",o,s[0]||(s[0]=[i("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[i("g",{"data-mml-node":"math"},[i("g",{"data-mml-node":"mo"},[i("path",{"data-c":"2208",d:"M84 250Q84 372 166 450T360 539Q361 539 377 539T419 540T469 540H568Q583 532 583 520Q583 511 570 501L466 500Q355 499 329 494Q280 482 242 458T183 409T147 354T129 306T124 272V270H568Q583 262 583 250T568 230H124V228Q124 207 134 177T167 112T231 48T328 7Q355 1 466 0H570Q583 -10 583 -20Q583 -32 568 -40H471Q464 -40 446 -40T417 -41Q262 -41 172 45Q84 127 84 250Z",style:{"stroke-width":"3"}})])])],-1)]))),s[1]||(s[1]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mo",null,"∈")])],-1))]),s[9]||(s[9]=a("), generating random elements (")),s[10]||(s[10]=i("code",null,"rand",-1)),s[11]||(s[11]=a("), and determining the domain's size or range (")),s[12]||(s[12]=i("code",null,"length",-1)),s[13]||(s[13]=a("). These functionalities are essential for defining the behavior and properties of variable domains within constraint models."))]),i("details",E,[i("summary",null,[s[14]||(s[14]=i("a",{id:"ConstraintDomains.AbstractDomain-constraints-10_variables_and_domains",href:"#ConstraintDomains.AbstractDomain-constraints-10_variables_and_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.AbstractDomain")],-1)),s[15]||(s[15]=a()),h(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[16]||(s[16]=n('
julia
AbstractDomain

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

  • Base.∈(val, ::D)

  • Base.rand(::D)

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

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

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source

',7))]),s[18]||(s[18]=n(`

Discrete Domains

Optimization in discrete spaces has been the core of Constraint Programming since its inception. We provide three kinds of discrete domains.

SetDomain

A SetDomain is simply a Set of unordered numerical values.

julia
using ConstraintDomains
+import{_ as p,c as t,a5 as n,j as i,a,G as h,B as k,o as e}from"./chunks/framework.CJakPlgM.js";const b=JSON.parse('{"title":"Defining Variables and Exploring Domains","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/10_variables_and_domains.md","filePath":"constraints/10_variables_and_domains.md","lastUpdated":null}'),d={name:"constraints/10_variables_and_domains.md"},r={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.509ex",height:"1.312ex",role:"img",focusable:"false",viewBox:"0 -540 667 580","aria-hidden":"true"},E={class:"jldocstring custom-block",open:""};function g(y,s,c,m,C,F){const l=k("Badge");return e(),t("div",null,[s[17]||(s[17]=n('

Defining Variables and Exploring Domains

ConstraintDomains.jl stands as the standard way to define variables and explore domains within the Julia Constraints ecosystem. This package provides the infrastructure necessary for specifying both discrete and continuous domains. Explorations features are mainly related to the learning about constraints aspect and will be detailed in that chapter.

Variables and their domains can also be defined through MOI and JuMP syntaxes in their respective models.

Implementing the AbstractDomain Interface

',4)),i("p",null,[s[2]||(s[2]=a("At the foundation of ")),s[3]||(s[3]=i("em",null,"ConstraintDomains.jl",-1)),s[4]||(s[4]=a(" is the ")),s[5]||(s[5]=i("code",null,"AbstractDomain",-1)),s[6]||(s[6]=a(" type, an abstract supertype for all domain types. Implementations of ")),s[7]||(s[7]=i("code",null,"AbstractDomain",-1)),s[8]||(s[8]=a(" must provide methods for checking membership (")),i("mjx-container",r,[(e(),t("svg",o,s[0]||(s[0]=[i("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[i("g",{"data-mml-node":"math"},[i("g",{"data-mml-node":"mo"},[i("path",{"data-c":"2208",d:"M84 250Q84 372 166 450T360 539Q361 539 377 539T419 540T469 540H568Q583 532 583 520Q583 511 570 501L466 500Q355 499 329 494Q280 482 242 458T183 409T147 354T129 306T124 272V270H568Q583 262 583 250T568 230H124V228Q124 207 134 177T167 112T231 48T328 7Q355 1 466 0H570Q583 -10 583 -20Q583 -32 568 -40H471Q464 -40 446 -40T417 -41Q262 -41 172 45Q84 127 84 250Z",style:{"stroke-width":"3"}})])])],-1)]))),s[1]||(s[1]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mo",null,"∈")])],-1))]),s[9]||(s[9]=a("), generating random elements (")),s[10]||(s[10]=i("code",null,"rand",-1)),s[11]||(s[11]=a("), and determining the domain's size or range (")),s[12]||(s[12]=i("code",null,"length",-1)),s[13]||(s[13]=a("). These functionalities are essential for defining the behavior and properties of variable domains within constraint models."))]),i("details",E,[i("summary",null,[s[14]||(s[14]=i("a",{id:"ConstraintDomains.AbstractDomain-constraints-10_variables_and_domains",href:"#ConstraintDomains.AbstractDomain-constraints-10_variables_and_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.AbstractDomain")],-1)),s[15]||(s[15]=a()),h(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[16]||(s[16]=n('
julia
AbstractDomain

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

  • Base.∈(val, ::D)

  • Base.rand(::D)

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

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

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source

',7))]),s[18]||(s[18]=n(`

Discrete Domains

Optimization in discrete spaces has been the core of Constraint Programming since its inception. We provide three kinds of discrete domains.

SetDomain

A SetDomain is simply a Set of unordered numerical values.

julia
using ConstraintDomains
 
 d1 = domain([53.69, 89.2, 0.12])
 d2 = domain([2//3, 89//123])
@@ -25,7 +25,7 @@ import{_ as p,c as t,a5 as n,j as i,a,G as h,B as k,o as e}from"./chunks/framewo
 MOI.add_constraint(optimizer, v3, CBLS.DiscreteSet(4.3))
 
 v4 = MOI.add_variable(optimizer)
-MOI.add_constraint(optimizer, v4, CBLS.DiscreteSet([1, 42, 3.14]))

RangeDomain

A range domain allows for minimal storage and more efficient operation on discrete sets defined as Range in Julia. It is not recommended for dynamic domains (it will be replaced with SetDomain as soon as a non-extremal element is removed).

julia
using ConstraintDomains
+MOI.add_constraint(optimizer, v4, CBLS.DiscreteSet([1, 42, 3.14]))

RangeDomain

A range domain allows for minimal storage and more efficient operation on discrete sets defined as Range in Julia. It is not recommended for dynamic domains (it will be replaced with SetDomain as soon as a non-extremal element is removed).

julia
using ConstraintDomains
 
 d1 = domain(1:5)
 d2 = domain(0.4:0.1:1.3)
julia
## To be implemented
@@ -45,8 +45,8 @@ import{_ as p,c as t,a5 as n,j as i,a,G as h,B as k,o as e}from"./chunks/framewo
 
 # v2 = MOI.add_variable(optimizer)
 
-# MOI.add_constraint(optimizer, v1, MOI.RangeSet(0.4:0.1:1.3))

Arbitrary Domains

As odd as it may sound, we provide a constructor for sets of elements making up arbitrary, possibly non-numerical, domains.

Until some practical examples are implemented, this structure will mainly be a placeholder with default behavior.

Continuous Domains

Numerous problems cannot be challenged without expressing at least part of their domains as continuous variables. In Julia Constraints we provide such domains as (set of) intervals.

julia
using ConstraintDomains, Intervals
+# MOI.add_constraint(optimizer, v1, MOI.RangeSet(0.4:0.1:1.3))

Arbitrary Domains

As odd as it may sound, we provide a constructor for sets of elements making up arbitrary, possibly non-numerical, domains.

Until some practical examples are implemented, this structure will mainly be a placeholder with default behavior.

Continuous Domains

Numerous problems cannot be challenged without expressing at least part of their domains as continuous variables. In Julia Constraints we provide such domains as (set of) intervals.

julia
using ConstraintDomains, Intervals
 
 d1 = domain(Interval{Open,Closed}(3.2, true), (42, false))
 d2 = domain(3.2..42)
-d3 = domain([3.2..42, 63.2..324.1])
julia
## see MOI.Interval
julia
## see MOI.Interval
`,14))])}const D=p(r,[["render",g]]);export{b as __pageData,D as default}; +d3 = domain([3.2..42, 63.2..324.1])
julia
## see MOI.Interval
julia
## see MOI.Interval
`,14))])}const D=p(d,[["render",g]]);export{b as __pageData,D as default}; diff --git a/dev/assets/constraints_10_variables_and_domains.md.DMTHJoC3.lean.js b/dev/assets/constraints_10_variables_and_domains.md.2DoRmBqU.lean.js similarity index 96% rename from dev/assets/constraints_10_variables_and_domains.md.DMTHJoC3.lean.js rename to dev/assets/constraints_10_variables_and_domains.md.2DoRmBqU.lean.js index 64ba878..72266df 100644 --- a/dev/assets/constraints_10_variables_and_domains.md.DMTHJoC3.lean.js +++ b/dev/assets/constraints_10_variables_and_domains.md.2DoRmBqU.lean.js @@ -1,4 +1,4 @@ -import{_ as p,c as t,a5 as n,j as i,a,G as h,B as k,o as e}from"./chunks/framework.CJakPlgM.js";const b=JSON.parse('{"title":"Defining Variables and Exploring Domains","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/10_variables_and_domains.md","filePath":"constraints/10_variables_and_domains.md","lastUpdated":null}'),r={name:"constraints/10_variables_and_domains.md"},d={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.509ex",height:"1.312ex",role:"img",focusable:"false",viewBox:"0 -540 667 580","aria-hidden":"true"},E={class:"jldocstring custom-block",open:""};function g(y,s,c,m,C,F){const l=k("Badge");return e(),t("div",null,[s[17]||(s[17]=n('

Defining Variables and Exploring Domains

ConstraintDomains.jl stands as the standard way to define variables and explore domains within the Julia Constraints ecosystem. This package provides the infrastructure necessary for specifying both discrete and continuous domains. Explorations features are mainly related to the learning about constraints aspect and will be detailed in that chapter.

Variables and their domains can also be defined through MOI and JuMP syntaxes in their respective models.

Implementing the AbstractDomain Interface

',4)),i("p",null,[s[2]||(s[2]=a("At the foundation of ")),s[3]||(s[3]=i("em",null,"ConstraintDomains.jl",-1)),s[4]||(s[4]=a(" is the ")),s[5]||(s[5]=i("code",null,"AbstractDomain",-1)),s[6]||(s[6]=a(" type, an abstract supertype for all domain types. Implementations of ")),s[7]||(s[7]=i("code",null,"AbstractDomain",-1)),s[8]||(s[8]=a(" must provide methods for checking membership (")),i("mjx-container",d,[(e(),t("svg",o,s[0]||(s[0]=[i("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[i("g",{"data-mml-node":"math"},[i("g",{"data-mml-node":"mo"},[i("path",{"data-c":"2208",d:"M84 250Q84 372 166 450T360 539Q361 539 377 539T419 540T469 540H568Q583 532 583 520Q583 511 570 501L466 500Q355 499 329 494Q280 482 242 458T183 409T147 354T129 306T124 272V270H568Q583 262 583 250T568 230H124V228Q124 207 134 177T167 112T231 48T328 7Q355 1 466 0H570Q583 -10 583 -20Q583 -32 568 -40H471Q464 -40 446 -40T417 -41Q262 -41 172 45Q84 127 84 250Z",style:{"stroke-width":"3"}})])])],-1)]))),s[1]||(s[1]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mo",null,"∈")])],-1))]),s[9]||(s[9]=a("), generating random elements (")),s[10]||(s[10]=i("code",null,"rand",-1)),s[11]||(s[11]=a("), and determining the domain's size or range (")),s[12]||(s[12]=i("code",null,"length",-1)),s[13]||(s[13]=a("). These functionalities are essential for defining the behavior and properties of variable domains within constraint models."))]),i("details",E,[i("summary",null,[s[14]||(s[14]=i("a",{id:"ConstraintDomains.AbstractDomain-constraints-10_variables_and_domains",href:"#ConstraintDomains.AbstractDomain-constraints-10_variables_and_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.AbstractDomain")],-1)),s[15]||(s[15]=a()),h(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[16]||(s[16]=n('
julia
AbstractDomain

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

  • Base.∈(val, ::D)

  • Base.rand(::D)

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

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

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source

',7))]),s[18]||(s[18]=n(`

Discrete Domains

Optimization in discrete spaces has been the core of Constraint Programming since its inception. We provide three kinds of discrete domains.

SetDomain

A SetDomain is simply a Set of unordered numerical values.

julia
using ConstraintDomains
+import{_ as p,c as t,a5 as n,j as i,a,G as h,B as k,o as e}from"./chunks/framework.CJakPlgM.js";const b=JSON.parse('{"title":"Defining Variables and Exploring Domains","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/10_variables_and_domains.md","filePath":"constraints/10_variables_and_domains.md","lastUpdated":null}'),d={name:"constraints/10_variables_and_domains.md"},r={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.509ex",height:"1.312ex",role:"img",focusable:"false",viewBox:"0 -540 667 580","aria-hidden":"true"},E={class:"jldocstring custom-block",open:""};function g(y,s,c,m,C,F){const l=k("Badge");return e(),t("div",null,[s[17]||(s[17]=n('

Defining Variables and Exploring Domains

ConstraintDomains.jl stands as the standard way to define variables and explore domains within the Julia Constraints ecosystem. This package provides the infrastructure necessary for specifying both discrete and continuous domains. Explorations features are mainly related to the learning about constraints aspect and will be detailed in that chapter.

Variables and their domains can also be defined through MOI and JuMP syntaxes in their respective models.

Implementing the AbstractDomain Interface

',4)),i("p",null,[s[2]||(s[2]=a("At the foundation of ")),s[3]||(s[3]=i("em",null,"ConstraintDomains.jl",-1)),s[4]||(s[4]=a(" is the ")),s[5]||(s[5]=i("code",null,"AbstractDomain",-1)),s[6]||(s[6]=a(" type, an abstract supertype for all domain types. Implementations of ")),s[7]||(s[7]=i("code",null,"AbstractDomain",-1)),s[8]||(s[8]=a(" must provide methods for checking membership (")),i("mjx-container",r,[(e(),t("svg",o,s[0]||(s[0]=[i("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[i("g",{"data-mml-node":"math"},[i("g",{"data-mml-node":"mo"},[i("path",{"data-c":"2208",d:"M84 250Q84 372 166 450T360 539Q361 539 377 539T419 540T469 540H568Q583 532 583 520Q583 511 570 501L466 500Q355 499 329 494Q280 482 242 458T183 409T147 354T129 306T124 272V270H568Q583 262 583 250T568 230H124V228Q124 207 134 177T167 112T231 48T328 7Q355 1 466 0H570Q583 -10 583 -20Q583 -32 568 -40H471Q464 -40 446 -40T417 -41Q262 -41 172 45Q84 127 84 250Z",style:{"stroke-width":"3"}})])])],-1)]))),s[1]||(s[1]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mo",null,"∈")])],-1))]),s[9]||(s[9]=a("), generating random elements (")),s[10]||(s[10]=i("code",null,"rand",-1)),s[11]||(s[11]=a("), and determining the domain's size or range (")),s[12]||(s[12]=i("code",null,"length",-1)),s[13]||(s[13]=a("). These functionalities are essential for defining the behavior and properties of variable domains within constraint models."))]),i("details",E,[i("summary",null,[s[14]||(s[14]=i("a",{id:"ConstraintDomains.AbstractDomain-constraints-10_variables_and_domains",href:"#ConstraintDomains.AbstractDomain-constraints-10_variables_and_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.AbstractDomain")],-1)),s[15]||(s[15]=a()),h(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[16]||(s[16]=n('
julia
AbstractDomain

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

  • Base.∈(val, ::D)

  • Base.rand(::D)

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

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

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source

',7))]),s[18]||(s[18]=n(`

Discrete Domains

Optimization in discrete spaces has been the core of Constraint Programming since its inception. We provide three kinds of discrete domains.

SetDomain

A SetDomain is simply a Set of unordered numerical values.

julia
using ConstraintDomains
 
 d1 = domain([53.69, 89.2, 0.12])
 d2 = domain([2//3, 89//123])
@@ -25,7 +25,7 @@ import{_ as p,c as t,a5 as n,j as i,a,G as h,B as k,o as e}from"./chunks/framewo
 MOI.add_constraint(optimizer, v3, CBLS.DiscreteSet(4.3))
 
 v4 = MOI.add_variable(optimizer)
-MOI.add_constraint(optimizer, v4, CBLS.DiscreteSet([1, 42, 3.14]))

RangeDomain

A range domain allows for minimal storage and more efficient operation on discrete sets defined as Range in Julia. It is not recommended for dynamic domains (it will be replaced with SetDomain as soon as a non-extremal element is removed).

julia
using ConstraintDomains
+MOI.add_constraint(optimizer, v4, CBLS.DiscreteSet([1, 42, 3.14]))

RangeDomain

A range domain allows for minimal storage and more efficient operation on discrete sets defined as Range in Julia. It is not recommended for dynamic domains (it will be replaced with SetDomain as soon as a non-extremal element is removed).

julia
using ConstraintDomains
 
 d1 = domain(1:5)
 d2 = domain(0.4:0.1:1.3)
julia
## To be implemented
@@ -45,8 +45,8 @@ import{_ as p,c as t,a5 as n,j as i,a,G as h,B as k,o as e}from"./chunks/framewo
 
 # v2 = MOI.add_variable(optimizer)
 
-# MOI.add_constraint(optimizer, v1, MOI.RangeSet(0.4:0.1:1.3))

Arbitrary Domains

As odd as it may sound, we provide a constructor for sets of elements making up arbitrary, possibly non-numerical, domains.

Until some practical examples are implemented, this structure will mainly be a placeholder with default behavior.

Continuous Domains

Numerous problems cannot be challenged without expressing at least part of their domains as continuous variables. In Julia Constraints we provide such domains as (set of) intervals.

julia
using ConstraintDomains, Intervals
+# MOI.add_constraint(optimizer, v1, MOI.RangeSet(0.4:0.1:1.3))

Arbitrary Domains

As odd as it may sound, we provide a constructor for sets of elements making up arbitrary, possibly non-numerical, domains.

Until some practical examples are implemented, this structure will mainly be a placeholder with default behavior.

Continuous Domains

Numerous problems cannot be challenged without expressing at least part of their domains as continuous variables. In Julia Constraints we provide such domains as (set of) intervals.

julia
using ConstraintDomains, Intervals
 
 d1 = domain(Interval{Open,Closed}(3.2, true), (42, false))
 d2 = domain(3.2..42)
-d3 = domain([3.2..42, 63.2..324.1])
julia
## see MOI.Interval
julia
## see MOI.Interval
`,14))])}const D=p(r,[["render",g]]);export{b as __pageData,D as default}; +d3 = domain([3.2..42, 63.2..324.1])
julia
## see MOI.Interval
julia
## see MOI.Interval
`,14))])}const D=p(d,[["render",g]]);export{b as __pageData,D as default}; diff --git a/dev/assets/constraints_21_generic_constraints.md.B4i07qkr.lean.js b/dev/assets/constraints_21_generic_constraints.md.Cq_hAjZf.js similarity index 98% rename from dev/assets/constraints_21_generic_constraints.md.B4i07qkr.lean.js rename to dev/assets/constraints_21_generic_constraints.md.Cq_hAjZf.js index 2bdd7b5..3992c3c 100644 --- a/dev/assets/constraints_21_generic_constraints.md.B4i07qkr.lean.js +++ b/dev/assets/constraints_21_generic_constraints.md.Cq_hAjZf.js @@ -1,4 +1,4 @@ -import{_ as l,c as t,a5 as e,j as s,a,o as n}from"./chunks/framework.CJakPlgM.js";const J=JSON.parse('{"title":"Generic Constraints","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/21_generic_constraints.md","filePath":"constraints/21_generic_constraints.md","lastUpdated":null}'),h={name:"constraints/21_generic_constraints.md"},p={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},r={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.109ex",height:"1.464ex",role:"img",focusable:"false",viewBox:"0 -442 490 647","aria-hidden":"true"},o={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.42ex",height:"1.686ex",role:"img",focusable:"false",viewBox:"0 -540 2395.6 745","aria-hidden":"true"},E={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},T={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},Q={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},y={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"25.797ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 11402.4 1000","aria-hidden":"true"},m={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.928ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 852 683","aria-hidden":"true"},u={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},F={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 500 666","aria-hidden":"true"},C={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},x={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 500 666","aria-hidden":"true"},w={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},f={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.726ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 763 683","aria-hidden":"true"},b={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},v={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.554ex",role:"img",focusable:"false",viewBox:"0 -665 500 687","aria-hidden":"true"},H={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},D={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.532ex",role:"img",focusable:"false",viewBox:"0 -677 500 677","aria-hidden":"true"},B={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"23.762ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 10502.7 1000","aria-hidden":"true"};function V(M,i,L,j,Z,I){return n(),t("div",null,[i[43]||(i[43]=e('

Generic Constraints

In the XCSP³-core standard, generic constraints are categorized into two main types: intention and extension constraints.

Intention Constraints

',3)),s("p",null,[i[6]||(i[6]=a("These are constraints that are defined by a logical expression or a function. They are called intentional because they are defined by the property they satisfy. For example, a constraint that specifies that a variable ")),s("mjx-container",p,[(n(),t("svg",k,i[0]||(i[0]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D465",d:"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z",style:{"stroke-width":"3"}})])])],-1)]))),i[1]||(i[1]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x")])],-1))]),i[7]||(i[7]=a(" must be less than a variable ")),s("mjx-container",r,[(n(),t("svg",d,i[2]||(i[2]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D466",d:"M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),i[3]||(i[3]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"y")])],-1))]),i[8]||(i[8]=a(" could be defined intentionally as ")),s("mjx-container",o,[(n(),t("svg",g,i[4]||(i[4]=[e('',1)]))),i[5]||(i[5]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x"),s("mo",null,"<"),s("mi",null,"y")])],-1))]),i[9]||(i[9]=a("."))]),i[44]||(i[44]=e('

Note that the intention constraint is not directly available through the JC-API in Constraints.jl. It is designed as such since defining a constraint through a predicate is the natural way.

We provide a straightforward example through the :dist_different constraint on how to define and add such a constraint in the USUAL_CONSTRAINTS collection.

Higher level modeling languages such as JuMP should provide a Intention interface.

Defining an intention constraint in JC-API

',4)),s("p",null,[i[12]||(i[12]=a("We use the ")),i[13]||(i[13]=s("code",null,"dist_different",-1)),i[14]||(i[14]=a(" constraint to illustrate how to define an intention constraint in ")),i[15]||(i[15]=s("em",null,"Constraints.jl",-1)),i[16]||(i[16]=a(". The ")),i[17]||(i[17]=s("code",null,"dist_different",-1)),i[18]||(i[18]=a(" constraint ensures that the distances between marks ")),s("mjx-container",E,[(n(),t("svg",T,i[10]||(i[10]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D465",d:"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z",style:{"stroke-width":"3"}})])])],-1)]))),i[11]||(i[11]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x")])],-1))]),i[19]||(i[19]=a(" on a ruler are unique."))]),s("mjx-container",Q,[(n(),t("svg",y,i[20]||(i[20]=[e('',1)]))),i[21]||(i[21]=s("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"1"),s("mo",{stretchy:"false"},"]"),s("mo",null,"−"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"2"),s("mo",{stretchy:"false"},"]"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mo",null,"≠"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"3"),s("mo",{stretchy:"false"},"]"),s("mo",null,"−"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"4"),s("mo",{stretchy:"false"},"]"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])],-1))]),i[45]||(i[45]=e(`

The constraint is then added to the usual constraints collection.

julia
const description_dist_different = """
+import{_ as l,c as t,a5 as e,j as s,a,o as n}from"./chunks/framework.CJakPlgM.js";const z=JSON.parse('{"title":"Generic Constraints","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/21_generic_constraints.md","filePath":"constraints/21_generic_constraints.md","lastUpdated":null}'),h={name:"constraints/21_generic_constraints.md"},p={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},r={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.109ex",height:"1.464ex",role:"img",focusable:"false",viewBox:"0 -442 490 647","aria-hidden":"true"},o={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.42ex",height:"1.686ex",role:"img",focusable:"false",viewBox:"0 -540 2395.6 745","aria-hidden":"true"},E={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},T={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},Q={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},y={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"25.797ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 11402.4 1000","aria-hidden":"true"},m={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.928ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 852 683","aria-hidden":"true"},u={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},F={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 500 666","aria-hidden":"true"},C={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},x={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 500 666","aria-hidden":"true"},w={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},f={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.726ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 763 683","aria-hidden":"true"},b={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},v={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.554ex",role:"img",focusable:"false",viewBox:"0 -665 500 687","aria-hidden":"true"},H={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},B={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.532ex",role:"img",focusable:"false",viewBox:"0 -677 500 677","aria-hidden":"true"},D={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"23.762ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 10502.7 1000","aria-hidden":"true"};function V(M,i,L,Z,j,I){return n(),t("div",null,[i[43]||(i[43]=e('

Generic Constraints

In the XCSP³-core standard, generic constraints are categorized into two main types: intention and extension constraints.

Intention Constraints

',3)),s("p",null,[i[6]||(i[6]=a("These are constraints that are defined by a logical expression or a function. They are called intentional because they are defined by the property they satisfy. For example, a constraint that specifies that a variable ")),s("mjx-container",p,[(n(),t("svg",k,i[0]||(i[0]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D465",d:"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z",style:{"stroke-width":"3"}})])])],-1)]))),i[1]||(i[1]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x")])],-1))]),i[7]||(i[7]=a(" must be less than a variable ")),s("mjx-container",r,[(n(),t("svg",d,i[2]||(i[2]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D466",d:"M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),i[3]||(i[3]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"y")])],-1))]),i[8]||(i[8]=a(" could be defined intentionally as ")),s("mjx-container",o,[(n(),t("svg",g,i[4]||(i[4]=[e('',1)]))),i[5]||(i[5]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x"),s("mo",null,"<"),s("mi",null,"y")])],-1))]),i[9]||(i[9]=a("."))]),i[44]||(i[44]=e('

Note that the intention constraint is not directly available through the JC-API in Constraints.jl. It is designed as such since defining a constraint through a predicate is the natural way.

We provide a straightforward example through the :dist_different constraint on how to define and add such a constraint in the USUAL_CONSTRAINTS collection.

Higher level modeling languages such as JuMP should provide a Intention interface.

Defining an intention constraint in JC-API

',4)),s("p",null,[i[12]||(i[12]=a("We use the ")),i[13]||(i[13]=s("code",null,"dist_different",-1)),i[14]||(i[14]=a(" constraint to illustrate how to define an intention constraint in ")),i[15]||(i[15]=s("em",null,"Constraints.jl",-1)),i[16]||(i[16]=a(". The ")),i[17]||(i[17]=s("code",null,"dist_different",-1)),i[18]||(i[18]=a(" constraint ensures that the distances between marks ")),s("mjx-container",E,[(n(),t("svg",T,i[10]||(i[10]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D465",d:"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z",style:{"stroke-width":"3"}})])])],-1)]))),i[11]||(i[11]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x")])],-1))]),i[19]||(i[19]=a(" on a ruler are unique."))]),s("mjx-container",Q,[(n(),t("svg",y,i[20]||(i[20]=[e('',1)]))),i[21]||(i[21]=s("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"1"),s("mo",{stretchy:"false"},"]"),s("mo",null,"−"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"2"),s("mo",{stretchy:"false"},"]"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mo",null,"≠"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"3"),s("mo",{stretchy:"false"},"]"),s("mo",null,"−"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"4"),s("mo",{stretchy:"false"},"]"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])],-1))]),i[45]||(i[45]=e(`

The constraint is then added to the usual constraints collection.

julia
const description_dist_different = """
 Ensures that the distances between marks on the ruler are unique.
 """
 
@@ -9,7 +9,7 @@ import{_ as l,c as t,a5 as e,j as s,a,o as n}from"./chunks/framework.CJakPlgM.js
 @usual concept_dist_different(x) = xcsp_intention(
     list = x,
     predicate = predicate_dist_different
-)

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

APIs

Note that the intention constraint is not directly available through the JC-API in Constraints.jl. It is designed as such since defining a constraint through a predicate is the natural way.

We provide here a usage example for the :dist_different constraint, previously added to the USUAL_CONSTRAINTS collection.

Higher level modeling language such as JuMP should provide an Intention interface.

julia
using Constraints
+)

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

APIs

Note that the intention constraint is not directly available through the JC-API in Constraints.jl. It is designed as such since defining a constraint through a predicate is the natural way.

We provide here a usage example for the :dist_different constraint, previously added to the USUAL_CONSTRAINTS collection.

Higher level modeling language such as JuMP should provide an Intention interface.

julia
using Constraints
 
 concept(:dist_different, x)
 concept(:dist_different)(x)
julia
# Defines the DistDifferent constraint
@@ -48,7 +48,7 @@ import{_ as l,c as t,a5 as e,j as s,a,o as n}from"./chunks/framework.CJakPlgM.js
 end
 MOI.add_constraint(optimizer, x, CBLS.Intention(y -> abs(y[1] - y[2])  abs(y[3] - y[4])))
 
-MOI.optimize!(optimizer)

Extension Constraints

`,9)),s("p",null,[i[36]||(i[36]=a("These are constraints that are defined by explicitly listing all the tuples of values that satisfy the constraint. They are called extensional because they are defined by the set of values they allow. For example, a binary constraint that specifies that a variable ")),s("mjx-container",m,[(n(),t("svg",c,i[22]||(i[22]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D44B",d:"M42 0H40Q26 0 26 11Q26 15 29 27Q33 41 36 43T55 46Q141 49 190 98Q200 108 306 224T411 342Q302 620 297 625Q288 636 234 637H206Q200 643 200 645T202 664Q206 677 212 683H226Q260 681 347 681Q380 681 408 681T453 682T473 682Q490 682 490 671Q490 670 488 658Q484 643 481 640T465 637Q434 634 411 620L488 426L541 485Q646 598 646 610Q646 628 622 635Q617 635 609 637Q594 637 594 648Q594 650 596 664Q600 677 606 683H618Q619 683 643 683T697 681T738 680Q828 680 837 683H845Q852 676 852 672Q850 647 840 637H824Q790 636 763 628T722 611T698 593L687 584Q687 585 592 480L505 384Q505 383 536 304T601 142T638 56Q648 47 699 46Q734 46 734 37Q734 35 732 23Q728 7 725 4T711 1Q708 1 678 1T589 2Q528 2 496 2T461 1Q444 1 444 10Q444 11 446 25Q448 35 450 39T455 44T464 46T480 47T506 54Q523 62 523 64Q522 64 476 181L429 299Q241 95 236 84Q232 76 232 72Q232 53 261 47Q262 47 267 47T273 46Q276 46 277 46T280 45T283 42T284 35Q284 26 282 19Q279 6 276 4T261 1Q258 1 243 1T201 2T142 2Q64 2 42 0Z",style:{"stroke-width":"3"}})])])],-1)]))),i[23]||(i[23]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"X")])],-1))]),i[37]||(i[37]=a(" must be either ")),s("mjx-container",u,[(n(),t("svg",F,i[24]||(i[24]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"31",d:"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z",style:{"stroke-width":"3"}})])])],-1)]))),i[25]||(i[25]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"1")])],-1))]),i[38]||(i[38]=a(" or ")),s("mjx-container",C,[(n(),t("svg",x,i[26]||(i[26]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"32",d:"M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z",style:{"stroke-width":"3"}})])])],-1)]))),i[27]||(i[27]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"2")])],-1))]),i[39]||(i[39]=a(" and a variable ")),s("mjx-container",w,[(n(),t("svg",f,i[28]||(i[28]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D44C",d:"M66 637Q54 637 49 637T39 638T32 641T30 647T33 664T42 682Q44 683 56 683Q104 680 165 680Q288 680 306 683H316Q322 677 322 674T320 656Q316 643 310 637H298Q242 637 242 624Q242 619 292 477T343 333L346 336Q350 340 358 349T379 373T411 410T454 461Q546 568 561 587T577 618Q577 634 545 637Q528 637 528 647Q528 649 530 661Q533 676 535 679T549 683Q551 683 578 682T657 680Q684 680 713 681T746 682Q763 682 763 673Q763 669 760 657T755 643Q753 637 734 637Q662 632 617 587Q608 578 477 424L348 273L322 169Q295 62 295 57Q295 46 363 46Q379 46 384 45T390 35Q390 33 388 23Q384 6 382 4T366 1Q361 1 324 1T232 2Q170 2 138 2T102 1Q84 1 84 9Q84 14 87 24Q88 27 89 30T90 35T91 39T93 42T96 44T101 45T107 45T116 46T129 46Q168 47 180 50T198 63Q201 68 227 171L252 274L129 623Q128 624 127 625T125 627T122 629T118 631T113 633T105 634T96 635T83 636T66 637Z",style:{"stroke-width":"3"}})])])],-1)]))),i[29]||(i[29]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"Y")])],-1))]),i[40]||(i[40]=a(" must be either ")),s("mjx-container",b,[(n(),t("svg",v,i[30]||(i[30]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"33",d:"M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z",style:{"stroke-width":"3"}})])])],-1)]))),i[31]||(i[31]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"3")])],-1))]),i[41]||(i[41]=a(" or ")),s("mjx-container",H,[(n(),t("svg",D,i[32]||(i[32]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"34",d:"M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z",style:{"stroke-width":"3"}})])])],-1)]))),i[33]||(i[33]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"4")])],-1))]),i[42]||(i[42]=a(" could be defined extensionally by the set of tuples ")),s("mjx-container",B,[(n(),t("svg",A,i[34]||(i[34]=[e('',1)]))),i[35]||(i[35]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mrow",{"data-mjx-texclass":"ORD"},[s("mo",{stretchy:"false"},"("),s("mn",null,"1"),s("mo",null,","),s("mn",null,"3"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mo",{stretchy:"false"},"("),s("mn",null,"1"),s("mo",null,","),s("mn",null,"4"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mo",{stretchy:"false"},"("),s("mn",null,"2"),s("mo",null,","),s("mn",null,"3"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mo",{stretchy:"false"},"("),s("mn",null,"2"),s("mo",null,","),s("mn",null,"4"),s("mo",{stretchy:"false"},")")]),s("mo",null,".")])],-1))])]),i[46]||(i[46]=e(`

These two types of constraints provide a flexible way to define complex relationships between variables in constraint programming.

julia
using Constraints
+MOI.optimize!(optimizer)

Extension Constraints

`,9)),s("p",null,[i[36]||(i[36]=a("These are constraints that are defined by explicitly listing all the tuples of values that satisfy the constraint. They are called extensional because they are defined by the set of values they allow. For example, a binary constraint that specifies that a variable ")),s("mjx-container",m,[(n(),t("svg",c,i[22]||(i[22]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D44B",d:"M42 0H40Q26 0 26 11Q26 15 29 27Q33 41 36 43T55 46Q141 49 190 98Q200 108 306 224T411 342Q302 620 297 625Q288 636 234 637H206Q200 643 200 645T202 664Q206 677 212 683H226Q260 681 347 681Q380 681 408 681T453 682T473 682Q490 682 490 671Q490 670 488 658Q484 643 481 640T465 637Q434 634 411 620L488 426L541 485Q646 598 646 610Q646 628 622 635Q617 635 609 637Q594 637 594 648Q594 650 596 664Q600 677 606 683H618Q619 683 643 683T697 681T738 680Q828 680 837 683H845Q852 676 852 672Q850 647 840 637H824Q790 636 763 628T722 611T698 593L687 584Q687 585 592 480L505 384Q505 383 536 304T601 142T638 56Q648 47 699 46Q734 46 734 37Q734 35 732 23Q728 7 725 4T711 1Q708 1 678 1T589 2Q528 2 496 2T461 1Q444 1 444 10Q444 11 446 25Q448 35 450 39T455 44T464 46T480 47T506 54Q523 62 523 64Q522 64 476 181L429 299Q241 95 236 84Q232 76 232 72Q232 53 261 47Q262 47 267 47T273 46Q276 46 277 46T280 45T283 42T284 35Q284 26 282 19Q279 6 276 4T261 1Q258 1 243 1T201 2T142 2Q64 2 42 0Z",style:{"stroke-width":"3"}})])])],-1)]))),i[23]||(i[23]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"X")])],-1))]),i[37]||(i[37]=a(" must be either ")),s("mjx-container",u,[(n(),t("svg",F,i[24]||(i[24]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"31",d:"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z",style:{"stroke-width":"3"}})])])],-1)]))),i[25]||(i[25]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"1")])],-1))]),i[38]||(i[38]=a(" or ")),s("mjx-container",C,[(n(),t("svg",x,i[26]||(i[26]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"32",d:"M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z",style:{"stroke-width":"3"}})])])],-1)]))),i[27]||(i[27]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"2")])],-1))]),i[39]||(i[39]=a(" and a variable ")),s("mjx-container",w,[(n(),t("svg",f,i[28]||(i[28]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D44C",d:"M66 637Q54 637 49 637T39 638T32 641T30 647T33 664T42 682Q44 683 56 683Q104 680 165 680Q288 680 306 683H316Q322 677 322 674T320 656Q316 643 310 637H298Q242 637 242 624Q242 619 292 477T343 333L346 336Q350 340 358 349T379 373T411 410T454 461Q546 568 561 587T577 618Q577 634 545 637Q528 637 528 647Q528 649 530 661Q533 676 535 679T549 683Q551 683 578 682T657 680Q684 680 713 681T746 682Q763 682 763 673Q763 669 760 657T755 643Q753 637 734 637Q662 632 617 587Q608 578 477 424L348 273L322 169Q295 62 295 57Q295 46 363 46Q379 46 384 45T390 35Q390 33 388 23Q384 6 382 4T366 1Q361 1 324 1T232 2Q170 2 138 2T102 1Q84 1 84 9Q84 14 87 24Q88 27 89 30T90 35T91 39T93 42T96 44T101 45T107 45T116 46T129 46Q168 47 180 50T198 63Q201 68 227 171L252 274L129 623Q128 624 127 625T125 627T122 629T118 631T113 633T105 634T96 635T83 636T66 637Z",style:{"stroke-width":"3"}})])])],-1)]))),i[29]||(i[29]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"Y")])],-1))]),i[40]||(i[40]=a(" must be either ")),s("mjx-container",b,[(n(),t("svg",v,i[30]||(i[30]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"33",d:"M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z",style:{"stroke-width":"3"}})])])],-1)]))),i[31]||(i[31]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"3")])],-1))]),i[41]||(i[41]=a(" or ")),s("mjx-container",H,[(n(),t("svg",B,i[32]||(i[32]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"34",d:"M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z",style:{"stroke-width":"3"}})])])],-1)]))),i[33]||(i[33]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"4")])],-1))]),i[42]||(i[42]=a(" could be defined extensionally by the set of tuples ")),s("mjx-container",D,[(n(),t("svg",A,i[34]||(i[34]=[e('',1)]))),i[35]||(i[35]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mrow",{"data-mjx-texclass":"ORD"},[s("mo",{stretchy:"false"},"("),s("mn",null,"1"),s("mo",null,","),s("mn",null,"3"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mo",{stretchy:"false"},"("),s("mn",null,"1"),s("mo",null,","),s("mn",null,"4"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mo",{stretchy:"false"},"("),s("mn",null,"2"),s("mo",null,","),s("mn",null,"3"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mo",{stretchy:"false"},"("),s("mn",null,"2"),s("mo",null,","),s("mn",null,"4"),s("mo",{stretchy:"false"},")")]),s("mo",null,".")])],-1))])]),i[46]||(i[46]=e(`

These two types of constraints provide a flexible way to define complex relationships between variables in constraint programming.

julia
using Constraints
 
 concept(:dist_different, x)
 concept(:dist_different)(x)
julia
# Defines the DistDifferent constraint
@@ -87,4 +87,4 @@ import{_ as l,c as t,a5 as e,j as s,a,o as n}from"./chunks/framework.CJakPlgM.js
 end
 MOI.add_constraint(optimizer, x, CBLS.Intention(y -> abs(y[1] - y[2])  abs(y[3] - y[4])))
 
-MOI.optimize!(optimizer)
`,2))])}const z=l(h,[["render",V]]);export{J as __pageData,z as default}; +MOI.optimize!(optimizer)
`,2))])}const O=l(h,[["render",V]]);export{z as __pageData,O as default}; diff --git a/dev/assets/constraints_21_generic_constraints.md.B4i07qkr.js b/dev/assets/constraints_21_generic_constraints.md.Cq_hAjZf.lean.js similarity index 98% rename from dev/assets/constraints_21_generic_constraints.md.B4i07qkr.js rename to dev/assets/constraints_21_generic_constraints.md.Cq_hAjZf.lean.js index 2bdd7b5..3992c3c 100644 --- a/dev/assets/constraints_21_generic_constraints.md.B4i07qkr.js +++ b/dev/assets/constraints_21_generic_constraints.md.Cq_hAjZf.lean.js @@ -1,4 +1,4 @@ -import{_ as l,c as t,a5 as e,j as s,a,o as n}from"./chunks/framework.CJakPlgM.js";const J=JSON.parse('{"title":"Generic Constraints","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/21_generic_constraints.md","filePath":"constraints/21_generic_constraints.md","lastUpdated":null}'),h={name:"constraints/21_generic_constraints.md"},p={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},r={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.109ex",height:"1.464ex",role:"img",focusable:"false",viewBox:"0 -442 490 647","aria-hidden":"true"},o={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.42ex",height:"1.686ex",role:"img",focusable:"false",viewBox:"0 -540 2395.6 745","aria-hidden":"true"},E={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},T={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},Q={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},y={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"25.797ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 11402.4 1000","aria-hidden":"true"},m={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.928ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 852 683","aria-hidden":"true"},u={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},F={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 500 666","aria-hidden":"true"},C={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},x={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 500 666","aria-hidden":"true"},w={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},f={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.726ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 763 683","aria-hidden":"true"},b={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},v={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.554ex",role:"img",focusable:"false",viewBox:"0 -665 500 687","aria-hidden":"true"},H={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},D={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.532ex",role:"img",focusable:"false",viewBox:"0 -677 500 677","aria-hidden":"true"},B={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"23.762ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 10502.7 1000","aria-hidden":"true"};function V(M,i,L,j,Z,I){return n(),t("div",null,[i[43]||(i[43]=e('

Generic Constraints

In the XCSP³-core standard, generic constraints are categorized into two main types: intention and extension constraints.

Intention Constraints

',3)),s("p",null,[i[6]||(i[6]=a("These are constraints that are defined by a logical expression or a function. They are called intentional because they are defined by the property they satisfy. For example, a constraint that specifies that a variable ")),s("mjx-container",p,[(n(),t("svg",k,i[0]||(i[0]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D465",d:"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z",style:{"stroke-width":"3"}})])])],-1)]))),i[1]||(i[1]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x")])],-1))]),i[7]||(i[7]=a(" must be less than a variable ")),s("mjx-container",r,[(n(),t("svg",d,i[2]||(i[2]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D466",d:"M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),i[3]||(i[3]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"y")])],-1))]),i[8]||(i[8]=a(" could be defined intentionally as ")),s("mjx-container",o,[(n(),t("svg",g,i[4]||(i[4]=[e('',1)]))),i[5]||(i[5]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x"),s("mo",null,"<"),s("mi",null,"y")])],-1))]),i[9]||(i[9]=a("."))]),i[44]||(i[44]=e('

Note that the intention constraint is not directly available through the JC-API in Constraints.jl. It is designed as such since defining a constraint through a predicate is the natural way.

We provide a straightforward example through the :dist_different constraint on how to define and add such a constraint in the USUAL_CONSTRAINTS collection.

Higher level modeling languages such as JuMP should provide a Intention interface.

Defining an intention constraint in JC-API

',4)),s("p",null,[i[12]||(i[12]=a("We use the ")),i[13]||(i[13]=s("code",null,"dist_different",-1)),i[14]||(i[14]=a(" constraint to illustrate how to define an intention constraint in ")),i[15]||(i[15]=s("em",null,"Constraints.jl",-1)),i[16]||(i[16]=a(". The ")),i[17]||(i[17]=s("code",null,"dist_different",-1)),i[18]||(i[18]=a(" constraint ensures that the distances between marks ")),s("mjx-container",E,[(n(),t("svg",T,i[10]||(i[10]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D465",d:"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z",style:{"stroke-width":"3"}})])])],-1)]))),i[11]||(i[11]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x")])],-1))]),i[19]||(i[19]=a(" on a ruler are unique."))]),s("mjx-container",Q,[(n(),t("svg",y,i[20]||(i[20]=[e('',1)]))),i[21]||(i[21]=s("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"1"),s("mo",{stretchy:"false"},"]"),s("mo",null,"−"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"2"),s("mo",{stretchy:"false"},"]"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mo",null,"≠"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"3"),s("mo",{stretchy:"false"},"]"),s("mo",null,"−"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"4"),s("mo",{stretchy:"false"},"]"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])],-1))]),i[45]||(i[45]=e(`

The constraint is then added to the usual constraints collection.

julia
const description_dist_different = """
+import{_ as l,c as t,a5 as e,j as s,a,o as n}from"./chunks/framework.CJakPlgM.js";const z=JSON.parse('{"title":"Generic Constraints","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/21_generic_constraints.md","filePath":"constraints/21_generic_constraints.md","lastUpdated":null}'),h={name:"constraints/21_generic_constraints.md"},p={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},r={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.109ex",height:"1.464ex",role:"img",focusable:"false",viewBox:"0 -442 490 647","aria-hidden":"true"},o={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.42ex",height:"1.686ex",role:"img",focusable:"false",viewBox:"0 -540 2395.6 745","aria-hidden":"true"},E={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},T={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},Q={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},y={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"25.797ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 11402.4 1000","aria-hidden":"true"},m={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.928ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 852 683","aria-hidden":"true"},u={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},F={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 500 666","aria-hidden":"true"},C={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},x={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 500 666","aria-hidden":"true"},w={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},f={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.726ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 763 683","aria-hidden":"true"},b={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},v={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.554ex",role:"img",focusable:"false",viewBox:"0 -665 500 687","aria-hidden":"true"},H={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},B={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.532ex",role:"img",focusable:"false",viewBox:"0 -677 500 677","aria-hidden":"true"},D={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"23.762ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 10502.7 1000","aria-hidden":"true"};function V(M,i,L,Z,j,I){return n(),t("div",null,[i[43]||(i[43]=e('

Generic Constraints

In the XCSP³-core standard, generic constraints are categorized into two main types: intention and extension constraints.

Intention Constraints

',3)),s("p",null,[i[6]||(i[6]=a("These are constraints that are defined by a logical expression or a function. They are called intentional because they are defined by the property they satisfy. For example, a constraint that specifies that a variable ")),s("mjx-container",p,[(n(),t("svg",k,i[0]||(i[0]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D465",d:"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z",style:{"stroke-width":"3"}})])])],-1)]))),i[1]||(i[1]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x")])],-1))]),i[7]||(i[7]=a(" must be less than a variable ")),s("mjx-container",r,[(n(),t("svg",d,i[2]||(i[2]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D466",d:"M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),i[3]||(i[3]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"y")])],-1))]),i[8]||(i[8]=a(" could be defined intentionally as ")),s("mjx-container",o,[(n(),t("svg",g,i[4]||(i[4]=[e('',1)]))),i[5]||(i[5]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x"),s("mo",null,"<"),s("mi",null,"y")])],-1))]),i[9]||(i[9]=a("."))]),i[44]||(i[44]=e('

Note that the intention constraint is not directly available through the JC-API in Constraints.jl. It is designed as such since defining a constraint through a predicate is the natural way.

We provide a straightforward example through the :dist_different constraint on how to define and add such a constraint in the USUAL_CONSTRAINTS collection.

Higher level modeling languages such as JuMP should provide a Intention interface.

Defining an intention constraint in JC-API

',4)),s("p",null,[i[12]||(i[12]=a("We use the ")),i[13]||(i[13]=s("code",null,"dist_different",-1)),i[14]||(i[14]=a(" constraint to illustrate how to define an intention constraint in ")),i[15]||(i[15]=s("em",null,"Constraints.jl",-1)),i[16]||(i[16]=a(". The ")),i[17]||(i[17]=s("code",null,"dist_different",-1)),i[18]||(i[18]=a(" constraint ensures that the distances between marks ")),s("mjx-container",E,[(n(),t("svg",T,i[10]||(i[10]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D465",d:"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z",style:{"stroke-width":"3"}})])])],-1)]))),i[11]||(i[11]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x")])],-1))]),i[19]||(i[19]=a(" on a ruler are unique."))]),s("mjx-container",Q,[(n(),t("svg",y,i[20]||(i[20]=[e('',1)]))),i[21]||(i[21]=s("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"1"),s("mo",{stretchy:"false"},"]"),s("mo",null,"−"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"2"),s("mo",{stretchy:"false"},"]"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mo",null,"≠"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"3"),s("mo",{stretchy:"false"},"]"),s("mo",null,"−"),s("mi",null,"x"),s("mo",{stretchy:"false"},"["),s("mn",null,"4"),s("mo",{stretchy:"false"},"]"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])],-1))]),i[45]||(i[45]=e(`

The constraint is then added to the usual constraints collection.

julia
const description_dist_different = """
 Ensures that the distances between marks on the ruler are unique.
 """
 
@@ -9,7 +9,7 @@ import{_ as l,c as t,a5 as e,j as s,a,o as n}from"./chunks/framework.CJakPlgM.js
 @usual concept_dist_different(x) = xcsp_intention(
     list = x,
     predicate = predicate_dist_different
-)

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

APIs

Note that the intention constraint is not directly available through the JC-API in Constraints.jl. It is designed as such since defining a constraint through a predicate is the natural way.

We provide here a usage example for the :dist_different constraint, previously added to the USUAL_CONSTRAINTS collection.

Higher level modeling language such as JuMP should provide an Intention interface.

julia
using Constraints
+)

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

APIs

Note that the intention constraint is not directly available through the JC-API in Constraints.jl. It is designed as such since defining a constraint through a predicate is the natural way.

We provide here a usage example for the :dist_different constraint, previously added to the USUAL_CONSTRAINTS collection.

Higher level modeling language such as JuMP should provide an Intention interface.

julia
using Constraints
 
 concept(:dist_different, x)
 concept(:dist_different)(x)
julia
# Defines the DistDifferent constraint
@@ -48,7 +48,7 @@ import{_ as l,c as t,a5 as e,j as s,a,o as n}from"./chunks/framework.CJakPlgM.js
 end
 MOI.add_constraint(optimizer, x, CBLS.Intention(y -> abs(y[1] - y[2])  abs(y[3] - y[4])))
 
-MOI.optimize!(optimizer)

Extension Constraints

`,9)),s("p",null,[i[36]||(i[36]=a("These are constraints that are defined by explicitly listing all the tuples of values that satisfy the constraint. They are called extensional because they are defined by the set of values they allow. For example, a binary constraint that specifies that a variable ")),s("mjx-container",m,[(n(),t("svg",c,i[22]||(i[22]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D44B",d:"M42 0H40Q26 0 26 11Q26 15 29 27Q33 41 36 43T55 46Q141 49 190 98Q200 108 306 224T411 342Q302 620 297 625Q288 636 234 637H206Q200 643 200 645T202 664Q206 677 212 683H226Q260 681 347 681Q380 681 408 681T453 682T473 682Q490 682 490 671Q490 670 488 658Q484 643 481 640T465 637Q434 634 411 620L488 426L541 485Q646 598 646 610Q646 628 622 635Q617 635 609 637Q594 637 594 648Q594 650 596 664Q600 677 606 683H618Q619 683 643 683T697 681T738 680Q828 680 837 683H845Q852 676 852 672Q850 647 840 637H824Q790 636 763 628T722 611T698 593L687 584Q687 585 592 480L505 384Q505 383 536 304T601 142T638 56Q648 47 699 46Q734 46 734 37Q734 35 732 23Q728 7 725 4T711 1Q708 1 678 1T589 2Q528 2 496 2T461 1Q444 1 444 10Q444 11 446 25Q448 35 450 39T455 44T464 46T480 47T506 54Q523 62 523 64Q522 64 476 181L429 299Q241 95 236 84Q232 76 232 72Q232 53 261 47Q262 47 267 47T273 46Q276 46 277 46T280 45T283 42T284 35Q284 26 282 19Q279 6 276 4T261 1Q258 1 243 1T201 2T142 2Q64 2 42 0Z",style:{"stroke-width":"3"}})])])],-1)]))),i[23]||(i[23]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"X")])],-1))]),i[37]||(i[37]=a(" must be either ")),s("mjx-container",u,[(n(),t("svg",F,i[24]||(i[24]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"31",d:"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z",style:{"stroke-width":"3"}})])])],-1)]))),i[25]||(i[25]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"1")])],-1))]),i[38]||(i[38]=a(" or ")),s("mjx-container",C,[(n(),t("svg",x,i[26]||(i[26]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"32",d:"M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z",style:{"stroke-width":"3"}})])])],-1)]))),i[27]||(i[27]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"2")])],-1))]),i[39]||(i[39]=a(" and a variable ")),s("mjx-container",w,[(n(),t("svg",f,i[28]||(i[28]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D44C",d:"M66 637Q54 637 49 637T39 638T32 641T30 647T33 664T42 682Q44 683 56 683Q104 680 165 680Q288 680 306 683H316Q322 677 322 674T320 656Q316 643 310 637H298Q242 637 242 624Q242 619 292 477T343 333L346 336Q350 340 358 349T379 373T411 410T454 461Q546 568 561 587T577 618Q577 634 545 637Q528 637 528 647Q528 649 530 661Q533 676 535 679T549 683Q551 683 578 682T657 680Q684 680 713 681T746 682Q763 682 763 673Q763 669 760 657T755 643Q753 637 734 637Q662 632 617 587Q608 578 477 424L348 273L322 169Q295 62 295 57Q295 46 363 46Q379 46 384 45T390 35Q390 33 388 23Q384 6 382 4T366 1Q361 1 324 1T232 2Q170 2 138 2T102 1Q84 1 84 9Q84 14 87 24Q88 27 89 30T90 35T91 39T93 42T96 44T101 45T107 45T116 46T129 46Q168 47 180 50T198 63Q201 68 227 171L252 274L129 623Q128 624 127 625T125 627T122 629T118 631T113 633T105 634T96 635T83 636T66 637Z",style:{"stroke-width":"3"}})])])],-1)]))),i[29]||(i[29]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"Y")])],-1))]),i[40]||(i[40]=a(" must be either ")),s("mjx-container",b,[(n(),t("svg",v,i[30]||(i[30]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"33",d:"M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z",style:{"stroke-width":"3"}})])])],-1)]))),i[31]||(i[31]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"3")])],-1))]),i[41]||(i[41]=a(" or ")),s("mjx-container",H,[(n(),t("svg",D,i[32]||(i[32]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"34",d:"M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z",style:{"stroke-width":"3"}})])])],-1)]))),i[33]||(i[33]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"4")])],-1))]),i[42]||(i[42]=a(" could be defined extensionally by the set of tuples ")),s("mjx-container",B,[(n(),t("svg",A,i[34]||(i[34]=[e('',1)]))),i[35]||(i[35]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mrow",{"data-mjx-texclass":"ORD"},[s("mo",{stretchy:"false"},"("),s("mn",null,"1"),s("mo",null,","),s("mn",null,"3"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mo",{stretchy:"false"},"("),s("mn",null,"1"),s("mo",null,","),s("mn",null,"4"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mo",{stretchy:"false"},"("),s("mn",null,"2"),s("mo",null,","),s("mn",null,"3"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mo",{stretchy:"false"},"("),s("mn",null,"2"),s("mo",null,","),s("mn",null,"4"),s("mo",{stretchy:"false"},")")]),s("mo",null,".")])],-1))])]),i[46]||(i[46]=e(`

These two types of constraints provide a flexible way to define complex relationships between variables in constraint programming.

julia
using Constraints
+MOI.optimize!(optimizer)

Extension Constraints

`,9)),s("p",null,[i[36]||(i[36]=a("These are constraints that are defined by explicitly listing all the tuples of values that satisfy the constraint. They are called extensional because they are defined by the set of values they allow. For example, a binary constraint that specifies that a variable ")),s("mjx-container",m,[(n(),t("svg",c,i[22]||(i[22]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D44B",d:"M42 0H40Q26 0 26 11Q26 15 29 27Q33 41 36 43T55 46Q141 49 190 98Q200 108 306 224T411 342Q302 620 297 625Q288 636 234 637H206Q200 643 200 645T202 664Q206 677 212 683H226Q260 681 347 681Q380 681 408 681T453 682T473 682Q490 682 490 671Q490 670 488 658Q484 643 481 640T465 637Q434 634 411 620L488 426L541 485Q646 598 646 610Q646 628 622 635Q617 635 609 637Q594 637 594 648Q594 650 596 664Q600 677 606 683H618Q619 683 643 683T697 681T738 680Q828 680 837 683H845Q852 676 852 672Q850 647 840 637H824Q790 636 763 628T722 611T698 593L687 584Q687 585 592 480L505 384Q505 383 536 304T601 142T638 56Q648 47 699 46Q734 46 734 37Q734 35 732 23Q728 7 725 4T711 1Q708 1 678 1T589 2Q528 2 496 2T461 1Q444 1 444 10Q444 11 446 25Q448 35 450 39T455 44T464 46T480 47T506 54Q523 62 523 64Q522 64 476 181L429 299Q241 95 236 84Q232 76 232 72Q232 53 261 47Q262 47 267 47T273 46Q276 46 277 46T280 45T283 42T284 35Q284 26 282 19Q279 6 276 4T261 1Q258 1 243 1T201 2T142 2Q64 2 42 0Z",style:{"stroke-width":"3"}})])])],-1)]))),i[23]||(i[23]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"X")])],-1))]),i[37]||(i[37]=a(" must be either ")),s("mjx-container",u,[(n(),t("svg",F,i[24]||(i[24]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"31",d:"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z",style:{"stroke-width":"3"}})])])],-1)]))),i[25]||(i[25]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"1")])],-1))]),i[38]||(i[38]=a(" or ")),s("mjx-container",C,[(n(),t("svg",x,i[26]||(i[26]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"32",d:"M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z",style:{"stroke-width":"3"}})])])],-1)]))),i[27]||(i[27]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"2")])],-1))]),i[39]||(i[39]=a(" and a variable ")),s("mjx-container",w,[(n(),t("svg",f,i[28]||(i[28]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D44C",d:"M66 637Q54 637 49 637T39 638T32 641T30 647T33 664T42 682Q44 683 56 683Q104 680 165 680Q288 680 306 683H316Q322 677 322 674T320 656Q316 643 310 637H298Q242 637 242 624Q242 619 292 477T343 333L346 336Q350 340 358 349T379 373T411 410T454 461Q546 568 561 587T577 618Q577 634 545 637Q528 637 528 647Q528 649 530 661Q533 676 535 679T549 683Q551 683 578 682T657 680Q684 680 713 681T746 682Q763 682 763 673Q763 669 760 657T755 643Q753 637 734 637Q662 632 617 587Q608 578 477 424L348 273L322 169Q295 62 295 57Q295 46 363 46Q379 46 384 45T390 35Q390 33 388 23Q384 6 382 4T366 1Q361 1 324 1T232 2Q170 2 138 2T102 1Q84 1 84 9Q84 14 87 24Q88 27 89 30T90 35T91 39T93 42T96 44T101 45T107 45T116 46T129 46Q168 47 180 50T198 63Q201 68 227 171L252 274L129 623Q128 624 127 625T125 627T122 629T118 631T113 633T105 634T96 635T83 636T66 637Z",style:{"stroke-width":"3"}})])])],-1)]))),i[29]||(i[29]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"Y")])],-1))]),i[40]||(i[40]=a(" must be either ")),s("mjx-container",b,[(n(),t("svg",v,i[30]||(i[30]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"33",d:"M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z",style:{"stroke-width":"3"}})])])],-1)]))),i[31]||(i[31]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"3")])],-1))]),i[41]||(i[41]=a(" or ")),s("mjx-container",H,[(n(),t("svg",B,i[32]||(i[32]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mn"},[s("path",{"data-c":"34",d:"M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z",style:{"stroke-width":"3"}})])])],-1)]))),i[33]||(i[33]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mn",null,"4")])],-1))]),i[42]||(i[42]=a(" could be defined extensionally by the set of tuples ")),s("mjx-container",D,[(n(),t("svg",A,i[34]||(i[34]=[e('',1)]))),i[35]||(i[35]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mrow",{"data-mjx-texclass":"ORD"},[s("mo",{stretchy:"false"},"("),s("mn",null,"1"),s("mo",null,","),s("mn",null,"3"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mo",{stretchy:"false"},"("),s("mn",null,"1"),s("mo",null,","),s("mn",null,"4"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mo",{stretchy:"false"},"("),s("mn",null,"2"),s("mo",null,","),s("mn",null,"3"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mo",{stretchy:"false"},"("),s("mn",null,"2"),s("mo",null,","),s("mn",null,"4"),s("mo",{stretchy:"false"},")")]),s("mo",null,".")])],-1))])]),i[46]||(i[46]=e(`

These two types of constraints provide a flexible way to define complex relationships between variables in constraint programming.

julia
using Constraints
 
 concept(:dist_different, x)
 concept(:dist_different)(x)
julia
# Defines the DistDifferent constraint
@@ -87,4 +87,4 @@ import{_ as l,c as t,a5 as e,j as s,a,o as n}from"./chunks/framework.CJakPlgM.js
 end
 MOI.add_constraint(optimizer, x, CBLS.Intention(y -> abs(y[1] - y[2])  abs(y[3] - y[4])))
 
-MOI.optimize!(optimizer)
`,2))])}const z=l(h,[["render",V]]);export{J as __pageData,z as default}; +MOI.optimize!(optimizer)
`,2))])}const O=l(h,[["render",V]]);export{z as __pageData,O as default}; diff --git a/dev/assets/constraints_23_comparison_constraints.md.DcsU6on2.js b/dev/assets/constraints_23_comparison_constraints.md.4b0z8qtK.js similarity index 98% rename from dev/assets/constraints_23_comparison_constraints.md.DcsU6on2.js rename to dev/assets/constraints_23_comparison_constraints.md.4b0z8qtK.js index ad14712..c6a5235 100644 --- a/dev/assets/constraints_23_comparison_constraints.md.DcsU6on2.js +++ b/dev/assets/constraints_23_comparison_constraints.md.4b0z8qtK.js @@ -1,4 +1,4 @@ -import{_ as l,c as k,a5 as a,j as i,a as h,G as t,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const v=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/23_comparison_constraints.md","filePath":"constraints/23_comparison_constraints.md","lastUpdated":null}'),E={name:"constraints/23_comparison_constraints.md"},r={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""};function y(o,s,F,C,c,u){const n=p("Badge");return e(),k("div",null,[s[9]||(s[9]=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
+import{_ as l,c as k,a5 as a,j as i,a as h,G as t,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const b=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/23_comparison_constraints.md","filePath":"constraints/23_comparison_constraints.md","lastUpdated":null}'),E={name:"constraints/23_comparison_constraints.md"},r={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""};function y(o,s,F,C,c,u){const n=p("Badge");return e(),k("div",null,[s[9]||(s[9]=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
 
 concept(:all_different, [1,1,1,2]) # false
 concept(:all_different, [1,9,3,2]) # true
julia
using Constraints
@@ -17,7 +17,7 @@ import{_ as l,c as k,a5 as a,j as i,a as h,G as t,B as p,o as e}from"./chunks/fr
 JuMP.optimize!(model)
 @info "All Different" value.(X) value.(Y)
 
-# Note that this example gives a solution for the all_different constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+# Note that this example gives a solution for the all_different constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 concept(:all_equal, [1,1,1,2]) #false
 concept(:all_equal, [1,1,1,1]) #true
julia
using Constraints
@@ -35,7 +35,7 @@ import{_ as l,c as k,a5 as a,j as i,a as h,G as t,B as p,o as e}from"./chunks/fr
 JuMP.optimize!(model)
 @info "All Equal" value.(X)
 
-# Note that this example gives a solution for the all_equal constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+# Note that this example gives a solution for the all_equal constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 @info concept(:ordered, [1, 2, 3, 4, 4]; op=≤)
 @info concept(:ordered, [1, 2, 3, 3, 5]; op=<)
@@ -79,4 +79,4 @@ import{_ as l,c as k,a5 as a,j as i,a as h,G as t,B as p,o as e}from"./chunks/fr
 c([1, 2, 3, 4, 4]; op=≤)
 c([1, 2, 3, 4, 5]; op=<)
 !c([1, 2, 3, 4, 3]; op=≤)
-!c([1, 2, 3, 4, 3]; op=<)

source

`,18))])])}const b=l(E,[["render",y]]);export{v as __pageData,b as default}; +!c([1, 2, 3, 4, 3]; op=<)

source

`,18))])])}const v=l(E,[["render",y]]);export{b as __pageData,v as default}; diff --git a/dev/assets/constraints_23_comparison_constraints.md.DcsU6on2.lean.js b/dev/assets/constraints_23_comparison_constraints.md.4b0z8qtK.lean.js similarity index 98% rename from dev/assets/constraints_23_comparison_constraints.md.DcsU6on2.lean.js rename to dev/assets/constraints_23_comparison_constraints.md.4b0z8qtK.lean.js index ad14712..c6a5235 100644 --- a/dev/assets/constraints_23_comparison_constraints.md.DcsU6on2.lean.js +++ b/dev/assets/constraints_23_comparison_constraints.md.4b0z8qtK.lean.js @@ -1,4 +1,4 @@ -import{_ as l,c as k,a5 as a,j as i,a as h,G as t,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const v=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/23_comparison_constraints.md","filePath":"constraints/23_comparison_constraints.md","lastUpdated":null}'),E={name:"constraints/23_comparison_constraints.md"},r={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""};function y(o,s,F,C,c,u){const n=p("Badge");return e(),k("div",null,[s[9]||(s[9]=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
+import{_ as l,c as k,a5 as a,j as i,a as h,G as t,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const b=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/23_comparison_constraints.md","filePath":"constraints/23_comparison_constraints.md","lastUpdated":null}'),E={name:"constraints/23_comparison_constraints.md"},r={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""};function y(o,s,F,C,c,u){const n=p("Badge");return e(),k("div",null,[s[9]||(s[9]=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
 
 concept(:all_different, [1,1,1,2]) # false
 concept(:all_different, [1,9,3,2]) # true
julia
using Constraints
@@ -17,7 +17,7 @@ import{_ as l,c as k,a5 as a,j as i,a as h,G as t,B as p,o as e}from"./chunks/fr
 JuMP.optimize!(model)
 @info "All Different" value.(X) value.(Y)
 
-# Note that this example gives a solution for the all_different constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+# Note that this example gives a solution for the all_different constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 concept(:all_equal, [1,1,1,2]) #false
 concept(:all_equal, [1,1,1,1]) #true
julia
using Constraints
@@ -35,7 +35,7 @@ import{_ as l,c as k,a5 as a,j as i,a as h,G as t,B as p,o as e}from"./chunks/fr
 JuMP.optimize!(model)
 @info "All Equal" value.(X)
 
-# Note that this example gives a solution for the all_equal constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+# Note that this example gives a solution for the all_equal constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 @info concept(:ordered, [1, 2, 3, 4, 4]; op=≤)
 @info concept(:ordered, [1, 2, 3, 3, 5]; op=<)
@@ -79,4 +79,4 @@ import{_ as l,c as k,a5 as a,j as i,a as h,G as t,B as p,o as e}from"./chunks/fr
 c([1, 2, 3, 4, 4]; op=≤)
 c([1, 2, 3, 4, 5]; op=<)
 !c([1, 2, 3, 4, 3]; op=≤)
-!c([1, 2, 3, 4, 3]; op=<)

source

`,18))])])}const b=l(E,[["render",y]]);export{v as __pageData,b as default}; +!c([1, 2, 3, 4, 3]; op=<)

source

`,18))])])}const v=l(E,[["render",y]]);export{b as __pageData,v as default}; diff --git a/dev/assets/constraints_24_counting_summing_constraints.md.DKaHxQLr.js b/dev/assets/constraints_24_counting_summing_constraints.md.DVkY5sTG.js similarity index 98% rename from dev/assets/constraints_24_counting_summing_constraints.md.DKaHxQLr.js rename to dev/assets/constraints_24_counting_summing_constraints.md.DVkY5sTG.js index 4df1f6e..faa1337 100644 --- a/dev/assets/constraints_24_counting_summing_constraints.md.DKaHxQLr.js +++ b/dev/assets/constraints_24_counting_summing_constraints.md.DVkY5sTG.js @@ -1,4 +1,4 @@ -import{_ as t,c as l,a5 as a,j as i,a as k,G as n,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const b=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/24_counting_summing_constraints.md","filePath":"constraints/24_counting_summing_constraints.md","lastUpdated":null}'),E={name:"constraints/24_counting_summing_constraints.md"},d={class:"jldocstring custom-block",open:""},r={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""};function F(C,s,o,c,B,u){const h=p("Badge");return e(),l("div",null,[s[12]||(s[12]=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
+import{_ as t,c as l,a5 as a,j as i,a as k,G as n,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const b=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/24_counting_summing_constraints.md","filePath":"constraints/24_counting_summing_constraints.md","lastUpdated":null}'),E={name:"constraints/24_counting_summing_constraints.md"},d={class:"jldocstring custom-block",open:""},r={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""};function F(C,s,o,c,B,u){const h=p("Badge");return e(),l("div",null,[s[12]||(s[12]=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
 
 @info concept(:sum, [1, 2, 3, 4, 5]; op = ==, val=15)
 @info concept(:sum, [1, 2, 3, 4, 5]; op = ==, val=2)
@@ -20,7 +20,7 @@ import{_ as t,c as l,a5 as a,j as i,a as k,G as n,B as p,o as e}from"./chunks/fr
 @constraint(model, X in Sum(; op = ==, val = 15))
 @constraint(model, Y in Sum(; op = <=, val = 10))
 JuMP.optimize!(model)
-@info "Sum" value.(X) value.(Y)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "Sum" value.(X) value.(Y)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 concept(:count, [1,1,1,2], vals = [1, 1, 1, 2], op = ==, val = 4) # true
 concept(:count, [1,1,1,2], vals = [1, 1, 1, 2], op = ==, val = 5) # false
@@ -54,7 +54,7 @@ import{_ as t,c as l,a5 as a,j as i,a as k,G as n,B as p,o as e}from"./chunks/fr
 @constraint(model, X_at_most in AtMost(vals = [1, 2], val = 1))
 @constraint(model, X_exactly in Exactly(vals = [1, 2], val = 2))
 JuMP.optimize!(model)
-@info "Count" value.(X) value.(X_at_least) value.(X_at_most) value.(X_exactly)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "Count" value.(X) value.(X_at_least) value.(X_at_most) value.(X_exactly)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 @info concept(:nvalues, [1, 2, 3, 4, 5]; op = ==, val = 5)
 @info concept(:nvalues, [1, 2, 3, 4, 5]; op = ==, val = 2)
@@ -78,7 +78,7 @@ import{_ as t,c as l,a5 as a,j as i,a as k,G as n,B as p,o as e}from"./chunks/fr
 @constraint(model, Y in NValues(; op = ==, val = 2))
 @constraint(model, Z in NValues(; op = <=, val = 5, vals = [1, 2]))
 JuMP.optimize!(model)
-@info "NValues" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "NValues" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 # [v1, v2, v3], [v1, a1, a2; v2, b1, b2; v3, c1, c2] means v1 occurs between a1 and a2 times in the first array, similar for v2 and v3.
 
@@ -143,4 +143,4 @@ import{_ as t,c as l,a5 as a,j as i,a as k,G as n,B as p,o as e}from"./chunks/fr
 cc([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])
 
 co = concept(:cardinality_open)
-co([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])

source

`,14))])])}const D=t(E,[["render",F]]);export{b as __pageData,D as default}; +co([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])

source

`,14))])])}const A=t(E,[["render",F]]);export{b as __pageData,A as default}; diff --git a/dev/assets/constraints_24_counting_summing_constraints.md.DKaHxQLr.lean.js b/dev/assets/constraints_24_counting_summing_constraints.md.DVkY5sTG.lean.js similarity index 98% rename from dev/assets/constraints_24_counting_summing_constraints.md.DKaHxQLr.lean.js rename to dev/assets/constraints_24_counting_summing_constraints.md.DVkY5sTG.lean.js index 4df1f6e..faa1337 100644 --- a/dev/assets/constraints_24_counting_summing_constraints.md.DKaHxQLr.lean.js +++ b/dev/assets/constraints_24_counting_summing_constraints.md.DVkY5sTG.lean.js @@ -1,4 +1,4 @@ -import{_ as t,c as l,a5 as a,j as i,a as k,G as n,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const b=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/24_counting_summing_constraints.md","filePath":"constraints/24_counting_summing_constraints.md","lastUpdated":null}'),E={name:"constraints/24_counting_summing_constraints.md"},d={class:"jldocstring custom-block",open:""},r={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""};function F(C,s,o,c,B,u){const h=p("Badge");return e(),l("div",null,[s[12]||(s[12]=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
+import{_ as t,c as l,a5 as a,j as i,a as k,G as n,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const b=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/24_counting_summing_constraints.md","filePath":"constraints/24_counting_summing_constraints.md","lastUpdated":null}'),E={name:"constraints/24_counting_summing_constraints.md"},d={class:"jldocstring custom-block",open:""},r={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""};function F(C,s,o,c,B,u){const h=p("Badge");return e(),l("div",null,[s[12]||(s[12]=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
 
 @info concept(:sum, [1, 2, 3, 4, 5]; op = ==, val=15)
 @info concept(:sum, [1, 2, 3, 4, 5]; op = ==, val=2)
@@ -20,7 +20,7 @@ import{_ as t,c as l,a5 as a,j as i,a as k,G as n,B as p,o as e}from"./chunks/fr
 @constraint(model, X in Sum(; op = ==, val = 15))
 @constraint(model, Y in Sum(; op = <=, val = 10))
 JuMP.optimize!(model)
-@info "Sum" value.(X) value.(Y)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "Sum" value.(X) value.(Y)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 concept(:count, [1,1,1,2], vals = [1, 1, 1, 2], op = ==, val = 4) # true
 concept(:count, [1,1,1,2], vals = [1, 1, 1, 2], op = ==, val = 5) # false
@@ -54,7 +54,7 @@ import{_ as t,c as l,a5 as a,j as i,a as k,G as n,B as p,o as e}from"./chunks/fr
 @constraint(model, X_at_most in AtMost(vals = [1, 2], val = 1))
 @constraint(model, X_exactly in Exactly(vals = [1, 2], val = 2))
 JuMP.optimize!(model)
-@info "Count" value.(X) value.(X_at_least) value.(X_at_most) value.(X_exactly)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "Count" value.(X) value.(X_at_least) value.(X_at_most) value.(X_exactly)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 @info concept(:nvalues, [1, 2, 3, 4, 5]; op = ==, val = 5)
 @info concept(:nvalues, [1, 2, 3, 4, 5]; op = ==, val = 2)
@@ -78,7 +78,7 @@ import{_ as t,c as l,a5 as a,j as i,a as k,G as n,B as p,o as e}from"./chunks/fr
 @constraint(model, Y in NValues(; op = ==, val = 2))
 @constraint(model, Z in NValues(; op = <=, val = 5, vals = [1, 2]))
 JuMP.optimize!(model)
-@info "NValues" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "NValues" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 # [v1, v2, v3], [v1, a1, a2; v2, b1, b2; v3, c1, c2] means v1 occurs between a1 and a2 times in the first array, similar for v2 and v3.
 
@@ -143,4 +143,4 @@ import{_ as t,c as l,a5 as a,j as i,a as k,G as n,B as p,o as e}from"./chunks/fr
 cc([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])
 
 co = concept(:cardinality_open)
-co([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])

source

`,14))])])}const D=t(E,[["render",F]]);export{b as __pageData,D as default}; +co([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])

source

`,14))])])}const A=t(E,[["render",F]]);export{b as __pageData,A as default}; diff --git a/dev/assets/constraints_25_connection_constraints.md.B1H1D7fs.js b/dev/assets/constraints_25_connection_constraints.md.ajGM2nJs.js similarity index 98% rename from dev/assets/constraints_25_connection_constraints.md.B1H1D7fs.js rename to dev/assets/constraints_25_connection_constraints.md.ajGM2nJs.js index 984bb7a..46186f4 100644 --- a/dev/assets/constraints_25_connection_constraints.md.B1H1D7fs.js +++ b/dev/assets/constraints_25_connection_constraints.md.ajGM2nJs.js @@ -1,4 +1,4 @@ -import{_ as t,c as l,a5 as a,j as i,a as h,G as k,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const b=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/25_connection_constraints.md","filePath":"constraints/25_connection_constraints.md","lastUpdated":null}'),E={name:"constraints/25_connection_constraints.md"},d={class:"jldocstring custom-block",open:""},r={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""};function F(C,s,o,c,u,B){const n=p("Badge");return e(),l("div",null,[s[12]||(s[12]=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
+import{_ as t,c as l,a5 as a,j as i,a as h,G as k,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const b=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/25_connection_constraints.md","filePath":"constraints/25_connection_constraints.md","lastUpdated":null}'),E={name:"constraints/25_connection_constraints.md"},d={class:"jldocstring custom-block",open:""},r={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""};function F(C,s,o,c,u,B){const n=p("Badge");return e(),l("div",null,[s[12]||(s[12]=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
 
 concept(:maximum, [1,1,1,2], val = 2, op = ==) # true
 concept(:maximum, [1,2,4,4], val = 2, op = ==) # false
julia
using Constraints
@@ -15,7 +15,7 @@ import{_ as t,c as l,a5 as a,j as i,a as h,G as k,B as p,o as e}from"./chunks/fr
 @variable(model, 1X[1:5]5, Int)
 @constraint(model, X in Maximum(; op = ==, val = 5))
 optimize!(model)
-@info "Maximum" value.(X)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "Maximum" value.(X)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 concept(:minimum, [1,1,1,2], val = 1, op = ==) # true
 concept(:minimum, [1,2,4,4], val = 2, op = ==) # false
julia
using Constraints
@@ -34,7 +34,7 @@ import{_ as t,c as l,a5 as a,j as i,a as h,G as k,B as p,o as e}from"./chunks/fr
 JuMP.optimize!(model)
 @info "Minimum" value.(X)
 
-# Note that this example gives a solution for the minimum constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+# Note that this example gives a solution for the minimum constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 @info concept(:element, [1, 2, 3, 4, 5]; id=1, val=1)
 @info concept(:element, [1, 2, 3, 4, 5]; id=1, val=2)
@@ -58,7 +58,7 @@ import{_ as t,c as l,a5 as a,j as i,a as h,G as k,B as p,o as e}from"./chunks/fr
 @constraint(model, Y in Element(; id = 1, val = 1))
 @constraint(model, Z in Element(; id = 2, val = 2))
 JuMP.optimize!(model)
-@info "Element" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "Element" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 @info concept(:channel, [2, 1, 4, 3])
 @info concept(:channel, [1, 2, 3, 4])
diff --git a/dev/assets/constraints_25_connection_constraints.md.B1H1D7fs.lean.js b/dev/assets/constraints_25_connection_constraints.md.ajGM2nJs.lean.js
similarity index 98%
rename from dev/assets/constraints_25_connection_constraints.md.B1H1D7fs.lean.js
rename to dev/assets/constraints_25_connection_constraints.md.ajGM2nJs.lean.js
index 984bb7a..46186f4 100644
--- a/dev/assets/constraints_25_connection_constraints.md.B1H1D7fs.lean.js
+++ b/dev/assets/constraints_25_connection_constraints.md.ajGM2nJs.lean.js
@@ -1,4 +1,4 @@
-import{_ as t,c as l,a5 as a,j as i,a as h,G as k,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const b=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/25_connection_constraints.md","filePath":"constraints/25_connection_constraints.md","lastUpdated":null}'),E={name:"constraints/25_connection_constraints.md"},d={class:"jldocstring custom-block",open:""},r={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""};function F(C,s,o,c,u,B){const n=p("Badge");return e(),l("div",null,[s[12]||(s[12]=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
+import{_ as t,c as l,a5 as a,j as i,a as h,G as k,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const b=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/25_connection_constraints.md","filePath":"constraints/25_connection_constraints.md","lastUpdated":null}'),E={name:"constraints/25_connection_constraints.md"},d={class:"jldocstring custom-block",open:""},r={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""};function F(C,s,o,c,u,B){const n=p("Badge");return e(),l("div",null,[s[12]||(s[12]=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
 
 concept(:maximum, [1,1,1,2], val = 2, op = ==) # true
 concept(:maximum, [1,2,4,4], val = 2, op = ==) # false
julia
using Constraints
@@ -15,7 +15,7 @@ import{_ as t,c as l,a5 as a,j as i,a as h,G as k,B as p,o as e}from"./chunks/fr
 @variable(model, 1X[1:5]5, Int)
 @constraint(model, X in Maximum(; op = ==, val = 5))
 optimize!(model)
-@info "Maximum" value.(X)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "Maximum" value.(X)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 concept(:minimum, [1,1,1,2], val = 1, op = ==) # true
 concept(:minimum, [1,2,4,4], val = 2, op = ==) # false
julia
using Constraints
@@ -34,7 +34,7 @@ import{_ as t,c as l,a5 as a,j as i,a as h,G as k,B as p,o as e}from"./chunks/fr
 JuMP.optimize!(model)
 @info "Minimum" value.(X)
 
-# Note that this example gives a solution for the minimum constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+# Note that this example gives a solution for the minimum constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 @info concept(:element, [1, 2, 3, 4, 5]; id=1, val=1)
 @info concept(:element, [1, 2, 3, 4, 5]; id=1, val=2)
@@ -58,7 +58,7 @@ import{_ as t,c as l,a5 as a,j as i,a as h,G as k,B as p,o as e}from"./chunks/fr
 @constraint(model, Y in Element(; id = 1, val = 1))
 @constraint(model, Z in Element(; id = 2, val = 2))
 JuMP.optimize!(model)
-@info "Element" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "Element" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 @info concept(:channel, [2, 1, 4, 3])
 @info concept(:channel, [1, 2, 3, 4])
diff --git a/dev/assets/constraints_26_packing_scheduling_constraints.md.DXvyM6Zb.js b/dev/assets/constraints_26_packing_scheduling_constraints.md.CrG8P0jZ.js
similarity index 98%
rename from dev/assets/constraints_26_packing_scheduling_constraints.md.DXvyM6Zb.js
rename to dev/assets/constraints_26_packing_scheduling_constraints.md.CrG8P0jZ.js
index 59f22d9..c220502 100644
--- a/dev/assets/constraints_26_packing_scheduling_constraints.md.DXvyM6Zb.js
+++ b/dev/assets/constraints_26_packing_scheduling_constraints.md.CrG8P0jZ.js
@@ -1,4 +1,4 @@
-import{_ as t,c as l,a5 as a,j as i,a as k,G as n,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const u=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/26_packing_scheduling_constraints.md","filePath":"constraints/26_packing_scheduling_constraints.md","lastUpdated":null}'),E={name:"constraints/26_packing_scheduling_constraints.md"},r={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""};function g(y,s,F,C,o,c){const h=p("Badge");return e(),l("div",null,[s[6]||(s[6]=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
+import{_ as t,c as l,a5 as a,j as i,a as k,G as n,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const u=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/26_packing_scheduling_constraints.md","filePath":"constraints/26_packing_scheduling_constraints.md","lastUpdated":null}'),E={name:"constraints/26_packing_scheduling_constraints.md"},r={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""};function g(y,s,F,C,o,c){const h=p("Badge");return e(),l("div",null,[s[6]||(s[6]=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
 
 @info concept(:cumulative, [1, 2, 3, 4, 5]; val = 1)
 @info concept(:cumulative, [1, 2, 2, 4, 5]; val = 1)
@@ -25,7 +25,7 @@ import{_ as t,c as l,a5 as a,j as i,a as k,G as n,B as p,o as e}from"./chunks/fr
 @constraint(model,
     Z in Cumulative(; pair_vars = [3 2 5 4 2; 1 2 1 1 3], op = <, val = 5))
 JuMP.optimize!(model)
-@info "Cumulative" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "Cumulative" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 @info concept(:no_overlap, [1, 2, 3, 4, 5])
 @info concept(:no_overlap, [1, 2, 3, 4, 1])
diff --git a/dev/assets/constraints_26_packing_scheduling_constraints.md.DXvyM6Zb.lean.js b/dev/assets/constraints_26_packing_scheduling_constraints.md.CrG8P0jZ.lean.js
similarity index 98%
rename from dev/assets/constraints_26_packing_scheduling_constraints.md.DXvyM6Zb.lean.js
rename to dev/assets/constraints_26_packing_scheduling_constraints.md.CrG8P0jZ.lean.js
index 59f22d9..c220502 100644
--- a/dev/assets/constraints_26_packing_scheduling_constraints.md.DXvyM6Zb.lean.js
+++ b/dev/assets/constraints_26_packing_scheduling_constraints.md.CrG8P0jZ.lean.js
@@ -1,4 +1,4 @@
-import{_ as t,c as l,a5 as a,j as i,a as k,G as n,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const u=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/26_packing_scheduling_constraints.md","filePath":"constraints/26_packing_scheduling_constraints.md","lastUpdated":null}'),E={name:"constraints/26_packing_scheduling_constraints.md"},r={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""};function g(y,s,F,C,o,c){const h=p("Badge");return e(),l("div",null,[s[6]||(s[6]=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
+import{_ as t,c as l,a5 as a,j as i,a as k,G as n,B as p,o as e}from"./chunks/framework.CJakPlgM.js";const u=JSON.parse('{"title":"Constraints.jl: Streamlining Constraint Definition and Integration in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/26_packing_scheduling_constraints.md","filePath":"constraints/26_packing_scheduling_constraints.md","lastUpdated":null}'),E={name:"constraints/26_packing_scheduling_constraints.md"},r={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""};function g(y,s,F,C,o,c){const h=p("Badge");return e(),l("div",null,[s[6]||(s[6]=a(`

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
 
 @info concept(:cumulative, [1, 2, 3, 4, 5]; val = 1)
 @info concept(:cumulative, [1, 2, 2, 4, 5]; val = 1)
@@ -25,7 +25,7 @@ import{_ as t,c as l,a5 as a,j as i,a as k,G as n,B as p,o as e}from"./chunks/fr
 @constraint(model,
     Z in Cumulative(; pair_vars = [3 2 5 4 2; 1 2 1 1 3], op = <, val = 5))
 JuMP.optimize!(model)
-@info "Cumulative" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "Cumulative" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 @info concept(:no_overlap, [1, 2, 3, 4, 5])
 @info concept(:no_overlap, [1, 2, 3, 4, 1])
diff --git a/dev/assets/constraints_61_pattern_folds.md.xjkZia50.js b/dev/assets/constraints_61_pattern_folds.md.xjkZia50.js
new file mode 100644
index 0000000..030f84d
--- /dev/null
+++ b/dev/assets/constraints_61_pattern_folds.md.xjkZia50.js
@@ -0,0 +1 @@
+import{_ as n,c as o,j as t,a as e,G as l,a5 as i,B as r,o as d}from"./chunks/framework.CJakPlgM.js";const I=JSON.parse('{"title":"PatternFolds.jl","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/61_pattern_folds.md","filePath":"constraints/61_pattern_folds.md","lastUpdated":null}'),p={name:"constraints/61_pattern_folds.md"},h={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},P={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},V={class:"jldocstring custom-block",open:""};function x(L,s,M,D,J,O){const a=r("Badge");return d(),o("div",null,[s[59]||(s[59]=t("h1",{id:"patternfolds-jl",tabindex:"-1"},[e("PatternFolds.jl "),t("a",{class:"header-anchor",href:"#patternfolds-jl","aria-label":'Permalink to "PatternFolds.jl"'},"​")],-1)),s[60]||(s[60]=t("p",null,[e("Documentation for "),t("code",null,"PatternFolds.jl"),e(".")],-1)),t("details",h,[t("summary",null,[s[0]||(s[0]=t("a",{id:"PatternFolds.PatternFold",href:"#PatternFolds.PatternFold"},[t("span",{class:"jlbinding"},"PatternFolds.PatternFold")],-1)),s[1]||(s[1]=e()),l(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=i('
julia
PatternFold{T, P}

A Union type used as an interface for folded patterns such as VectorFold. To implement the interface and inherit from it, a new structure MyFold{T[,P]} must define three fields:

  • pattern::P. Note that both length(::P) and rand(::P) methods must be available

  • gap::TS

  • folds::int

',3)),s[3]||(s[3]=t("p",{T:""},"Finally one can redefine PatternFold",-1)),s[4]||(s[4]=i('
julia
PatternFold{T} = Union{AbstractVectorFold{T}, IntervalsFold{T}, MyFold{T[,P]}}

source

',2))]),t("details",k,[t("summary",null,[s[5]||(s[5]=t("a",{id:"PatternFolds.AbstractVectorFold",href:"#PatternFolds.AbstractVectorFold"},[t("span",{class:"jlbinding"},"PatternFolds.AbstractVectorFold")],-1)),s[6]||(s[6]=e()),l(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[7]||(s[7]=i('
julia
AbstractVectorFold{T, P}

An abstract type used as an interface for folded vectors such as VectorFold. To implement the interface and inherit from it, a new structure must define three fields:

  • pattern::P. Note that both length(::P) and rand(::P) methods must be available

  • gap::T

  • folds::int

source

',4))]),t("details",c,[t("summary",null,[s[8]||(s[8]=t("a",{id:"PatternFolds.IVectorFold",href:"#PatternFolds.IVectorFold"},[t("span",{class:"jlbinding"},"PatternFolds.IVectorFold")],-1)),s[9]||(s[9]=e()),l(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[10]||(s[10]=i('
julia
VectorFold{T,V <: AbstractVector{T}}

A folded vector structure that extends the methods of AbstractVector to a folded structure.

source

',3))]),t("details",u,[t("summary",null,[s[11]||(s[11]=t("a",{id:"PatternFolds.VectorFold",href:"#PatternFolds.VectorFold"},[t("span",{class:"jlbinding"},"PatternFolds.VectorFold")],-1)),s[12]||(s[12]=e()),l(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[13]||(s[13]=i('
julia
VectorFold{T,V <: AbstractVector{T}}

A mutable structure for folded vector that extends the methods of AbstractVector. Compared to IVectorFold, this tructure is about 20% faster using iterators. Note that this structure keep an active pointer to the current unfolded pattern. However, its external behavior is similar to IVectorFold.

source

',3))]),t("details",g,[t("summary",null,[s[14]||(s[14]=t("a",{id:"Base.iterate-Tuple{IVectorFold}",href:"#Base.iterate-Tuple{IVectorFold}"},[t("span",{class:"jlbinding"},"Base.iterate")],-1)),s[15]||(s[15]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[16]||(s[16]=i('
julia
iterate(iter)

Extends iterate methods from Base to allow forward and reverse iteration on both VectorFold and MVectorFold.

source

',3))]),t("details",b,[t("summary",null,[s[17]||(s[17]=t("a",{id:"Base.length-Tuple{Union{PatternFolds.AbstractVectorFold, IntervalsFold}}",href:"#Base.length-Tuple{Union{PatternFolds.AbstractVectorFold, IntervalsFold}}"},[t("span",{class:"jlbinding"},"Base.length")],-1)),s[18]||(s[18]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[19]||(s[19]=i('
julia
length(pf<:PatternFold)

Return the length of pf if unfolded.

source

',3))]),t("details",F,[t("summary",null,[s[20]||(s[20]=t("a",{id:"Base.rand-Tuple{PF} where PF<:Union{PatternFolds.AbstractVectorFold, IntervalsFold}",href:"#Base.rand-Tuple{PF} where PF<:Union{PatternFolds.AbstractVectorFold, IntervalsFold}"},[t("span",{class:"jlbinding"},"Base.rand")],-1)),s[21]||(s[21]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[22]||(s[22]=i('
julia
rand(pf<:PatternFold)

Returns a random value of pf as if it was unfolded.

source

',3))]),t("details",y,[t("summary",null,[s[23]||(s[23]=t("a",{id:"Base.rand-Tuple{Set{<:PatternFolds.AbstractVectorFold}}",href:"#Base.rand-Tuple{Set{<:PatternFolds.AbstractVectorFold}}"},[t("span",{class:"jlbinding"},"Base.rand")],-1)),s[24]||(s[24]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[25]||(s[25]=i('
julia
Base.rand(::Vector{AbstractVectorFold})\nExtend the `Base.rand` function to `Vector{AbstractVectorFold}`.

source

',2))]),t("details",m,[t("summary",null,[s[26]||(s[26]=t("a",{id:"Base.rand-Tuple{V} where V<:(Set{<:IntervalsFold})",href:"#Base.rand-Tuple{V} where V<:(Set{<:IntervalsFold})"},[t("span",{class:"jlbinding"},"Base.rand")],-1)),s[27]||(s[27]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[28]||(s[28]=i('
julia
Base.rand(::Vector{IntervalsFold})

Extend the Base.rand function to Vector{IntervalsFold}.

source

',3))]),t("details",f,[t("summary",null,[s[29]||(s[29]=t("a",{id:"PatternFolds.fold-Union{Tuple{V}, Tuple{T}, Tuple{V, Any}} where {T<:Real, V<:AbstractVector{T}}",href:"#PatternFolds.fold-Union{Tuple{V}, Tuple{T}, Tuple{V, Any}} where {T<:Real, V<:AbstractVector{T}}"},[t("span",{class:"jlbinding"},"PatternFolds.fold")],-1)),s[30]||(s[30]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[31]||(s[31]=i('
julia
fold(v::V, depth = 0)

returns a suitable VectorFold, which when unfolded gives the Vector V.

source

',3))]),t("details",E,[t("summary",null,[s[32]||(s[32]=t("a",{id:"PatternFolds.folds-Tuple{Any}",href:"#PatternFolds.folds-Tuple{Any}"},[t("span",{class:"jlbinding"},"PatternFolds.folds")],-1)),s[33]||(s[33]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[34]||(s[34]=i('
julia
folds(<:PatternFold)

Return the number of folds. An infinite folded pattern returns 0.

source

',3))]),t("details",j,[t("summary",null,[s[35]||(s[35]=t("a",{id:"PatternFolds.gap-Tuple{Any}",href:"#PatternFolds.gap-Tuple{Any}"},[t("span",{class:"jlbinding"},"PatternFolds.gap")],-1)),s[36]||(s[36]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[37]||(s[37]=i('
julia
gap(<:PatternFold)

Return the gap between the starts of consecutive folds.

source

',3))]),t("details",v,[t("summary",null,[s[38]||(s[38]=t("a",{id:"PatternFolds.make_vector_fold",href:"#PatternFolds.make_vector_fold"},[t("span",{class:"jlbinding"},"PatternFolds.make_vector_fold")],-1)),s[39]||(s[39]=e()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[40]||(s[40]=i('
julia
make_vector_fold(pattern, gap, fold, kind = :mutable)

A dispatcher to construct a folded vector. The kind of vector can be set to either :mutable (default) or :immutable. The default is faster in most cases but it depends on the pattern, gap, and fold parameters. For critical code, it is recommended to benchmark both options.

source

',3))]),t("details",C,[t("summary",null,[s[41]||(s[41]=t("a",{id:"PatternFolds.pattern-Tuple{Any, Any}",href:"#PatternFolds.pattern-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"PatternFolds.pattern")],-1)),s[42]||(s[42]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[43]||(s[43]=i('
julia
pattern(vf, index)

Return the element at index in the original pattern.

source

',3))]),t("details",P,[t("summary",null,[s[44]||(s[44]=t("a",{id:"PatternFolds.pattern-Tuple{Any}",href:"#PatternFolds.pattern-Tuple{Any}"},[t("span",{class:"jlbinding"},"PatternFolds.pattern")],-1)),s[45]||(s[45]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[46]||(s[46]=i('
julia
pattern(<:PatternFold)

Return the pattern of any PatternFold. The pattern defines the occurrences of the first fold.

source

',3))]),t("details",T,[t("summary",null,[s[47]||(s[47]=t("a",{id:"PatternFolds.pattern_length-Tuple{Any}",href:"#PatternFolds.pattern_length-Tuple{Any}"},[t("span",{class:"jlbinding"},"PatternFolds.pattern_length")],-1)),s[48]||(s[48]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[49]||(s[49]=i('
julia
pattern_length(pf<:PatternFold)

Return the length of the basic pattern of pf.

source

',3))]),t("details",A,[t("summary",null,[s[50]||(s[50]=t("a",{id:"PatternFolds.reset_pattern!-Tuple{Any}",href:"#PatternFolds.reset_pattern!-Tuple{Any}"},[t("span",{class:"jlbinding"},"PatternFolds.reset_pattern!")],-1)),s[51]||(s[51]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[52]||(s[52]=i('
julia
reset_pattern!(<:PatternFold)

Reset the unfolded pattern to the first fold.

source

',3))]),t("details",B,[t("summary",null,[s[53]||(s[53]=t("a",{id:"PatternFolds.set_fold!",href:"#PatternFolds.set_fold!"},[t("span",{class:"jlbinding"},"PatternFolds.set_fold!")],-1)),s[54]||(s[54]=e()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[55]||(s[55]=i('
julia
set_fold!(mvf::VectorFold, new_fold = mvf.current + 1)

Set the unfolded pattern to new_fold. By default move the next fold after current.

source

',3))]),t("details",V,[t("summary",null,[s[56]||(s[56]=t("a",{id:"PatternFolds.unfold-Tuple{IVectorFold}",href:"#PatternFolds.unfold-Tuple{IVectorFold}"},[t("span",{class:"jlbinding"},"PatternFolds.unfold")],-1)),s[57]||(s[57]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[58]||(s[58]=i('
julia
unfold(vf::VectorFold; from=1, to=folds(vf))

Construct the unfolded version of vf (with the same type as pattern(vf)) based. Please note that using an iterator on vf avoid memory allocation, which is not the case of unfold.

source

',3))])])}const R=n(p,[["render",x]]);export{I as __pageData,R as default}; diff --git a/dev/assets/constraints_61_pattern_folds.md.xjkZia50.lean.js b/dev/assets/constraints_61_pattern_folds.md.xjkZia50.lean.js new file mode 100644 index 0000000..030f84d --- /dev/null +++ b/dev/assets/constraints_61_pattern_folds.md.xjkZia50.lean.js @@ -0,0 +1 @@ +import{_ as n,c as o,j as t,a as e,G as l,a5 as i,B as r,o as d}from"./chunks/framework.CJakPlgM.js";const I=JSON.parse('{"title":"PatternFolds.jl","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/61_pattern_folds.md","filePath":"constraints/61_pattern_folds.md","lastUpdated":null}'),p={name:"constraints/61_pattern_folds.md"},h={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},P={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},V={class:"jldocstring custom-block",open:""};function x(L,s,M,D,J,O){const a=r("Badge");return d(),o("div",null,[s[59]||(s[59]=t("h1",{id:"patternfolds-jl",tabindex:"-1"},[e("PatternFolds.jl "),t("a",{class:"header-anchor",href:"#patternfolds-jl","aria-label":'Permalink to "PatternFolds.jl"'},"​")],-1)),s[60]||(s[60]=t("p",null,[e("Documentation for "),t("code",null,"PatternFolds.jl"),e(".")],-1)),t("details",h,[t("summary",null,[s[0]||(s[0]=t("a",{id:"PatternFolds.PatternFold",href:"#PatternFolds.PatternFold"},[t("span",{class:"jlbinding"},"PatternFolds.PatternFold")],-1)),s[1]||(s[1]=e()),l(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=i('
julia
PatternFold{T, P}

A Union type used as an interface for folded patterns such as VectorFold. To implement the interface and inherit from it, a new structure MyFold{T[,P]} must define three fields:

  • pattern::P. Note that both length(::P) and rand(::P) methods must be available

  • gap::TS

  • folds::int

',3)),s[3]||(s[3]=t("p",{T:""},"Finally one can redefine PatternFold",-1)),s[4]||(s[4]=i('
julia
PatternFold{T} = Union{AbstractVectorFold{T}, IntervalsFold{T}, MyFold{T[,P]}}

source

',2))]),t("details",k,[t("summary",null,[s[5]||(s[5]=t("a",{id:"PatternFolds.AbstractVectorFold",href:"#PatternFolds.AbstractVectorFold"},[t("span",{class:"jlbinding"},"PatternFolds.AbstractVectorFold")],-1)),s[6]||(s[6]=e()),l(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[7]||(s[7]=i('
julia
AbstractVectorFold{T, P}

An abstract type used as an interface for folded vectors such as VectorFold. To implement the interface and inherit from it, a new structure must define three fields:

  • pattern::P. Note that both length(::P) and rand(::P) methods must be available

  • gap::T

  • folds::int

source

',4))]),t("details",c,[t("summary",null,[s[8]||(s[8]=t("a",{id:"PatternFolds.IVectorFold",href:"#PatternFolds.IVectorFold"},[t("span",{class:"jlbinding"},"PatternFolds.IVectorFold")],-1)),s[9]||(s[9]=e()),l(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[10]||(s[10]=i('
julia
VectorFold{T,V <: AbstractVector{T}}

A folded vector structure that extends the methods of AbstractVector to a folded structure.

source

',3))]),t("details",u,[t("summary",null,[s[11]||(s[11]=t("a",{id:"PatternFolds.VectorFold",href:"#PatternFolds.VectorFold"},[t("span",{class:"jlbinding"},"PatternFolds.VectorFold")],-1)),s[12]||(s[12]=e()),l(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[13]||(s[13]=i('
julia
VectorFold{T,V <: AbstractVector{T}}

A mutable structure for folded vector that extends the methods of AbstractVector. Compared to IVectorFold, this tructure is about 20% faster using iterators. Note that this structure keep an active pointer to the current unfolded pattern. However, its external behavior is similar to IVectorFold.

source

',3))]),t("details",g,[t("summary",null,[s[14]||(s[14]=t("a",{id:"Base.iterate-Tuple{IVectorFold}",href:"#Base.iterate-Tuple{IVectorFold}"},[t("span",{class:"jlbinding"},"Base.iterate")],-1)),s[15]||(s[15]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[16]||(s[16]=i('
julia
iterate(iter)

Extends iterate methods from Base to allow forward and reverse iteration on both VectorFold and MVectorFold.

source

',3))]),t("details",b,[t("summary",null,[s[17]||(s[17]=t("a",{id:"Base.length-Tuple{Union{PatternFolds.AbstractVectorFold, IntervalsFold}}",href:"#Base.length-Tuple{Union{PatternFolds.AbstractVectorFold, IntervalsFold}}"},[t("span",{class:"jlbinding"},"Base.length")],-1)),s[18]||(s[18]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[19]||(s[19]=i('
julia
length(pf<:PatternFold)

Return the length of pf if unfolded.

source

',3))]),t("details",F,[t("summary",null,[s[20]||(s[20]=t("a",{id:"Base.rand-Tuple{PF} where PF<:Union{PatternFolds.AbstractVectorFold, IntervalsFold}",href:"#Base.rand-Tuple{PF} where PF<:Union{PatternFolds.AbstractVectorFold, IntervalsFold}"},[t("span",{class:"jlbinding"},"Base.rand")],-1)),s[21]||(s[21]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[22]||(s[22]=i('
julia
rand(pf<:PatternFold)

Returns a random value of pf as if it was unfolded.

source

',3))]),t("details",y,[t("summary",null,[s[23]||(s[23]=t("a",{id:"Base.rand-Tuple{Set{<:PatternFolds.AbstractVectorFold}}",href:"#Base.rand-Tuple{Set{<:PatternFolds.AbstractVectorFold}}"},[t("span",{class:"jlbinding"},"Base.rand")],-1)),s[24]||(s[24]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[25]||(s[25]=i('
julia
Base.rand(::Vector{AbstractVectorFold})\nExtend the `Base.rand` function to `Vector{AbstractVectorFold}`.

source

',2))]),t("details",m,[t("summary",null,[s[26]||(s[26]=t("a",{id:"Base.rand-Tuple{V} where V<:(Set{<:IntervalsFold})",href:"#Base.rand-Tuple{V} where V<:(Set{<:IntervalsFold})"},[t("span",{class:"jlbinding"},"Base.rand")],-1)),s[27]||(s[27]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[28]||(s[28]=i('
julia
Base.rand(::Vector{IntervalsFold})

Extend the Base.rand function to Vector{IntervalsFold}.

source

',3))]),t("details",f,[t("summary",null,[s[29]||(s[29]=t("a",{id:"PatternFolds.fold-Union{Tuple{V}, Tuple{T}, Tuple{V, Any}} where {T<:Real, V<:AbstractVector{T}}",href:"#PatternFolds.fold-Union{Tuple{V}, Tuple{T}, Tuple{V, Any}} where {T<:Real, V<:AbstractVector{T}}"},[t("span",{class:"jlbinding"},"PatternFolds.fold")],-1)),s[30]||(s[30]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[31]||(s[31]=i('
julia
fold(v::V, depth = 0)

returns a suitable VectorFold, which when unfolded gives the Vector V.

source

',3))]),t("details",E,[t("summary",null,[s[32]||(s[32]=t("a",{id:"PatternFolds.folds-Tuple{Any}",href:"#PatternFolds.folds-Tuple{Any}"},[t("span",{class:"jlbinding"},"PatternFolds.folds")],-1)),s[33]||(s[33]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[34]||(s[34]=i('
julia
folds(<:PatternFold)

Return the number of folds. An infinite folded pattern returns 0.

source

',3))]),t("details",j,[t("summary",null,[s[35]||(s[35]=t("a",{id:"PatternFolds.gap-Tuple{Any}",href:"#PatternFolds.gap-Tuple{Any}"},[t("span",{class:"jlbinding"},"PatternFolds.gap")],-1)),s[36]||(s[36]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[37]||(s[37]=i('
julia
gap(<:PatternFold)

Return the gap between the starts of consecutive folds.

source

',3))]),t("details",v,[t("summary",null,[s[38]||(s[38]=t("a",{id:"PatternFolds.make_vector_fold",href:"#PatternFolds.make_vector_fold"},[t("span",{class:"jlbinding"},"PatternFolds.make_vector_fold")],-1)),s[39]||(s[39]=e()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[40]||(s[40]=i('
julia
make_vector_fold(pattern, gap, fold, kind = :mutable)

A dispatcher to construct a folded vector. The kind of vector can be set to either :mutable (default) or :immutable. The default is faster in most cases but it depends on the pattern, gap, and fold parameters. For critical code, it is recommended to benchmark both options.

source

',3))]),t("details",C,[t("summary",null,[s[41]||(s[41]=t("a",{id:"PatternFolds.pattern-Tuple{Any, Any}",href:"#PatternFolds.pattern-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"PatternFolds.pattern")],-1)),s[42]||(s[42]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[43]||(s[43]=i('
julia
pattern(vf, index)

Return the element at index in the original pattern.

source

',3))]),t("details",P,[t("summary",null,[s[44]||(s[44]=t("a",{id:"PatternFolds.pattern-Tuple{Any}",href:"#PatternFolds.pattern-Tuple{Any}"},[t("span",{class:"jlbinding"},"PatternFolds.pattern")],-1)),s[45]||(s[45]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[46]||(s[46]=i('
julia
pattern(<:PatternFold)

Return the pattern of any PatternFold. The pattern defines the occurrences of the first fold.

source

',3))]),t("details",T,[t("summary",null,[s[47]||(s[47]=t("a",{id:"PatternFolds.pattern_length-Tuple{Any}",href:"#PatternFolds.pattern_length-Tuple{Any}"},[t("span",{class:"jlbinding"},"PatternFolds.pattern_length")],-1)),s[48]||(s[48]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[49]||(s[49]=i('
julia
pattern_length(pf<:PatternFold)

Return the length of the basic pattern of pf.

source

',3))]),t("details",A,[t("summary",null,[s[50]||(s[50]=t("a",{id:"PatternFolds.reset_pattern!-Tuple{Any}",href:"#PatternFolds.reset_pattern!-Tuple{Any}"},[t("span",{class:"jlbinding"},"PatternFolds.reset_pattern!")],-1)),s[51]||(s[51]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[52]||(s[52]=i('
julia
reset_pattern!(<:PatternFold)

Reset the unfolded pattern to the first fold.

source

',3))]),t("details",B,[t("summary",null,[s[53]||(s[53]=t("a",{id:"PatternFolds.set_fold!",href:"#PatternFolds.set_fold!"},[t("span",{class:"jlbinding"},"PatternFolds.set_fold!")],-1)),s[54]||(s[54]=e()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[55]||(s[55]=i('
julia
set_fold!(mvf::VectorFold, new_fold = mvf.current + 1)

Set the unfolded pattern to new_fold. By default move the next fold after current.

source

',3))]),t("details",V,[t("summary",null,[s[56]||(s[56]=t("a",{id:"PatternFolds.unfold-Tuple{IVectorFold}",href:"#PatternFolds.unfold-Tuple{IVectorFold}"},[t("span",{class:"jlbinding"},"PatternFolds.unfold")],-1)),s[57]||(s[57]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[58]||(s[58]=i('
julia
unfold(vf::VectorFold; from=1, to=folds(vf))

Construct the unfolded version of vf (with the same type as pattern(vf)) based. Please note that using an iterator on vf avoid memory allocation, which is not the case of unfold.

source

',3))])])}const R=n(p,[["render",x]]);export{I as __pageData,R as default}; diff --git a/dev/assets/constraints_61_constraint_domains.md.oi_ydeg8.js b/dev/assets/constraints_62_constraint_domains.md.DMsVVEqc.js similarity index 65% rename from dev/assets/constraints_61_constraint_domains.md.oi_ydeg8.js rename to dev/assets/constraints_62_constraint_domains.md.DMsVVEqc.js index 60e5c49..77cbe62 100644 --- a/dev/assets/constraints_61_constraint_domains.md.oi_ydeg8.js +++ b/dev/assets/constraints_62_constraint_domains.md.DMsVVEqc.js @@ -1,40 +1,35 @@ -import{_ as l,c as p,j as i,a,G as e,a5 as t,B as h,o}from"./chunks/framework.CJakPlgM.js";const Fs=JSON.parse('{"title":"ConstraintDomains.jl: Defining Variables and Exploring Domains","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/61_constraint_domains.md","filePath":"constraints/61_constraint_domains.md","lastUpdated":null}'),r={name:"constraints/61_constraint_domains.md"},k={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},L={class:"jldocstring custom-block",open:""},_={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},J={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""},I={class:"jldocstring custom-block",open:""},P={class:"jldocstring custom-block",open:""},O={class:"jldocstring custom-block",open:""},R={class:"jldocstring custom-block",open:""},S={class:"jldocstring custom-block",open:""},V={class:"jldocstring custom-block",open:""},z={class:"jldocstring custom-block",open:""},q={class:"jldocstring custom-block",open:""},N={class:"jldocstring custom-block",open:""},M={class:"jldocstring custom-block",open:""},U={class:"jldocstring custom-block",open:""},G={class:"jldocstring custom-block",open:""},$={class:"jldocstring custom-block",open:""},H={class:"jldocstring custom-block",open:""},K={class:"jldocstring custom-block",open:""},Q={class:"jldocstring custom-block",open:""},W={class:"jldocstring custom-block",open:""},X={class:"jldocstring custom-block",open:""},Y={class:"jldocstring custom-block",open:""},Z={class:"jldocstring custom-block",open:""},ss={class:"jldocstring custom-block",open:""},is={class:"jldocstring custom-block",open:""},as={class:"jldocstring custom-block",open:""},ts={class:"jldocstring custom-block",open:""},ns={class:"jldocstring custom-block",open:""},es={class:"jldocstring custom-block",open:""},ls={class:"jldocstring custom-block",open:""},ps={class:"jldocstring custom-block",open:""},hs={class:"jldocstring custom-block",open:""},os={class:"jldocstring custom-block",open:""},rs={class:"jldocstring custom-block",open:""},ks={class:"jldocstring custom-block",open:""},ds={class:"jldocstring custom-block",open:""},cs={class:"jldocstring custom-block",open:""};function gs(Es,s,us,ys,ms,bs){const n=h("Badge");return o(),p("div",null,[s[171]||(s[171]=i("h1",{id:"ConstraintDomains.jl:-Defining-Variables-and-Exploring-Domains",tabindex:"-1"},[a("ConstraintDomains.jl: Defining Variables and Exploring Domains "),i("a",{class:"header-anchor",href:"#ConstraintDomains.jl:-Defining-Variables-and-Exploring-Domains","aria-label":'Permalink to "ConstraintDomains.jl: Defining Variables and Exploring Domains {#ConstraintDomains.jl:-Defining-Variables-and-Exploring-Domains}"'},"​")],-1)),s[172]||(s[172]=i("p",null,[i("em",null,"ConstraintDomains.jl"),a(" is the standard way to define variables and explore domains in the "),i("em",null,"Julia Constraints"),a(" ecosystem. This package can be used to specify both discrete and continuous domains. Explorations features are primarily related to learning about constraints, aka constraint learning.")],-1)),s[173]||(s[173]=i("p",null,"Most users should use it through JuMP/MOI interfaces.",-1)),s[174]||(s[174]=i("h2",{id:"commons",tabindex:"-1"},[a("Commons "),i("a",{class:"header-anchor",href:"#commons","aria-label":'Permalink to "Commons"'},"​")],-1)),i("details",k,[i("summary",null,[s[0]||(s[0]=i("a",{id:"ConstraintDomains.AbstractDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.AbstractDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.AbstractDomain")],-1)),s[1]||(s[1]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=t('
julia
AbstractDomain

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

  • Base.∈(val, ::D)

  • Base.rand(::D)

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

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

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source

',7))]),i("details",d,[i("summary",null,[s[3]||(s[3]=i("a",{id:"ConstraintDomains.EmptyDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.EmptyDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.EmptyDomain")],-1)),s[4]||(s[4]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[5]||(s[5]=t('
julia
EmptyDomain

A struct to handle yet to be defined domains.

source

',3))]),i("details",c,[i("summary",null,[s[6]||(s[6]=i("a",{id:"ConstraintDomains.domain-constraints-61_constraint_domains",href:"#ConstraintDomains.domain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[7]||(s[7]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[8]||(s[8]=t(`
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+import{_ as l,c as p,j as i,a,G as e,a5 as t,B as h,o}from"./chunks/framework.CJakPlgM.js";const Fs=JSON.parse('{"title":"ConstraintDomains.jl: Defining Variables and Exploring Domains","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/62_constraint_domains.md","filePath":"constraints/62_constraint_domains.md","lastUpdated":null}'),r={name:"constraints/62_constraint_domains.md"},k={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},L={class:"jldocstring custom-block",open:""},_={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},J={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""},P={class:"jldocstring custom-block",open:""},I={class:"jldocstring custom-block",open:""},V={class:"jldocstring custom-block",open:""},R={class:"jldocstring custom-block",open:""},O={class:"jldocstring custom-block",open:""},S={class:"jldocstring custom-block",open:""},z={class:"jldocstring custom-block",open:""},q={class:"jldocstring custom-block",open:""},N={class:"jldocstring custom-block",open:""},M={class:"jldocstring custom-block",open:""},U={class:"jldocstring custom-block",open:""},G={class:"jldocstring custom-block",open:""},$={class:"jldocstring custom-block",open:""},H={class:"jldocstring custom-block",open:""},K={class:"jldocstring custom-block",open:""},Q={class:"jldocstring custom-block",open:""},W={class:"jldocstring custom-block",open:""},X={class:"jldocstring custom-block",open:""},Y={class:"jldocstring custom-block",open:""},Z={class:"jldocstring custom-block",open:""},ss={class:"jldocstring custom-block",open:""},is={class:"jldocstring custom-block",open:""},as={class:"jldocstring custom-block",open:""},ts={class:"jldocstring custom-block",open:""},ns={class:"jldocstring custom-block",open:""},es={class:"jldocstring custom-block",open:""},ls={class:"jldocstring custom-block",open:""},ps={class:"jldocstring custom-block",open:""},hs={class:"jldocstring custom-block",open:""},os={class:"jldocstring custom-block",open:""},rs={class:"jldocstring custom-block",open:""},ks={class:"jldocstring custom-block",open:""},ds={class:"jldocstring custom-block",open:""},cs={class:"jldocstring custom-block",open:""};function gs(Es,s,us,ys,ms,bs){const n=h("Badge");return o(),p("div",null,[s[171]||(s[171]=i("h1",{id:"ConstraintDomains.jl:-Defining-Variables-and-Exploring-Domains",tabindex:"-1"},[a("ConstraintDomains.jl: Defining Variables and Exploring Domains "),i("a",{class:"header-anchor",href:"#ConstraintDomains.jl:-Defining-Variables-and-Exploring-Domains","aria-label":'Permalink to "ConstraintDomains.jl: Defining Variables and Exploring Domains {#ConstraintDomains.jl:-Defining-Variables-and-Exploring-Domains}"'},"​")],-1)),s[172]||(s[172]=i("p",null,[i("em",null,"ConstraintDomains.jl"),a(" is the standard way to define variables and explore domains in the "),i("em",null,"Julia Constraints"),a(" ecosystem. This package can be used to specify both discrete and continuous domains. Explorations features are primarily related to learning about constraints, aka constraint learning.")],-1)),s[173]||(s[173]=i("p",null,"Most users should use it through JuMP/MOI interfaces.",-1)),s[174]||(s[174]=i("h2",{id:"commons",tabindex:"-1"},[a("Commons "),i("a",{class:"header-anchor",href:"#commons","aria-label":'Permalink to "Commons"'},"​")],-1)),i("details",k,[i("summary",null,[s[0]||(s[0]=i("a",{id:"ConstraintDomains.AbstractDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.AbstractDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.AbstractDomain")],-1)),s[1]||(s[1]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=t('
julia
AbstractDomain

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

  • Base.∈(val, ::D)

  • Base.rand(::D)

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

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

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source

',7))]),i("details",d,[i("summary",null,[s[3]||(s[3]=i("a",{id:"ConstraintDomains.EmptyDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.EmptyDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.EmptyDomain")],-1)),s[4]||(s[4]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[5]||(s[5]=t('
julia
EmptyDomain

A struct to handle yet to be defined domains.

source

',3))]),i("details",c,[i("summary",null,[s[6]||(s[6]=i("a",{id:"ConstraintDomains.domain-constraints-62_constraint_domains",href:"#ConstraintDomains.domain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[7]||(s[7]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[8]||(s[8]=t(`
julia
domain()

Construct an EmptyDomain.

source

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

Construct a domain of continuous interval(s).

source

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

Construct either a SetDomain or a RangeDomain.

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

source

`,10))]),i("details",g,[i("summary",null,[s[9]||(s[9]=i("a",{id:"ConstraintDomains.domain_size-constraints-61_constraint_domains",href:"#ConstraintDomains.domain_size-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[10]||(s[10]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[11]||(s[11]=t('
julia
domain_size(d <: AbstractDomain)

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

source

julia
domain_size(itv::Intervals)

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

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',9))]),i("details",E,[i("summary",null,[s[12]||(s[12]=i("a",{id:"ConstraintDomains.get_domain-constraints-61_constraint_domains",href:"#ConstraintDomains.get_domain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.get_domain")],-1)),s[13]||(s[13]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[14]||(s[14]=t('
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

',3))]),i("details",u,[i("summary",null,[s[15]||(s[15]=i("a",{id:"ConstraintDomains.to_domains-constraints-61_constraint_domains",href:"#ConstraintDomains.to_domains-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.to_domains")],-1)),s[16]||(s[16]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=t('
julia
to_domains(args...)

Convert various arguments into valid domains format.

source

',3))]),s[175]||(s[175]=i("h3",{id:"Extension-to-Base-module",tabindex:"-1"},[a("Extension to Base module "),i("a",{class:"header-anchor",href:"#Extension-to-Base-module","aria-label":'Permalink to "Extension to Base module {#Extension-to-Base-module}"'},"​")],-1)),i("details",y,[i("summary",null,[s[18]||(s[18]=i("a",{id:"Base.in-constraints-61_constraint_domains",href:"#Base.in-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[19]||(s[19]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[20]||(s[20]=t('
julia
x::Variable constraint\nvalue  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

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

Fallback method for value ∈ d that returns false.

source

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

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

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

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

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

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

source

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

Return true if value is a point of d.

source

',15))]),i("details",m,[i("summary",null,[s[21]||(s[21]=i("a",{id:"Base.rand-constraints-61_constraint_domains",href:"#Base.rand-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[22]||(s[22]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[23]||(s[23]=t(`
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

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

source

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

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

source

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

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

`,12))]),i("details",b,[i("summary",null,[s[24]||(s[24]=i("a",{id:"Base.isempty-constraints-61_constraint_domains",href:"#Base.isempty-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.isempty")],-1)),s[25]||(s[25]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=t('
julia
Base.isempty(d <: AbstractDomain)

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

source

',3))]),i("details",C,[i("summary",null,[s[27]||(s[27]=i("a",{id:"Base.rand-constraints-61_constraint_domains-2",href:"#Base.rand-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[28]||(s[28]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[29]||(s[29]=t(`
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

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

source

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

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

source

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

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

`,12))]),i("details",F,[i("summary",null,[s[30]||(s[30]=i("a",{id:"Base.string-constraints-61_constraint_domains",href:"#Base.string-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.string")],-1)),s[31]||(s[31]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[32]||(s[32]=t(`
julia
Base.string(D::Vector{<:AbstractDomain})
-Base.string(d<:AbstractDomain)

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

source

`,3))]),s[176]||(s[176]=t('

Performances

Bench Evolution CommonChair Evolution Common

Continuous

',3)),i("details",v,[i("summary",null,[s[33]||(s[33]=i("a",{id:"ConstraintDomains.ContinuousDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.ContinuousDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ContinuousDomain")],-1)),s[34]||(s[34]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[35]||(s[35]=t('
julia
ContinuousDomain{T <: Real} <: AbstractDomain

An abstract supertype for all continuous domains.

source

',3))]),i("details",D,[i("summary",null,[s[36]||(s[36]=i("a",{id:"ConstraintDomains.Intervals-constraints-61_constraint_domains",href:"#ConstraintDomains.Intervals-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.Intervals")],-1)),s[37]||(s[37]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[38]||(s[38]=t('
julia
Intervals{T <: Real} <: ContinuousDomain{T}

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

source

',3))]),i("details",j,[i("summary",null,[s[39]||(s[39]=i("a",{id:"ConstraintDomains.domain-constraints-61_constraint_domains-2",href:"#ConstraintDomains.domain-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[40]||(s[40]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[41]||(s[41]=t(`
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+d5 = domain(1,42,86.9)

source

`,10))]),i("details",g,[i("summary",null,[s[9]||(s[9]=i("a",{id:"ConstraintDomains.domain_size-constraints-62_constraint_domains",href:"#ConstraintDomains.domain_size-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[10]||(s[10]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[11]||(s[11]=t('
julia
domain_size(d <: AbstractDomain)

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

source

julia
domain_size(itv::Intervals)

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

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',9))]),i("details",E,[i("summary",null,[s[12]||(s[12]=i("a",{id:"ConstraintDomains.get_domain-constraints-62_constraint_domains",href:"#ConstraintDomains.get_domain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.get_domain")],-1)),s[13]||(s[13]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[14]||(s[14]=t('
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

',3))]),i("details",u,[i("summary",null,[s[15]||(s[15]=i("a",{id:"ConstraintDomains.to_domains-constraints-62_constraint_domains",href:"#ConstraintDomains.to_domains-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.to_domains")],-1)),s[16]||(s[16]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=t('
julia
to_domains(args...)

Convert various arguments into valid domains format.

source

',3))]),s[175]||(s[175]=i("h3",{id:"Extension-to-Base-module",tabindex:"-1"},[a("Extension to Base module "),i("a",{class:"header-anchor",href:"#Extension-to-Base-module","aria-label":'Permalink to "Extension to Base module {#Extension-to-Base-module}"'},"​")],-1)),i("details",y,[i("summary",null,[s[18]||(s[18]=i("a",{id:"Base.in-constraints-62_constraint_domains",href:"#Base.in-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[19]||(s[19]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[20]||(s[20]=t('
julia
x::Variable constraint\nvalue  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

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

Fallback method for value ∈ d that returns false.

source

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

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

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

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

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

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

source

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

Return true if value is a point of d.

source

',15))]),i("details",m,[i("summary",null,[s[21]||(s[21]=i("a",{id:"Base.rand-constraints-62_constraint_domains",href:"#Base.rand-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[22]||(s[22]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[23]||(s[23]=t('
julia
Base.rand(::Vector{IntervalsFold})

Extend the Base.rand function to Vector{IntervalsFold}.

source

julia
rand(pf<:PatternFold)

Returns a random value of pf as if it was unfolded.

source

julia
Base.rand(::Vector{AbstractVectorFold})\nExtend the `Base.rand` function to `Vector{AbstractVectorFold}`.

source

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)\nBase.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

',20))]),i("details",b,[i("summary",null,[s[24]||(s[24]=i("a",{id:"Base.isempty-constraints-62_constraint_domains",href:"#Base.isempty-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"Base.isempty")],-1)),s[25]||(s[25]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=t('
julia
Base.isempty(d <: AbstractDomain)

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

source

',3))]),i("details",C,[i("summary",null,[s[27]||(s[27]=i("a",{id:"Base.rand-constraints-62_constraint_domains-2",href:"#Base.rand-constraints-62_constraint_domains-2"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[28]||(s[28]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[29]||(s[29]=t('
julia
Base.rand(::Vector{IntervalsFold})

Extend the Base.rand function to Vector{IntervalsFold}.

source

julia
rand(pf<:PatternFold)

Returns a random value of pf as if it was unfolded.

source

julia
Base.rand(::Vector{AbstractVectorFold})\nExtend the `Base.rand` function to `Vector{AbstractVectorFold}`.

source

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)\nBase.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

',20))]),i("details",F,[i("summary",null,[s[30]||(s[30]=i("a",{id:"Base.string-constraints-62_constraint_domains",href:"#Base.string-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"Base.string")],-1)),s[31]||(s[31]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[32]||(s[32]=t(`
julia
Base.string(D::Vector{<:AbstractDomain})
+Base.string(d<:AbstractDomain)

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

source

`,3))]),s[176]||(s[176]=t('

Performances

Bench Evolution CommonChair Evolution Common

Continuous

',3)),i("details",v,[i("summary",null,[s[33]||(s[33]=i("a",{id:"ConstraintDomains.ContinuousDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.ContinuousDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ContinuousDomain")],-1)),s[34]||(s[34]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[35]||(s[35]=t('
julia
ContinuousDomain{T <: Real} <: AbstractDomain

An abstract supertype for all continuous domains.

source

',3))]),i("details",j,[i("summary",null,[s[36]||(s[36]=i("a",{id:"ConstraintDomains.Intervals-constraints-62_constraint_domains",href:"#ConstraintDomains.Intervals-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.Intervals")],-1)),s[37]||(s[37]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[38]||(s[38]=t('
julia
Intervals{T <: Real} <: ContinuousDomain{T}

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

source

',3))]),i("details",D,[i("summary",null,[s[39]||(s[39]=i("a",{id:"ConstraintDomains.domain-constraints-62_constraint_domains-2",href:"#ConstraintDomains.domain-constraints-62_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[40]||(s[40]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[41]||(s[41]=t(`
julia
domain()

Construct an EmptyDomain.

source

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

Construct a domain of continuous interval(s).

source

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

Construct either a SetDomain or a RangeDomain.

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

source

`,10))]),i("details",f,[i("summary",null,[s[42]||(s[42]=i("a",{id:"ConstraintDomains.domain_size-constraints-61_constraint_domains-2",href:"#ConstraintDomains.domain_size-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[43]||(s[43]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[44]||(s[44]=t('
julia
domain_size(d <: AbstractDomain)

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

source

julia
domain_size(itv::Intervals)

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

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',9))]),i("details",B,[i("summary",null,[s[45]||(s[45]=i("a",{id:"ConstraintDomains.merge_domains-constraints-61_constraint_domains",href:"#ConstraintDomains.merge_domains-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.merge_domains")],-1)),s[46]||(s[46]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[47]||(s[47]=t('
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

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

source

',3))]),i("details",A,[i("summary",null,[s[48]||(s[48]=i("a",{id:"ConstraintDomains.intersect_domains-constraints-61_constraint_domains",href:"#ConstraintDomains.intersect_domains-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains")],-1)),s[49]||(s[49]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[50]||(s[50]=t('
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

',3))]),i("details",x,[i("summary",null,[s[51]||(s[51]=i("a",{id:"ConstraintDomains.intersect_domains!-constraints-61_constraint_domains",href:"#ConstraintDomains.intersect_domains!-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains!")],-1)),s[52]||(s[52]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[53]||(s[53]=t('
julia
intersect_domains!(is, i, new_itvls)

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

Arguments

  • is::IS: a collection of intervals.

  • i::I: an interval.

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

source

',5))]),i("details",L,[i("summary",null,[s[54]||(s[54]=i("a",{id:"ConstraintDomains.size-constraints-61_constraint_domains",href:"#ConstraintDomains.size-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.size")],-1)),s[55]||(s[55]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[56]||(s[56]=t('
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source

',3))]),s[177]||(s[177]=i("h3",{id:"Extension-to-Base-module-2",tabindex:"-1"},[a("Extension to Base module "),i("a",{class:"header-anchor",href:"#Extension-to-Base-module-2","aria-label":'Permalink to "Extension to Base module {#Extension-to-Base-module-2}"'},"​")],-1)),i("details",_,[i("summary",null,[s[57]||(s[57]=i("a",{id:"Base.length-constraints-61_constraint_domains",href:"#Base.length-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.length")],-1)),s[58]||(s[58]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[59]||(s[59]=t('
julia
length(layer)

Return the number of operations in a layer.

source

julia
Base.length(icn)

Return the total number of operations of an ICN.

source

julia
Base.rand(d <: AbstractDomain)

Fallback method for length(d) that return 0.

source

julia
Base.length(itv::Intervals)

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

source

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

Return the number of points in d.

source

',15))]),i("details",T,[i("summary",null,[s[60]||(s[60]=i("a",{id:"Base.rand-constraints-61_constraint_domains-3",href:"#Base.rand-constraints-61_constraint_domains-3"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[61]||(s[61]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[62]||(s[62]=t(`
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

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

source

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

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

source

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

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

`,12))]),i("details",J,[i("summary",null,[s[63]||(s[63]=i("a",{id:"Base.in-constraints-61_constraint_domains-2",href:"#Base.in-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[64]||(s[64]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[65]||(s[65]=t('
julia
x::Variable constraint\nvalue  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

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

Fallback method for value ∈ d that returns false.

source

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

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

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

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

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

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

source

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

Return true if value is a point of d.

source

',15))]),i("details",w,[i("summary",null,[s[66]||(s[66]=i("a",{id:"Base.string-constraints-61_constraint_domains-2",href:"#Base.string-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"Base.string")],-1)),s[67]||(s[67]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[68]||(s[68]=t(`
julia
Base.string(D::Vector{<:AbstractDomain})
-Base.string(d<:AbstractDomain)

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

source

`,3))]),s[178]||(s[178]=t('

Performances

Bench Evolution ContinuousChair Evolution Continuous

Discrete

',3)),i("details",I,[i("summary",null,[s[69]||(s[69]=i("a",{id:"ConstraintDomains.DiscreteDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.DiscreteDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.DiscreteDomain")],-1)),s[70]||(s[70]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[71]||(s[71]=t('
julia
DiscreteDomain{T <: Number} <: AbstractDomain

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

source

',3))]),i("details",P,[i("summary",null,[s[72]||(s[72]=i("a",{id:"ConstraintDomains.SetDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.SetDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.SetDomain")],-1)),s[73]||(s[73]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[74]||(s[74]=t('
julia
SetDomain{T <: Number} <: DiscreteDomain{T}

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

source

',3))]),i("details",O,[i("summary",null,[s[75]||(s[75]=i("a",{id:"ConstraintDomains.RangeDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.RangeDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.RangeDomain")],-1)),s[76]||(s[76]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[77]||(s[77]=t('
julia
RangeDomain

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

source

',3))]),i("details",R,[i("summary",null,[s[78]||(s[78]=i("a",{id:"ConstraintDomains.ArbitraryDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.ArbitraryDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ArbitraryDomain")],-1)),s[79]||(s[79]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[80]||(s[80]=t('
julia
ArbitraryDomain{T} <: DiscreteDomain{T}

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

source

',3))]),i("details",S,[i("summary",null,[s[81]||(s[81]=i("a",{id:"ConstraintDomains.domain-constraints-61_constraint_domains-3",href:"#ConstraintDomains.domain-constraints-61_constraint_domains-3"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[82]||(s[82]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[83]||(s[83]=t(`
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+d5 = domain(1,42,86.9)

source

`,10))]),i("details",f,[i("summary",null,[s[42]||(s[42]=i("a",{id:"ConstraintDomains.domain_size-constraints-62_constraint_domains-2",href:"#ConstraintDomains.domain_size-constraints-62_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[43]||(s[43]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[44]||(s[44]=t('
julia
domain_size(d <: AbstractDomain)

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

source

julia
domain_size(itv::Intervals)

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

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',9))]),i("details",B,[i("summary",null,[s[45]||(s[45]=i("a",{id:"ConstraintDomains.merge_domains-constraints-62_constraint_domains",href:"#ConstraintDomains.merge_domains-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.merge_domains")],-1)),s[46]||(s[46]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[47]||(s[47]=t('
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

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

source

',3))]),i("details",A,[i("summary",null,[s[48]||(s[48]=i("a",{id:"ConstraintDomains.intersect_domains-constraints-62_constraint_domains",href:"#ConstraintDomains.intersect_domains-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains")],-1)),s[49]||(s[49]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[50]||(s[50]=t('
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

',3))]),i("details",x,[i("summary",null,[s[51]||(s[51]=i("a",{id:"ConstraintDomains.intersect_domains!-constraints-62_constraint_domains",href:"#ConstraintDomains.intersect_domains!-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains!")],-1)),s[52]||(s[52]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[53]||(s[53]=t('
julia
intersect_domains!(is, i, new_itvls)

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

Arguments

  • is::IS: a collection of intervals.

  • i::I: an interval.

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

source

',5))]),i("details",L,[i("summary",null,[s[54]||(s[54]=i("a",{id:"ConstraintDomains.size-constraints-62_constraint_domains",href:"#ConstraintDomains.size-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.size")],-1)),s[55]||(s[55]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[56]||(s[56]=t('
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source

',3))]),s[177]||(s[177]=i("h3",{id:"Extension-to-Base-module-2",tabindex:"-1"},[a("Extension to Base module "),i("a",{class:"header-anchor",href:"#Extension-to-Base-module-2","aria-label":'Permalink to "Extension to Base module {#Extension-to-Base-module-2}"'},"​")],-1)),i("details",_,[i("summary",null,[s[57]||(s[57]=i("a",{id:"Base.length-constraints-62_constraint_domains",href:"#Base.length-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"Base.length")],-1)),s[58]||(s[58]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[59]||(s[59]=t('
julia
length(layer)

Return the number of operations in a layer.

source

julia
Base.length(icn)

Return the total number of operations of an ICN.

source

julia
length(pf<:PatternFold)

Return the length of pf if unfolded.

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

',18))]),i("details",T,[i("summary",null,[s[60]||(s[60]=i("a",{id:"Base.rand-constraints-62_constraint_domains-3",href:"#Base.rand-constraints-62_constraint_domains-3"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[61]||(s[61]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[62]||(s[62]=t('
julia
Base.rand(::Vector{IntervalsFold})

Extend the Base.rand function to Vector{IntervalsFold}.

source

julia
rand(pf<:PatternFold)

Returns a random value of pf as if it was unfolded.

source

julia
Base.rand(::Vector{AbstractVectorFold})\nExtend the `Base.rand` function to `Vector{AbstractVectorFold}`.

source

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)\nBase.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

',20))]),i("details",J,[i("summary",null,[s[63]||(s[63]=i("a",{id:"Base.in-constraints-62_constraint_domains-2",href:"#Base.in-constraints-62_constraint_domains-2"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[64]||(s[64]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[65]||(s[65]=t('
julia
x::Variable constraint\nvalue  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

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

Fallback method for value ∈ d that returns false.

source

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

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

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

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

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

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

source

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

Return true if value is a point of d.

source

',15))]),i("details",w,[i("summary",null,[s[66]||(s[66]=i("a",{id:"Base.string-constraints-62_constraint_domains-2",href:"#Base.string-constraints-62_constraint_domains-2"},[i("span",{class:"jlbinding"},"Base.string")],-1)),s[67]||(s[67]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[68]||(s[68]=t(`
julia
Base.string(D::Vector{<:AbstractDomain})
+Base.string(d<:AbstractDomain)

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

source

`,3))]),s[178]||(s[178]=t('

Performances

Bench Evolution ContinuousChair Evolution Continuous

Discrete

',3)),i("details",P,[i("summary",null,[s[69]||(s[69]=i("a",{id:"ConstraintDomains.DiscreteDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.DiscreteDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.DiscreteDomain")],-1)),s[70]||(s[70]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[71]||(s[71]=t('
julia
DiscreteDomain{T <: Number} <: AbstractDomain

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

source

',3))]),i("details",I,[i("summary",null,[s[72]||(s[72]=i("a",{id:"ConstraintDomains.SetDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.SetDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.SetDomain")],-1)),s[73]||(s[73]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[74]||(s[74]=t('
julia
SetDomain{T <: Number} <: DiscreteDomain{T}

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

source

',3))]),i("details",V,[i("summary",null,[s[75]||(s[75]=i("a",{id:"ConstraintDomains.RangeDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.RangeDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.RangeDomain")],-1)),s[76]||(s[76]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[77]||(s[77]=t('
julia
RangeDomain

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

source

',3))]),i("details",R,[i("summary",null,[s[78]||(s[78]=i("a",{id:"ConstraintDomains.ArbitraryDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.ArbitraryDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ArbitraryDomain")],-1)),s[79]||(s[79]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[80]||(s[80]=t('
julia
ArbitraryDomain{T} <: DiscreteDomain{T}

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

source

',3))]),i("details",O,[i("summary",null,[s[81]||(s[81]=i("a",{id:"ConstraintDomains.domain-constraints-62_constraint_domains-3",href:"#ConstraintDomains.domain-constraints-62_constraint_domains-3"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[82]||(s[82]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[83]||(s[83]=t(`
julia
domain()

Construct an EmptyDomain.

source

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

Construct a domain of continuous interval(s).

source

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

Construct either a SetDomain or a RangeDomain.

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

source

`,10))]),i("details",V,[i("summary",null,[s[84]||(s[84]=i("a",{id:"ConstraintDomains.domain_size-constraints-61_constraint_domains-3",href:"#ConstraintDomains.domain_size-constraints-61_constraint_domains-3"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[85]||(s[85]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[86]||(s[86]=t('
julia
domain_size(d <: AbstractDomain)

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

source

julia
domain_size(itv::Intervals)

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

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',9))]),i("details",z,[i("summary",null,[s[87]||(s[87]=i("a",{id:"ConstraintDomains.add!-constraints-61_constraint_domains",href:"#ConstraintDomains.add!-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.add!")],-1)),s[88]||(s[88]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[89]||(s[89]=t('
julia
add!(d::SetDomain, value)

Add value to the list of points in d.

source

',3))]),i("details",q,[i("summary",null,[s[90]||(s[90]=i("a",{id:"ConstraintDomains.merge_domains-constraints-61_constraint_domains-2",href:"#ConstraintDomains.merge_domains-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.merge_domains")],-1)),s[91]||(s[91]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[92]||(s[92]=t('
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

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

source

',3))]),i("details",N,[i("summary",null,[s[93]||(s[93]=i("a",{id:"ConstraintDomains.intersect_domains-constraints-61_constraint_domains-2",href:"#ConstraintDomains.intersect_domains-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains")],-1)),s[94]||(s[94]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[95]||(s[95]=t('
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

',3))]),i("details",M,[i("summary",null,[s[96]||(s[96]=i("a",{id:"ConstraintDomains.size-constraints-61_constraint_domains-2",href:"#ConstraintDomains.size-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.size")],-1)),s[97]||(s[97]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[98]||(s[98]=t('
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source

',3))]),s[179]||(s[179]=i("h3",{id:"Extension-to-Base-module-3",tabindex:"-1"},[a("Extension to Base module "),i("a",{class:"header-anchor",href:"#Extension-to-Base-module-3","aria-label":'Permalink to "Extension to Base module {#Extension-to-Base-module-3}"'},"​")],-1)),i("details",U,[i("summary",null,[s[99]||(s[99]=i("a",{id:"Base.delete!-constraints-61_constraint_domains",href:"#Base.delete!-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.delete!")],-1)),s[100]||(s[100]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[101]||(s[101]=t('
julia
Base.delete!(d::SetDomain, value)(d::SetDomain, value)

Delete value from the list of points in d.

source

',3))]),i("details",G,[i("summary",null,[s[102]||(s[102]=i("a",{id:"Base.length-constraints-61_constraint_domains-2",href:"#Base.length-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"Base.length")],-1)),s[103]||(s[103]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[104]||(s[104]=t('
julia
length(layer)

Return the number of operations in a layer.

source

julia
Base.length(icn)

Return the total number of operations of an ICN.

source

julia
Base.rand(d <: AbstractDomain)

Fallback method for length(d) that return 0.

source

julia
Base.length(itv::Intervals)

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

source

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

Return the number of points in d.

source

',15))]),i("details",$,[i("summary",null,[s[105]||(s[105]=i("a",{id:"Base.rand-constraints-61_constraint_domains-4",href:"#Base.rand-constraints-61_constraint_domains-4"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[106]||(s[106]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[107]||(s[107]=t(`
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

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

source

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

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

source

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

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

`,12))]),i("details",H,[i("summary",null,[s[108]||(s[108]=i("a",{id:"Base.in-constraints-61_constraint_domains-3",href:"#Base.in-constraints-61_constraint_domains-3"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[109]||(s[109]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[110]||(s[110]=t('
julia
x::Variable constraint\nvalue  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

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

Fallback method for value ∈ d that returns false.

source

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

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

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

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

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

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

source

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

Return true if value is a point of d.

source

',15))]),i("details",K,[i("summary",null,[s[111]||(s[111]=i("a",{id:"Base.string-constraints-61_constraint_domains-3",href:"#Base.string-constraints-61_constraint_domains-3"},[i("span",{class:"jlbinding"},"Base.string")],-1)),s[112]||(s[112]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[113]||(s[113]=t(`
julia
Base.string(D::Vector{<:AbstractDomain})
-Base.string(d<:AbstractDomain)

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

source

`,3))]),s[180]||(s[180]=t('

Performances

Bench Evolution DiscreteChair Evolution Discrete

General

',3)),i("details",Q,[i("summary",null,[s[114]||(s[114]=i("a",{id:"Base.eltype-constraints-61_constraint_domains",href:"#Base.eltype-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.eltype")],-1)),s[115]||(s[115]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[116]||(s[116]=t('
julia
Base.eltype(::AbstractDomain)

Extend eltype for domains.

source

',3))]),i("details",W,[i("summary",null,[s[117]||(s[117]=i("a",{id:"Base.convert-constraints-61_constraint_domains",href:"#Base.convert-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.convert")],-1)),s[118]||(s[118]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[119]||(s[119]=t('
julia
Base.convert(::Type{Union{Intervals, RangeDomain}}, d::Union{Intervals, RangeDomain})

Extends Base.convert for domains.

source

',3))]),s[181]||(s[181]=i("h2",{id:"exploration",tabindex:"-1"},[a("Exploration "),i("a",{class:"header-anchor",href:"#exploration","aria-label":'Permalink to "Exploration"'},"​")],-1)),i("details",X,[i("summary",null,[s[120]||(s[120]=i("a",{id:"ConstraintDomains.Explorer-constraints-61_constraint_domains",href:"#ConstraintDomains.Explorer-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.Explorer")],-1)),s[121]||(s[121]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[122]||(s[122]=t(`

Explorer(concepts, domains, objective = nothing; settings = ExploreSettings(domains))

Create an Explorer object for searching a constraint satisfaction problem space.

Arguments

  • concepts: A collection of tuples, each containing a concept function and its associated variable indices.

  • domains: A collection of domains representing the search space.

  • objective: An optional objective function for optimization problems.

  • settings: An ExploreSettings object to configure the exploration process.

Returns

An Explorer object ready for exploration.

Example

julia
domains = [domain([1, 2, 3]), domain([4, 5, 6])]
+d5 = domain(1,42,86.9)

source

`,10))]),i("details",S,[i("summary",null,[s[84]||(s[84]=i("a",{id:"ConstraintDomains.domain_size-constraints-62_constraint_domains-3",href:"#ConstraintDomains.domain_size-constraints-62_constraint_domains-3"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[85]||(s[85]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[86]||(s[86]=t('
julia
domain_size(d <: AbstractDomain)

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

source

julia
domain_size(itv::Intervals)

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

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',9))]),i("details",z,[i("summary",null,[s[87]||(s[87]=i("a",{id:"ConstraintDomains.add!-constraints-62_constraint_domains",href:"#ConstraintDomains.add!-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.add!")],-1)),s[88]||(s[88]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[89]||(s[89]=t('
julia
add!(d::SetDomain, value)

Add value to the list of points in d.

source

',3))]),i("details",q,[i("summary",null,[s[90]||(s[90]=i("a",{id:"ConstraintDomains.merge_domains-constraints-62_constraint_domains-2",href:"#ConstraintDomains.merge_domains-constraints-62_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.merge_domains")],-1)),s[91]||(s[91]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[92]||(s[92]=t('
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

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

source

',3))]),i("details",N,[i("summary",null,[s[93]||(s[93]=i("a",{id:"ConstraintDomains.intersect_domains-constraints-62_constraint_domains-2",href:"#ConstraintDomains.intersect_domains-constraints-62_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains")],-1)),s[94]||(s[94]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[95]||(s[95]=t('
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

',3))]),i("details",M,[i("summary",null,[s[96]||(s[96]=i("a",{id:"ConstraintDomains.size-constraints-62_constraint_domains-2",href:"#ConstraintDomains.size-constraints-62_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.size")],-1)),s[97]||(s[97]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[98]||(s[98]=t('
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source

',3))]),s[179]||(s[179]=i("h3",{id:"Extension-to-Base-module-3",tabindex:"-1"},[a("Extension to Base module "),i("a",{class:"header-anchor",href:"#Extension-to-Base-module-3","aria-label":'Permalink to "Extension to Base module {#Extension-to-Base-module-3}"'},"​")],-1)),i("details",U,[i("summary",null,[s[99]||(s[99]=i("a",{id:"Base.delete!-constraints-62_constraint_domains",href:"#Base.delete!-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"Base.delete!")],-1)),s[100]||(s[100]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[101]||(s[101]=t('
julia
Base.delete!(d::SetDomain, value)(d::SetDomain, value)

Delete value from the list of points in d.

source

',3))]),i("details",G,[i("summary",null,[s[102]||(s[102]=i("a",{id:"Base.length-constraints-62_constraint_domains-2",href:"#Base.length-constraints-62_constraint_domains-2"},[i("span",{class:"jlbinding"},"Base.length")],-1)),s[103]||(s[103]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[104]||(s[104]=t('
julia
length(layer)

Return the number of operations in a layer.

source

julia
Base.length(icn)

Return the total number of operations of an ICN.

source

julia
length(pf<:PatternFold)

Return the length of pf if unfolded.

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

',18))]),i("details",$,[i("summary",null,[s[105]||(s[105]=i("a",{id:"Base.rand-constraints-62_constraint_domains-4",href:"#Base.rand-constraints-62_constraint_domains-4"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[106]||(s[106]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[107]||(s[107]=t('
julia
Base.rand(::Vector{IntervalsFold})

Extend the Base.rand function to Vector{IntervalsFold}.

source

julia
rand(pf<:PatternFold)

Returns a random value of pf as if it was unfolded.

source

julia
Base.rand(::Vector{AbstractVectorFold})\nExtend the `Base.rand` function to `Vector{AbstractVectorFold}`.

source

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)\nBase.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

',20))]),i("details",H,[i("summary",null,[s[108]||(s[108]=i("a",{id:"Base.in-constraints-62_constraint_domains-3",href:"#Base.in-constraints-62_constraint_domains-3"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[109]||(s[109]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[110]||(s[110]=t('
julia
x::Variable constraint\nvalue  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

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

Fallback method for value ∈ d that returns false.

source

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

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

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

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

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

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source

',15))]),i("details",K,[i("summary",null,[s[111]||(s[111]=i("a",{id:"Base.string-constraints-62_constraint_domains-3",href:"#Base.string-constraints-62_constraint_domains-3"},[i("span",{class:"jlbinding"},"Base.string")],-1)),s[112]||(s[112]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[113]||(s[113]=t(`
julia
Base.string(D::Vector{<:AbstractDomain})
+Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source

`,3))]),s[180]||(s[180]=t('

Performances

Bench Evolution DiscreteChair Evolution Discrete

General

',3)),i("details",Q,[i("summary",null,[s[114]||(s[114]=i("a",{id:"Base.eltype-constraints-62_constraint_domains",href:"#Base.eltype-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"Base.eltype")],-1)),s[115]||(s[115]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[116]||(s[116]=t('
julia
Base.eltype(::AbstractDomain)

Extend eltype for domains.

source

',3))]),i("details",W,[i("summary",null,[s[117]||(s[117]=i("a",{id:"Base.convert-constraints-62_constraint_domains",href:"#Base.convert-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"Base.convert")],-1)),s[118]||(s[118]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[119]||(s[119]=t('
julia
Base.convert(::Type{Union{Intervals, RangeDomain}}, d::Union{Intervals, RangeDomain})

Extends Base.convert for domains.

source

',3))]),s[181]||(s[181]=i("h2",{id:"exploration",tabindex:"-1"},[a("Exploration "),i("a",{class:"header-anchor",href:"#exploration","aria-label":'Permalink to "Exploration"'},"​")],-1)),i("details",X,[i("summary",null,[s[120]||(s[120]=i("a",{id:"ConstraintDomains.Explorer-constraints-62_constraint_domains",href:"#ConstraintDomains.Explorer-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.Explorer")],-1)),s[121]||(s[121]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[122]||(s[122]=t(`

Explorer(concepts, domains, objective = nothing; settings = ExploreSettings(domains))

Create an Explorer object for searching a constraint satisfaction problem space.

Arguments

  • concepts: A collection of tuples, each containing a concept function and its associated variable indices.

  • domains: A collection of domains representing the search space.

  • objective: An optional objective function for optimization problems.

  • settings: An ExploreSettings object to configure the exploration process.

Returns

An Explorer object ready for exploration.

Example

julia
domains = [domain([1, 2, 3]), domain([4, 5, 6])]
 concepts = [(sum, [1, 2])]
 objective = x -> x[1] + x[2]
-explorer = Explorer(concepts, domains, objective)

source

`,9))]),i("details",Y,[i("summary",null,[s[123]||(s[123]=i("a",{id:"ConstraintDomains.ExploreSettings-constraints-61_constraint_domains",href:"#ConstraintDomains.ExploreSettings-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ExploreSettings")],-1)),s[124]||(s[124]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[125]||(s[125]=t(`
julia
ExploreSettings(
+explorer = Explorer(concepts, domains, objective)

source

`,9))]),i("details",Y,[i("summary",null,[s[123]||(s[123]=i("a",{id:"ConstraintDomains.ExploreSettings-constraints-62_constraint_domains",href:"#ConstraintDomains.ExploreSettings-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ExploreSettings")],-1)),s[124]||(s[124]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[125]||(s[125]=t(`
julia
ExploreSettings(
     domains;
     complete_search_limit = 10^6,
     max_samplings = sum(domain_size, domains),
     search = :flexible,
     solutions_limit = floor(Int, sqrt(max_samplings)),
 )

Create settings for the exploration of a search space composed by a collection of domains.

Arguments

  • domains: A collection of domains representing the search space.

  • complete_search_limit: Maximum size of the search space for complete search.

  • max_samplings: Maximum number of samples to take during partial search.

  • search: Search strategy (:flexible, :complete, or :partial).

  • solutions_limit: Maximum number of solutions to store.

Returns

An ExploreSettings object.

Example

julia
domains = [domain([1, 2, 3]), domain([4, 5, 6])]
-settings = ExploreSettings(domains, search = :complete)

source

`,9))]),i("details",Z,[i("summary",null,[s[126]||(s[126]=i("a",{id:"ConstraintDomains.explore!-constraints-61_constraint_domains",href:"#ConstraintDomains.explore!-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.explore!")],-1)),s[127]||(s[127]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[128]||(s[128]=t(`
julia
explore!(explorer::Explorer)

Perform exploration on the search space defined by the Explorer object.

This function explores the search space according to the settings specified in the Explorer object. It updates the Explorer's state with found solutions and non-solutions.

Arguments

  • explorer: An Explorer object containing the problem definition and exploration settings.

Returns

Nothing. The Explorer's state is updated in-place.

Example

julia
explorer = Explorer(concepts, domains)
+settings = ExploreSettings(domains, search = :complete)

source

`,9))]),i("details",Z,[i("summary",null,[s[126]||(s[126]=i("a",{id:"ConstraintDomains.explore!-constraints-62_constraint_domains",href:"#ConstraintDomains.explore!-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.explore!")],-1)),s[127]||(s[127]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[128]||(s[128]=t(`
julia
explore!(explorer::Explorer)

Perform exploration on the search space defined by the Explorer object.

This function explores the search space according to the settings specified in the Explorer object. It updates the Explorer's state with found solutions and non-solutions.

Arguments

  • explorer: An Explorer object containing the problem definition and exploration settings.

Returns

Nothing. The Explorer's state is updated in-place.

Example

julia
explorer = Explorer(concepts, domains)
 explore!(explorer)
-println("Solutions found: ", length(explorer.state.solutions))

source

`,10))]),i("details",ss,[i("summary",null,[s[129]||(s[129]=i("a",{id:"ConstraintDomains.explore-constraints-61_constraint_domains",href:"#ConstraintDomains.explore-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.explore")],-1)),s[130]||(s[130]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[131]||(s[131]=t(`
julia
explore(domains, concept; settings = ExploreSettings(domains), parameters...)

Explore a search space defined by domains and a concept.

Arguments

  • domains: A collection of domains representing the search space.

  • concept: The concept function defining the constraint.

  • settings: An ExploreSettings object to configure the exploration process.

  • parameters: Additional parameters to pass to the concept function.

Returns

A tuple containing two sets: (solutions, non_solutions).

Example

julia
domains = [domain([1, 2, 3]), domain([4, 5, 6])]
-solutions, non_solutions = explore(domains, allunique)

source

`,9))]),s[182]||(s[182]=t('

Performances

Bench Evolution ExplorationChair Evolution Exploration

Parameters

',3)),i("details",is,[i("summary",null,[s[132]||(s[132]=i("a",{id:"ConstraintDomains.BoolParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.BoolParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.BoolParameterDomain")],-1)),s[133]||(s[133]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[134]||(s[134]=t('
julia
BoolParameterDomain <: AbstractDomain

A domain to store boolean values. It is used to generate random parameters.

source

',3))]),i("details",as,[i("summary",null,[s[135]||(s[135]=i("a",{id:"ConstraintDomains.DimParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.DimParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.DimParameterDomain")],-1)),s[136]||(s[136]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[137]||(s[137]=t('
julia
DimParameterDomain <: AbstractDomain

A domain to store dimensions. It is used to generate random parameters.

source

',3))]),i("details",ts,[i("summary",null,[s[138]||(s[138]=i("a",{id:"ConstraintDomains.IdParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.IdParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.IdParameterDomain")],-1)),s[139]||(s[139]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[140]||(s[140]=t('
julia
IdParameterDomain <: AbstractDomain

A domain to store ids. It is used to generate random parameters.

source

',3))]),i("details",ns,[i("summary",null,[s[141]||(s[141]=i("a",{id:"ConstraintDomains.FakeAutomaton-constraints-61_constraint_domains",href:"#ConstraintDomains.FakeAutomaton-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.FakeAutomaton")],-1)),s[142]||(s[142]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[143]||(s[143]=t('
julia
FakeAutomaton{T} <: ConstraintCommons.AbstractAutomaton

A structure to generate pseudo automaton enough for parameter exploration.

source

',3))]),i("details",es,[i("summary",null,[s[144]||(s[144]=i("a",{id:"ConstraintCommons.accept-constraints-61_constraint_domains",href:"#ConstraintCommons.accept-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintCommons.accept")],-1)),s[145]||(s[145]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[146]||(s[146]=t('
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

',6))]),i("details",ls,[i("summary",null,[s[147]||(s[147]=i("a",{id:"ConstraintDomains.fake_automaton-constraints-61_constraint_domains",href:"#ConstraintDomains.fake_automaton-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.fake_automaton")],-1)),s[148]||(s[148]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[149]||(s[149]=t('
julia
fake_automaton(d)

Construct a FakeAutomaton.

source

',3))]),i("details",ps,[i("summary",null,[s[150]||(s[150]=i("a",{id:"ConstraintDomains.LanguageParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.LanguageParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.LanguageParameterDomain")],-1)),s[151]||(s[151]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[152]||(s[152]=t('
julia
LanguageParameterDomain <: AbstractDomain

A domain to store languages. It is used to generate random parameters.

source

',3))]),i("details",hs,[i("summary",null,[s[153]||(s[153]=i("a",{id:"ConstraintDomains.OpParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.OpParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.OpParameterDomain")],-1)),s[154]||(s[154]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[155]||(s[155]=t('
julia
OpParameterDomain{T} <: AbstractDomain

A domain to store operators. It is used to generate random parameters.

source

',3))]),i("details",os,[i("summary",null,[s[156]||(s[156]=i("a",{id:"ConstraintDomains.PairVarsParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.PairVarsParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.PairVarsParameterDomain")],-1)),s[157]||(s[157]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[158]||(s[158]=t('
julia
PairVarsParameterDomain{T} <: AbstractDomain

A domain to store values paired with variables. It is used to generate random parameters.

source

',3))]),i("details",rs,[i("summary",null,[s[159]||(s[159]=i("a",{id:"ConstraintDomains.ValParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.ValParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ValParameterDomain")],-1)),s[160]||(s[160]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[161]||(s[161]=t('
julia
ValParameterDomain{T} <: AbstractDomain

A domain to store one value. It is used to generate random parameters.

source

',3))]),i("details",ks,[i("summary",null,[s[162]||(s[162]=i("a",{id:"ConstraintDomains.ValsParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.ValsParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ValsParameterDomain")],-1)),s[163]||(s[163]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[164]||(s[164]=t('
julia
ValsParameterDomain{T} <: AbstractDomain

A domain to store values. It is used to generate random parameters.

source

',3))]),i("details",ds,[i("summary",null,[s[165]||(s[165]=i("a",{id:"Base.rand-constraints-61_constraint_domains-5",href:"#Base.rand-constraints-61_constraint_domains-5"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[166]||(s[166]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[167]||(s[167]=t(`
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

`,12))]),i("details",cs,[i("summary",null,[s[168]||(s[168]=i("a",{id:"ConstraintDomains.generate_parameters-constraints-61_constraint_domains",href:"#ConstraintDomains.generate_parameters-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.generate_parameters")],-1)),s[169]||(s[169]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[170]||(s[170]=t('
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source

',3))])])}const vs=l(r,[["render",gs]]);export{Fs as __pageData,vs as default}; +println("Solutions found: ", length(explorer.state.solutions))

source

`,10))]),i("details",ss,[i("summary",null,[s[129]||(s[129]=i("a",{id:"ConstraintDomains.explore-constraints-62_constraint_domains",href:"#ConstraintDomains.explore-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.explore")],-1)),s[130]||(s[130]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[131]||(s[131]=t(`
julia
explore(domains, concept; settings = ExploreSettings(domains), parameters...)

Explore a search space defined by domains and a concept.

Arguments

  • domains: A collection of domains representing the search space.

  • concept: The concept function defining the constraint.

  • settings: An ExploreSettings object to configure the exploration process.

  • parameters: Additional parameters to pass to the concept function.

Returns

A tuple containing two sets: (solutions, non_solutions).

Example

julia
domains = [domain([1, 2, 3]), domain([4, 5, 6])]
+solutions, non_solutions = explore(domains, allunique)

source

`,9))]),s[182]||(s[182]=t('

Performances

Bench Evolution ExplorationChair Evolution Exploration

Parameters

',3)),i("details",is,[i("summary",null,[s[132]||(s[132]=i("a",{id:"ConstraintDomains.BoolParameterDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.BoolParameterDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.BoolParameterDomain")],-1)),s[133]||(s[133]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[134]||(s[134]=t('
julia
BoolParameterDomain <: AbstractDomain

A domain to store boolean values. It is used to generate random parameters.

source

',3))]),i("details",as,[i("summary",null,[s[135]||(s[135]=i("a",{id:"ConstraintDomains.DimParameterDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.DimParameterDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.DimParameterDomain")],-1)),s[136]||(s[136]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[137]||(s[137]=t('
julia
DimParameterDomain <: AbstractDomain

A domain to store dimensions. It is used to generate random parameters.

source

',3))]),i("details",ts,[i("summary",null,[s[138]||(s[138]=i("a",{id:"ConstraintDomains.IdParameterDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.IdParameterDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.IdParameterDomain")],-1)),s[139]||(s[139]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[140]||(s[140]=t('
julia
IdParameterDomain <: AbstractDomain

A domain to store ids. It is used to generate random parameters.

source

',3))]),i("details",ns,[i("summary",null,[s[141]||(s[141]=i("a",{id:"ConstraintDomains.FakeAutomaton-constraints-62_constraint_domains",href:"#ConstraintDomains.FakeAutomaton-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.FakeAutomaton")],-1)),s[142]||(s[142]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[143]||(s[143]=t('
julia
FakeAutomaton{T} <: ConstraintCommons.AbstractAutomaton

A structure to generate pseudo automaton enough for parameter exploration.

source

',3))]),i("details",es,[i("summary",null,[s[144]||(s[144]=i("a",{id:"ConstraintCommons.accept-constraints-62_constraint_domains",href:"#ConstraintCommons.accept-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintCommons.accept")],-1)),s[145]||(s[145]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[146]||(s[146]=t('
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

',6))]),i("details",ls,[i("summary",null,[s[147]||(s[147]=i("a",{id:"ConstraintDomains.fake_automaton-constraints-62_constraint_domains",href:"#ConstraintDomains.fake_automaton-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.fake_automaton")],-1)),s[148]||(s[148]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[149]||(s[149]=t('
julia
fake_automaton(d)

Construct a FakeAutomaton.

source

',3))]),i("details",ps,[i("summary",null,[s[150]||(s[150]=i("a",{id:"ConstraintDomains.LanguageParameterDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.LanguageParameterDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.LanguageParameterDomain")],-1)),s[151]||(s[151]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[152]||(s[152]=t('
julia
LanguageParameterDomain <: AbstractDomain

A domain to store languages. It is used to generate random parameters.

source

',3))]),i("details",hs,[i("summary",null,[s[153]||(s[153]=i("a",{id:"ConstraintDomains.OpParameterDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.OpParameterDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.OpParameterDomain")],-1)),s[154]||(s[154]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[155]||(s[155]=t('
julia
OpParameterDomain{T} <: AbstractDomain

A domain to store operators. It is used to generate random parameters.

source

',3))]),i("details",os,[i("summary",null,[s[156]||(s[156]=i("a",{id:"ConstraintDomains.PairVarsParameterDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.PairVarsParameterDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.PairVarsParameterDomain")],-1)),s[157]||(s[157]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[158]||(s[158]=t('
julia
PairVarsParameterDomain{T} <: AbstractDomain

A domain to store values paired with variables. It is used to generate random parameters.

source

',3))]),i("details",rs,[i("summary",null,[s[159]||(s[159]=i("a",{id:"ConstraintDomains.ValParameterDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.ValParameterDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ValParameterDomain")],-1)),s[160]||(s[160]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[161]||(s[161]=t('
julia
ValParameterDomain{T} <: AbstractDomain

A domain to store one value. It is used to generate random parameters.

source

',3))]),i("details",ks,[i("summary",null,[s[162]||(s[162]=i("a",{id:"ConstraintDomains.ValsParameterDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.ValsParameterDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ValsParameterDomain")],-1)),s[163]||(s[163]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[164]||(s[164]=t('
julia
ValsParameterDomain{T} <: AbstractDomain

A domain to store values. It is used to generate random parameters.

source

',3))]),i("details",ds,[i("summary",null,[s[165]||(s[165]=i("a",{id:"Base.rand-constraints-62_constraint_domains-5",href:"#Base.rand-constraints-62_constraint_domains-5"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[166]||(s[166]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[167]||(s[167]=t('
julia
Base.rand(::Vector{IntervalsFold})

Extend the Base.rand function to Vector{IntervalsFold}.

source

julia
rand(pf<:PatternFold)

Returns a random value of pf as if it was unfolded.

source

julia
Base.rand(::Vector{AbstractVectorFold})\nExtend the `Base.rand` function to `Vector{AbstractVectorFold}`.

source

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)\nBase.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

',20))]),i("details",cs,[i("summary",null,[s[168]||(s[168]=i("a",{id:"ConstraintDomains.generate_parameters-constraints-62_constraint_domains",href:"#ConstraintDomains.generate_parameters-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.generate_parameters")],-1)),s[169]||(s[169]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[170]||(s[170]=t('
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source

',3))])])}const vs=l(r,[["render",gs]]);export{Fs as __pageData,vs as default}; diff --git a/dev/assets/constraints_61_constraint_domains.md.oi_ydeg8.lean.js b/dev/assets/constraints_62_constraint_domains.md.DMsVVEqc.lean.js similarity index 65% rename from dev/assets/constraints_61_constraint_domains.md.oi_ydeg8.lean.js rename to dev/assets/constraints_62_constraint_domains.md.DMsVVEqc.lean.js index 60e5c49..77cbe62 100644 --- a/dev/assets/constraints_61_constraint_domains.md.oi_ydeg8.lean.js +++ b/dev/assets/constraints_62_constraint_domains.md.DMsVVEqc.lean.js @@ -1,40 +1,35 @@ -import{_ as l,c as p,j as i,a,G as e,a5 as t,B as h,o}from"./chunks/framework.CJakPlgM.js";const Fs=JSON.parse('{"title":"ConstraintDomains.jl: Defining Variables and Exploring Domains","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/61_constraint_domains.md","filePath":"constraints/61_constraint_domains.md","lastUpdated":null}'),r={name:"constraints/61_constraint_domains.md"},k={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},L={class:"jldocstring custom-block",open:""},_={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},J={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""},I={class:"jldocstring custom-block",open:""},P={class:"jldocstring custom-block",open:""},O={class:"jldocstring custom-block",open:""},R={class:"jldocstring custom-block",open:""},S={class:"jldocstring custom-block",open:""},V={class:"jldocstring custom-block",open:""},z={class:"jldocstring custom-block",open:""},q={class:"jldocstring custom-block",open:""},N={class:"jldocstring custom-block",open:""},M={class:"jldocstring custom-block",open:""},U={class:"jldocstring custom-block",open:""},G={class:"jldocstring custom-block",open:""},$={class:"jldocstring custom-block",open:""},H={class:"jldocstring custom-block",open:""},K={class:"jldocstring custom-block",open:""},Q={class:"jldocstring custom-block",open:""},W={class:"jldocstring custom-block",open:""},X={class:"jldocstring custom-block",open:""},Y={class:"jldocstring custom-block",open:""},Z={class:"jldocstring custom-block",open:""},ss={class:"jldocstring custom-block",open:""},is={class:"jldocstring custom-block",open:""},as={class:"jldocstring custom-block",open:""},ts={class:"jldocstring custom-block",open:""},ns={class:"jldocstring custom-block",open:""},es={class:"jldocstring custom-block",open:""},ls={class:"jldocstring custom-block",open:""},ps={class:"jldocstring custom-block",open:""},hs={class:"jldocstring custom-block",open:""},os={class:"jldocstring custom-block",open:""},rs={class:"jldocstring custom-block",open:""},ks={class:"jldocstring custom-block",open:""},ds={class:"jldocstring custom-block",open:""},cs={class:"jldocstring custom-block",open:""};function gs(Es,s,us,ys,ms,bs){const n=h("Badge");return o(),p("div",null,[s[171]||(s[171]=i("h1",{id:"ConstraintDomains.jl:-Defining-Variables-and-Exploring-Domains",tabindex:"-1"},[a("ConstraintDomains.jl: Defining Variables and Exploring Domains "),i("a",{class:"header-anchor",href:"#ConstraintDomains.jl:-Defining-Variables-and-Exploring-Domains","aria-label":'Permalink to "ConstraintDomains.jl: Defining Variables and Exploring Domains {#ConstraintDomains.jl:-Defining-Variables-and-Exploring-Domains}"'},"​")],-1)),s[172]||(s[172]=i("p",null,[i("em",null,"ConstraintDomains.jl"),a(" is the standard way to define variables and explore domains in the "),i("em",null,"Julia Constraints"),a(" ecosystem. This package can be used to specify both discrete and continuous domains. Explorations features are primarily related to learning about constraints, aka constraint learning.")],-1)),s[173]||(s[173]=i("p",null,"Most users should use it through JuMP/MOI interfaces.",-1)),s[174]||(s[174]=i("h2",{id:"commons",tabindex:"-1"},[a("Commons "),i("a",{class:"header-anchor",href:"#commons","aria-label":'Permalink to "Commons"'},"​")],-1)),i("details",k,[i("summary",null,[s[0]||(s[0]=i("a",{id:"ConstraintDomains.AbstractDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.AbstractDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.AbstractDomain")],-1)),s[1]||(s[1]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=t('
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

  • Base.∈(val, ::D)

  • Base.rand(::D)

  • Base.length(::D) that is the number of elements in a discrete domain, and the distance between bounds or similar for a continuous domain

Additionally, if the domain is used in a dynamic context, it can extend

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source

',7))]),i("details",d,[i("summary",null,[s[3]||(s[3]=i("a",{id:"ConstraintDomains.EmptyDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.EmptyDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.EmptyDomain")],-1)),s[4]||(s[4]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[5]||(s[5]=t('
julia
EmptyDomain

A struct to handle yet to be defined domains.

source

',3))]),i("details",c,[i("summary",null,[s[6]||(s[6]=i("a",{id:"ConstraintDomains.domain-constraints-61_constraint_domains",href:"#ConstraintDomains.domain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[7]||(s[7]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[8]||(s[8]=t(`
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+import{_ as l,c as p,j as i,a,G as e,a5 as t,B as h,o}from"./chunks/framework.CJakPlgM.js";const Fs=JSON.parse('{"title":"ConstraintDomains.jl: Defining Variables and Exploring Domains","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/62_constraint_domains.md","filePath":"constraints/62_constraint_domains.md","lastUpdated":null}'),r={name:"constraints/62_constraint_domains.md"},k={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},L={class:"jldocstring custom-block",open:""},_={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},J={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""},P={class:"jldocstring custom-block",open:""},I={class:"jldocstring custom-block",open:""},V={class:"jldocstring custom-block",open:""},R={class:"jldocstring custom-block",open:""},O={class:"jldocstring custom-block",open:""},S={class:"jldocstring custom-block",open:""},z={class:"jldocstring custom-block",open:""},q={class:"jldocstring custom-block",open:""},N={class:"jldocstring custom-block",open:""},M={class:"jldocstring custom-block",open:""},U={class:"jldocstring custom-block",open:""},G={class:"jldocstring custom-block",open:""},$={class:"jldocstring custom-block",open:""},H={class:"jldocstring custom-block",open:""},K={class:"jldocstring custom-block",open:""},Q={class:"jldocstring custom-block",open:""},W={class:"jldocstring custom-block",open:""},X={class:"jldocstring custom-block",open:""},Y={class:"jldocstring custom-block",open:""},Z={class:"jldocstring custom-block",open:""},ss={class:"jldocstring custom-block",open:""},is={class:"jldocstring custom-block",open:""},as={class:"jldocstring custom-block",open:""},ts={class:"jldocstring custom-block",open:""},ns={class:"jldocstring custom-block",open:""},es={class:"jldocstring custom-block",open:""},ls={class:"jldocstring custom-block",open:""},ps={class:"jldocstring custom-block",open:""},hs={class:"jldocstring custom-block",open:""},os={class:"jldocstring custom-block",open:""},rs={class:"jldocstring custom-block",open:""},ks={class:"jldocstring custom-block",open:""},ds={class:"jldocstring custom-block",open:""},cs={class:"jldocstring custom-block",open:""};function gs(Es,s,us,ys,ms,bs){const n=h("Badge");return o(),p("div",null,[s[171]||(s[171]=i("h1",{id:"ConstraintDomains.jl:-Defining-Variables-and-Exploring-Domains",tabindex:"-1"},[a("ConstraintDomains.jl: Defining Variables and Exploring Domains "),i("a",{class:"header-anchor",href:"#ConstraintDomains.jl:-Defining-Variables-and-Exploring-Domains","aria-label":'Permalink to "ConstraintDomains.jl: Defining Variables and Exploring Domains {#ConstraintDomains.jl:-Defining-Variables-and-Exploring-Domains}"'},"​")],-1)),s[172]||(s[172]=i("p",null,[i("em",null,"ConstraintDomains.jl"),a(" is the standard way to define variables and explore domains in the "),i("em",null,"Julia Constraints"),a(" ecosystem. This package can be used to specify both discrete and continuous domains. Explorations features are primarily related to learning about constraints, aka constraint learning.")],-1)),s[173]||(s[173]=i("p",null,"Most users should use it through JuMP/MOI interfaces.",-1)),s[174]||(s[174]=i("h2",{id:"commons",tabindex:"-1"},[a("Commons "),i("a",{class:"header-anchor",href:"#commons","aria-label":'Permalink to "Commons"'},"​")],-1)),i("details",k,[i("summary",null,[s[0]||(s[0]=i("a",{id:"ConstraintDomains.AbstractDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.AbstractDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.AbstractDomain")],-1)),s[1]||(s[1]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=t('
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

  • Base.∈(val, ::D)

  • Base.rand(::D)

  • Base.length(::D) that is the number of elements in a discrete domain, and the distance between bounds or similar for a continuous domain

Additionally, if the domain is used in a dynamic context, it can extend

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source

',7))]),i("details",d,[i("summary",null,[s[3]||(s[3]=i("a",{id:"ConstraintDomains.EmptyDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.EmptyDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.EmptyDomain")],-1)),s[4]||(s[4]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[5]||(s[5]=t('
julia
EmptyDomain

A struct to handle yet to be defined domains.

source

',3))]),i("details",c,[i("summary",null,[s[6]||(s[6]=i("a",{id:"ConstraintDomains.domain-constraints-62_constraint_domains",href:"#ConstraintDomains.domain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[7]||(s[7]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[8]||(s[8]=t(`
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
 domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

julia
domain(values)
 domain(range::R) where {T <: Real, R <: AbstractRange{T}}

Construct either a SetDomain or a RangeDomain.

julia
d1 = domain(1:5)
 d2 = domain([53.69, 89.2, 0.12])
 d3 = domain([2//3, 89//123])
 d4 = domain(4.3)
-d5 = domain(1,42,86.9)

source

`,10))]),i("details",g,[i("summary",null,[s[9]||(s[9]=i("a",{id:"ConstraintDomains.domain_size-constraints-61_constraint_domains",href:"#ConstraintDomains.domain_size-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[10]||(s[10]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[11]||(s[11]=t('
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',9))]),i("details",E,[i("summary",null,[s[12]||(s[12]=i("a",{id:"ConstraintDomains.get_domain-constraints-61_constraint_domains",href:"#ConstraintDomains.get_domain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.get_domain")],-1)),s[13]||(s[13]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[14]||(s[14]=t('
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

',3))]),i("details",u,[i("summary",null,[s[15]||(s[15]=i("a",{id:"ConstraintDomains.to_domains-constraints-61_constraint_domains",href:"#ConstraintDomains.to_domains-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.to_domains")],-1)),s[16]||(s[16]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=t('
julia
to_domains(args...)

Convert various arguments into valid domains format.

source

',3))]),s[175]||(s[175]=i("h3",{id:"Extension-to-Base-module",tabindex:"-1"},[a("Extension to Base module "),i("a",{class:"header-anchor",href:"#Extension-to-Base-module","aria-label":'Permalink to "Extension to Base module {#Extension-to-Base-module}"'},"​")],-1)),i("details",y,[i("summary",null,[s[18]||(s[18]=i("a",{id:"Base.in-constraints-61_constraint_domains",href:"#Base.in-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[19]||(s[19]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[20]||(s[20]=t('
julia
x::Variable constraint\nvalue  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source

',15))]),i("details",m,[i("summary",null,[s[21]||(s[21]=i("a",{id:"Base.rand-constraints-61_constraint_domains",href:"#Base.rand-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[22]||(s[22]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[23]||(s[23]=t(`
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

`,12))]),i("details",b,[i("summary",null,[s[24]||(s[24]=i("a",{id:"Base.isempty-constraints-61_constraint_domains",href:"#Base.isempty-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.isempty")],-1)),s[25]||(s[25]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=t('
julia
Base.isempty(d <: AbstractDomain)

Fallback method for isempty(d) that return length(d) == 0 which default to 0.

source

',3))]),i("details",C,[i("summary",null,[s[27]||(s[27]=i("a",{id:"Base.rand-constraints-61_constraint_domains-2",href:"#Base.rand-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[28]||(s[28]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[29]||(s[29]=t(`
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

`,12))]),i("details",F,[i("summary",null,[s[30]||(s[30]=i("a",{id:"Base.string-constraints-61_constraint_domains",href:"#Base.string-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.string")],-1)),s[31]||(s[31]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[32]||(s[32]=t(`
julia
Base.string(D::Vector{<:AbstractDomain})
-Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source

`,3))]),s[176]||(s[176]=t('

Performances

Bench Evolution CommonChair Evolution Common

Continuous

',3)),i("details",v,[i("summary",null,[s[33]||(s[33]=i("a",{id:"ConstraintDomains.ContinuousDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.ContinuousDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ContinuousDomain")],-1)),s[34]||(s[34]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[35]||(s[35]=t('
julia
ContinuousDomain{T <: Real} <: AbstractDomain

An abstract supertype for all continuous domains.

source

',3))]),i("details",D,[i("summary",null,[s[36]||(s[36]=i("a",{id:"ConstraintDomains.Intervals-constraints-61_constraint_domains",href:"#ConstraintDomains.Intervals-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.Intervals")],-1)),s[37]||(s[37]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[38]||(s[38]=t('
julia
Intervals{T <: Real} <: ContinuousDomain{T}

An encapsuler to store a vector of PatternFolds.Interval. Dynamic changes to Intervals are not handled yet.

source

',3))]),i("details",j,[i("summary",null,[s[39]||(s[39]=i("a",{id:"ConstraintDomains.domain-constraints-61_constraint_domains-2",href:"#ConstraintDomains.domain-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[40]||(s[40]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[41]||(s[41]=t(`
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+d5 = domain(1,42,86.9)

source

`,10))]),i("details",g,[i("summary",null,[s[9]||(s[9]=i("a",{id:"ConstraintDomains.domain_size-constraints-62_constraint_domains",href:"#ConstraintDomains.domain_size-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[10]||(s[10]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[11]||(s[11]=t('
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',9))]),i("details",E,[i("summary",null,[s[12]||(s[12]=i("a",{id:"ConstraintDomains.get_domain-constraints-62_constraint_domains",href:"#ConstraintDomains.get_domain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.get_domain")],-1)),s[13]||(s[13]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[14]||(s[14]=t('
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

',3))]),i("details",u,[i("summary",null,[s[15]||(s[15]=i("a",{id:"ConstraintDomains.to_domains-constraints-62_constraint_domains",href:"#ConstraintDomains.to_domains-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.to_domains")],-1)),s[16]||(s[16]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=t('
julia
to_domains(args...)

Convert various arguments into valid domains format.

source

',3))]),s[175]||(s[175]=i("h3",{id:"Extension-to-Base-module",tabindex:"-1"},[a("Extension to Base module "),i("a",{class:"header-anchor",href:"#Extension-to-Base-module","aria-label":'Permalink to "Extension to Base module {#Extension-to-Base-module}"'},"​")],-1)),i("details",y,[i("summary",null,[s[18]||(s[18]=i("a",{id:"Base.in-constraints-62_constraint_domains",href:"#Base.in-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[19]||(s[19]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[20]||(s[20]=t('
julia
x::Variable constraint\nvalue  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source

',15))]),i("details",m,[i("summary",null,[s[21]||(s[21]=i("a",{id:"Base.rand-constraints-62_constraint_domains",href:"#Base.rand-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[22]||(s[22]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[23]||(s[23]=t('
julia
Base.rand(::Vector{IntervalsFold})

Extend the Base.rand function to Vector{IntervalsFold}.

source

julia
rand(pf<:PatternFold)

Returns a random value of pf as if it was unfolded.

source

julia
Base.rand(::Vector{AbstractVectorFold})\nExtend the `Base.rand` function to `Vector{AbstractVectorFold}`.

source

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)\nBase.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

',20))]),i("details",b,[i("summary",null,[s[24]||(s[24]=i("a",{id:"Base.isempty-constraints-62_constraint_domains",href:"#Base.isempty-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"Base.isempty")],-1)),s[25]||(s[25]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=t('
julia
Base.isempty(d <: AbstractDomain)

Fallback method for isempty(d) that return length(d) == 0 which default to 0.

source

',3))]),i("details",C,[i("summary",null,[s[27]||(s[27]=i("a",{id:"Base.rand-constraints-62_constraint_domains-2",href:"#Base.rand-constraints-62_constraint_domains-2"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[28]||(s[28]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[29]||(s[29]=t('
julia
Base.rand(::Vector{IntervalsFold})

Extend the Base.rand function to Vector{IntervalsFold}.

source

julia
rand(pf<:PatternFold)

Returns a random value of pf as if it was unfolded.

source

julia
Base.rand(::Vector{AbstractVectorFold})\nExtend the `Base.rand` function to `Vector{AbstractVectorFold}`.

source

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)\nBase.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

',20))]),i("details",F,[i("summary",null,[s[30]||(s[30]=i("a",{id:"Base.string-constraints-62_constraint_domains",href:"#Base.string-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"Base.string")],-1)),s[31]||(s[31]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[32]||(s[32]=t(`
julia
Base.string(D::Vector{<:AbstractDomain})
+Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source

`,3))]),s[176]||(s[176]=t('

Performances

Bench Evolution CommonChair Evolution Common

Continuous

',3)),i("details",v,[i("summary",null,[s[33]||(s[33]=i("a",{id:"ConstraintDomains.ContinuousDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.ContinuousDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ContinuousDomain")],-1)),s[34]||(s[34]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[35]||(s[35]=t('
julia
ContinuousDomain{T <: Real} <: AbstractDomain

An abstract supertype for all continuous domains.

source

',3))]),i("details",j,[i("summary",null,[s[36]||(s[36]=i("a",{id:"ConstraintDomains.Intervals-constraints-62_constraint_domains",href:"#ConstraintDomains.Intervals-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.Intervals")],-1)),s[37]||(s[37]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[38]||(s[38]=t('
julia
Intervals{T <: Real} <: ContinuousDomain{T}

An encapsuler to store a vector of PatternFolds.Interval. Dynamic changes to Intervals are not handled yet.

source

',3))]),i("details",D,[i("summary",null,[s[39]||(s[39]=i("a",{id:"ConstraintDomains.domain-constraints-62_constraint_domains-2",href:"#ConstraintDomains.domain-constraints-62_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[40]||(s[40]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[41]||(s[41]=t(`
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
 domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

julia
domain(values)
 domain(range::R) where {T <: Real, R <: AbstractRange{T}}

Construct either a SetDomain or a RangeDomain.

julia
d1 = domain(1:5)
 d2 = domain([53.69, 89.2, 0.12])
 d3 = domain([2//3, 89//123])
 d4 = domain(4.3)
-d5 = domain(1,42,86.9)

source

`,10))]),i("details",f,[i("summary",null,[s[42]||(s[42]=i("a",{id:"ConstraintDomains.domain_size-constraints-61_constraint_domains-2",href:"#ConstraintDomains.domain_size-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[43]||(s[43]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[44]||(s[44]=t('
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',9))]),i("details",B,[i("summary",null,[s[45]||(s[45]=i("a",{id:"ConstraintDomains.merge_domains-constraints-61_constraint_domains",href:"#ConstraintDomains.merge_domains-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.merge_domains")],-1)),s[46]||(s[46]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[47]||(s[47]=t('
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source

',3))]),i("details",A,[i("summary",null,[s[48]||(s[48]=i("a",{id:"ConstraintDomains.intersect_domains-constraints-61_constraint_domains",href:"#ConstraintDomains.intersect_domains-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains")],-1)),s[49]||(s[49]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[50]||(s[50]=t('
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

',3))]),i("details",x,[i("summary",null,[s[51]||(s[51]=i("a",{id:"ConstraintDomains.intersect_domains!-constraints-61_constraint_domains",href:"#ConstraintDomains.intersect_domains!-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains!")],-1)),s[52]||(s[52]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[53]||(s[53]=t('
julia
intersect_domains!(is, i, new_itvls)

Compute the intersections of a domain with an interval and store the results in new_itvls.

Arguments

  • is::IS: a collection of intervals.

  • i::I: an interval.

  • new_itvls::Vector{I}: a vector to store the results.

source

',5))]),i("details",L,[i("summary",null,[s[54]||(s[54]=i("a",{id:"ConstraintDomains.size-constraints-61_constraint_domains",href:"#ConstraintDomains.size-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.size")],-1)),s[55]||(s[55]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[56]||(s[56]=t('
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source

',3))]),s[177]||(s[177]=i("h3",{id:"Extension-to-Base-module-2",tabindex:"-1"},[a("Extension to Base module "),i("a",{class:"header-anchor",href:"#Extension-to-Base-module-2","aria-label":'Permalink to "Extension to Base module {#Extension-to-Base-module-2}"'},"​")],-1)),i("details",_,[i("summary",null,[s[57]||(s[57]=i("a",{id:"Base.length-constraints-61_constraint_domains",href:"#Base.length-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.length")],-1)),s[58]||(s[58]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[59]||(s[59]=t('
julia
length(layer)

Return the number of operations in a layer.

source

julia
Base.length(icn)

Return the total number of operations of an ICN.

source

julia
Base.rand(d <: AbstractDomain)

Fallback method for length(d) that return 0.

source

julia
Base.length(itv::Intervals)

Return the sum of the length of each interval in itv.

source

julia
Base.length(d::D) where D <: DiscreteDomain

Return the number of points in d.

source

',15))]),i("details",T,[i("summary",null,[s[60]||(s[60]=i("a",{id:"Base.rand-constraints-61_constraint_domains-3",href:"#Base.rand-constraints-61_constraint_domains-3"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[61]||(s[61]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[62]||(s[62]=t(`
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

`,12))]),i("details",J,[i("summary",null,[s[63]||(s[63]=i("a",{id:"Base.in-constraints-61_constraint_domains-2",href:"#Base.in-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[64]||(s[64]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[65]||(s[65]=t('
julia
x::Variable constraint\nvalue  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source

',15))]),i("details",w,[i("summary",null,[s[66]||(s[66]=i("a",{id:"Base.string-constraints-61_constraint_domains-2",href:"#Base.string-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"Base.string")],-1)),s[67]||(s[67]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[68]||(s[68]=t(`
julia
Base.string(D::Vector{<:AbstractDomain})
-Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source

`,3))]),s[178]||(s[178]=t('

Performances

Bench Evolution ContinuousChair Evolution Continuous

Discrete

',3)),i("details",I,[i("summary",null,[s[69]||(s[69]=i("a",{id:"ConstraintDomains.DiscreteDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.DiscreteDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.DiscreteDomain")],-1)),s[70]||(s[70]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[71]||(s[71]=t('
julia
DiscreteDomain{T <: Number} <: AbstractDomain

An abstract supertype for discrete domains (set, range).

source

',3))]),i("details",P,[i("summary",null,[s[72]||(s[72]=i("a",{id:"ConstraintDomains.SetDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.SetDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.SetDomain")],-1)),s[73]||(s[73]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[74]||(s[74]=t('
julia
SetDomain{T <: Number} <: DiscreteDomain{T}

Domain that stores discrete values as a set of (unordered) points.

source

',3))]),i("details",O,[i("summary",null,[s[75]||(s[75]=i("a",{id:"ConstraintDomains.RangeDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.RangeDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.RangeDomain")],-1)),s[76]||(s[76]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[77]||(s[77]=t('
julia
RangeDomain

A discrete domain defined by a range <: AbstractRange{Real}. As ranges are immutable in Julia, changes in RangeDomain must use set_domain!.

source

',3))]),i("details",R,[i("summary",null,[s[78]||(s[78]=i("a",{id:"ConstraintDomains.ArbitraryDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.ArbitraryDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ArbitraryDomain")],-1)),s[79]||(s[79]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[80]||(s[80]=t('
julia
ArbitraryDomain{T} <: DiscreteDomain{T}

A domain type that stores arbitrary values, possibly non numeric, of type T.

source

',3))]),i("details",S,[i("summary",null,[s[81]||(s[81]=i("a",{id:"ConstraintDomains.domain-constraints-61_constraint_domains-3",href:"#ConstraintDomains.domain-constraints-61_constraint_domains-3"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[82]||(s[82]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[83]||(s[83]=t(`
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+d5 = domain(1,42,86.9)

source

`,10))]),i("details",f,[i("summary",null,[s[42]||(s[42]=i("a",{id:"ConstraintDomains.domain_size-constraints-62_constraint_domains-2",href:"#ConstraintDomains.domain_size-constraints-62_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[43]||(s[43]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[44]||(s[44]=t('
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',9))]),i("details",B,[i("summary",null,[s[45]||(s[45]=i("a",{id:"ConstraintDomains.merge_domains-constraints-62_constraint_domains",href:"#ConstraintDomains.merge_domains-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.merge_domains")],-1)),s[46]||(s[46]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[47]||(s[47]=t('
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source

',3))]),i("details",A,[i("summary",null,[s[48]||(s[48]=i("a",{id:"ConstraintDomains.intersect_domains-constraints-62_constraint_domains",href:"#ConstraintDomains.intersect_domains-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains")],-1)),s[49]||(s[49]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[50]||(s[50]=t('
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

',3))]),i("details",x,[i("summary",null,[s[51]||(s[51]=i("a",{id:"ConstraintDomains.intersect_domains!-constraints-62_constraint_domains",href:"#ConstraintDomains.intersect_domains!-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains!")],-1)),s[52]||(s[52]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[53]||(s[53]=t('
julia
intersect_domains!(is, i, new_itvls)

Compute the intersections of a domain with an interval and store the results in new_itvls.

Arguments

  • is::IS: a collection of intervals.

  • i::I: an interval.

  • new_itvls::Vector{I}: a vector to store the results.

source

',5))]),i("details",L,[i("summary",null,[s[54]||(s[54]=i("a",{id:"ConstraintDomains.size-constraints-62_constraint_domains",href:"#ConstraintDomains.size-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.size")],-1)),s[55]||(s[55]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[56]||(s[56]=t('
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source

',3))]),s[177]||(s[177]=i("h3",{id:"Extension-to-Base-module-2",tabindex:"-1"},[a("Extension to Base module "),i("a",{class:"header-anchor",href:"#Extension-to-Base-module-2","aria-label":'Permalink to "Extension to Base module {#Extension-to-Base-module-2}"'},"​")],-1)),i("details",_,[i("summary",null,[s[57]||(s[57]=i("a",{id:"Base.length-constraints-62_constraint_domains",href:"#Base.length-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"Base.length")],-1)),s[58]||(s[58]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[59]||(s[59]=t('
julia
length(layer)

Return the number of operations in a layer.

source

julia
Base.length(icn)

Return the total number of operations of an ICN.

source

julia
length(pf<:PatternFold)

Return the length of pf if unfolded.

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

',18))]),i("details",T,[i("summary",null,[s[60]||(s[60]=i("a",{id:"Base.rand-constraints-62_constraint_domains-3",href:"#Base.rand-constraints-62_constraint_domains-3"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[61]||(s[61]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[62]||(s[62]=t('
julia
Base.rand(::Vector{IntervalsFold})

Extend the Base.rand function to Vector{IntervalsFold}.

source

julia
rand(pf<:PatternFold)

Returns a random value of pf as if it was unfolded.

source

julia
Base.rand(::Vector{AbstractVectorFold})\nExtend the `Base.rand` function to `Vector{AbstractVectorFold}`.

source

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)\nBase.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

',20))]),i("details",J,[i("summary",null,[s[63]||(s[63]=i("a",{id:"Base.in-constraints-62_constraint_domains-2",href:"#Base.in-constraints-62_constraint_domains-2"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[64]||(s[64]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[65]||(s[65]=t('
julia
x::Variable constraint\nvalue  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source

',15))]),i("details",w,[i("summary",null,[s[66]||(s[66]=i("a",{id:"Base.string-constraints-62_constraint_domains-2",href:"#Base.string-constraints-62_constraint_domains-2"},[i("span",{class:"jlbinding"},"Base.string")],-1)),s[67]||(s[67]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[68]||(s[68]=t(`
julia
Base.string(D::Vector{<:AbstractDomain})
+Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source

`,3))]),s[178]||(s[178]=t('

Performances

Bench Evolution ContinuousChair Evolution Continuous

Discrete

',3)),i("details",P,[i("summary",null,[s[69]||(s[69]=i("a",{id:"ConstraintDomains.DiscreteDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.DiscreteDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.DiscreteDomain")],-1)),s[70]||(s[70]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[71]||(s[71]=t('
julia
DiscreteDomain{T <: Number} <: AbstractDomain

An abstract supertype for discrete domains (set, range).

source

',3))]),i("details",I,[i("summary",null,[s[72]||(s[72]=i("a",{id:"ConstraintDomains.SetDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.SetDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.SetDomain")],-1)),s[73]||(s[73]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[74]||(s[74]=t('
julia
SetDomain{T <: Number} <: DiscreteDomain{T}

Domain that stores discrete values as a set of (unordered) points.

source

',3))]),i("details",V,[i("summary",null,[s[75]||(s[75]=i("a",{id:"ConstraintDomains.RangeDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.RangeDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.RangeDomain")],-1)),s[76]||(s[76]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[77]||(s[77]=t('
julia
RangeDomain

A discrete domain defined by a range <: AbstractRange{Real}. As ranges are immutable in Julia, changes in RangeDomain must use set_domain!.

source

',3))]),i("details",R,[i("summary",null,[s[78]||(s[78]=i("a",{id:"ConstraintDomains.ArbitraryDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.ArbitraryDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ArbitraryDomain")],-1)),s[79]||(s[79]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[80]||(s[80]=t('
julia
ArbitraryDomain{T} <: DiscreteDomain{T}

A domain type that stores arbitrary values, possibly non numeric, of type T.

source

',3))]),i("details",O,[i("summary",null,[s[81]||(s[81]=i("a",{id:"ConstraintDomains.domain-constraints-62_constraint_domains-3",href:"#ConstraintDomains.domain-constraints-62_constraint_domains-3"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain")],-1)),s[82]||(s[82]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[83]||(s[83]=t(`
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
 domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

julia
domain(values)
 domain(range::R) where {T <: Real, R <: AbstractRange{T}}

Construct either a SetDomain or a RangeDomain.

julia
d1 = domain(1:5)
 d2 = domain([53.69, 89.2, 0.12])
 d3 = domain([2//3, 89//123])
 d4 = domain(4.3)
-d5 = domain(1,42,86.9)

source

`,10))]),i("details",V,[i("summary",null,[s[84]||(s[84]=i("a",{id:"ConstraintDomains.domain_size-constraints-61_constraint_domains-3",href:"#ConstraintDomains.domain_size-constraints-61_constraint_domains-3"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[85]||(s[85]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[86]||(s[86]=t('
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',9))]),i("details",z,[i("summary",null,[s[87]||(s[87]=i("a",{id:"ConstraintDomains.add!-constraints-61_constraint_domains",href:"#ConstraintDomains.add!-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.add!")],-1)),s[88]||(s[88]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[89]||(s[89]=t('
julia
add!(d::SetDomain, value)

Add value to the list of points in d.

source

',3))]),i("details",q,[i("summary",null,[s[90]||(s[90]=i("a",{id:"ConstraintDomains.merge_domains-constraints-61_constraint_domains-2",href:"#ConstraintDomains.merge_domains-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.merge_domains")],-1)),s[91]||(s[91]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[92]||(s[92]=t('
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source

',3))]),i("details",N,[i("summary",null,[s[93]||(s[93]=i("a",{id:"ConstraintDomains.intersect_domains-constraints-61_constraint_domains-2",href:"#ConstraintDomains.intersect_domains-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains")],-1)),s[94]||(s[94]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[95]||(s[95]=t('
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

',3))]),i("details",M,[i("summary",null,[s[96]||(s[96]=i("a",{id:"ConstraintDomains.size-constraints-61_constraint_domains-2",href:"#ConstraintDomains.size-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.size")],-1)),s[97]||(s[97]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[98]||(s[98]=t('
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source

',3))]),s[179]||(s[179]=i("h3",{id:"Extension-to-Base-module-3",tabindex:"-1"},[a("Extension to Base module "),i("a",{class:"header-anchor",href:"#Extension-to-Base-module-3","aria-label":'Permalink to "Extension to Base module {#Extension-to-Base-module-3}"'},"​")],-1)),i("details",U,[i("summary",null,[s[99]||(s[99]=i("a",{id:"Base.delete!-constraints-61_constraint_domains",href:"#Base.delete!-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.delete!")],-1)),s[100]||(s[100]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[101]||(s[101]=t('
julia
Base.delete!(d::SetDomain, value)(d::SetDomain, value)

Delete value from the list of points in d.

source

',3))]),i("details",G,[i("summary",null,[s[102]||(s[102]=i("a",{id:"Base.length-constraints-61_constraint_domains-2",href:"#Base.length-constraints-61_constraint_domains-2"},[i("span",{class:"jlbinding"},"Base.length")],-1)),s[103]||(s[103]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[104]||(s[104]=t('
julia
length(layer)

Return the number of operations in a layer.

source

julia
Base.length(icn)

Return the total number of operations of an ICN.

source

julia
Base.rand(d <: AbstractDomain)

Fallback method for length(d) that return 0.

source

julia
Base.length(itv::Intervals)

Return the sum of the length of each interval in itv.

source

julia
Base.length(d::D) where D <: DiscreteDomain

Return the number of points in d.

source

',15))]),i("details",$,[i("summary",null,[s[105]||(s[105]=i("a",{id:"Base.rand-constraints-61_constraint_domains-4",href:"#Base.rand-constraints-61_constraint_domains-4"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[106]||(s[106]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[107]||(s[107]=t(`
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

`,12))]),i("details",H,[i("summary",null,[s[108]||(s[108]=i("a",{id:"Base.in-constraints-61_constraint_domains-3",href:"#Base.in-constraints-61_constraint_domains-3"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[109]||(s[109]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[110]||(s[110]=t('
julia
x::Variable constraint\nvalue  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source

',15))]),i("details",K,[i("summary",null,[s[111]||(s[111]=i("a",{id:"Base.string-constraints-61_constraint_domains-3",href:"#Base.string-constraints-61_constraint_domains-3"},[i("span",{class:"jlbinding"},"Base.string")],-1)),s[112]||(s[112]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[113]||(s[113]=t(`
julia
Base.string(D::Vector{<:AbstractDomain})
-Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source

`,3))]),s[180]||(s[180]=t('

Performances

Bench Evolution DiscreteChair Evolution Discrete

General

',3)),i("details",Q,[i("summary",null,[s[114]||(s[114]=i("a",{id:"Base.eltype-constraints-61_constraint_domains",href:"#Base.eltype-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.eltype")],-1)),s[115]||(s[115]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[116]||(s[116]=t('
julia
Base.eltype(::AbstractDomain)

Extend eltype for domains.

source

',3))]),i("details",W,[i("summary",null,[s[117]||(s[117]=i("a",{id:"Base.convert-constraints-61_constraint_domains",href:"#Base.convert-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"Base.convert")],-1)),s[118]||(s[118]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[119]||(s[119]=t('
julia
Base.convert(::Type{Union{Intervals, RangeDomain}}, d::Union{Intervals, RangeDomain})

Extends Base.convert for domains.

source

',3))]),s[181]||(s[181]=i("h2",{id:"exploration",tabindex:"-1"},[a("Exploration "),i("a",{class:"header-anchor",href:"#exploration","aria-label":'Permalink to "Exploration"'},"​")],-1)),i("details",X,[i("summary",null,[s[120]||(s[120]=i("a",{id:"ConstraintDomains.Explorer-constraints-61_constraint_domains",href:"#ConstraintDomains.Explorer-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.Explorer")],-1)),s[121]||(s[121]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[122]||(s[122]=t(`

Explorer(concepts, domains, objective = nothing; settings = ExploreSettings(domains))

Create an Explorer object for searching a constraint satisfaction problem space.

Arguments

  • concepts: A collection of tuples, each containing a concept function and its associated variable indices.

  • domains: A collection of domains representing the search space.

  • objective: An optional objective function for optimization problems.

  • settings: An ExploreSettings object to configure the exploration process.

Returns

An Explorer object ready for exploration.

Example

julia
domains = [domain([1, 2, 3]), domain([4, 5, 6])]
+d5 = domain(1,42,86.9)

source

`,10))]),i("details",S,[i("summary",null,[s[84]||(s[84]=i("a",{id:"ConstraintDomains.domain_size-constraints-62_constraint_domains-3",href:"#ConstraintDomains.domain_size-constraints-62_constraint_domains-3"},[i("span",{class:"jlbinding"},"ConstraintDomains.domain_size")],-1)),s[85]||(s[85]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[86]||(s[86]=t('
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

',9))]),i("details",z,[i("summary",null,[s[87]||(s[87]=i("a",{id:"ConstraintDomains.add!-constraints-62_constraint_domains",href:"#ConstraintDomains.add!-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.add!")],-1)),s[88]||(s[88]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[89]||(s[89]=t('
julia
add!(d::SetDomain, value)

Add value to the list of points in d.

source

',3))]),i("details",q,[i("summary",null,[s[90]||(s[90]=i("a",{id:"ConstraintDomains.merge_domains-constraints-62_constraint_domains-2",href:"#ConstraintDomains.merge_domains-constraints-62_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.merge_domains")],-1)),s[91]||(s[91]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[92]||(s[92]=t('
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source

',3))]),i("details",N,[i("summary",null,[s[93]||(s[93]=i("a",{id:"ConstraintDomains.intersect_domains-constraints-62_constraint_domains-2",href:"#ConstraintDomains.intersect_domains-constraints-62_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.intersect_domains")],-1)),s[94]||(s[94]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[95]||(s[95]=t('
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

',3))]),i("details",M,[i("summary",null,[s[96]||(s[96]=i("a",{id:"ConstraintDomains.size-constraints-62_constraint_domains-2",href:"#ConstraintDomains.size-constraints-62_constraint_domains-2"},[i("span",{class:"jlbinding"},"ConstraintDomains.size")],-1)),s[97]||(s[97]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[98]||(s[98]=t('
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source

',3))]),s[179]||(s[179]=i("h3",{id:"Extension-to-Base-module-3",tabindex:"-1"},[a("Extension to Base module "),i("a",{class:"header-anchor",href:"#Extension-to-Base-module-3","aria-label":'Permalink to "Extension to Base module {#Extension-to-Base-module-3}"'},"​")],-1)),i("details",U,[i("summary",null,[s[99]||(s[99]=i("a",{id:"Base.delete!-constraints-62_constraint_domains",href:"#Base.delete!-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"Base.delete!")],-1)),s[100]||(s[100]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[101]||(s[101]=t('
julia
Base.delete!(d::SetDomain, value)(d::SetDomain, value)

Delete value from the list of points in d.

source

',3))]),i("details",G,[i("summary",null,[s[102]||(s[102]=i("a",{id:"Base.length-constraints-62_constraint_domains-2",href:"#Base.length-constraints-62_constraint_domains-2"},[i("span",{class:"jlbinding"},"Base.length")],-1)),s[103]||(s[103]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[104]||(s[104]=t('
julia
length(layer)

Return the number of operations in a layer.

source

julia
Base.length(icn)

Return the total number of operations of an ICN.

source

julia
length(pf<:PatternFold)

Return the length of pf if unfolded.

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

',18))]),i("details",$,[i("summary",null,[s[105]||(s[105]=i("a",{id:"Base.rand-constraints-62_constraint_domains-4",href:"#Base.rand-constraints-62_constraint_domains-4"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[106]||(s[106]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[107]||(s[107]=t('
julia
Base.rand(::Vector{IntervalsFold})

Extend the Base.rand function to Vector{IntervalsFold}.

source

julia
rand(pf<:PatternFold)

Returns a random value of pf as if it was unfolded.

source

julia
Base.rand(::Vector{AbstractVectorFold})\nExtend the `Base.rand` function to `Vector{AbstractVectorFold}`.

source

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)\nBase.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

',20))]),i("details",H,[i("summary",null,[s[108]||(s[108]=i("a",{id:"Base.in-constraints-62_constraint_domains-3",href:"#Base.in-constraints-62_constraint_domains-3"},[i("span",{class:"jlbinding"},"Base.in")],-1)),s[109]||(s[109]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[110]||(s[110]=t('
julia
x::Variable constraint\nvalue  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source

',15))]),i("details",K,[i("summary",null,[s[111]||(s[111]=i("a",{id:"Base.string-constraints-62_constraint_domains-3",href:"#Base.string-constraints-62_constraint_domains-3"},[i("span",{class:"jlbinding"},"Base.string")],-1)),s[112]||(s[112]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[113]||(s[113]=t(`
julia
Base.string(D::Vector{<:AbstractDomain})
+Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source

`,3))]),s[180]||(s[180]=t('

Performances

Bench Evolution DiscreteChair Evolution Discrete

General

',3)),i("details",Q,[i("summary",null,[s[114]||(s[114]=i("a",{id:"Base.eltype-constraints-62_constraint_domains",href:"#Base.eltype-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"Base.eltype")],-1)),s[115]||(s[115]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[116]||(s[116]=t('
julia
Base.eltype(::AbstractDomain)

Extend eltype for domains.

source

',3))]),i("details",W,[i("summary",null,[s[117]||(s[117]=i("a",{id:"Base.convert-constraints-62_constraint_domains",href:"#Base.convert-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"Base.convert")],-1)),s[118]||(s[118]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[119]||(s[119]=t('
julia
Base.convert(::Type{Union{Intervals, RangeDomain}}, d::Union{Intervals, RangeDomain})

Extends Base.convert for domains.

source

',3))]),s[181]||(s[181]=i("h2",{id:"exploration",tabindex:"-1"},[a("Exploration "),i("a",{class:"header-anchor",href:"#exploration","aria-label":'Permalink to "Exploration"'},"​")],-1)),i("details",X,[i("summary",null,[s[120]||(s[120]=i("a",{id:"ConstraintDomains.Explorer-constraints-62_constraint_domains",href:"#ConstraintDomains.Explorer-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.Explorer")],-1)),s[121]||(s[121]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[122]||(s[122]=t(`

Explorer(concepts, domains, objective = nothing; settings = ExploreSettings(domains))

Create an Explorer object for searching a constraint satisfaction problem space.

Arguments

  • concepts: A collection of tuples, each containing a concept function and its associated variable indices.

  • domains: A collection of domains representing the search space.

  • objective: An optional objective function for optimization problems.

  • settings: An ExploreSettings object to configure the exploration process.

Returns

An Explorer object ready for exploration.

Example

julia
domains = [domain([1, 2, 3]), domain([4, 5, 6])]
 concepts = [(sum, [1, 2])]
 objective = x -> x[1] + x[2]
-explorer = Explorer(concepts, domains, objective)

source

`,9))]),i("details",Y,[i("summary",null,[s[123]||(s[123]=i("a",{id:"ConstraintDomains.ExploreSettings-constraints-61_constraint_domains",href:"#ConstraintDomains.ExploreSettings-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ExploreSettings")],-1)),s[124]||(s[124]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[125]||(s[125]=t(`
julia
ExploreSettings(
+explorer = Explorer(concepts, domains, objective)

source

`,9))]),i("details",Y,[i("summary",null,[s[123]||(s[123]=i("a",{id:"ConstraintDomains.ExploreSettings-constraints-62_constraint_domains",href:"#ConstraintDomains.ExploreSettings-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ExploreSettings")],-1)),s[124]||(s[124]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[125]||(s[125]=t(`
julia
ExploreSettings(
     domains;
     complete_search_limit = 10^6,
     max_samplings = sum(domain_size, domains),
     search = :flexible,
     solutions_limit = floor(Int, sqrt(max_samplings)),
 )

Create settings for the exploration of a search space composed by a collection of domains.

Arguments

  • domains: A collection of domains representing the search space.

  • complete_search_limit: Maximum size of the search space for complete search.

  • max_samplings: Maximum number of samples to take during partial search.

  • search: Search strategy (:flexible, :complete, or :partial).

  • solutions_limit: Maximum number of solutions to store.

Returns

An ExploreSettings object.

Example

julia
domains = [domain([1, 2, 3]), domain([4, 5, 6])]
-settings = ExploreSettings(domains, search = :complete)

source

`,9))]),i("details",Z,[i("summary",null,[s[126]||(s[126]=i("a",{id:"ConstraintDomains.explore!-constraints-61_constraint_domains",href:"#ConstraintDomains.explore!-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.explore!")],-1)),s[127]||(s[127]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[128]||(s[128]=t(`
julia
explore!(explorer::Explorer)

Perform exploration on the search space defined by the Explorer object.

This function explores the search space according to the settings specified in the Explorer object. It updates the Explorer's state with found solutions and non-solutions.

Arguments

  • explorer: An Explorer object containing the problem definition and exploration settings.

Returns

Nothing. The Explorer's state is updated in-place.

Example

julia
explorer = Explorer(concepts, domains)
+settings = ExploreSettings(domains, search = :complete)

source

`,9))]),i("details",Z,[i("summary",null,[s[126]||(s[126]=i("a",{id:"ConstraintDomains.explore!-constraints-62_constraint_domains",href:"#ConstraintDomains.explore!-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.explore!")],-1)),s[127]||(s[127]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[128]||(s[128]=t(`
julia
explore!(explorer::Explorer)

Perform exploration on the search space defined by the Explorer object.

This function explores the search space according to the settings specified in the Explorer object. It updates the Explorer's state with found solutions and non-solutions.

Arguments

  • explorer: An Explorer object containing the problem definition and exploration settings.

Returns

Nothing. The Explorer's state is updated in-place.

Example

julia
explorer = Explorer(concepts, domains)
 explore!(explorer)
-println("Solutions found: ", length(explorer.state.solutions))

source

`,10))]),i("details",ss,[i("summary",null,[s[129]||(s[129]=i("a",{id:"ConstraintDomains.explore-constraints-61_constraint_domains",href:"#ConstraintDomains.explore-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.explore")],-1)),s[130]||(s[130]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[131]||(s[131]=t(`
julia
explore(domains, concept; settings = ExploreSettings(domains), parameters...)

Explore a search space defined by domains and a concept.

Arguments

  • domains: A collection of domains representing the search space.

  • concept: The concept function defining the constraint.

  • settings: An ExploreSettings object to configure the exploration process.

  • parameters: Additional parameters to pass to the concept function.

Returns

A tuple containing two sets: (solutions, non_solutions).

Example

julia
domains = [domain([1, 2, 3]), domain([4, 5, 6])]
-solutions, non_solutions = explore(domains, allunique)

source

`,9))]),s[182]||(s[182]=t('

Performances

Bench Evolution ExplorationChair Evolution Exploration

Parameters

',3)),i("details",is,[i("summary",null,[s[132]||(s[132]=i("a",{id:"ConstraintDomains.BoolParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.BoolParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.BoolParameterDomain")],-1)),s[133]||(s[133]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[134]||(s[134]=t('
julia
BoolParameterDomain <: AbstractDomain

A domain to store boolean values. It is used to generate random parameters.

source

',3))]),i("details",as,[i("summary",null,[s[135]||(s[135]=i("a",{id:"ConstraintDomains.DimParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.DimParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.DimParameterDomain")],-1)),s[136]||(s[136]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[137]||(s[137]=t('
julia
DimParameterDomain <: AbstractDomain

A domain to store dimensions. It is used to generate random parameters.

source

',3))]),i("details",ts,[i("summary",null,[s[138]||(s[138]=i("a",{id:"ConstraintDomains.IdParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.IdParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.IdParameterDomain")],-1)),s[139]||(s[139]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[140]||(s[140]=t('
julia
IdParameterDomain <: AbstractDomain

A domain to store ids. It is used to generate random parameters.

source

',3))]),i("details",ns,[i("summary",null,[s[141]||(s[141]=i("a",{id:"ConstraintDomains.FakeAutomaton-constraints-61_constraint_domains",href:"#ConstraintDomains.FakeAutomaton-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.FakeAutomaton")],-1)),s[142]||(s[142]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[143]||(s[143]=t('
julia
FakeAutomaton{T} <: ConstraintCommons.AbstractAutomaton

A structure to generate pseudo automaton enough for parameter exploration.

source

',3))]),i("details",es,[i("summary",null,[s[144]||(s[144]=i("a",{id:"ConstraintCommons.accept-constraints-61_constraint_domains",href:"#ConstraintCommons.accept-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintCommons.accept")],-1)),s[145]||(s[145]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[146]||(s[146]=t('
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

',6))]),i("details",ls,[i("summary",null,[s[147]||(s[147]=i("a",{id:"ConstraintDomains.fake_automaton-constraints-61_constraint_domains",href:"#ConstraintDomains.fake_automaton-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.fake_automaton")],-1)),s[148]||(s[148]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[149]||(s[149]=t('
julia
fake_automaton(d)

Construct a FakeAutomaton.

source

',3))]),i("details",ps,[i("summary",null,[s[150]||(s[150]=i("a",{id:"ConstraintDomains.LanguageParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.LanguageParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.LanguageParameterDomain")],-1)),s[151]||(s[151]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[152]||(s[152]=t('
julia
LanguageParameterDomain <: AbstractDomain

A domain to store languages. It is used to generate random parameters.

source

',3))]),i("details",hs,[i("summary",null,[s[153]||(s[153]=i("a",{id:"ConstraintDomains.OpParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.OpParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.OpParameterDomain")],-1)),s[154]||(s[154]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[155]||(s[155]=t('
julia
OpParameterDomain{T} <: AbstractDomain

A domain to store operators. It is used to generate random parameters.

source

',3))]),i("details",os,[i("summary",null,[s[156]||(s[156]=i("a",{id:"ConstraintDomains.PairVarsParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.PairVarsParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.PairVarsParameterDomain")],-1)),s[157]||(s[157]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[158]||(s[158]=t('
julia
PairVarsParameterDomain{T} <: AbstractDomain

A domain to store values paired with variables. It is used to generate random parameters.

source

',3))]),i("details",rs,[i("summary",null,[s[159]||(s[159]=i("a",{id:"ConstraintDomains.ValParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.ValParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ValParameterDomain")],-1)),s[160]||(s[160]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[161]||(s[161]=t('
julia
ValParameterDomain{T} <: AbstractDomain

A domain to store one value. It is used to generate random parameters.

source

',3))]),i("details",ks,[i("summary",null,[s[162]||(s[162]=i("a",{id:"ConstraintDomains.ValsParameterDomain-constraints-61_constraint_domains",href:"#ConstraintDomains.ValsParameterDomain-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ValsParameterDomain")],-1)),s[163]||(s[163]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[164]||(s[164]=t('
julia
ValsParameterDomain{T} <: AbstractDomain

A domain to store values. It is used to generate random parameters.

source

',3))]),i("details",ds,[i("summary",null,[s[165]||(s[165]=i("a",{id:"Base.rand-constraints-61_constraint_domains-5",href:"#Base.rand-constraints-61_constraint_domains-5"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[166]||(s[166]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[167]||(s[167]=t(`
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

`,12))]),i("details",cs,[i("summary",null,[s[168]||(s[168]=i("a",{id:"ConstraintDomains.generate_parameters-constraints-61_constraint_domains",href:"#ConstraintDomains.generate_parameters-constraints-61_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.generate_parameters")],-1)),s[169]||(s[169]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[170]||(s[170]=t('
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source

',3))])])}const vs=l(r,[["render",gs]]);export{Fs as __pageData,vs as default}; +println("Solutions found: ", length(explorer.state.solutions))

source

`,10))]),i("details",ss,[i("summary",null,[s[129]||(s[129]=i("a",{id:"ConstraintDomains.explore-constraints-62_constraint_domains",href:"#ConstraintDomains.explore-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.explore")],-1)),s[130]||(s[130]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[131]||(s[131]=t(`
julia
explore(domains, concept; settings = ExploreSettings(domains), parameters...)

Explore a search space defined by domains and a concept.

Arguments

  • domains: A collection of domains representing the search space.

  • concept: The concept function defining the constraint.

  • settings: An ExploreSettings object to configure the exploration process.

  • parameters: Additional parameters to pass to the concept function.

Returns

A tuple containing two sets: (solutions, non_solutions).

Example

julia
domains = [domain([1, 2, 3]), domain([4, 5, 6])]
+solutions, non_solutions = explore(domains, allunique)

source

`,9))]),s[182]||(s[182]=t('

Performances

Bench Evolution ExplorationChair Evolution Exploration

Parameters

',3)),i("details",is,[i("summary",null,[s[132]||(s[132]=i("a",{id:"ConstraintDomains.BoolParameterDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.BoolParameterDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.BoolParameterDomain")],-1)),s[133]||(s[133]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[134]||(s[134]=t('
julia
BoolParameterDomain <: AbstractDomain

A domain to store boolean values. It is used to generate random parameters.

source

',3))]),i("details",as,[i("summary",null,[s[135]||(s[135]=i("a",{id:"ConstraintDomains.DimParameterDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.DimParameterDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.DimParameterDomain")],-1)),s[136]||(s[136]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[137]||(s[137]=t('
julia
DimParameterDomain <: AbstractDomain

A domain to store dimensions. It is used to generate random parameters.

source

',3))]),i("details",ts,[i("summary",null,[s[138]||(s[138]=i("a",{id:"ConstraintDomains.IdParameterDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.IdParameterDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.IdParameterDomain")],-1)),s[139]||(s[139]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[140]||(s[140]=t('
julia
IdParameterDomain <: AbstractDomain

A domain to store ids. It is used to generate random parameters.

source

',3))]),i("details",ns,[i("summary",null,[s[141]||(s[141]=i("a",{id:"ConstraintDomains.FakeAutomaton-constraints-62_constraint_domains",href:"#ConstraintDomains.FakeAutomaton-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.FakeAutomaton")],-1)),s[142]||(s[142]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[143]||(s[143]=t('
julia
FakeAutomaton{T} <: ConstraintCommons.AbstractAutomaton

A structure to generate pseudo automaton enough for parameter exploration.

source

',3))]),i("details",es,[i("summary",null,[s[144]||(s[144]=i("a",{id:"ConstraintCommons.accept-constraints-62_constraint_domains",href:"#ConstraintCommons.accept-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintCommons.accept")],-1)),s[145]||(s[145]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[146]||(s[146]=t('
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

',6))]),i("details",ls,[i("summary",null,[s[147]||(s[147]=i("a",{id:"ConstraintDomains.fake_automaton-constraints-62_constraint_domains",href:"#ConstraintDomains.fake_automaton-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.fake_automaton")],-1)),s[148]||(s[148]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[149]||(s[149]=t('
julia
fake_automaton(d)

Construct a FakeAutomaton.

source

',3))]),i("details",ps,[i("summary",null,[s[150]||(s[150]=i("a",{id:"ConstraintDomains.LanguageParameterDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.LanguageParameterDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.LanguageParameterDomain")],-1)),s[151]||(s[151]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[152]||(s[152]=t('
julia
LanguageParameterDomain <: AbstractDomain

A domain to store languages. It is used to generate random parameters.

source

',3))]),i("details",hs,[i("summary",null,[s[153]||(s[153]=i("a",{id:"ConstraintDomains.OpParameterDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.OpParameterDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.OpParameterDomain")],-1)),s[154]||(s[154]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[155]||(s[155]=t('
julia
OpParameterDomain{T} <: AbstractDomain

A domain to store operators. It is used to generate random parameters.

source

',3))]),i("details",os,[i("summary",null,[s[156]||(s[156]=i("a",{id:"ConstraintDomains.PairVarsParameterDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.PairVarsParameterDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.PairVarsParameterDomain")],-1)),s[157]||(s[157]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[158]||(s[158]=t('
julia
PairVarsParameterDomain{T} <: AbstractDomain

A domain to store values paired with variables. It is used to generate random parameters.

source

',3))]),i("details",rs,[i("summary",null,[s[159]||(s[159]=i("a",{id:"ConstraintDomains.ValParameterDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.ValParameterDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ValParameterDomain")],-1)),s[160]||(s[160]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[161]||(s[161]=t('
julia
ValParameterDomain{T} <: AbstractDomain

A domain to store one value. It is used to generate random parameters.

source

',3))]),i("details",ks,[i("summary",null,[s[162]||(s[162]=i("a",{id:"ConstraintDomains.ValsParameterDomain-constraints-62_constraint_domains",href:"#ConstraintDomains.ValsParameterDomain-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.ValsParameterDomain")],-1)),s[163]||(s[163]=a()),e(n,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[164]||(s[164]=t('
julia
ValsParameterDomain{T} <: AbstractDomain

A domain to store values. It is used to generate random parameters.

source

',3))]),i("details",ds,[i("summary",null,[s[165]||(s[165]=i("a",{id:"Base.rand-constraints-62_constraint_domains-5",href:"#Base.rand-constraints-62_constraint_domains-5"},[i("span",{class:"jlbinding"},"Base.rand")],-1)),s[166]||(s[166]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[167]||(s[167]=t('
julia
Base.rand(::Vector{IntervalsFold})

Extend the Base.rand function to Vector{IntervalsFold}.

source

julia
rand(pf<:PatternFold)

Returns a random value of pf as if it was unfolded.

source

julia
Base.rand(::Vector{AbstractVectorFold})\nExtend the `Base.rand` function to `Vector{AbstractVectorFold}`.

source

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)\nBase.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

',20))]),i("details",cs,[i("summary",null,[s[168]||(s[168]=i("a",{id:"ConstraintDomains.generate_parameters-constraints-62_constraint_domains",href:"#ConstraintDomains.generate_parameters-constraints-62_constraint_domains"},[i("span",{class:"jlbinding"},"ConstraintDomains.generate_parameters")],-1)),s[169]||(s[169]=a()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[170]||(s[170]=t('
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source

',3))])])}const vs=l(r,[["render",gs]]);export{Fs as __pageData,vs as default}; diff --git a/dev/assets/constraints_62_constraints_jl.md.j1FaSS8o.js b/dev/assets/constraints_63_constraints_jl.md.WJF85byi.js similarity index 95% rename from dev/assets/constraints_62_constraints_jl.md.j1FaSS8o.js rename to dev/assets/constraints_63_constraints_jl.md.WJF85byi.js index d3fa617..6e2ce8e 100644 --- a/dev/assets/constraints_62_constraints_jl.md.j1FaSS8o.js +++ b/dev/assets/constraints_63_constraints_jl.md.WJF85byi.js @@ -1,4 +1,4 @@ -import{_ as r,c as l,a5 as a,j as t,a as i,G as e,B as p,o}from"./chunks/framework.CJakPlgM.js";const S=JSON.parse('{"title":"Interacting with Constraints in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/62_constraints_jl.md","filePath":"constraints/62_constraints_jl.md","lastUpdated":null}'),h={name:"constraints/62_constraints_jl.md"},d={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},k={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.76ex",height:"1.557ex",role:"img",focusable:"false",viewBox:"0 -666 778 688","aria-hidden":"true"},g={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},m={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.76ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 778 666","aria-hidden":"true"},C={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""};function v(j,s,F,x,A,T){const n=p("Badge");return o(),l("div",null,[s[30]||(s[30]=a('

Interacting with Constraints in Julia

Constraints.jl is a pivotal package within Julia Constraints, designed to facilitate the definition, manipulation, and application of constraints in constraint programming (CP).

It also acts as a catalog of various information and features learned about constraints by the learning part of the ecosystem. Per design, we only store the practical information extracted by those tools and not the heavy machinery.

Usual Parameters

The usual constraints of Julia Constraints are heavily inspired by the core constraints of the XCSP3-core standard. The main difference lies in the name chosen to describe the different parameters those core constraints can have.

In XCSP3, the parameters are described based on their roles, which the user can find as keyword argument in the xcsp_ prefixed collection of constraints (for instance xcsp_all_different). In our the Julia Constraints API (JC-API), the keyword arguments correspond to the nature of each parameter.

',6)),t("details",d,[t("summary",null,[s[0]||(s[0]=t("a",{id:"ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS-constraints-62_constraints_jl",href:"#ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS")],-1)),s[1]||(s[1]=i()),e(n,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[2]||(s[2]=a(`
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
+import{_ as r,c as l,a5 as a,j as t,a as i,G as e,B as p,o}from"./chunks/framework.CJakPlgM.js";const S=JSON.parse('{"title":"Interacting with Constraints in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/63_constraints_jl.md","filePath":"constraints/63_constraints_jl.md","lastUpdated":null}'),h={name:"constraints/63_constraints_jl.md"},d={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},k={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.76ex",height:"1.557ex",role:"img",focusable:"false",viewBox:"0 -666 778 688","aria-hidden":"true"},g={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},m={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.76ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 778 666","aria-hidden":"true"},C={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""};function v(j,s,F,x,A,T){const n=p("Badge");return o(),l("div",null,[s[30]||(s[30]=a('

Interacting with Constraints in Julia

Constraints.jl is a pivotal package within Julia Constraints, designed to facilitate the definition, manipulation, and application of constraints in constraint programming (CP).

It also acts as a catalog of various information and features learned about constraints by the learning part of the ecosystem. Per design, we only store the practical information extracted by those tools and not the heavy machinery.

Usual Parameters

The usual constraints of Julia Constraints are heavily inspired by the core constraints of the XCSP3-core standard. The main difference lies in the name chosen to describe the different parameters those core constraints can have.

In XCSP3, the parameters are described based on their roles, which the user can find as keyword argument in the xcsp_ prefixed collection of constraints (for instance xcsp_all_different). In our the Julia Constraints API (JC-API), the keyword arguments correspond to the nature of each parameter.

',6)),t("details",d,[t("summary",null,[s[0]||(s[0]=t("a",{id:"ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS-constraints-63_constraints_jl",href:"#ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS-constraints-63_constraints_jl"},[t("span",{class:"jlbinding"},"ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS")],-1)),s[1]||(s[1]=i()),e(n,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[2]||(s[2]=a(`
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
     :bool, # boolean parameter
     :dim, # dimension, an integer parameter used along the pair_vars or vals parameters
     :id, # index to target one variable in the input vector
@@ -7,4 +7,4 @@ import{_ as r,c as l,a5 as a,j as t,a as i,G as e,B as p,o}from"./chunks/framewo
     :pair_vars, # a list of parameters that are paired with each variable in the input vector
     :val, # one scalar value
     :vals, # a list of scalar values (independent of the input vector size)
-]

source

`,4))]),s[31]||(s[31]=t("h2",{id:"Concepts,-Error-Functions,-and-QUBO-matrices",tabindex:"-1"},[i("Concepts, Error Functions, and QUBO matrices "),t("a",{class:"header-anchor",href:"#Concepts,-Error-Functions,-and-QUBO-matrices","aria-label":'Permalink to "Concepts, Error Functions, and QUBO matrices {#Concepts,-Error-Functions,-and-QUBO-matrices}"'},"​")],-1)),s[32]||(s[32]=t("p",null,[i("One major use of this collection of usual constraint is to extract the "),t("code",null,"concept"),i(" or the error function ("),t("code",null,"error_f"),i(") of a given constraint.")],-1)),t("details",c,[t("summary",null,[s[3]||(s[3]=t("a",{id:"Constraints.concept-constraints-62_constraints_jl",href:"#Constraints.concept-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[4]||(s[4]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=a('
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source

julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

  • s::Symbol: the constraint name.

  • args...: the arguments to apply the concept to.

  • kargs...: the keyword arguments to apply the concept to.

Example

julia
concept(:all_different, [1, 2, 3])

source

',10))]),t("p",null,[s[10]||(s[10]=i("Note that the error function is a finer estimation of how much a constraint is violated or not. By default, the ")),s[11]||(s[11]=t("code",null,"error_f",-1)),s[12]||(s[12]=i(" method simply return ")),t("mjx-container",k,[(o(),l("svg",u,s[6]||(s[6]=[a('',1)]))),s[7]||(s[7]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"0.")])],-1))]),s[13]||(s[13]=i(" if the constraint is satisfied or ")),t("mjx-container",g,[(o(),l("svg",m,s[8]||(s[8]=[a('',1)]))),s[9]||(s[9]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"1.")])],-1))]),s[14]||(s[14]=i(" otherwise."))]),s[33]||(s[33]=t("p",null,[i("Efficient versions of "),t("code",null,"error_r"),i(" are either hand-coded or generated through "),t("code",null,"CompositionalNetworks.jl"),i(".")],-1)),t("details",C,[t("summary",null,[s[15]||(s[15]=t("a",{id:"Constraints.error_f-constraints-62_constraints_jl",href:"#Constraints.error_f-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.error_f")],-1)),s[16]||(s[16]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=a('
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source

',3))]),s[34]||(s[34]=t("p",null,[i("Finally, another use is to provide "),t("code",null,"QUBO"),i(" matrices of those usual constraints through "),t("code",null,"QUBOConstraints.jl"),i(". The syntax and interface for this feature are still a work in progress.")],-1)),s[35]||(s[35]=t("h2",{id:"Usual-Constraints",tabindex:"-1"},[i("Usual Constraints "),t("a",{class:"header-anchor",href:"#Usual-Constraints","aria-label":'Permalink to "Usual Constraints {#Usual-Constraints}"'},"​")],-1)),s[36]||(s[36]=t("p",null,[i("We provide a couple of methods to navigate the usual constraints extracted from "),t("em",null,"XCSP3-Core"),i(".")],-1)),t("details",y,[t("summary",null,[s[18]||(s[18]=t("a",{id:"Constraints.USUAL_CONSTRAINTS-constraints-62_constraints_jl",href:"#Constraints.USUAL_CONSTRAINTS-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.USUAL_CONSTRAINTS")],-1)),s[19]||(s[19]=i()),e(n,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[20]||(s[20]=a('
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source

',6))]),t("details",E,[t("summary",null,[s[21]||(s[21]=t("a",{id:"Constraints.describe-constraints-62_constraints_jl",href:"#Constraints.describe-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.describe")],-1)),s[22]||(s[22]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[23]||(s[23]=a('
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

  • constraints::Dict{Symbol,Constraint}: dictionary of constraints to describe. Default is USUAL_CONSTRAINTS.

  • width::Int: width of the table.

Example

julia
describe()

source

',7))]),t("details",b,[t("summary",null,[s[24]||(s[24]=t("a",{id:"Constraints.constraints_parameters-constraints-62_constraints_jl",href:"#Constraints.constraints_parameters-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.constraints_parameters")],-1)),s[25]||(s[25]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=a('
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_parameters()

source

',7))]),t("details",f,[t("summary",null,[s[27]||(s[27]=t("a",{id:"Constraints.constraints_descriptions-constraints-62_constraints_jl",href:"#Constraints.constraints_descriptions-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.constraints_descriptions")],-1)),s[28]||(s[28]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[29]||(s[29]=a('
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_descriptions()

source

',7))])])}const _=r(h,[["render",v]]);export{S as __pageData,_ as default}; +]

source

`,4))]),s[31]||(s[31]=t("h2",{id:"Concepts,-Error-Functions,-and-QUBO-matrices",tabindex:"-1"},[i("Concepts, Error Functions, and QUBO matrices "),t("a",{class:"header-anchor",href:"#Concepts,-Error-Functions,-and-QUBO-matrices","aria-label":'Permalink to "Concepts, Error Functions, and QUBO matrices {#Concepts,-Error-Functions,-and-QUBO-matrices}"'},"​")],-1)),s[32]||(s[32]=t("p",null,[i("One major use of this collection of usual constraint is to extract the "),t("code",null,"concept"),i(" or the error function ("),t("code",null,"error_f"),i(") of a given constraint.")],-1)),t("details",c,[t("summary",null,[s[3]||(s[3]=t("a",{id:"Constraints.concept-constraints-63_constraints_jl",href:"#Constraints.concept-constraints-63_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[4]||(s[4]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=a('
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source

julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

  • s::Symbol: the constraint name.

  • args...: the arguments to apply the concept to.

  • kargs...: the keyword arguments to apply the concept to.

Example

julia
concept(:all_different, [1, 2, 3])

source

',10))]),t("p",null,[s[10]||(s[10]=i("Note that the error function is a finer estimation of how much a constraint is violated or not. By default, the ")),s[11]||(s[11]=t("code",null,"error_f",-1)),s[12]||(s[12]=i(" method simply return ")),t("mjx-container",k,[(o(),l("svg",u,s[6]||(s[6]=[a('',1)]))),s[7]||(s[7]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"0.")])],-1))]),s[13]||(s[13]=i(" if the constraint is satisfied or ")),t("mjx-container",g,[(o(),l("svg",m,s[8]||(s[8]=[a('',1)]))),s[9]||(s[9]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"1.")])],-1))]),s[14]||(s[14]=i(" otherwise."))]),s[33]||(s[33]=t("p",null,[i("Efficient versions of "),t("code",null,"error_r"),i(" are either hand-coded or generated through "),t("code",null,"CompositionalNetworks.jl"),i(".")],-1)),t("details",C,[t("summary",null,[s[15]||(s[15]=t("a",{id:"Constraints.error_f-constraints-63_constraints_jl",href:"#Constraints.error_f-constraints-63_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.error_f")],-1)),s[16]||(s[16]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=a('
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source

',3))]),s[34]||(s[34]=t("p",null,[i("Finally, another use is to provide "),t("code",null,"QUBO"),i(" matrices of those usual constraints through "),t("code",null,"QUBOConstraints.jl"),i(". The syntax and interface for this feature are still a work in progress.")],-1)),s[35]||(s[35]=t("h2",{id:"Usual-Constraints",tabindex:"-1"},[i("Usual Constraints "),t("a",{class:"header-anchor",href:"#Usual-Constraints","aria-label":'Permalink to "Usual Constraints {#Usual-Constraints}"'},"​")],-1)),s[36]||(s[36]=t("p",null,[i("We provide a couple of methods to navigate the usual constraints extracted from "),t("em",null,"XCSP3-Core"),i(".")],-1)),t("details",y,[t("summary",null,[s[18]||(s[18]=t("a",{id:"Constraints.USUAL_CONSTRAINTS-constraints-63_constraints_jl",href:"#Constraints.USUAL_CONSTRAINTS-constraints-63_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.USUAL_CONSTRAINTS")],-1)),s[19]||(s[19]=i()),e(n,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[20]||(s[20]=a('
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source

',6))]),t("details",E,[t("summary",null,[s[21]||(s[21]=t("a",{id:"Constraints.describe-constraints-63_constraints_jl",href:"#Constraints.describe-constraints-63_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.describe")],-1)),s[22]||(s[22]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[23]||(s[23]=a('
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

  • constraints::Dict{Symbol,Constraint}: dictionary of constraints to describe. Default is USUAL_CONSTRAINTS.

  • width::Int: width of the table.

Example

julia
describe()

source

',7))]),t("details",b,[t("summary",null,[s[24]||(s[24]=t("a",{id:"Constraints.constraints_parameters-constraints-63_constraints_jl",href:"#Constraints.constraints_parameters-constraints-63_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.constraints_parameters")],-1)),s[25]||(s[25]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=a('
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_parameters()

source

',7))]),t("details",f,[t("summary",null,[s[27]||(s[27]=t("a",{id:"Constraints.constraints_descriptions-constraints-63_constraints_jl",href:"#Constraints.constraints_descriptions-constraints-63_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.constraints_descriptions")],-1)),s[28]||(s[28]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[29]||(s[29]=a('
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_descriptions()

source

',7))])])}const _=r(h,[["render",v]]);export{S as __pageData,_ as default}; diff --git a/dev/assets/constraints_62_constraints_jl.md.j1FaSS8o.lean.js b/dev/assets/constraints_63_constraints_jl.md.WJF85byi.lean.js similarity index 95% rename from dev/assets/constraints_62_constraints_jl.md.j1FaSS8o.lean.js rename to dev/assets/constraints_63_constraints_jl.md.WJF85byi.lean.js index d3fa617..6e2ce8e 100644 --- a/dev/assets/constraints_62_constraints_jl.md.j1FaSS8o.lean.js +++ b/dev/assets/constraints_63_constraints_jl.md.WJF85byi.lean.js @@ -1,4 +1,4 @@ -import{_ as r,c as l,a5 as a,j as t,a as i,G as e,B as p,o}from"./chunks/framework.CJakPlgM.js";const S=JSON.parse('{"title":"Interacting with Constraints in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/62_constraints_jl.md","filePath":"constraints/62_constraints_jl.md","lastUpdated":null}'),h={name:"constraints/62_constraints_jl.md"},d={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},k={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.76ex",height:"1.557ex",role:"img",focusable:"false",viewBox:"0 -666 778 688","aria-hidden":"true"},g={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},m={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.76ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 778 666","aria-hidden":"true"},C={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""};function v(j,s,F,x,A,T){const n=p("Badge");return o(),l("div",null,[s[30]||(s[30]=a('

Interacting with Constraints in Julia

Constraints.jl is a pivotal package within Julia Constraints, designed to facilitate the definition, manipulation, and application of constraints in constraint programming (CP).

It also acts as a catalog of various information and features learned about constraints by the learning part of the ecosystem. Per design, we only store the practical information extracted by those tools and not the heavy machinery.

Usual Parameters

The usual constraints of Julia Constraints are heavily inspired by the core constraints of the XCSP3-core standard. The main difference lies in the name chosen to describe the different parameters those core constraints can have.

In XCSP3, the parameters are described based on their roles, which the user can find as keyword argument in the xcsp_ prefixed collection of constraints (for instance xcsp_all_different). In our the Julia Constraints API (JC-API), the keyword arguments correspond to the nature of each parameter.

',6)),t("details",d,[t("summary",null,[s[0]||(s[0]=t("a",{id:"ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS-constraints-62_constraints_jl",href:"#ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS")],-1)),s[1]||(s[1]=i()),e(n,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[2]||(s[2]=a(`
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
+import{_ as r,c as l,a5 as a,j as t,a as i,G as e,B as p,o}from"./chunks/framework.CJakPlgM.js";const S=JSON.parse('{"title":"Interacting with Constraints in Julia","description":"","frontmatter":{},"headers":[],"relativePath":"constraints/63_constraints_jl.md","filePath":"constraints/63_constraints_jl.md","lastUpdated":null}'),h={name:"constraints/63_constraints_jl.md"},d={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},k={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.76ex",height:"1.557ex",role:"img",focusable:"false",viewBox:"0 -666 778 688","aria-hidden":"true"},g={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},m={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.76ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 778 666","aria-hidden":"true"},C={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""};function v(j,s,F,x,A,T){const n=p("Badge");return o(),l("div",null,[s[30]||(s[30]=a('

Interacting with Constraints in Julia

Constraints.jl is a pivotal package within Julia Constraints, designed to facilitate the definition, manipulation, and application of constraints in constraint programming (CP).

It also acts as a catalog of various information and features learned about constraints by the learning part of the ecosystem. Per design, we only store the practical information extracted by those tools and not the heavy machinery.

Usual Parameters

The usual constraints of Julia Constraints are heavily inspired by the core constraints of the XCSP3-core standard. The main difference lies in the name chosen to describe the different parameters those core constraints can have.

In XCSP3, the parameters are described based on their roles, which the user can find as keyword argument in the xcsp_ prefixed collection of constraints (for instance xcsp_all_different). In our the Julia Constraints API (JC-API), the keyword arguments correspond to the nature of each parameter.

',6)),t("details",d,[t("summary",null,[s[0]||(s[0]=t("a",{id:"ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS-constraints-63_constraints_jl",href:"#ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS-constraints-63_constraints_jl"},[t("span",{class:"jlbinding"},"ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS")],-1)),s[1]||(s[1]=i()),e(n,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[2]||(s[2]=a(`
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
     :bool, # boolean parameter
     :dim, # dimension, an integer parameter used along the pair_vars or vals parameters
     :id, # index to target one variable in the input vector
@@ -7,4 +7,4 @@ import{_ as r,c as l,a5 as a,j as t,a as i,G as e,B as p,o}from"./chunks/framewo
     :pair_vars, # a list of parameters that are paired with each variable in the input vector
     :val, # one scalar value
     :vals, # a list of scalar values (independent of the input vector size)
-]

source

`,4))]),s[31]||(s[31]=t("h2",{id:"Concepts,-Error-Functions,-and-QUBO-matrices",tabindex:"-1"},[i("Concepts, Error Functions, and QUBO matrices "),t("a",{class:"header-anchor",href:"#Concepts,-Error-Functions,-and-QUBO-matrices","aria-label":'Permalink to "Concepts, Error Functions, and QUBO matrices {#Concepts,-Error-Functions,-and-QUBO-matrices}"'},"​")],-1)),s[32]||(s[32]=t("p",null,[i("One major use of this collection of usual constraint is to extract the "),t("code",null,"concept"),i(" or the error function ("),t("code",null,"error_f"),i(") of a given constraint.")],-1)),t("details",c,[t("summary",null,[s[3]||(s[3]=t("a",{id:"Constraints.concept-constraints-62_constraints_jl",href:"#Constraints.concept-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[4]||(s[4]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=a('
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source

julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

  • s::Symbol: the constraint name.

  • args...: the arguments to apply the concept to.

  • kargs...: the keyword arguments to apply the concept to.

Example

julia
concept(:all_different, [1, 2, 3])

source

',10))]),t("p",null,[s[10]||(s[10]=i("Note that the error function is a finer estimation of how much a constraint is violated or not. By default, the ")),s[11]||(s[11]=t("code",null,"error_f",-1)),s[12]||(s[12]=i(" method simply return ")),t("mjx-container",k,[(o(),l("svg",u,s[6]||(s[6]=[a('',1)]))),s[7]||(s[7]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"0.")])],-1))]),s[13]||(s[13]=i(" if the constraint is satisfied or ")),t("mjx-container",g,[(o(),l("svg",m,s[8]||(s[8]=[a('',1)]))),s[9]||(s[9]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"1.")])],-1))]),s[14]||(s[14]=i(" otherwise."))]),s[33]||(s[33]=t("p",null,[i("Efficient versions of "),t("code",null,"error_r"),i(" are either hand-coded or generated through "),t("code",null,"CompositionalNetworks.jl"),i(".")],-1)),t("details",C,[t("summary",null,[s[15]||(s[15]=t("a",{id:"Constraints.error_f-constraints-62_constraints_jl",href:"#Constraints.error_f-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.error_f")],-1)),s[16]||(s[16]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=a('
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source

',3))]),s[34]||(s[34]=t("p",null,[i("Finally, another use is to provide "),t("code",null,"QUBO"),i(" matrices of those usual constraints through "),t("code",null,"QUBOConstraints.jl"),i(". The syntax and interface for this feature are still a work in progress.")],-1)),s[35]||(s[35]=t("h2",{id:"Usual-Constraints",tabindex:"-1"},[i("Usual Constraints "),t("a",{class:"header-anchor",href:"#Usual-Constraints","aria-label":'Permalink to "Usual Constraints {#Usual-Constraints}"'},"​")],-1)),s[36]||(s[36]=t("p",null,[i("We provide a couple of methods to navigate the usual constraints extracted from "),t("em",null,"XCSP3-Core"),i(".")],-1)),t("details",y,[t("summary",null,[s[18]||(s[18]=t("a",{id:"Constraints.USUAL_CONSTRAINTS-constraints-62_constraints_jl",href:"#Constraints.USUAL_CONSTRAINTS-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.USUAL_CONSTRAINTS")],-1)),s[19]||(s[19]=i()),e(n,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[20]||(s[20]=a('
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source

',6))]),t("details",E,[t("summary",null,[s[21]||(s[21]=t("a",{id:"Constraints.describe-constraints-62_constraints_jl",href:"#Constraints.describe-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.describe")],-1)),s[22]||(s[22]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[23]||(s[23]=a('
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

  • constraints::Dict{Symbol,Constraint}: dictionary of constraints to describe. Default is USUAL_CONSTRAINTS.

  • width::Int: width of the table.

Example

julia
describe()

source

',7))]),t("details",b,[t("summary",null,[s[24]||(s[24]=t("a",{id:"Constraints.constraints_parameters-constraints-62_constraints_jl",href:"#Constraints.constraints_parameters-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.constraints_parameters")],-1)),s[25]||(s[25]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=a('
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_parameters()

source

',7))]),t("details",f,[t("summary",null,[s[27]||(s[27]=t("a",{id:"Constraints.constraints_descriptions-constraints-62_constraints_jl",href:"#Constraints.constraints_descriptions-constraints-62_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.constraints_descriptions")],-1)),s[28]||(s[28]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[29]||(s[29]=a('
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_descriptions()

source

',7))])])}const _=r(h,[["render",v]]);export{S as __pageData,_ as default}; +]

source

`,4))]),s[31]||(s[31]=t("h2",{id:"Concepts,-Error-Functions,-and-QUBO-matrices",tabindex:"-1"},[i("Concepts, Error Functions, and QUBO matrices "),t("a",{class:"header-anchor",href:"#Concepts,-Error-Functions,-and-QUBO-matrices","aria-label":'Permalink to "Concepts, Error Functions, and QUBO matrices {#Concepts,-Error-Functions,-and-QUBO-matrices}"'},"​")],-1)),s[32]||(s[32]=t("p",null,[i("One major use of this collection of usual constraint is to extract the "),t("code",null,"concept"),i(" or the error function ("),t("code",null,"error_f"),i(") of a given constraint.")],-1)),t("details",c,[t("summary",null,[s[3]||(s[3]=t("a",{id:"Constraints.concept-constraints-63_constraints_jl",href:"#Constraints.concept-constraints-63_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.concept")],-1)),s[4]||(s[4]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=a('
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source

julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

  • s::Symbol: the constraint name.

  • args...: the arguments to apply the concept to.

  • kargs...: the keyword arguments to apply the concept to.

Example

julia
concept(:all_different, [1, 2, 3])

source

',10))]),t("p",null,[s[10]||(s[10]=i("Note that the error function is a finer estimation of how much a constraint is violated or not. By default, the ")),s[11]||(s[11]=t("code",null,"error_f",-1)),s[12]||(s[12]=i(" method simply return ")),t("mjx-container",k,[(o(),l("svg",u,s[6]||(s[6]=[a('',1)]))),s[7]||(s[7]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"0.")])],-1))]),s[13]||(s[13]=i(" if the constraint is satisfied or ")),t("mjx-container",g,[(o(),l("svg",m,s[8]||(s[8]=[a('',1)]))),s[9]||(s[9]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"1.")])],-1))]),s[14]||(s[14]=i(" otherwise."))]),s[33]||(s[33]=t("p",null,[i("Efficient versions of "),t("code",null,"error_r"),i(" are either hand-coded or generated through "),t("code",null,"CompositionalNetworks.jl"),i(".")],-1)),t("details",C,[t("summary",null,[s[15]||(s[15]=t("a",{id:"Constraints.error_f-constraints-63_constraints_jl",href:"#Constraints.error_f-constraints-63_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.error_f")],-1)),s[16]||(s[16]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=a('
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source

',3))]),s[34]||(s[34]=t("p",null,[i("Finally, another use is to provide "),t("code",null,"QUBO"),i(" matrices of those usual constraints through "),t("code",null,"QUBOConstraints.jl"),i(". The syntax and interface for this feature are still a work in progress.")],-1)),s[35]||(s[35]=t("h2",{id:"Usual-Constraints",tabindex:"-1"},[i("Usual Constraints "),t("a",{class:"header-anchor",href:"#Usual-Constraints","aria-label":'Permalink to "Usual Constraints {#Usual-Constraints}"'},"​")],-1)),s[36]||(s[36]=t("p",null,[i("We provide a couple of methods to navigate the usual constraints extracted from "),t("em",null,"XCSP3-Core"),i(".")],-1)),t("details",y,[t("summary",null,[s[18]||(s[18]=t("a",{id:"Constraints.USUAL_CONSTRAINTS-constraints-63_constraints_jl",href:"#Constraints.USUAL_CONSTRAINTS-constraints-63_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.USUAL_CONSTRAINTS")],-1)),s[19]||(s[19]=i()),e(n,{type:"info",class:"jlObjectType jlConstant",text:"Constant"})]),s[20]||(s[20]=a('
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source

',6))]),t("details",E,[t("summary",null,[s[21]||(s[21]=t("a",{id:"Constraints.describe-constraints-63_constraints_jl",href:"#Constraints.describe-constraints-63_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.describe")],-1)),s[22]||(s[22]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[23]||(s[23]=a('
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

  • constraints::Dict{Symbol,Constraint}: dictionary of constraints to describe. Default is USUAL_CONSTRAINTS.

  • width::Int: width of the table.

Example

julia
describe()

source

',7))]),t("details",b,[t("summary",null,[s[24]||(s[24]=t("a",{id:"Constraints.constraints_parameters-constraints-63_constraints_jl",href:"#Constraints.constraints_parameters-constraints-63_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.constraints_parameters")],-1)),s[25]||(s[25]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=a('
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_parameters()

source

',7))]),t("details",f,[t("summary",null,[s[27]||(s[27]=t("a",{id:"Constraints.constraints_descriptions-constraints-63_constraints_jl",href:"#Constraints.constraints_descriptions-constraints-63_constraints_jl"},[t("span",{class:"jlbinding"},"Constraints.constraints_descriptions")],-1)),s[28]||(s[28]=i()),e(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[29]||(s[29]=a('
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_descriptions()

source

',7))])])}const _=r(h,[["render",v]]);export{S as __pageData,_ as default}; diff --git a/dev/assets/cp_30_getting_started.md.DTAftenf.js b/dev/assets/cp_30_getting_started.md.QuTvdZuh.js similarity index 95% rename from dev/assets/cp_30_getting_started.md.DTAftenf.js rename to dev/assets/cp_30_getting_started.md.QuTvdZuh.js index 33722dd..3b984ad 100644 --- a/dev/assets/cp_30_getting_started.md.DTAftenf.js +++ b/dev/assets/cp_30_getting_started.md.QuTvdZuh.js @@ -1,9 +1,9 @@ -import{_ as n,c as e,a5 as a,j as i,a as t,o as l}from"./chunks/framework.CJakPlgM.js";const y=JSON.parse('{"title":"Getting Started with Julia for CP and Optimization","description":"","frontmatter":{},"headers":[],"relativePath":"cp/30_getting_started.md","filePath":"cp/30_getting_started.md","lastUpdated":null}'),h={name:"cp/30_getting_started.md"},p={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.867ex",height:"1.984ex",role:"img",focusable:"false",viewBox:"0 -683 7013.4 877","aria-hidden":"true"},d={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},r={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.148ex",height:"2.034ex",role:"img",focusable:"false",viewBox:"0 -705 6695.4 899","aria-hidden":"true"},k={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Q={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.928ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 852 683","aria-hidden":"true"};function g(u,s,c,T,m,v){return l(),e("div",null,[s[11]||(s[11]=a('

Getting Started with Julia for CP and Optimization

Why Julia?

  • Discuss the advantages of Julia for computational science and optimization, highlighting its performance and ease of use.

Setting Up Your Julia Environment

We encourage users to install Julia through juliaup, a version manager for the Julia language. Please look at the official Julia language download page for further information. Once installed, Julia can be used through various editors (Visual Studio Code), notebooks (Pluto.jl), or command-line (REPL).

Although a part of the CP solvers available within the Julia ecosystem have their own interface, we encourage users to use the JuMP modeling language if possible.

Julia Constraints host several solvers(' interfaces). Due to its flexibility in modeling and solving, we will use LocalSearchSolvers.jl through its JuMP interface CBLS.jl as the basic example. Note that depending on the targeted instances, available hardware, and expectations, it is not necessarily the best choice.

All along the documentation, we will try to provide syntax examples for different setup.

julia
using LocalSearchSolvers
julia
using JuMP, CBLS
julia
# TODO: Add other solvers

Your First Julia CP Model

We will start with a classic puzzle game and some of its not that simple variants: the Sudoku.

(From Wikipedia) In classic Sudoku, the objective is to fill a 9 × 9 grid with digits so that each column, each row, and each of the nine 3 × 3 subgrids that compose the grid (also called "boxes", "blocks", or "regions") contains all of the digits from 1 to 9. The puzzle setter provides a partially completed grid, which for a well-posed puzzle has a single solution.

Constraint Programming follows the model-and-solve approach. We first need to model our Sudoku problem.

julia
m = JuMP.Model(CBLS.Optimizer)
julia
# TODO: Add other solvers

But what are the basis of CP models? It is quite simple:

',15)),i("ol",null,[i("li",null,[s[2]||(s[2]=t("A collection ")),i("mjx-container",p,[(l(),e("svg",o,s[0]||(s[0]=[a('',1)]))),s[1]||(s[1]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"X"),i("mo",null,"="),i("msub",null,[i("mi",null,"X"),i("mn",null,"1")]),i("mo",null,","),i("mo",null,"⋯"),i("mo",null,","),i("msub",null,[i("mi",null,"X"),i("mi",null,"n")])])],-1))]),s[3]||(s[3]=t(" of variables with each an associated domain."))])]),s[12]||(s[12]=a('
julia
@variable(m, 1 X[1:9, 1:9]  9, Int)
julia
# TODO: Add other solvers
',1)),i("ol",null,[i("li",null,[s[8]||(s[8]=t("A collection of predicates (called constraints) ")),i("mjx-container",d,[(l(),e("svg",r,s[4]||(s[4]=[a('',1)]))),s[5]||(s[5]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"C"),i("mo",null,"="),i("msub",null,[i("mi",null,"C"),i("mn",null,"1")]),i("mo",null,","),i("mo",null,"⋯"),i("mo",null,","),i("msub",null,[i("mi",null,"C"),i("mi",null,"n")])])],-1))]),s[9]||(s[9]=t(" over (subsets of) ")),i("mjx-container",k,[(l(),e("svg",Q,s[6]||(s[6]=[i("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[i("g",{"data-mml-node":"math"},[i("g",{"data-mml-node":"mi"},[i("path",{"data-c":"1D44B",d:"M42 0H40Q26 0 26 11Q26 15 29 27Q33 41 36 43T55 46Q141 49 190 98Q200 108 306 224T411 342Q302 620 297 625Q288 636 234 637H206Q200 643 200 645T202 664Q206 677 212 683H226Q260 681 347 681Q380 681 408 681T453 682T473 682Q490 682 490 671Q490 670 488 658Q484 643 481 640T465 637Q434 634 411 620L488 426L541 485Q646 598 646 610Q646 628 622 635Q617 635 609 637Q594 637 594 648Q594 650 596 664Q600 677 606 683H618Q619 683 643 683T697 681T738 680Q828 680 837 683H845Q852 676 852 672Q850 647 840 637H824Q790 636 763 628T722 611T698 593L687 584Q687 585 592 480L505 384Q505 383 536 304T601 142T638 56Q648 47 699 46Q734 46 734 37Q734 35 732 23Q728 7 725 4T711 1Q708 1 678 1T589 2Q528 2 496 2T461 1Q444 1 444 10Q444 11 446 25Q448 35 450 39T455 44T464 46T480 47T506 54Q523 62 523 64Q522 64 476 181L429 299Q241 95 236 84Q232 76 232 72Q232 53 261 47Q262 47 267 47T273 46Q276 46 277 46T280 45T283 42T284 35Q284 26 282 19Q279 6 276 4T261 1Q258 1 243 1T201 2T142 2Q64 2 42 0Z",style:{"stroke-width":"3"}})])])],-1)]))),s[7]||(s[7]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"X")])],-1))]),s[10]||(s[10]=t("."))])]),s[13]||(s[13]=a(`

When modeling problems as CP, one might define and use their own predicates. However, a large collection of already defined constraints exists. One, if not the most, iconic global constraint is called AllDifferent. It ensures that all variables take distinct values.

Sudoku puzzles can be defined using only this one constraint applied to different subsets of variables.

julia
for i in 1:9
+import{_ as n,c as e,a5 as a,j as i,a as t,o as l}from"./chunks/framework.CJakPlgM.js";const y=JSON.parse('{"title":"Getting Started with Julia for CP and Optimization","description":"","frontmatter":{},"headers":[],"relativePath":"cp/30_getting_started.md","filePath":"cp/30_getting_started.md","lastUpdated":null}'),h={name:"cp/30_getting_started.md"},p={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.867ex",height:"1.984ex",role:"img",focusable:"false",viewBox:"0 -683 7013.4 877","aria-hidden":"true"},d={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},r={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.148ex",height:"2.034ex",role:"img",focusable:"false",viewBox:"0 -705 6695.4 899","aria-hidden":"true"},k={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Q={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.928ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 852 683","aria-hidden":"true"};function g(c,s,u,T,m,v){return l(),e("div",null,[s[11]||(s[11]=a('

Getting Started with Julia for CP and Optimization

Why Julia?

  • Discuss the advantages of Julia for computational science and optimization, highlighting its performance and ease of use.

Setting Up Your Julia Environment

We encourage users to install Julia through juliaup, a version manager for the Julia language. Please look at the official Julia language download page for further information. Once installed, Julia can be used through various editors (Visual Studio Code), notebooks (Pluto.jl), or command-line (REPL).

Although a part of the CP solvers available within the Julia ecosystem have their own interface, we encourage users to use the JuMP modeling language if possible.

Julia Constraints host several solvers(' interfaces). Due to its flexibility in modeling and solving, we will use LocalSearchSolvers.jl through its JuMP interface CBLS.jl as the basic example. Note that depending on the targeted instances, available hardware, and expectations, it is not necessarily the best choice.

All along the documentation, we will try to provide syntax examples for different setup.

julia
using LocalSearchSolvers
julia
using JuMP, CBLS
julia
# TODO: Add other solvers

Your First Julia CP Model

We will start with a classic puzzle game and some of its not that simple variants: the Sudoku.

(From Wikipedia) In classic Sudoku, the objective is to fill a 9 × 9 grid with digits so that each column, each row, and each of the nine 3 × 3 subgrids that compose the grid (also called "boxes", "blocks", or "regions") contains all of the digits from 1 to 9. The puzzle setter provides a partially completed grid, which for a well-posed puzzle has a single solution.

Constraint Programming follows the model-and-solve approach. We first need to model our Sudoku problem.

julia
m = JuMP.Model(CBLS.Optimizer)
julia
# TODO: Add other solvers

But what are the basis of CP models? It is quite simple:

',15)),i("ol",null,[i("li",null,[s[2]||(s[2]=t("A collection ")),i("mjx-container",p,[(l(),e("svg",o,s[0]||(s[0]=[a('',1)]))),s[1]||(s[1]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"X"),i("mo",null,"="),i("msub",null,[i("mi",null,"X"),i("mn",null,"1")]),i("mo",null,","),i("mo",null,"⋯"),i("mo",null,","),i("msub",null,[i("mi",null,"X"),i("mi",null,"n")])])],-1))]),s[3]||(s[3]=t(" of variables with each an associated domain."))])]),s[12]||(s[12]=a('
julia
@variable(m, 1 X[1:9, 1:9]  9, Int)
julia
# TODO: Add other solvers
',1)),i("ol",null,[i("li",null,[s[8]||(s[8]=t("A collection of predicates (called constraints) ")),i("mjx-container",d,[(l(),e("svg",r,s[4]||(s[4]=[a('',1)]))),s[5]||(s[5]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"C"),i("mo",null,"="),i("msub",null,[i("mi",null,"C"),i("mn",null,"1")]),i("mo",null,","),i("mo",null,"⋯"),i("mo",null,","),i("msub",null,[i("mi",null,"C"),i("mi",null,"n")])])],-1))]),s[9]||(s[9]=t(" over (subsets of) ")),i("mjx-container",k,[(l(),e("svg",Q,s[6]||(s[6]=[i("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[i("g",{"data-mml-node":"math"},[i("g",{"data-mml-node":"mi"},[i("path",{"data-c":"1D44B",d:"M42 0H40Q26 0 26 11Q26 15 29 27Q33 41 36 43T55 46Q141 49 190 98Q200 108 306 224T411 342Q302 620 297 625Q288 636 234 637H206Q200 643 200 645T202 664Q206 677 212 683H226Q260 681 347 681Q380 681 408 681T453 682T473 682Q490 682 490 671Q490 670 488 658Q484 643 481 640T465 637Q434 634 411 620L488 426L541 485Q646 598 646 610Q646 628 622 635Q617 635 609 637Q594 637 594 648Q594 650 596 664Q600 677 606 683H618Q619 683 643 683T697 681T738 680Q828 680 837 683H845Q852 676 852 672Q850 647 840 637H824Q790 636 763 628T722 611T698 593L687 584Q687 585 592 480L505 384Q505 383 536 304T601 142T638 56Q648 47 699 46Q734 46 734 37Q734 35 732 23Q728 7 725 4T711 1Q708 1 678 1T589 2Q528 2 496 2T461 1Q444 1 444 10Q444 11 446 25Q448 35 450 39T455 44T464 46T480 47T506 54Q523 62 523 64Q522 64 476 181L429 299Q241 95 236 84Q232 76 232 72Q232 53 261 47Q262 47 267 47T273 46Q276 46 277 46T280 45T283 42T284 35Q284 26 282 19Q279 6 276 4T261 1Q258 1 243 1T201 2T142 2Q64 2 42 0Z",style:{"stroke-width":"3"}})])])],-1)]))),s[7]||(s[7]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"X")])],-1))]),s[10]||(s[10]=t("."))])]),s[13]||(s[13]=a(`

When modeling problems as CP, one might define and use their own predicates. However, a large collection of already defined constraints exists. One, if not the most, iconic global constraint is called AllDifferent. It ensures that all variables take distinct values.

Sudoku puzzles can be defined using only this one constraint applied to different subsets of variables.

julia
for i in 1:9
         @constraint(m, X[i,:] in AllDifferent()) # rows
         @constraint(m, X[:,i] in AllDifferent()) # columns
-end
julia
# TODO: Add other solvers

The last series of AllDifferent constraint is less straight forward. We need to ensure that each 3 × 3 subgrid (block) is filled with distinct values.

julia
for i in 0:2, j in 0:2 # blocks
+end
julia
# TODO: Add other solvers

The last series of AllDifferent constraint is less straight forward. We need to ensure that each 3 × 3 subgrid (block) is filled with distinct values.

julia
for i in 0:2, j in 0:2 # blocks
     @constraint(
         m,
         vec(X[(3i+1):(3(i+1)), (3j+1):(3(j+1))]) in AllDifferent(),
     )
-end
julia
# TODO: Add other solvers

We can now simply run our solver to look for a feasible solution.

julia
optimize!(m)

Note that this is heuristic solver, we might not get a feasible solution! Let's check it out. The value function print the value of a JuMP variable. We can cast it over a collection with the value. syntax.

julia
value.(X)
`,9))])}const E=n(h,[["render",g]]);export{y as __pageData,E as default}; +end
julia
# TODO: Add other solvers

We can now simply run our solver to look for a feasible solution.

julia
optimize!(m)

Note that this is heuristic solver, we might not get a feasible solution! Let's check it out. The value function print the value of a JuMP variable. We can cast it over a collection with the value. syntax.

julia
value.(X)
`,9))])}const E=n(h,[["render",g]]);export{y as __pageData,E as default}; diff --git a/dev/assets/cp_30_getting_started.md.DTAftenf.lean.js b/dev/assets/cp_30_getting_started.md.QuTvdZuh.lean.js similarity index 95% rename from dev/assets/cp_30_getting_started.md.DTAftenf.lean.js rename to dev/assets/cp_30_getting_started.md.QuTvdZuh.lean.js index 33722dd..3b984ad 100644 --- a/dev/assets/cp_30_getting_started.md.DTAftenf.lean.js +++ b/dev/assets/cp_30_getting_started.md.QuTvdZuh.lean.js @@ -1,9 +1,9 @@ -import{_ as n,c as e,a5 as a,j as i,a as t,o as l}from"./chunks/framework.CJakPlgM.js";const y=JSON.parse('{"title":"Getting Started with Julia for CP and Optimization","description":"","frontmatter":{},"headers":[],"relativePath":"cp/30_getting_started.md","filePath":"cp/30_getting_started.md","lastUpdated":null}'),h={name:"cp/30_getting_started.md"},p={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.867ex",height:"1.984ex",role:"img",focusable:"false",viewBox:"0 -683 7013.4 877","aria-hidden":"true"},d={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},r={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.148ex",height:"2.034ex",role:"img",focusable:"false",viewBox:"0 -705 6695.4 899","aria-hidden":"true"},k={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Q={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.928ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 852 683","aria-hidden":"true"};function g(u,s,c,T,m,v){return l(),e("div",null,[s[11]||(s[11]=a('

Getting Started with Julia for CP and Optimization

Why Julia?

  • Discuss the advantages of Julia for computational science and optimization, highlighting its performance and ease of use.

Setting Up Your Julia Environment

We encourage users to install Julia through juliaup, a version manager for the Julia language. Please look at the official Julia language download page for further information. Once installed, Julia can be used through various editors (Visual Studio Code), notebooks (Pluto.jl), or command-line (REPL).

Although a part of the CP solvers available within the Julia ecosystem have their own interface, we encourage users to use the JuMP modeling language if possible.

Julia Constraints host several solvers(' interfaces). Due to its flexibility in modeling and solving, we will use LocalSearchSolvers.jl through its JuMP interface CBLS.jl as the basic example. Note that depending on the targeted instances, available hardware, and expectations, it is not necessarily the best choice.

All along the documentation, we will try to provide syntax examples for different setup.

julia
using LocalSearchSolvers
julia
using JuMP, CBLS
julia
# TODO: Add other solvers

Your First Julia CP Model

We will start with a classic puzzle game and some of its not that simple variants: the Sudoku.

(From Wikipedia) In classic Sudoku, the objective is to fill a 9 × 9 grid with digits so that each column, each row, and each of the nine 3 × 3 subgrids that compose the grid (also called "boxes", "blocks", or "regions") contains all of the digits from 1 to 9. The puzzle setter provides a partially completed grid, which for a well-posed puzzle has a single solution.

Constraint Programming follows the model-and-solve approach. We first need to model our Sudoku problem.

julia
m = JuMP.Model(CBLS.Optimizer)
julia
# TODO: Add other solvers

But what are the basis of CP models? It is quite simple:

',15)),i("ol",null,[i("li",null,[s[2]||(s[2]=t("A collection ")),i("mjx-container",p,[(l(),e("svg",o,s[0]||(s[0]=[a('',1)]))),s[1]||(s[1]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"X"),i("mo",null,"="),i("msub",null,[i("mi",null,"X"),i("mn",null,"1")]),i("mo",null,","),i("mo",null,"⋯"),i("mo",null,","),i("msub",null,[i("mi",null,"X"),i("mi",null,"n")])])],-1))]),s[3]||(s[3]=t(" of variables with each an associated domain."))])]),s[12]||(s[12]=a('
julia
@variable(m, 1 X[1:9, 1:9]  9, Int)
julia
# TODO: Add other solvers
',1)),i("ol",null,[i("li",null,[s[8]||(s[8]=t("A collection of predicates (called constraints) ")),i("mjx-container",d,[(l(),e("svg",r,s[4]||(s[4]=[a('',1)]))),s[5]||(s[5]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"C"),i("mo",null,"="),i("msub",null,[i("mi",null,"C"),i("mn",null,"1")]),i("mo",null,","),i("mo",null,"⋯"),i("mo",null,","),i("msub",null,[i("mi",null,"C"),i("mi",null,"n")])])],-1))]),s[9]||(s[9]=t(" over (subsets of) ")),i("mjx-container",k,[(l(),e("svg",Q,s[6]||(s[6]=[i("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[i("g",{"data-mml-node":"math"},[i("g",{"data-mml-node":"mi"},[i("path",{"data-c":"1D44B",d:"M42 0H40Q26 0 26 11Q26 15 29 27Q33 41 36 43T55 46Q141 49 190 98Q200 108 306 224T411 342Q302 620 297 625Q288 636 234 637H206Q200 643 200 645T202 664Q206 677 212 683H226Q260 681 347 681Q380 681 408 681T453 682T473 682Q490 682 490 671Q490 670 488 658Q484 643 481 640T465 637Q434 634 411 620L488 426L541 485Q646 598 646 610Q646 628 622 635Q617 635 609 637Q594 637 594 648Q594 650 596 664Q600 677 606 683H618Q619 683 643 683T697 681T738 680Q828 680 837 683H845Q852 676 852 672Q850 647 840 637H824Q790 636 763 628T722 611T698 593L687 584Q687 585 592 480L505 384Q505 383 536 304T601 142T638 56Q648 47 699 46Q734 46 734 37Q734 35 732 23Q728 7 725 4T711 1Q708 1 678 1T589 2Q528 2 496 2T461 1Q444 1 444 10Q444 11 446 25Q448 35 450 39T455 44T464 46T480 47T506 54Q523 62 523 64Q522 64 476 181L429 299Q241 95 236 84Q232 76 232 72Q232 53 261 47Q262 47 267 47T273 46Q276 46 277 46T280 45T283 42T284 35Q284 26 282 19Q279 6 276 4T261 1Q258 1 243 1T201 2T142 2Q64 2 42 0Z",style:{"stroke-width":"3"}})])])],-1)]))),s[7]||(s[7]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"X")])],-1))]),s[10]||(s[10]=t("."))])]),s[13]||(s[13]=a(`

When modeling problems as CP, one might define and use their own predicates. However, a large collection of already defined constraints exists. One, if not the most, iconic global constraint is called AllDifferent. It ensures that all variables take distinct values.

Sudoku puzzles can be defined using only this one constraint applied to different subsets of variables.

julia
for i in 1:9
+import{_ as n,c as e,a5 as a,j as i,a as t,o as l}from"./chunks/framework.CJakPlgM.js";const y=JSON.parse('{"title":"Getting Started with Julia for CP and Optimization","description":"","frontmatter":{},"headers":[],"relativePath":"cp/30_getting_started.md","filePath":"cp/30_getting_started.md","lastUpdated":null}'),h={name:"cp/30_getting_started.md"},p={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.867ex",height:"1.984ex",role:"img",focusable:"false",viewBox:"0 -683 7013.4 877","aria-hidden":"true"},d={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},r={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.148ex",height:"2.034ex",role:"img",focusable:"false",viewBox:"0 -705 6695.4 899","aria-hidden":"true"},k={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Q={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.928ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 852 683","aria-hidden":"true"};function g(c,s,u,T,m,v){return l(),e("div",null,[s[11]||(s[11]=a('

Getting Started with Julia for CP and Optimization

Why Julia?

  • Discuss the advantages of Julia for computational science and optimization, highlighting its performance and ease of use.

Setting Up Your Julia Environment

We encourage users to install Julia through juliaup, a version manager for the Julia language. Please look at the official Julia language download page for further information. Once installed, Julia can be used through various editors (Visual Studio Code), notebooks (Pluto.jl), or command-line (REPL).

Although a part of the CP solvers available within the Julia ecosystem have their own interface, we encourage users to use the JuMP modeling language if possible.

Julia Constraints host several solvers(' interfaces). Due to its flexibility in modeling and solving, we will use LocalSearchSolvers.jl through its JuMP interface CBLS.jl as the basic example. Note that depending on the targeted instances, available hardware, and expectations, it is not necessarily the best choice.

All along the documentation, we will try to provide syntax examples for different setup.

julia
using LocalSearchSolvers
julia
using JuMP, CBLS
julia
# TODO: Add other solvers

Your First Julia CP Model

We will start with a classic puzzle game and some of its not that simple variants: the Sudoku.

(From Wikipedia) In classic Sudoku, the objective is to fill a 9 × 9 grid with digits so that each column, each row, and each of the nine 3 × 3 subgrids that compose the grid (also called "boxes", "blocks", or "regions") contains all of the digits from 1 to 9. The puzzle setter provides a partially completed grid, which for a well-posed puzzle has a single solution.

Constraint Programming follows the model-and-solve approach. We first need to model our Sudoku problem.

julia
m = JuMP.Model(CBLS.Optimizer)
julia
# TODO: Add other solvers

But what are the basis of CP models? It is quite simple:

',15)),i("ol",null,[i("li",null,[s[2]||(s[2]=t("A collection ")),i("mjx-container",p,[(l(),e("svg",o,s[0]||(s[0]=[a('',1)]))),s[1]||(s[1]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"X"),i("mo",null,"="),i("msub",null,[i("mi",null,"X"),i("mn",null,"1")]),i("mo",null,","),i("mo",null,"⋯"),i("mo",null,","),i("msub",null,[i("mi",null,"X"),i("mi",null,"n")])])],-1))]),s[3]||(s[3]=t(" of variables with each an associated domain."))])]),s[12]||(s[12]=a('
julia
@variable(m, 1 X[1:9, 1:9]  9, Int)
julia
# TODO: Add other solvers
',1)),i("ol",null,[i("li",null,[s[8]||(s[8]=t("A collection of predicates (called constraints) ")),i("mjx-container",d,[(l(),e("svg",r,s[4]||(s[4]=[a('',1)]))),s[5]||(s[5]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"C"),i("mo",null,"="),i("msub",null,[i("mi",null,"C"),i("mn",null,"1")]),i("mo",null,","),i("mo",null,"⋯"),i("mo",null,","),i("msub",null,[i("mi",null,"C"),i("mi",null,"n")])])],-1))]),s[9]||(s[9]=t(" over (subsets of) ")),i("mjx-container",k,[(l(),e("svg",Q,s[6]||(s[6]=[i("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[i("g",{"data-mml-node":"math"},[i("g",{"data-mml-node":"mi"},[i("path",{"data-c":"1D44B",d:"M42 0H40Q26 0 26 11Q26 15 29 27Q33 41 36 43T55 46Q141 49 190 98Q200 108 306 224T411 342Q302 620 297 625Q288 636 234 637H206Q200 643 200 645T202 664Q206 677 212 683H226Q260 681 347 681Q380 681 408 681T453 682T473 682Q490 682 490 671Q490 670 488 658Q484 643 481 640T465 637Q434 634 411 620L488 426L541 485Q646 598 646 610Q646 628 622 635Q617 635 609 637Q594 637 594 648Q594 650 596 664Q600 677 606 683H618Q619 683 643 683T697 681T738 680Q828 680 837 683H845Q852 676 852 672Q850 647 840 637H824Q790 636 763 628T722 611T698 593L687 584Q687 585 592 480L505 384Q505 383 536 304T601 142T638 56Q648 47 699 46Q734 46 734 37Q734 35 732 23Q728 7 725 4T711 1Q708 1 678 1T589 2Q528 2 496 2T461 1Q444 1 444 10Q444 11 446 25Q448 35 450 39T455 44T464 46T480 47T506 54Q523 62 523 64Q522 64 476 181L429 299Q241 95 236 84Q232 76 232 72Q232 53 261 47Q262 47 267 47T273 46Q276 46 277 46T280 45T283 42T284 35Q284 26 282 19Q279 6 276 4T261 1Q258 1 243 1T201 2T142 2Q64 2 42 0Z",style:{"stroke-width":"3"}})])])],-1)]))),s[7]||(s[7]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"X")])],-1))]),s[10]||(s[10]=t("."))])]),s[13]||(s[13]=a(`

When modeling problems as CP, one might define and use their own predicates. However, a large collection of already defined constraints exists. One, if not the most, iconic global constraint is called AllDifferent. It ensures that all variables take distinct values.

Sudoku puzzles can be defined using only this one constraint applied to different subsets of variables.

julia
for i in 1:9
         @constraint(m, X[i,:] in AllDifferent()) # rows
         @constraint(m, X[:,i] in AllDifferent()) # columns
-end
julia
# TODO: Add other solvers

The last series of AllDifferent constraint is less straight forward. We need to ensure that each 3 × 3 subgrid (block) is filled with distinct values.

julia
for i in 0:2, j in 0:2 # blocks
+end
julia
# TODO: Add other solvers

The last series of AllDifferent constraint is less straight forward. We need to ensure that each 3 × 3 subgrid (block) is filled with distinct values.

julia
for i in 0:2, j in 0:2 # blocks
     @constraint(
         m,
         vec(X[(3i+1):(3(i+1)), (3j+1):(3(j+1))]) in AllDifferent(),
     )
-end
julia
# TODO: Add other solvers

We can now simply run our solver to look for a feasible solution.

julia
optimize!(m)

Note that this is heuristic solver, we might not get a feasible solution! Let's check it out. The value function print the value of a JuMP variable. We can cast it over a collection with the value. syntax.

julia
value.(X)
`,9))])}const E=n(h,[["render",g]]);export{y as __pageData,E as default}; +end
julia
# TODO: Add other solvers

We can now simply run our solver to look for a feasible solution.

julia
optimize!(m)

Note that this is heuristic solver, we might not get a feasible solution! Let's check it out. The value function print the value of a JuMP variable. We can cast it over a collection with the value. syntax.

julia
value.(X)
`,9))])}const E=n(h,[["render",g]]);export{y as __pageData,E as default}; diff --git a/dev/assets/index.md.BKeG-gxU.js b/dev/assets/index.md.BKeG-gxU.js deleted file mode 100644 index 4d092f4..0000000 --- a/dev/assets/index.md.BKeG-gxU.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as o,c as e,a5 as a,o as i}from"./chunks/framework.CJakPlgM.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Julia Constraints","text":"Model Smoothly Decide Wisely","tagline":"A Toolkit for Constraint Programming","image":{"src":"/logo.png","alt":"JuliaConstraints"},"actions":[{"theme":"brand","text":"Model, Learn, and Solve!","link":"/constraints/intro"},{"theme":"alt","text":"View on Github","link":"https://github.com/JuliaConstraints/JuliaConstraints.github.io"}]},"features":[{"icon":"\\"JuMP.jl\\"/","title":"JuMP.jl","details":"Model optimization problems via JuMP.jl!","link":"https://jump.dev/"},{"icon":"\\"PerfChecker.jl\\"/","title":"PerfChecker.jl","details":"Cross-version performance checking tool","link":"https://github.com/JuliaConstraints/PerfChecker.jl"},{"icon":"\\"Pluto.jl\\"/","title":"Pluto.jl","details":"Simple, reactive programming environment via Julia notebooks","link":"https://plutojl.org/"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":null}'),n={name:"index.md"};function s(r,t,l,h,g,u){return i(),e("div",null,t[0]||(t[0]=[a('

What is Julia Constraints?

The Julia Constraints organization serves as a hub for resources to create, understand, and solve optimization through the lens of Constraint Programming. Our goal is to make Constraint Programming accessible and efficient for users at all levels of expertise, by providing a comprehensive suite of tools.

Most tools integrate seamlessly with JuMP, a popular Julia package for mathematical optimization.

Ecosystem overview

Core Packages

The foundation of common packages that provide essential features for constraint programming ensures that users possess the fundamental tools required for their projects.

  • ConstraintCommons.jl is designed to make constraint programming solutions in Julia interoperable. It provides shared structures, abstract types, functions, and generic methods used by both basic feature packages and learning-oriented packages.
  • ConstraintDomains.jl focuses on the definition and manipulation of variable domains, which are used to solve constraint programming problems. This package provides the infrastructure needed to specify both discrete and continuous domains, allowing a wide range of constraint programming applications.
  • Constraints.jl is a key component, specifically designed to facilitate the definition, manipulation, and application of constraints in constraint programming. This package is central to handling both standard and complex constraints, making it an indispensable tool for developers and researchers working in CP.
  • ConstraintModels.jl is a package for Julia Constraints' solvers that stores Constraint Programming models.

Learning and Translation Tools

A collection that bridges the gap between the ease of modeling and computational efficacy. These tools learn from constraints or convert natural language problems into constraint programming solutions, requiring minimal input from the user beyond the model itself.

  • CompositionalNetworks.jl provides interpretable compositional networks (ICN), a combinatorial variant of neural networks that allows the user to obtain interpretable results, unlike regular artificial neural networks.
  • QUBOConstraints.jl is a package that can (automatically) learn QUBO matrices from optimization constraints.
  • ConstraintsTranslator.jl (tentative name, WIP) is a tool for converting problems expressed in natural language into optimization models.
  • ConstraintLearning.jl is a common interface that integrates the various components outlined above.

Solvers

We offer a variety of solvers, from native Julia solvers to interfaces with JuMP for external CP solvers, to cater to various problem-solving needs.

  • LocalSearchSolvers.jl is a Julia native framework to (semi-)automatically build Constraint-based Local Search solvers. It serves as a basic for the experimental design or core and learning oriented packages in Julia Constraints.
  • CBLS.jl a MOI/JuMP interface for the above framework!
  • CPLEXCP.jl a Julia interface for CPLEX CP Optimizer.
  • Chuffed.jl a wrapper for the constraint-programming solver Chuffed to Julia.
  • JaCoP.jl a Julia interface for the JaCoP constraint-programming solver.

JuMP extras

Constraint Programming is slowly making steps into the main JuMP components. However, some extra resources are available as

Meta-solving

MetaStrategist.jl is a meta-solving package in its formative stages, which aims to harness the strengths of CP and JuMP. Its goal is to formulate tailored strategies that take into consideration the unique hardware and software resources at hand, offering a new horizon in problem-solving efficiency and adaptability. Stay tuned!

Performance related tools

We've made a tool for cross-version performance checking that ensures the high efficiency and reliability of our solutions. By facilitating clear and simple performance evaluations, PerfChecker.jl enhances both development and maintenance, contributing to the overall health and progress of Julia (Constraints)'s growing library of resources.

Contributors Page

Acknowledgments

The Julia Constraints community would not be where it is today without the collective efforts of many talented individuals and organizations. We extend our heartfelt thanks to:

  • IIJ Research Lab: The driving force behind more than half of this project!
  • JuMP-dev Community: For their extensive contributions to the development of our packages.
  • Individual Contributors: Numerous developers and researchers who have dedicated their time and skills to enhance our tools.
',2)]))}const p=o(n,[["render",s]]);export{m as __pageData,p as default}; diff --git a/dev/assets/index.md.BKeG-gxU.lean.js b/dev/assets/index.md.BKeG-gxU.lean.js deleted file mode 100644 index 4d092f4..0000000 --- a/dev/assets/index.md.BKeG-gxU.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as o,c as e,a5 as a,o as i}from"./chunks/framework.CJakPlgM.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Julia Constraints","text":"Model Smoothly Decide Wisely","tagline":"A Toolkit for Constraint Programming","image":{"src":"/logo.png","alt":"JuliaConstraints"},"actions":[{"theme":"brand","text":"Model, Learn, and Solve!","link":"/constraints/intro"},{"theme":"alt","text":"View on Github","link":"https://github.com/JuliaConstraints/JuliaConstraints.github.io"}]},"features":[{"icon":"\\"JuMP.jl\\"/","title":"JuMP.jl","details":"Model optimization problems via JuMP.jl!","link":"https://jump.dev/"},{"icon":"\\"PerfChecker.jl\\"/","title":"PerfChecker.jl","details":"Cross-version performance checking tool","link":"https://github.com/JuliaConstraints/PerfChecker.jl"},{"icon":"\\"Pluto.jl\\"/","title":"Pluto.jl","details":"Simple, reactive programming environment via Julia notebooks","link":"https://plutojl.org/"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":null}'),n={name:"index.md"};function s(r,t,l,h,g,u){return i(),e("div",null,t[0]||(t[0]=[a('

What is Julia Constraints?

The Julia Constraints organization serves as a hub for resources to create, understand, and solve optimization through the lens of Constraint Programming. Our goal is to make Constraint Programming accessible and efficient for users at all levels of expertise, by providing a comprehensive suite of tools.

Most tools integrate seamlessly with JuMP, a popular Julia package for mathematical optimization.

Ecosystem overview

Core Packages

The foundation of common packages that provide essential features for constraint programming ensures that users possess the fundamental tools required for their projects.

  • ConstraintCommons.jl is designed to make constraint programming solutions in Julia interoperable. It provides shared structures, abstract types, functions, and generic methods used by both basic feature packages and learning-oriented packages.
  • ConstraintDomains.jl focuses on the definition and manipulation of variable domains, which are used to solve constraint programming problems. This package provides the infrastructure needed to specify both discrete and continuous domains, allowing a wide range of constraint programming applications.
  • Constraints.jl is a key component, specifically designed to facilitate the definition, manipulation, and application of constraints in constraint programming. This package is central to handling both standard and complex constraints, making it an indispensable tool for developers and researchers working in CP.
  • ConstraintModels.jl is a package for Julia Constraints' solvers that stores Constraint Programming models.

Learning and Translation Tools

A collection that bridges the gap between the ease of modeling and computational efficacy. These tools learn from constraints or convert natural language problems into constraint programming solutions, requiring minimal input from the user beyond the model itself.

  • CompositionalNetworks.jl provides interpretable compositional networks (ICN), a combinatorial variant of neural networks that allows the user to obtain interpretable results, unlike regular artificial neural networks.
  • QUBOConstraints.jl is a package that can (automatically) learn QUBO matrices from optimization constraints.
  • ConstraintsTranslator.jl (tentative name, WIP) is a tool for converting problems expressed in natural language into optimization models.
  • ConstraintLearning.jl is a common interface that integrates the various components outlined above.

Solvers

We offer a variety of solvers, from native Julia solvers to interfaces with JuMP for external CP solvers, to cater to various problem-solving needs.

  • LocalSearchSolvers.jl is a Julia native framework to (semi-)automatically build Constraint-based Local Search solvers. It serves as a basic for the experimental design or core and learning oriented packages in Julia Constraints.
  • CBLS.jl a MOI/JuMP interface for the above framework!
  • CPLEXCP.jl a Julia interface for CPLEX CP Optimizer.
  • Chuffed.jl a wrapper for the constraint-programming solver Chuffed to Julia.
  • JaCoP.jl a Julia interface for the JaCoP constraint-programming solver.

JuMP extras

Constraint Programming is slowly making steps into the main JuMP components. However, some extra resources are available as

Meta-solving

MetaStrategist.jl is a meta-solving package in its formative stages, which aims to harness the strengths of CP and JuMP. Its goal is to formulate tailored strategies that take into consideration the unique hardware and software resources at hand, offering a new horizon in problem-solving efficiency and adaptability. Stay tuned!

Performance related tools

We've made a tool for cross-version performance checking that ensures the high efficiency and reliability of our solutions. By facilitating clear and simple performance evaluations, PerfChecker.jl enhances both development and maintenance, contributing to the overall health and progress of Julia (Constraints)'s growing library of resources.

Contributors Page

Acknowledgments

The Julia Constraints community would not be where it is today without the collective efforts of many talented individuals and organizations. We extend our heartfelt thanks to:

  • IIJ Research Lab: The driving force behind more than half of this project!
  • JuMP-dev Community: For their extensive contributions to the development of our packages.
  • Individual Contributors: Numerous developers and researchers who have dedicated their time and skills to enhance our tools.
',2)]))}const p=o(n,[["render",s]]);export{m as __pageData,p as default}; diff --git a/dev/assets/index.md.pHtYR91m.js b/dev/assets/index.md.pHtYR91m.js new file mode 100644 index 0000000..3c16f7b --- /dev/null +++ b/dev/assets/index.md.pHtYR91m.js @@ -0,0 +1 @@ +import{_ as o,c as a,a5 as e,o as i}from"./chunks/framework.CJakPlgM.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Julia Constraints","text":"Model Smoothly Decide Wisely","tagline":"A Toolkit for Constraint Programming","image":{"src":"/logo.png","alt":"JuliaConstraints"},"actions":[{"theme":"brand","text":"Model, Learn, and Solve!","link":"/constraints/00_intro"},{"theme":"alt","text":"View on Github","link":"https://github.com/JuliaConstraints/JuliaConstraints.github.io"}]},"features":[{"icon":"\\"JuMP.jl\\"/","title":"JuMP.jl","details":"Model optimization problems via JuMP.jl!","link":"https://jump.dev/"},{"icon":"\\"PerfChecker.jl\\"/","title":"PerfChecker.jl","details":"Cross-version performance checking tool","link":"https://github.com/JuliaConstraints/PerfChecker.jl"},{"icon":"\\"Pluto.jl\\"/","title":"Pluto.jl","details":"Simple, reactive programming environment via Julia notebooks","link":"https://plutojl.org/"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":null}'),n={name:"index.md"};function s(r,t,l,h,g,u){return i(),a("div",null,t[0]||(t[0]=[e('

What is Julia Constraints?

The Julia Constraints organization serves as a hub for resources to create, understand, and solve optimization through the lens of Constraint Programming. Our goal is to make Constraint Programming accessible and efficient for users at all levels of expertise, by providing a comprehensive suite of tools.

Most tools integrate seamlessly with JuMP, a popular Julia package for mathematical optimization.

Ecosystem overview

Core Packages

The foundation of common packages that provide essential features for constraint programming ensures that users possess the fundamental tools required for their projects.

  • ConstraintCommons.jl is designed to make constraint programming solutions in Julia interoperable. It provides shared structures, abstract types, functions, and generic methods used by both basic feature packages and learning-oriented packages.
  • ConstraintDomains.jl focuses on the definition and manipulation of variable domains, which are used to solve constraint programming problems. This package provides the infrastructure needed to specify both discrete and continuous domains, allowing a wide range of constraint programming applications.
  • Constraints.jl is a key component, specifically designed to facilitate the definition, manipulation, and application of constraints in constraint programming. This package is central to handling both standard and complex constraints, making it an indispensable tool for developers and researchers working in CP.
  • ConstraintModels.jl is a package for Julia Constraints' solvers that stores Constraint Programming models.

Learning and Translation Tools

A collection that bridges the gap between the ease of modeling and computational efficacy. These tools learn from constraints or convert natural language problems into constraint programming solutions, requiring minimal input from the user beyond the model itself.

  • CompositionalNetworks.jl provides interpretable compositional networks (ICN), a combinatorial variant of neural networks that allows the user to obtain interpretable results, unlike regular artificial neural networks.
  • QUBOConstraints.jl is a package that can (automatically) learn QUBO matrices from optimization constraints.
  • ConstraintsTranslator.jl is a tool for converting problems expressed in natural language into optimization models.
  • ConstraintLearning.jl is a common interface that integrates the various components outlined above.

Solvers

We offer a variety of solvers, from native Julia solvers to interfaces with JuMP for external CP solvers, to cater to various problem-solving needs.

  • LocalSearchSolvers.jl is a Julia native framework to (semi-)automatically build Constraint-based Local Search solvers. It serves as a basic for the experimental design or core and learning oriented packages in Julia Constraints.
  • CBLS.jl a MOI/JuMP interface for the above framework!
  • CPLEXCP.jl a Julia interface for CPLEX CP Optimizer.
  • Chuffed.jl a wrapper for the constraint-programming solver Chuffed to Julia.
  • JaCoP.jl a Julia interface for the JaCoP constraint-programming solver.
  • ConstraintExplorer.jl a MOI/JuMP interface to explore search spaces modeled as CP.

JuMP extras

Constraint Programming is slowly making steps into the main JuMP components. However, some extra resources are available as

Meta-solving

MetaStrategist.jl is a meta-solving package in its formative stages, which aims to harness the strengths of CP and JuMP. Its goal is to formulate tailored strategies that take into consideration the unique hardware and software resources at hand, offering a new horizon in problem-solving efficiency and adaptability. Stay tuned!

Performance related tools

We've made a tool for cross-version performance checking that ensures the high efficiency and reliability of our solutions. By facilitating clear and simple performance evaluations, PerfChecker.jl enhances both development and maintenance, contributing to the overall health and progress of Julia (Constraints)'s growing library of resources.

Contributors Page

Acknowledgments

The Julia Constraints community would not be where it is today without the collective efforts of many talented individuals and organizations. We extend our heartfelt thanks to:

  • IIJ Research Lab: The driving force behind more than half of this project!
  • JuMP-dev Community: For their extensive contributions to the development of our packages.
  • Individual Contributors: Numerous developers and researchers who have dedicated their time and skills to enhance our tools.
',2)]))}const p=o(n,[["render",s]]);export{m as __pageData,p as default}; diff --git a/dev/assets/index.md.pHtYR91m.lean.js b/dev/assets/index.md.pHtYR91m.lean.js new file mode 100644 index 0000000..3c16f7b --- /dev/null +++ b/dev/assets/index.md.pHtYR91m.lean.js @@ -0,0 +1 @@ +import{_ as o,c as a,a5 as e,o as i}from"./chunks/framework.CJakPlgM.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Julia Constraints","text":"Model Smoothly Decide Wisely","tagline":"A Toolkit for Constraint Programming","image":{"src":"/logo.png","alt":"JuliaConstraints"},"actions":[{"theme":"brand","text":"Model, Learn, and Solve!","link":"/constraints/00_intro"},{"theme":"alt","text":"View on Github","link":"https://github.com/JuliaConstraints/JuliaConstraints.github.io"}]},"features":[{"icon":"\\"JuMP.jl\\"/","title":"JuMP.jl","details":"Model optimization problems via JuMP.jl!","link":"https://jump.dev/"},{"icon":"\\"PerfChecker.jl\\"/","title":"PerfChecker.jl","details":"Cross-version performance checking tool","link":"https://github.com/JuliaConstraints/PerfChecker.jl"},{"icon":"\\"Pluto.jl\\"/","title":"Pluto.jl","details":"Simple, reactive programming environment via Julia notebooks","link":"https://plutojl.org/"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":null}'),n={name:"index.md"};function s(r,t,l,h,g,u){return i(),a("div",null,t[0]||(t[0]=[e('

What is Julia Constraints?

The Julia Constraints organization serves as a hub for resources to create, understand, and solve optimization through the lens of Constraint Programming. Our goal is to make Constraint Programming accessible and efficient for users at all levels of expertise, by providing a comprehensive suite of tools.

Most tools integrate seamlessly with JuMP, a popular Julia package for mathematical optimization.

Ecosystem overview

Core Packages

The foundation of common packages that provide essential features for constraint programming ensures that users possess the fundamental tools required for their projects.

  • ConstraintCommons.jl is designed to make constraint programming solutions in Julia interoperable. It provides shared structures, abstract types, functions, and generic methods used by both basic feature packages and learning-oriented packages.
  • ConstraintDomains.jl focuses on the definition and manipulation of variable domains, which are used to solve constraint programming problems. This package provides the infrastructure needed to specify both discrete and continuous domains, allowing a wide range of constraint programming applications.
  • Constraints.jl is a key component, specifically designed to facilitate the definition, manipulation, and application of constraints in constraint programming. This package is central to handling both standard and complex constraints, making it an indispensable tool for developers and researchers working in CP.
  • ConstraintModels.jl is a package for Julia Constraints' solvers that stores Constraint Programming models.

Learning and Translation Tools

A collection that bridges the gap between the ease of modeling and computational efficacy. These tools learn from constraints or convert natural language problems into constraint programming solutions, requiring minimal input from the user beyond the model itself.

  • CompositionalNetworks.jl provides interpretable compositional networks (ICN), a combinatorial variant of neural networks that allows the user to obtain interpretable results, unlike regular artificial neural networks.
  • QUBOConstraints.jl is a package that can (automatically) learn QUBO matrices from optimization constraints.
  • ConstraintsTranslator.jl is a tool for converting problems expressed in natural language into optimization models.
  • ConstraintLearning.jl is a common interface that integrates the various components outlined above.

Solvers

We offer a variety of solvers, from native Julia solvers to interfaces with JuMP for external CP solvers, to cater to various problem-solving needs.

  • LocalSearchSolvers.jl is a Julia native framework to (semi-)automatically build Constraint-based Local Search solvers. It serves as a basic for the experimental design or core and learning oriented packages in Julia Constraints.
  • CBLS.jl a MOI/JuMP interface for the above framework!
  • CPLEXCP.jl a Julia interface for CPLEX CP Optimizer.
  • Chuffed.jl a wrapper for the constraint-programming solver Chuffed to Julia.
  • JaCoP.jl a Julia interface for the JaCoP constraint-programming solver.
  • ConstraintExplorer.jl a MOI/JuMP interface to explore search spaces modeled as CP.

JuMP extras

Constraint Programming is slowly making steps into the main JuMP components. However, some extra resources are available as

Meta-solving

MetaStrategist.jl is a meta-solving package in its formative stages, which aims to harness the strengths of CP and JuMP. Its goal is to formulate tailored strategies that take into consideration the unique hardware and software resources at hand, offering a new horizon in problem-solving efficiency and adaptability. Stay tuned!

Performance related tools

We've made a tool for cross-version performance checking that ensures the high efficiency and reliability of our solutions. By facilitating clear and simple performance evaluations, PerfChecker.jl enhances both development and maintenance, contributing to the overall health and progress of Julia (Constraints)'s growing library of resources.

Contributors Page

Acknowledgments

The Julia Constraints community would not be where it is today without the collective efforts of many talented individuals and organizations. We extend our heartfelt thanks to:

  • IIJ Research Lab: The driving force behind more than half of this project!
  • JuMP-dev Community: For their extensive contributions to the development of our packages.
  • Individual Contributors: Numerous developers and researchers who have dedicated their time and skills to enhance our tools.
',2)]))}const p=o(n,[["render",s]]);export{m as __pageData,p as default}; diff --git a/dev/assets/learning_00_intro.md.pkLTZpmG.js b/dev/assets/learning_00_intro.md.CBu38Cu4.js similarity index 59% rename from dev/assets/learning_00_intro.md.pkLTZpmG.js rename to dev/assets/learning_00_intro.md.CBu38Cu4.js index 07a0db5..2500adf 100644 --- a/dev/assets/learning_00_intro.md.pkLTZpmG.js +++ b/dev/assets/learning_00_intro.md.CBu38Cu4.js @@ -1,2 +1 @@ -import{_ as r,c as l,j as a,a as i,G as n,a5 as e,B as o,o as p}from"./chunks/framework.CJakPlgM.js";const T=JSON.parse('{"title":"Learning about Constraints","description":"","frontmatter":{},"headers":[],"relativePath":"learning/00_intro.md","filePath":"learning/00_intro.md","lastUpdated":null}'),d={name:"learning/00_intro.md"},h={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""};function F(f,s,A,B,L,P){const t=o("Badge");return p(),l("div",null,[s[39]||(s[39]=a("h1",{id:"Learning-about-Constraints",tabindex:"-1"},[i("Learning about Constraints "),a("a",{class:"header-anchor",href:"#Learning-about-Constraints","aria-label":'Permalink to "Learning about Constraints {#Learning-about-Constraints}"'},"​")],-1)),s[40]||(s[40]=a("p",null,"About learning constraints related matters.",-1)),s[41]||(s[41]=a("h2",{id:"parameters",tabindex:"-1"},[i("Parameters "),a("a",{class:"header-anchor",href:"#parameters","aria-label":'Permalink to "Parameters"'},"​")],-1)),s[42]||(s[42]=a("p",null,"",-1)),s[43]||(s[43]=a("p",null,"One major challenge of learning the features of constraints is exploring the domains of parameters. To tackle this issue, we provide some way to generate parameters from variables' domains.",-1)),a("details",h,[a("summary",null,[s[0]||(s[0]=a("a",{id:"ConstraintDomains.BoolParameterDomain-learning-00_intro",href:"#ConstraintDomains.BoolParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.BoolParameterDomain")],-1)),s[1]||(s[1]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=e('
julia
BoolParameterDomain <: AbstractDomain

A domain to store boolean values. It is used to generate random parameters.

source

',3))]),a("details",k,[a("summary",null,[s[3]||(s[3]=a("a",{id:"ConstraintDomains.DimParameterDomain-learning-00_intro",href:"#ConstraintDomains.DimParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.DimParameterDomain")],-1)),s[4]||(s[4]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[5]||(s[5]=e('
julia
DimParameterDomain <: AbstractDomain

A domain to store dimensions. It is used to generate random parameters.

source

',3))]),a("details",m,[a("summary",null,[s[6]||(s[6]=a("a",{id:"ConstraintDomains.IdParameterDomain-learning-00_intro",href:"#ConstraintDomains.IdParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.IdParameterDomain")],-1)),s[7]||(s[7]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[8]||(s[8]=e('
julia
IdParameterDomain <: AbstractDomain

A domain to store ids. It is used to generate random parameters.

source

',3))]),a("details",g,[a("summary",null,[s[9]||(s[9]=a("a",{id:"ConstraintDomains.FakeAutomaton-learning-00_intro",href:"#ConstraintDomains.FakeAutomaton-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.FakeAutomaton")],-1)),s[10]||(s[10]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[11]||(s[11]=e('
julia
FakeAutomaton{T} <: ConstraintCommons.AbstractAutomaton

A structure to generate pseudo automaton enough for parameter exploration.

source

',3))]),a("details",u,[a("summary",null,[s[12]||(s[12]=a("a",{id:"ConstraintCommons.accept-learning-00_intro",href:"#ConstraintCommons.accept-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintCommons.accept")],-1)),s[13]||(s[13]=i()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[14]||(s[14]=e('
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

',6))]),a("details",c,[a("summary",null,[s[15]||(s[15]=a("a",{id:"ConstraintDomains.fake_automaton-learning-00_intro",href:"#ConstraintDomains.fake_automaton-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.fake_automaton")],-1)),s[16]||(s[16]=i()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=e('
julia
fake_automaton(d)

Construct a FakeAutomaton.

source

',3))]),a("details",b,[a("summary",null,[s[18]||(s[18]=a("a",{id:"ConstraintDomains.LanguageParameterDomain-learning-00_intro",href:"#ConstraintDomains.LanguageParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.LanguageParameterDomain")],-1)),s[19]||(s[19]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[20]||(s[20]=e('
julia
LanguageParameterDomain <: AbstractDomain

A domain to store languages. It is used to generate random parameters.

source

',3))]),a("details",y,[a("summary",null,[s[21]||(s[21]=a("a",{id:"ConstraintDomains.OpParameterDomain-learning-00_intro",href:"#ConstraintDomains.OpParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.OpParameterDomain")],-1)),s[22]||(s[22]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[23]||(s[23]=e('
julia
OpParameterDomain{T} <: AbstractDomain

A domain to store operators. It is used to generate random parameters.

source

',3))]),a("details",C,[a("summary",null,[s[24]||(s[24]=a("a",{id:"ConstraintDomains.PairVarsParameterDomain-learning-00_intro",href:"#ConstraintDomains.PairVarsParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.PairVarsParameterDomain")],-1)),s[25]||(s[25]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[26]||(s[26]=e('
julia
PairVarsParameterDomain{T} <: AbstractDomain

A domain to store values paired with variables. It is used to generate random parameters.

source

',3))]),a("details",E,[a("summary",null,[s[27]||(s[27]=a("a",{id:"ConstraintDomains.ValParameterDomain-learning-00_intro",href:"#ConstraintDomains.ValParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.ValParameterDomain")],-1)),s[28]||(s[28]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[29]||(s[29]=e('
julia
ValParameterDomain{T} <: AbstractDomain

A domain to store one value. It is used to generate random parameters.

source

',3))]),a("details",j,[a("summary",null,[s[30]||(s[30]=a("a",{id:"ConstraintDomains.ValsParameterDomain-learning-00_intro",href:"#ConstraintDomains.ValsParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.ValsParameterDomain")],-1)),s[31]||(s[31]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[32]||(s[32]=e('
julia
ValsParameterDomain{T} <: AbstractDomain

A domain to store values. It is used to generate random parameters.

source

',3))]),a("details",D,[a("summary",null,[s[33]||(s[33]=a("a",{id:"Base.rand-learning-00_intro",href:"#Base.rand-learning-00_intro"},[a("span",{class:"jlbinding"},"Base.rand")],-1)),s[34]||(s[34]=i()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[35]||(s[35]=e(`
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

`,12))]),a("details",v,[a("summary",null,[s[36]||(s[36]=a("a",{id:"ConstraintDomains.generate_parameters-learning-00_intro",href:"#ConstraintDomains.generate_parameters-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.generate_parameters")],-1)),s[37]||(s[37]=i()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[38]||(s[38]=e('
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source

',3))])])}const O=r(d,[["render",F]]);export{T as __pageData,O as default}; +import{_ as l,c as r,j as a,a as i,G as n,a5 as e,B as o,o as p}from"./chunks/framework.CJakPlgM.js";const T=JSON.parse('{"title":"Learning about Constraints","description":"","frontmatter":{},"headers":[],"relativePath":"learning/00_intro.md","filePath":"learning/00_intro.md","lastUpdated":null}'),h={name:"learning/00_intro.md"},d={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""};function F(f,s,A,B,L,P){const t=o("Badge");return p(),r("div",null,[s[39]||(s[39]=a("h1",{id:"Learning-about-Constraints",tabindex:"-1"},[i("Learning about Constraints "),a("a",{class:"header-anchor",href:"#Learning-about-Constraints","aria-label":'Permalink to "Learning about Constraints {#Learning-about-Constraints}"'},"​")],-1)),s[40]||(s[40]=a("p",null,"About learning constraints related matters.",-1)),s[41]||(s[41]=a("h2",{id:"parameters",tabindex:"-1"},[i("Parameters "),a("a",{class:"header-anchor",href:"#parameters","aria-label":'Permalink to "Parameters"'},"​")],-1)),s[42]||(s[42]=a("p",null,"",-1)),s[43]||(s[43]=a("p",null,"One major challenge of learning the features of constraints is exploring the domains of parameters. To tackle this issue, we provide some way to generate parameters from variables' domains.",-1)),a("details",d,[a("summary",null,[s[0]||(s[0]=a("a",{id:"ConstraintDomains.BoolParameterDomain-learning-00_intro",href:"#ConstraintDomains.BoolParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.BoolParameterDomain")],-1)),s[1]||(s[1]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=e('
julia
BoolParameterDomain <: AbstractDomain

A domain to store boolean values. It is used to generate random parameters.

source

',3))]),a("details",k,[a("summary",null,[s[3]||(s[3]=a("a",{id:"ConstraintDomains.DimParameterDomain-learning-00_intro",href:"#ConstraintDomains.DimParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.DimParameterDomain")],-1)),s[4]||(s[4]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[5]||(s[5]=e('
julia
DimParameterDomain <: AbstractDomain

A domain to store dimensions. It is used to generate random parameters.

source

',3))]),a("details",g,[a("summary",null,[s[6]||(s[6]=a("a",{id:"ConstraintDomains.IdParameterDomain-learning-00_intro",href:"#ConstraintDomains.IdParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.IdParameterDomain")],-1)),s[7]||(s[7]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[8]||(s[8]=e('
julia
IdParameterDomain <: AbstractDomain

A domain to store ids. It is used to generate random parameters.

source

',3))]),a("details",m,[a("summary",null,[s[9]||(s[9]=a("a",{id:"ConstraintDomains.FakeAutomaton-learning-00_intro",href:"#ConstraintDomains.FakeAutomaton-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.FakeAutomaton")],-1)),s[10]||(s[10]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[11]||(s[11]=e('
julia
FakeAutomaton{T} <: ConstraintCommons.AbstractAutomaton

A structure to generate pseudo automaton enough for parameter exploration.

source

',3))]),a("details",u,[a("summary",null,[s[12]||(s[12]=a("a",{id:"ConstraintCommons.accept-learning-00_intro",href:"#ConstraintCommons.accept-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintCommons.accept")],-1)),s[13]||(s[13]=i()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[14]||(s[14]=e('
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

',6))]),a("details",c,[a("summary",null,[s[15]||(s[15]=a("a",{id:"ConstraintDomains.fake_automaton-learning-00_intro",href:"#ConstraintDomains.fake_automaton-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.fake_automaton")],-1)),s[16]||(s[16]=i()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=e('
julia
fake_automaton(d)

Construct a FakeAutomaton.

source

',3))]),a("details",b,[a("summary",null,[s[18]||(s[18]=a("a",{id:"ConstraintDomains.LanguageParameterDomain-learning-00_intro",href:"#ConstraintDomains.LanguageParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.LanguageParameterDomain")],-1)),s[19]||(s[19]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[20]||(s[20]=e('
julia
LanguageParameterDomain <: AbstractDomain

A domain to store languages. It is used to generate random parameters.

source

',3))]),a("details",y,[a("summary",null,[s[21]||(s[21]=a("a",{id:"ConstraintDomains.OpParameterDomain-learning-00_intro",href:"#ConstraintDomains.OpParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.OpParameterDomain")],-1)),s[22]||(s[22]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[23]||(s[23]=e('
julia
OpParameterDomain{T} <: AbstractDomain

A domain to store operators. It is used to generate random parameters.

source

',3))]),a("details",C,[a("summary",null,[s[24]||(s[24]=a("a",{id:"ConstraintDomains.PairVarsParameterDomain-learning-00_intro",href:"#ConstraintDomains.PairVarsParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.PairVarsParameterDomain")],-1)),s[25]||(s[25]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[26]||(s[26]=e('
julia
PairVarsParameterDomain{T} <: AbstractDomain

A domain to store values paired with variables. It is used to generate random parameters.

source

',3))]),a("details",E,[a("summary",null,[s[27]||(s[27]=a("a",{id:"ConstraintDomains.ValParameterDomain-learning-00_intro",href:"#ConstraintDomains.ValParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.ValParameterDomain")],-1)),s[28]||(s[28]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[29]||(s[29]=e('
julia
ValParameterDomain{T} <: AbstractDomain

A domain to store one value. It is used to generate random parameters.

source

',3))]),a("details",j,[a("summary",null,[s[30]||(s[30]=a("a",{id:"ConstraintDomains.ValsParameterDomain-learning-00_intro",href:"#ConstraintDomains.ValsParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.ValsParameterDomain")],-1)),s[31]||(s[31]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[32]||(s[32]=e('
julia
ValsParameterDomain{T} <: AbstractDomain

A domain to store values. It is used to generate random parameters.

source

',3))]),a("details",v,[a("summary",null,[s[33]||(s[33]=a("a",{id:"Base.rand-learning-00_intro",href:"#Base.rand-learning-00_intro"},[a("span",{class:"jlbinding"},"Base.rand")],-1)),s[34]||(s[34]=i()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[35]||(s[35]=e('
julia
Base.rand(::Vector{IntervalsFold})

Extend the Base.rand function to Vector{IntervalsFold}.

source

julia
rand(pf<:PatternFold)

Returns a random value of pf as if it was unfolded.

source

julia
Base.rand(::Vector{AbstractVectorFold})\nExtend the `Base.rand` function to `Vector{AbstractVectorFold}`.

source

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)\nBase.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

',20))]),a("details",D,[a("summary",null,[s[36]||(s[36]=a("a",{id:"ConstraintDomains.generate_parameters-learning-00_intro",href:"#ConstraintDomains.generate_parameters-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.generate_parameters")],-1)),s[37]||(s[37]=i()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[38]||(s[38]=e('
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source

',3))])])}const V=l(h,[["render",F]]);export{T as __pageData,V as default}; diff --git a/dev/assets/learning_00_intro.md.pkLTZpmG.lean.js b/dev/assets/learning_00_intro.md.CBu38Cu4.lean.js similarity index 59% rename from dev/assets/learning_00_intro.md.pkLTZpmG.lean.js rename to dev/assets/learning_00_intro.md.CBu38Cu4.lean.js index 07a0db5..2500adf 100644 --- a/dev/assets/learning_00_intro.md.pkLTZpmG.lean.js +++ b/dev/assets/learning_00_intro.md.CBu38Cu4.lean.js @@ -1,2 +1 @@ -import{_ as r,c as l,j as a,a as i,G as n,a5 as e,B as o,o as p}from"./chunks/framework.CJakPlgM.js";const T=JSON.parse('{"title":"Learning about Constraints","description":"","frontmatter":{},"headers":[],"relativePath":"learning/00_intro.md","filePath":"learning/00_intro.md","lastUpdated":null}'),d={name:"learning/00_intro.md"},h={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""};function F(f,s,A,B,L,P){const t=o("Badge");return p(),l("div",null,[s[39]||(s[39]=a("h1",{id:"Learning-about-Constraints",tabindex:"-1"},[i("Learning about Constraints "),a("a",{class:"header-anchor",href:"#Learning-about-Constraints","aria-label":'Permalink to "Learning about Constraints {#Learning-about-Constraints}"'},"​")],-1)),s[40]||(s[40]=a("p",null,"About learning constraints related matters.",-1)),s[41]||(s[41]=a("h2",{id:"parameters",tabindex:"-1"},[i("Parameters "),a("a",{class:"header-anchor",href:"#parameters","aria-label":'Permalink to "Parameters"'},"​")],-1)),s[42]||(s[42]=a("p",null,"",-1)),s[43]||(s[43]=a("p",null,"One major challenge of learning the features of constraints is exploring the domains of parameters. To tackle this issue, we provide some way to generate parameters from variables' domains.",-1)),a("details",h,[a("summary",null,[s[0]||(s[0]=a("a",{id:"ConstraintDomains.BoolParameterDomain-learning-00_intro",href:"#ConstraintDomains.BoolParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.BoolParameterDomain")],-1)),s[1]||(s[1]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=e('
julia
BoolParameterDomain <: AbstractDomain

A domain to store boolean values. It is used to generate random parameters.

source

',3))]),a("details",k,[a("summary",null,[s[3]||(s[3]=a("a",{id:"ConstraintDomains.DimParameterDomain-learning-00_intro",href:"#ConstraintDomains.DimParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.DimParameterDomain")],-1)),s[4]||(s[4]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[5]||(s[5]=e('
julia
DimParameterDomain <: AbstractDomain

A domain to store dimensions. It is used to generate random parameters.

source

',3))]),a("details",m,[a("summary",null,[s[6]||(s[6]=a("a",{id:"ConstraintDomains.IdParameterDomain-learning-00_intro",href:"#ConstraintDomains.IdParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.IdParameterDomain")],-1)),s[7]||(s[7]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[8]||(s[8]=e('
julia
IdParameterDomain <: AbstractDomain

A domain to store ids. It is used to generate random parameters.

source

',3))]),a("details",g,[a("summary",null,[s[9]||(s[9]=a("a",{id:"ConstraintDomains.FakeAutomaton-learning-00_intro",href:"#ConstraintDomains.FakeAutomaton-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.FakeAutomaton")],-1)),s[10]||(s[10]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[11]||(s[11]=e('
julia
FakeAutomaton{T} <: ConstraintCommons.AbstractAutomaton

A structure to generate pseudo automaton enough for parameter exploration.

source

',3))]),a("details",u,[a("summary",null,[s[12]||(s[12]=a("a",{id:"ConstraintCommons.accept-learning-00_intro",href:"#ConstraintCommons.accept-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintCommons.accept")],-1)),s[13]||(s[13]=i()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[14]||(s[14]=e('
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

',6))]),a("details",c,[a("summary",null,[s[15]||(s[15]=a("a",{id:"ConstraintDomains.fake_automaton-learning-00_intro",href:"#ConstraintDomains.fake_automaton-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.fake_automaton")],-1)),s[16]||(s[16]=i()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=e('
julia
fake_automaton(d)

Construct a FakeAutomaton.

source

',3))]),a("details",b,[a("summary",null,[s[18]||(s[18]=a("a",{id:"ConstraintDomains.LanguageParameterDomain-learning-00_intro",href:"#ConstraintDomains.LanguageParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.LanguageParameterDomain")],-1)),s[19]||(s[19]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[20]||(s[20]=e('
julia
LanguageParameterDomain <: AbstractDomain

A domain to store languages. It is used to generate random parameters.

source

',3))]),a("details",y,[a("summary",null,[s[21]||(s[21]=a("a",{id:"ConstraintDomains.OpParameterDomain-learning-00_intro",href:"#ConstraintDomains.OpParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.OpParameterDomain")],-1)),s[22]||(s[22]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[23]||(s[23]=e('
julia
OpParameterDomain{T} <: AbstractDomain

A domain to store operators. It is used to generate random parameters.

source

',3))]),a("details",C,[a("summary",null,[s[24]||(s[24]=a("a",{id:"ConstraintDomains.PairVarsParameterDomain-learning-00_intro",href:"#ConstraintDomains.PairVarsParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.PairVarsParameterDomain")],-1)),s[25]||(s[25]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[26]||(s[26]=e('
julia
PairVarsParameterDomain{T} <: AbstractDomain

A domain to store values paired with variables. It is used to generate random parameters.

source

',3))]),a("details",E,[a("summary",null,[s[27]||(s[27]=a("a",{id:"ConstraintDomains.ValParameterDomain-learning-00_intro",href:"#ConstraintDomains.ValParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.ValParameterDomain")],-1)),s[28]||(s[28]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[29]||(s[29]=e('
julia
ValParameterDomain{T} <: AbstractDomain

A domain to store one value. It is used to generate random parameters.

source

',3))]),a("details",j,[a("summary",null,[s[30]||(s[30]=a("a",{id:"ConstraintDomains.ValsParameterDomain-learning-00_intro",href:"#ConstraintDomains.ValsParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.ValsParameterDomain")],-1)),s[31]||(s[31]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[32]||(s[32]=e('
julia
ValsParameterDomain{T} <: AbstractDomain

A domain to store values. It is used to generate random parameters.

source

',3))]),a("details",D,[a("summary",null,[s[33]||(s[33]=a("a",{id:"Base.rand-learning-00_intro",href:"#Base.rand-learning-00_intro"},[a("span",{class:"jlbinding"},"Base.rand")],-1)),s[34]||(s[34]=i()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[35]||(s[35]=e(`
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

`,12))]),a("details",v,[a("summary",null,[s[36]||(s[36]=a("a",{id:"ConstraintDomains.generate_parameters-learning-00_intro",href:"#ConstraintDomains.generate_parameters-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.generate_parameters")],-1)),s[37]||(s[37]=i()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[38]||(s[38]=e('
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source

',3))])])}const O=r(d,[["render",F]]);export{T as __pageData,O as default}; +import{_ as l,c as r,j as a,a as i,G as n,a5 as e,B as o,o as p}from"./chunks/framework.CJakPlgM.js";const T=JSON.parse('{"title":"Learning about Constraints","description":"","frontmatter":{},"headers":[],"relativePath":"learning/00_intro.md","filePath":"learning/00_intro.md","lastUpdated":null}'),h={name:"learning/00_intro.md"},d={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""};function F(f,s,A,B,L,P){const t=o("Badge");return p(),r("div",null,[s[39]||(s[39]=a("h1",{id:"Learning-about-Constraints",tabindex:"-1"},[i("Learning about Constraints "),a("a",{class:"header-anchor",href:"#Learning-about-Constraints","aria-label":'Permalink to "Learning about Constraints {#Learning-about-Constraints}"'},"​")],-1)),s[40]||(s[40]=a("p",null,"About learning constraints related matters.",-1)),s[41]||(s[41]=a("h2",{id:"parameters",tabindex:"-1"},[i("Parameters "),a("a",{class:"header-anchor",href:"#parameters","aria-label":'Permalink to "Parameters"'},"​")],-1)),s[42]||(s[42]=a("p",null,"",-1)),s[43]||(s[43]=a("p",null,"One major challenge of learning the features of constraints is exploring the domains of parameters. To tackle this issue, we provide some way to generate parameters from variables' domains.",-1)),a("details",d,[a("summary",null,[s[0]||(s[0]=a("a",{id:"ConstraintDomains.BoolParameterDomain-learning-00_intro",href:"#ConstraintDomains.BoolParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.BoolParameterDomain")],-1)),s[1]||(s[1]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=e('
julia
BoolParameterDomain <: AbstractDomain

A domain to store boolean values. It is used to generate random parameters.

source

',3))]),a("details",k,[a("summary",null,[s[3]||(s[3]=a("a",{id:"ConstraintDomains.DimParameterDomain-learning-00_intro",href:"#ConstraintDomains.DimParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.DimParameterDomain")],-1)),s[4]||(s[4]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[5]||(s[5]=e('
julia
DimParameterDomain <: AbstractDomain

A domain to store dimensions. It is used to generate random parameters.

source

',3))]),a("details",g,[a("summary",null,[s[6]||(s[6]=a("a",{id:"ConstraintDomains.IdParameterDomain-learning-00_intro",href:"#ConstraintDomains.IdParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.IdParameterDomain")],-1)),s[7]||(s[7]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[8]||(s[8]=e('
julia
IdParameterDomain <: AbstractDomain

A domain to store ids. It is used to generate random parameters.

source

',3))]),a("details",m,[a("summary",null,[s[9]||(s[9]=a("a",{id:"ConstraintDomains.FakeAutomaton-learning-00_intro",href:"#ConstraintDomains.FakeAutomaton-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.FakeAutomaton")],-1)),s[10]||(s[10]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[11]||(s[11]=e('
julia
FakeAutomaton{T} <: ConstraintCommons.AbstractAutomaton

A structure to generate pseudo automaton enough for parameter exploration.

source

',3))]),a("details",u,[a("summary",null,[s[12]||(s[12]=a("a",{id:"ConstraintCommons.accept-learning-00_intro",href:"#ConstraintCommons.accept-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintCommons.accept")],-1)),s[13]||(s[13]=i()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[14]||(s[14]=e('
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

',6))]),a("details",c,[a("summary",null,[s[15]||(s[15]=a("a",{id:"ConstraintDomains.fake_automaton-learning-00_intro",href:"#ConstraintDomains.fake_automaton-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.fake_automaton")],-1)),s[16]||(s[16]=i()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=e('
julia
fake_automaton(d)

Construct a FakeAutomaton.

source

',3))]),a("details",b,[a("summary",null,[s[18]||(s[18]=a("a",{id:"ConstraintDomains.LanguageParameterDomain-learning-00_intro",href:"#ConstraintDomains.LanguageParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.LanguageParameterDomain")],-1)),s[19]||(s[19]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[20]||(s[20]=e('
julia
LanguageParameterDomain <: AbstractDomain

A domain to store languages. It is used to generate random parameters.

source

',3))]),a("details",y,[a("summary",null,[s[21]||(s[21]=a("a",{id:"ConstraintDomains.OpParameterDomain-learning-00_intro",href:"#ConstraintDomains.OpParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.OpParameterDomain")],-1)),s[22]||(s[22]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[23]||(s[23]=e('
julia
OpParameterDomain{T} <: AbstractDomain

A domain to store operators. It is used to generate random parameters.

source

',3))]),a("details",C,[a("summary",null,[s[24]||(s[24]=a("a",{id:"ConstraintDomains.PairVarsParameterDomain-learning-00_intro",href:"#ConstraintDomains.PairVarsParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.PairVarsParameterDomain")],-1)),s[25]||(s[25]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[26]||(s[26]=e('
julia
PairVarsParameterDomain{T} <: AbstractDomain

A domain to store values paired with variables. It is used to generate random parameters.

source

',3))]),a("details",E,[a("summary",null,[s[27]||(s[27]=a("a",{id:"ConstraintDomains.ValParameterDomain-learning-00_intro",href:"#ConstraintDomains.ValParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.ValParameterDomain")],-1)),s[28]||(s[28]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[29]||(s[29]=e('
julia
ValParameterDomain{T} <: AbstractDomain

A domain to store one value. It is used to generate random parameters.

source

',3))]),a("details",j,[a("summary",null,[s[30]||(s[30]=a("a",{id:"ConstraintDomains.ValsParameterDomain-learning-00_intro",href:"#ConstraintDomains.ValsParameterDomain-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.ValsParameterDomain")],-1)),s[31]||(s[31]=i()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[32]||(s[32]=e('
julia
ValsParameterDomain{T} <: AbstractDomain

A domain to store values. It is used to generate random parameters.

source

',3))]),a("details",v,[a("summary",null,[s[33]||(s[33]=a("a",{id:"Base.rand-learning-00_intro",href:"#Base.rand-learning-00_intro"},[a("span",{class:"jlbinding"},"Base.rand")],-1)),s[34]||(s[34]=i()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[35]||(s[35]=e('
julia
Base.rand(::Vector{IntervalsFold})

Extend the Base.rand function to Vector{IntervalsFold}.

source

julia
rand(pf<:PatternFold)

Returns a random value of pf as if it was unfolded.

source

julia
Base.rand(::Vector{AbstractVectorFold})\nExtend the `Base.rand` function to `Vector{AbstractVectorFold}`.

source

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)\nBase.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

',20))]),a("details",D,[a("summary",null,[s[36]||(s[36]=a("a",{id:"ConstraintDomains.generate_parameters-learning-00_intro",href:"#ConstraintDomains.generate_parameters-learning-00_intro"},[a("span",{class:"jlbinding"},"ConstraintDomains.generate_parameters")],-1)),s[37]||(s[37]=i()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[38]||(s[38]=e('
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source

',3))])])}const V=l(h,[["render",F]]);export{T as __pageData,V as default}; diff --git a/dev/constraints/00_intro.html b/dev/constraints/00_intro.html index baefc5a..f68a348 100644 --- a/dev/constraints/00_intro.html +++ b/dev/constraints/00_intro.html @@ -8,17 +8,17 @@ - + - + -
Skip to content

Introduction to basics constraint-based modeling tools

Constraint programming (CP) is a high-level paradigm for solving combinatorial problems, and Julia Constraints provides an efficient and flexible framework for developing constraint-based models.

All along this documentation, we will present code example base on the syntaxes of Julia Constraints internals (JC-API), of Julia for Mathematical Programming (JuMP ), of MathOptInterface (MOI), and, when relevant, of other standards such as XCSP.

Terminology

Warning

Terminology in Optimization varies strongly between different methods and communities. In this doc we try to be consistent with the following principles (in bold).

  • Constraint: A general mathematical predicate involving variables.

  • Constraint Instantiation: The application of a constraint to specific variables.

  • Configuration: A specific assignment of values to the variables.

  • Constraint Satisfaction/Violation: Whether a configuration meets or fails a constraint.

Constraint

Definition: A constraint is a formal mathematical statement that expresses a condition or a relation between a set of variables. It can be seen as a predicate that the variables must satisfy.

Example: Consider the constraint x+y10. This constraint involves two variables, x and y, and specifies that their sum must not exceed 10.

Constraint Instantiation

Definition: A constraint instantiation refers to a specific application of a generic constraint to a particular subset of variables from a problem. It is essentially the constraint applied with the actual variables of the problem.

Example: Given the generic constraint x+y10, if we have variables x1 and x2 in our problem, then the instantiated constraint would be x1+x210.

Configuration

Definition: A configuration, also known as an assignment, is a specific set of values assigned to the variables in their respective domains. It represents a possible state of the variables.

Example: For variables x and y with domains [0,10], a configuration could be x=3 and y=2.

Constraint Satisfaction or Violation by a Configuration

Definition: This refers to whether a specific configuration (set of variable assignments) satisfies or violates a given constraint instantiation. A constraint is satisfied if the configuration makes the constraint true; otherwise, it is violated (false).

Example: Given the constraint instantiation x+y10 and the configuration x=3 and y=2, the constraint is satisfied because 3+2=5, which is less than or equal to 10. However, for the configuration x=6 and y=5, the constraint is violated because 6+5=11, which exceeds 10.

Domain-defined variables

In CP, variables are defined through their domain. ConstraintDomains.jl supports various types of domains such as discrete ones (sets, range, etc.), or continuous intervals, and custom domains.

A versatile constraints' API

Constraints.jl implements a wide range of generic and core constraints, ensuring compatibility with XCSP3-core standards and providing a user-friendly interface. It includes features extracted from the learning blocks of Julia Constraints to leverage most of each constraint characteristics.

A collection of models

The ConstraintModels.jl catalog offers a collection of predefined models and templates for constructing complex constraint satisfaction problems (CSPs) and optimization models. This resource provides reusable components to streamline the modeling process.

Contributions with new models are more than welcome!

Internal Aspects

Several internal components are crucial for the efficient functioning of Julia Constraints. ConstraintCommons.jl provides shared functionalities and utilities used across different parts of the framework, contributing to its robust performance and extensibility. However, it is unlikely to be of direct use to most users.

- +
Skip to content

Introduction to basics constraint-based modeling tools

Constraint programming (CP) is a high-level paradigm for solving combinatorial problems, and Julia Constraints provides an efficient and flexible framework for developing constraint-based models.

All along this documentation, we will present code example base on the syntaxes of Julia Constraints internals (JC-API), of Julia for Mathematical Programming (JuMP ), of MathOptInterface (MOI), and, when relevant, of other standards such as XCSP.

Terminology

Warning

Terminology in Optimization varies strongly between different methods and communities. In this doc we try to be consistent with the following principles (in bold).

  • Constraint: A general mathematical predicate involving variables.

  • Constraint Instantiation: The application of a constraint to specific variables.

  • Configuration: A specific assignment of values to the variables.

  • Constraint Satisfaction/Violation: Whether a configuration meets or fails a constraint.

Constraint

Definition: A constraint is a formal mathematical statement that expresses a condition or a relation between a set of variables. It can be seen as a predicate that the variables must satisfy.

Example: Consider the constraint x+y10. This constraint involves two variables, x and y, and specifies that their sum must not exceed 10.

Constraint Instantiation

Definition: A constraint instantiation refers to a specific application of a generic constraint to a particular subset of variables from a problem. It is essentially the constraint applied with the actual variables of the problem.

Example: Given the generic constraint x+y10, if we have variables x1 and x2 in our problem, then the instantiated constraint would be x1+x210.

Configuration

Definition: A configuration, also known as an assignment, is a specific set of values assigned to the variables in their respective domains. It represents a possible state of the variables.

Example: For variables x and y with domains [0,10], a configuration could be x=3 and y=2.

Constraint Satisfaction or Violation by a Configuration

Definition: This refers to whether a specific configuration (set of variable assignments) satisfies or violates a given constraint instantiation. A constraint is satisfied if the configuration makes the constraint true; otherwise, it is violated (false).

Example: Given the constraint instantiation x+y10 and the configuration x=3 and y=2, the constraint is satisfied because 3+2=5, which is less than or equal to 10. However, for the configuration x=6 and y=5, the constraint is violated because 6+5=11, which exceeds 10.

Domain-defined variables

In CP, variables are defined through their domain. ConstraintDomains.jl supports various types of domains such as discrete ones (sets, range, etc.), or continuous intervals, and custom domains.

A versatile constraints' API

Constraints.jl implements a wide range of generic and core constraints, ensuring compatibility with XCSP3-core standards and providing a user-friendly interface. It includes features extracted from the learning blocks of Julia Constraints to leverage most of each constraint characteristics.

A collection of models

The ConstraintModels.jl catalog offers a collection of predefined models and templates for constructing complex constraint satisfaction problems (CSPs) and optimization models. This resource provides reusable components to streamline the modeling process.

Contributions with new models are more than welcome!

Internal Aspects

Several internal components are crucial for the efficient functioning of Julia Constraints. ConstraintCommons.jl provides shared functionalities and utilities used across different parts of the framework, contributing to its robust performance and extensibility. However, it is unlikely to be of direct use to most users.

+ \ No newline at end of file diff --git a/dev/constraints/10_variables_and_domains.html b/dev/constraints/10_variables_and_domains.html index cc5287f..b7be054 100644 --- a/dev/constraints/10_variables_and_domains.html +++ b/dev/constraints/10_variables_and_domains.html @@ -8,16 +8,16 @@ - + - + - + -
Skip to content

Defining Variables and Exploring Domains

ConstraintDomains.jl stands as the standard way to define variables and explore domains within the Julia Constraints ecosystem. This package provides the infrastructure necessary for specifying both discrete and continuous domains. Explorations features are mainly related to the learning about constraints aspect and will be detailed in that chapter.

Variables and their domains can also be defined through MOI and JuMP syntaxes in their respective models.

Implementing the AbstractDomain Interface

At the foundation of ConstraintDomains.jl is the AbstractDomain type, an abstract supertype for all domain types. Implementations of AbstractDomain must provide methods for checking membership (), generating random elements (rand), and determining the domain's size or range (length). These functionalities are essential for defining the behavior and properties of variable domains within constraint models.

ConstraintDomains.AbstractDomain Type
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

  • Base.∈(val, ::D)

  • Base.rand(::D)

  • Base.length(::D) that is the number of elements in a discrete domain, and the distance between bounds or similar for a continuous domain

Additionally, if the domain is used in a dynamic context, it can extend

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source

Discrete Domains

Optimization in discrete spaces has been the core of Constraint Programming since its inception. We provide three kinds of discrete domains.

SetDomain

A SetDomain is simply a Set of unordered numerical values.

julia
using ConstraintDomains
+    
Skip to content

Defining Variables and Exploring Domains

ConstraintDomains.jl stands as the standard way to define variables and explore domains within the Julia Constraints ecosystem. This package provides the infrastructure necessary for specifying both discrete and continuous domains. Explorations features are mainly related to the learning about constraints aspect and will be detailed in that chapter.

Variables and their domains can also be defined through MOI and JuMP syntaxes in their respective models.

Implementing the AbstractDomain Interface

At the foundation of ConstraintDomains.jl is the AbstractDomain type, an abstract supertype for all domain types. Implementations of AbstractDomain must provide methods for checking membership (), generating random elements (rand), and determining the domain's size or range (length). These functionalities are essential for defining the behavior and properties of variable domains within constraint models.

ConstraintDomains.AbstractDomain Type
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

  • Base.∈(val, ::D)

  • Base.rand(::D)

  • Base.length(::D) that is the number of elements in a discrete domain, and the distance between bounds or similar for a continuous domain

Additionally, if the domain is used in a dynamic context, it can extend

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source

Discrete Domains

Optimization in discrete spaces has been the core of Constraint Programming since its inception. We provide three kinds of discrete domains.

SetDomain

A SetDomain is simply a Set of unordered numerical values.

julia
using ConstraintDomains
 
 d1 = domain([53.69, 89.2, 0.12])
 d2 = domain([2//3, 89//123])
@@ -44,7 +44,7 @@
 MOI.add_constraint(optimizer, v3, CBLS.DiscreteSet(4.3))
 
 v4 = MOI.add_variable(optimizer)
-MOI.add_constraint(optimizer, v4, CBLS.DiscreteSet([1, 42, 3.14]))

RangeDomain

A range domain allows for minimal storage and more efficient operation on discrete sets defined as Range in Julia. It is not recommended for dynamic domains (it will be replaced with SetDomain as soon as a non-extremal element is removed).

julia
using ConstraintDomains
+MOI.add_constraint(optimizer, v4, CBLS.DiscreteSet([1, 42, 3.14]))

RangeDomain

A range domain allows for minimal storage and more efficient operation on discrete sets defined as Range in Julia. It is not recommended for dynamic domains (it will be replaced with SetDomain as soon as a non-extremal element is removed).

julia
using ConstraintDomains
 
 d1 = domain(1:5)
 d2 = domain(0.4:0.1:1.3)
julia
## To be implemented
@@ -64,12 +64,12 @@
 
 # v2 = MOI.add_variable(optimizer)
 
-# MOI.add_constraint(optimizer, v1, MOI.RangeSet(0.4:0.1:1.3))

Arbitrary Domains

As odd as it may sound, we provide a constructor for sets of elements making up arbitrary, possibly non-numerical, domains.

Until some practical examples are implemented, this structure will mainly be a placeholder with default behavior.

Continuous Domains

Numerous problems cannot be challenged without expressing at least part of their domains as continuous variables. In Julia Constraints we provide such domains as (set of) intervals.

julia
using ConstraintDomains, Intervals
+# MOI.add_constraint(optimizer, v1, MOI.RangeSet(0.4:0.1:1.3))

Arbitrary Domains

As odd as it may sound, we provide a constructor for sets of elements making up arbitrary, possibly non-numerical, domains.

Until some practical examples are implemented, this structure will mainly be a placeholder with default behavior.

Continuous Domains

Numerous problems cannot be challenged without expressing at least part of their domains as continuous variables. In Julia Constraints we provide such domains as (set of) intervals.

julia
using ConstraintDomains, Intervals
 
 d1 = domain(Interval{Open,Closed}(3.2, true), (42, false))
 d2 = domain(3.2..42)
 d3 = domain([3.2..42, 63.2..324.1])
julia
## see MOI.Interval
julia
## see MOI.Interval
- + \ No newline at end of file diff --git a/dev/constraints/20_constraints.html b/dev/constraints/20_constraints.html index b30d035..5c8a553 100644 --- a/dev/constraints/20_constraints.html +++ b/dev/constraints/20_constraints.html @@ -8,16 +8,16 @@ - + - + -
Skip to content

Interacting with Constraints in Julia

Constraints.jl is designed to facilitate the definition, manipulation, and application of constraints in constraint programming (CP).

Note

It also acts as a catalog of various information and features learned about constraints by the learning part of the ecosystem. Per design, we only store the practical information extracted by those tools (such as CompositionalNetworks or QUBOConstraints) and not the heavy machinery (ConstraintLearning).

Usual Constraints and Parameters

The usual constraints of Julia Constraints are heavily inspired by the core constraints of the XCSP3-core standard. The main difference lies in the name chosen to describe the different parameters those core constraints can have.

In XCSP3, the parameters are described based on their roles, which the user can find as keyword argument in the xcsp_ prefixed collection of constraints (for instance xcsp_all_different). In our the Julia Constraints API (JC-API), the keyword arguments correspond to the nature of each parameter.

ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS Constant
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
+    
Skip to content

Interacting with Constraints in Julia

Constraints.jl is designed to facilitate the definition, manipulation, and application of constraints in constraint programming (CP).

Note

It also acts as a catalog of various information and features learned about constraints by the learning part of the ecosystem. Per design, we only store the practical information extracted by those tools (such as CompositionalNetworks or QUBOConstraints) and not the heavy machinery (ConstraintLearning).

Usual Constraints and Parameters

The usual constraints of Julia Constraints are heavily inspired by the core constraints of the XCSP3-core standard. The main difference lies in the name chosen to describe the different parameters those core constraints can have.

In XCSP3, the parameters are described based on their roles, which the user can find as keyword argument in the xcsp_ prefixed collection of constraints (for instance xcsp_all_different). In our the Julia Constraints API (JC-API), the keyword arguments correspond to the nature of each parameter.

ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS Constant
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
     :bool, # boolean parameter
     :dim, # dimension, an integer parameter used along the pair_vars or vals parameters
     :id, # index to target one variable in the input vector
@@ -27,7 +27,7 @@
     :val, # one scalar value
     :vals, # a list of scalar values (independent of the input vector size)
 ]

source

We provide a couple of methods to navigate the usual constraints extracted from XCSP3-Core.

Constraints.USUAL_CONSTRAINTS Constant
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source

Constraints.describe Function
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

  • constraints::Dict{Symbol,Constraint}: dictionary of constraints to describe. Default is USUAL_CONSTRAINTS.

  • width::Int: width of the table.

Example

julia
describe()

source

Constraints.constraints_parameters Function
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_parameters()

source

Constraints.constraints_descriptions Function
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_descriptions()

source

Concepts, Error Functions, and QUBO matrices

One major use of this collection of usual constraint is to extract the concept or the error function (error_f) of a given constraint.

Constraints.concept Function
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source

julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

  • s::Symbol: the constraint name.

  • args...: the arguments to apply the concept to.

  • kargs...: the keyword arguments to apply the concept to.

Example

julia
concept(:all_different, [1, 2, 3])

source

Note that the error function is a finer estimation of how much a constraint is violated or not. By default, the error_f method simply return 0. if the constraint is satisfied or 1. otherwise.

Efficient versions of error_f are either hand-coded or generated through CompositionalNetworks.jl.

Constraints.error_f Function
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source

Finally, another use is to provide QUBO matrices of those usual constraints through QUBOConstraints.jl. The syntax and interface for this feature are still a work in progress.

- + \ No newline at end of file diff --git a/dev/constraints/21_generic_constraints.html b/dev/constraints/21_generic_constraints.html index 704c993..3e906f2 100644 --- a/dev/constraints/21_generic_constraints.html +++ b/dev/constraints/21_generic_constraints.html @@ -8,16 +8,16 @@ - + - + - + -
Skip to content

Generic Constraints

In the XCSP³-core standard, generic constraints are categorized into two main types: intention and extension constraints.

Intention Constraints

These are constraints that are defined by a logical expression or a function. They are called intentional because they are defined by the property they satisfy. For example, a constraint that specifies that a variable x must be less than a variable y could be defined intentionally as x<y.

Note that the intention constraint is not directly available through the JC-API in Constraints.jl. It is designed as such since defining a constraint through a predicate is the natural way.

We provide a straightforward example through the :dist_different constraint on how to define and add such a constraint in the USUAL_CONSTRAINTS collection.

Higher level modeling languages such as JuMP should provide a Intention interface.

Defining an intention constraint in JC-API

We use the dist_different constraint to illustrate how to define an intention constraint in Constraints.jl. The dist_different constraint ensures that the distances between marks x on a ruler are unique.

|x[1]x[2]||x[3]x[4]|

The constraint is then added to the usual constraints collection.

julia
const description_dist_different = """
+    
Skip to content

Generic Constraints

In the XCSP³-core standard, generic constraints are categorized into two main types: intention and extension constraints.

Intention Constraints

These are constraints that are defined by a logical expression or a function. They are called intentional because they are defined by the property they satisfy. For example, a constraint that specifies that a variable x must be less than a variable y could be defined intentionally as x<y.

Note that the intention constraint is not directly available through the JC-API in Constraints.jl. It is designed as such since defining a constraint through a predicate is the natural way.

We provide a straightforward example through the :dist_different constraint on how to define and add such a constraint in the USUAL_CONSTRAINTS collection.

Higher level modeling languages such as JuMP should provide a Intention interface.

Defining an intention constraint in JC-API

We use the dist_different constraint to illustrate how to define an intention constraint in Constraints.jl. The dist_different constraint ensures that the distances between marks x on a ruler are unique.

|x[1]x[2]||x[3]x[4]|

The constraint is then added to the usual constraints collection.

julia
const description_dist_different = """
 Ensures that the distances between marks on the ruler are unique.
 """
 
@@ -28,7 +28,7 @@
 @usual concept_dist_different(x) = xcsp_intention(
     list = x,
     predicate = predicate_dist_different
-)

Please check the section dedicated to the Golomb Ruler problem to see a use for this constraint. <!– TODO: Golomb Ruler –>

APIs

Note that the intention constraint is not directly available through the JC-API in Constraints.jl. It is designed as such since defining a constraint through a predicate is the natural way.

We provide here a usage example for the :dist_different constraint, previously added to the USUAL_CONSTRAINTS collection.

Higher level modeling language such as JuMP should provide an Intention interface.

julia
using Constraints
+)

Please check the section dedicated to the Golomb Ruler problem to see a use for this constraint. <!– TODO: Golomb Ruler –>

APIs

Note that the intention constraint is not directly available through the JC-API in Constraints.jl. It is designed as such since defining a constraint through a predicate is the natural way.

We provide here a usage example for the :dist_different constraint, previously added to the USUAL_CONSTRAINTS collection.

Higher level modeling language such as JuMP should provide an Intention interface.

julia
using Constraints
 
 concept(:dist_different, x)
 concept(:dist_different)(x)
julia
# Defines the DistDifferent constraint
@@ -67,7 +67,7 @@
 end
 MOI.add_constraint(optimizer, x, CBLS.Intention(y -> abs(y[1] - y[2])  abs(y[3] - y[4])))
 
-MOI.optimize!(optimizer)

Extension Constraints

These are constraints that are defined by explicitly listing all the tuples of values that satisfy the constraint. They are called extensional because they are defined by the set of values they allow. For example, a binary constraint that specifies that a variable X must be either 1 or 2 and a variable Y must be either 3 or 4 could be defined extensionally by the set of tuples (1,3),(1,4),(2,3),(2,4).

These two types of constraints provide a flexible way to define complex relationships between variables in constraint programming.

julia
using Constraints
+MOI.optimize!(optimizer)

Extension Constraints

These are constraints that are defined by explicitly listing all the tuples of values that satisfy the constraint. They are called extensional because they are defined by the set of values they allow. For example, a binary constraint that specifies that a variable X must be either 1 or 2 and a variable Y must be either 3 or 4 could be defined extensionally by the set of tuples (1,3),(1,4),(2,3),(2,4).

These two types of constraints provide a flexible way to define complex relationships between variables in constraint programming.

julia
using Constraints
 
 concept(:dist_different, x)
 concept(:dist_different)(x)
julia
# Defines the DistDifferent constraint
@@ -107,7 +107,7 @@
 MOI.add_constraint(optimizer, x, CBLS.Intention(y -> abs(y[1] - y[2])  abs(y[3] - y[4])))
 
 MOI.optimize!(optimizer)
- + \ No newline at end of file diff --git a/dev/constraints/22_language_constraints.html b/dev/constraints/22_language_constraints.html index 13a87b3..00e950a 100644 --- a/dev/constraints/22_language_constraints.html +++ b/dev/constraints/22_language_constraints.html @@ -8,16 +8,16 @@ - + - + -
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

Constraints defined from Languages

Constraints.xcsp_regular Function
julia
xcsp_regular(; list, automaton)

Ensures that a sequence x (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of x with the language rules encoded within the automaton parameter, which must be an instance of <:AbstractAutomaton.

Arguments

  • list::Vector{Int}: A list of variables

  • automaton<:AbstractAutomaton: An automaton representing the regular language

Variants

  • :regular: Ensures that a sequence x (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of x with the language rules encoded within the automaton parameter, which must be an instance of <:AbstractAutomaton.
julia
concept(:regular, x; language)
+    
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

Constraints defined from Languages

Constraints.xcsp_regular Function
julia
xcsp_regular(; list, automaton)

Ensures that a sequence x (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of x with the language rules encoded within the automaton parameter, which must be an instance of <:AbstractAutomaton.

Arguments

  • list::Vector{Int}: A list of variables

  • automaton<:AbstractAutomaton: An automaton representing the regular language

Variants

  • :regular: Ensures that a sequence x (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of x with the language rules encoded within the automaton parameter, which must be an instance of <:AbstractAutomaton.
julia
concept(:regular, x; language)
 concept(:regular)(x; language)

Examples

julia
c = concept(:regular)
 
 states = Dict(
@@ -63,7 +63,7 @@
 c([2,1,2]; language = a)
 c([1,0,2]; language = a)
 c([0,1,2]; language = a)

source

- + \ No newline at end of file diff --git a/dev/constraints/23_comparison_constraints.html b/dev/constraints/23_comparison_constraints.html index 71e6d65..7815d91 100644 --- a/dev/constraints/23_comparison_constraints.html +++ b/dev/constraints/23_comparison_constraints.html @@ -8,16 +8,16 @@ - + - + - + -
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
+    
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
 
 concept(:all_different, [1,1,1,2]) # false
 concept(:all_different, [1,9,3,2]) # true
julia
using Constraints
@@ -36,7 +36,7 @@
 JuMP.optimize!(model)
 @info "All Different" value.(X) value.(Y)
 
-# Note that this example gives a solution for the all_different constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+# Note that this example gives a solution for the all_different constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 concept(:all_equal, [1,1,1,2]) #false
 concept(:all_equal, [1,1,1,1]) #true
julia
using Constraints
@@ -54,7 +54,7 @@
 JuMP.optimize!(model)
 @info "All Equal" value.(X)
 
-# Note that this example gives a solution for the all_equal constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+# Note that this example gives a solution for the all_equal constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 @info concept(:ordered, [1, 2, 3, 4, 4]; op=≤)
 @info concept(:ordered, [1, 2, 3, 3, 5]; op=<)
@@ -99,7 +99,7 @@
 c([1, 2, 3, 4, 5]; op=<)
 !c([1, 2, 3, 4, 3]; op=≤)
 !c([1, 2, 3, 4, 3]; op=<)

source

- + \ No newline at end of file diff --git a/dev/constraints/24_counting_summing_constraints.html b/dev/constraints/24_counting_summing_constraints.html index 4f86365..0e3aebe 100644 --- a/dev/constraints/24_counting_summing_constraints.html +++ b/dev/constraints/24_counting_summing_constraints.html @@ -8,16 +8,16 @@ - + - + - + -
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
+    
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
 
 @info concept(:sum, [1, 2, 3, 4, 5]; op = ==, val=15)
 @info concept(:sum, [1, 2, 3, 4, 5]; op = ==, val=2)
@@ -39,7 +39,7 @@
 @constraint(model, X in Sum(; op = ==, val = 15))
 @constraint(model, Y in Sum(; op = <=, val = 10))
 JuMP.optimize!(model)
-@info "Sum" value.(X) value.(Y)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "Sum" value.(X) value.(Y)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 concept(:count, [1,1,1,2], vals = [1, 1, 1, 2], op = ==, val = 4) # true
 concept(:count, [1,1,1,2], vals = [1, 1, 1, 2], op = ==, val = 5) # false
@@ -73,7 +73,7 @@
 @constraint(model, X_at_most in AtMost(vals = [1, 2], val = 1))
 @constraint(model, X_exactly in Exactly(vals = [1, 2], val = 2))
 JuMP.optimize!(model)
-@info "Count" value.(X) value.(X_at_least) value.(X_at_most) value.(X_exactly)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "Count" value.(X) value.(X_at_least) value.(X_at_most) value.(X_exactly)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 @info concept(:nvalues, [1, 2, 3, 4, 5]; op = ==, val = 5)
 @info concept(:nvalues, [1, 2, 3, 4, 5]; op = ==, val = 2)
@@ -97,7 +97,7 @@
 @constraint(model, Y in NValues(; op = ==, val = 2))
 @constraint(model, Z in NValues(; op = <=, val = 5, vals = [1, 2]))
 JuMP.optimize!(model)
-@info "NValues" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "NValues" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 # [v1, v2, v3], [v1, a1, a2; v2, b1, b2; v3, c1, c2] means v1 occurs between a1 and a2 times in the first array, similar for v2 and v3.
 
@@ -163,7 +163,7 @@
 
 co = concept(:cardinality_open)
 co([8, 5, 10, 10]; vals=[2 0 1; 5 1 3; 10 2 3])

source

- + \ No newline at end of file diff --git a/dev/constraints/25_connection_constraints.html b/dev/constraints/25_connection_constraints.html index ca242e4..99b6cbb 100644 --- a/dev/constraints/25_connection_constraints.html +++ b/dev/constraints/25_connection_constraints.html @@ -8,16 +8,16 @@ - + - + - + -
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
+    
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
 
 concept(:maximum, [1,1,1,2], val = 2, op = ==) # true
 concept(:maximum, [1,2,4,4], val = 2, op = ==) # false
julia
using Constraints
@@ -34,7 +34,7 @@
 @variable(model, 1X[1:5]5, Int)
 @constraint(model, X in Maximum(; op = ==, val = 5))
 optimize!(model)
-@info "Maximum" value.(X)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "Maximum" value.(X)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 concept(:minimum, [1,1,1,2], val = 1, op = ==) # true
 concept(:minimum, [1,2,4,4], val = 2, op = ==) # false
julia
using Constraints
@@ -53,7 +53,7 @@
 JuMP.optimize!(model)
 @info "Minimum" value.(X)
 
-# Note that this example gives a solution for the minimum constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+# Note that this example gives a solution for the minimum constraint.
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 @info concept(:element, [1, 2, 3, 4, 5]; id=1, val=1)
 @info concept(:element, [1, 2, 3, 4, 5]; id=1, val=2)
@@ -77,7 +77,7 @@
 @constraint(model, Y in Element(; id = 1, val = 1))
 @constraint(model, Z in Element(; id = 2, val = 2))
 JuMP.optimize!(model)
-@info "Element" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "Element" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 @info concept(:channel, [2, 1, 4, 3])
 @info concept(:channel, [1, 2, 3, 4])
@@ -126,7 +126,7 @@
 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

- + \ No newline at end of file diff --git a/dev/constraints/26_packing_scheduling_constraints.html b/dev/constraints/26_packing_scheduling_constraints.html index d956c4e..9eb61a2 100644 --- a/dev/constraints/26_packing_scheduling_constraints.html +++ b/dev/constraints/26_packing_scheduling_constraints.html @@ -8,16 +8,16 @@ - + - + - + -
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
+    
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

julia
using Constraints
 
 @info concept(:cumulative, [1, 2, 3, 4, 5]; val = 1)
 @info concept(:cumulative, [1, 2, 2, 4, 5]; val = 1)
@@ -44,7 +44,7 @@
 @constraint(model,
     Z in Cumulative(; pair_vars = [3 2 5 4 2; 1 2 1 1 3], op = <, val = 5))
 JuMP.optimize!(model)
-@info "Cumulative" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
+@info "Cumulative" value.(X) value.(Y) value.(Z)
julia
# TODO: How to handle intention in JuMP/MOI
julia
using Constraints
 
 @info concept(:no_overlap, [1, 2, 3, 4, 5])
 @info concept(:no_overlap, [1, 2, 3, 4, 1])
@@ -88,7 +88,7 @@
 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

- + \ No newline at end of file diff --git a/dev/constraints/27_graph_constraints.html b/dev/constraints/27_graph_constraints.html index 5befad8..80b481d 100644 --- a/dev/constraints/27_graph_constraints.html +++ b/dev/constraints/27_graph_constraints.html @@ -8,23 +8,23 @@ - + - + -
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

Constraints on Graphs

Constraints.xcsp_circuit Function
julia
xcsp_circuit(; list, size)

Return true if the circuit constraint is satisfied, false otherwise. The circuit constraint is a global constraint used in constraint programming, often in routing problems. It ensures that the values of a list of variables form a circuit, i.e., a sequence where each value is the index of the next value in the sequence, and the sequence eventually loops back to the start.

Arguments

  • list::AbstractVector: list of values to check.

  • size::Int: size of the circuit.

Variants

  • :circuit: The circuit constraint is a global constraint used in constraint programming, often in routing problems. It ensures that the values of a list of variables form a circuit, i.e., a sequence where each value is the index of the next value in the sequence, and the sequence eventually loops back to the start.
julia
concept(:circuit, x; op, val)
+    
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

Constraints on Graphs

Constraints.xcsp_circuit Function
julia
xcsp_circuit(; list, size)

Return true if the circuit constraint is satisfied, false otherwise. The circuit constraint is a global constraint 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

- + \ No newline at end of file diff --git a/dev/constraints/28_elementary_constraints.html b/dev/constraints/28_elementary_constraints.html index 22c40ba..7060ca1 100644 --- a/dev/constraints/28_elementary_constraints.html +++ b/dev/constraints/28_elementary_constraints.html @@ -8,21 +8,21 @@ - + - + -
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

Elementary Constraints

Constraints.xcsp_instantiation Function
julia
xcsp_instantiation(; list, values)

Return true if the instantiation constraint is satisfied, false otherwise. The instantiation constraint is a global constraint used in constraint programming that ensures that a list of variables takes on a specific set of values in a specific order.

Arguments

  • list::AbstractVector: list of values to check.

  • values::AbstractVector: list of values to check against.

Variants

  • :instantiation: The instantiation constraint is a global constraint used in constraint programming that ensures that a list of variables takes on a specific set of values in a specific order.
julia
concept(:instantiation, x; pair_vars)
+    
Skip to content

Constraints.jl: Streamlining Constraint Definition and Integration in Julia

Elementary Constraints

Constraints.xcsp_instantiation Function
julia
xcsp_instantiation(; list, values)

Return true if the instantiation constraint is satisfied, false otherwise. The instantiation constraint is a global constraint 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

- + \ No newline at end of file diff --git a/dev/constraints/40_constraint_models.html b/dev/constraints/40_constraint_models.html index b1a7067..13f0b67 100644 --- a/dev/constraints/40_constraint_models.html +++ b/dev/constraints/40_constraint_models.html @@ -8,16 +8,16 @@ - + - + -
Skip to content

ConstraintModels.jl

Documentation for ConstraintModels.jl.

ConstraintModels.SudokuInstance Type
julia
mutable struct SudokuInstance{T <: Integer} <: AbstractMatrix{T}

A struct for SudokuInstances, which is a subtype of AbstractMatrix.

julia
SudokuInstance(A::AbstractMatrix{T})
+    
Skip to content

ConstraintModels.jl

Documentation for ConstraintModels.jl.

ConstraintModels.SudokuInstance Type
julia
mutable struct SudokuInstance{T <: Integer} <: AbstractMatrix{T}

A struct for SudokuInstances, which is a subtype of AbstractMatrix.

julia
SudokuInstance(A::AbstractMatrix{T})
 SudokuInstance(::Type{T}, n::Int) # fill in blank sudoku of type T
 SudokuInstance(n::Int) # fill in blank sudoku of type Int
 SudokuInstance(::Type{T}) # fill in "standard" 9×9 sudoku of type T
@@ -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/60_constraint_commons.html b/dev/constraints/60_constraint_commons.html index 06cc5f3..492f81f 100644 --- a/dev/constraints/60_constraint_commons.html +++ b/dev/constraints/60_constraint_commons.html @@ -8,16 +8,16 @@ - + - + -
Skip to content

ConstraintCommons.jl

ConstraintCommons.jl is an essential package within the Julia Constraints ecosystem designed to facilitate the development and interoperability of constraint programming solutions in Julia. It serves as a foundational layer that provides shared structures, abstract types, functions, and generic methods utilized by both basic feature packages and learning-oriented packages.

Only advanced users or package developers are likely to use it. The package covers parameters, (regular) languages, Core or Base methods extensions, sampling, extrema, and dictionaries.

Parameters

This section of the package list or extract parameters based on the XCSP3-core specifications. Note that, for the foreseeable future, the default constraints specification will follow these specifications.

ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS Constant
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
+    
Skip to content

ConstraintCommons.jl

ConstraintCommons.jl is an essential package within the Julia Constraints ecosystem designed to facilitate the development and interoperability of constraint programming solutions in Julia. It serves as a foundational layer that provides shared structures, abstract types, functions, and generic methods utilized by both basic feature packages and learning-oriented packages.

Only advanced users or package developers are likely to use it. The package covers parameters, (regular) languages, Core or Base methods extensions, sampling, extrema, and dictionaries.

Parameters

This section of the package list or extract parameters based on the XCSP3-core specifications. Note that, for the foreseeable future, the default constraints specification will follow these specifications.

ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS Constant
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
     :bool, # boolean parameter
     :dim, # dimension, an integer parameter used along the pair_vars or vals parameters
     :id, # index to target one variable in the input vector
@@ -26,8 +26,8 @@
     :pair_vars, # a list of parameters that are paired with each variable in the input vector
     :val, # one scalar value
     :vals, # a list of scalar values (independent of the input vector size)
-]

source

ConstraintCommons.extract_parameters Function
julia
extract_parameters(m::Union{Method, Function}; parameters)

Extracts the intersection between the kargs of m and parameters (defaults to USUAL_CONSTRAINT_PARAMETERS).

source

julia
extract_parameters(s::Symbol, constraints_dict=USUAL_CONSTRAINTS; parameters=ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS)

Return the parameters of the constraint s in constraints_dict.

Arguments

  • s::Symbol: the constraint name.

  • constraints_dict::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

  • parameters::Vector{Symbol}: vector of parameters. Default is ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS.

Example

julia
extract_parameters(:all_different)

source

Performances

Bench Evolution ParametersChair Evolution Parameters

Languages

XCSP3 considers two kinds of structure to recognize languages as core constraints: Automata, Multivalued Decision Diagrams (MMDs).

ConstraintCommons.AbstractMultivaluedDecisionDiagram Type
julia
AbstractMultivaluedDecisionDiagram

An abstract interface for Multivalued Decision Diagrams (MDD) used in Julia Constraints packages. Requirements:

  • accept(a<:AbstractMultivaluedDecisionDiagram, word): return true if a accepts word.

source

ConstraintCommons.MDD Type
julia
MDD{S,T} <: AbstractMultivaluedDecisionDiagram

A minimal implementation of a multivalued decision diagram structure.

source

ConstraintCommons.AbstractAutomaton Type
julia
AbstractAutomaton

An abstract interface for automata used in Julia Constraints packages. Requirements:

  • accept(a<:AbstractAutomaton, word): return true if a accepts word.

source

ConstraintCommons.Automaton Type
julia
Automaton{S, T, F <: Union{S, Vector{S}, Set{S}}} <: AbstractAutomaton

A minimal implementation of a deterministic automaton structure.

source

ConstraintCommons.accept Function
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

ConstraintCommons.at_end Function
julia
at_end(a::Automaton, s)

Internal method used by accept with Automaton.

source

Performances

Bench Evolution Automata
Chair Evolution Automata
Bench Evolution Diagrams
Chair Evolution Diagrams

Extensions

We extend some operations for Nothing and Symbol.

ConstraintCommons.symcon Function
julia
symcon(s1::Symbol, s2::Symbol, connector::AbstractString="_")

Extends * to Symbols multiplication by connecting the symbols by an _.

source

ConstraintCommons.consin Function
julia
consin(::Any, ::Nothing)

Extends Base.in (or ) when the set is nothing. Returns false.

source

ConstraintCommons.consisempty Function
julia
consisempty(::Nothing)

Extends Base.isempty when the set is nothing. Returns true.

source

Performances

Bench Evolution Nothing
Chair Evolution Nothing
Bench Evolution Symbols
Chair Evolution Symbols

Sampling

During our constraint learning processes, we use sampling to efficiently make partial exploration of search spaces. The following are some examples of sampling utilities.

ConstraintCommons.oversample Function
julia
oversample(X, f)

Oversample elements of X until the boolean function f has as many true and false configurations.

source

Performances

Bench EvolutionChair Evolution

Extrema

We need to compute the difference between extrema of various kind of collections in several situations.

ConstraintCommons.δ_extrema Function
julia
δ_extrema(X...)

Compute both the difference between the maximum and the minimum of over all the collections of X.

source

Performances

Bench EvolutionChair Evolution

Dictionaries

We provide the ever-useful incsert! function for dictionaries.

ConstraintCommons.incsert! Function
julia
incsert!(d::Union{AbstractDict, AbstractDictionary}, ind, val = 1)

Increase or insert a counter in a dictionary-based collection. The counter insertion defaults to val = 1.

source

Performances

Bench EvolutionChair Evolution
- +]

source

ConstraintCommons.extract_parameters Function
julia
extract_parameters(m::Union{Method, Function}; parameters)

Extracts the intersection between the kargs of m and parameters (defaults to USUAL_CONSTRAINT_PARAMETERS).

source

julia
extract_parameters(s::Symbol, constraints_dict=USUAL_CONSTRAINTS; parameters=ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS)

Return the parameters of the constraint s in constraints_dict.

Arguments

  • s::Symbol: the constraint name.

  • constraints_dict::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

  • parameters::Vector{Symbol}: vector of parameters. Default is ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS.

Example

julia
extract_parameters(:all_different)

source

Performances

Bench Evolution ParametersChair Evolution Parameters

Languages

XCSP3 considers two kinds of structure to recognize languages as core constraints: Automata, Multivalued Decision Diagrams (MMDs).

ConstraintCommons.AbstractMultivaluedDecisionDiagram Type
julia
AbstractMultivaluedDecisionDiagram

An abstract interface for Multivalued Decision Diagrams (MDD) used in Julia Constraints packages. Requirements:

  • accept(a<:AbstractMultivaluedDecisionDiagram, word): return true if a accepts word.

source

ConstraintCommons.MDD Type
julia
MDD{S,T} <: AbstractMultivaluedDecisionDiagram

A minimal implementation of a multivalued decision diagram structure.

source

ConstraintCommons.AbstractAutomaton Type
julia
AbstractAutomaton

An abstract interface for automata used in Julia Constraints packages. Requirements:

  • accept(a<:AbstractAutomaton, word): return true if a accepts word.

source

ConstraintCommons.Automaton Type
julia
Automaton{S, T, F <: Union{S, Vector{S}, Set{S}}} <: AbstractAutomaton

A minimal implementation of a deterministic automaton structure.

source

ConstraintCommons.accept Function
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

ConstraintCommons.at_end Function
julia
at_end(a::Automaton, s)

Internal method used by accept with Automaton.

source

Performances

Bench Evolution Automata
Chair Evolution Automata
Bench Evolution Diagrams
Chair Evolution Diagrams

Extensions

We extend some operations for Nothing and Symbol.

ConstraintCommons.symcon Function
julia
symcon(s1::Symbol, s2::Symbol, connector::AbstractString="_")

Extends * to Symbols multiplication by connecting the symbols by an _.

source

ConstraintCommons.consin Function
julia
consin(::Any, ::Nothing)

Extends Base.in (or ) when the set is nothing. Returns false.

source

ConstraintCommons.consisempty Function
julia
consisempty(::Nothing)

Extends Base.isempty when the set is nothing. Returns true.

source

Performances

Bench Evolution Nothing
Chair Evolution Nothing
Bench Evolution Symbols
Chair Evolution Symbols

Sampling

During our constraint learning processes, we use sampling to efficiently make partial exploration of search spaces. The following are some examples of sampling utilities.

ConstraintCommons.oversample Function
julia
oversample(X, f)

Oversample elements of X until the boolean function f has as many true and false configurations.

source

Performances

Bench EvolutionChair Evolution

Extrema

We need to compute the difference between extrema of various kind of collections in several situations.

ConstraintCommons.δ_extrema Function
julia
δ_extrema(X...)

Compute both the difference between the maximum and the minimum of over all the collections of X.

source

Performances

Bench EvolutionChair Evolution

Dictionaries

We provide the ever-useful incsert! function for dictionaries.

ConstraintCommons.incsert! Function
julia
incsert!(d::Union{AbstractDict, AbstractDictionary}, ind, val = 1)

Increase or insert a counter in a dictionary-based collection. The counter insertion defaults to val = 1.

source

Performances

Bench EvolutionChair Evolution
+ \ No newline at end of file diff --git a/dev/constraints/61_pattern_folds.html b/dev/constraints/61_pattern_folds.html new file mode 100644 index 0000000..c42308b --- /dev/null +++ b/dev/constraints/61_pattern_folds.html @@ -0,0 +1,25 @@ + + + + + + PatternFolds.jl | Julia Constraints + + + + + + + + + + + + + +
Skip to content

PatternFolds.jl

Documentation for PatternFolds.jl.

PatternFolds.PatternFold Type
julia
PatternFold{T, P}

A Union type used as an interface for folded patterns such as VectorFold. To implement the interface and inherit from it, a new structure MyFold{T[,P]} must define three fields:

  • pattern::P. Note that both length(::P) and rand(::P) methods must be available

  • gap::TS

  • folds::int

Finally one can redefine PatternFold

julia
PatternFold{T} = Union{AbstractVectorFold{T}, IntervalsFold{T}, MyFold{T[,P]}}

source

PatternFolds.AbstractVectorFold Type
julia
AbstractVectorFold{T, P}

An abstract type used as an interface for folded vectors such as VectorFold. To implement the interface and inherit from it, a new structure must define three fields:

  • pattern::P. Note that both length(::P) and rand(::P) methods must be available

  • gap::T

  • folds::int

source

PatternFolds.IVectorFold Type
julia
VectorFold{T,V <: AbstractVector{T}}

A folded vector structure that extends the methods of AbstractVector to a folded structure.

source

PatternFolds.VectorFold Type
julia
VectorFold{T,V <: AbstractVector{T}}

A mutable structure for folded vector that extends the methods of AbstractVector. Compared to IVectorFold, this tructure is about 20% faster using iterators. Note that this structure keep an active pointer to the current unfolded pattern. However, its external behavior is similar to IVectorFold.

source

Base.iterate Method
julia
iterate(iter)

Extends iterate methods from Base to allow forward and reverse iteration on both VectorFold and MVectorFold.

source

Base.length Method
julia
length(pf<:PatternFold)

Return the length of pf if unfolded.

source

Base.rand Method
julia
rand(pf<:PatternFold)

Returns a random value of pf as if it was unfolded.

source

Base.rand Method
julia
Base.rand(::Vector{AbstractVectorFold})
+Extend the `Base.rand` function to `Vector{AbstractVectorFold}`.

source

Base.rand Method
julia
Base.rand(::Vector{IntervalsFold})

Extend the Base.rand function to Vector{IntervalsFold}.

source

PatternFolds.fold Method
julia
fold(v::V, depth = 0)

returns a suitable VectorFold, which when unfolded gives the Vector V.

source

PatternFolds.folds Method
julia
folds(<:PatternFold)

Return the number of folds. An infinite folded pattern returns 0.

source

PatternFolds.gap Method
julia
gap(<:PatternFold)

Return the gap between the starts of consecutive folds.

source

PatternFolds.make_vector_fold Function
julia
make_vector_fold(pattern, gap, fold, kind = :mutable)

A dispatcher to construct a folded vector. The kind of vector can be set to either :mutable (default) or :immutable. The default is faster in most cases but it depends on the pattern, gap, and fold parameters. For critical code, it is recommended to benchmark both options.

source

PatternFolds.pattern Method
julia
pattern(vf, index)

Return the element at index in the original pattern.

source

PatternFolds.pattern Method
julia
pattern(<:PatternFold)

Return the pattern of any PatternFold. The pattern defines the occurrences of the first fold.

source

PatternFolds.pattern_length Method
julia
pattern_length(pf<:PatternFold)

Return the length of the basic pattern of pf.

source

PatternFolds.reset_pattern! Method
julia
reset_pattern!(<:PatternFold)

Reset the unfolded pattern to the first fold.

source

PatternFolds.set_fold! Function
julia
set_fold!(mvf::VectorFold, new_fold = mvf.current + 1)

Set the unfolded pattern to new_fold. By default move the next fold after current.

source

PatternFolds.unfold Method
julia
unfold(vf::VectorFold; from=1, to=folds(vf))

Construct the unfolded version of vf (with the same type as pattern(vf)) based. Please note that using an iterator on vf avoid memory allocation, which is not the case of unfold.

source

+ + + + \ No newline at end of file diff --git a/dev/constraints/61_constraint_domains.html b/dev/constraints/62_constraint_domains.html similarity index 62% rename from dev/constraints/61_constraint_domains.html rename to dev/constraints/62_constraint_domains.html index e9099de..5bcce66 100644 --- a/dev/constraints/61_constraint_domains.html +++ b/dev/constraints/62_constraint_domains.html @@ -8,59 +8,64 @@ - + - + - + -
Skip to content

ConstraintDomains.jl: Defining Variables and Exploring Domains

ConstraintDomains.jl is the standard way to define variables and explore domains in the Julia Constraints ecosystem. This package can be used to specify both discrete and continuous domains. Explorations features are primarily related to learning about constraints, aka constraint learning.

Most users should use it through JuMP/MOI interfaces.

Commons

ConstraintDomains.AbstractDomain Type
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

  • Base.∈(val, ::D)

  • Base.rand(::D)

  • Base.length(::D) that is the number of elements in a discrete domain, and the distance between bounds or similar for a continuous domain

Additionally, if the domain is used in a dynamic context, it can extend

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source

ConstraintDomains.EmptyDomain Type
julia
EmptyDomain

A struct to handle yet to be defined domains.

source

ConstraintDomains.domain Function
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+    
Skip to content

ConstraintDomains.jl: Defining Variables and Exploring Domains

ConstraintDomains.jl is the standard way to define variables and explore domains in the Julia Constraints ecosystem. This package can be used to specify both discrete and continuous domains. Explorations features are primarily related to learning about constraints, aka constraint learning.

Most users should use it through JuMP/MOI interfaces.

Commons

ConstraintDomains.AbstractDomain Type
julia
AbstractDomain

An abstract super type for any domain type. A domain type D <: AbstractDomain must implement the following methods to properly interface AbstractDomain.

  • Base.∈(val, ::D)

  • Base.rand(::D)

  • Base.length(::D) that is the number of elements in a discrete domain, and the distance between bounds or similar for a continuous domain

Additionally, if the domain is used in a dynamic context, it can extend

  • add!(::D, args)

  • delete!(::D, args)

where args depends on D's structure

source

ConstraintDomains.EmptyDomain Type
julia
EmptyDomain

A struct to handle yet to be defined domains.

source

ConstraintDomains.domain Function
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
 domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

julia
domain(values)
 domain(range::R) where {T <: Real, R <: AbstractRange{T}}

Construct either a SetDomain or a RangeDomain.

julia
d1 = domain(1:5)
 d2 = domain([53.69, 89.2, 0.12])
 d3 = domain([2//3, 89//123])
 d4 = domain(4.3)
-d5 = domain(1,42,86.9)

source

ConstraintDomains.domain_size Function
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

ConstraintDomains.get_domain Function
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

ConstraintDomains.to_domains Function
julia
to_domains(args...)

Convert various arguments into valid domains format.

source

Extension to Base module

Base.in Function
julia
x::Variable constraint
-value  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source

Base.rand Function
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

Base.isempty Function
julia
Base.isempty(d <: AbstractDomain)

Fallback method for isempty(d) that return length(d) == 0 which default to 0.

source

Base.rand Function
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

Base.string Function
julia
Base.string(D::Vector{<:AbstractDomain})
-Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source

Performances

Bench Evolution CommonChair Evolution Common

Continuous

ConstraintDomains.ContinuousDomain Type
julia
ContinuousDomain{T <: Real} <: AbstractDomain

An abstract supertype for all continuous domains.

source

ConstraintDomains.Intervals Type
julia
Intervals{T <: Real} <: ContinuousDomain{T}

An encapsuler to store a vector of PatternFolds.Interval. Dynamic changes to Intervals are not handled yet.

source

ConstraintDomains.domain Function
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+d5 = domain(1,42,86.9)

source

ConstraintDomains.domain_size Function
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

ConstraintDomains.get_domain Function
julia
get_domain(::AbstractDomain)

Access the internal structure of any domain type.

source

ConstraintDomains.to_domains Function
julia
to_domains(args...)

Convert various arguments into valid domains format.

source

Extension to Base module

Base.in Function
julia
x::Variable constraint
+value  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source

Base.rand Function
julia
Base.rand(::Vector{IntervalsFold})

Extend the Base.rand function to Vector{IntervalsFold}.

source

julia
rand(pf<:PatternFold)

Returns a random value of pf as if it was unfolded.

source

julia
Base.rand(::Vector{AbstractVectorFold})
+Extend the `Base.rand` function to `Vector{AbstractVectorFold}`.

source

julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

Base.isempty Function
julia
Base.isempty(d <: AbstractDomain)

Fallback method for isempty(d) that return length(d) == 0 which default to 0.

source

Base.rand Function
julia
Base.rand(::Vector{IntervalsFold})

Extend the Base.rand function to Vector{IntervalsFold}.

source

julia
rand(pf<:PatternFold)

Returns a random value of pf as if it was unfolded.

source

julia
Base.rand(::Vector{AbstractVectorFold})
+Extend the `Base.rand` function to `Vector{AbstractVectorFold}`.

source

julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

Base.string Function
julia
Base.string(D::Vector{<:AbstractDomain})
+Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source

Performances

Bench Evolution CommonChair Evolution Common

Continuous

ConstraintDomains.ContinuousDomain Type
julia
ContinuousDomain{T <: Real} <: AbstractDomain

An abstract supertype for all continuous domains.

source

ConstraintDomains.Intervals Type
julia
Intervals{T <: Real} <: ContinuousDomain{T}

An encapsuler to store a vector of PatternFolds.Interval. Dynamic changes to Intervals are not handled yet.

source

ConstraintDomains.domain Function
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
 domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

julia
domain(values)
 domain(range::R) where {T <: Real, R <: AbstractRange{T}}

Construct either a SetDomain or a RangeDomain.

julia
d1 = domain(1:5)
 d2 = domain([53.69, 89.2, 0.12])
 d3 = domain([2//3, 89//123])
 d4 = domain(4.3)
-d5 = domain(1,42,86.9)

source

ConstraintDomains.domain_size Function
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

ConstraintDomains.merge_domains Function
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source

ConstraintDomains.intersect_domains Function
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

ConstraintDomains.intersect_domains! Function
julia
intersect_domains!(is, i, new_itvls)

Compute the intersections of a domain with an interval and store the results in new_itvls.

Arguments

  • is::IS: a collection of intervals.

  • i::I: an interval.

  • new_itvls::Vector{I}: a vector to store the results.

source

ConstraintDomains.size Function
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source

Extension to Base module

Base.length Function
julia
length(layer)

Return the number of operations in a layer.

source

julia
Base.length(icn)

Return the total number of operations of an ICN.

source

julia
Base.rand(d <: AbstractDomain)

Fallback method for length(d) that return 0.

source

julia
Base.length(itv::Intervals)

Return the sum of the length of each interval in itv.

source

julia
Base.length(d::D) where D <: DiscreteDomain

Return the number of points in d.

source

Base.rand Function
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

Base.in Function
julia
x::Variable constraint
-value  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source

Base.string Function
julia
Base.string(D::Vector{<:AbstractDomain})
-Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source

Performances

Bench Evolution ContinuousChair Evolution Continuous

Discrete

ConstraintDomains.DiscreteDomain Type
julia
DiscreteDomain{T <: Number} <: AbstractDomain

An abstract supertype for discrete domains (set, range).

source

ConstraintDomains.SetDomain Type
julia
SetDomain{T <: Number} <: DiscreteDomain{T}

Domain that stores discrete values as a set of (unordered) points.

source

ConstraintDomains.RangeDomain Type
julia
RangeDomain

A discrete domain defined by a range <: AbstractRange{Real}. As ranges are immutable in Julia, changes in RangeDomain must use set_domain!.

source

ConstraintDomains.ArbitraryDomain Function
julia
ArbitraryDomain{T} <: DiscreteDomain{T}

A domain type that stores arbitrary values, possibly non numeric, of type T.

source

ConstraintDomains.domain Function
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
+d5 = domain(1,42,86.9)

source

ConstraintDomains.domain_size Function
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

ConstraintDomains.merge_domains Function
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source

ConstraintDomains.intersect_domains Function
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

ConstraintDomains.intersect_domains! Function
julia
intersect_domains!(is, i, new_itvls)

Compute the intersections of a domain with an interval and store the results in new_itvls.

Arguments

  • is::IS: a collection of intervals.

  • i::I: an interval.

  • new_itvls::Vector{I}: a vector to store the results.

source

ConstraintDomains.size Function
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source

Extension to Base module

Base.length Function
julia
length(layer)

Return the number of operations in a layer.

source

julia
Base.length(icn)

Return the total number of operations of an ICN.

source

julia
length(pf<:PatternFold)

Return the length of pf if unfolded.

source

julia
Base.rand(d <: AbstractDomain)

Fallback method for length(d) that return 0.

source

julia
Base.length(itv::Intervals)

Return the sum of the length of each interval in itv.

source

julia
Base.length(d::D) where D <: DiscreteDomain

Return the number of points in d.

source

Base.rand Function
julia
Base.rand(::Vector{IntervalsFold})

Extend the Base.rand function to Vector{IntervalsFold}.

source

julia
rand(pf<:PatternFold)

Returns a random value of pf as if it was unfolded.

source

julia
Base.rand(::Vector{AbstractVectorFold})
+Extend the `Base.rand` function to `Vector{AbstractVectorFold}`.

source

julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

Base.in Function
julia
x::Variable constraint
+value  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source

Base.string Function
julia
Base.string(D::Vector{<:AbstractDomain})
+Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source

Performances

Bench Evolution ContinuousChair Evolution Continuous

Discrete

ConstraintDomains.DiscreteDomain Type
julia
DiscreteDomain{T <: Number} <: AbstractDomain

An abstract supertype for discrete domains (set, range).

source

ConstraintDomains.SetDomain Type
julia
SetDomain{T <: Number} <: DiscreteDomain{T}

Domain that stores discrete values as a set of (unordered) points.

source

ConstraintDomains.RangeDomain Type
julia
RangeDomain

A discrete domain defined by a range <: AbstractRange{Real}. As ranges are immutable in Julia, changes in RangeDomain must use set_domain!.

source

ConstraintDomains.ArbitraryDomain Function
julia
ArbitraryDomain{T} <: DiscreteDomain{T}

A domain type that stores arbitrary values, possibly non numeric, of type T.

source

ConstraintDomains.domain Function
julia
domain()

Construct an EmptyDomain.

source

julia
domain(a::Tuple{T, Bool}, b::Tuple{T, Bool}) where {T <: Real}
 domain(intervals::Vector{Tuple{Tuple{T, Bool},Tuple{T, Bool}}}) where {T <: Real}

Construct a domain of continuous interval(s).

source

julia
domain(values)
 domain(range::R) where {T <: Real, R <: AbstractRange{T}}

Construct either a SetDomain or a RangeDomain.

julia
d1 = domain(1:5)
 d2 = domain([53.69, 89.2, 0.12])
 d3 = domain([2//3, 89//123])
 d4 = domain(4.3)
-d5 = domain(1,42,86.9)

source

ConstraintDomains.domain_size Function
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

ConstraintDomains.add! Function
julia
add!(d::SetDomain, value)

Add value to the list of points in d.

source

ConstraintDomains.merge_domains Function
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source

ConstraintDomains.intersect_domains Function
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

ConstraintDomains.size Function
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source

Extension to Base module

Base.delete! Function
julia
Base.delete!(d::SetDomain, value)(d::SetDomain, value)

Delete value from the list of points in d.

source

Base.length Function
julia
length(layer)

Return the number of operations in a layer.

source

julia
Base.length(icn)

Return the total number of operations of an ICN.

source

julia
Base.rand(d <: AbstractDomain)

Fallback method for length(d) that return 0.

source

julia
Base.length(itv::Intervals)

Return the sum of the length of each interval in itv.

source

julia
Base.length(d::D) where D <: DiscreteDomain

Return the number of points in d.

source

Base.rand Function
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

Base.in Function
julia
x::Variable constraint
-value  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source

Base.string Function
julia
Base.string(D::Vector{<:AbstractDomain})
-Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source

Performances

Bench Evolution DiscreteChair Evolution Discrete

General

Base.eltype Function
julia
Base.eltype(::AbstractDomain)

Extend eltype for domains.

source

Base.convert Function
julia
Base.convert(::Type{Union{Intervals, RangeDomain}}, d::Union{Intervals, RangeDomain})

Extends Base.convert for domains.

source

Exploration

ConstraintDomains.Explorer Type

Explorer(concepts, domains, objective = nothing; settings = ExploreSettings(domains))

Create an Explorer object for searching a constraint satisfaction problem space.

Arguments

  • concepts: A collection of tuples, each containing a concept function and its associated variable indices.

  • domains: A collection of domains representing the search space.

  • objective: An optional objective function for optimization problems.

  • settings: An ExploreSettings object to configure the exploration process.

Returns

An Explorer object ready for exploration.

Example

julia
domains = [domain([1, 2, 3]), domain([4, 5, 6])]
+d5 = domain(1,42,86.9)

source

ConstraintDomains.domain_size Function
julia
domain_size(d <: AbstractDomain)

Fallback method for domain_size(d) that return length(d).

source

julia
domain_size(itv::Intervals)

Return the difference between the highest and lowest values in itv.

source

julia
domain_size(d::D) where D <: DiscreteDomain

Return the maximum distance between two points in d.

source

ConstraintDomains.add! Function
julia
add!(d::SetDomain, value)

Add value to the list of points in d.

source

ConstraintDomains.merge_domains Function
julia
merge_domains(d₁::AbstractDomain, d₂::AbstractDomain)

Merge two domains of same nature (discrete/contiuous).

source

ConstraintDomains.intersect_domains Function
julia
intersect_domains(d₁, d₂)

Compute the intersections of two domains.

source

ConstraintDomains.size Function
julia
Base.size(i::I) where {I <: Interval}

Defines the size of an interval as its span.

source

Extension to Base module

Base.delete! Function
julia
Base.delete!(d::SetDomain, value)(d::SetDomain, value)

Delete value from the list of points in d.

source

Base.length Function
julia
length(layer)

Return the number of operations in a layer.

source

julia
Base.length(icn)

Return the total number of operations of an ICN.

source

julia
length(pf<:PatternFold)

Return the length of pf if unfolded.

source

julia
Base.rand(d <: AbstractDomain)

Fallback method for length(d) that return 0.

source

julia
Base.length(itv::Intervals)

Return the sum of the length of each interval in itv.

source

julia
Base.length(d::D) where D <: DiscreteDomain

Return the number of points in d.

source

Base.rand Function
julia
Base.rand(::Vector{IntervalsFold})

Extend the Base.rand function to Vector{IntervalsFold}.

source

julia
rand(pf<:PatternFold)

Returns a random value of pf as if it was unfolded.

source

julia
Base.rand(::Vector{AbstractVectorFold})
+Extend the `Base.rand` function to `Vector{AbstractVectorFold}`.

source

julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

Base.in Function
julia
x::Variable constraint
+value  x::Variable

Check if a variable x is restricted by a constraint::Int, or if a value belongs to the domain of x.

source

julia
var::Int c::Constraint

source

julia
Base.in(value, d <: AbstractDomain)

Fallback method for value ∈ d that returns false.

source

julia
Base.in(x, itv::Intervals)

Return true if x ∈ I for any 'I ∈ itv, false otherwise.x ∈ I` is equivalent to

  • a < x < b if I = (a, b)

  • a < x ≤ b if I = (a, b]

  • a ≤ x < b if I = [a, b)

  • a ≤ x ≤ b if I = [a, b]

source

julia
Base.in(value, d::D) where D <: DiscreteDomain

Return true if value is a point of d.

source

Base.string Function
julia
Base.string(D::Vector{<:AbstractDomain})
+Base.string(d<:AbstractDomain)

Extends the string method to (a vector of) domains.

source

Performances

Bench Evolution DiscreteChair Evolution Discrete

General

Base.eltype Function
julia
Base.eltype(::AbstractDomain)

Extend eltype for domains.

source

Base.convert Function
julia
Base.convert(::Type{Union{Intervals, RangeDomain}}, d::Union{Intervals, RangeDomain})

Extends Base.convert for domains.

source

Exploration

ConstraintDomains.Explorer Type

Explorer(concepts, domains, objective = nothing; settings = ExploreSettings(domains))

Create an Explorer object for searching a constraint satisfaction problem space.

Arguments

  • concepts: A collection of tuples, each containing a concept function and its associated variable indices.

  • domains: A collection of domains representing the search space.

  • objective: An optional objective function for optimization problems.

  • settings: An ExploreSettings object to configure the exploration process.

Returns

An Explorer object ready for exploration.

Example

julia
domains = [domain([1, 2, 3]), domain([4, 5, 6])]
 concepts = [(sum, [1, 2])]
 objective = x -> x[1] + x[2]
-explorer = Explorer(concepts, domains, objective)

source

ConstraintDomains.ExploreSettings Type
julia
ExploreSettings(
+explorer = Explorer(concepts, domains, objective)

source

ConstraintDomains.ExploreSettings Type
julia
ExploreSettings(
     domains;
     complete_search_limit = 10^6,
     max_samplings = sum(domain_size, domains),
     search = :flexible,
     solutions_limit = floor(Int, sqrt(max_samplings)),
 )

Create settings for the exploration of a search space composed by a collection of domains.

Arguments

  • domains: A collection of domains representing the search space.

  • complete_search_limit: Maximum size of the search space for complete search.

  • max_samplings: Maximum number of samples to take during partial search.

  • search: Search strategy (:flexible, :complete, or :partial).

  • solutions_limit: Maximum number of solutions to store.

Returns

An ExploreSettings object.

Example

julia
domains = [domain([1, 2, 3]), domain([4, 5, 6])]
-settings = ExploreSettings(domains, search = :complete)

source

ConstraintDomains.explore! Function
julia
explore!(explorer::Explorer)

Perform exploration on the search space defined by the Explorer object.

This function explores the search space according to the settings specified in the Explorer object. It updates the Explorer's state with found solutions and non-solutions.

Arguments

  • explorer: An Explorer object containing the problem definition and exploration settings.

Returns

Nothing. The Explorer's state is updated in-place.

Example

julia
explorer = Explorer(concepts, domains)
+settings = ExploreSettings(domains, search = :complete)

source

ConstraintDomains.explore! Function
julia
explore!(explorer::Explorer)

Perform exploration on the search space defined by the Explorer object.

This function explores the search space according to the settings specified in the Explorer object. It updates the Explorer's state with found solutions and non-solutions.

Arguments

  • explorer: An Explorer object containing the problem definition and exploration settings.

Returns

Nothing. The Explorer's state is updated in-place.

Example

julia
explorer = Explorer(concepts, domains)
 explore!(explorer)
-println("Solutions found: ", length(explorer.state.solutions))

source

ConstraintDomains.explore Function
julia
explore(domains, concept; settings = ExploreSettings(domains), parameters...)

Explore a search space defined by domains and a concept.

Arguments

  • domains: A collection of domains representing the search space.

  • concept: The concept function defining the constraint.

  • settings: An ExploreSettings object to configure the exploration process.

  • parameters: Additional parameters to pass to the concept function.

Returns

A tuple containing two sets: (solutions, non_solutions).

Example

julia
domains = [domain([1, 2, 3]), domain([4, 5, 6])]
-solutions, non_solutions = explore(domains, allunique)

source

Performances

Bench Evolution ExplorationChair Evolution Exploration

Parameters

ConstraintDomains.BoolParameterDomain Type
julia
BoolParameterDomain <: AbstractDomain

A domain to store boolean values. It is used to generate random parameters.

source

ConstraintDomains.DimParameterDomain Type
julia
DimParameterDomain <: AbstractDomain

A domain to store dimensions. It is used to generate random parameters.

source

ConstraintDomains.IdParameterDomain Type
julia
IdParameterDomain <: AbstractDomain

A domain to store ids. It is used to generate random parameters.

source

ConstraintDomains.FakeAutomaton Type
julia
FakeAutomaton{T} <: ConstraintCommons.AbstractAutomaton

A structure to generate pseudo automaton enough for parameter exploration.

source

ConstraintCommons.accept Function
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

ConstraintDomains.fake_automaton Function
julia
fake_automaton(d)

Construct a FakeAutomaton.

source

ConstraintDomains.LanguageParameterDomain Type
julia
LanguageParameterDomain <: AbstractDomain

A domain to store languages. It is used to generate random parameters.

source

ConstraintDomains.OpParameterDomain Type
julia
OpParameterDomain{T} <: AbstractDomain

A domain to store operators. It is used to generate random parameters.

source

ConstraintDomains.PairVarsParameterDomain Type
julia
PairVarsParameterDomain{T} <: AbstractDomain

A domain to store values paired with variables. It is used to generate random parameters.

source

ConstraintDomains.ValParameterDomain Type
julia
ValParameterDomain{T} <: AbstractDomain

A domain to store one value. It is used to generate random parameters.

source

ConstraintDomains.ValsParameterDomain Type
julia
ValsParameterDomain{T} <: AbstractDomain

A domain to store values. It is used to generate random parameters.

source

Base.rand Function
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

ConstraintDomains.generate_parameters Function
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source

- +println("Solutions found: ", length(explorer.state.solutions))

source

ConstraintDomains.explore Function
julia
explore(domains, concept; settings = ExploreSettings(domains), parameters...)

Explore a search space defined by domains and a concept.

Arguments

  • domains: A collection of domains representing the search space.

  • concept: The concept function defining the constraint.

  • settings: An ExploreSettings object to configure the exploration process.

  • parameters: Additional parameters to pass to the concept function.

Returns

A tuple containing two sets: (solutions, non_solutions).

Example

julia
domains = [domain([1, 2, 3]), domain([4, 5, 6])]
+solutions, non_solutions = explore(domains, allunique)

source

Performances

Bench Evolution ExplorationChair Evolution Exploration

Parameters

ConstraintDomains.BoolParameterDomain Type
julia
BoolParameterDomain <: AbstractDomain

A domain to store boolean values. It is used to generate random parameters.

source

ConstraintDomains.DimParameterDomain Type
julia
DimParameterDomain <: AbstractDomain

A domain to store dimensions. It is used to generate random parameters.

source

ConstraintDomains.IdParameterDomain Type
julia
IdParameterDomain <: AbstractDomain

A domain to store ids. It is used to generate random parameters.

source

ConstraintDomains.FakeAutomaton Type
julia
FakeAutomaton{T} <: ConstraintCommons.AbstractAutomaton

A structure to generate pseudo automaton enough for parameter exploration.

source

ConstraintCommons.accept Function
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

ConstraintDomains.fake_automaton Function
julia
fake_automaton(d)

Construct a FakeAutomaton.

source

ConstraintDomains.LanguageParameterDomain Type
julia
LanguageParameterDomain <: AbstractDomain

A domain to store languages. It is used to generate random parameters.

source

ConstraintDomains.OpParameterDomain Type
julia
OpParameterDomain{T} <: AbstractDomain

A domain to store operators. It is used to generate random parameters.

source

ConstraintDomains.PairVarsParameterDomain Type
julia
PairVarsParameterDomain{T} <: AbstractDomain

A domain to store values paired with variables. It is used to generate random parameters.

source

ConstraintDomains.ValParameterDomain Type
julia
ValParameterDomain{T} <: AbstractDomain

A domain to store one value. It is used to generate random parameters.

source

ConstraintDomains.ValsParameterDomain Type
julia
ValsParameterDomain{T} <: AbstractDomain

A domain to store values. It is used to generate random parameters.

source

Base.rand Function
julia
Base.rand(::Vector{IntervalsFold})

Extend the Base.rand function to Vector{IntervalsFold}.

source

julia
rand(pf<:PatternFold)

Returns a random value of pf as if it was unfolded.

source

julia
Base.rand(::Vector{AbstractVectorFold})
+Extend the `Base.rand` function to `Vector{AbstractVectorFold}`.

source

julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

ConstraintDomains.generate_parameters Function
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source

+ \ No newline at end of file diff --git a/dev/constraints/62_constraints_jl.html b/dev/constraints/62_constraints_jl.html deleted file mode 100644 index 8370f06..0000000 --- a/dev/constraints/62_constraints_jl.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - Interacting with Constraints in Julia | Julia Constraints - - - - - - - - - - - - - -
Skip to content

Interacting with Constraints in Julia

Constraints.jl is a pivotal package within Julia Constraints, designed to facilitate the definition, manipulation, and application of constraints in constraint programming (CP).

It also acts as a catalog of various information and features learned about constraints by the learning part of the ecosystem. Per design, we only store the practical information extracted by those tools and not the heavy machinery.

Usual Parameters

The usual constraints of Julia Constraints are heavily inspired by the core constraints of the XCSP3-core standard. The main difference lies in the name chosen to describe the different parameters those core constraints can have.

In XCSP3, the parameters are described based on their roles, which the user can find as keyword argument in the xcsp_ prefixed collection of constraints (for instance xcsp_all_different). In our the Julia Constraints API (JC-API), the keyword arguments correspond to the nature of each parameter.

ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS Constant
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
-    :bool, # boolean parameter
-    :dim, # dimension, an integer parameter used along the pair_vars or vals parameters
-    :id, # index to target one variable in the input vector
-    :language, # describe a regular language such as an automaton or a MDD
-    :op, # an operator such as comparison or arithmetic operator
-    :pair_vars, # a list of parameters that are paired with each variable in the input vector
-    :val, # one scalar value
-    :vals, # a list of scalar values (independent of the input vector size)
-]

source

Concepts, Error Functions, and QUBO matrices

One major use of this collection of usual constraint is to extract the concept or the error function (error_f) of a given constraint.

Constraints.concept Function
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source

julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

  • s::Symbol: the constraint name.

  • args...: the arguments to apply the concept to.

  • kargs...: the keyword arguments to apply the concept to.

Example

julia
concept(:all_different, [1, 2, 3])

source

Note that the error function is a finer estimation of how much a constraint is violated or not. By default, the error_f method simply return 0. if the constraint is satisfied or 1. otherwise.

Efficient versions of error_r are either hand-coded or generated through CompositionalNetworks.jl.

Constraints.error_f Function
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source

Finally, another use is to provide QUBO matrices of those usual constraints through QUBOConstraints.jl. The syntax and interface for this feature are still a work in progress.

Usual Constraints

We provide a couple of methods to navigate the usual constraints extracted from XCSP3-Core.

Constraints.USUAL_CONSTRAINTS Constant
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source

Constraints.describe Function
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

  • constraints::Dict{Symbol,Constraint}: dictionary of constraints to describe. Default is USUAL_CONSTRAINTS.

  • width::Int: width of the table.

Example

julia
describe()

source

Constraints.constraints_parameters Function
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_parameters()

source

Constraints.constraints_descriptions Function
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_descriptions()

source

- - - - \ No newline at end of file diff --git a/dev/constraints/63_constraints_jl.html b/dev/constraints/63_constraints_jl.html new file mode 100644 index 0000000..8c0fd07 --- /dev/null +++ b/dev/constraints/63_constraints_jl.html @@ -0,0 +1,33 @@ + + + + + + Interacting with Constraints in Julia | Julia Constraints + + + + + + + + + + + + + +
Skip to content

Interacting with Constraints in Julia

Constraints.jl is a pivotal package within Julia Constraints, designed to facilitate the definition, manipulation, and application of constraints in constraint programming (CP).

It also acts as a catalog of various information and features learned about constraints by the learning part of the ecosystem. Per design, we only store the practical information extracted by those tools and not the heavy machinery.

Usual Parameters

The usual constraints of Julia Constraints are heavily inspired by the core constraints of the XCSP3-core standard. The main difference lies in the name chosen to describe the different parameters those core constraints can have.

In XCSP3, the parameters are described based on their roles, which the user can find as keyword argument in the xcsp_ prefixed collection of constraints (for instance xcsp_all_different). In our the Julia Constraints API (JC-API), the keyword arguments correspond to the nature of each parameter.

ConstraintCommons.USUAL_CONSTRAINT_PARAMETERS Constant
julia
const USUAL_CONSTRAINT_PARAMETERS

List of usual constraints parameters (based on XCSP3-core constraints). The list is based on the nature of each kind of parameter instead of the keywords used in the XCSP3-core format.

julia
const USUAL_CONSTRAINT_PARAMETERS = [
+    :bool, # boolean parameter
+    :dim, # dimension, an integer parameter used along the pair_vars or vals parameters
+    :id, # index to target one variable in the input vector
+    :language, # describe a regular language such as an automaton or a MDD
+    :op, # an operator such as comparison or arithmetic operator
+    :pair_vars, # a list of parameters that are paired with each variable in the input vector
+    :val, # one scalar value
+    :vals, # a list of scalar values (independent of the input vector size)
+]

source

Concepts, Error Functions, and QUBO matrices

One major use of this collection of usual constraint is to extract the concept or the error function (error_f) of a given constraint.

Constraints.concept Function
julia
concept(c::Constraint)

Return the concept (function) of constraint c. concept(c::Constraint, x...; param = nothing) Apply the concept of c to values x and optionally param.

source

julia
concept(s::Symbol, args...; kargs...)

Return the concept of the constraint s applied to args and kargs. This is a shortcut for concept(USUAL_CONSTRAINTS[s])(args...; kargs...).

Arguments

  • s::Symbol: the constraint name.

  • args...: the arguments to apply the concept to.

  • kargs...: the keyword arguments to apply the concept to.

Example

julia
concept(:all_different, [1, 2, 3])

source

Note that the error function is a finer estimation of how much a constraint is violated or not. By default, the error_f method simply return 0. if the constraint is satisfied or 1. otherwise.

Efficient versions of error_r are either hand-coded or generated through CompositionalNetworks.jl.

Constraints.error_f Function
julia
error_f(c::Constraint)

Return the error function of constraint c. error_f(c::Constraint, x; param = nothing) Apply the error function of c to values x and optionally param.

source

Finally, another use is to provide QUBO matrices of those usual constraints through QUBOConstraints.jl. The syntax and interface for this feature are still a work in progress.

Usual Constraints

We provide a couple of methods to navigate the usual constraints extracted from XCSP3-Core.

Constraints.USUAL_CONSTRAINTS Constant
julia
USUAL_CONSTRAINTS::Dict

Dictionary that contains all the usual constraints defined in Constraint.jl. It is based on XCSP3-core specifications available at https://arxiv.org/abs/2009.00514

Adding a new constraint is as simple as defining a new function with the same name as the constraint and using the @usual macro to define it. The macro will take care of adding the new constraint to the USUAL_CONSTRAINTS dictionary.

Example

julia
@usual concept_all_different(x; vals=nothing) = xcsp_all_different(list=x, except=vals)

source

Constraints.describe Function
julia
describe(constraints::Dict{Symbol,Constraint}=USUAL_CONSTRAINTS; width=150)

Return a pretty table with the description of the constraints in constraints.

Arguments

  • constraints::Dict{Symbol,Constraint}: dictionary of constraints to describe. Default is USUAL_CONSTRAINTS.

  • width::Int: width of the table.

Example

julia
describe()

source

Constraints.constraints_parameters Function
julia
constraints_parameters(C=USUAL_CONSTRAINTS)

Return a pretty table with the parameters of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_parameters()

source

Constraints.constraints_descriptions Function
julia
constraints_descriptions(C=USUAL_CONSTRAINTS)

Return a pretty table with the descriptions of the constraints in C.

Arguments

  • C::Dict{Symbol,Constraint}: dictionary of constraints. Default is USUAL_CONSTRAINTS.

Example

julia
constraints_descriptions()

source

+ + + + \ No newline at end of file diff --git a/dev/cp/00_intro.html b/dev/cp/00_intro.html index deccdf4..277ae85 100644 --- a/dev/cp/00_intro.html +++ b/dev/cp/00_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.

- +
Skip to content

Welcome to Julia Constraints

An introductory post/chapter that provides an overview of the JuliaConstraint organization, its mission, and what readers can expect to learn from the content. Highlight the importance of Constraint Programming (CP) and optimization in solving real-world problems.

+ \ No newline at end of file diff --git a/dev/cp/10_cp101.html b/dev/cp/10_cp101.html index f7f8366..bd34f2e 100644 --- a/dev/cp/10_cp101.html +++ b/dev/cp/10_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.
- +
Skip to content

Constraint Programming 101

What is Constraint Programming?

  • Define CP and its significance in solving combinatorial problems.

Basic Concepts and Terminology

  • Introduce key concepts such as constraints, domains, and variables.

How CP differs from other optimization techniques

  • Contrast with other methods like linear programming and metaheuristics.
+ \ No newline at end of file diff --git a/dev/cp/20_opt.html b/dev/cp/20_opt.html index eab32fc..ab410d1 100644 --- a/dev/cp/20_opt.html +++ b/dev/cp/20_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.
- +
Skip to content

Dive into Optimization

Understanding Optimization

  • Explanation of optimization, types of optimization problems (e.g., linear, nonlinear, integer programming).

Metaheuristics Overview

  • Introduce concepts like Genetic Algorithms, Simulated Annealing, and Tabu Search.

Mathematical Programming Basics

  • Cover the fundamentals of mathematical programming and its role in optimization.
+ \ No newline at end of file diff --git a/dev/cp/30_getting_started.html b/dev/cp/30_getting_started.html index 2265650..df7c56c 100644 --- a/dev/cp/30_getting_started.html +++ b/dev/cp/30_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/40_ecosystem.html b/dev/cp/40_ecosystem.html index 8d58a8b..5c9fb88 100644 --- a/dev/cp/40_ecosystem.html +++ b/dev/cp/40_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.
- +
Skip to content

Exploring JuliaConstraint Packages

Package Overviews

  • Introduce each package within the JuliaConstraint organization, its purpose, and primary features.

Installation and Getting Started Guides

  • Provide step-by-step instructions for installing and getting started with each package.
+ \ No newline at end of file diff --git a/dev/cp/50_advanced.html b/dev/cp/50_advanced.html index b0684de..4a11a7c 100644 --- a/dev/cp/50_advanced.html +++ b/dev/cp/50_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.
- +
Skip to content

Advanced Constraint Programming Techniques

Global Constraints and Their Uses

  • Dive deeper into global constraints and how they simplify complex problems.

Search Strategies and Optimization

  • Discuss various search strategies and their impact on solving CP problems.
+ \ No newline at end of file diff --git a/dev/cp/60_applications.html b/dev/cp/60_applications.html index 61d8c00..063a084 100644 --- a/dev/cp/60_applications.html +++ b/dev/cp/60_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.
- +
Skip to content

Applying Optimization Methods

Case Studies and Real-World Applications

  • Showcase studies where CP and optimization have been successfully applied.

From Theory to Practice

  • Guide readers through the process of formulating and solving an optimization problem from a real-world scenario.
+ \ No newline at end of file diff --git a/dev/cp/70_models.html b/dev/cp/70_models.html index def5e1d..4ff2e47 100644 --- a/dev/cp/70_models.html +++ b/dev/cp/70_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.
- +
Skip to content

Building and Analyzing Models

Modeling Best Practices

  • Share best practices and tips for building efficient CP and optimization models.

Performance Analysis and Improvement

  • Teach how to analyze and improve the performance of models.
+ \ No newline at end of file diff --git a/dev/cp/80_tuto_xp.html b/dev/cp/80_tuto_xp.html index 5194102..ca3d939 100644 --- a/dev/cp/80_tuto_xp.html +++ b/dev/cp/80_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.
- +
Skip to content

Tutorials and Experiments

Hands-On Tutorials

  • Provide step-by-step tutorials covering various topics and complexity levels.

Experimental Analysis

  • Discuss the importance of experimental analysis in CP and how to conduct meaningful experiments.
+ \ No newline at end of file diff --git a/dev/cp/90_contribution.html b/dev/cp/90_contribution.html index 5d9b2fa..3eaff30 100644 --- a/dev/cp/90_contribution.html +++ b/dev/cp/90_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.
- +
Skip to content

Community and Contribution

Joining the JuliaConstraint Community

  • Encourage readers to join the community, highlighting how they can contribute and collaborate.

Future Directions

  • Share the vision for JuliaConstraint and upcoming projects or areas of research.
+ \ No newline at end of file diff --git a/dev/hashmap.json b/dev/hashmap.json index 96d0383..926d441 100644 --- a/dev/hashmap.json +++ b/dev/hashmap.json @@ -1 +1 @@ -{"api_00_public.md":"D5arbpZy","api_10_full.md":"D8vC0wPZ","constraints_00_intro.md":"wE3p7Yn4","constraints_10_variables_and_domains.md":"DMTHJoC3","constraints_20_constraints.md":"DmKL30J8","constraints_21_generic_constraints.md":"B4i07qkr","constraints_22_language_constraints.md":"CKu7YAtW","constraints_23_comparison_constraints.md":"DcsU6on2","constraints_24_counting_summing_constraints.md":"DKaHxQLr","constraints_25_connection_constraints.md":"B1H1D7fs","constraints_26_packing_scheduling_constraints.md":"DXvyM6Zb","constraints_27_graph_constraints.md":"tZ8kDC6h","constraints_28_elementary_constraints.md":"LoJStkX7","constraints_40_constraint_models.md":"Dv2qEx3_","constraints_60_constraint_commons.md":"CfOCoBuP","constraints_61_constraint_domains.md":"oi_ydeg8","constraints_62_constraints_jl.md":"j1FaSS8o","cp_00_intro.md":"CsgSXI99","cp_10_cp101.md":"B-tHlXuM","cp_20_opt.md":"C0pIlKYp","cp_30_getting_started.md":"DTAftenf","cp_40_ecosystem.md":"YmIJU8G_","cp_50_advanced.md":"CJxpgFIM","cp_60_applications.md":"CA8-f1fu","cp_70_models.md":"1-J7V95h","cp_80_tuto_xp.md":"BBnKLYxi","cp_90_contribution.md":"DOrkQHq1","index.md":"BKeG-gxU","learning_00_intro.md":"pkLTZpmG","learning_10_compositional_networks.md":"D4-tXiP7","learning_11_layers.md":"C199f07V","learning_12_transformation.md":"BKCQ-7xu","learning_13_arithmetic.md":"42vK0uzX","learning_14_aggregation.md":"V0-R09TM","learning_15_comparison.md":"CUM575C4","learning_20_qubo_constraints.md":"DfeUpk7q","learning_21_qubo_encoding.md":"U06_V_uV","learning_22_qubo_learning.md":"CzSOBa1N","learning_30_constraints_translator.md":"CRGr1CIB","learning_90_constraint_learning.md":"YM6S0n3n","perf_00_perf_checker.md":"BMTPCZnU","perf_10_tutorial.md":"C4bm3h6K","perf_20_perf_interface.md":"Cfce352q","perf_30_benchmark_ext.md":"CzInbrh4","perf_40_chairmarks_ext.md":"h8pfB9sA","perf_90_api.md":"0OTlDWyk","solvers_00_intro.md":"s1tbOTQV","solvers_10_cbls.md":"BCa7hnj8","solvers_40_constraint_explorer.md":"CjuNUjfR","solvers_50_local_search_solvers.md":"CnhmzQ0z","solvers_80_meta_strategist.md":"Cv_QCe0I"} +{"api_00_public.md":"Cqf6QMJN","api_10_full.md":"DufIdSXa","constraints_00_intro.md":"wE3p7Yn4","constraints_10_variables_and_domains.md":"2DoRmBqU","constraints_20_constraints.md":"DmKL30J8","constraints_21_generic_constraints.md":"Cq_hAjZf","constraints_22_language_constraints.md":"CKu7YAtW","constraints_23_comparison_constraints.md":"4b0z8qtK","constraints_24_counting_summing_constraints.md":"DVkY5sTG","constraints_25_connection_constraints.md":"ajGM2nJs","constraints_26_packing_scheduling_constraints.md":"CrG8P0jZ","constraints_27_graph_constraints.md":"tZ8kDC6h","constraints_28_elementary_constraints.md":"LoJStkX7","constraints_40_constraint_models.md":"Dv2qEx3_","constraints_60_constraint_commons.md":"CfOCoBuP","constraints_61_pattern_folds.md":"xjkZia50","constraints_62_constraint_domains.md":"DMsVVEqc","constraints_63_constraints_jl.md":"WJF85byi","cp_00_intro.md":"CsgSXI99","cp_10_cp101.md":"B-tHlXuM","cp_20_opt.md":"C0pIlKYp","cp_30_getting_started.md":"QuTvdZuh","cp_40_ecosystem.md":"YmIJU8G_","cp_50_advanced.md":"CJxpgFIM","cp_60_applications.md":"CA8-f1fu","cp_70_models.md":"1-J7V95h","cp_80_tuto_xp.md":"BBnKLYxi","cp_90_contribution.md":"DOrkQHq1","index.md":"pHtYR91m","learning_00_intro.md":"CBu38Cu4","learning_10_compositional_networks.md":"D4-tXiP7","learning_11_layers.md":"C199f07V","learning_12_transformation.md":"BKCQ-7xu","learning_13_arithmetic.md":"42vK0uzX","learning_14_aggregation.md":"V0-R09TM","learning_15_comparison.md":"CUM575C4","learning_20_qubo_constraints.md":"DfeUpk7q","learning_21_qubo_encoding.md":"U06_V_uV","learning_22_qubo_learning.md":"CzSOBa1N","learning_30_constraints_translator.md":"CRGr1CIB","learning_90_constraint_learning.md":"YM6S0n3n","perf_00_perf_checker.md":"BMTPCZnU","perf_10_tutorial.md":"C4bm3h6K","perf_20_perf_interface.md":"Cfce352q","perf_30_benchmark_ext.md":"CzInbrh4","perf_40_chairmarks_ext.md":"h8pfB9sA","perf_90_api.md":"0OTlDWyk","solvers_00_intro.md":"s1tbOTQV","solvers_10_cbls.md":"BCa7hnj8","solvers_40_constraint_explorer.md":"CjuNUjfR","solvers_50_local_search_solvers.md":"CnhmzQ0z","solvers_80_meta_strategist.md":"Cv_QCe0I"} diff --git a/dev/index.html b/dev/index.html index bf8f57b..542c8ef 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

What is Julia Constraints?

The Julia Constraints organization serves as a hub for resources to create, understand, and solve optimization through the lens of Constraint Programming. Our goal is to make Constraint Programming accessible and efficient for users at all levels of expertise, by providing a comprehensive suite of tools.

Most tools integrate seamlessly with JuMP, a popular Julia package for mathematical optimization.

Ecosystem overview

Core Packages

The foundation of common packages that provide essential features for constraint programming ensures that users possess the fundamental tools required for their projects.

  • ConstraintCommons.jl is designed to make constraint programming solutions in Julia interoperable. It provides shared structures, abstract types, functions, and generic methods used by both basic feature packages and learning-oriented packages.
  • ConstraintDomains.jl focuses on the definition and manipulation of variable domains, which are used to solve constraint programming problems. This package provides the infrastructure needed to specify both discrete and continuous domains, allowing a wide range of constraint programming applications.
  • Constraints.jl is a key component, specifically designed to facilitate the definition, manipulation, and application of constraints in constraint programming. This package is central to handling both standard and complex constraints, making it an indispensable tool for developers and researchers working in CP.
  • ConstraintModels.jl is a package for Julia Constraints' solvers that stores Constraint Programming models.

Learning and Translation Tools

A collection that bridges the gap between the ease of modeling and computational efficacy. These tools learn from constraints or convert natural language problems into constraint programming solutions, requiring minimal input from the user beyond the model itself.

  • CompositionalNetworks.jl provides interpretable compositional networks (ICN), a combinatorial variant of neural networks that allows the user to obtain interpretable results, unlike regular artificial neural networks.
  • QUBOConstraints.jl is a package that can (automatically) learn QUBO matrices from optimization constraints.
  • ConstraintsTranslator.jl (tentative name, WIP) is a tool for converting problems expressed in natural language into optimization models.
  • ConstraintLearning.jl is a common interface that integrates the various components outlined above.

Solvers

We offer a variety of solvers, from native Julia solvers to interfaces with JuMP for external CP solvers, to cater to various problem-solving needs.

  • LocalSearchSolvers.jl is a Julia native framework to (semi-)automatically build Constraint-based Local Search solvers. It serves as a basic for the experimental design or core and learning oriented packages in Julia Constraints.
  • CBLS.jl a MOI/JuMP interface for the above framework!
  • CPLEXCP.jl a Julia interface for CPLEX CP Optimizer.
  • Chuffed.jl a wrapper for the constraint-programming solver Chuffed to Julia.
  • JaCoP.jl a Julia interface for the JaCoP constraint-programming solver.

JuMP extras

Constraint Programming is slowly making steps into the main JuMP components. However, some extra resources are available as

Meta-solving

MetaStrategist.jl is a meta-solving package in its formative stages, which aims to harness the strengths of CP and JuMP. Its goal is to formulate tailored strategies that take into consideration the unique hardware and software resources at hand, offering a new horizon in problem-solving efficiency and adaptability. Stay tuned!

Performance related tools

We've made a tool for cross-version performance checking that ensures the high efficiency and reliability of our solutions. By facilitating clear and simple performance evaluations, PerfChecker.jl enhances both development and maintenance, contributing to the overall health and progress of Julia (Constraints)'s growing library of resources.

Contributors Page

Acknowledgments

The Julia Constraints community would not be where it is today without the collective efforts of many talented individuals and organizations. We extend our heartfelt thanks to:

  • IIJ Research Lab: The driving force behind more than half of this project!
  • JuMP-dev Community: For their extensive contributions to the development of our packages.
  • Individual Contributors: Numerous developers and researchers who have dedicated their time and skills to enhance our tools.
- +
Skip to content

Julia Constraints

Model Smoothly Decide Wisely

A Toolkit for Constraint Programming

JuliaConstraints

What is Julia Constraints?

The Julia Constraints organization serves as a hub for resources to create, understand, and solve optimization through the lens of Constraint Programming. Our goal is to make Constraint Programming accessible and efficient for users at all levels of expertise, by providing a comprehensive suite of tools.

Most tools integrate seamlessly with JuMP, a popular Julia package for mathematical optimization.

Ecosystem overview

Core Packages

The foundation of common packages that provide essential features for constraint programming ensures that users possess the fundamental tools required for their projects.

  • ConstraintCommons.jl is designed to make constraint programming solutions in Julia interoperable. It provides shared structures, abstract types, functions, and generic methods used by both basic feature packages and learning-oriented packages.
  • ConstraintDomains.jl focuses on the definition and manipulation of variable domains, which are used to solve constraint programming problems. This package provides the infrastructure needed to specify both discrete and continuous domains, allowing a wide range of constraint programming applications.
  • Constraints.jl is a key component, specifically designed to facilitate the definition, manipulation, and application of constraints in constraint programming. This package is central to handling both standard and complex constraints, making it an indispensable tool for developers and researchers working in CP.
  • ConstraintModels.jl is a package for Julia Constraints' solvers that stores Constraint Programming models.

Learning and Translation Tools

A collection that bridges the gap between the ease of modeling and computational efficacy. These tools learn from constraints or convert natural language problems into constraint programming solutions, requiring minimal input from the user beyond the model itself.

  • CompositionalNetworks.jl provides interpretable compositional networks (ICN), a combinatorial variant of neural networks that allows the user to obtain interpretable results, unlike regular artificial neural networks.
  • QUBOConstraints.jl is a package that can (automatically) learn QUBO matrices from optimization constraints.
  • ConstraintsTranslator.jl is a tool for converting problems expressed in natural language into optimization models.
  • ConstraintLearning.jl is a common interface that integrates the various components outlined above.

Solvers

We offer a variety of solvers, from native Julia solvers to interfaces with JuMP for external CP solvers, to cater to various problem-solving needs.

  • LocalSearchSolvers.jl is a Julia native framework to (semi-)automatically build Constraint-based Local Search solvers. It serves as a basic for the experimental design or core and learning oriented packages in Julia Constraints.
  • CBLS.jl a MOI/JuMP interface for the above framework!
  • CPLEXCP.jl a Julia interface for CPLEX CP Optimizer.
  • Chuffed.jl a wrapper for the constraint-programming solver Chuffed to Julia.
  • JaCoP.jl a Julia interface for the JaCoP constraint-programming solver.
  • ConstraintExplorer.jl a MOI/JuMP interface to explore search spaces modeled as CP.

JuMP extras

Constraint Programming is slowly making steps into the main JuMP components. However, some extra resources are available as

Meta-solving

MetaStrategist.jl is a meta-solving package in its formative stages, which aims to harness the strengths of CP and JuMP. Its goal is to formulate tailored strategies that take into consideration the unique hardware and software resources at hand, offering a new horizon in problem-solving efficiency and adaptability. Stay tuned!

Performance related tools

We've made a tool for cross-version performance checking that ensures the high efficiency and reliability of our solutions. By facilitating clear and simple performance evaluations, PerfChecker.jl enhances both development and maintenance, contributing to the overall health and progress of Julia (Constraints)'s growing library of resources.

Contributors Page

Acknowledgments

The Julia Constraints community would not be where it is today without the collective efforts of many talented individuals and organizations. We extend our heartfelt thanks to:

  • IIJ Research Lab: The driving force behind more than half of this project!
  • JuMP-dev Community: For their extensive contributions to the development of our packages.
  • Individual Contributors: Numerous developers and researchers who have dedicated their time and skills to enhance our tools.
+ \ No newline at end of file diff --git a/dev/learning/00_intro.html b/dev/learning/00_intro.html index cbc5a6d..cd595d7 100644 --- a/dev/learning/00_intro.html +++ b/dev/learning/00_intro.html @@ -8,18 +8,19 @@ - + - + - + -
Skip to content

Learning about Constraints

About learning constraints related matters.

Parameters

<!– To be moved –>

One major challenge of learning the features of constraints is exploring the domains of parameters. To tackle this issue, we provide some way to generate parameters from variables' domains.

ConstraintDomains.BoolParameterDomain Type
julia
BoolParameterDomain <: AbstractDomain

A domain to store boolean values. It is used to generate random parameters.

source

ConstraintDomains.DimParameterDomain Type
julia
DimParameterDomain <: AbstractDomain

A domain to store dimensions. It is used to generate random parameters.

source

ConstraintDomains.IdParameterDomain Type
julia
IdParameterDomain <: AbstractDomain

A domain to store ids. It is used to generate random parameters.

source

ConstraintDomains.FakeAutomaton Type
julia
FakeAutomaton{T} <: ConstraintCommons.AbstractAutomaton

A structure to generate pseudo automaton enough for parameter exploration.

source

ConstraintCommons.accept Function
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

ConstraintDomains.fake_automaton Function
julia
fake_automaton(d)

Construct a FakeAutomaton.

source

ConstraintDomains.LanguageParameterDomain Type
julia
LanguageParameterDomain <: AbstractDomain

A domain to store languages. It is used to generate random parameters.

source

ConstraintDomains.OpParameterDomain Type
julia
OpParameterDomain{T} <: AbstractDomain

A domain to store operators. It is used to generate random parameters.

source

ConstraintDomains.PairVarsParameterDomain Type
julia
PairVarsParameterDomain{T} <: AbstractDomain

A domain to store values paired with variables. It is used to generate random parameters.

source

ConstraintDomains.ValParameterDomain Type
julia
ValParameterDomain{T} <: AbstractDomain

A domain to store one value. It is used to generate random parameters.

source

ConstraintDomains.ValsParameterDomain Type
julia
ValsParameterDomain{T} <: AbstractDomain

A domain to store values. It is used to generate random parameters.

source

Base.rand Function
julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
-Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

ConstraintDomains.generate_parameters Function
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source

- +
Skip to content

Learning about Constraints

About learning constraints related matters.

Parameters

<!– To be moved –>

One major challenge of learning the features of constraints is exploring the domains of parameters. To tackle this issue, we provide some way to generate parameters from variables' domains.

ConstraintDomains.BoolParameterDomain Type
julia
BoolParameterDomain <: AbstractDomain

A domain to store boolean values. It is used to generate random parameters.

source

ConstraintDomains.DimParameterDomain Type
julia
DimParameterDomain <: AbstractDomain

A domain to store dimensions. It is used to generate random parameters.

source

ConstraintDomains.IdParameterDomain Type
julia
IdParameterDomain <: AbstractDomain

A domain to store ids. It is used to generate random parameters.

source

ConstraintDomains.FakeAutomaton Type
julia
FakeAutomaton{T} <: ConstraintCommons.AbstractAutomaton

A structure to generate pseudo automaton enough for parameter exploration.

source

ConstraintCommons.accept Function
julia
accept(a::Union{Automaton, MDD}, w)

Return true if a accepts the word w and false otherwise.

source

julia
ConstraintCommons.accept(fa::FakeAutomaton, word)

Implement the accept methods for FakeAutomaton.

source

ConstraintDomains.fake_automaton Function
julia
fake_automaton(d)

Construct a FakeAutomaton.

source

ConstraintDomains.LanguageParameterDomain Type
julia
LanguageParameterDomain <: AbstractDomain

A domain to store languages. It is used to generate random parameters.

source

ConstraintDomains.OpParameterDomain Type
julia
OpParameterDomain{T} <: AbstractDomain

A domain to store operators. It is used to generate random parameters.

source

ConstraintDomains.PairVarsParameterDomain Type
julia
PairVarsParameterDomain{T} <: AbstractDomain

A domain to store values paired with variables. It is used to generate random parameters.

source

ConstraintDomains.ValParameterDomain Type
julia
ValParameterDomain{T} <: AbstractDomain

A domain to store one value. It is used to generate random parameters.

source

ConstraintDomains.ValsParameterDomain Type
julia
ValsParameterDomain{T} <: AbstractDomain

A domain to store values. It is used to generate random parameters.

source

Base.rand Function
julia
Base.rand(::Vector{IntervalsFold})

Extend the Base.rand function to Vector{IntervalsFold}.

source

julia
rand(pf<:PatternFold)

Returns a random value of pf as if it was unfolded.

source

julia
Base.rand(::Vector{AbstractVectorFold})
+Extend the `Base.rand` function to `Vector{AbstractVectorFold}`.

source

julia
Base.rand(d::Union{Vector{D},Set{D}, D}) where {D<:AbstractDomain}

Extends Base.rand to (a collection of) domains.

source

julia
Base.rand(itv::Intervals)
+Base.rand(itv::Intervals, i)

Return a random value from itv, specifically from the ith interval if i is specified.

source

julia
Base.rand(d::D) where D <: DiscreteDomain

Draw randomly a point in d.

source

julia
Base.rand(fa::FakeAutomaton)

Extends Base.rand. Currently simply returns fa.

source

ConstraintDomains.generate_parameters Function
julia
generate_parameters(d<:AbstractDomain, param)

Generates random parameters based on the domain d and the kind of parameters param.

source

+ \ No newline at end of file diff --git a/dev/learning/10_compositional_networks.html b/dev/learning/10_compositional_networks.html index 6f4e69e..416fd2c 100644 --- a/dev/learning/10_compositional_networks.html +++ b/dev/learning/10_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.lazy Function
julia
lazy(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V).

source

CompositionalNetworks.lazy_param Function
julia
lazy_param(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V; param).

source

CompositionalNetworks.as_bitvector Function
julia
as_bitvector(n::Int, max_n::Int = n)

Convert an Int to a BitVector of minimal size (relatively to max_n).

source

CompositionalNetworks.as_int Function
julia
as_int(v::AbstractVector)

Convert a BitVector into an Int.

source

CompositionalNetworks.reduce_symbols Function
julia
reduce_symbols(symbols, sep)

Produce a formatted string that separates the symbols by sep. Used internally for show_composition.

source

CompositionalNetworks.tr_in Function
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

Metrics

CompositionalNetworks.hamming Function
julia
hamming(x, X)

Compute the hamming distance of x over a collection of solutions X, i.e. the minimal number of variables to switch in xto reach a solution.

source

CompositionalNetworks.minkowski Function
julia
minkowski(x, X, p)

source

CompositionalNetworks.manhattan Function
julia
manhattan(x, X)

source

CompositionalNetworks.weights_bias Function
julia
weights_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.lazy Function
julia
lazy(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V).

source

CompositionalNetworks.lazy_param Function
julia
lazy_param(funcs::Function...)

Generate methods extended to a vector instead of one of its components. A function f should have the following signature: f(i::Int, x::V; param).

source

CompositionalNetworks.as_bitvector Function
julia
as_bitvector(n::Int, max_n::Int = n)

Convert an Int to a BitVector of minimal size (relatively to max_n).

source

CompositionalNetworks.as_int Function
julia
as_int(v::AbstractVector)

Convert a BitVector into an Int.

source

CompositionalNetworks.reduce_symbols Function
julia
reduce_symbols(symbols, sep)

Produce a formatted string that separates the symbols by sep. Used internally for show_composition.

source

CompositionalNetworks.tr_in Function
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

Metrics

CompositionalNetworks.hamming Function
julia
hamming(x, X)

Compute the hamming distance of x over a collection of solutions X, i.e. the minimal number of variables to switch in xto reach a solution.

source

CompositionalNetworks.minkowski Function
julia
minkowski(x, X, p)

source

CompositionalNetworks.manhattan Function
julia
manhattan(x, X)

source

CompositionalNetworks.weights_bias Function
julia
weights_bias(x)

A metric that bias x towards operations with a lower bit. Do not affect the main metric.

source

+ \ No newline at end of file diff --git a/dev/learning/11_layers.html b/dev/learning/11_layers.html index 3e0f968..115b90b 100644 --- a/dev/learning/11_layers.html +++ b/dev/learning/11_layers.html @@ -8,21 +8,21 @@ - + - + -
Skip to content

A layer structure for any ICN

The layer.jl file defines a Layer structure and several associated functions for manipulating and interacting with this structure in the context of an Interpretable Compositional Network (ICN).

The Layer structure is used to store a LittleDict of operations that can be selected during the learning phase of an ICN. Each layer can be exclusive, meaning only one operation can be selected at a time. This is particularly useful in the context of ICNs, which are used to learn alternative expressions for highly combinatorial functions, such as those found in Constraint-based Local Search solvers.

CompositionalNetworks.Layer Type
julia
Layer

A structure to store a LittleDict of operations that can be selected during the learning phase of an ICN. If the layer is exclusive, only one operation can be selected at a time.

source

CompositionalNetworks.functions Function
julia
functions(layer)

Access the operations of a layer. The container is ordered.

source

Base.length Method
julia
length(layer)

Return the number of operations in a layer.

source

CompositionalNetworks.exclu Function
julia
exclu(layer)

Return true if the layer has mutually exclusive operations.

source

CompositionalNetworks.symbol Function
julia
symbol(layer, i)

Return the i-th symbols of the operations in a given layer.

source

CompositionalNetworks.nbits_exclu Function
julia
nbits_exclu(layer)

Convert the length of an exclusive layer into a number of bits.

source

CompositionalNetworks.show_layer Function
julia
show_layer(layer)

Return a string that contains the elements in a layer.

source

CompositionalNetworks.selected_size Function
julia
selected_size(layer, layer_weights)

Return the number of operations selected by layer_weights in layer.

source

CompositionalNetworks.is_viable Function
julia
is_viable(layer, w)
+    
Skip to content

A layer structure for any ICN

The layer.jl file defines a Layer structure and several associated functions for manipulating and interacting with this structure in the context of an Interpretable Compositional Network (ICN).

The Layer structure is used to store a LittleDict of operations that can be selected during the learning phase of an ICN. Each layer can be exclusive, meaning only one operation can be selected at a time. This is particularly useful in the context of ICNs, which are used to learn alternative expressions for highly combinatorial functions, such as those found in Constraint-based Local Search solvers.

CompositionalNetworks.Layer Type
julia
Layer

A structure to store a LittleDict of operations that can be selected during the learning phase of an ICN. If the layer is exclusive, only one operation can be selected at a time.

source

CompositionalNetworks.functions Function
julia
functions(layer)

Access the operations of a layer. The container is ordered.

source

Base.length Method
julia
length(layer)

Return the number of operations in a layer.

source

CompositionalNetworks.exclu Function
julia
exclu(layer)

Return true if the layer has mutually exclusive operations.

source

CompositionalNetworks.symbol Function
julia
symbol(layer, i)

Return the i-th symbols of the operations in a given layer.

source

CompositionalNetworks.nbits_exclu Function
julia
nbits_exclu(layer)

Convert the length of an exclusive layer into a number of bits.

source

CompositionalNetworks.show_layer Function
julia
show_layer(layer)

Return a string that contains the elements in a layer.

source

CompositionalNetworks.selected_size Function
julia
selected_size(layer, layer_weights)

Return the number of operations selected by layer_weights in layer.

source

CompositionalNetworks.is_viable Function
julia
is_viable(layer, w)
 is_viable(icn)
 is_viable(icn, w)

Assert if a pair of layer/icn and weights compose a viable pattern. If no weights are given with an icn, it will check the current internal value.

source

CompositionalNetworks.generate_inclusive_operations Function
julia
generate_inclusive_operations(predicate, bits)
 generate_exclusive_operation(max_op_number)

Generates the operations (weights) of a layer with inclusive/exclusive operations.

source

CompositionalNetworks.generate_exclusive_operation Function
julia
generate_exclusive_operation(max_op_number)

Generates the operations (weights) of a layer with exclusive operations.

source

CompositionalNetworks.generate_weights Function
julia
generate_weights(layers)
 generate_weights(icn)

Generate the weights of a collection of layers or of an ICN.

source

- + \ No newline at end of file diff --git a/dev/learning/12_transformation.html b/dev/learning/12_transformation.html index 5258085..14c12fe 100644 --- a/dev/learning/12_transformation.html +++ b/dev/learning/12_transformation.html @@ -8,16 +8,16 @@ - + - + -
Skip to content

Transformations Layer

Some text to describe the transformation layer within usual ICNs.

The implementation of the transformation relies heavily on the use of the lazy function (make a ref, open an issue to make @lazy macro in front of each transformation).

List of transformations

List the possible parameters and how it affects the transformations.

Non-parametric

CompositionalNetworks.tr_identity Function
julia
tr_identity(i, x)
+    
Skip to content

Transformations Layer

Some text to describe the transformation layer within usual ICNs.

The implementation of the transformation relies heavily on the use of the lazy function (make a ref, open an issue to make @lazy macro in front of each transformation).

List of transformations

List the possible parameters and how it affects the transformations.

Non-parametric

CompositionalNetworks.tr_identity Function
julia
tr_identity(i, x)
 tr_identity(x)
 tr_identity(x, X::AbstractVector)

Identity function. Already defined in Julia as identity, specialized for vectors. When X is provided, the result is computed without allocations.

source

CompositionalNetworks.tr_count_eq Function
julia
tr_count_eq(i, x)
 tr_count_eq(x)
@@ -62,7 +62,7 @@
 
 # Apply a count equal to parameter transformation
 count_eq_param_result = val_transforms[:count_eq_param](data, param)

source

CompositionalNetworks.transformation_layer Function
julia
transformation_layer(param = Vector{Symbol}())

Generate the layer of transformations functions of the ICN. Iff param value is non empty, also includes all the related parametric transformations.

source

- + \ No newline at end of file diff --git a/dev/learning/13_arithmetic.html b/dev/learning/13_arithmetic.html index fdbe9f9..7dd5a14 100644 --- a/dev/learning/13_arithmetic.html +++ b/dev/learning/13_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_sum Function
julia
ar_sum(x)

Reduce k = length(x) vectors through sum to a single vector.

source

CompositionalNetworks.ar_prod Function
julia
ar_prod(x)

Reduce k = length(x) vectors through product to a single vector.

source

Layer generation

CompositionalNetworks.arithmetic_layer Function
julia
arithmetic_layer()

Generate the layer of arithmetic operations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source

- +
Skip to content

Arithmetic Layer

Some text to describe the arithmetic layer within usual ICNs.

List of arithmetic operations

CompositionalNetworks.ar_sum Function
julia
ar_sum(x)

Reduce k = length(x) vectors through sum to a single vector.

source

CompositionalNetworks.ar_prod Function
julia
ar_prod(x)

Reduce k = length(x) vectors through product to a single vector.

source

Layer generation

CompositionalNetworks.arithmetic_layer Function
julia
arithmetic_layer()

Generate the layer of arithmetic operations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source

+ \ No newline at end of file diff --git a/dev/learning/14_aggregation.html b/dev/learning/14_aggregation.html index 50b75d1..fc38549 100644 --- a/dev/learning/14_aggregation.html +++ b/dev/learning/14_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_sum Function
julia
ag_sum(x)

Aggregate through + a vector into a single scalar.

source

CompositionalNetworks.ag_count_positive Function
julia
ag_count_positive(x)

Count the number of strictly positive elements of x.

source

Layer generation

CompositionalNetworks.aggregation_layer Function
julia
aggregation_layer()

Generate the layer of aggregations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source

- +
Skip to content

Aggregation Layer

Some text to describe the aggragation layer within usual ICNs.

List of aggregations

CompositionalNetworks.ag_sum Function
julia
ag_sum(x)

Aggregate through + a vector into a single scalar.

source

CompositionalNetworks.ag_count_positive Function
julia
ag_count_positive(x)

Count the number of strictly positive elements of x.

source

Layer generation

CompositionalNetworks.aggregation_layer Function
julia
aggregation_layer()

Generate the layer of aggregations of the ICN. The operations are mutually exclusive, that is only one will be selected.

source

+ \ No newline at end of file diff --git a/dev/learning/15_comparison.html b/dev/learning/15_comparison.html index a2a5700..1bfcc9d 100644 --- a/dev/learning/15_comparison.html +++ b/dev/learning/15_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_identity Function
julia
co_identity(x)

Identity function. Already defined in Julia as identity, specialized for scalars in the comparison layer.

source

CompositionalNetworks.co_euclidean Function
julia
co_euclidean(x; dom_size)

Compute an euclidean norm with domain size dom_size of a scalar.

source

CompositionalNetworks.co_abs_diff_var_vars Function
julia
co_abs_diff_var_vars(x; nvars)

Return the absolute difference between x and the number of variables nvars.

source

CompositionalNetworks.co_var_minus_vars Function
julia
co_var_minus_vars(x; nvars)

Return the difference x - nvars if positive, 0.0 otherwise, where nvars denotes the numbers of variables.

source

CompositionalNetworks.co_vars_minus_var Function
julia
co_vars_minus_var(x; nvars)

Return the difference nvars - x if positive, 0.0 otherwise, where nvars denotes the numbers of variables.

source

Param: :val

CompositionalNetworks.co_abs_diff_var_val Function
julia
co_abs_diff_var_val(x; val)

Return the absolute difference between x and val.

source

CompositionalNetworks.co_var_minus_val Function
julia
co_var_minus_val(x; val)

Return the difference x - val if positive, 0.0 otherwise.

source

CompositionalNetworks.co_val_minus_var Function
julia
co_val_minus_var(x; val)

Return the difference val - x if positive, 0.0 otherwise.

source

CompositionalNetworks.co_euclidean_val Function
julia
co_euclidean_val(x; val, dom_size)

Compute an euclidean norm with domain size dom_size, weighted by val, of a scalar.

source

Layer generation

CompositionalNetworks.make_comparisons Function
julia
make_comparisons(param::Symbol)

Generate the comparison functions for the given parameter.

source

CompositionalNetworks.comparison_layer Function
julia
comparison_layer(param = false)

Generate the layer of transformations functions of the ICN. Iff param value is set, also includes all the parametric comparison with that value. The operations are mutually exclusive, that is only one will be selected.

source

- +
Skip to content

Comparison Layer

Some text to describe the comparison layer within usual ICNs.

List of comparisons

List the possible parameters and how it affects the comparison.

Non-parametric

CompositionalNetworks.co_identity Function
julia
co_identity(x)

Identity function. Already defined in Julia as identity, specialized for scalars in the comparison layer.

source

CompositionalNetworks.co_euclidean Function
julia
co_euclidean(x; dom_size)

Compute an euclidean norm with domain size dom_size of a scalar.

source

CompositionalNetworks.co_abs_diff_var_vars Function
julia
co_abs_diff_var_vars(x; nvars)

Return the absolute difference between x and the number of variables nvars.

source

CompositionalNetworks.co_var_minus_vars Function
julia
co_var_minus_vars(x; nvars)

Return the difference x - nvars if positive, 0.0 otherwise, where nvars denotes the numbers of variables.

source

CompositionalNetworks.co_vars_minus_var Function
julia
co_vars_minus_var(x; nvars)

Return the difference nvars - x if positive, 0.0 otherwise, where nvars denotes the numbers of variables.

source

Param: :val

CompositionalNetworks.co_abs_diff_var_val Function
julia
co_abs_diff_var_val(x; val)

Return the absolute difference between x and val.

source

CompositionalNetworks.co_var_minus_val Function
julia
co_var_minus_val(x; val)

Return the difference x - val if positive, 0.0 otherwise.

source

CompositionalNetworks.co_val_minus_var Function
julia
co_val_minus_var(x; val)

Return the difference val - x if positive, 0.0 otherwise.

source

CompositionalNetworks.co_euclidean_val Function
julia
co_euclidean_val(x; val, dom_size)

Compute an euclidean norm with domain size dom_size, weighted by val, of a scalar.

source

Layer generation

CompositionalNetworks.make_comparisons Function
julia
make_comparisons(param::Symbol)

Generate the comparison functions for the given parameter.

source

CompositionalNetworks.comparison_layer Function
julia
comparison_layer(param = false)

Generate the layer of transformations functions of the ICN. Iff param value is set, also includes all the parametric comparison with that value. The operations are mutually exclusive, that is only one will be selected.

source

+ \ No newline at end of file diff --git a/dev/learning/20_qubo_constraints.html b/dev/learning/20_qubo_constraints.html index dc4b981..708cdfa 100644 --- a/dev/learning/20_qubo_constraints.html +++ b/dev/learning/20_qubo_constraints.html @@ -8,17 +8,17 @@ - + - + -
Skip to content

Introduction to QUBOConstraints.jl

Introduction to QUBOConstraints.jl.

Basic features

QUBOConstraints.QUBO_base Function
julia
QUBO_base(n, weight = 1)

A basic QUBO matrix to ensure that binarized variables keep a valid encoding.

source

QUBOConstraints.QUBO_linear_sum Function
julia
QUBO_linear_sum(n, σ)

One valid QUBO matrix given n variables and parameter σ for the linear sum constraint.

source

- +
Skip to content

Introduction to QUBOConstraints.jl

Introduction to QUBOConstraints.jl.

Basic features

QUBOConstraints.QUBO_base Function
julia
QUBO_base(n, weight = 1)

A basic QUBO matrix to ensure that binarized variables keep a valid encoding.

source

QUBOConstraints.QUBO_linear_sum Function
julia
QUBO_linear_sum(n, σ)

One valid QUBO matrix given n variables and parameter σ for the linear sum constraint.

source

+ \ No newline at end of file diff --git a/dev/learning/21_qubo_encoding.html b/dev/learning/21_qubo_encoding.html index 4b23551..e989f3f 100644 --- a/dev/learning/21_qubo_encoding.html +++ b/dev/learning/21_qubo_encoding.html @@ -8,17 +8,17 @@ - + - + -
Skip to content

Encoding for QUBO programs

QUBOConstraints.is_valid Function
julia
is_valid(x, encoding::Symbol = :none)

Check if x has a valid format for encoding.

For instance, if encoding == :one_hot, at most one bit of x can be set to 1.

source

QUBOConstraints.binarize Function
julia
binarize(x[, domain]; binarization = :one_hot)

Binarize x following the binarization encoding. If x is a vector (instead of a number per say), domain is optional.

source

QUBOConstraints.debinarize Function
julia
debinarize(x[, domain]; binarization = :one_hot)

Transform a binary vector into a number or a set of number. If domain is not given, it will compute a default value based on binarization and x.

source

- +
Skip to content

Encoding for QUBO programs

QUBOConstraints.is_valid Function
julia
is_valid(x, encoding::Symbol = :none)

Check if x has a valid format for encoding.

For instance, if encoding == :one_hot, at most one bit of x can be set to 1.

source

QUBOConstraints.binarize Function
julia
binarize(x[, domain]; binarization = :one_hot)

Binarize x following the binarization encoding. If x is a vector (instead of a number per say), domain is optional.

source

QUBOConstraints.debinarize Function
julia
debinarize(x[, domain]; binarization = :one_hot)

Transform a binary vector into a number or a set of number. If domain is not given, it will compute a default value based on binarization and x.

source

+ \ No newline at end of file diff --git a/dev/learning/22_qubo_learning.html b/dev/learning/22_qubo_learning.html index ef7ac0e..64d3c16 100644 --- a/dev/learning/22_qubo_learning.html +++ b/dev/learning/22_qubo_learning.html @@ -8,16 +8,16 @@ - + - + -
Skip to content

Learning QUBO matrices

Interface

QUBOConstraints.AbstractOptimizer Type
julia
AbstractOptimizer

An abstract type (interface) used to learn QUBO matrices from constraints. Only a train method is required.

source

QUBOConstraints.train Function
julia
train(args...)

Default train method for any AbstractOptimizer.

source

Examples with various optimizers

Gradient Descent

julia
struct GradientDescentOptimizer <: QUBOConstraints.AbstractOptimizer
+    
Skip to content

Learning QUBO matrices

Interface

QUBOConstraints.AbstractOptimizer Type
julia
AbstractOptimizer

An abstract type (interface) used to learn QUBO matrices from constraints. Only a train method is required.

source

QUBOConstraints.train Function
julia
train(args...)

Default train method for any AbstractOptimizer.

source

Examples with various optimizers

Gradient Descent

julia
struct GradientDescentOptimizer <: QUBOConstraints.AbstractOptimizer
     binarization::Symbol
     η::Float64
     precision::Int
@@ -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/30_constraints_translator.html b/dev/learning/30_constraints_translator.html index 1ea410e..f09129c 100644 --- a/dev/learning/30_constraints_translator.html +++ b/dev/learning/30_constraints_translator.html @@ -8,17 +8,17 @@ - + - + -
Skip to content

ConstraintsTranslator.jl

Documentation for ConstraintsTranslator.jl.

- +
Skip to content

ConstraintsTranslator.jl

Documentation for ConstraintsTranslator.jl.

+ \ No newline at end of file diff --git a/dev/learning/90_constraint_learning.html b/dev/learning/90_constraint_learning.html index 299083e..b1975db 100644 --- a/dev/learning/90_constraint_learning.html +++ b/dev/learning/90_constraint_learning.html @@ -8,17 +8,17 @@ - + - + -
Skip to content

ConstraintLearning.jl

Documentation for ConstraintLearning.jl.

ConstraintLearning.ICNConfig Type
julia
struct ICNConfig{O <: ICNOptimizer}

A structure to hold the metric and optimizer configurations used in learning the weights of an ICN.

source

ConstraintLearning.ICNConfig Method
julia
ICNConfig(; metric = :hamming, optimizer = ICNGeneticOptimizer())

Constructor for ICNConfig. Defaults to hamming metric using a genetic algorithm.

source

ConstraintLearning.ICNGeneticOptimizer Method
julia
ICNGeneticOptimizer(; kargs...)

Default constructor to learn an ICN through a Genetic Algorithm. Default kargs TBW.

source

ConstraintLearning.ICNLocalSearchOptimizer Type
julia
ICNLocalSearchOptimizer(options = LocalSearchSolvers.Options())

Default constructor to learn an ICN through a CBLS solver.

source

ConstraintLearning.ICNOptimizer Type
julia
const ICNOptimizer = CompositionalNetworks.AbstractOptimizer

An abstract type for optmizers defined to learn ICNs.

source

ConstraintLearning.QUBOGradientOptimizer Method
julia
QUBOGradientOptimizer(; kargs...)

A QUBO optimizer based on gradient descent. Defaults TBW

source

ConstraintLearning.QUBOOptimizer Type
julia
const QUBOOptimizer = QUBOConstraints.AbstractOptimizer

An abstract type for optimizers used to learn QUBO matrices from constraints.

source

CompositionalNetworks.optimize! Method
julia
CompositionalNetworks.optimize!(icn, solutions, non_sltns, dom_size, metric, optimizer::ICNGeneticOptimizer; parameters...)

Extends the optimize! method to ICNGeneticOptimizer.

source

CompositionalNetworks.optimize! Method
julia
CompositionalNetworks.optimize!(icn, solutions, non_sltns, dom_size, metric, optimizer::ICNLocalSearchOptimizer; parameters...)

Extends the optimize! method to ICNLocalSearchOptimizer.

source

ConstraintLearning._optimize! Method
julia
_optimize!(icn, X, X_sols; metric = hamming, pop_size = 200)

Optimize and set the weights of an ICN with a given set of configuration X and solutions X_sols.

source

ConstraintLearning.domain_size Method
julia
domain_size(ds::Number)

Extends the domain_size function when ds is number (for dispatch purposes).

source

ConstraintLearning.generate_population Method
julia
generate_population(icn, pop_size

Generate a pôpulation of weights (individuals) for the genetic algorithm weighting icn.

source

ConstraintLearning.icn Method
julia
icn(X,X̅; kargs..., parameters...)

TBW

source

ConstraintLearning.loss Method
julia
loss(x, y, Q)

Loss of the prediction given by Q, a training set y, and a given configuration x.

source

ConstraintLearning.make_df Method
julia
make_df(X, Q, penalty, binarization, domains)

DataFrame arrangement to output some basic evaluation of a matrix Q.

source

ConstraintLearning.make_set_penalty Method
julia
make_set_penalty(X, X̅, args...; kargs)

Return a penalty function when the training set is already split into a pair of solutions X and non solutions .

source

ConstraintLearning.make_training_sets Method
julia
make_training_sets(X, penalty, args...)

Return a pair of solutions and non solutions sets based on X and penalty.

source

ConstraintLearning.mutually_exclusive Method
julia
mutually_exclusive(layer, w)

Constraint ensuring that w encode exclusive operations in layer.

source

ConstraintLearning.no_empty_layer Method
julia
no_empty_layer(x; X = nothing)

Constraint ensuring that at least one operation is selected.

source

ConstraintLearning.optimize! Method
julia
optimize!(icn, X, X_sols, global_iter, local_iter; metric=hamming, popSize=100)

Optimize and set the weights of an ICN with a given set of configuration X and solutions X_sols. The best weights among global_iter will be set.

source

ConstraintLearning.parameter_specific_operations Method
julia
parameter_specific_operations(x; X = nothing)

Constraint ensuring that at least one operation related to parameters is selected if the error function to be learned is parametric.

source

ConstraintLearning.predict Method
julia
predict(x, Q)

Return the predictions given by Q for a given configuration x.

source

ConstraintLearning.preliminaries Method
julia
preliminaries(args)

Preliminaries to the training process in a QUBOGradientOptimizer run.

source

ConstraintLearning.qubo Function
julia
qubo(X,X̅; kargs..., parameters...)

TBW

source

ConstraintLearning.sub_eltype Method
julia
sub_eltype(X)

Return the element type of of the first element of a collection.

source

ConstraintLearning.train! Method
julia
train!(Q, X, penalty, η, precision, X_test, oversampling, binarization, domains)

Training inner method.

source

ConstraintLearning.train Method
julia
train(X, penalty[, d]; optimizer = QUBOGradientOptimizer(), X_test = X)

Learn a QUBO matrix on training set X for a constraint defined by penalty with optional domain information d. By default, it uses a QUBOGradientOptimizer and X as a testing set.

source

ConstraintLearning.δ Method
julia
δ(X[, Y]; discrete = true)

Compute the extrema over a collection X``or a pair of collection(X, Y)`.

source

- +
Skip to content

ConstraintLearning.jl

Documentation for ConstraintLearning.jl.

ConstraintLearning.ICNConfig Type
julia
struct ICNConfig{O <: ICNOptimizer}

A structure to hold the metric and optimizer configurations used in learning the weights of an ICN.

source

ConstraintLearning.ICNConfig Method
julia
ICNConfig(; metric = :hamming, optimizer = ICNGeneticOptimizer())

Constructor for ICNConfig. Defaults to hamming metric using a genetic algorithm.

source

ConstraintLearning.ICNGeneticOptimizer Method
julia
ICNGeneticOptimizer(; kargs...)

Default constructor to learn an ICN through a Genetic Algorithm. Default kargs TBW.

source

ConstraintLearning.ICNLocalSearchOptimizer Type
julia
ICNLocalSearchOptimizer(options = LocalSearchSolvers.Options())

Default constructor to learn an ICN through a CBLS solver.

source

ConstraintLearning.ICNOptimizer Type
julia
const ICNOptimizer = CompositionalNetworks.AbstractOptimizer

An abstract type for optmizers defined to learn ICNs.

source

ConstraintLearning.QUBOGradientOptimizer Method
julia
QUBOGradientOptimizer(; kargs...)

A QUBO optimizer based on gradient descent. Defaults TBW

source

ConstraintLearning.QUBOOptimizer Type
julia
const QUBOOptimizer = QUBOConstraints.AbstractOptimizer

An abstract type for optimizers used to learn QUBO matrices from constraints.

source

CompositionalNetworks.optimize! Method
julia
CompositionalNetworks.optimize!(icn, solutions, non_sltns, dom_size, metric, optimizer::ICNGeneticOptimizer; parameters...)

Extends the optimize! method to ICNGeneticOptimizer.

source

CompositionalNetworks.optimize! Method
julia
CompositionalNetworks.optimize!(icn, solutions, non_sltns, dom_size, metric, optimizer::ICNLocalSearchOptimizer; parameters...)

Extends the optimize! method to ICNLocalSearchOptimizer.

source

ConstraintLearning._optimize! Method
julia
_optimize!(icn, X, X_sols; metric = hamming, pop_size = 200)

Optimize and set the weights of an ICN with a given set of configuration X and solutions X_sols.

source

ConstraintLearning.domain_size Method
julia
domain_size(ds::Number)

Extends the domain_size function when ds is number (for dispatch purposes).

source

ConstraintLearning.generate_population Method
julia
generate_population(icn, pop_size

Generate a pôpulation of weights (individuals) for the genetic algorithm weighting icn.

source

ConstraintLearning.icn Method
julia
icn(X,X̅; kargs..., parameters...)

TBW

source

ConstraintLearning.loss Method
julia
loss(x, y, Q)

Loss of the prediction given by Q, a training set y, and a given configuration x.

source

ConstraintLearning.make_df Method
julia
make_df(X, Q, penalty, binarization, domains)

DataFrame arrangement to output some basic evaluation of a matrix Q.

source

ConstraintLearning.make_set_penalty Method
julia
make_set_penalty(X, X̅, args...; kargs)

Return a penalty function when the training set is already split into a pair of solutions X and non solutions .

source

ConstraintLearning.make_training_sets Method
julia
make_training_sets(X, penalty, args...)

Return a pair of solutions and non solutions sets based on X and penalty.

source

ConstraintLearning.mutually_exclusive Method
julia
mutually_exclusive(layer, w)

Constraint ensuring that w encode exclusive operations in layer.

source

ConstraintLearning.no_empty_layer Method
julia
no_empty_layer(x; X = nothing)

Constraint ensuring that at least one operation is selected.

source

ConstraintLearning.optimize! Method
julia
optimize!(icn, X, X_sols, global_iter, local_iter; metric=hamming, popSize=100)

Optimize and set the weights of an ICN with a given set of configuration X and solutions X_sols. The best weights among global_iter will be set.

source

ConstraintLearning.parameter_specific_operations Method
julia
parameter_specific_operations(x; X = nothing)

Constraint ensuring that at least one operation related to parameters is selected if the error function to be learned is parametric.

source

ConstraintLearning.predict Method
julia
predict(x, Q)

Return the predictions given by Q for a given configuration x.

source

ConstraintLearning.preliminaries Method
julia
preliminaries(args)

Preliminaries to the training process in a QUBOGradientOptimizer run.

source

ConstraintLearning.qubo Function
julia
qubo(X,X̅; kargs..., parameters...)

TBW

source

ConstraintLearning.sub_eltype Method
julia
sub_eltype(X)

Return the element type of of the first element of a collection.

source

ConstraintLearning.train! Method
julia
train!(Q, X, penalty, η, precision, X_test, oversampling, binarization, domains)

Training inner method.

source

ConstraintLearning.train Method
julia
train(X, penalty[, d]; optimizer = QUBOGradientOptimizer(), X_test = X)

Learn a QUBO matrix on training set X for a constraint defined by penalty with optional domain information d. By default, it uses a QUBOGradientOptimizer and X as a testing set.

source

ConstraintLearning.δ Method
julia
δ(X[, Y]; discrete = true)

Compute the extrema over a collection X``or a pair of collection(X, Y)`.

source

+ \ No newline at end of file diff --git a/dev/perf/00_perf_checker.html b/dev/perf/00_perf_checker.html index 43a47c3..ce83950 100644 --- a/dev/perf/00_perf_checker.html +++ b/dev/perf/00_perf_checker.html @@ -8,16 +8,16 @@ - + - + -
Skip to content

PerfChecker.jl

PerfChecker.jl is a package designed for package authors to easily performance test their packages. To achieve that, it provides the follwing features:

  • The main macro @check, which provides an easy-to-use interface over various interfaces, configurable for various backends via a dictionary.

  • (WIP) A CI for reproducible performance testing.

  • Visualization of different metrics from @check using Makie.jl

Usage

The primary usage of PerfChecker.jl looks like this:

julia
  using PerfChecker
+    
Skip to content

PerfChecker.jl

PerfChecker.jl is a package designed for package authors to easily performance test their packages. To achieve that, it provides the follwing features:

  • The main macro @check, which provides an easy-to-use interface over various interfaces, configurable for various backends via a dictionary.

  • (WIP) A CI for reproducible performance testing.

  • Visualization of different metrics from @check using Makie.jl

Usage

The primary usage of PerfChecker.jl looks like this:

julia
  using PerfChecker
   # optional using custom backend like BenchmarkTools, Chairmark etc 
   config = Dict(:option1 => "value1", :option2 => :value2)
   
@@ -30,7 +30,7 @@
   # Visualization of the results
   using Makie
   checkres_to_scatterlines(results)

The config dictionary can take many options, depending on the backend.

Some of the commonly used options are:

  • :PATH => The path where to the default environment of julia when creating a new process.

  • :pkgs => A list of versions to test performance for. Its defined as the Tuple, (name::String, option::Symbol, versions::Vector{VersionNumber}, last_or_first::Bool) Can be given as follows:

    • name is the name of the package.

    • option is one of the 5 symbols:

      • :patches: last patch or first patch of a version

      • :breaking: last breaking or next breaking version

      • :major: previous or next major version

      • :minor: previous or next minor version

      • :custom: custom version numbers (provide any boolean value for last_or_first in this case as it doesn't matter)

    • versions: The input for the provided option

    • last_or_first: Input for the provided option

  • :tags => A list of tags (a vector of symbols) to easily tag performance tests.

  • :devops => Giving a custom input to Pkg.develop. Intended to be used to test performance of a local development branch of a pacakge with previous versions. Often can be used as simply as :devops => "MyPackageName"

  • :threads => An integer to select the number of threads to start Julia with.

Checkout the documentation of the other backends for more default options and the default values.

- + \ No newline at end of file diff --git a/dev/perf/10_tutorial.html b/dev/perf/10_tutorial.html index f1f84f6..d7286a1 100644 --- a/dev/perf/10_tutorial.html +++ b/dev/perf/10_tutorial.html @@ -8,16 +8,16 @@ - + - + -
Skip to content

Tutorial

Taken from PerfChecker.jl examples, this is a guide for performance testing of PatterFolds.jl package using Chairmarks.jl

Using PerfChecker.jl requires an environment with the dependencies present in it.

The actual script looks like this:

julia
using PerfChecker, Chairmarks, CairoMakie
+    
Skip to content

Tutorial

Taken from PerfChecker.jl examples, this is a guide for performance testing of PatterFolds.jl package using Chairmarks.jl

Using PerfChecker.jl requires an environment with the dependencies present in it.

The actual script looks like this:

julia
using PerfChecker, Chairmarks, CairoMakie
 
 d = Dict(:path => @__DIR__, :evals => 10, :samples => 1000,
     :seconds => 100, :tags => [:patterns, :intervals],
@@ -57,7 +57,7 @@
     c2 = checkres_to_boxplots(x, Val(:chairmark); kwarg)
     save(joinpath(@__DIR__, "visuals", "chair_boxplots_$kwarg.png"), c2)
 end

d here is the configuration dictionary. x stores the results from performance testing

The code below the macro call is for plotting and storing the plots. It creates the visuals folder and stores the following plots in the folder:

Boxplots from Chairmarks for allocations:

chair_boxplots

Boxplots from Chairmarks for times:

chair_times

Evolution of different metrics across versions according to Chairmarks:

chair_evolution
- + \ No newline at end of file diff --git a/dev/perf/20_perf_interface.html b/dev/perf/20_perf_interface.html index a0befbc..98ef481 100644 --- a/dev/perf/20_perf_interface.html +++ b/dev/perf/20_perf_interface.html @@ -8,16 +8,16 @@ - + - + -
Skip to content

Extending PerfChecker

PerfChecker was build as an easy to extend interface. A good reference example for this is the Chairmarks extension.

Extending PerfChecker works via PkgExtensions feature in Julia. There are 6 essential functions that need to be extended inside the Pkg extension. Each extension has a keyword symbol for it, which users can input to use the extension.

The Default Options

Method to be overloaded: PerfChecker.default_options(::Val{:myperfextension})::Dict

PerfChecker works via a config dictionary. Users can populate this dictionary with options and provide it to the main check macro to customize the performance testing to their liking.

For Chairmarks.jl, it looks like this:

julia
function PerfChecker.default_options(::Val{:chairmark})
+    
Skip to content

Extending PerfChecker

PerfChecker was build as an easy to extend interface. A good reference example for this is the Chairmarks extension.

Extending PerfChecker works via PkgExtensions feature in Julia. There are 6 essential functions that need to be extended inside the Pkg extension. Each extension has a keyword symbol for it, which users can input to use the extension.

The Default Options

Method to be overloaded: PerfChecker.default_options(::Val{:myperfextension})::Dict

PerfChecker works via a config dictionary. Users can populate this dictionary with options and provide it to the main check macro to customize the performance testing to their liking.

For Chairmarks.jl, it looks like this:

julia
function PerfChecker.default_options(::Val{:chairmark})
     return Dict(
         :threads => 1,
         :track => "none",
@@ -44,7 +44,7 @@
     allocs = [chair.samples[i].allocs for i in 1:l]
     return Table(times = times, gctimes = gctimes, bytes = bytes, allocs = allocs)
 end

There are also other functions that can be overloaded, mostly related to plotting but these are the basic functions to extend PerfChecker for a custom backend.

- + \ No newline at end of file diff --git a/dev/perf/30_benchmark_ext.html b/dev/perf/30_benchmark_ext.html index 4343043..8f5f22d 100644 --- a/dev/perf/30_benchmark_ext.html +++ b/dev/perf/30_benchmark_ext.html @@ -8,16 +8,16 @@ - + - + -
Skip to content

BenchmarkTools Extension

A benchmarking extension, based on BenchmarkTools.jl, has been interfaced with PerfChecker.jl. This section will provide some usage examples, documentation, and links to related notebooks.

Usage

Like all other extensions, BenchmarkTools extension can be used in the following way:

julia
julia> using BenchmarkTools, PerfChecker
+    
Skip to content

BenchmarkTools Extension

A benchmarking extension, based on BenchmarkTools.jl, has been interfaced with PerfChecker.jl. This section will provide some usage examples, documentation, and links to related notebooks.

Usage

Like all other extensions, BenchmarkTools extension can be used in the following way:

julia
julia> using BenchmarkTools, PerfChecker
 
 julia> @check :benchmark Dict(:option1 => "value1", :option2 => "value2", :PATH => @__DIR__) begin
   # the prelimnary code goes here
@@ -35,7 +35,7 @@
 :gcsample => BenchmarkTools.DEFAULT_PARAMETERS.gcsample
 :time_tolerance => BenchmarkTools.DEFAULT_PARAMETERS.time_tolerance
 :memory_tolerance => BenchmarkTools.DEFAULT_PARAMETERS.memory_tolerance
- + \ No newline at end of file diff --git a/dev/perf/40_chairmarks_ext.html b/dev/perf/40_chairmarks_ext.html index 3339508..53c5aff 100644 --- a/dev/perf/40_chairmarks_ext.html +++ b/dev/perf/40_chairmarks_ext.html @@ -8,16 +8,16 @@ - + - + -
Skip to content

Chairmarks Extension

A benchmarking extension, based on Chairmarks.jl, has been interfaced with PerfChecker.jl. This section will provide some usage examples, documentation, and links to related notebooks.

Usage

Like all other extensions, BenchmarkTools extension can be used in the following way:

julia
julia> using Chairmarks, PerfChecker
+    
Skip to content

Chairmarks Extension

A benchmarking extension, based on Chairmarks.jl, has been interfaced with PerfChecker.jl. This section will provide some usage examples, documentation, and links to related notebooks.

Usage

Like all other extensions, BenchmarkTools extension can be used in the following way:

julia
julia> using Chairmarks, PerfChecker
 
 julia> @check :chairmark Dict(:option1 => "value1", :option2 => "value2", :PATH => @__DIR__) begin
   # the prelimnary code goes here
@@ -31,7 +31,7 @@
 :seconds => 1,
 :samples => nothing
 :gc => true
- + \ No newline at end of file diff --git a/dev/perf/90_api.html b/dev/perf/90_api.html index f70a7a3..f87ea5c 100644 --- a/dev/perf/90_api.html +++ b/dev/perf/90_api.html @@ -8,16 +8,16 @@ - + - + -
Skip to content

API

Here's the API for PerfChecker.jl

PerfChecker.arrange_breaking Method

Outputs the last breaking or next breaking version.

source

PerfChecker.arrange_major Method

Outputs the earlier or next major version.

source

PerfChecker.arrange_patches Method

Outputs the last patch or first patch of a version.

source

PerfChecker.get_pkg_versions Function

Finds all versions of a package in all the installed registries and returns it as a vector.

Example:

julia
julia> get_pkg_versions("ConstraintLearning")
+    
Skip to content

API

Here's the API for PerfChecker.jl

PerfChecker.arrange_breaking Method

Outputs the last breaking or next breaking version.

source

PerfChecker.arrange_major Method

Outputs the earlier or next major version.

source

PerfChecker.arrange_patches Method

Outputs the last patch or first patch of a version.

source

PerfChecker.get_pkg_versions Function

Finds all versions of a package in all the installed registries and returns it as a vector.

Example:

julia
julia> get_pkg_versions("ConstraintLearning")
 7-element Vector{VersionNumber}:
  v"0.1.4"
  v"0.1.5"
@@ -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/solvers/00_intro.html b/dev/solvers/00_intro.html index 5900b07..268d0ee 100644 --- a/dev/solvers/00_intro.html +++ b/dev/solvers/00_intro.html @@ -8,17 +8,17 @@ - + - + -
Skip to content
- +
Skip to content
+ \ No newline at end of file diff --git a/dev/solvers/10_cbls.html b/dev/solvers/10_cbls.html index 7bb185c..f145624 100644 --- a/dev/solvers/10_cbls.html +++ b/dev/solvers/10_cbls.html @@ -8,16 +8,16 @@ - + - + -
Skip to content

CBLS.jl

Documentation for CBLS.jl.

CBLS.AllDifferent Type

Global constraint ensuring that all the values of a given configuration are unique.

julia
@constraint(model, X in AllDifferent())

source

CBLS.AllEqual Type

Global constraint ensuring that all the values of X are all equal.

julia
@constraint(model, X in AllEqual())

source

CBLS.AtLeast Type

Constraint ensuring that the number of occurrences of the values in vals in x is at least val.

julia
@constraint(model, X in AtLeast(val, vals))

source

CBLS.AtMost Type

Constraint ensuring that the number of occurrences of the values in vals in x is at most val.

julia
@constraint(model, X in AtMost(val, vals))

source

CBLS.Conflicts Type

Global constraint ensuring that the tuple x does not match any configuration listed within the conflict set pair_vars. This constraint, originating from the extension model, stipulates that x must avoid all configurations defined as conflicts: x ∉ pair_vars. It is useful for specifying tuples that are explicitly forbidden and should be excluded from the solution space.

julia
@constraint(model, X in Conflicts(; pair_vars))

source

CBLS.Count Type

Global constraint ensuring that the number of occurrences of val in X is equal to count.

julia
@constraint(model, X in Count(count, val, vals))

source

CBLS.Cumulative Type

Global constraint ensuring that the cumulative sum of the heights of the tasks is less than or equal to val.

julia
@constraint(model, X in Cumulative(; pair_vars, op, val))

source

CBLS.DiscreteSet Type
julia
DiscreteSet(values)

Create a discrete set of values.

Arguments

  • values::Vector{T}: A vector of values to include in the set.

Returns

  • DiscreteSet{T}: A discrete set containing the specified values.

source

CBLS.DistDifferent Type

A constraint ensuring that the distances between marks on the ruler are unique. Specifically, it checks that the distance between x[1] and x[2], and the distance between x[3] and x[4], are different. This constraint is fundamental in ensuring the validity of a Golomb ruler, where no two pairs of marks should have the same distance between them.

source

CBLS.Element Type

Global constraint ensuring that the value of X at index id is equal to val.

julia
@constraint(model, X in Element(; id = nothing, op = ==, val = 0))

source

CBLS.Error Type
julia
Error{F <: Function} <: JuMP.AbstractVectorSet

The solver will compute a straightforward error function based on the concept. To run the solver efficiently, it is possible to provide an error function err instead of concept. err must return a nonnegative real number.

julia
@constraint(model, X in Error(err))

source

CBLS.Exactly Type

Constraint ensuring that the number of occurrences of the values in vals in x is exactly val.

julia
@constraint(model, X in Exactly(val, vals))

source

CBLS.Extension Type

Global constraint enforcing that the tuple x matches a configuration within the supports set pair_vars[1] or does not match any configuration within the conflicts set pair_vars[2]. It embodies the logic: x ∈ pair_vars[1] || x ∉ pair_vars[2], providing a comprehensive way to define valid (supported) and invalid (conflicted) tuples for constraint satisfaction problems. This constraint is versatile, allowing for the explicit delineation of both acceptable and unacceptable configurations.

source

CBLS.Instantiation Type

The instantiation constraint is a global constraint used in constraint programming that ensures that a list of variables takes on a specific set of values in a specific order.

source

CBLS.Intention Type
julia
Intention{F <: Function} <: JuMP.AbstractVectorSet

Represents an intention set in the model.

Arguments

  • f::F: A function representing the intention.

source

CBLS.MDDConstraint Type

Multi-valued Decision Diagram (MDD) constraint.

The MDD constraint is a constraint that can be used to model a wide range of problems. It is a directed graph where each node is labeled with a value and each edge is labeled with a value. The constraint is satisfied if there is a path from the first node to the last node such that the sequence of edge labels is a valid sequence of the value labels.

julia
@constraint(model, X in MDDConstraint(; language))

source

CBLS.MOIAllDifferent Type
julia
MOIAllDifferent <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOIAllEqual Type
julia
MOIAllEqual <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOIConflicts Type
julia
MOIConflicts{T <: Number, V <: Vector{Vector{T}}} <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOICumulative Type
julia
MOICumulative{F <: Function, T1 <: Number, T2 <: Number} <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOIDistDifferent Type
julia
MOIDistDifferent <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOIElement Type
julia
MOIElement{I <: Integer, F <: Function, T <: Union{Nothing, Number}} <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOIError Type
julia
MOIError{F <: Function} <: MOI.AbstractVectorSet

DOCSTRING

Arguments:

  • f::F: DESCRIPTION

  • dimension::Int: DESCRIPTION

  • MOIError(f, dim = 0) = begin #= none:5 =# new{typeof(f)}(f, dim) end: DESCRIPTION

source

CBLS.MOIExtension Type
julia
MOIExtension{T <: Number, V <: Union{Vector{Vector{T}}, Tuple{Vector{T}, Vector{T}}}} <: MOI.AbstractVectorSet
+    
Skip to content

CBLS.jl

Documentation for CBLS.jl.

CBLS.AllDifferent Type

Global constraint ensuring that all the values of a given configuration are unique.

julia
@constraint(model, X in AllDifferent())

source

CBLS.AllEqual Type

Global constraint ensuring that all the values of X are all equal.

julia
@constraint(model, X in AllEqual())

source

CBLS.AtLeast Type

Constraint ensuring that the number of occurrences of the values in vals in x is at least val.

julia
@constraint(model, X in AtLeast(val, vals))

source

CBLS.AtMost Type

Constraint ensuring that the number of occurrences of the values in vals in x is at most val.

julia
@constraint(model, X in AtMost(val, vals))

source

CBLS.Conflicts Type

Global constraint ensuring that the tuple x does not match any configuration listed within the conflict set pair_vars. This constraint, originating from the extension model, stipulates that x must avoid all configurations defined as conflicts: x ∉ pair_vars. It is useful for specifying tuples that are explicitly forbidden and should be excluded from the solution space.

julia
@constraint(model, X in Conflicts(; pair_vars))

source

CBLS.Count Type

Global constraint ensuring that the number of occurrences of val in X is equal to count.

julia
@constraint(model, X in Count(count, val, vals))

source

CBLS.Cumulative Type

Global constraint ensuring that the cumulative sum of the heights of the tasks is less than or equal to val.

julia
@constraint(model, X in Cumulative(; pair_vars, op, val))

source

CBLS.DiscreteSet Type
julia
DiscreteSet(values)

Create a discrete set of values.

Arguments

  • values::Vector{T}: A vector of values to include in the set.

Returns

  • DiscreteSet{T}: A discrete set containing the specified values.

source

CBLS.DistDifferent Type

A constraint ensuring that the distances between marks on the ruler are unique. Specifically, it checks that the distance between x[1] and x[2], and the distance between x[3] and x[4], are different. This constraint is fundamental in ensuring the validity of a Golomb ruler, where no two pairs of marks should have the same distance between them.

source

CBLS.Element Type

Global constraint ensuring that the value of X at index id is equal to val.

julia
@constraint(model, X in Element(; id = nothing, op = ==, val = 0))

source

CBLS.Error Type
julia
Error{F <: Function} <: JuMP.AbstractVectorSet

The solver will compute a straightforward error function based on the concept. To run the solver efficiently, it is possible to provide an error function err instead of concept. err must return a nonnegative real number.

julia
@constraint(model, X in Error(err))

source

CBLS.Exactly Type

Constraint ensuring that the number of occurrences of the values in vals in x is exactly val.

julia
@constraint(model, X in Exactly(val, vals))

source

CBLS.Extension Type

Global constraint enforcing that the tuple x matches a configuration within the supports set pair_vars[1] or does not match any configuration within the conflicts set pair_vars[2]. It embodies the logic: x ∈ pair_vars[1] || x ∉ pair_vars[2], providing a comprehensive way to define valid (supported) and invalid (conflicted) tuples for constraint satisfaction problems. This constraint is versatile, allowing for the explicit delineation of both acceptable and unacceptable configurations.

source

CBLS.Instantiation Type

The instantiation constraint is a global constraint used in constraint programming that ensures that a list of variables takes on a specific set of values in a specific order.

source

CBLS.Intention Type
julia
Intention{F <: Function} <: JuMP.AbstractVectorSet

Represents an intention set in the model.

Arguments

  • f::F: A function representing the intention.

source

CBLS.MDDConstraint Type

Multi-valued Decision Diagram (MDD) constraint.

The MDD constraint is a constraint that can be used to model a wide range of problems. It is a directed graph where each node is labeled with a value and each edge is labeled with a value. The constraint is satisfied if there is a path from the first node to the last node such that the sequence of edge labels is a valid sequence of the value labels.

julia
@constraint(model, X in MDDConstraint(; language))

source

CBLS.MOIAllDifferent Type
julia
MOIAllDifferent <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOIAllEqual Type
julia
MOIAllEqual <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOIConflicts Type
julia
MOIConflicts{T <: Number, V <: Vector{Vector{T}}} <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOICumulative Type
julia
MOICumulative{F <: Function, T1 <: Number, T2 <: Number} <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOIDistDifferent Type
julia
MOIDistDifferent <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOIElement Type
julia
MOIElement{I <: Integer, F <: Function, T <: Union{Nothing, Number}} <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOIError Type
julia
MOIError{F <: Function} <: MOI.AbstractVectorSet

DOCSTRING

Arguments:

  • f::F: DESCRIPTION

  • dimension::Int: DESCRIPTION

  • MOIError(f, dim = 0) = begin #= none:5 =# new{typeof(f)}(f, dim) end: DESCRIPTION

source

CBLS.MOIExtension Type
julia
MOIExtension{T <: Number, V <: Union{Vector{Vector{T}}, Tuple{Vector{T}, Vector{T}}}} <: MOI.AbstractVectorSet
 
 DOCSTRING

source

CBLS.MOIInstantiation Type
julia
MOIInstantiation{T <: Number, V <: Vector{T}} <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOIIntention Type
julia
MOIIntention{F <: Function} <: MOI.AbstractVectorSet

Represents an intention set in the model.

Arguments

  • f::F: A function representing the intention.

  • dimension::Int: The dimension of the vector set.

source

CBLS.MOIMaximum Type
julia
MOIMaximum {F <: Function, T <: Number} <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOIMinimum Type
julia
MOIMinimum {F <: Function, T <: Number} <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOIMultivaluedDecisionDiagram Type
julia
MOIMultivaluedDecisionDiagram{L <: ConstraintCommons.AbstractMultivaluedDecisionDiagram} <: AbstractVectorSet

DOCSTRING

source

CBLS.MOINValues Type
julia
MOINValues{F <: Function, T1 <: Number, T2 <: Number, V <: Vector{T2}} <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOINoOverlap Type
julia
MOINoOverlap{I <: Integer, T <: Number, V <: Vector{T}} <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOIOrdered Type
julia
MOIOrdered{F <: Function, T <: Number, V <: Vector{T}} <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOIRegular Type
julia
MOIRegular{L <: ConstraintCommons.AbstractAutomaton} <: AbstractVectorSet

DOCSTRING

source

CBLS.MOISum Type
julia
MOISum{F <: Function, T1 <: Number, T2 <: Number, V <: Number} <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.MOISupports Type
julia
MOISupports{T <: Number, V <: Vector{Vector{T}}} <: MOI.AbstractVectorSet

DOCSTRING

source

CBLS.Maximum Type

Global constraint ensuring that the maximum value in the tuple x satisfies the condition op(x) val. This constraint is useful for specifying that the maximum value in the tuple must satisfy a certain condition.

julia
@constraint(model, X in Maximum(; op = ==, val))

source

CBLS.Minimum Type

Global constraint ensuring that the minimum value in the tuple x satisfies the condition op(x) val. This constraint is useful for specifying that the minimum value in the tuple must satisfy a certain condition.

julia
@constraint(model, X in Minimum(; op = ==, val))

source

CBLS.NValues Type

Global constraint ensuring that the number of distinct values in X satisfies the given condition.

source

CBLS.NoOverlap Type

Global constraint ensuring that the tuple x does not overlap with any configuration listed within the pair set pair_vars. This constraint, originating from the extension model, stipulates that x must avoid all configurations defined as pairs: x ∩ pair_vars = ∅. It is useful for specifying tuples that are explicitly forbidden and should be excluded from the solution space.

julia
@constraint(model, X in NoOverlap(; bool = true, dim = 1, pair_vars = nothing))

source

CBLS.Optimizer Type
julia
Optimizer(model = Model(); options = Options())

Create an instance of the Optimizer.

Arguments

  • model: The model to be optimized.

  • options::Options: Options for configuring the solver.

Returns

  • Optimizer: An instance of the optimizer.

source

CBLS.Optimizer Type
julia
Optimizer <: MOI.AbstractOptimizer

Defines an optimizer for CBLS.

Fields

  • solver::LS.MainSolver: The main solver used for local search.

  • int_vars::Set{Int}: Set of integer variables.

  • compare_vars::Set{Int}: Set of variables to compare.

source

CBLS.Ordered Type

Global constraint ensuring that the variables are ordered according to op.

source

CBLS.Predicate Type
julia
Predicate{F <: Function} <: JuMP.AbstractVectorSet

Deprecated: Use Intention instead.

Represents a predicate set in the model.

Arguments

  • f::F: A function representing the predicate.

source

CBLS.Regular Type

Ensures that a sequence x (interpreted as a word) is accepted by the regular language represented by a given automaton. This constraint verifies the compliance of x with the language rules encoded within the automaton parameter, which must be an instance of <:AbstractAutomaton.

julia
@constraint(model, X in RegularConstraint(; language))

source

CBLS.ScalarFunction Type
julia
ScalarFunction{F <: Function, V <: Union{Nothing, VOV}} <: MOI.AbstractScalarFunction

A container to express any function with real value in JuMP syntax. Used with the @objective macro.

Arguments:

  • f::F: function to be applied to X

  • X::V: a subset of the variables of the model.

Given a model, and some (collection of) variables X to optimize. an objective function f can be added as follows. Note that only Min for minimization us currently defined. Max will come soon.

julia
# Applies to all variables in order of insertion.
 # Recommended only when the function argument order does not matter.
@@ -25,7 +25,7 @@
 
 # Generic use
 @objective(model, ScalarFunction(f, X))

source

CBLS.Sum Type

Global constraint ensuring that the sum of the variables in x satisfies a given condition.

source

CBLS.Supports Type

Global constraint ensuring that the tuple x matches a configuration listed within the support set pair_vars. This constraint is derived from the extension model, specifying that x must be one of the explicitly defined supported configurations: x ∈ pair_vars. It is utilized to directly declare the tuples that are valid and should be included in the solution space.

julia
@constraint(model, X in Supports(; pair_vars))

source

Base.copy Method
julia
Base.copy(set::MOIError) = begin

DOCSTRING

source

Base.copy Method
julia
Base.copy(set::MOIIntention)

Copy an intention set.

Arguments

  • set::MOIIntention: The intention set to be copied.

Returns

  • MOIIntention: A copy of the intention set.

source

Base.copy Method
julia
Base.copy(set::DiscreteSet)

Copy a discrete set.

Arguments

  • set::DiscreteSet: The discrete set to be copied.

Returns

  • DiscreteSet: A copy of the discrete set.

source

Base.copy Method
julia
Base.copy(op::F) where {F <: Function}

Copy a function.

Arguments

  • op::F: The function to be copied.

Returns

  • F: The copied function.

source

Base.copy Method
julia
Base.copy(::Nothing)

Copy a Nothing value.

Arguments

  • ::Nothing: The Nothing value to be copied.

Returns

  • Nothing: The copied Nothing value.

source

JuMP.build_variable Method
julia
JuMP.build_variable(::Function, info::JuMP.VariableInfo, set::T) where T <: MOI.AbstractScalarSet

Create a variable constrained by a scalar set.

Arguments

  • info::JuMP.VariableInfo: Information about the variable to be created.

  • set::T where T <: MOI.AbstractScalarSet: The set defining the constraints on the variable.

Returns

  • JuMP.VariableConstrainedOnCreation: A variable constrained by the specified set.

source

JuMP.moi_set Method
julia
JuMP.moi_set(set::Intention, dim::Int) -> MOIIntention

Convert an Intention set to a MOIIntention set.

Arguments

  • set::Intention: The intention set to be converted.

  • dim::Int: The dimension of the vector set.

Returns

  • MOIIntention: The converted MOIIntention set.

source

JuMP.moi_set Method
julia
JuMP.moi_set(set::Predicate, dim::Int) -> MOIIntention

Convert a Predicate set to a MOIIntention set.

Arguments

  • set::Predicate: The predicate set to be converted.

  • dim::Int: The dimension of the vector set.

Returns

  • MOIIntention: The converted MOIIntention set.

source

MathOptInterface.add_constraint Method
julia
MOI.add_constraint(optimizer::Optimizer, vars::MOI.VectorOfVariables, set::MOIError)

DOCSTRING

Arguments:

  • optimizer: DESCRIPTION

  • vars: DESCRIPTION

  • set: DESCRIPTION

source

MathOptInterface.add_constraint Method
julia
MOI.add_constraint(optimizer::Optimizer, vars::MOI.VectorOfVariables, set::MOIIntention{F}) where {F <: Function}

Add an intention constraint to the optimizer.

Arguments

  • optimizer::Optimizer: The optimizer instance.

  • vars::MOI.VectorOfVariables: The variables for the constraint.

  • set::MOIIntention{F}: The intention set defining the constraint.

Returns

  • CI{VOV, MOIIntention{F}}: The constraint index.

source

MathOptInterface.add_constraint Method
julia
MOI.add_constraint(optimizer::Optimizer, v::VI, set::DiscreteSet{T}) where T <: Number

DOCSTRING

Arguments:

  • optimizer: DESCRIPTION

  • v: DESCRIPTION

  • set: DESCRIPTION

source

MathOptInterface.add_variable Method
julia
MOI.add_variable(model::Optimizer) = begin

DOCSTRING

source

MathOptInterface.copy_to Method
julia
MOI.copy_to(model::Optimizer, src::MOI.ModelLike)

Copy the source model to the optimizer.

Arguments

  • model::Optimizer: The optimizer instance.

  • src::MOI.ModelLike: The source model to be copied.

Returns

  • Nothing

source

MathOptInterface.empty! Method
julia
MOI.empty!(opt)

Empty the optimizer.

Arguments

  • opt::Optimizer: The optimizer instance.

Returns

  • Nothing

source

MathOptInterface.get Method
julia
MOI.get(::Optimizer, ::MOI.SolverName)

Get the name of the solver.

Arguments

  • ::Optimizer: The optimizer instance.

Returns

  • String: The name of the solver.

source

MathOptInterface.get Method
julia
Moi.get(::Optimizer, ::MOI.SolverVersion)

Get the version of the solver, here LocalSearchSolvers.jl.

source

MathOptInterface.is_empty Method
julia
MOI.is_empty(model::Optimizer)

Check if the model is empty.

Arguments

  • model::Optimizer: The optimizer instance.

Returns

  • Bool: True if the model is empty, false otherwise.

source

MathOptInterface.is_valid Method
julia
MOI.is_valid(optimizer::Optimizer, index::CI{VI, MOI.Integer})

Check if an index is valid for the optimizer.

Arguments

  • optimizer::Optimizer: The optimizer instance.

  • index::CI{VI, MOI.Integer}: The index to be checked.

Returns

  • Bool: True if the index is valid, false otherwise.

source

MathOptInterface.optimize! Method
julia
MOI.optimize!(model::Optimizer)

Optimize the model using the optimizer.

Arguments

  • model::Optimizer: The optimizer instance.

Returns

  • Nothing

source

MathOptInterface.set Function
julia
MOI.set(::Optimizer, ::MOI.Silent, bool = true)

Set the verbosity of the solver.

Arguments

  • ::Optimizer: The optimizer instance.

  • ::MOI.Silent: The silent option for the solver.

  • bool::Bool: Whether to set the solver to silent mode.

Returns

  • Nothing

source

MathOptInterface.set Method
julia
MOI.set(model::Optimizer, p::MOI.RawOptimizerAttribute, value)

Set a RawOptimizerAttribute to value

source

MathOptInterface.set Method
julia
MOI.set(model::Optimizer, ::MOI.TimeLimitSec, value::Union{Nothing,Float64})

Set the time limit

source

MathOptInterface.supports_constraint Method
julia
MOI.supports_constraint(::Optimizer, ::Type{VOV}, ::Type{MOIError}) = begin

DOCSTRING

Arguments:

  • ``: DESCRIPTION

  • ``: DESCRIPTION

  • ``: DESCRIPTION

source

MathOptInterface.supports_constraint Method
julia
MOI.supports_constraint(::Optimizer, ::Type{VOV}, ::Type{MOIIntention{F}}) where {F <: Function}

Check if the optimizer supports a given intention constraint.

Arguments

  • ::Optimizer: The optimizer instance.

  • ::Type{VOV}: The type of the variable.

  • ::Type{MOIIntention{F}}: The type of the intention.

Returns

  • Bool: True if the optimizer supports the constraint, false otherwise.

source

MathOptInterface.supports_incremental_interface Method
julia
MOI.supports_incremental_interface(::Optimizer)

Check if the optimizer supports incremental interface.

Arguments

  • ::Optimizer: The optimizer instance.

Returns

  • Bool: True if the optimizer supports incremental interface, false otherwise.

source

- + \ No newline at end of file diff --git a/dev/solvers/40_constraint_explorer.html b/dev/solvers/40_constraint_explorer.html index a95ac83..7897bdc 100644 --- a/dev/solvers/40_constraint_explorer.html +++ b/dev/solvers/40_constraint_explorer.html @@ -8,17 +8,17 @@ - + - + -
Skip to content

ConstraintExplorer.jl

Documentation for ConstraintExplorer.jl.

- +
Skip to content

ConstraintExplorer.jl

Documentation for ConstraintExplorer.jl.

+ \ No newline at end of file diff --git a/dev/solvers/50_local_search_solvers.html b/dev/solvers/50_local_search_solvers.html index d6db394..09ef7aa 100644 --- a/dev/solvers/50_local_search_solvers.html +++ b/dev/solvers/50_local_search_solvers.html @@ -8,16 +8,16 @@ - + - + -
Skip to content

LocalSearchSolvers.jl

Documentation for LocalSearchSolvers.jl.

LocalSearchSolvers.AbstractSolver Type
julia
AbstractSolver

Abstract type to encapsulate the different solver types such as Solver or _SubSolver.

source

LocalSearchSolvers.Constraint Type
julia
Constraint{F <: Function}

Structure to store an error function and the variables it constrains.

source

LocalSearchSolvers.LeadSolver Type
julia
LeadSolver <: MetaSolver

Solver managed remotely by a MainSolver. Can manage its own set of local sub solvers.

source

LocalSearchSolvers.MainSolver Type
julia
MainSolver <: AbstractSolver

Main solver. Handle the solving of a model, and optional multithreaded and/or distributed subsolvers.

Arguments:

  • model::Model: A formal description of the targeted problem

  • state::_State: An internal state to store the info necessary to a solving run

  • options::Options: User options for this solver

  • subs::Vector{_SubSolver}: Optional subsolvers

source

LocalSearchSolvers.MetaSolver Type

Abstract type to encapsulate all solver types that manages other solvers.

source

LocalSearchSolvers.Objective Type
julia
Objective{F <: Function}

A structure to handle objectives in a solver. `struct Objective{F <: Function} name::String f::F end``

source

LocalSearchSolvers.Objective Method
julia
Objective(F, o::Objective{F2}) where {F2 <: Function}

Constructor used in specializing a solver. Should never be called externally.

source

LocalSearchSolvers.Options Type
julia
Options()

Arguments:

  • dynamic::Bool: is the model dynamic?

  • iteration::Union{Int, Float64}: limit on the number of iterations

  • print_level::Symbol: verbosity to choose among :silent, :minimal, :partial, :verbose

  • solutions::Int: number of solutions to return

  • specialize::Bool: should the types of the model be specialized or not. Usually yes for static problems. For dynamic in depends if the user intend to introduce new types. The specialized model is about 10% faster.

  • tabu_time::Int: DESCRIPTION

  • tabu_local::Int: DESCRIPTION

  • tabu_delta::Float64: DESCRIPTION

  • threads::Int: Number of threads to use

  • time_limit::Float64: time limit in seconds

  • `function Options(; dynamic = false, iteration = 10000, print_level = :minimal, solutions = 1, specialize = !dynamic, tabu_time = 0, tabu_local = 0, tabu_delta = 0.0, threads = typemax(0), time_limit = Inf)

julia
# Setting options in JuMP syntax: print_level, time_limit, iteration
+    
Skip to content

LocalSearchSolvers.jl

Documentation for LocalSearchSolvers.jl.

LocalSearchSolvers.AbstractSolver Type
julia
AbstractSolver

Abstract type to encapsulate the different solver types such as Solver or _SubSolver.

source

LocalSearchSolvers.Constraint Type
julia
Constraint{F <: Function}

Structure to store an error function and the variables it constrains.

source

LocalSearchSolvers.LeadSolver Type
julia
LeadSolver <: MetaSolver

Solver managed remotely by a MainSolver. Can manage its own set of local sub solvers.

source

LocalSearchSolvers.MainSolver Type
julia
MainSolver <: AbstractSolver

Main solver. Handle the solving of a model, and optional multithreaded and/or distributed subsolvers.

Arguments:

  • model::Model: A formal description of the targeted problem

  • state::_State: An internal state to store the info necessary to a solving run

  • options::Options: User options for this solver

  • subs::Vector{_SubSolver}: Optional subsolvers

source

LocalSearchSolvers.MetaSolver Type

Abstract type to encapsulate all solver types that manages other solvers.

source

LocalSearchSolvers.Objective Type
julia
Objective{F <: Function}

A structure to handle objectives in a solver. `struct Objective{F <: Function} name::String f::F end``

source

LocalSearchSolvers.Objective Method
julia
Objective(F, o::Objective{F2}) where {F2 <: Function}

Constructor used in specializing a solver. Should never be called externally.

source

LocalSearchSolvers.Options Type
julia
Options()

Arguments:

  • dynamic::Bool: is the model dynamic?

  • iteration::Union{Int, Float64}: limit on the number of iterations

  • print_level::Symbol: verbosity to choose among :silent, :minimal, :partial, :verbose

  • solutions::Int: number of solutions to return

  • specialize::Bool: should the types of the model be specialized or not. Usually yes for static problems. For dynamic in depends if the user intend to introduce new types. The specialized model is about 10% faster.

  • tabu_time::Int: DESCRIPTION

  • tabu_local::Int: DESCRIPTION

  • tabu_delta::Float64: DESCRIPTION

  • threads::Int: Number of threads to use

  • time_limit::Float64: time limit in seconds

  • `function Options(; dynamic = false, iteration = 10000, print_level = :minimal, solutions = 1, specialize = !dynamic, tabu_time = 0, tabu_local = 0, tabu_delta = 0.0, threads = typemax(0), time_limit = Inf)

julia
# Setting options in JuMP syntax: print_level, time_limit, iteration
 model = Model(CBLS.Optimizer)
 set_optimizer_attribute(model, "iteration", 100)
 set_optimizer_attribute(model, "print_level", :verbose)
@@ -53,7 +53,7 @@
 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

- + \ No newline at end of file diff --git a/dev/solvers/80_meta_strategist.html b/dev/solvers/80_meta_strategist.html index 25dd3a4..3a0fae3 100644 --- a/dev/solvers/80_meta_strategist.html +++ b/dev/solvers/80_meta_strategist.html @@ -8,17 +8,17 @@ - + - + -
Skip to content

MetaStrategist.jl

Documentation for MetaStrategist.jl.

- +
Skip to content

MetaStrategist.jl

Documentation for MetaStrategist.jl.

+ \ No newline at end of file