module gmle.salsa.sum_of_squares; import gmle.salsa.framework.GradientDescent; import gmle.salsa.framework.GeneticSearch; import gmle.salsa.framework.Simplex; import gmle.salsa.framework.Evaluator; behavior SumOfSquares implements Evaluator { int parameter_length = 10; double[] constants; int local_length, min, max; void init_data(int rank, int max_rank) { min = (int) (parameter_length * (((double)rank)/((double)max_rank))); max = (int) (parameter_length * (((double)(rank+1.0))/((double)max_rank))); local_length = max-min; constants = new double[local_length]; for (int i = 0; i < local_length; i++) { constants[i] = Math.random() * 50.0; } } double[] evaluate(double[] parameters) { double[] sum = new double[1]; sum[0] = 0; for (int i = 0; i < local_length; i++) { sum[0] += constants[i] * parameters[min + i] * parameters[min + i]; } return sum; } double combine(double[][] values) { double sum = 0.0; for (int i = 0; i < values.length; i++) { sum += values[i][0]; } return sum; } void printUsage() { System.err.println("Error: invalid arguments."); System.err.println("\tusage: java gmle.salsa.sum_of_squares.SumOfSquares [theaters_file]"); System.err.println("\tsearch methods:"); System.err.println("\t\tgd\t- gradient descent"); System.err.println("\t\tcgd\t- conjugate gradient descent"); System.err.println("\t\thcgd\t- hessian conjugate gradient descent"); System.err.println("\t\tgs\t- genetic search"); System.err.println("\t\tsimplex\t- simplex"); System.exit(0); } void act(String[] arguments) { if (arguments.length != 1 && arguments.length != 2) { this.printUsage(); } else { String theaters_file = null; if (arguments.length == 2) theaters_file = arguments[1]; if (arguments[0].equals("cgd") || arguments[0].equals("gd") || arguments[0].equals("hcgd")) { double[] initial_parameters = new double[parameter_length]; double[] step_sizes = new double[parameter_length]; for (int i = 0; i < parameter_length; i++) { initial_parameters[i] = (Math.random() * 10) - 5.0; step_sizes[i] = 0.001; } GradientDescent gradient_descent = new GradientDescent(); token init_token = null; if (theaters_file == null) { init_token = gradient_descent<-init_data("gmle.salsa.sum_of_squares.SumOfSquares", new Integer(4)); } else { init_token = gradient_descent<-init_data("gmle.salsa.sum_of_squares.SumOfSquares", theaters_file); } init_token = gradient_descent<-set_evaluation_output("gd_evaluations") : waitfor(init_token); if (arguments[0].equals("gd")) { gradient_descent<-gradient_descent(initial_parameters, step_sizes) : waitfor(init_token); } else if (arguments[0].equals("cgd")) { gradient_descent<-conjugate_gradient_descent(initial_parameters, step_sizes) : waitfor(init_token); } else if (arguments[0].equals("hcgd")) { gradient_descent<-hessian_conjugate_gradient_descent(initial_parameters, step_sizes) : waitfor(init_token); } } else if (arguments[0].equals("simplex")) { double[][] simplex_parameters = new double[parameter_length+1][parameter_length]; for (int i = 0; i < simplex_parameters.length; i++) { for (int j = 0; j < simplex_parameters[i].length; j++) { if (i == j) simplex_parameters[i][j] = 10.0 * Math.random(); else simplex_parameters[i][j] = -10.0 * Math.random(); } } Simplex simplex = new Simplex(); token init_token = null; if (theaters_file == null) { init_token = simplex<-init_data("gmle.salsa.sum_of_squares.SumOfSquares", new Integer(4)); } else { init_token = simplex<-init_data("gmle.salsa.sum_of_squares.SumOfSquares", theaters_file); } simplex<-set_evaluation_output("simplex_evaluations") : waitfor(init_token) @ simplex<-simplex(simplex_parameters); } else if (arguments[0].equals("gs")) { double[] parameter_min = new double[parameter_length]; double[] parameter_max = new double[parameter_length]; for (int i = 0; i < parameter_length; i++) { parameter_min[i] = -5.0; parameter_max[i] = 5.0; } GeneticSearch genetic_search = new GeneticSearch(); token init_token = null; if (theaters_file == null) { init_token = genetic_search<-init_data("gmle.salsa.sum_of_squares.SumOfSquares", new Integer(4)); } else { init_token = genetic_search<-init_data("gmle.salsa.sum_of_squares.SumOfSquares", theaters_file); } genetic_search<-set_evaluation_output("genetic_evaluations") : waitfor(init_token) @ genetic_search<-genetic_search(parameter_min, parameter_max); } else { this.printUsage(); } } } }