checkpoint
[anneal.git] / src / edu / berkeley / qfat / Main.java
index f51c772..d085fd9 100644 (file)
@@ -266,7 +266,8 @@ public class Main extends MeshViewer {
         goal.error_against = tile;
     }
 
-    public synchronized void breakit() {
+    public void breakit() {
+        /*
         int oldverts = verts;
         System.out.println("doubling vertices.");
         PriorityQueue<Mesh.E> es = new PriorityQueue<Mesh.E>();
@@ -274,50 +275,42 @@ public class Main extends MeshViewer {
             es.add(t.e1());
             es.add(t.e2());
             es.add(t.e3());
+            Thread.yield();
+            repaint();
         }
-        for(int i=0; i<oldverts; i++) {
+        for(int i=0; i<Math.min(oldverts,200); i++) {
             Mesh.E e = es.poll();
             verts++;
             //System.out.println("shatter " + e);
             e.shatter();
+            Thread.yield();
+            repaint();
         }
         tile.rebindPoints();
+        */
     }
 
     public synchronized void rand(float temp, Mesh.Vertex p) {
 
-        //p.reComputeError();
         p.reComputeErrorAround();
         double tile_error = tile.error();
         double goal_error = goal.error();
 
-        Vec v;
-        /*
-          Matrix inv = p.errorQuadric();
-          v = new Vec(inv.d, inv.h, inv.l).norm().times(1/(float)300);
-          if (p.quadric_count == 0) {
-          v = goal.nearest(p.p).p.minus(p.p).norm().times(1/(float)300);
-          }
-        */
-        Vec v2 = new Vec((random.nextFloat() - (float)0.5) / 500,
-                         (random.nextFloat() - (float)0.5)  / 500,
-                         (random.nextFloat() - (float)0.5)  / 500);
-        //v = v.plus(v2.norm().times(1/(float)300));
-        v = v2.norm().times(1/(float)300);
-
+        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());
         Matrix m = Matrix.translate(v);
 
         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) / temp);
+        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);
@@ -335,57 +328,42 @@ public class Main extends MeshViewer {
     float hits = 0;
     float misses = 0;
     public void anneal() throws Exception {
-        float hightemp = 10;
+        float hightemp = 1;
         float temp = hightemp;
         float last = 10;
-        float lastbreak = 10;
+        boolean seek_upward = false;
+        double acceptance = 1;
         while(true) {
             synchronized(this) {
                 double ratio = (hits+misses==0) ? 1 : (hits / (hits+misses));
                 hits = 0;
                 misses = 0;
-                float gamma = 0;
-                double acceptance = ratio;
+                float gamma = 1;
+                acceptance = (ratio+acceptance)/2;
                 accepts = (int)(Math.ceil(ratio*100));
                 temps = (int)(Math.ceil(temp*1000));
                 vertss = tile.size();
-                if (breaks > 0) { while (breaks>0) {
+                if (breaks > 0) {
+                    while (breaks>0) {
                         breaks--;
-                        breakit();
-                        //gamma = 1;
-                        float t = temp;
-                        temp = lastbreak;
-                        gamma = 1;
-                        lastbreak = t;
-                        //temp = last * 0.8f;
-                        //last = temp;
-                        //temp = hightemp;
-                    } } 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 {
-                            breakit();
-                        float t = temp;
-                        temp = lastbreak;
-                        gamma = 1;
-                        lastbreak = t;
-                            //gamma = 1;
-                        //gamma = 0.99f;
-                            //gamma = 1;
-                            //temp = last * 0.8f;
-                            //last = temp;
-                            //temp = hightemp;
-                        }
+                        //breakit();
                     }
+                    //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.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.2) seek_upward = false;
+                    else gamma = 2-gamma;
+                }
+
                 temp = temp * gamma;
 
 
@@ -406,7 +384,24 @@ public class Main extends MeshViewer {
                     Thread.yield();
                     repaint();
                 }
-                System.out.println("temp="+temp + " ratio="+(Math.ceil(ratio*100)) + " " +
+                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)));