1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2026-01-02 02:19:02 +00:00

started rv::embeddings

This commit is contained in:
Zeno Rogue
2025-12-04 20:30:49 +01:00
parent 85aa299d75
commit 47c49b7bb0
3 changed files with 77 additions and 1 deletions

View File

@@ -0,0 +1,65 @@
#include "../rogueviz.h"
namespace rogueviz {
unique_ptr<embedding> current_embedding;
namespace embeddings {
vector<vector<int> > directed_edges;
rogueviz::edgetype *any;
struct rv_embedding : public embedding {
hyperpoint as_hyperpoint(int id) override {
return currentmap->relative_matrix(vdata[id].m->base, currentmap->gamestart(), C0) * (vdata[id].m->at * C0);
}
};
void read_edgelist(string fname) {
rogueviz::init(RV_GRAPH);
rv_hook(hooks_clearmemory, 100, [] {
directed_edges.clear();
current_embedding = nullptr;
});
any = rogueviz::add_edgetype("embedded edges");
fhstream f(fname, "rt");
if(!f.f) return file_error(fname);
set<pair<int, int>> edgesets;
while(true) {
int i = rogueviz::readLabel(f), j = rogueviz::readLabel(f);
if(i == -1 || j == -1) break;
sizeto(directed_edges, i);
sizeto(directed_edges, j);
if(edgesets.count({i, j}) == 0 && edgesets.count({j, i}) == 0)
addedge(i, j, 1, any);
if(edgesets.count({i, j}) == 0) {
edgesets.emplace(i, j);
directed_edges[i].push_back(j);
}
}
int id = 0;
auto all = currentmap->allcells();
if(rogueviz::rv_quality >= 0) {
for(auto& v: vdata)
v.be(all[gmod(id++, isize(all))], Id);
current_embedding = std::make_unique<rv_embedding> ();
}
}
int a = arg::add3("-edgelist", [] { arg::shift(); read_edgelist(arg::args()); });
}
}

View File

@@ -87,6 +87,8 @@
#include "sag/sag.cpp"
#include "embeddings/embeddings.cpp"
#include "watcher.cpp"
// the following comments are read by mymake so that it knows that the files include other files there:
@@ -95,6 +97,7 @@
// hidden dependencies: rogueviz/ads/
// hidden dependencies: rogueviz/sag/
// hidden dependencies: rogueviz/ru/
// hidden dependencies: rogueviz/embeddings/
//#endif

View File

@@ -81,9 +81,17 @@ namespace rogueviz {
void addedge(int i, int j, double wei, edgetype *t);
extern vector<int> legend;
extern vector<cell*> named;
int readLabel(fhstream& f);
struct embedding {
virtual hyperpoint as_hyperpoint(int id) = 0;
virtual ld distance(int i, int j) { return hdist(as_hyperpoint(i), as_hyperpoint(j)); }
virtual ld zero_distance(int id) { return hdist0(as_hyperpoint(id)); }
};
extern unique_ptr<embedding> current_embedding;
#if CAP_TEXTURE
struct rvimage {
basic_textureinfo tinf;