+119
@@ -0,0 +1,119 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user