#include "../rogueviz.h" #include #include namespace rogueviz { namespace sag { bool embedding; dhrg::logistic lgemb(1, 1); vector placement; int embiter; ld pdist(int i, int j) { return pdist(placement[i], placement[j]); }; void disttable_add(ld dist, int qty0, int qty1) { using namespace dhrg; size_t i = dist * llcont_approx_prec; constexpr array zero = {0, 0}; while(disttable_approx.size() <= i) disttable_approx.push_back(zero); disttable_approx[i][0] += qty0; disttable_approx[i][1] += qty1; } void compute_loglik() { dhrg::llcont_approx_prec = 10; dhrg::disttable_approx.clear(); int DN = isize(sagid); for(int i=0; i(f); int id; if(!labeler.count(lab)) { printf("unknown vertex: %s\n", lab.c_str()); continue; } else id = getid(lab); ld alpha, r; if(1) { dynamicval g(geometry, gNormal); hyperpoint h; for(int d=0; d(f); alpha = atan2(h); r = hdist0(h); println(hlog, "read ", lab, " as ", h, " which is ", tie(alpha, r)); } placement[id] = direct_exp(cspin(0, 2, alpha) * ctangent(0, r)); println(hlog, "dist = ", pdist(placement[id], C0), " expected: ", r); } } else if(informat == 3) { /* BFKL */ string ignore; if(!scan(f, ignore, ignore, ignore, ignore, ignore, ignore, ignore, ignore)) { printf("Error: incorrect format of the first line\n"); exit(1); } while(true) { string lab = scan(f); if(lab == "" || lab == "#ROGUEVIZ_ENDOFDATA") break; ld r, alpha; if(!scan(f, r, alpha)) { printf("Error: incorrect format of r/alpha\n"); exit(1); } hyperpoint h = spin(alpha * degree) * xpush0(r); if(!labeler.count(lab)) { printf("unknown vertex: %s\n", lab.c_str()); } else { int id = getid(lab); placement[id] = h; } } } else if(informat == 4) { while(true) { string lab = scan(f); if(lab == "") break; ld r, alpha; if(!scan(f, r, alpha)) { printf("Error: incorrect format of r/alpha\n"); exit(1); } hyperpoint h = spin(alpha) * xpush0(r); if(!labeler.count(lab)) { printf("unknown vertex: %s\n", lab.c_str()); } else { int id = getid(lab); placement[id] = h; } } } else { while(!feof(f.f)) { string lab = scan(f); int id; if(!labeler.count(lab)) { printf("unknown vertex: %s\n", lab.c_str()); continue; } else id = getid(lab); hyperpoint h; for(int d=0; d(f); placement[id] = h; } } reassign_embedding(); compute_loglik(); } int embturn = 1; void embedding_iterate() { int t1 = SDL_GetTicks(); for(int i=0; i 200) embturn = (embturn + 1) / 2; else embturn = (embturn * 100 + (t-1)) / t; compute_loglik(); if(auto_visualize) reassign_embedding(); } int embed_read_args() { #if CAP_COMMANDLINE using namespace arg; if(0) ; else if(argis("-sagembed")) { sag::embedding = true; } else if(argis("-sagembedoff")) { sag::embedding = false; } else if(argis("-sagsavee")) { PHASE(3); shift(); sag::save_embedding(args()); } else if(argis("-sagloade")) { PHASE(3); shift(); sag::load_embedding(args()); } else return 1; #endif return 0; } int ahembed = addHook(hooks_args, 100, embed_read_args); } }