mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2026-10-12 12:21:43 +00:00
rogueviz:: embeddings:: node importance/rendered, bhyper-reduced representation
This commit is contained in:
@@ -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; });
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
|
||||
@@ -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();
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user