% Note: glossary entries for terms that are acronyms should be prefixed 'gls-'
% so the non-prefixed reference is used to refer to the acronym

% \newglossaryentry{gls-api}{
%   name={API},
%   description={An Application Programming Interface (API) is a particular set
%     of rules and specifications that a software program can follow to access and
%     make use of the services and resources provided by another particular software
%     program that implements that API},
% }

\newglossaryentry{aggregation}{
  name={aggregation},
  description={},
}

\newglossaryentry{gls-ampl}{
  name={AMPL:\ A Mathematical Programming Language},
  description={},
}

\newglossaryentry{gls-ast}{
  name={Abstract Syntax Tree},
  description={},
}

\newglossaryentry{annotation}{
  name={annotation},
  description={},
}

\newglossaryentry{array}{
  name={array},
  description={},
}

\newglossaryentry{backtrack}{
  name={backtrack},
  description={},
}

\newglossaryentry{bnb}{
  name={branch and bound},
  description={},
}

\newglossaryentry{bounds-con}{
  name={bounds consistent},
  description={},
}

\newglossaryentry{gls-cbls}{
  name={constraint-based local search},
  description={},
}

\newglossaryentry{chuffed}{
  name={Chuffed},
  description={},
}

\newglossaryentry{comprehension}{
  name={comprehension},
  description={},
}

\newglossaryentry{conditional}{
  name={conditional},
  description={},
}

\newglossaryentry{constraint}{
  name={constraint},
  description={A formalised rule of a problem. Constraints are generally expressed in term of Boolean logic},
}

\newglossaryentry{cml}{
  name={constraint modelling language},
  description={
		A constraint modelling language is a computer language used to define \glspl{model}.
		Low-level constraint modelling languages allow modellers to define \glspl{model} in terms of \gls{native} \glspl{constraint} and \gls{variable} types.
		To create a \gls{slv-mod} the language merely assigns the \glspl{parameter}, (almost) no \gls{rewriting} is required.
		In contrast, high-level constraint modelling languages provide \glspl{global}, allowing modellers to reason at a level different from the targeted \gls{solver}
	},
}

\newglossaryentry{constraint-store}{
  name={constraint store},
  description={},
}

\newglossaryentry{cplex}{
  name={CPLEX},
  description={},
}

\newglossaryentry{gls-chr}{
  name={constraint handling rules},
  description={},
}

\newglossaryentry{gls-clp}{
  name={constraint logic programming},
  description={},
}

\newglossaryentry{gls-cp}{
  name={constraint programming},
  description={},
}

\newglossaryentry{gls-cse}{
  name={common subexpression elimination},
  description={},
}

\newglossaryentry{confluence}{
  name={confluence},
  description={},
}

\newglossaryentry{gls-csp}{
  name={constraint satisfaction problem},
  description={},
}

\newglossaryentry{gls-cop}{
  name={constraint optimisation problem},
  description={},
}

\newglossaryentry{cvar}{
  name={control variable},
  description={
		A control variable is a special form of an \gls{ivar} where the \gls{variable} represent the result of a \gls{reification}
	},
}

\newglossaryentry{dec-prb}{
  name={decision problem},
	description={
		A problem which can be defined as making a set of decisions under a certain set of rules.
		Decisions problems can be formalised as \glspl{model}.
	},
}

\newglossaryentry{decomp}{
  name={decomposition},
	description={
		A decomposition formulates a \gls{constraint} in terms of other \glspl{constraint} in order to reach \gls{native} \glspl{constraint}.
		Note that the new \glspl{constraint} might represent the same decisions using a different \glspl{variable}, possibly of different types
	},
}

\newglossaryentry{del-rew}{
  name={delayed rewriting},
  description={},
}

\newglossaryentry{domain}{
  name={domain},
  description={A domain is a set of value that a \gls{variable} can take without violating any \glspl{constraint} in the problem},
}

\newglossaryentry{domain-con}{
  name={domain consistent},
  description={},
}

\newglossaryentry{essence}{
  name={Essence},
  description={},
}

\newglossaryentry{eqsat}{
  name={equisatisfiable},
  description={Two \glspl{model} are equisatisfiable when a bijective function can be defined to map the \glspl{sol} of one \gls{model} onto the \glspl{sol} of the other.},
}

\newglossaryentry{fixed}{
  name={fixed},
  description={A \gls{variable} is said to be fixed when there is only a single possible value that it can take},
}

\newglossaryentry{fixpoint}{
  name={fix-point},
  description={},
}

\newglossaryentry{flatzinc}{
  name={Flat\-Zinc},
  description={},
}

\newglossaryentry{gecode}{
  name={Gecode},
  description={},
}

\newglossaryentry{gls-gbac}{
  name={Generalised Balanced Academic Curriculum},
  description={},
}

\newglossaryentry{generator}{
  name={generator},
  description={},
}

\newglossaryentry{git}{
  name={Git},
  description={},
}

\newglossaryentry{global}{
  name={global constraint},
  description={
		A global constraint is a common \gls{constraint} pattern.
		These patterns can generally span any number of \glspl{variable}.
		For example, the well-known global constraint \( \textsc{All\_Different}(\ldots) \) requires all its arguments to take a different value.
		Global constraints are usually not \gls{native} to a \gls{solver}.
		Instead, the \gls{rewriting} process can enforce the global constraint using a \gls{decomp}
	},
}

\newglossaryentry{gurobi}{
  name={Gurobi},
  description={},
}

\newglossaryentry{half-reif}{
  name={half reification},
  description={},
}

\newglossaryentry{indicator-var}{
  name={indicator variable},
  description={},
}

\newglossaryentry{ivar}{
  name={introduced variable},
  description={
		An introduced variable is a \gls{variable} that was created in the reformulation of a \gls{decomp}.
		New \gls{variable} are introduced either to redefine an existing \gls{variable} using a different type or to connect newly introduced \glspl{constraint}
	},
}

\newglossaryentry{interval}{
  name={interval},
  description={},
}

\newglossaryentry{instance}{
  name={instance},
  description={A \gls{model} with assignments for all its \glspl{parameter}},
}

\newglossaryentry{knapsack}{
  name={knapsack problem},
  description={},
}

\newglossaryentry{let}{
  name={let expression},
  description={},
}

\newglossaryentry{gls-lcg}{
  name={lazy clause generation},
  description={},
}

\newglossaryentry{gls-lns}{
  name={large neighbourhood search},
  description={},
}

\newglossaryentry{meta-search}{
  name={meta-search},
  plural={meta-searches},
  description={},
}

\newglossaryentry{microzinc}{
  name={Micro\-Zinc},
  description={},
}

\newglossaryentry{minisearch}{
  name={Mini\-Search},
  description={},
}

\newglossaryentry{model}{
  name={constraint model},
  description={
		A constraint model is a formalisation of a \gls{dec-prb} or an \gls{opt-prb}.
		It is defined in terms of formalised decision, \glspl{variable} of different kinds (\eg{} Boolean, integers, or even sets), and \glspl{constraint}, Boolean logic formulas which are forced to hold in any \gls{sol}, and, in case of an \gls{opt-prb}, an \gls{objective}.
		Any external data required to formulate the \glspl{constraint} is said to be the \glspl{parameter}.
		The combination of a constraint model and assignments for its \glspl{parameter} is said to be an \gls{instance} of the constraint model.
	},
}

\newglossaryentry{minizinc}{
  name={Mini\-Zinc},
  description={},
}

\newglossaryentry{normal-form}{
  name={normal form},
  description={},
}

\newglossaryentry{gls-mip}{
  name={Mixed Integer Programming},
  description={},
}

\newglossaryentry{native}{
  name={native},
  description={\glspl{constraint} and \gls{variable} types are said to be native to a \gls{solver} when they can be directly used as input for the \gls{solver}},
}

\newglossaryentry{nanozinc}{
  name={Nano\-Zinc},
  description={},
}

\newglossaryentry{neighbourhood}{
  name={neighbourhood},
  description={},
}

\newglossaryentry{objective}{
  name={objective function},
  description={An objective function is a function defined over the \glspl{variable} of a \gls{model} to assign a numeric value to the quality of the \gls{sol}.},
}

\newglossaryentry{operator}{
  name={operator},
  description={},
}

\newglossaryentry{gls-opl}{
  name={OPL:\ The optimisation modelling language},
  description={},
}

