package edu.neu.ccs.evergreen.state; import org.apache.log4j.Logger; import edu.neu.ccs.evergreen.exception.ContradictionException; import edu.neu.ccs.evergreen.model.Assignment; import edu.neu.ccs.evergreen.model.Assignments; import edu.neu.ccs.evergreen.model.Constraint; import edu.neu.ccs.evergreen.model.State; /** * Uses the app mean algorithm to order the variables and values. */ public class AppMeanNextState implements NextState { private static final Logger LOGGER = Logger.getLogger(AppMeanNextState.class); /** * @see edu.neu.ccs.evergreen.state.NextState#getNextState(edu.neu.ccs.evergreen.model.State, * int, edu.neu.ccs.evergreen.model.Assignments) */ public State getNextState(State state, int maxOriginalVariable, Assignments bestAssignments) { State nextState = null; double best = Double.MIN_VALUE; // TODO maybe track set of unavailable variables for (int variable = 1; variable <= maxOriginalVariable; variable++) { if (state.unassigned(variable)) { State testState = null; Constraint errorConstraint = null; for (int value = 0; value < 2; value++) { try { LOGGER.trace("Trying " + variable + "=" + value); testState = state.clone(); testState .addAssignment(new Assignment(variable, value)); double test = testState.appMean(); if (test > best) { nextState = testState; best = test; } } catch (ContradictionException contradictionException) { LOGGER.trace(variable + "=" + value + " caused contradiction"); errorConstraint = contradictionException .getConstraint(); throw new ContradictionException("Variable " + variable + " leads to a contradiction", testState, errorConstraint); } } } } if (nextState == null) { LOGGER .debug("Every possible decision variable leads to a contradiction"); throw new ContradictionException( "Every possible decision variable leads to a contradiction"); } LOGGER.debug("getNextState picked " + nextState.getLastDecision()); return nextState; } /** * @see edu.neu.ccs.evergreen.state.NextState#initBestAssignments(edu.neu.ccs.evergreen.model.State) */ public Assignments initBestAssignments(State state) { // Ignore return null; } /** * @see edu.neu.ccs.evergreen.state.NextState#updateBestAssignments(edu.neu.ccs.evergreen.model.State, edu.neu.ccs.evergreen.model.Assignments) */ public Assignments updateBestAssignments(State state, Assignments bestAssignments) { // Ignore return null; } }