checkpoint
[anneal.git] / src / edu / berkeley / qfat / Main.java
index 03ca6dc..d085fd9 100644 (file)
@@ -267,6 +267,7 @@ public class Main extends MeshViewer {
     }
 
     public void breakit() {
+        /*
         int oldverts = verts;
         System.out.println("doubling vertices.");
         PriorityQueue<Mesh.E> es = new PriorityQueue<Mesh.E>();
@@ -286,6 +287,7 @@ public class Main extends MeshViewer {
             repaint();
         }
         tile.rebindPoints();
+        */
     }
 
     public synchronized void rand(float temp, Mesh.Vertex p) {
@@ -294,7 +296,7 @@ public class Main extends MeshViewer {
         double tile_error = tile.error();
         double goal_error = goal.error();
 
-        float max = p.averageEdgeLength()/30;
+        float max = p.averageEdgeLength()/10;
         Vec v = new Vec(random.nextFloat(), random.nextFloat(), random.nextFloat());
         v = v.norm().times((random.nextFloat() - 0.5f) * max);
         //System.out.println(max + " " + p.averageEdgeLength() + " " + v.mag());
@@ -303,14 +305,12 @@ public class Main extends MeshViewer {
         boolean good = p.move(m, false);
         if (!good) { misses++; return; }
 
-        p.reComputeErrorAround();
-
         double new_tile_error = tile.error();
         double new_goal_error = goal.error();
         double tile_delta = (new_tile_error - tile_error) / tile_error;
         double goal_delta = (new_goal_error - goal_error) / goal_error;
         double delta = tile_delta + goal_delta;
-        double swapProbability = Math.exp((-1 * delta) / (((double)temp)/10000));
+        double swapProbability = Math.exp((-1 * delta) / (((double)temp)/1000000));
         boolean doSwap = good && (Math.random() < swapProbability);
         //boolean doSwap = good && (tile_delta <= 0 && goal_delta <= 0);
         //boolean doSwap = good && (tile_delta + goal_delta <= 0);
@@ -346,20 +346,21 @@ public class Main extends MeshViewer {
                 if (breaks > 0) {
                     while (breaks>0) {
                         breaks--;
-                        breakit();
+                        //breakit();
                     }
-                    seek_upward = true;
+                    //seek_upward = true;
                 } else if (acceptance > 0.96) gamma = 0.4f;
                 else if (acceptance > 0.9)    gamma = 0.5f;
                 else if (acceptance > 0.8)    gamma = 0.65f;
                 else if (acceptance > 0.6)    gamma = 0.7f;
-                else if (acceptance > 0.3)    gamma = 0.9f;
-                else if (acceptance > 0.15)   gamma = 0.95f;
-                else if (acceptance > 0.10)   gamma = 0.98f;
+                else if (acceptance > 0.3)    gamma = 0.8f;
+                else if (acceptance > 0.15)   gamma = 0.9f;
+                else if (acceptance > 0.05)   gamma = 0.95f;
+                else if (acceptance > 0.01)   gamma = 0.98f;
                 else breaks++;
 
                 if (seek_upward) {
-                    if (acceptance > 0.3) seek_upward = false;
+                    if (acceptance > 0.2) seek_upward = false;
                     else gamma = 2-gamma;
                 }
 
@@ -383,6 +384,23 @@ public class Main extends MeshViewer {
                     Thread.yield();
                     repaint();
                 }
+                PriorityQueue<Mesh.E> es = new PriorityQueue<Mesh.E>();
+                for(Mesh.T t : tile) {
+                    float max = 5;
+                    for(Mesh.E e : new Mesh.E[] { t.e1(), t.e2(), t.e3() }) {
+                        if (e==null) continue;
+                        if (e.stretchRatio() > max) es.add(e);
+                        if (t.aspect() < 0.1) es.add(e);
+                    }
+                }
+
+                for(int i=0; i<1; i++) {
+                    Mesh.E e = es.poll();
+                    if (e==null) break;
+                    e.shatter();
+                }
+                tile.rebindPoints();
+
                 System.out.println("temp="+temp + " ratio="+(Math.ceil(acceptance*100)) + " " +
                                    "points_per_second=" +
                                    (count*1000)/((double)(System.currentTimeMillis()-then)));