package aima.core.probability.domain; import java.util.Collections; import java.util.LinkedHashSet; import java.util.Set; /** * Artificial Intelligence A Modern Approach (3rd Edition): page 486. * * As in CSPs, domains can be sets of arbitrary tokens; we might choose the * domain of <i>Age</i> to be {<i>juvenile,teen,adult</i>} and the domain of * <i>Weather</i> might be {<i>sunny,rain,cloudy,snow</i>}. * * @author Ciaran O'Reilly */ public class ArbitraryTokenDomain extends AbstractFiniteDomain { private Set<Object> possibleValues = null; private boolean ordered = false; public ArbitraryTokenDomain(Object... pValues) { this(false, pValues); } public ArbitraryTokenDomain(boolean ordered, Object... pValues) { this.ordered = ordered; // Keep consistent order possibleValues = new LinkedHashSet<Object>(); for (Object v : pValues) { possibleValues.add(v); } // Ensure cannot be modified possibleValues = Collections.unmodifiableSet(possibleValues); indexPossibleValues(possibleValues); } // // START-Domain @Override public int size() { return possibleValues.size(); } @Override public boolean isOrdered() { return ordered; } // END-Domain // // // START-FiniteDomain @Override public Set<Object> getPossibleValues() { return possibleValues; } // END-finiteDomain // @Override public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof ArbitraryTokenDomain)) { return false; } ArbitraryTokenDomain other = (ArbitraryTokenDomain) o; return this.possibleValues.equals(other.possibleValues); } @Override public int hashCode() { return possibleValues.hashCode(); } }