basant307/AI_Governance_Project
048
1import * as util from '../util/index.mjs';2 3let elesfn = {};4 5function defineDegreeFunction( callback ){6 return function( includeLoops ){7 let self = this;8 9 if( includeLoops === undefined ){10 includeLoops = true;11 }12 13 if( self.length === 0 ){ return; }14 15 if( self.isNode() && !self.removed() ){16 let degree = 0;17 let node = self[0];18 let connectedEdges = node._private.edges;19 20 for( let i = 0; i < connectedEdges.length; i++ ){21 let edge = connectedEdges[ i ];22 23 if( !includeLoops && edge.isLoop() ){24 continue;25 }26 27 degree += callback( node, edge );28 }29 30 return degree;31 } else {32 return;33 }34 };35}36 37util.extend( elesfn, {38 degree: defineDegreeFunction( function( node, edge ){39 if( edge.source().same( edge.target() ) ){40 return 2;41 } else {42 return 1;43 }44 } ),45 46 indegree: defineDegreeFunction( function( node, edge ){47 if( edge.target().same( node ) ){48 return 1;49 } else {50 return 0;51 }52 } ),53 54 outdegree: defineDegreeFunction( function( node, edge ){55 if( edge.source().same( node ) ){56 return 1;57 } else {58 return 0;59 }60 } )61} );62 63function defineDegreeBoundsFunction( degreeFn, callback ){64 return function( includeLoops ){65 let ret;66 let nodes = this.nodes();67 68 for( let i = 0; i < nodes.length; i++ ){69 let ele = nodes[ i ];70 let degree = ele[ degreeFn ]( includeLoops );71 if( degree !== undefined && (ret === undefined || callback( degree, ret )) ){72 ret = degree;73 }74 }75 76 return ret;77 };78}79 80util.extend( elesfn, {81 minDegree: defineDegreeBoundsFunction( 'degree', function( degree, min ){82 return degree < min;83 } ),84 85 maxDegree: defineDegreeBoundsFunction( 'degree', function( degree, max ){86 return degree > max;87 } ),88 89 minIndegree: defineDegreeBoundsFunction( 'indegree', function( degree, min ){90 return degree < min;91 } ),92 93 maxIndegree: defineDegreeBoundsFunction( 'indegree', function( degree, max ){94 return degree > max;95 } ),96 97 minOutdegree: defineDegreeBoundsFunction( 'outdegree', function( degree, min ){98 return degree < min;99 } ),100 101 maxOutdegree: defineDegreeBoundsFunction( 'outdegree', function( degree, max ){102 return degree > max;103 } )104} );105 106util.extend( elesfn, {107 totalDegree: function( includeLoops ){108 let total = 0;109 let nodes = this.nodes();110 111 for( let i = 0; i < nodes.length; i++ ){112 total += nodes[ i ].degree( includeLoops );113 }114 115 return total;116 }117} );118 119export default elesfn;120 