Skip to content

consys-solver is a tool to find feasible model assignments for consys constraint systems.

License

Notifications You must be signed in to change notification settings

FireboltCasters/consys-solver

Repository files navigation

consys-solver - find feasible model assignments

npm package MIT last commit downloads week downloads total size dependencies

Npm publish Build status Quality Gate Bugs Coverage Code Smells Duplicated Lines (%) Maintainability Rating Reliability Rating Security Rating Technical Debt Vulnerabilities

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

Contributors