package aima.core.search.csp;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Hashtable;
import java.util.List;
/**
* An assignment assigns values to some or all variables of a CSP.
*
* @author Ruediger Lunde
*/
public class Assignment<VAR extends Variable, VAL> {
/**
* Contains all assigned variables. Positions reflect the the order in which
* the variables were assigned to values.
*/
private List<VAR> variables;
/**
* Maps variables to their assigned values.
*/
private Hashtable<VAR, VAL> variableToValue;
public Assignment() {
variables = new ArrayList<>();
variableToValue = new Hashtable<>();
}
public List<VAR> getVariables() {
return Collections.unmodifiableList(variables);
}
public VAL getValue(VAR var) {
return variableToValue.get(var);
}
public void add(VAR var, VAL value) {
if (variableToValue.put(var, value) == null)
variables.add(var);
}
public void remove(VAR var) {
if (contains(var)) {
variableToValue.remove(var);
variables.remove(var);
}
}
public boolean contains(VAR var) {
return variableToValue.get(var) != null;
}
/**
* Returns true if this assignment does not violate any constraints of
* <code>constraints</code>.
*/
public boolean isConsistent(List<Constraint<VAR, VAL>> constraints) {
for (Constraint<VAR, VAL> cons : constraints)
if (!cons.isSatisfiedWith(this))
return false;
return true;
}
/**
* Returns true if this assignment assigns values to every variable of
* <code>vars</code>.
*/
public boolean isComplete(List<VAR> vars) {
for (VAR var : vars) {
if (!contains(var))
return false;
}
return true;
}
/**
* Returns true if this assignment is consistent as well as complete with
* respect to the given CSP.
*/
public boolean isSolution(CSP<VAR, VAL> csp) {
return isConsistent(csp.getConstraints())
&& isComplete(csp.getVariables());
}
public Assignment<VAR, VAL> copy() {
Assignment<VAR, VAL> copy = new Assignment<>();
for (VAR var : variables) {
copy.add(var, variableToValue.get(var));
}
return copy;
}
@Override
public String toString() {
boolean comma = false;
StringBuilder result = new StringBuilder("{");
for (VAR var : variables) {
if (comma)
result.append(", ");
result.append(var).append("=").append(variableToValue.get(var));
comma = true;
}
result.append("}");
return result.toString();
}
}