cytoscape
Version:
Graph theory (a.k.a. network) library for analysis and visualisation
120 lines (94 loc) • 2.57 kB
JavaScript
import * as util from '../util';
let elesfn = {};
function defineDegreeFunction( callback ){
return function( includeLoops ){
let self = this;
if( includeLoops === undefined ){
includeLoops = true;
}
if( self.length === 0 ){ return; }
if( self.isNode() && !self.removed() ){
let degree = 0;
let node = self[0];
let connectedEdges = node._private.edges;
for( let i = 0; i < connectedEdges.length; i++ ){
let edge = connectedEdges[ i ];
if( !includeLoops && edge.isLoop() ){
continue;
}
degree += callback( node, edge );
}
return degree;
} else {
return;
}
};
}
util.extend( elesfn, {
degree: defineDegreeFunction( function( node, edge ){
if( edge.source().same( edge.target() ) ){
return 2;
} else {
return 1;
}
} ),
indegree: defineDegreeFunction( function( node, edge ){
if( edge.target().same( node ) ){
return 1;
} else {
return 0;
}
} ),
outdegree: defineDegreeFunction( function( node, edge ){
if( edge.source().same( node ) ){
return 1;
} else {
return 0;
}
} )
} );
function defineDegreeBoundsFunction( degreeFn, callback ){
return function( includeLoops ){
let ret;
let nodes = this.nodes();
for( let i = 0; i < nodes.length; i++ ){
let ele = nodes[ i ];
let degree = ele[ degreeFn ]( includeLoops );
if( degree !== undefined && (ret === undefined || callback( degree, ret )) ){
ret = degree;
}
}
return ret;
};
}
util.extend( elesfn, {
minDegree: defineDegreeBoundsFunction( 'degree', function( degree, min ){
return degree < min;
} ),
maxDegree: defineDegreeBoundsFunction( 'degree', function( degree, max ){
return degree > max;
} ),
minIndegree: defineDegreeBoundsFunction( 'indegree', function( degree, min ){
return degree < min;
} ),
maxIndegree: defineDegreeBoundsFunction( 'indegree', function( degree, max ){
return degree > max;
} ),
minOutdegree: defineDegreeBoundsFunction( 'outdegree', function( degree, min ){
return degree < min;
} ),
maxOutdegree: defineDegreeBoundsFunction( 'outdegree', function( degree, max ){
return degree > max;
} )
} );
util.extend( elesfn, {
totalDegree: function( includeLoops ){
let total = 0;
let nodes = this.nodes();
for( let i = 0; i < nodes.length; i++ ){
total += nodes[ i ].degree( includeLoops );
}
return total;
}
} );
export default elesfn;