You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by er...@apache.org on 2017/04/30 15:38:08 UTC
[2/3] commons-numbers git commit: Removed "Commons Math" code
examples.
http://git-wip-us.apache.org/repos/asf/commons-numbers/blob/a960a5ca/src/userguide/java/org/apache/commons/math4/userguide/LowDiscrepancyGeneratorComparison.java
----------------------------------------------------------------------
diff --git a/src/userguide/java/org/apache/commons/math4/userguide/LowDiscrepancyGeneratorComparison.java b/src/userguide/java/org/apache/commons/math4/userguide/LowDiscrepancyGeneratorComparison.java
deleted file mode 100644
index 3ec4be4..0000000
--- a/src/userguide/java/org/apache/commons/math4/userguide/LowDiscrepancyGeneratorComparison.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.complex.userguide;
-
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
-import java.awt.RenderingHints;
-import java.awt.geom.Rectangle2D;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.swing.JComponent;
-import javax.swing.JLabel;
-import javax.swing.JTextArea;
-
-import org.apache.commons.complex.geometry.euclidean.twod.Vector2D;
-import org.apache.commons.complex.random.HaltonSequenceGenerator;
-import org.apache.commons.complex.random.JDKRandomGenerator;
-import org.apache.commons.complex.random.MersenneTwister;
-import org.apache.commons.complex.random.RandomGenerator;
-import org.apache.commons.complex.random.RandomVectorGenerator;
-import org.apache.commons.complex.random.SobolSequenceGenerator;
-import org.apache.commons.complex.random.UncorrelatedRandomVectorGenerator;
-import org.apache.commons.complex.random.UniformRandomGenerator;
-import org.apache.commons.complex.util.FastMath;
-import org.apache.commons.complex.util.Pair;
-import org.apache.commons.complex.userguide.ExampleUtils.ExampleFrame;
-
-/**
- * Plots 2D samples drawn from various pseudo / quasi-random generators.
- */
-public class LowDiscrepancyGeneratorComparison {
-
- public static List<Vector2D> makeCircle(int samples, final RandomVectorGenerator generator) {
- List<Vector2D> points = new ArrayList<Vector2D>();
- for (double i = 0; i < samples; i++) {
- double[] vector = generator.nextVector();
- Vector2D point = new Vector2D(vector);
- points.add(point);
- }
-
- // normalize points first
- points = normalize(points);
-
- // now test if the sample is within the unit circle
- List<Vector2D> circlePoints = new ArrayList<Vector2D>();
- for (Vector2D p : points) {
- double criteria = FastMath.pow(p.getX(), 2) + FastMath.pow(p.getY(), 2);
- if (criteria < 1.0) {
- circlePoints.add(p);
- }
- }
-
- return circlePoints;
- }
-
- public static List<Vector2D> makeRandom(int samples, RandomVectorGenerator generator) {
- List<Vector2D> points = new ArrayList<Vector2D>();
- for (double i = 0; i < samples; i++) {
- double[] vector = generator.nextVector();
- Vector2D point = new Vector2D(vector);
- points.add(point);
- }
-
- return normalize(points);
- }
-
- public static List<Vector2D> normalize(final List<Vector2D> input) {
- // find the mininum and maximum x value in the dataset
- double minX = Double.MAX_VALUE;
- double maxX = Double.MIN_VALUE;
- for (Vector2D p : input) {
- minX = FastMath.min(minX, p.getX());
- maxX = FastMath.max(maxX, p.getX());
- }
-
- double minY, maxY;
-
- // use the minimum to detect if we either have input values in the range [0, 1] or [-sqrt(3), sqrt(3)]
- if (FastMath.abs(minX) < 0.1) {
- minX = minY = 0.0;
- maxX = maxY = 1.0;
- } else {
- minX = minY = -FastMath.sqrt(3);
- maxX = maxY = FastMath.sqrt(3);
- }
-
- double rangeX = maxX - minX;
- double rangeY = maxY - minY;
- List<Vector2D> points = new ArrayList<Vector2D>();
- for (Vector2D p : input) {
- double[] arr = p.toArray();
- // normalize to the range [-1, 1]
- arr[0] = (arr[0] - minX) / rangeX * 2 - 1;
- arr[1] = (arr[1] - minY) / rangeY * 2 - 1;
- points.add(new Vector2D(arr));
- }
- return points;
- }
-
- @SuppressWarnings("serial")
- public static class Display extends ExampleFrame {
-
- public Display() {
- setTitle("Commons-Math: Pseudo/Quasi-random examples");
- setSize(800, 800);
-
- setLayout(new GridBagLayout());
-
- int[] datasets = new int[] { 256, 1000, 2500, 1000 };
- List<Pair<String, RandomVectorGenerator>> generators = new ArrayList<Pair<String, RandomVectorGenerator>>();
-
- generators.add(new Pair<String, RandomVectorGenerator>("Uncorrelated\nUniform(JDK)",
- new UncorrelatedRandomVectorGenerator(2, new UniformRandomGenerator(new JDKRandomGenerator()))));
- generators.add(new Pair<String, RandomVectorGenerator>("Independent\nRandom(MT)", new RandomVectorGenerator() {
-
- RandomGenerator[] rngs = new RandomGenerator[] {
- new MersenneTwister(0),
- new MersenneTwister(1)
- };
-
- public double[] nextVector() {
- final double[] vector = new double[2];
- vector[0] = rngs[0].nextDouble();
- vector[1] = rngs[1].nextDouble();
- return vector;
- }
-
- }));
- generators.add(new Pair<String, RandomVectorGenerator>("HaltonSequence", new HaltonSequenceGenerator(2)));
- generators.add(new Pair<String, RandomVectorGenerator>("SobolSequence", new SobolSequenceGenerator(2)));
-
- GridBagConstraints c = new GridBagConstraints();
- c.fill = GridBagConstraints.VERTICAL;
- c.gridx = 1;
- c.gridy = 0;
- c.insets = new Insets(2, 2, 2, 2);
-
- for (Pair<String, RandomVectorGenerator> pair : generators) {
- JTextArea text = new JTextArea(pair.getFirst());
- text.setEditable(false);
- text.setOpaque(false);
- add(text, c);
- c.gridx++;
- }
- int saveY = ++c.gridy;
-
- c.gridx = 0;
- for (int type = 0; type < 4; type++) {
- JLabel text = new JLabel("n=" + String.valueOf(datasets[type]));
- text.setOpaque(false);
- add(text, c);
- c.gridy++;
- }
-
- c.gridy = saveY;
- for (int type = 0; type < 4; type++) {
- c.gridx = 1;
-
- for (Pair<String, RandomVectorGenerator> pair : generators) {
- List<Vector2D> points = null;
- int samples = datasets[type];
- switch (type) {
- case 0:
- points = makeRandom(samples, pair.getValue());
- break;
- case 1:
- points = makeRandom(samples, pair.getValue());
- break;
- case 2:
- points = makeRandom(samples, pair.getValue());
- break;
- case 3:
- points = makeCircle(samples, pair.getValue());
- break;
- }
- add(new Plot(points), c);
- c.gridx++;
- }
-
- c.gridy++;
- }
- }
- }
-
- @SuppressWarnings("serial")
- public static class Plot extends JComponent {
-
- private static double PAD = 10;
-
- private List<Vector2D> points;
-
- public Plot(final List<Vector2D> points) {
- this.points = points;
- }
-
- @Override
- protected void paintComponent(Graphics g) {
- super.paintComponent(g);
- Graphics2D g2 = (Graphics2D)g;
- g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
- RenderingHints.VALUE_ANTIALIAS_ON);
-
- int w = getWidth();
- int h = getHeight();
-
- g2.clearRect(0, 0, w, h);
-
- g2.setPaint(Color.black);
- g2.drawRect(0, 0, w - 1, h - 1);
-
- for (Vector2D point : points) {
- Vector2D p = transform(point, w, h);
- double[] arr = p.toArray();
- g2.draw(new Rectangle2D.Double(arr[0] - 1, arr[1] - 1, 2, 2));
- }
- }
-
- @Override
- public Dimension getPreferredSize() {
- return new Dimension(140, 140);
- }
-
- private Vector2D transform(Vector2D point, int width, int height) {
- double[] arr = point.toArray();
- return new Vector2D(new double[] { PAD + (arr[0] + 1) / 2.0 * (width - 2 * PAD),
- height - PAD - (arr[1] + 1) / 2.0 * (height - 2 * PAD) });
- }
- }
-
- public static void main(String[] args) {
- ExampleUtils.showExampleFrame(new Display());
- }
-}
http://git-wip-us.apache.org/repos/asf/commons-numbers/blob/a960a5ca/src/userguide/java/org/apache/commons/math4/userguide/RealDistributionComparison.java
----------------------------------------------------------------------
diff --git a/src/userguide/java/org/apache/commons/math4/userguide/RealDistributionComparison.java b/src/userguide/java/org/apache/commons/math4/userguide/RealDistributionComparison.java
deleted file mode 100644
index 8ad4d1f..0000000
--- a/src/userguide/java/org/apache/commons/math4/userguide/RealDistributionComparison.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.complex.userguide;
-
-import java.awt.BasicStroke;
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Font;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.swing.BorderFactory;
-import javax.swing.BoxLayout;
-import javax.swing.JComponent;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-
-import org.apache.commons.complex.distribution.BetaDistribution;
-import org.apache.commons.complex.distribution.CauchyDistribution;
-import org.apache.commons.complex.distribution.ChiSquaredDistribution;
-import org.apache.commons.complex.distribution.ExponentialDistribution;
-import org.apache.commons.complex.distribution.FDistribution;
-import org.apache.commons.complex.distribution.GammaDistribution;
-import org.apache.commons.complex.distribution.LevyDistribution;
-import org.apache.commons.complex.distribution.LogNormalDistribution;
-import org.apache.commons.complex.distribution.NormalDistribution;
-import org.apache.commons.complex.distribution.ParetoDistribution;
-import org.apache.commons.complex.distribution.RealDistribution;
-import org.apache.commons.complex.distribution.TDistribution;
-import org.apache.commons.complex.distribution.WeibullDistribution;
-import org.apache.commons.complex.random.MersenneTwister;
-import org.apache.commons.complex.random.RandomGenerator;
-import org.apache.commons.complex.util.FastMath;
-import org.apache.commons.complex.userguide.ExampleUtils.ExampleFrame;
-
-import com.xeiam.xchart.Chart;
-import com.xeiam.xchart.ChartBuilder;
-import com.xeiam.xchart.Series;
-import com.xeiam.xchart.SeriesMarker;
-import com.xeiam.xchart.StyleManager.ChartType;
-import com.xeiam.xchart.StyleManager.LegendPosition;
-import com.xeiam.xchart.XChartPanel;
-
-/**
- * Displays pdf/cdf for real distributions.
- */
-public class RealDistributionComparison {
-
- public static void addPDFSeries(Chart chart, RealDistribution distribution, String desc, int lowerBound, int upperBound) {
- // generates Log data
- List<Number> xData = new ArrayList<Number>();
- List<Number> yData = new ArrayList<Number>();
- int samples = 100;
- double stepSize = (upperBound - lowerBound) / (double) samples;
- for (double x = lowerBound; x <= upperBound; x += stepSize) {
- try {
- double density = distribution.density(x);
- if (! Double.isInfinite(density) && ! Double.isNaN(density)) {
- xData.add(x);
- yData.add(density);
- }
- } catch (Exception e) {
- // ignore
- // some distributions may reject certain values depending on the parameter settings
- }
- }
-
- Series series = chart.addSeries(desc, xData, yData);
- series.setMarker(SeriesMarker.NONE);
- series.setLineStyle(new BasicStroke(1.2f));
- }
-
- public static void addCDFSeries(Chart chart, RealDistribution distribution, String desc, int lowerBound, int upperBound) {
- // generates Log data
- List<Number> xData = new ArrayList<Number>();
- List<Number> yData = new ArrayList<Number>();
- int samples = 100;
- double stepSize = (upperBound - lowerBound) / (double) samples;
- for (double x = lowerBound; x <= upperBound; x += stepSize) {
- double density = distribution.cumulativeProbability(x);
- if (! Double.isInfinite(density) && ! Double.isNaN(density)) {
- xData.add(x);
- yData.add(density);
- }
- }
-
- Series series = chart.addSeries(desc, xData, yData);
- series.setMarker(SeriesMarker.NONE);
- series.setLineStyle(new BasicStroke(1.2f));
- }
-
- public static Chart createChart(String title, int minX, int maxX, LegendPosition position) {
- Chart chart = new ChartBuilder().width(235).height(200).build();
-
- // Customize Chart
- chart.setChartTitle(title);
- chart.getStyleManager().setChartTitleVisible(true);
- chart.getStyleManager().setChartTitleFont(new Font("Arial", Font.PLAIN, 10));
- chart.getStyleManager().setLegendPosition(position);
- chart.getStyleManager().setLegendVisible(true);
- chart.getStyleManager().setLegendFont(new Font("Arial", Font.PLAIN, 10));
- chart.getStyleManager().setLegendPadding(6);
- chart.getStyleManager().setLegendSeriesLineLength(6);
- chart.getStyleManager().setAxisTickLabelsFont(new Font("Arial", Font.PLAIN, 9));
-
- chart.getStyleManager().setXAxisMin(minX);
- chart.getStyleManager().setXAxisMax(maxX);
- chart.getStyleManager().setChartBackgroundColor(Color.white);
- chart.getStyleManager().setChartPadding(4);
-
- chart.getStyleManager().setChartType(ChartType.Line);
- return chart;
- }
-
- public static JComponent createComponent(String distributionName, int minX, int maxX, String[] seriesText, RealDistribution... series) {
- JComponent container = new JPanel();
- container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS));
-
- container.add(new JLabel(distributionName));
-
- Chart chart = createChart("PDF", minX, maxX, LegendPosition.InsideNE);
- int i = 0;
- for (RealDistribution d : series) {
- addPDFSeries(chart, d, seriesText[i++], minX, maxX);
- }
- container.add(new XChartPanel(chart));
-
- chart = createChart("CDF", minX, maxX, LegendPosition.InsideSE);
- i = 0;
- for (RealDistribution d : series) {
- addCDFSeries(chart, d, seriesText[i++], minX, maxX);
- }
- container.add(new XChartPanel(chart));
-
- container.setBorder(BorderFactory.createLineBorder(Color.black, 1));
- return container;
- }
-
- @SuppressWarnings("serial")
- public static class Display extends ExampleFrame {
-
- private JComponent container;
-
- public Display() {
- setTitle("Commons-Math: Real distributions overview");
- setSize(1320, 920);
-
- container = new JPanel();
- container.setLayout(new GridBagLayout());
-
- GridBagConstraints c = new GridBagConstraints();
- c.fill = GridBagConstraints.VERTICAL;
- c.gridx = 0;
- c.gridy = 0;
- c.insets = new Insets(2, 2, 2, 2);
-
- JComponent comp = null;
-
- comp = createComponent("Normal", -5, 5,
- new String[] { "\u03bc=0,\u03c3\u00B2=0.2", "\u03bc=0,\u03c3\u00B2=1", "\u03bc=0,\u03c3\u00B2=5", "\u03bc=-2,\u03c3\u00B2=0.5" },
- new NormalDistribution(0, FastMath.sqrt(0.2)),
- new NormalDistribution(),
- new NormalDistribution(0, FastMath.sqrt(5)),
- new NormalDistribution(-2, FastMath.sqrt(0.5)));
- container.add(comp, c);
-
- c.gridx++;
- comp = createComponent("Beta", 0, 1,
- new String[] { "\u03b1=\u03b2=0.5", "\u03b1=5,\u03b2=1", "\u03b1=1,\u03b2=3", "\u03b1=2,\u03b2=2", "\u03b1=2,\u03b2=5" },
- new BetaDistribution(0.5, 0.5),
- new BetaDistribution(5, 1),
- new BetaDistribution(1, 3),
- new BetaDistribution(2, 2),
- new BetaDistribution(2, 5));
- container.add(comp, c);
-
- c.gridx++;
- comp = createComponent("Cauchy", -5, 5,
- new String[] { "x=0,\u03b3=0.5", "x=0,\u03b3=1", "x=0,\u03b3=2", "x=-2,\u03b3=1" },
- new CauchyDistribution(0, 0.5),
- new CauchyDistribution(0, 1),
- new CauchyDistribution(0, 2),
- new CauchyDistribution(-2, 1));
- container.add(comp, c);
-
- c.gridx++;
- comp = createComponent("ChiSquared", 0, 5,
- new String[] { "k=1", "k=2", "k=3", "k=4", "k=6" },
- new ChiSquaredDistribution(1),
- new ChiSquaredDistribution(2),
- new ChiSquaredDistribution(3),
- new ChiSquaredDistribution(4),
- new ChiSquaredDistribution(6));
- container.add(comp, c);
-
- c.gridy++;
- c.gridx = 0;
- comp = createComponent("Exponential", 0, 5,
- new String[] { "\u03bb=0.5", "\u03bb=1", "\u03bb=1.5", "\u03bb=2.5" },
- new ExponentialDistribution(0.5),
- new ExponentialDistribution(1),
- new ExponentialDistribution(1.5),
- new ExponentialDistribution(2.5));
- container.add(comp, c);
-
- c.gridx++;
- comp = createComponent("Fisher-Snedecor", 0, 5,
- new String[] { "d1=1,d2=1", "d1=2,d2=1", "d1=5,d2=2", "d1=100,d2=1", "d1=100,d2=100" },
- new FDistribution(1, 1),
- new FDistribution(2, 1),
- new FDistribution(5, 2),
- new FDistribution(100, 1),
- new FDistribution(100, 100));
- container.add(comp, c);
-
- c.gridx++;
- comp = createComponent("Gamma", 0, 20,
- new String[] { "k=1,\u03b8=2", "k=2,\u03b8=2", "k=3,\u03b8=2", "k=5,\u03b8=1", "k=9,\u03b8=0.5" },
- new GammaDistribution(1, 2),
- new GammaDistribution(2, 2),
- new GammaDistribution(3, 2),
- new GammaDistribution(5, 1),
- new GammaDistribution(9, 0.5));
- container.add(comp, c);
-
- c.gridx++;
- RandomGenerator rng = new MersenneTwister(0);
- comp = createComponent("Levy", 0, 3,
- new String[] { "c=0.5", "c=1", "c=2", "c=4", "c=8" },
- new LevyDistribution(rng, 0, 0.5),
- new LevyDistribution(rng, 0, 1),
- new LevyDistribution(rng, 0, 2),
- new LevyDistribution(rng, 0, 4),
- new LevyDistribution(rng, 0, 8));
- container.add(comp, c);
-
- c.gridy++;
- c.gridx = 0;
- comp = createComponent("Log-Normal", 0, 3,
- new String[] { "\u03bc=0,\u03c3\u00B2=10", "\u03bc=0,\u03c3\u00B2=1.5", "\u03bc=0,\u03c3\u00B2=1", "\u03bc=0,\u03c3\u00B2=0.5", "\u03bc=0,\u03c3\u00B2=0.25", "\u03bc=0,\u03c3\u00B2=0.125" },
- new LogNormalDistribution(0, 10),
- new LogNormalDistribution(0, 1.5),
- new LogNormalDistribution(0, 1),
- new LogNormalDistribution(0, 0.5),
- new LogNormalDistribution(0, 0.25),
- new LogNormalDistribution(0, 0.125));
- container.add(comp, c);
-
- c.gridx++;
- comp = createComponent("Pareto", 0, 5,
- new String[] { "x=1,\u03b1=1", "x=1,\u03b1=2", "x=1,\u03b1=3", "x=1,\u03b1=10" },
- new ParetoDistribution(1, 1),
- new ParetoDistribution(1, 2),
- new ParetoDistribution(1, 3),
- new ParetoDistribution(1, 10));
- container.add(comp, c);
-
- c.gridx++;
- comp = createComponent("Student-T", -5, 5,
- new String[] { "df=1", "df=2", "df=5", "df=10000" },
- new TDistribution(1),
- new TDistribution(2),
- new TDistribution(5),
- new TDistribution(10000));
- container.add(comp, c);
-
- c.gridx++;
- comp = createComponent("Weibull", 0, 3,
- new String[] { "\u03bb=0.5,k=1", "\u03bb=1,k=1", "\u03bb=1.5,k=1", "\u03bb=5,k=1" },
- new WeibullDistribution(0.5, 1),
- new WeibullDistribution(1, 1),
- new WeibullDistribution(1.5, 1),
- new WeibullDistribution(5, 1));
- container.add(comp, c);
-
- JScrollPane scrollPane = new JScrollPane(container);
- add(scrollPane);
-
- }
-
- @Override
- public Component getMainPanel() {
- return container;
- }
-
- }
-
- public static void main(String[] args) {
- ExampleUtils.showExampleFrame(new Display());
- }
-}
http://git-wip-us.apache.org/repos/asf/commons-numbers/blob/a960a5ca/src/userguide/java/org/apache/commons/math4/userguide/clustering/ImageClusteringExample.java
----------------------------------------------------------------------
diff --git a/src/userguide/java/org/apache/commons/math4/userguide/clustering/ImageClusteringExample.java b/src/userguide/java/org/apache/commons/math4/userguide/clustering/ImageClusteringExample.java
deleted file mode 100644
index 6313054..0000000
--- a/src/userguide/java/org/apache/commons/math4/userguide/clustering/ImageClusteringExample.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.complex.userguide.clustering;
-
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-import java.awt.Graphics;
-import java.awt.GridLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.image.BufferedImage;
-import java.awt.image.Raster;
-import java.awt.image.WritableRaster;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.imageio.ImageIO;
-import javax.swing.BorderFactory;
-import javax.swing.Box;
-import javax.swing.ImageIcon;
-import javax.swing.JButton;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JSpinner;
-import javax.swing.SpinnerNumberModel;
-
-import org.apache.commons.complex.ml.clustering.CentroidCluster;
-import org.apache.commons.complex.ml.clustering.Clusterable;
-import org.apache.commons.complex.ml.clustering.KMeansPlusPlusClusterer;
-import org.apache.commons.complex.userguide.ExampleUtils;
-import org.apache.commons.complex.userguide.ExampleUtils.ExampleFrame;
-
-/**
- * This example shows how clustering can be applied to images.
- */
-@SuppressWarnings("serial")
-public class ImageClusteringExample {
-
- public static class Display extends ExampleFrame {
-
- private BufferedImage referenceImage;
- private BufferedImage clusterImage;
-
- private Raster referenceRaster;
-
- private ImagePainter painter;
-
- private JSpinner clusterSizeSpinner;
-
- public Display() throws Exception {
- setTitle("Commons-Math: Image Clustering Example");
- setSize(900, 350);
-
- setLayout(new FlowLayout());
-
- Box bar = Box.createHorizontalBox();
-
- referenceImage = ExampleUtils.resizeImage(
- ImageIO.read(new File("resources/ColorfulBird.jpg")),
- 350,
- 240,
- BufferedImage.TYPE_INT_RGB);
-
- referenceRaster = referenceImage.getData();
-
- clusterImage = new BufferedImage(referenceImage.getWidth(),
- referenceImage.getHeight(),
- BufferedImage.TYPE_INT_RGB);
-
- JLabel picLabel = new JLabel(new ImageIcon(referenceImage));
- bar.add(picLabel);
-
- painter = new ImagePainter(clusterImage.getWidth(), clusterImage.getHeight());
- bar.add(painter);
-
- JPanel controlBox = new JPanel();
- controlBox.setLayout(new GridLayout(5, 1));
- controlBox.setBorder(BorderFactory.createLineBorder(Color.black, 1));
-
- JPanel sizeBox = new JPanel();
- JLabel sizeLabel = new JLabel("Clusters:");
- sizeBox.add(sizeLabel);
-
- SpinnerNumberModel model = new SpinnerNumberModel(3, 2, 10, 1);
- clusterSizeSpinner = new JSpinner(model);
-
- sizeLabel.setLabelFor(clusterSizeSpinner);
- sizeBox.add(clusterSizeSpinner);
- controlBox.add(sizeBox, BorderLayout.NORTH);
-
- JButton startButton = new JButton("Cluster");
- startButton.setActionCommand("cluster");
- controlBox.add(startButton, BorderLayout.CENTER);
-
- bar.add(controlBox);
-
- add(bar);
-
- startButton.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- clusterImage();
- }
- });
- }
-
- private void clusterImage() {
- List<PixelClusterable> pixels = new ArrayList<PixelClusterable>();
- for (int row = 0; row < referenceImage.getHeight(); row++) {
- for (int col = 0; col < referenceImage.getWidth(); col++) {
- pixels.add(new PixelClusterable(col, row));
- }
- }
-
- int clusterSize = ((Number) clusterSizeSpinner.getValue()).intValue();
- KMeansPlusPlusClusterer<PixelClusterable> clusterer =
- new KMeansPlusPlusClusterer<PixelClusterable>(clusterSize);
- List<CentroidCluster<PixelClusterable>> clusters = clusterer.cluster(pixels);
-
- WritableRaster raster = clusterImage.getRaster();
- for (CentroidCluster<PixelClusterable> cluster : clusters) {
- double[] color = cluster.getCenter().getPoint();
- for (PixelClusterable pixel : cluster.getPoints()) {
- raster.setPixel(pixel.x, pixel.y, color);
- }
- }
-
- Display.this.repaint();
- }
-
- private class PixelClusterable implements Clusterable {
-
- private final int x;
- private final int y;
- private double[] color;
-
- public PixelClusterable(int x, int y) {
- this.x = x;
- this.y = y;
- this.color = null;
- }
-
- @Override
- public double[] getPoint() {
- if (color == null) {
- color = referenceRaster.getPixel(x, y, (double[]) null);
- }
- return color;
- }
-
- }
-
- private class ImagePainter extends Component {
-
- private int width;
- private int height;
-
- public ImagePainter(int width, int height) {
- this.width = width;
- this.height = height;
- }
-
- public Dimension getPreferredSize() {
- return new Dimension(width, height);
- }
-
- @Override
- public Dimension getMinimumSize() {
- return getPreferredSize();
- }
-
- @Override
- public Dimension getMaximumSize() {
- return getPreferredSize();
- }
-
- public void paint(Graphics g) {
- g.drawImage(clusterImage, 0, 0, this);
- }
- }
- }
-
- public static void main(String[] args) throws Exception {
- ExampleUtils.showExampleFrame(new Display());
- }
-}
http://git-wip-us.apache.org/repos/asf/commons-numbers/blob/a960a5ca/src/userguide/java/org/apache/commons/math4/userguide/filter/CannonballExample.java
----------------------------------------------------------------------
diff --git a/src/userguide/java/org/apache/commons/math4/userguide/filter/CannonballExample.java b/src/userguide/java/org/apache/commons/math4/userguide/filter/CannonballExample.java
deleted file mode 100644
index 984c914..0000000
--- a/src/userguide/java/org/apache/commons/math4/userguide/filter/CannonballExample.java
+++ /dev/null
@@ -1,321 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law
- * or agreed to in writing, software distributed under the License is
- * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the specific language
- * governing permissions and limitations under the License.
- */
-
-package org.apache.commons.complex.userguide.filter;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Font;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.swing.BorderFactory;
-import javax.swing.BoxLayout;
-import javax.swing.JComponent;
-import javax.swing.JPanel;
-
-import org.apache.commons.complex.filter.DefaultMeasurementModel;
-import org.apache.commons.complex.filter.DefaultProcessModel;
-import org.apache.commons.complex.filter.KalmanFilter;
-import org.apache.commons.complex.filter.MeasurementModel;
-import org.apache.commons.complex.filter.ProcessModel;
-import org.apache.commons.complex.linear.MatrixUtils;
-import org.apache.commons.complex.linear.RealMatrix;
-import org.apache.commons.complex.linear.RealVector;
-import org.apache.commons.complex.random.RandomGenerator;
-import org.apache.commons.complex.random.Well19937c;
-import org.apache.commons.complex.util.FastMath;
-import org.apache.commons.complex.userguide.ExampleUtils;
-import org.apache.commons.complex.userguide.ExampleUtils.ExampleFrame;
-
-import com.xeiam.xchart.Chart;
-import com.xeiam.xchart.ChartBuilder;
-import com.xeiam.xchart.Series;
-import com.xeiam.xchart.SeriesLineStyle;
-import com.xeiam.xchart.SeriesMarker;
-import com.xeiam.xchart.XChartPanel;
-import com.xeiam.xchart.StyleManager.ChartType;
-import com.xeiam.xchart.StyleManager.LegendPosition;
-
-public class CannonballExample {
-
- public static class Cannonball {
-
- private final double[] gravity = { 0, -9.81 };
- private final double[] velocity;
- private final double[] location;
-
- private final double timeslice;
- private final double measurementNoise;
-
- private final RandomGenerator rng;
-
- public Cannonball(double timeslice, double angle, double initialVelocity, double measurementNoise, int seed) {
- this.timeslice = timeslice;
-
- final double angleInRadians = FastMath.toRadians(angle);
- this.velocity = new double[] {
- initialVelocity * FastMath.cos(angleInRadians),
- initialVelocity * FastMath.sin(angleInRadians)
- };
-
- this.location = new double[] { 0, 0 };
-
- this.measurementNoise = measurementNoise;
- this.rng = new Well19937c(seed);
- }
-
- public double getX() {
- return location[0];
- }
-
- public double getY() {
- return location[1];
- }
-
- public double getMeasuredX() {
- return location[0] + rng.nextGaussian() * measurementNoise;
- }
-
- public double getMeasuredY() {
- return location[1] + rng.nextGaussian() * measurementNoise;
- }
-
- public double getXVelocity() {
- return velocity[0];
- }
-
- public double getYVelocity() {
- return velocity[1];
- }
-
- public void step() {
- // Break gravitational force into a smaller time slice.
- double[] slicedGravity = gravity.clone();
- for ( int i = 0; i < slicedGravity.length; i++ ) {
- slicedGravity[i] *= timeslice;
- }
-
- // Apply the acceleration to velocity.
- double[] slicedVelocity = velocity.clone();
- for ( int i = 0; i < velocity.length; i++ ) {
- velocity[i] += slicedGravity[i];
- slicedVelocity[i] = velocity[i] * timeslice;
- location[i] += slicedVelocity[i];
- }
-
- // Cannonballs shouldn't go into the ground.
- if ( location[1] < 0 ) {
- location[1] = 0;
- }
- }
- }
-
- public static void cannonballTest(Chart chart) {
-
- // time interval for each iteration
- final double dt = 0.1;
- // the number of iterations to run
- final int iterations = 144;
- // measurement noise (m)
- final double measurementNoise = 30;
- // initial velocity of the cannonball
- final double initialVelocity = 100;
- // shooting angle
- final double angle = 45;
-
- // the cannonball itself
- final Cannonball cannonball = new Cannonball(dt, angle, initialVelocity, measurementNoise, 1000);
-
- // A = [ 1, dt, 0, 0 ] => x(n+1) = x(n) + vx(n)
- // [ 0, 1, 0, 0 ] => vx(n+1) = vx(n)
- // [ 0, 0, 1, dt ] => y(n+1) = y(n) + vy(n)
- // [ 0, 0, 0, 1 ] => vy(n+1) = vy(n)
- final RealMatrix A = MatrixUtils.createRealMatrix(new double[][] {
- { 1, dt, 0, 0 },
- { 0, 1, 0, 0 },
- { 0, 0, 1, dt },
- { 0, 0, 0, 1 }
- });
-
- // The control vector, which adds acceleration to the kinematic equations.
- // 0 => x(n+1) = x(n+1)
- // 0 => vx(n+1) = vx(n+1)
- // -9.81*dt^2 => y(n+1) = y(n+1) - 1/2 * 9.81 * dt^2
- // -9.81*dt => vy(n+1) = vy(n+1) - 9.81 * dt
- final RealVector controlVector =
- MatrixUtils.createRealVector(new double[] { 0, 0, 0.5 * -9.81 * dt * dt, -9.81 * dt } );
-
- // The control matrix B only update y and vy, see control vector
- final RealMatrix B = MatrixUtils.createRealMatrix(new double[][] {
- { 0, 0, 0, 0 },
- { 0, 0, 0, 0 },
- { 0, 0, 1, 0 },
- { 0, 0, 0, 1 }
- });
-
- // After state transition and control, here are the equations:
- //
- // x(n+1) = x(n) + vx(n)
- // vx(n+1) = vx(n)
- // y(n+1) = y(n) + vy(n) - 0.5 * 9.81 * dt^2
- // vy(n+1) = vy(n) + -9.81 * dt
- //
- // Which, if you recall, are the equations of motion for a parabola.
-
- // We only observe the x/y position of the cannonball
- final RealMatrix H = MatrixUtils.createRealMatrix(new double[][] {
- { 1, 0, 0, 0 },
- { 0, 0, 0, 0 },
- { 0, 0, 1, 0 },
- { 0, 0, 0, 0 }
- });
-
- // This is our guess of the initial state. I intentionally set the Y value
- // wrong to illustrate how fast the Kalman filter will pick up on that.
- final double speedX = cannonball.getXVelocity();
- final double speedY = cannonball.getYVelocity();
- final RealVector initialState = MatrixUtils.createRealVector(new double[] { 0, speedX, 100, speedY } );
-
- // The initial error covariance matrix, the variance = noise^2
- final double var = measurementNoise * measurementNoise;
- final RealMatrix initialErrorCovariance = MatrixUtils.createRealMatrix(new double[][] {
- { var, 0, 0, 0 },
- { 0, 1e-3, 0, 0 },
- { 0, 0, var, 0 },
- { 0, 0, 0, 1e-3 }
- });
-
- // we assume no process noise -> zero matrix
- final RealMatrix Q = MatrixUtils.createRealMatrix(4, 4);
-
- // the measurement covariance matrix
- final RealMatrix R = MatrixUtils.createRealMatrix(new double[][] {
- { var, 0, 0, 0 },
- { 0, 1e-3, 0, 0 },
- { 0, 0, var, 0 },
- { 0, 0, 0, 1e-3 }
- });
-
- final ProcessModel pm = new DefaultProcessModel(A, B, Q, initialState, initialErrorCovariance);
- final MeasurementModel mm = new DefaultMeasurementModel(H, R);
- final KalmanFilter filter = new KalmanFilter(pm, mm);
-
- final List<Number> realX = new ArrayList<Number>();
- final List<Number> realY = new ArrayList<Number>();
- final List<Number> measuredX = new ArrayList<Number>();
- final List<Number> measuredY = new ArrayList<Number>();
- final List<Number> kalmanX = new ArrayList<Number>();
- final List<Number> kalmanY = new ArrayList<Number>();
-
- for (int i = 0; i < iterations; i++) {
-
- // get real location
- realX.add(cannonball.getX());
- realY.add(cannonball.getY());
-
- // get measured location
- final double mx = cannonball.getMeasuredX();
- final double my = cannonball.getMeasuredY();
-
- measuredX.add(mx);
- measuredY.add(my);
-
- // iterate the cannon simulation to the next timeslice.
- cannonball.step();
-
- final double[] state = filter.getStateEstimation();
- kalmanX.add(state[0]);
- kalmanY.add(state[2]);
-
- // update the kalman filter with the measurements
- filter.predict(controlVector);
- filter.correct(new double[] { mx, 0, my, 0 } );
- }
-
- chart.setXAxisTitle("Distance (m)");
- chart.setYAxisTitle("Height (m)");
-
- Series dataset = chart.addSeries("true", realX, realY);
- dataset.setMarker(SeriesMarker.NONE);
-
- dataset = chart.addSeries("measured", measuredX, measuredY);
- dataset.setLineStyle(SeriesLineStyle.DOT_DOT);
- dataset.setMarker(SeriesMarker.NONE);
-
- dataset = chart.addSeries("kalman", kalmanX, kalmanY);
- dataset.setLineColor(Color.red);
- dataset.setLineStyle(SeriesLineStyle.DASH_DASH);
- dataset.setMarker(SeriesMarker.NONE);
- }
-
- public static Chart createChart(String title, LegendPosition position) {
- Chart chart = new ChartBuilder().width(650).height(450).build();
-
- // Customize Chart
- chart.setChartTitle(title);
- chart.getStyleManager().setChartTitleVisible(true);
- chart.getStyleManager().setChartTitleFont(new Font("Arial", Font.PLAIN, 12));
- chart.getStyleManager().setLegendPosition(position);
- chart.getStyleManager().setLegendVisible(true);
- chart.getStyleManager().setLegendFont(new Font("Arial", Font.PLAIN, 12));
- chart.getStyleManager().setLegendPadding(6);
- chart.getStyleManager().setLegendSeriesLineLength(10);
- chart.getStyleManager().setAxisTickLabelsFont(new Font("Arial", Font.PLAIN, 10));
-
- chart.getStyleManager().setChartBackgroundColor(Color.white);
- chart.getStyleManager().setChartPadding(4);
-
- chart.getStyleManager().setChartType(ChartType.Line);
- return chart;
- }
-
- public static JComponent createComponent() {
- JComponent container = new JPanel();
- container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS));
-
- Chart chart = createChart("Cannonball", LegendPosition.InsideNE);
- cannonballTest(chart);
- container.add(new XChartPanel(chart));
-
- container.setBorder(BorderFactory.createLineBorder(Color.black, 1));
- return container;
- }
-
- @SuppressWarnings("serial")
- public static class Display extends ExampleFrame {
-
- private JComponent container;
-
- public Display() {
- setTitle("Commons Math: Kalman Filter - Cannonball");
- setSize(800, 600);
-
- container = new JPanel();
- JComponent comp = createComponent();
- container.add(comp);
-
- add(container);
- }
-
- @Override
- public Component getMainPanel() {
- return container;
- }
- }
-
- public static void main(String[] args) {
- ExampleUtils.showExampleFrame(new Display());
- }
-}
http://git-wip-us.apache.org/repos/asf/commons-numbers/blob/a960a5ca/src/userguide/java/org/apache/commons/math4/userguide/filter/ConstantVoltageExample.java
----------------------------------------------------------------------
diff --git a/src/userguide/java/org/apache/commons/math4/userguide/filter/ConstantVoltageExample.java b/src/userguide/java/org/apache/commons/math4/userguide/filter/ConstantVoltageExample.java
deleted file mode 100644
index 3fd35ef..0000000
--- a/src/userguide/java/org/apache/commons/math4/userguide/filter/ConstantVoltageExample.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law
- * or agreed to in writing, software distributed under the License is
- * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the specific language
- * governing permissions and limitations under the License.
- */
-
-package org.apache.commons.complex.userguide.filter;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Font;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.swing.BorderFactory;
-import javax.swing.BoxLayout;
-import javax.swing.JComponent;
-import javax.swing.JPanel;
-
-import org.apache.commons.complex.filter.DefaultMeasurementModel;
-import org.apache.commons.complex.filter.DefaultProcessModel;
-import org.apache.commons.complex.filter.KalmanFilter;
-import org.apache.commons.complex.filter.MeasurementModel;
-import org.apache.commons.complex.filter.ProcessModel;
-import org.apache.commons.complex.linear.Array2DRowRealMatrix;
-import org.apache.commons.complex.linear.ArrayRealVector;
-import org.apache.commons.complex.linear.RealMatrix;
-import org.apache.commons.complex.linear.RealVector;
-import org.apache.commons.complex.random.RandomGenerator;
-import org.apache.commons.complex.random.Well19937c;
-import org.apache.commons.complex.userguide.ExampleUtils;
-import org.apache.commons.complex.userguide.ExampleUtils.ExampleFrame;
-
-import com.xeiam.xchart.Chart;
-import com.xeiam.xchart.ChartBuilder;
-import com.xeiam.xchart.Series;
-import com.xeiam.xchart.SeriesLineStyle;
-import com.xeiam.xchart.SeriesMarker;
-import com.xeiam.xchart.XChartPanel;
-import com.xeiam.xchart.StyleManager.ChartType;
-import com.xeiam.xchart.StyleManager.LegendPosition;
-
-public class ConstantVoltageExample {
-
- public static class VoltMeter {
-
- private final double initialVoltage;
- private final double processNoise;
- private final double measurementNoise;
- private final RandomGenerator rng;
-
- private double voltage;
-
- public VoltMeter(double voltage, double processNoise, double measurementNoise, int seed) {
- this.initialVoltage = voltage;
- this.voltage = voltage;
- this.processNoise = processNoise;
- this.measurementNoise = measurementNoise;
- rng = new Well19937c(seed);
- }
-
- /**
- * Returns the real voltage without any measurement noise.
- *
- * @return the real voltage
- */
- public double getVoltage() {
- return voltage;
- }
-
- public double getMeasuredVoltage() {
- return getVoltage() + rng.nextGaussian() * measurementNoise;
- }
-
- public void step() {
- // we apply only the process noise
- voltage = initialVoltage + rng.nextGaussian() * processNoise;
- }
- }
-
- /** constant voltage test */
- public static void constantVoltageTest(Chart chart1, Chart chart2) {
-
- final double voltage = 1.25d;
- final double measurementNoise = 0.2d; // measurement noise (V) - std dev
- final double processNoise = 1e-5d;
-
- final VoltMeter voltMeter = new VoltMeter(voltage, processNoise, measurementNoise, 2);
-
- // the state transition matrix -> constant
- final RealMatrix A = new Array2DRowRealMatrix(new double[] { 1d });
-
- // the control matrix -> no control input
- final RealMatrix B = new Array2DRowRealMatrix(new double[] { 0d });
-
- // the measurement matrix -> we measure the voltage directly
- final RealMatrix H = new Array2DRowRealMatrix(new double[] { 1d });
-
- // the initial state vector -> slightly wrong
- final RealVector x0 = new ArrayRealVector(new double[] { 1.45 });
-
- // the process covariance matrix
- final RealMatrix Q = new Array2DRowRealMatrix(new double[] { processNoise * processNoise });
-
- // the initial error covariance -> assume a large error at the beginning
- final RealMatrix P0 = new Array2DRowRealMatrix(new double[] { 0.1 });
-
- // the measurement covariance matrix -> put the "real" variance
- RealMatrix R = new Array2DRowRealMatrix(new double[] { measurementNoise * measurementNoise });
-
- final ProcessModel pm = new DefaultProcessModel(A, B, Q, x0, P0);
- final MeasurementModel mm = new DefaultMeasurementModel(H, R);
- final KalmanFilter filter = new KalmanFilter(pm, mm);
-
- final List<Number> xAxis = new ArrayList<Number>();
- final List<Number> realVoltageSeries = new ArrayList<Number>();
- final List<Number> measuredVoltageSeries = new ArrayList<Number>();
- final List<Number> kalmanVoltageSeries = new ArrayList<Number>();
-
- final List<Number> covSeries = new ArrayList<Number>();
-
- for (int i = 0; i < 300; i++) {
- xAxis.add(i);
-
- voltMeter.step();
-
- realVoltageSeries.add(voltMeter.getVoltage());
-
- // get the measured voltage from the volt meter
- final double measuredVoltage = voltMeter.getMeasuredVoltage();
- measuredVoltageSeries.add(measuredVoltage);
-
- kalmanVoltageSeries.add(filter.getStateEstimation()[0]);
- covSeries.add(filter.getErrorCovariance()[0][0]);
-
- filter.predict();
- filter.correct(new double[] { measuredVoltage });
- }
-
- chart1.setYAxisTitle("Voltage");
- chart1.setXAxisTitle("Iteration");
-
- Series dataset = chart1.addSeries("real", xAxis, realVoltageSeries);
- dataset.setMarker(SeriesMarker.NONE);
-
- dataset = chart1.addSeries("measured", xAxis, measuredVoltageSeries);
- dataset.setLineStyle(SeriesLineStyle.DOT_DOT);
- dataset.setMarker(SeriesMarker.NONE);
-
- dataset = chart1.addSeries("filtered", xAxis, kalmanVoltageSeries);
- dataset.setLineColor(Color.red);
- dataset.setLineStyle(SeriesLineStyle.DASH_DASH);
- dataset.setMarker(SeriesMarker.NONE);
-
- // Error covariance chart
-
- chart2.setYAxisTitle("(Voltage)�");
- chart2.setXAxisTitle("Iteration");
-
- dataset = chart2.addSeries("cov", xAxis, covSeries);
- dataset.setLineColor(Color.black);
- dataset.setLineStyle(SeriesLineStyle.SOLID);
- dataset.setMarker(SeriesMarker.NONE);
-
- }
-
- public static Chart createChart(String title, int width, int height,
- LegendPosition position, boolean legendVisible) {
- Chart chart = new ChartBuilder().width(width).height(height).build();
-
- // Customize Chart
- chart.setChartTitle(title);
- chart.getStyleManager().setChartTitleVisible(true);
- chart.getStyleManager().setChartTitleFont(new Font("Arial", Font.PLAIN, 12));
- chart.getStyleManager().setLegendPosition(position);
- chart.getStyleManager().setLegendVisible(legendVisible);
- chart.getStyleManager().setLegendFont(new Font("Arial", Font.PLAIN, 12));
- chart.getStyleManager().setLegendPadding(6);
- chart.getStyleManager().setLegendSeriesLineLength(10);
- chart.getStyleManager().setAxisTickLabelsFont(new Font("Arial", Font.PLAIN, 10));
-
- chart.getStyleManager().setChartBackgroundColor(Color.white);
- chart.getStyleManager().setChartPadding(4);
-
- chart.getStyleManager().setChartType(ChartType.Line);
- return chart;
- }
-
- public static JComponent createComponent() {
- JComponent container = new JPanel();
- container.setLayout(new BoxLayout(container, BoxLayout.LINE_AXIS));
-
- Chart chart1 = createChart("Voltage", 550, 450, LegendPosition.InsideNE, true);
- Chart chart2 = createChart("Error Covariance", 450, 450, LegendPosition.InsideNE, false);
-
- constantVoltageTest(chart1, chart2);
-
- container.add(new XChartPanel(chart1));
- container.add(new XChartPanel(chart2));
-
- container.setBorder(BorderFactory.createLineBorder(Color.black, 1));
- return container;
- }
-
- @SuppressWarnings("serial")
- public static class Display extends ExampleFrame {
-
- private JComponent container;
-
- public Display() {
- setTitle("Commons-Math: Kalman Filter example");
- setSize(1100, 700);
-
- container = new JPanel();
-
- JComponent comp = createComponent();
- container.add(comp);
-
- add(container);
- }
-
- @Override
- public Component getMainPanel() {
- return container;
- }
- }
-
- public static void main(String[] args) {
- ExampleUtils.showExampleFrame(new Display());
- }
-
-}
http://git-wip-us.apache.org/repos/asf/commons-numbers/blob/a960a5ca/src/userguide/java/org/apache/commons/math4/userguide/genetics/HelloWorldExample.java
----------------------------------------------------------------------
diff --git a/src/userguide/java/org/apache/commons/math4/userguide/genetics/HelloWorldExample.java b/src/userguide/java/org/apache/commons/math4/userguide/genetics/HelloWorldExample.java
deleted file mode 100644
index c86a7d7..0000000
--- a/src/userguide/java/org/apache/commons/math4/userguide/genetics/HelloWorldExample.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.complex.userguide.genetics;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.RandomStringUtils;
-import org.apache.commons.complex.exception.util.LocalizedFormats;
-import org.apache.commons.complex.genetics.AbstractListChromosome;
-import org.apache.commons.complex.genetics.Chromosome;
-import org.apache.commons.complex.genetics.ElitisticListPopulation;
-import org.apache.commons.complex.genetics.GeneticAlgorithm;
-import org.apache.commons.complex.genetics.InvalidRepresentationException;
-import org.apache.commons.complex.genetics.MutationPolicy;
-import org.apache.commons.complex.genetics.OnePointCrossover;
-import org.apache.commons.complex.genetics.Population;
-import org.apache.commons.complex.genetics.StoppingCondition;
-import org.apache.commons.complex.genetics.TournamentSelection;
-import org.apache.commons.complex.util.FastMath;
-import org.apache.commons.complex.util.Precision;
-
-public class HelloWorldExample {
- public static final int POPULATION_SIZE = 1000;
- public static final double CROSSOVER_RATE = 0.9;
- public static final double MUTATION_RATE = 0.03;
- public static final double ELITISM_RATE = 0.1;
- public static final int TOURNAMENT_ARITY = 2;
-
- public static final String TARGET_STRING = "Hello World!";
- public static final int DIMENSION = TARGET_STRING.length();
-
- public static void main(String[] args) {
- long startTime = System.currentTimeMillis();
-
- // initialize a new genetic algorithm
- GeneticAlgorithm ga = new GeneticAlgorithm(new OnePointCrossover<Character>(), CROSSOVER_RATE,
- new RandomCharacterMutation(), MUTATION_RATE,
- new TournamentSelection(TOURNAMENT_ARITY));
-
- // initial population
- Population initial = getInitialPopulation();
-
- // stopping condition
- StoppingCondition stoppingCondition = new StoppingCondition() {
-
- int generation = 0;
-
-// @Override
- public boolean isSatisfied(Population population) {
- Chromosome fittestChromosome = population.getFittestChromosome();
-
- if (generation == 1 || generation % 10 == 0) {
- System.out.println("Generation " + generation + ": " + fittestChromosome.toString());
- }
- generation++;
-
- double fitness = fittestChromosome.fitness();
- if (Precision.equals(fitness, 0.0, 1e-6)) {
- return true;
- } else {
- return false;
- }
- }
- };
-
- System.out.println("Starting evolution ...");
-
- // run the algorithm
- Population finalPopulation = ga.evolve(initial, stoppingCondition);
-
- // Get the end time for the simulation.
- long endTime = System.currentTimeMillis();
-
- // best chromosome from the final population
- Chromosome best = finalPopulation.getFittestChromosome();
- System.out.println("Generation " + ga.getGenerationsEvolved() + ": " + best.toString());
- System.out.println("Total execution time: " + (endTime - startTime) + "ms");
- }
-
- private static List<Character> randomRepresentation(int length) {
- return asList(RandomStringUtils.randomAscii(length));
- }
-
- private static List<Character> asList(String str) {
- return Arrays.asList(ArrayUtils.toObject(str.toCharArray()));
- }
-
- private static Population getInitialPopulation() {
- List<Chromosome> popList = new LinkedList<Chromosome>();
-
- for (int i = 0; i < POPULATION_SIZE; i++) {
- popList.add(new StringChromosome(randomRepresentation(DIMENSION)));
- }
- return new ElitisticListPopulation(popList, 2 * popList.size(), ELITISM_RATE);
- }
-
- /**
- * String Chromosome represented by a list of characters.
- */
- public static class StringChromosome extends AbstractListChromosome<Character> {
-
- public StringChromosome(List<Character> repr) {
- super(repr);
- }
-
- public StringChromosome(String str) {
- this(asList(str));
- }
-
- public double fitness() {
- String target = TARGET_STRING;
- int f = 0; // start at 0; the best fitness
- List<Character> chromosome = getRepresentation();
- for (int i = 0, c = target.length(); i < c; i++) {
- // subtract the ascii difference between the target character and the chromosome character.
- // Thus 'c' is fitter than 'd' when compared to 'a'.
- f -= FastMath.abs(target.charAt(i) - chromosome.get(i).charValue());
- }
- return f;
- }
-
- @Override
- protected void checkValidity(List<Character> repr) throws InvalidRepresentationException {
- for (char c : repr) {
- if (c < 32 || c > 126) {
- throw new InvalidRepresentationException(LocalizedFormats.INVALID_FIXED_LENGTH_CHROMOSOME);
- }
- }
- }
-
- public List<Character> getStringRepresentation() {
- return getRepresentation();
- }
-
- @Override
- public StringChromosome newFixedLengthChromosome(List<Character> repr) {
- return new StringChromosome(repr);
- }
-
- @Override
- public String toString() {
- StringBuffer sb = new StringBuffer();
- for (Character i : getRepresentation()) {
- sb.append(i.charValue());
- }
- return String.format("(f=%s '%s')", getFitness(), sb.toString());
- }
-
- }
-
- private static class RandomCharacterMutation implements MutationPolicy {
- public Chromosome mutate(Chromosome original) {
- if (!(original instanceof StringChromosome)) {
- throw new IllegalArgumentException();
- }
-
- StringChromosome strChromosome = (StringChromosome) original;
- List<Character> characters = strChromosome.getStringRepresentation();
-
- int mutationIndex = GeneticAlgorithm.getRandomGenerator().nextInt(characters.size());
-
- List<Character> mutatedChromosome = new ArrayList<Character>(characters);
- char newValue = (char) (32 + GeneticAlgorithm.getRandomGenerator().nextInt(127 - 32));
- mutatedChromosome.set(mutationIndex, newValue);
-
- return strChromosome.newFixedLengthChromosome(mutatedChromosome);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/commons-numbers/blob/a960a5ca/src/userguide/java/org/apache/commons/math4/userguide/genetics/ImageEvolutionExample.java
----------------------------------------------------------------------
diff --git a/src/userguide/java/org/apache/commons/math4/userguide/genetics/ImageEvolutionExample.java b/src/userguide/java/org/apache/commons/math4/userguide/genetics/ImageEvolutionExample.java
deleted file mode 100644
index 38ab9a2..0000000
--- a/src/userguide/java/org/apache/commons/math4/userguide/genetics/ImageEvolutionExample.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.complex.userguide.genetics;
-
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.IOException;
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.imageio.ImageIO;
-import javax.swing.Box;
-import javax.swing.ImageIcon;
-import javax.swing.JButton;
-import javax.swing.JLabel;
-
-import org.apache.commons.complex.genetics.Chromosome;
-import org.apache.commons.complex.genetics.ElitisticListPopulation;
-import org.apache.commons.complex.genetics.GeneticAlgorithm;
-import org.apache.commons.complex.genetics.Population;
-import org.apache.commons.complex.genetics.TournamentSelection;
-import org.apache.commons.complex.genetics.UniformCrossover;
-import org.apache.commons.complex.userguide.ExampleUtils;
-import org.apache.commons.complex.userguide.ExampleUtils.ExampleFrame;
-
-/**
- * This example shows a more advanced use of a genetic algorithm: approximate a raster image
- * with ~100 semi-transparent polygons of length 6.
- * <p>
- * The fitness function is quite simple yet expensive to compute:
- *
- * - draw the polygons of a chromosome to an image
- * - compare each pixel with the corresponding reference image
- * <p>
- * To improve the speed of the calculation, we calculate the fitness not on the original image size,
- * but rather on a scaled down version, which is sufficient to demonstrate the power of such a genetic algorithm.
- * <p>
- * TODO:
- * - improve user interface
- * - make algorithm parameters configurable
- * - add a gallery of results after x iterations / minutes (either automatic or based on button click)
- * - allow loading / selection of other images
- * - add logging in the user interface, e.g. number of generations, time spent, ...
- *
- * @see <a href="http://www.nihilogic.dk/labs/evolving-images/">Evolving Images with JavaScript and canvas (Nihilogic)</a>
- */
-@SuppressWarnings("serial")
-public class ImageEvolutionExample {
-
- public static final int POPULATION_SIZE = 40;
- public static final int TOURNAMENT_ARITY = 5;
- public static final float MUTATION_RATE = 0.02f;
- public static final float MUTATION_CHANGE = 0.1f;
-
- public static final int POLYGON_LENGTH = 6;
- public static final int POLYGON_COUNT = 100;
-
- public static class Display extends ExampleFrame {
-
- private GeneticAlgorithm ga;
- private Population currentPopulation;
- private Chromosome bestFit;
-
- private Thread internalThread;
- private volatile boolean noStopRequested;
-
- private BufferedImage ref;
-
- private BufferedImage referenceImage;
- private BufferedImage testImage;
-
- private ImagePainter painter;
-
- public Display() throws Exception {
- setTitle("Commons-Math: Image Evolution Example");
- setSize(600, 400);
-
- setLayout(new FlowLayout());
-
- Box bar = Box.createHorizontalBox();
-
- ref = ImageIO.read(new File("resources/monalisa.png"));
- //ref = ImageIO.read(new File("resources/feather-small.gif"));
-
- referenceImage = resizeImage(ref, 50, 50, BufferedImage.TYPE_INT_ARGB);
- testImage = new BufferedImage(referenceImage.getWidth(), referenceImage.getHeight(), BufferedImage.TYPE_INT_ARGB);
-
- JLabel picLabel = new JLabel(new ImageIcon(ref));
- bar.add(picLabel);
-
- painter = new ImagePainter(ref.getWidth(), ref.getHeight());
- bar.add(painter);
-
- // set the images used for calculating the fitness function:
- // refImage - the reference image
- // testImage - the test image to draw the current chromosome
- PolygonChromosome.setRefImage(referenceImage);
- PolygonChromosome.setTestImage(testImage);
-
- add(bar);
-
- JButton startButton = new JButton("Start");
- startButton.setActionCommand("start");
- add(startButton);
-
- startButton.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- if (isAlive()) {
- stopRequest();
- } else {
- startEvolution();
- }
- }
- });
-
- // initialize a new genetic algorithm
- ga = new GeneticAlgorithm(new UniformCrossover<Polygon>(0.5), 1.0,
- new RandomPolygonMutation(MUTATION_RATE, MUTATION_CHANGE), 1.0,
- new TournamentSelection(TOURNAMENT_ARITY));
-
- // initial population
- currentPopulation = getInitialPopulation();
- bestFit = currentPopulation.getFittestChromosome();
- }
-
- public boolean isAlive() {
- return internalThread != null && internalThread.isAlive();
- }
-
- public void stopRequest() {
- noStopRequested = false;
- internalThread.interrupt();
- internalThread = null;
- }
-
- public void startEvolution() {
- noStopRequested = true;
- Runnable r = new Runnable() {
- public void run() {
- int evolution = 0;
- while (noStopRequested) {
- currentPopulation = ga.nextGeneration(currentPopulation);
-
- System.out.println("generation: " + evolution++ + ": " + bestFit.toString());
- bestFit = currentPopulation.getFittestChromosome();
-
- painter.repaint();
- }
- }
- };
-
- internalThread = new Thread(r);
- internalThread.start();
- }
-
- private class ImagePainter extends Component {
-
- private int width;
- private int height;
-
- public ImagePainter(int width, int height) {
- this.width = width;
- this.height = height;
- }
-
- public Dimension getPreferredSize() {
- return new Dimension(width, height);
- }
-
- @Override
- public Dimension getMinimumSize() {
- return getPreferredSize();
- }
-
- @Override
- public Dimension getMaximumSize() {
- return getPreferredSize();
- }
-
- public void paint(Graphics g) {
- PolygonChromosome chromosome = (PolygonChromosome) bestFit;
- chromosome.draw((Graphics2D) g, ref.getWidth(), ref.getHeight());
- }
-
- }
-
- }
-
- public static void main(String[] args) throws Exception {
- ExampleUtils.showExampleFrame(new Display());
- }
-
- private static BufferedImage resizeImage(BufferedImage originalImage, int width, int height, int type) throws IOException {
- BufferedImage resizedImage = new BufferedImage(width, height, type);
- Graphics2D g = resizedImage.createGraphics();
- g.drawImage(originalImage, 0, 0, width, height, null);
- g.dispose();
- return resizedImage;
- }
-
- private static Population getInitialPopulation() {
- List<Chromosome> popList = new LinkedList<Chromosome>();
- for (int i = 0; i < POPULATION_SIZE; i++) {
- popList.add(PolygonChromosome.randomChromosome(POLYGON_LENGTH, POLYGON_COUNT));
- }
- return new ElitisticListPopulation(popList, popList.size(), 0.25);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/commons-numbers/blob/a960a5ca/src/userguide/java/org/apache/commons/math4/userguide/genetics/Polygon.java
----------------------------------------------------------------------
diff --git a/src/userguide/java/org/apache/commons/math4/userguide/genetics/Polygon.java b/src/userguide/java/org/apache/commons/math4/userguide/genetics/Polygon.java
deleted file mode 100644
index 9fb4ef0..0000000
--- a/src/userguide/java/org/apache/commons/math4/userguide/genetics/Polygon.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.complex.userguide.genetics;
-
-import java.awt.Color;
-import java.awt.Graphics2D;
-import java.awt.geom.GeneralPath;
-
-import org.apache.commons.complex.genetics.GeneticAlgorithm;
-import org.apache.commons.complex.random.RandomGenerator;
-import org.apache.commons.complex.util.FastMath;
-
-/**
- * Represents a fixed size polgon with its fill color.
- */
-public class Polygon {
-
- // the polygon in packed representation:
- // index | data
- // 0 | red component
- // 1 | green component
- // 2 | blue component
- // 3 | alpha channel
- // 4 | first x coordinate
- // 5 | first y coordinate
- // 6 | second x coordinate
- // ...
- // N | last y coordinate
- // ---------------------------
- /// size = 4 + 2*polygonlength
- private float[] data;
-
- /**
- * Creates a new random Polygon of the given length.
- */
- public static Polygon randomPolygon(int length) {
- final int polygonSize = 4 + 2 * length;
-
- final RandomGenerator random = GeneticAlgorithm.getRandomGenerator();
-
- Polygon p = new Polygon();
- p.data = new float[polygonSize];
-
- p.data[0] = random.nextFloat(); // r
- p.data[1] = random.nextFloat(); // g
- p.data[2] = random.nextFloat(); // b
- p.data[3] = FastMath.max(0.2f, random.nextFloat() * random.nextFloat()); // a
-
- float px = random.nextFloat();
- float py = random.nextFloat();
-
- for (int k = 0; k < length; k++) {
- p.data[4 + 2*k] = px + (random.nextFloat() - 0.5f);
- p.data[5 + 2*k] = py + (random.nextFloat() - 0.5f);
- }
- return p;
- }
-
- /**
- * Return a new Polygon, mutated with the given rate and amount.
- * <p>
- * Each component of the Polygon may be mutated according to the specified mutation rate.
- * In case a component is going to be mutated, its value will be randomly modified in the
- * uniform range of [-mutationAmount, +mutationAmount].
- *
- * @param mutationRate the mutation rate
- * @param mutationAmount the mutation amount
- * @return a new Polygon
- */
- public Polygon mutate(float mutationRate, float mutationAmount) {
- Polygon mutated = new Polygon();
- int size = data.length;
- mutated.data = new float[size];
- for (int i = 0; i < size; i++) {
- float val = this.data[i];
- if (GeneticAlgorithm.getRandomGenerator().nextFloat() < mutationRate) {
- val += GeneticAlgorithm.getRandomGenerator().nextFloat() * mutationAmount * 2 - mutationAmount;
-
- if (val < 0f) {
- val = 0f;
- } else if (val > 1f) {
- val = 1f;
- }
- }
- mutated.data[i] = val;
- }
- return mutated;
- }
-
- /**
- * Draw the Polygon to the buffer of the given size.
- */
- public void draw(Graphics2D g, int width, int height) {
- g.setColor(new Color(data[0], data[1], data[2], data[3]));
-
- GeneralPath path = new GeneralPath();
- path.moveTo(data[4] * width, data[5] * height);
-
- int polygonLength = (data.length - 4) / 2;
- for (int j = 1; j < polygonLength; j++) {
- path.lineTo(data[4 + j * 2] * width, data[5 + j * 2] * height);
- }
- path.closePath();
-
- g.fill(path);
- }
-}
http://git-wip-us.apache.org/repos/asf/commons-numbers/blob/a960a5ca/src/userguide/java/org/apache/commons/math4/userguide/genetics/PolygonChromosome.java
----------------------------------------------------------------------
diff --git a/src/userguide/java/org/apache/commons/math4/userguide/genetics/PolygonChromosome.java b/src/userguide/java/org/apache/commons/math4/userguide/genetics/PolygonChromosome.java
deleted file mode 100644
index c078cc4..0000000
--- a/src/userguide/java/org/apache/commons/math4/userguide/genetics/PolygonChromosome.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.complex.userguide.genetics;
-
-import java.awt.AlphaComposite;
-import java.awt.Color;
-import java.awt.Graphics2D;
-import java.awt.RenderingHints;
-import java.awt.image.BufferedImage;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.commons.complex.genetics.AbstractListChromosome;
-import org.apache.commons.complex.genetics.Chromosome;
-import org.apache.commons.complex.genetics.InvalidRepresentationException;
-
-/**
- * A simple chromosome representing a list of polygons.
- */
-public class PolygonChromosome extends AbstractListChromosome<Polygon> {
-
- /** The reference image for fitness testing. */
- private static BufferedImage refImage;
- /** The image buffer used to draw the current chromosome during fitness testing. */
- private static BufferedImage testImage;
-
- public static void setRefImage(BufferedImage ref) {
- refImage = ref;
- }
-
- public static void setTestImage(BufferedImage image) {
- testImage = image;
- }
-
- public PolygonChromosome(List<Polygon> representation) {
- super(representation);
- }
-
- @Override
- protected void checkValidity(List<Polygon> chromosomeRepresentation) throws InvalidRepresentationException {
- // do nothing
- }
-
- @Override
- public AbstractListChromosome<Polygon> newFixedLengthChromosome(List<Polygon> chromosomeRepresentation) {
- return new PolygonChromosome(chromosomeRepresentation);
- }
-
- /**
- * Return the internal representation, which is needed for our custom mutation policy.
- *
- * @return the list of polygons
- */
- public List<Polygon> getPolygonRepresentation() {
- return getRepresentation();
- }
-
- /**
- * Calculate the fitness function for this chromosome.
- * <p>
- * For this purpose, we first draw the polygons on the test buffer, and
- * then compare the resulting image pixel by pixel with the reference image.
- */
- public double fitness() {
-
- Graphics2D g2 = testImage.createGraphics();
-
- int width = testImage.getWidth();
- int height = testImage.getHeight();
-
- draw(g2, width, height);
- g2.dispose();
-
- int[] refPixels = refImage.getData().getPixels(0, 0, refImage.getWidth(), refImage.getHeight(), (int[]) null);
- int[] testPixels = testImage.getData().getPixels(0, 0, testImage.getWidth(), testImage.getHeight(), (int[]) null);
-
- int diff = 0;
- int p = width * height * 4 - 1; // 4 channels: rgba
- int idx = 0;
-
- do {
- if (idx++ % 4 != 0) { // ignore the alpha channel for fitness
- int dp = testPixels[p] - refPixels[p];
- if (dp < 0) {
- diff -= dp;
- } else {
- diff += dp;
- }
- }
- } while(--p > 0);
-
- return (1.0 - diff / (width * height * 3.0 * 256));
- }
-
- public void draw(Graphics2D g, int width, int height) {
- g.setBackground(Color.WHITE);
- g.clearRect(0, 0, width, height);
-
- g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
- g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
-
- List<Polygon> polygons = getPolygonRepresentation();
- for (Polygon p : polygons) {
- p.draw(g, width, height);
- }
- }
-
- @Override
- public String toString() {
- return String.format("(f=%s)", getFitness());
- }
-
- public static Chromosome randomChromosome(int polygonLength, int polygonCount) {
- List<Polygon> list = new ArrayList<Polygon>(polygonCount);
- for (int j = 0; j < polygonCount; j++) {
- list.add(Polygon.randomPolygon(polygonLength));
- }
- return new PolygonChromosome(list);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/commons-numbers/blob/a960a5ca/src/userguide/java/org/apache/commons/math4/userguide/genetics/RandomPolygonMutation.java
----------------------------------------------------------------------
diff --git a/src/userguide/java/org/apache/commons/math4/userguide/genetics/RandomPolygonMutation.java b/src/userguide/java/org/apache/commons/math4/userguide/genetics/RandomPolygonMutation.java
deleted file mode 100644
index af7f0e2..0000000
--- a/src/userguide/java/org/apache/commons/math4/userguide/genetics/RandomPolygonMutation.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.complex.userguide.genetics;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.commons.complex.genetics.Chromosome;
-import org.apache.commons.complex.genetics.MutationPolicy;
-
-public class RandomPolygonMutation implements MutationPolicy {
-
- private float mutationRate;
- private float mutationAmount;
-
- public RandomPolygonMutation(float mutationRate, float mutationAmount) {
- this.mutationRate = mutationRate;
- this.mutationAmount = mutationAmount;
- }
-
- public Chromosome mutate(Chromosome chromosome) {
- if (!(chromosome instanceof PolygonChromosome)) {
- throw new IllegalArgumentException();
- }
-
- PolygonChromosome polygons = (PolygonChromosome) chromosome;
- List<Polygon> repr = polygons.getPolygonRepresentation();
-
- List<Polygon> newRepr = new ArrayList<Polygon>(repr.size());
- for (Polygon p : repr) {
- newRepr.add(p.mutate(mutationRate, mutationAmount));
- }
- return new PolygonChromosome(newRepr);
- }
-}