chiark / gitweb /
fake plastic imitation weights for XBITS==5
[moebius2.git] / minimise.c
index e5bbc87bb6e3523ec43cd50b9665a80aae281b96..d07af5e4e5549f429a28445febb6fdc77ff1f4ba 100644 (file)
 #include "half.h"
 #include "minimise.h"
 
-const char *input_file, *output_file;
-char *output_file_tmp;
+const char *input_file, *best_file;
+char *best_file_tmp;
+long long evaluations;
+double stop_epsilon= 1e-20;
 
 static void printing_init(void);
 
 static gsl_multimin_fminimizer *minimiser;
-
-static const double stop_epsilon= 1e-6;
+static const char *final_file;
+static char *final_file_tmp;
 
 static double minfunc_f(const gsl_vector *x, void *params) {
   struct Vertices vs;
@@ -55,6 +57,11 @@ static double minfunc_f(const gsl_vector *x, void *params) {
   return compute_energy(&vs);
 }
 
+static void badusage(void) {
+  fputs("usage: minimise <input> [-i<intermediate>] -o<output\n",stderr);
+  exit(8);
+}
+
 int main(int argc, const char *const *argv) {
   gsl_multimin_function multimin_function;
   double size;
@@ -64,12 +71,22 @@ int main(int argc, const char *const *argv) {
   gsl_vector initial_gsl, step_size_gsl;
   int r, i;
 
-  if (argc!=3 || argv[1][0]=='-' || strncmp(argv[2],"-o",2))
-    { fputs("usage: minimise <input> -o<output\n",stderr); exit(8); }
+  if (argc==3) {
+    input_file= argv[1];
+    if (strncmp(argv[2],"-o",2)) badusage();   best_file= argv[2]+2;
+    final_file= 0;
+  } else if (argc==4) {
+    input_file= argv[1];
+    if (strncmp(argv[2],"-i",2)) badusage();   best_file= argv[2]+2;
+    if (strncmp(argv[3],"-o",2)) badusage();   final_file= argv[3]+2;
+  } else {
+    badusage();
+  }
+  if (argv[1][0]=='-') badusage();
 
-  input_file= argv[1];
-  output_file= argv[2]+2;
-  if (asprintf(&output_file_tmp,"%s.new",output_file) <= 0) diee("asprintf");
+  if (asprintf(&best_file_tmp,"%s.new",best_file) <= 0) diee("asprintf");
+  if (final_file)
+    if (asprintf(&final_file_tmp,"%s.new",final_file) <= 0) diee("asprintf");
 
   graph_layout_prepare();
   printing_init();
@@ -112,13 +129,21 @@ int main(int argc, const char *const *argv) {
     size= gsl_multimin_fminimizer_size(minimiser);
     r= gsl_multimin_test_size(size, stop_epsilon);
 
-    if (printing_check(pr_size,155))
-      printf("size %# e, r=%d\n", size, r);
+    if (printing_check(pr_size,215))
+      printf("r=%2d, size %# e\n", r, size);
     flushoutput();
 
     if (r==GSL_SUCCESS) break;
     assert(r==GSL_CONTINUE);
   }
+
+  if (final_file) {
+    if (unlink(final_file_tmp) && errno != ENOENT) diee("unlink final .tmp");
+    if (link(best_file,final_file_tmp)) diee("link final .tmp");
+    if (rename(final_file_tmp,final_file)) diee("install final");
+  }
+  printf("FINISHED (%lld evaluations)\n",evaluations);
+  
   return 0;
 }
 
@@ -142,9 +167,10 @@ int printing_check(enum printing_instance which, int indent) {
   print_todo &= ~bits;
   sigprocmask(SIG_UNBLOCK,&print_alarmset,0);
 
+  printf("%*s",indent,"");
   sk= skipped[which];
-  if (sk) printf("%*s[%4d] ",indent,"", sk);
-  else printf("       ");
+  if (sk) printf("[%4d] ",sk);
+  else printf("      ");
   skipped[which]= 0;
 
   return 1;