120 lines
2.5 KiB
JavaScript
120 lines
2.5 KiB
JavaScript
import * as util from '../util/index.mjs';
|
|
|
|
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;
|