package edu.neu.ccs.evergreen.visitor; import java.util.Date; import java.util.LinkedList; import org.apache.log4j.Logger; import edu.neu.ccs.demeter.dj.Visitor; import edu.neu.ccs.evergreen.demeterj.Constraint; import edu.neu.ccs.evergreen.demeterj.Variable; import edu.neu.ccs.evergreen.model.ConstraintFactory; import edu.neu.ccs.evergreen.model.Variables; import edu.neu.ccs.evergreen.model.Weights; /** * Convert the generic parsed problem into custom objects. */ public class Preprocessor extends Visitor { private static final Logger LOGGER = Logger.getLogger(Preprocessor.class); /** * Variables in the problem. */ public Variables variables; /** * Weights of the problem. */ public Weights weights = new Weights(); /** * Number of constraints in the problem. */ public int constraintCount; private LinkedList constraintVariables; private int maxVariable; /** * Create a new pre preprocessor. * * @param maxVariable * Maximum variable */ public Preprocessor(int maxVariable) { this.maxVariable = maxVariable; variables = new Variables(maxVariable); } /** * @see edu.neu.ccs.demeter.dj.Visitor#start() */ @Override public void start() { LOGGER.info("Starting preprocessor at: " + new Date()); constraintCount = 0; super.start(); } /** * Run before each constraint in the problem. * * @param constraint * Constraint */ public void before(Constraint constraint) { constraintVariables = new LinkedList(); } /** * Make sure the variable is valid. * * @param variable * Variable to check */ private void checkVariable(int variable) { if (variable == 0) { throw new IllegalArgumentException("Variable can not equal to 0"); } if (variable > maxVariable) { throw new IllegalArgumentException( "Variable can not be greater than " + maxVariable); } } /** * Run before each variable. * * @param variable * Variable */ public void before(Variable variable) { checkVariable(variable.get_variable()); constraintVariables.addFirst(variable.get_variable()); } /** * Run after each constraint. * * @param constraint * Constraint */ public void after(Constraint constraint) { if (constraintVariables.size() == 0) { throw new IllegalArgumentException("No variables given"); } int createVariables[] = new int[constraintVariables.size()]; int i = 0; for (Integer variable : constraintVariables) { createVariables[i] = variable; i++; } int weight = 1; if (constraint.get_weight() != null) { weight = constraint.getWeight(); } addConstraint(constraint.getRelationNumber(), createVariables, weight); } /** * Add a constraint to the system. * * @param relationNumber * Relation number for the constraint * @param createVariables * Variables * @param weight * Weight */ private void addConstraint(int relationNumber, int createVariables[], int weight) { edu.neu.ccs.evergreen.model.Constraint constraint = ConstraintFactory .createConstraint(constraintCount, relationNumber, createVariables, weight); variables.addConstraint(constraint); weights.addWeight(constraint.getRelationNumber(), weight); constraintCount++; if (constraintCount % 1000 == 0) { LOGGER.debug("Processed " + constraintCount); } } /** * @see edu.neu.ccs.demeter.dj.Visitor#finish() */ @Override public void finish() { LOGGER.info("Preprocessor finished at: " + new Date()); super.finish(); } }