/sigmah/src/test/java/org/sigmah/server/report/generator/map/ComplexClusterTest.java

http://sigma-h.googlecode.com/ · Java · 134 lines · 79 code · 37 blank · 18 comment · 9 complexity · e703204cf2850e9ecfb03e1eab90cdde MD5 · raw file

  1. /*
  2. * All Sigmah code is released under the GNU General Public License v3
  3. * See COPYRIGHT.txt and LICENSE.txt.
  4. */
  5. package org.sigmah.server.report.generator.map;
  6. import org.junit.Assert;
  7. import org.junit.Ignore;
  8. import org.junit.Test;
  9. import java.io.BufferedWriter;
  10. import java.io.FileWriter;
  11. import java.util.ArrayList;
  12. import java.util.List;
  13. /**
  14. * @author Alex Bertram
  15. */
  16. public class ComplexClusterTest extends GraphTest {
  17. private static final double DELTA = 0.0001;
  18. @Test
  19. @Ignore("quite slow")
  20. public void dump2dBruteForce() throws Exception {
  21. ComplexPoints data = new ComplexPoints();
  22. FitnessFunctor fitFtor = new CircleFitnessFunctor();
  23. GsLogCalculator rCtor = new GsLogCalculator(5, 30);
  24. BufferedWriter csv = new BufferedWriter(new FileWriter("target/report-tests/brute.csv"));
  25. List<List<MarkerGraph.Node>> subgraphs = data.getLargestN(2);
  26. // write column headers
  27. for (int j = 0; j != subgraphs.get(0).size(); ++j) {
  28. csv.write("," + (j + 1));
  29. }
  30. csv.newLine();
  31. // write rows
  32. for (int i = 1; i <= subgraphs.get(0).size(); ++i) {
  33. // write row header
  34. csv.write(Integer.toString(i));
  35. // write cell values
  36. for (int j = 1; j <= subgraphs.get(1).size(); ++j) {
  37. List<Cluster> clusters = new ArrayList<Cluster>();
  38. clusters.addAll(KMeans.cluster(subgraphs.get(0), i));
  39. clusters.addAll(KMeans.cluster(subgraphs.get(1), j));
  40. rCtor.calculate(clusters);
  41. csv.write(Double.toString(fitFtor.score(clusters)));
  42. }
  43. csv.newLine();
  44. }
  45. csv.close();
  46. }
  47. @Test
  48. public void testUpperBounds() throws Exception {
  49. ComplexPoints data = new ComplexPoints();
  50. List<Integer> ub = UpperBoundsCalculator.calculate(data.graph, new FixedRadiiCalculator(5),
  51. new UpperBoundsCalculator.Tracer() {
  52. public void onSubgraph(int nodeCount) {
  53. System.out.println("Calculating upperbounds for subgraph with " + nodeCount + " node(s)");
  54. }
  55. public void incremented(int count, List<Cluster> clusters, double fitness) {
  56. System.out.println(count + " cluster(s) = " + fitness);
  57. }
  58. });
  59. // Assert.assertEquals(23, ub.get(0));
  60. // Assert.assertEquals(9, ub.get(1));
  61. }
  62. @Test
  63. public void testComplexCluster() throws Exception {
  64. ComplexPoints data = new ComplexPoints();
  65. saveGraphImage("ComplexClusterTest-graph", data.graph, 15);
  66. GsLogCalculator radiiCalc = new GsLogCalculator(5, 10);
  67. double sumAfterMerging = 0;
  68. for (MarkerGraph.Node node : data.graph.getNodes()) {
  69. sumAfterMerging += node.getPointValue().value;
  70. }
  71. Assert.assertEquals("originalSum==sumAfterMerging", data.originalSum, sumAfterMerging, DELTA);
  72. // becuase the algorithm is stochiastic, we want need to make sure
  73. // it works consistently
  74. int count = 10;
  75. while (count-- > 0) {
  76. GeneticSolver solver = new GeneticSolver();
  77. solver.setTracer(new GeneticTracer());
  78. List<Cluster> clusters = solver.solve(data.graph, radiiCalc, new CircleFitnessFunctor(),
  79. UpperBoundsCalculator.calculate(data.graph, new FixedRadiiCalculator(5)));
  80. double sumAfterClustering = 0;
  81. for (Cluster cluster : clusters) {
  82. sumAfterClustering += cluster.sumValues();
  83. }
  84. Assert.assertEquals("originalSum==sumAfterClustering", data.originalSum, sumAfterClustering, DELTA);
  85. if (count == 0) {
  86. saveClusters(data.graph, "ComplexClusterTest-solution", clusters);
  87. }
  88. System.out.println(String.format("pop size = %d", solver.getPopulation().size()));
  89. System.out.println(String.format("subgraph count = %d", data.graph.getSubgraphs().size()));
  90. System.out.println(String.format("cluster count = %d", clusters.size()));
  91. System.out.println(String.format("fitness = %f", solver.getSolutionFitness()));
  92. // TODO: this seems to be successful about 75% of the time. We need to move that to 100%
  93. // and reduce variation
  94. //Assert.assertTrue("Did not meet success criteria at run "+ count, solver.getSolutionFitness() > 5000);
  95. }
  96. }
  97. }