consys-solver - find feasible model assignments
consys-solver is a tool to find feasible model assignments for consys constraint systems.
- Easy to integrate: This solver acts as a decorator, it just requires an instance of an existing constraint system to work.
- Preferred values: Assign weights to domain values to increase the likelyhood of a solution with those values.
- Configurable: In order to optimize the search process, the solver can be configured to get the best results.
The implementation is based on a modified min-conflicts heuristic, where variables are not chosen randomly, but with a weighted probability determined by the number of occurrences in the constraint set. In addition, a preference factor is considered when calculating the score of a model, which allows the user to prefer certain values of a domain.
Installation
consys-solver is distributed via npm, it can be installed using the following command:
npm install consys-solver
Quick start
Once installed, a solver instance can be instantiated for an existing constraint system. Here is an example:
import {ConstraintSystem} from 'consys';
import {Solver, Set, Range} from 'consys-solver';
type Person = {name: string; age: number};
// Create a simple constraint system for a Person model
const personConstraints = new ConstraintSystem<Person, {}>();
personConstraints.addFunction('LENGTH', (str: string) => {
return str.length;
});
personConstraints.addConstraints([
{constraint: 'ALWAYS: LENGTH($name) < 6'},
{constraint: 'ALWAYS: $age > 21 && $age < 42'},
]);
// Now, we can create a solver instance
const solver = new Solver(personConstraints);
let names = ['Mike', 'Peter', 'Lara', 'Isabelle'];
let personDomains = {
// A set with higher preference for long names
name: new Set(names, (name: string) => {
return name.length;
}),
// Number range with preference for higher age
age: new Range(0, 100, 1, (age: number) => {
return age / 10;
}),
};
// Finally, search for one solution
let solution = solver.find(1, personDomains, {});
console.log('Solution: ', solution);
Output:
>> Solution: [ { name: 'Peter', age: 41 } ]
Contributors
The FireboltCasters