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    }