graphinius
Version:
Generic graph library in Typescript
167 lines (149 loc) • 4.22 kB
text/typescript
import * as $N from '../core/base/BaseNode';
import * as $G from '../core/base/BaseGraph';
import * as $SU from '../utils/StructUtils'
export enum DegreeMode {
in,
out,
und,
dir,
all
}
/**
* @todo per edge type ???
*/
export interface DegreeDistribution {
in : Uint32Array;
out : Uint32Array;
dir : Uint32Array;
und : Uint32Array;
all : Uint32Array;
}
class DegreeCentrality {
constructor(){}
getCentralityMap( graph: $G.IGraph, weighted?: boolean, conf?: DegreeMode):{[id:string]: number} {
weighted = ( weighted != null ) ? !!weighted : true;
conf = ( conf == null ) ? DegreeMode.all : conf;
let ret:{[id:string]: number} = {}; //Will be a map of [nodeID] = centrality
switch(conf){ //Switch on the outside for faster loops
case DegreeMode.in:
for(let key in graph.getNodes()) {
let node = graph.getNodeById(key);
if(node!=null) {
if(!weighted) {
ret[key] = node.in_deg;
}
else {
ret[key] = ret[key]||0;
for(let k in node.inEdges()) {
ret[key] += node.inEdges()[k].getWeight();
}
}
}
}
break;
case DegreeMode.out:
for(let key in graph.getNodes()) {
let node = graph.getNodeById(key);
if(node!=null) {
if(!weighted) {
ret[key] = node.out_deg;
}
else {
ret[key] = ret[key]||0;
for(let k in node.outEdges()) {
ret[key] += node.outEdges()[k].getWeight();
}
}
}
}
break;
case DegreeMode.und:
for(let key in graph.getNodes()) {
let node = graph.getNodeById(key);
if(node!=null) {
if(!weighted) {
ret[key] = node.deg;
}
else {
ret[key] = ret[key]||0;
for(let k in node.undEdges()) {
ret[key] += node.undEdges()[k].getWeight();
}
}
}
}
break;
case DegreeMode.dir:
for(let key in graph.getNodes()) {
let node = graph.getNodeById(key);
if(node!=null) {
if(!weighted) {
ret[key] = node.in_deg + node.out_deg;
}
else {
ret[key] = ret[key]||0;
let comb = $SU.mergeObjects([node.inEdges(), node.outEdges()]);
for(let k in comb) {
ret[key] += comb[k].getWeight();
}
}
}
}
break;
case DegreeMode.all:
for(let key in graph.getNodes()) {
let node = graph.getNodeById(key);
if(node!=null) {
if(!weighted) {
ret[key] = node.deg + node.in_deg + node.out_deg;
}
else {
ret[key] = ret[key]||0;
let comb = $SU.mergeObjects([node.inEdges(), node.outEdges(), node.undEdges()]);
for(let k in comb) {
ret[key] += comb[k].getWeight();
}
}
}
}
break;
}
return ret;
}
/**
* @TODO Weighted version !
* @TODO per edge type !
*/
degreeDistribution(graph: $G.IGraph) {
let max_deg : number = 0,
key : string,
nodes : {[id: string] : $N.IBaseNode} = graph.getNodes(),
node : $N.IBaseNode,
all_deg : number;
for ( key in nodes ) {
node = nodes[key];
all_deg = node.in_deg + node.out_deg + node.deg + 1;
max_deg = all_deg > max_deg ? all_deg : max_deg;
}
let deg_dist : DegreeDistribution = {
in: new Uint32Array(max_deg),
out: new Uint32Array(max_deg),
dir: new Uint32Array(max_deg),
und: new Uint32Array(max_deg),
all: new Uint32Array(max_deg)
};
for ( key in nodes ) {
node = nodes[key];
deg_dist.in[node.in_deg]++;
deg_dist.out[node.out_deg]++;
deg_dist.dir[node.in_deg + node.out_deg]++;
deg_dist.und[node.deg]++;
deg_dist.all[node.in_deg + node.out_deg + node.deg]++;
}
// console.dir(deg_dist);
return deg_dist;
}
}
export {
DegreeCentrality
};