\newglossaryentry{opt-prb}{
  name={optimisation problem},
  description={
		A decision problem with an additional \gls{objective}.
		It can, likewise, be formalised as a \gls{model}.
		If the problem has multiple \glspl{sol}, then this function can be used to asses the quality on the \gls{sol}.
		For such a problem, an \gls{opt-sol} is a \gls{sol} with the highest quality
	},
}

\newglossaryentry{optional}{
  name={optional},
  description={},
}

\newglossaryentry{opt-sol}{
  name={optimal solution},
  description={An \gls{sol} in an \gls{opt-prb} for which it has been proven that no other \gls{sol} exist of higher quality},
}

\newglossaryentry{restart}{
  name={restart},
  description={},
}

\newglossaryentry{gls-sat}{
  name={boolean satisfiability},
  description={},
}

\newglossaryentry{search-heuristic}{
  name={search heuristic},
  description={},
}

\newglossaryentry{sol}{
  name={solution},
  description={A solution is an assignment for all \glspl{variable} in an \gls{instance} such that no \gls{constraint} is violated},
}

\newglossaryentry{solver}{
  name={solver},
  description={
		A solver is a computer program that is designed to solve certain types of \gls{dec-prb} and/or \gls{opt-prb}.
		Given a \gls{slv-mod}, in a specified format, a solver will (eventually) produce a \gls{sol} for it.
		When solving a \gls{opt-prb}, solvers often produce intermediate \glspl{sol} before producing the \gls{opt-sol}
	},
}

\newglossaryentry{parameter}{
  name={problem parameter},
  description={
		A problem parameter is immutable data used to define one or more \glspl{constraint}.
		Parameters are part of the external input for a \gls{model}.
		The combination of a \gls{model} and assignment for all its problem parameters is referred to as an \gls{instance} of a \gls{model}
	},
}

\newglossaryentry{propagation}{
  name={constraint propagation},
  description={},
}

\newglossaryentry{propagator}{
  name={propagator},
  description={},
}

\newglossaryentry{qcp-max}{
  name={QCP-max},
  description={},
}

\newglossaryentry{reification}{
  name={reification},
  description={A reification is a special form of a \gls{constraint} where, instead of the \gls{constraint} being enforced in the \glspl{sol}, it enforces that a \gls{cvar} represents whether the \gls{constraint} holds or not},
}

\newglossaryentry{rewriting}{
  name={rewriting},
  description={
		The process of transforming a \gls{model} \gls{instance} into an \gls{eqsat} \gls{slv-mod} is referred to as rewriting.
		This happens primarily through the application of \glspl{decomp}
	},
}

\newglossaryentry{satisfied}{
  name={satisfied},
  description={
		A \gls{constraint} is said to be satisfied when its logical expression is proven to hold.
		Furthermore, a \gls{dec-prb} is said to be satisfied when all its \glspl{constraint} are satisfied
	},
}

\newglossaryentry{slv-mod}{
  name={solver model},
  description={
		A solver model is a \gls{instance} of a \gls{model} where all \glspl{constraint} and \gls{variable} types are \gls{native} for the targeted \gls{solver}.
		\glspl{instance} of \glspl{model} containing non-native \glspl{constraint} and/or \gls{variable} types can be transformed into solver models through the process of \gls{rewriting}
	},
}

\newglossaryentry{scip}{
  name={SCIP},
  description={},
}

\newglossaryentry{term}{
  name={term},
  description={},
}

\newglossaryentry{termination}{
  name={termination},
  description={},
}

\newglossaryentry{trail}{
  name={trail},
  description={},
}

\newglossaryentry{gls-trs}{
  name={term rewriting system},
  description={},
}

\newglossaryentry{unify}{
  name={unify},
  description={},
}

\newglossaryentry{unsat}{
  name={unsatisfiable},
  description={A problem is unsatisfiable when there exists no possible for the problem},
}

\newglossaryentry{variable}{
  name={decision variable},
  description={
		A formalised decision that is yet to be made.
		When searching for a \gls{sol} a decision variable is said to have a certain \gls{domain}, which contains the values that the decision variable might still take.
		If at any point the \gls{domain} is reduced to a single value, then the decision variable is said to be \gls{fixed}.
		If, however, a decision variable has an empty \gls{domain}, then there is no value it can take that is consistent with the \glspl{constraint}
	},
}

\newglossaryentry{zinc}{
  name={Zinc},
  description={},
}
