diff --git a/rogueviz/embeddings/embeddings.cpp b/rogueviz/embeddings/embeddings.cpp new file mode 100644 index 00000000..d351b43e --- /dev/null +++ b/rogueviz/embeddings/embeddings.cpp @@ -0,0 +1,65 @@ +#include "../rogueviz.h" + +namespace rogueviz { + +unique_ptr current_embedding; + +namespace embeddings { + +vector > 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> 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 (); + } + } + +int a = arg::add3("-edgelist", [] { arg::shift(); read_edgelist(arg::args()); }); + +} + +} diff --git a/rogueviz/rogueviz-all.cpp b/rogueviz/rogueviz-all.cpp index 7df0b757..632d4ad9 100644 --- a/rogueviz/rogueviz-all.cpp +++ b/rogueviz/rogueviz-all.cpp @@ -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 diff --git a/rogueviz/rogueviz.h b/rogueviz/rogueviz.h index b1791a18..85e2101a 100644 --- a/rogueviz/rogueviz.h +++ b/rogueviz/rogueviz.h @@ -81,9 +81,17 @@ namespace rogueviz { void addedge(int i, int j, double wei, edgetype *t); extern vector legend; extern vector 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 current_embedding; + #if CAP_TEXTURE struct rvimage { basic_textureinfo tinf;