package edu.neu.ccs.evergreen; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import org.apache.log4j.PropertyConfigurator; import edu.neu.ccs.demeter.dj.ClassGraph; import edu.neu.ccs.evergreen.demeterj.CSP; import edu.neu.ccs.evergreen.demeterj.ParseException; import edu.neu.ccs.evergreen.state.NextState; import edu.neu.ccs.evergreen.state.NextStateFactory; import edu.neu.ccs.evergreen.visitor.Preprocessor; /** * Wrapper class for solving CSP problems. */ public class CSPSolver { /** * Class graph in use. */ public static ClassGraph CG = new ClassGraph( "edu.neu.ccs.evergreen.demeterj", true, false); static { PropertyConfigurator.configure(CSPSolver.class.getClassLoader().getResource("log4j.config")); } /** * The command line entry point. * * @param args * Command line arguments */ public static void main(String[] args) { if ((args == null) || (args.length < 2)) { System.out.println("Usage: CSPSolver "); System.out.println("Next State Options:"); System.out.println("appmean"); System.out.println("fair [seed = 1]"); System.out.println("maxbias [refresh % = 0.5] [seed = 1]"); } else { try { String optionalArgs[] = new String[args.length - 2]; System.arraycopy(args, 2, optionalArgs, 0, optionalArgs.length); NextState nextState = NextStateFactory.createNextState(args[1], optionalArgs); solve(new BufferedInputStream(new FileInputStream(args[0])), nextState); } catch (FileNotFoundException e) { throw new RuntimeException(e); } } } /** * Solve the given input string. * * @param input * CSP to solve * @param nextState Determine next state of the system */ public static void solve(String input, NextState nextState) { solve(CSP.parse(input), nextState); } /** * Solve the given input stream. * * @param input * CSP to solve * @param nextState Determine next state of the system */ public static void solve(InputStream input, NextState nextState) { try { solve(CSP.parse(input), nextState); } catch (ParseException e) { throw new RuntimeException(e); } } /** * Solve the given CSP. * * @param csp * CSP to solve * @param nextState Determine next state of the system */ private static void solve(CSP csp, NextState nextState) { Preprocessor preprocessor = new Preprocessor(csp.getMaxVariable()); CSPSolver.CG .traverse( csp, "from edu.neu.ccs.evergreen.demeterj.CSP to edu.neu.ccs.evergreen.demeterj.Variable", preprocessor); if (csp.getConstraintCount() != preprocessor.constraintCount) { throw new IllegalArgumentException("Wrong number of constraints"); } Solver solver = new Solver(preprocessor.weights, preprocessor.variables, preprocessor.constraintCount, nextState); System.exit(solver.solve()); } }