diff --git a/rogueviz/embeddings/embeddings.cpp b/rogueviz/embeddings/embeddings.cpp index 03cd748e..72fc6a69 100644 --- a/rogueviz/embeddings/embeddings.cpp +++ b/rogueviz/embeddings/embeddings.cpp @@ -104,10 +104,19 @@ string embedding::get_space() { return ss.s; } +void set_missing_edges(ld x) { + missing_edges = x; + log_missing_edges = log(x); + remaining_edges = 1 - x; + log_remaining_edges = log(1 - x); + } + int a = arg::add3("-edgelist", [] { arg::shift(); read_edgelist(arg::args()); }) + addHook(hooks_gamedata, 230, store_gamedata) + arg::add3("-write-edges", [] { arg::shift(); write_edgelist(arg::args()); }) + arg::add3("-esaveas", [] { arg::shift(); esave(arg::args()); }) + + arg::add3("-missing-edges", [] { arg::shift(); set_missing_edges(arg::argf()); }) + + arg::add3("-missing-edges-env", [] { auto env = std::getenv("MISSING_EDGES"); if(env) set_missing_edges(atof(env)); }) + arg::add3("-el-rv", [] { if(rogueviz::rv_quality == 0) force_rvgraph(); current = std::make_shared (); }); } diff --git a/rogueviz/embeddings/embeddings.h b/rogueviz/embeddings/embeddings.h index afbc8ede..b7133f17 100644 --- a/rogueviz/embeddings/embeddings.h +++ b/rogueviz/embeddings/embeddings.h @@ -34,16 +34,22 @@ struct untiled_embedding : embedding { extern shared_ptr current; +inline ld missing_edges = 0, remaining_edges = 1, log_missing_edges = log(0), log_remaining_edges = 0; + /* for logistic regression */ struct logistic { ld R, T; - ld yes1(ld d) { return 1/(1 + exp(d)); } - ld no1(ld d) { return 1/(1 + exp(-d)); } + ld nor(ld d) { return (d-R) / 2 / T; } + + ld yes1(ld d) { return remaining_edges /(1 + exp(d)); } + ld no1(ld d) { return missing_edges + remaining_edges /(1 + exp(-d)); } + ld lyes(ld d) { d = nor(d); return d > 200 ? -d + log_remaining_edges : log(yes1(d)); } + ld lno(ld d) { d = nor(d); return d < -200 ? max(d, log_missing_edges) : log(no1(d)); } + ld yes(ld d) { return yes1(nor(d)); } ld no(ld d) { return no1(nor(d)); } - ld lyes(ld d) { d = nor(d); return d > 200 ? -d : log(yes1(d)); } - ld lno(ld d) { d = nor(d); return d < -200 ? d : log(no1(d)); } + logistic() {} logistic(ld _R, ld _T) : R(_R), T(_T) {} void setRT(ld _R, ld _T) { R = _R; T = _T; }