001 /*
002 * Copyright 2011 Christian Kumpe http://kumpe.de/christian/java
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package de.kumpe.hadooptimizer.jeneva;
017
018 import org.apache.hadoop.conf.Configurable;
019
020 import de.kumpe.hadooptimizer.EaOptimizerConfiguration;
021 import de.kumpe.hadooptimizer.Optimizer;
022 import de.kumpe.hadooptimizer.examples.OptimizerExample;
023 import de.kumpe.hadooptimizer.examples.neurons.InputValue;
024 import de.kumpe.hadooptimizer.examples.neurons.Neuron;
025 import de.kumpe.hadooptimizer.examples.neurons.NeuronalNetEvaluator;
026 import de.kumpe.hadooptimizer.examples.neurons.NeuronalNetEvaluator.Sample;
027 import de.kumpe.hadooptimizer.impl.GaussianMutator;
028 import de.kumpe.hadooptimizer.impl.MemoryPopulationWriter;
029
030 public class JenevaXorExample extends OptimizerExample<double[]> {
031 @Override
032 public EaOptimizerConfiguration<double[]> createEaOptimizerConfiguration() {
033 final InputValue[] inputValues = new InputValue[2];
034 final Neuron.Input[] inputs = new Neuron.Input[7];
035 final Neuron output = new Neuron(1, 10);
036 final Sample[] samples = new Sample[4];
037
038 inputValues[0] = new InputValue();
039 inputValues[1] = new InputValue();
040
041 final Neuron hidden1 = new Neuron(1, 10);
042 final Neuron hidden2 = new Neuron(2, 10);
043 final Neuron hidden3 = new Neuron(1, 10);
044
045 inputs[0] = hidden1.addInput(inputValues[0]);
046 inputs[1] = hidden2.addInput(inputValues[0]);
047 inputs[2] = hidden2.addInput(inputValues[1]);
048 inputs[3] = hidden3.addInput(inputValues[1]);
049
050 inputs[4] = output.addInput(hidden1);
051 inputs[5] = output.addInput(hidden2);
052 inputs[6] = output.addInput(hidden3);
053
054 samples[0] = new Sample(new double[] { 0, 0 }, 0);
055 samples[1] = new Sample(new double[] { 1, 0 }, 1);
056 samples[2] = new Sample(new double[] { 0, 1 }, 1);
057 samples[3] = new Sample(new double[] { 1, 1 }, 0);
058
059 final EaOptimizerConfiguration<double[]> conf = new EaOptimizerConfiguration<double[]>();
060 initConfiguration(conf, new double[7]);
061 conf.setMutator(new GaussianMutator());
062 final NeuronalNetEvaluator evaluator = new NeuronalNetEvaluator(
063 inputValues, inputs, output, samples);
064 conf.setEvaluator(evaluator);
065 addReporter(evaluator);
066 conf.setPopulationWriter(new MemoryPopulationWriter<double[]>());
067 return conf;
068 }
069
070 @Override
071 protected void execute() throws Exception {
072 final EaOptimizerConfiguration<double[]> configuration = createEaOptimizerConfiguration();
073 final Optimizer<?> optimizer = new EaJenevaOptimizer<double[]>(
074 configuration);
075
076 if (optimizer instanceof Configurable) {
077 ((Configurable) optimizer).setConf(getConf());
078 }
079
080 optimizer.optimize();
081
082 final double[] winner = ((MemoryPopulationWriter<double[]>) configuration
083 .getPopulationWriter()).getWinner();
084 ((NeuronalNetEvaluator) configuration.getEvaluator()).print(winner);
085 }
086
087 @Override
088 protected String getVersionInfo() {
089 return "$Id: Sleep.java 3890 2011-04-20 14:58:14Z baumbart $";
090 }
091
092 public static void main(final String[] args) throws Exception {
093 new JenevaXorExample().run(args);
094 }
095 }