rogueviz:: embeddings:: node importance/rendered, bhyper-reduced representation

This commit is contained in:
Zeno Rogue
2026-09-06 15:51:42 +02:00
parent 0df26d76a5
commit 18abde5b4c
3 changed files with 51 additions and 3 deletions
+13 -2
View File
@@ -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<MDIM-1; i++) println(f, format("%.20lf", co[i]));
break;
case fmt::bhyper_reduced:
throw hr_exception("cannot save reduced embedding format");
case fmt::poincare:
auto h1 = space_to_perspective(co, 1);
for(int i=0; i<MDIM-1; i++) println(f, format("%.20lf", h1[i]));
@@ -64,6 +66,8 @@ namespace embeddings {
fhstream f(fn, "rt");
if(!f.f) return file_error(fn);
if(coord_format == fmt::bhyper_reduced) node_importance.resize(N);
for(int i=0; i<N; i++) {
string s = scan<string>(f);
if(s == "") throw hr_exception("data failure");
@@ -77,6 +81,12 @@ namespace embeddings {
co[MDIM-1] = scan<ld>(f);
for(int i=0; i<MDIM-1; i++) co[i] = scan<ld>(f);
break;
case fmt::bhyper_reduced:
scan<ld>(f);
for(int i=0; i<3; i++) co[i] = scan<ld>(f);
node_importance[id] = hypot_d(3, co);
co = normalize(co);
break;
case fmt::poincare:
hyperpoint h1;
for(int i=0; i<MDIM-1; i++) h1[i] = scan<ld>(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; });
}
+31 -1
View File
@@ -22,6 +22,8 @@ edgetype *ensure_edge() {
return any;
}
vector<ld> importance;
struct rv_embedding : public tiled_embedding {
virtual string name() override { return "RogueViz internal representation"; }
pair<cell*, hyperpoint> 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<ld> node_importance;
vector<bool> node_rendered;
ld render_radius;
void recompute_rendered() {
if(render_radius > 0) {
int N = get_n();
vector<int> order;
for(int i=0; i<N; i++) order.push_back(i);
sort(order.begin(), order.end(), [] (int i, int j) { return pair(get_node_importance(i), i) < pair(get_node_importance(j), j); });
vector<hyperpoint> 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<rv_embedding> (); })
+ arg::add3("-render-radius", [] { arg::shift_arg_formula(render_radius); })
+ arg::add3("-edge-arrow", [] {
arg::shift(); any->arrow_scale = arg::argf();
});
+7
View File
@@ -112,6 +112,13 @@ extern struct evaltype {
bool symmetric;
} eval;
extern vector<ld> node_importance;
extern vector<bool> 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();
}