1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2024-12-28 02:50:34 +00:00
hyperrogue/rogueviz/sag
2024-08-01 11:37:30 +02:00
..
annealing.cpp rogueviz:: sag:: fix formatting 2024-08-01 11:35:07 +02:00
cells.cpp sag:: %zd only Linux 2024-07-24 22:48:03 +02:00
continuous.cpp rogueviz:: sag:: separated into subfiles 2024-07-23 21:21:53 +02:00
data.cpp edge_weights table for better cost computation 2024-08-01 11:36:04 +02:00
experiments.cpp more bad includes removes 2024-07-24 21:18:13 +02:00
functions.cpp rogueviz:: sag:: compute_cost when preparing smClosest method 2024-08-01 11:37:30 +02:00
README.md rogueviz::sag:: minor changes, docs updated 2024-07-23 23:13:25 +02:00
sag.cpp sag:: fixed some warnings 2024-07-24 19:29:12 +02:00
sag.h rogueviz:: sag:: separated into subfiles 2024-07-23 21:21:53 +02:00

What is it

The SAG module is used to create the embeddings of graphs, and to render them.

In general, this works by mapping the nodes of a graph to the cells of a RogueViz-supported tessellation or honeycomb. The number of usable cells is limited (that is, a fixed region is set in advance for the embedding).

Simulated Annealing is used to find the 'optimal' mapping. The function optimized depends on the method. Currently, there are three main 'methods' implemented:

NEAREST: we minimize the sum of w * d over all edges, where w is the edge weight, and d is the distance between the endpoints of that edge. In other words, we want to place all nodes all close as possible, especially if the node weights are big. See the following visualizations as an example of visualizations obtained using this method:

https://www.youtube.com/watch?v=mDG3_f8R2Ns (SAG boardgames) https://www.youtube.com/watch?v=WSyygk_3j9o (SAG roguelikes) https://www.youtube.com/watch?v=HWQkDkeEUeM (SAG programming languages)

MATCH: we minimize the sum of squares of (d - a/w - b), where w and d are as above. In other words, we want the distance between nodes to represent 1/w as well as possible; a and b are scaling parameters.

(no examples for now)

LIKELIHOOD: this method is based on the Hyperbolic Random Graph model. According to that model, each pair of nodes in distance d are connected with probability 1/(1+\exp((d-R)/T)). We maximize the likelihood, i.e., the product of these probabilities for actual edges, and their complements for non-edges. In other words, nodes connected with edges want to be close, while nodes not connected with edges want to be distant.

The following embeddings have been obtained using this method:

https://youtu.be/GQKaKF_yOL4 (brain connectomes)

The rest of this README details how to use SAG.

Cells

If nothing is declared, it just uses all the visible cells (or all cells on closed manifolds), and the distances are measured in tiles.

You can change this as follows:

  • -sag-creq x -- use x tiles which are geometrically closest to the center (or a bit more in case of ties)

  • -sag_gdist x -- take geometric distances instead, 1 absolute units = x units (this will be rounded to integer because of the limited precision of some methods)

  • -sag_gdist_dijkstra m -- compute actual geometric distances if <= m steps, use Dijkstra to compute larger distances (used in geometries like Solv where the distance computation does not always work for large distances)

  • -sag_gdist_save filename -- save the distances to a file (loading which might be faster than recomputing)

  • -sag_gdist_load filename -- load the distances from a file

Graph

Just use -sag-weighted to read a weighted graph (in format node1;node2;weight), or -sag-unweighted to read an unweighted graph (in format node1 node2).

You can also use -sag-edgepower a b to use pow(w, a) * b instead of weight w listed in the file (enter this before -sag-weighted).

See the cpp files for other options available.