package aima.core.search.csp; import aima.core.search.framework.Metrics; /** * Interface which allows interested clients to register at a CSP solver * and follow its progress step by step. * * @author Ruediger Lunde */ public interface CspListener<VAR extends Variable, VAL> { /** * Informs about changed assignments. * * @param csp a CSP, possibly changed by an inference step. * @param assignment a new assignment or null if the last processing step was an inference step. */ void stateChanged(CSP<VAR, VAL> csp, Assignment<VAR, VAL> assignment); /** * A simple CSP listener implementation which counts assignment changes and changes caused by * inference steps and provides some metrics. * @author Ruediger Lunde */ class StepCounter<VAR extends Variable, VAL> implements CspListener<VAR, VAL> { private int assignmentCount = 0; private int inferenceCount = 0; @Override public void stateChanged(CSP<VAR, VAL> csp, Assignment<VAR, VAL> assignment) { if (assignment != null) ++assignmentCount; else ++inferenceCount; } public void reset() { assignmentCount = 0; inferenceCount = 0; } public Metrics getResults() { Metrics result = new Metrics(); result.set("assignmentCount", assignmentCount); if (inferenceCount != 0) result.set("inferenceCount", inferenceCount); return result; } } }