mirror of
				https://github.com/zenorogue/hyperrogue.git
				synced 2025-10-30 13:32:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			298 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			298 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // RogueViz -- SAG embedder: some experiments
 | |
| // Copyright (C) 2011-24 Zeno Rogue, see 'hyper.cpp' for details
 | |
| 
 | |
| #include "../rogueviz.h"
 | |
| 
 | |
| namespace rogueviz {
 | |
| namespace sag {
 | |
| 
 | |
| int recover_from;
 | |
| 
 | |
| vector<pair<dhrg::logistic, ld>> results;
 | |
| 
 | |
| ld bestcost;
 | |
| 
 | |
| int logid;
 | |
| int lastmethod = 0;
 | |
| int mul_used;
 | |
| 
 | |
| bool optimized_embedding(int mul, ld bonus = 0) {
 | |
|   if(logid < recover_from) { println(hlog, "skipped ", logid++, " due to recover"); return false; }
 | |
|   println(hlog, "starting, logid = ", logid, " recover_from = ", recover_from, " R = ", best.R+bonus, " T = ", best.T);
 | |
|   int DN = isize(sagid);
 | |
|   mul_used = mul;
 | |
|   lgsag_pre = best;
 | |
|   lgsag_pre.R += bonus;
 | |
|   lgsag = lgsag_pre;
 | |
|   compute_loglik_tab(); compute_cost();
 | |
|   dofullsa_iterations(mul * DN);
 | |
|   optimize_sag_loglik_logistic();
 | |
|   hlog.flush();
 | |
|   while(true) {
 | |
|     int ch = hillclimb();
 | |
|     println(hlog, "changes = ", ch, " cost = ", cost, " R=", lgsag.R, " T=", lgsag.T);
 | |
|     if(!ch) break;
 | |
|     optimize_sag_loglik_logistic();  
 | |
|     hlog.flush();
 | |
|     }
 | |
|   bool new_best = cost < bestcost;
 | |
|   if(new_best) best = lgsag, bestcost = cost;
 | |
|   sag::output_stats();
 | |
|   results.emplace_back(lgsag, cost);
 | |
|   return new_best;
 | |
|   }
 | |
| 
 | |
| void sag_new_experiment() {
 | |
|   view_each = 999999;
 | |
|   println(hlog, "SAG new experiment started");
 | |
|   int DN = isize(sagid);
 | |
|   println(hlog, "N = ", DN);
 | |
|   hlog.flush();
 | |
|   twoway = true; allow_doubles = true;
 | |
| 
 | |
|   method = smLogistic;
 | |
|   if(recover_from) lgsag = best;
 | |
|   if(!recover_from) lgsag.R = max_sag_dist;
 | |
|   if(!recover_from) lgsag.T = 1;
 | |
|   compute_loglik_tab();
 | |
|   compute_cost();
 | |
|   best = lgsag; bestcost = HUGE_VAL;
 | |
| 
 | |
|   for(int i=10; i<=1; i--)
 | |
|     optimized_embedding(15000, i);
 | |
|   for(int i=1; i<=10; i++)
 | |
|     optimized_embedding(15000);
 | |
|   for(int i=1; i<=10; i++)
 | |
|     optimized_embedding(15000, -i);
 | |
| 
 | |
|   optimized_embedding(24000);
 | |
|   optimized_embedding(32000);
 | |
|   optimized_embedding(40000);
 | |
|   optimized_embedding(48000);
 | |
|   optimized_embedding(60000);
 | |
|   optimized_embedding(80000);
 | |
|   optimized_embedding(100000);
 | |
|   optimized_embedding(120000);
 | |
|   optimized_embedding(120000);
 | |
|   optimized_embedding(120000);
 | |
|   }
 | |
| 
 | |
| void sag_v5() {
 | |
|   println(hlog, "SAG v5 started");
 | |
|   int DN = isize(sagid);
 | |
|   println(hlog, "N = ", DN);
 | |
|   recost_each = DN; autofix_rt = 2;
 | |
|   hlog.flush();
 | |
|   twoway = true; allow_doubles = true;
 | |
| 
 | |
|   method = smLogistic;
 | |
|   lgsag.R = max_sag_dist;
 | |
|   lgsag.T = 1;
 | |
|   compute_loglik_tab();
 | |
|   compute_cost();
 | |
|   best = lgsag; bestcost = HUGE_VAL;
 | |
| 
 | |
|   for(int i=0; i<30; i++) optimized_embedding(10000);
 | |
|   }
 | |
| 
 | |
| void sag_v6() {
 | |
|   println(hlog, "SAG v6 started");
 | |
|   int DN = isize(sagid);
 | |
|   println(hlog, "N = ", DN);
 | |
|   recost_each = DN; autofix_rt = 2;
 | |
|   hlog.flush();
 | |
|   twoway = true; allow_doubles = true;
 | |
| 
 | |
|   method = smLogistic;
 | |
|   lgsag.R = max_sag_dist;
 | |
|   lgsag.T = 1;
 | |
|   compute_loglik_tab();
 | |
|   compute_cost();
 | |
|   best = lgsag; bestcost = HUGE_VAL;
 | |
| 
 | |
|   for(int i=0; i<30; i++) optimized_embedding(100000);
 | |
| 
 | |
|   autofix_rt = 1;
 | |
|   for(int i=0; i<30; i++) optimized_embedding(100000);
 | |
| 
 | |
|   autofix_rt = 0;
 | |
|   for(int i=0; i<30; i++) optimized_embedding(100000);
 | |
|   }
 | |
| 
 | |
| void sag_test_mul() {
 | |
|   allow_doubles = true; twoway = true;
 | |
|   int DN = isize(sagid);
 | |
|   // lgsag.R=9.19925; lgsag.T=0.587723;
 | |
|   method = smLogistic;
 | |
|   lgsag.R = max_sag_dist;
 | |
|   lgsag.T = 1;
 | |
|   compute_loglik_tab();
 | |
|   compute_cost();
 | |
|   best = lgsag; bestcost = 999999;
 | |
|   recost_each = DN; autofix_rt = 2;
 | |
|   output_fullsa = false;
 | |
| 
 | |
|   println(hlog, "sag_test_mul started");
 | |
| 
 | |
|   if(1) for(int mul=25;; mul *= 2) for(int af: {3, 2, 1, 0}) {
 | |
|     autofix_rt = af;
 | |
|     ld tcost = 0;
 | |
|     ld tcost2 = 0;
 | |
|     int qty = 100;
 | |
|     vector<ld> costs;
 | |
|     // println(hlog, "R=", best.R, " T=", best.T);
 | |
|     for(int i=0; i<qty; i++) {
 | |
|       println(hlog, tie(mul, af, i));
 | |
|       lgsag = best; compute_loglik_tab(); compute_cost();
 | |
|       sag::dofullsa_iterations(mul * DN);
 | |
|       sag::optimize_sag_loglik_logistic();
 | |
|       checkmark_cost = HUGE_VAL;
 | |
|       while(sag::checkmark_hillclimb()) sag::optimize_sag_loglik_logistic();
 | |
|       tcost += cost;
 | |
|       tcost2 += cost * cost;
 | |
|       costs.push_back(cost);
 | |
|       bool new_best = cost < bestcost;
 | |
|       if(new_best) best = lgsag, bestcost = cost;
 | |
|       // println(hlog, "CSV;", mul, ";", af, ";", i, ";", cost);
 | |
|       }
 | |
|     sort(costs.begin(), costs.end());
 | |
|     println(hlog, "mul=", mul, " AF=", autofix_rt, " ECost=", tcost/qty, " sigma Cost = ", sqrt(tcost2/qty - tcost*tcost/qty/qty), " : ", costs);
 | |
|     }
 | |
| 
 | |
|   auto tpair = [&] (int lt, int ht) {
 | |
|     ld tcost = 0;
 | |
| 
 | |
|     for(int i=0; i<20; i++) {
 | |
| 
 | |
|       sagnode.clear();
 | |
|       sagnode.resize(isize(sagcells), -1);
 | |
|       for(int i=0; i<DN; i++) sagid[i] = i;
 | |
|       for(int i=0; i<DN; i++) sagnode[i] = i;
 | |
|       compute_cost();
 | |
| 
 | |
|       lowtemp = 20;
 | |
|       hightemp = 20;
 | |
|       sag::dofullsa_iterations(20 * DN);
 | |
| 
 | |
|       lowtemp = lt;
 | |
|       hightemp = ht;
 | |
|       sag::dofullsa_iterations(1000 * DN);
 | |
|       tcost += cost;
 | |
|       }
 | |
|     println(hlog, "lt=", lt, " ht=", ht, " tcost=", tcost);    
 | |
|     };
 | |
| 
 | |
|   if(false)
 | |
|   for(int lt: {-3, -5, -10, -15, -20, -25})
 | |
|   for(int ht: {-2, -1, 0, 1, 2, 5, 10})
 | |
|     tpair(lt, ht);
 | |
|   }
 | |
| 
 | |
| void write_colors(string s) {
 | |
|   auto_orth(true);
 | |
|   if(s == "-") return;
 | |
|   fhstream f(s, "wt");
 | |
|   for(int i=0; i<isize(vdata); i++) {
 | |
|     println(f, vdata[i].name, ",", format("%8x", vdata[i].cp.color1));
 | |
|     }
 | |
|   }
 | |
| 
 | |
| void sag_new_experiment_viz() {
 | |
|   view_each = 999999;
 | |
|   println(hlog, "SAG new experiment started");
 | |
|   int DN = isize(sagid);
 | |
|   println(hlog, "N = ", DN);
 | |
|   hlog.flush();
 | |
|   twoway = true; allow_doubles = true;
 | |
| 
 | |
|   method = smLogistic;
 | |
|   lgsag.R = max_sag_dist;
 | |
|   lgsag.T = 1;
 | |
|   compute_loglik_tab();
 | |
|   compute_cost();
 | |
|   best = lgsag; bestcost = HUGE_VAL;
 | |
| 
 | |
|   optimized_embedding(15000, 0);
 | |
|   optimized_embedding(15000, 0);
 | |
|   }
 | |
| 
 | |
| bool report_tempi = false;
 | |
| string auto_save;
 | |
| 
 | |
| void output_stats() {
 | |
|   if(auto_save != "" && cost < best_cost) {
 | |
|     println(hlog, "cost ", cost, " beats ", best_cost);
 | |
|     best_cost = cost;
 | |
|     sag::save_sag_solution(auto_save);
 | |
|     }
 | |
|   println(hlog, "solution: ", sagid);
 | |
|   int DN = isize(sagid);
 | |
|   auto [mAP, MeanRank] = compute_mAP();
 | |
|   dhrg::iddata routing_result;
 | |
|   if(!known_pairs) { known_pairs = true; dhrg::prepare_pairs(DN, [] (int i) { return edges_yes[i]; }); }
 | |
|   dhrg::greedy_routing(routing_result, [] (int i, int j) { return sagdist[sagid[i]][sagid[j]]; });
 | |
|   print(hlog, "CSV;", logid++, ";", isize(sagnode), ";", DN, ";", isize(sagedges), ";", lgsag_pre.R, ";", lgsag_pre.T, ";", lgsag.R, ";", lgsag.T, ";", cost, ";", mAP, ";", MeanRank, ";", routing_result.suc / routing_result.tot, ";", routing_result.routedist / routing_result.bestdist);
 | |
|   if(lastmethod) print(hlog, ";", lastmethod);
 | |
|   if(mul_used) print(hlog, ";", mul_used);
 | |
|   if(report_tempi) print(hlog, ";", hightemp,";",lowtemp,";",format("%lld", numiter));
 | |
|   println(hlog);
 | |
|   }
 | |
| 
 | |
| int exp_read_args() {
 | |
| #if CAP_COMMANDLINE
 | |
|   using namespace arg;
 | |
| 
 | |
|   if(0) ;
 | |
| 
 | |
|   else if(argis("-sag-new")) sag_new_experiment();
 | |
|   else if(argis("-sag-v5")) sag_v5();
 | |
|   else if(argis("-sag-v6")) sag_v6();
 | |
|   else if(argis("-sag-new-viz")) sag_new_experiment_viz();
 | |
|   else if(argis("-sag-test-mul")) sag_test_mul();
 | |
|   else if(argis("-sag-write-colors")) {
 | |
|     shift(); write_colors(args());
 | |
|     }
 | |
| 
 | |
|   else if(argis("-sag-recover")) {
 | |
|     shift(); best.R = argf();
 | |
|     shift(); best.T = argf();
 | |
|     shift(); bestcost = argf();
 | |
|     shift(); recover_from = argi();
 | |
|     println(hlog, "set recover_from to ", recover_from);
 | |
|     // 58.6509;7.08961;26492.1
 | |
|     }
 | |
| 
 | |
|   else if(argis("-sag-load-solution")) {
 | |
|     PHASE(3); shift(); sag::load_sag_solution_basic(args());
 | |
|     method = smLogistic;
 | |
|     lgsag.R = max_sag_dist;
 | |
|     lgsag.T = 1;
 | |
|     opt_debug = true;
 | |
|     twoway = true; allow_doubles = true;
 | |
|     optimize_sag_loglik_auto();
 | |
|     }
 | |
| 
 | |
|   else if(argis("-sagstats-logid")) {
 | |
|     shift(); logid = argi();
 | |
|     }
 | |
|   else if(argis("-sag0")) {
 | |
|     sag::report_tempi = true;
 | |
|     numiter = 0;
 | |
|     }
 | |
|   else if(argis("-sagsave-auto")) {
 | |
|     PHASE(3); shift(); auto_save = args();
 | |
|     }
 | |
|   else if(argis("-sagstats")) {
 | |
|     output_stats();
 | |
|     }
 | |
| 
 | |
|   else return 1;  
 | |
| #endif
 | |
|   return 0;
 | |
|   }
 | |
| 
 | |
| int ahexp = addHook(hooks_args, 100, exp_read_args);
 | |
| 
 | |
| }
 | |
| }
 | 
