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:
65
rogueviz/embeddings/embeddings.cpp
Normal file
65
rogueviz/embeddings/embeddings.cpp
Normal 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()); });
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user