package aima.gui.applications.search.csp;
import aima.core.agent.Action;
import aima.core.agent.Agent;
import aima.core.agent.EnvironmentState;
import aima.core.agent.Percept;
import aima.core.agent.impl.AbstractEnvironment;
import aima.core.search.csp.Assignment;
import aima.core.search.csp.CSP;
/**
* Simple environment which maintains a CSP and an assignment. The state
* is modified by executing {@link StateChangeAction}s.
* @author Ruediger Lunde
*/
public class CSPEnvironment extends AbstractEnvironment {
CSP csp;
Assignment assignment;
public void init(CSP csp) {
this.csp = csp;
assignment = null;
}
public CSP getCSP() {
return csp;
}
public Assignment getAssignment() {
return assignment;
}
/** Executes the provided action and returns null. */
@Override
public EnvironmentState executeAction(Agent agent, Action action) {
if (action instanceof StateChangeAction) {
StateChangeAction a = (StateChangeAction) action;
if (a.updateCSP())
csp = a.getCSP();
if (a.updateAssignment())
assignment = a.getAssignment();
if (agent == null)
updateEnvironmentViewsAgentActed(agent, action, null);
}
return null;
}
/** Returns null. */
@Override
public EnvironmentState getCurrentState() {
return null;
}
/** Returns null. */
@Override
public Percept getPerceptSeenBy(Agent anAgent) {
return null;
}
/** Action to modify the CSP environment state. */
public static class StateChangeAction implements Action {
private CSP csp;
private Assignment assignment;
/** Update the domains of the CSP. */
public StateChangeAction(CSP csp) {
this.csp = csp;
}
/** Update the current assignment. */
public StateChangeAction(Assignment assignment, CSP csp) {
this.csp = csp;
this.assignment = assignment;
}
public boolean updateCSP() {
return csp != null;
}
public CSP getCSP() {
return csp;
}
public boolean updateAssignment() {
return assignment != null;
}
public Assignment getAssignment() {
return assignment;
}
@Override
public boolean isNoOp() {
return false;
}
public String toString() {
return "State Change "
+ (updateAssignment() ? assignment : "(Domain Reduction)");
}
}
}