package edu.stanford.rsl.conrad.fitting.test; import ij.ImageJ; import java.util.Random; import org.junit.Test; import edu.stanford.rsl.conrad.fitting.ConstrainedRANSACFittedFunction; import edu.stanford.rsl.conrad.fitting.GaussianFunction; import edu.stanford.rsl.conrad.fitting.LinearFunction; import edu.stanford.rsl.conrad.fitting.RANSACFittedFunction; import edu.stanford.rsl.conrad.utils.VisualizationUtil; /** * Class to test the functions. * @author akmaier * */ public class FunctionTest { /** Here we test RANSAC. * We produce a data set that has a couple of outliers * Most of the data to reflect the correct model parameters * On average RANSAC will do better on this test. * Try and have fun! */ @Test public void testRANSAC(){ new ImageJ(); int cardinality = 1000; double noise = 500; double x[] = new double [cardinality]; double y[] = new double [cardinality]; LinearFunction input = new LinearFunction(); input.setM(0.5); input.setT(1.5); Random random = new Random(); GaussianFunction gf = new GaussianFunction(); gf.setMu(0); gf.setSigma(1.0); for (int i =0;i<cardinality; i++){ x[i] = i; y[i] = input.evaluate(x[i]) + (gf.evaluate((random.nextDouble()-.05)*100)/gf.evaluate(0) * noise)*(random.nextDouble()-.5); } VisualizationUtil.createScatterPlot("Linear Fit", x, y, new LinearFunction()).show(); RANSACFittedFunction ransac = new RANSACFittedFunction( new LinearFunction()); ransac.setEpsilon(1); ransac.setNumberOfTries(10000); VisualizationUtil.createScatterPlot("RANSAC Linear Fit", x, y, ransac).show(); try { Thread.sleep(1000000000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** Here we test constrained RANSAC. * We produce a data set that has many outliers * Most of the data to reflect the correct model parameters * On average RANSAC will do better on this test. * Try and have fun! */ @Test public void testConstrainedRANSAC(){ new ImageJ(); int cardinality = 1000; double noise = 500; double x[] = new double [cardinality]; double y[] = new double [cardinality]; LinearFunction input = new LinearFunction(); input.setM(0.5); input.setT(1.5); Random random = new Random(); GaussianFunction gf = new GaussianFunction(); gf.setMu(0); gf.setSigma(1.0); for (int i =0;i<cardinality; i++){ x[i] = i; y[i] = input.evaluate(x[i]) + (gf.evaluate((random.nextDouble()-.5)*2)/gf.evaluate(0) * noise)*(random.nextDouble()-.5); } VisualizationUtil.createScatterPlot("Linear Fit", x, y, new LinearFunction()).show(); ConstrainedRANSACFittedFunction ransac = new ConstrainedRANSACFittedFunction( new LinearFunction()); ransac.setEpsilon(10); ransac.setNumberOfTries(10000); ransac.setLowerbound(new double[] {0.25, 1}); ransac.setUpperbound(new double[] {0.75, 2}); VisualizationUtil.createScatterPlot("Constrained RANSAC Linear Fit", x, y, ransac).show(); RANSACFittedFunction ransac2 = new RANSACFittedFunction( new LinearFunction()); ransac2.setEpsilon(10); ransac2.setNumberOfTries(10000); VisualizationUtil.createScatterPlot("RANSAC Linear Fit", x, y, ransac2).show(); try { Thread.sleep(1000000000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }