graphinius
Version:
Generic graph library in Typescript
106 lines (87 loc) • 3.57 kB
text/typescript
import * as $N from '../core/base/BaseNode';
import * as $E from '../core/base/BaseEdge';
import * as $G from '../core/base/BaseGraph';
export interface KROLConfig {
genMat: Array<Array<number> >;
// generator: $G.IGraph;
cycles: number;
}
export interface KROLResult {
graph: $G.IGraph;
}
export interface IKROL {
generate() : KROLResult;
prepareKROLStandardConfig() : KROLConfig;
}
class KROL implements IKROL {
private _config : KROLConfig;
// private _generator : $G.IGraph;
private _genMat : number[][];
private _cycles : number;
private _graph : $G.IGraph;
constructor( config? : KROLConfig )
{
this._config = config || this.prepareKROLStandardConfig();
// this._generator = this._config.generator;
// TODO: use the adjacency matrix form the generator graph
// as soon as the issues from computing the adjacency matrix are fixe
// this._genMat = this._generator.adjListArray();
this._genMat = this._config.genMat;
this._cycles = this._config.cycles;
this._graph = new $G.BaseGraph('synth');
}
generate() {
// var gen_dims = this._generator.nrNodes();
var gen_dims = this._genMat[0].length;
var res_dims = Math.pow(gen_dims, this._cycles+1);
for (let index = 0; index < res_dims; index++) {
this._graph.addNodeByID(index.toString());
}
var nr_edges: number = 0;
for (let node1 = 0; node1 < res_dims; node1++) {
for (let node2 = 0; node2 < res_dims; node2++) {
if (this.addEdge(node1, node2, gen_dims)) {
this._graph.addEdgeByNodeIDs(node1 + '_' + node2, node1.toString(), node2.toString());
++nr_edges;
}
}
}
var result : KROLResult = {
graph : this._graph
};
return result;
}
addEdge(node1: number, node2: number, dims: number) : boolean {
var rprob: number = Math.random();
var prob: number = 1.0;
for (let level = 0; level < this._cycles; level++) {
var id_1 = Math.floor(node1 / Math.pow(dims, level+1)) % dims;
var id_2 = Math.floor(node2 / Math.pow(dims, level+1)) % dims;
prob *= this._genMat[id_1][id_2];
if (rprob > prob) { return false; }
}
return true;
}
prepareKROLStandardConfig() : KROLConfig {
// var generator: $G.IGraph = new $G.BaseGraph('generator');
// var node_a = generator.addNodeByID('a');
// var node_b = generator.addNodeByID('b');
// var edge_ab_id: string = node_a.getID() + '_' + node_b.getID();
// var edge_ba_id: string = node_b.getID() + '_' + node_a.getID();
// var edge_aa_id: string = node_a.getID() + '_' + node_a.getID();
// var edge_bb_id: string = node_b.getID() + '_' + node_b.getID();
// generator.addEdgeByID(edge_ab_id, node_a, node_b, {weighted: true, weight: 0.9});
// generator.addEdgeByID(edge_ba_id, node_b, node_a, {weighted: true, weight: 0.5});
// generator.addEdgeByID(edge_aa_id, node_a, node_a, {weighted: true, weight: 0.5});
// generator.addEdgeByID(edge_bb_id, node_b, node_b, {weighted: true, weight: 0.1});
var genMat = [[0.9, 0.5], [0.5, 0.1]];
return {
// generator: generator,
genMat: genMat,
cycles: 5
}
}
}
export {
KROL
};