From 18abde5b4c3ac1184653e5fa86cc92757de45195 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Sun, 6 Sep 2026 15:51:42 +0200 Subject: [PATCH] rogueviz:: embeddings:: node importance/rendered, bhyper-reduced representation --- rogueviz/embeddings/coords.cpp | 15 ++++++++++++-- rogueviz/embeddings/embeddings.cpp | 32 +++++++++++++++++++++++++++++- rogueviz/embeddings/embeddings.h | 7 +++++++ 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/rogueviz/embeddings/coords.cpp b/rogueviz/embeddings/coords.cpp index a0017f39..c644fa9b 100644 --- a/rogueviz/embeddings/coords.cpp +++ b/rogueviz/embeddings/coords.cpp @@ -3,9 +3,9 @@ namespace rogueviz { namespace embeddings { - enum class fmt { hyperb, poincare, bhyper }; + enum class fmt { hyperb, poincare, bhyper, bhyper_reduced }; - string format_names[3] = { "hyperboloid trailing", "Poincare", "hyperboloid leading" }; + string format_names[4] = { "hyperboloid trailing", "Poincare", "hyperboloid leading", "hyperboloid leading reduced" }; fmt coord_format; @@ -36,6 +36,8 @@ namespace embeddings { println(f, format("%.20lf", co[MDIM-1])); for(int i=0; i(f); if(s == "") throw hr_exception("data failure"); @@ -77,6 +81,12 @@ namespace embeddings { co[MDIM-1] = scan(f); for(int i=0; i(f); break; + case fmt::bhyper_reduced: + scan(f); + for(int i=0; i<3; i++) co[i] = scan(f); + node_importance[id] = hypot_d(3, co); + co = normalize(co); + break; case fmt::poincare: hyperpoint h1; for(int i=0; i(f); @@ -92,6 +102,7 @@ namespace embeddings { arg::add3("-el-coord", [] { arg::shift(); read_coord(arg::args()); }) + arg::add3("-ec-hyperb", [] { coord_format = fmt::hyperb; }) + arg::add3("-ec-bhyper", [] { coord_format = fmt::bhyper; }) + + arg::add3("-ec-bhyper-reduced", [] { coord_format = fmt::bhyper_reduced; }) + arg::add3("-ec-poincare", [] { coord_format = fmt::poincare; }); } diff --git a/rogueviz/embeddings/embeddings.cpp b/rogueviz/embeddings/embeddings.cpp index f739f7fc..def2649b 100644 --- a/rogueviz/embeddings/embeddings.cpp +++ b/rogueviz/embeddings/embeddings.cpp @@ -22,6 +22,8 @@ edgetype *ensure_edge() { return any; } +vector importance; + struct rv_embedding : public tiled_embedding { virtual string name() override { return "RogueViz internal representation"; } pair as_location(int id) override { @@ -46,6 +48,7 @@ void read_edgelist(const string& fname) { rv_hook(hooks_clearmemory, 100, [] { directed_edges.clear(); current = nullptr; + any = nullptr; }); ensure_edge(); @@ -97,12 +100,38 @@ void write_edgelist(const string &fname) { void force_rvgraph() { for(auto& v: vdata) if(v.id < get_n()) { auto p = current->as_location(v.id); - v.be(p.first, rgpushxto0(p.second)); + if(get_node_rendered(v.id)) + v.be(p.first, rgpushxto0(p.second)); + else + v.be_nowhere(); + } + } + +vector node_importance; +vector node_rendered; +ld render_radius; + +void recompute_rendered() { + if(render_radius > 0) { + int N = get_n(); + vector order; + for(int i=0; i sofar; + node_rendered.resize(N); + for(auto i: order) { + bool ok = true; + auto h1 = current->as_hyperpoint(i); + for(auto h0: sofar) if(hdist(h0, h1) < render_radius) { ok = false; break; } + node_rendered[i] = ok; + if(ok) sofar.push_back(h1); + } } } void reenable_embedding() { eval.current = false; + recompute_rendered(); if(rogueviz::rv_quality >= 1 && among(current->get_dimension(), 2, 3) && current->get_dimension() <= WDIM) force_rvgraph(); } @@ -141,6 +170,7 @@ int a = arg::add3("-edgelist", [] { arg::shift(); read_edgelist(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 (); }) + + arg::add3("-render-radius", [] { arg::shift_arg_formula(render_radius); }) + arg::add3("-edge-arrow", [] { arg::shift(); any->arrow_scale = arg::argf(); }); diff --git a/rogueviz/embeddings/embeddings.h b/rogueviz/embeddings/embeddings.h index aa708f56..984cd976 100644 --- a/rogueviz/embeddings/embeddings.h +++ b/rogueviz/embeddings/embeddings.h @@ -112,6 +112,13 @@ extern struct evaltype { bool symmetric; } eval; +extern vector node_importance; +extern vector node_rendered; +extern ld render_radius; + +inline ld get_node_importance(int i) { if(node_importance.empty()) return 0; else return node_importance[i]; } +inline ld get_node_rendered(int i) { if(node_rendered.empty()) return true; else return node_rendered[i]; } + void symmetrize(); }