1 |
- !function(f){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=f();else if("function"==typeof define&&define.amd)define([],f);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).ngraphCreate2dLayout=f()}}((function(){return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a="function"==typeof require&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,(function(e){var n=t[o][1][e];return s(n||e)}),l,l.exports,e,t,n,r)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){module.exports=function(graph,physicsSettings){if(!graph)throw new Error("Graph structure cannot be undefined");var physicsSimulator=(physicsSettings&&physicsSettings.createSimulator||require("./lib/createPhysicsSimulator"))(physicsSettings);if(Array.isArray(physicsSettings))throw new Error("Physics settings is expected to be an object");var nodeMass=function(nodeId){var links=graph.getLinks(nodeId);return links?1+links.length/3:1};physicsSettings&&"function"==typeof physicsSettings.nodeMass&&(nodeMass=physicsSettings.nodeMass);var nodeBodies=new Map,springs={},bodiesCount=0,springTransform=physicsSimulator.settings.springTransform||noop;bodiesCount=0,graph.forEachNode((function(node){initBody(node.id),bodiesCount+=1})),graph.forEachLink(initLink),graph.on("changed",onGraphChanged);var wasStable=!1,api={step:function(){if(0===bodiesCount)return updateStableStatus(!0),!0;var lastMove=physicsSimulator.step();api.lastMove=lastMove,api.fire("step");var isStableNow=lastMove/bodiesCount<=.01;return updateStableStatus(isStableNow),isStableNow},getNodePosition:function(nodeId){return getInitializedBody(nodeId).pos},setNodePosition:function(nodeId){var body=getInitializedBody(nodeId);body.setPosition.apply(body,Array.prototype.slice.call(arguments,1))},getLinkPosition:function(linkId){var spring=springs[linkId];if(spring)return{from:spring.from.pos,to:spring.to.pos}},getGraphRect:function(){return physicsSimulator.getBBox()},forEachBody:forEachBody,pinNode:function(node,isPinned){getInitializedBody(node.id).isPinned=!!isPinned},isNodePinned:function(node){return getInitializedBody(node.id).isPinned},dispose:function(){graph.off("changed",onGraphChanged),api.fire("disposed")},getBody:function(nodeId){return nodeBodies.get(nodeId)},getSpring:function(fromId,toId){var linkId;if(void 0===toId)linkId="object"!=typeof fromId?fromId:fromId.id;else{var link=graph.hasLink(fromId,toId);if(!link)return;linkId=link.id}return springs[linkId]},getForceVectorLength:function(){var fx=0,fy=0;return forEachBody((function(body){fx+=Math.abs(body.force.x),fy+=Math.abs(body.force.y)})),Math.sqrt(fx*fx+fy*fy)},simulator:physicsSimulator,graph:graph,lastMove:0};return eventify(api),api;function updateStableStatus(isStableNow){var isStable;wasStable!==isStableNow&&(wasStable=isStableNow,isStable=isStableNow,api.fire("stable",isStable))}function forEachBody(cb){nodeBodies.forEach(cb)}function onGraphChanged(changes){for(var i=0;i<changes.length;++i){var change=changes[i];"add"===change.changeType?(change.node&&initBody(change.node.id),change.link&&initLink(change.link)):"remove"===change.changeType&&(change.node&&releaseNode(change.node),change.link&&releaseLink(change.link))}bodiesCount=graph.getNodesCount()}function initBody(nodeId){var body=nodeBodies.get(nodeId);if(!body){var node=graph.getNode(nodeId);if(!node)throw new Error("initBody() was called with unknown node id");var pos=node.position;if(!pos){var neighbors=function(node){var neighbors=[];if(!node.links)return neighbors;for(var maxNeighbors=Math.min(node.links.length,2),i=0;i<maxNeighbors;++i){var link=node.links[i],otherBody=link.fromId!==node.id?nodeBodies.get(link.fromId):nodeBodies.get(link.toId);otherBody&&otherBody.pos&&neighbors.push(otherBody)}return neighbors}(node);pos=physicsSimulator.getBestNewBodyPosition(neighbors)}(body=physicsSimulator.addBodyAt(pos)).id=nodeId,nodeBodies.set(nodeId,body),updateBodyMass(nodeId),function(node){return node&&(node.isPinned||node.data&&node.data.isPinned)}(node)&&(body.isPinned=!0)}}function releaseNode(node){var nodeId=node.id,body=nodeBodies.get(nodeId);body&&(nodeBodies.delete(nodeId),physicsSimulator.removeBody(body))}function initLink(link){updateBodyMass(link.fromId),updateBodyMass(link.toId);var fromBody=nodeBodies.get(link.fromId),toBody=nodeBodies.get(link.toId),spring=physicsSimulator.addSpring(fromBody,toBody,link.length);springTransform(link,spring),springs[link.id]=spring}function releaseLink(link){var spring=springs[link.id];if(spring){var from=graph.getNode(link.fromId),to=graph.getNode(link.toId);from&&updateBodyMass(from.id),to&&updateBodyMass(to.id),delete springs[link.id],physicsSimulator.removeSpring(spring)}}function updateBodyMass(nodeId){var body=nodeBodies.get(nodeId);if(body.mass=nodeMass(nodeId),Number.isNaN(body.mass))throw new Error("Node mass should be a number")}function getInitializedBody(nodeId){var body=nodeBodies.get(nodeId);return body||(initBody(nodeId),body=nodeBodies.get(nodeId)),body}},module.exports.simulator=require("./lib/createPhysicsSimulator");var eventify=require("ngraph.events");function noop(){}},{"./lib/createPhysicsSimulator":8,"ngraph.events":10}],2:[function(require,module,exports){module.exports=function(){return function(bodies,settings,random){var boundingBox={min_x:0,max_x:0,min_y:0,max_y:0};return{box:boundingBox,update:function(){var i=bodies.length;if(0===i)return;var max_x=-1/0,max_y=-1/0,min_x=1/0,min_y=1/0;for(;i--;){var bodyPos=bodies[i].pos;bodyPos.x<min_x&&(min_x=bodyPos.x),bodyPos.y<min_y&&(min_y=bodyPos.y),bodyPos.x>max_x&&(max_x=bodyPos.x),bodyPos.y>max_y&&(max_y=bodyPos.y)}boundingBox.min_x=min_x,boundingBox.min_y=min_y,boundingBox.max_x=max_x,boundingBox.max_y=max_y},reset:function(){boundingBox.min_x=boundingBox.max_x=0,boundingBox.min_y=boundingBox.max_y=0},getBestNewPosition:function(neighbors){var base_x=0,base_y=0;if(neighbors.length){for(var i=0;i<neighbors.length;++i){let neighborPos=neighbors[i].pos;base_x+=neighborPos.x,base_y+=neighborPos.y}base_x/=neighbors.length,base_y/=neighbors.length}else base_x=(boundingBox.min_x+boundingBox.max_x)/2,base_y=(boundingBox.min_y+boundingBox.max_y)/2;var springLength=settings.springLength;return{x:base_x+(random.nextDouble()-.5)*springLength,y:base_y+(random.nextDouble()-.5)*springLength}}}}}},{}],3:[function(require,module,exports){function Vector(x,y){if("object"==typeof arguments[0]){let v=arguments[0];if(!Number.isFinite(v.x))throw new Error("Expected value is not a finite number at Vector constructor (x)");if(!Number.isFinite(v.y))throw new Error("Expected value is not a finite number at Vector constructor (y)");this.x=v.x,this.y=v.y}else this.x="number"==typeof x?x:0,this.y="number"==typeof y?y:0}function Body(x,y){this.isPinned=!1,this.pos=new Vector(x,y),this.force=new Vector,this.velocity=new Vector,this.mass=1,this.springCount=0,this.springLength=0}Vector.prototype.reset=function(){this.x=this.y=0},Body.prototype.reset=function(){this.force.reset(),this.springCount=0,this.springLength=0},Body.prototype.setPosition=function(x,y){this.pos.x=x||0,this.pos.y=y||0},module.exports=function(){return Body}},{}],4:[function(require,module,exports){module.exports=function(){return function(options){if(!Number.isFinite(options.dragCoefficient))throw new Error("dragCoefficient is not a finite number");return{update:function(body){body.force.x-=options.dragCoefficient*body.velocity.x,body.force.y-=options.dragCoefficient*body.velocity.y}}}}},{}],5:[function(require,module,exports){module.exports=function(){return function(options,random){if(!Number.isFinite(options.springCoefficient))throw new Error("Spring coefficient is not a number");if(!Number.isFinite(options.springLength))throw new Error("Spring length is not a number");return{update:function(spring){var body1=spring.from,body2=spring.to,length=spring.length<0?options.springLength:spring.length,dx=body2.pos.x-body1.pos.x,dy=body2.pos.y-body1.pos.y,r=Math.sqrt(dx*dx+dy*dy);0===r&&(dx=(random.nextDouble()-.5)/50,dy=(random.nextDouble()-.5)/50,r=Math.sqrt(dx*dx+dy*dy));var d=r-length,coefficient=(spring.coefficient>0?spring.coefficient:options.springCoefficient)*d/r;body1.force.x+=coefficient*dx,body1.force.y+=coefficient*dy,body1.springCount+=1,body1.springLength+=r,body2.force.x-=coefficient*dx,body2.force.y-=coefficient*dy,body2.springCount+=1,body2.springLength+=r}}}}},{}],6:[function(require,module,exports){module.exports=function(){return function(bodies,timeStep,adaptiveTimeStepWeight){var length=bodies.length;if(0===length)return 0;for(var dx=0,tx=0,dy=0,ty=0,i=0;i<length;++i){var body=bodies[i];if(!body.isPinned){adaptiveTimeStepWeight&&body.springCount&&(timeStep=adaptiveTimeStepWeight*body.springLength/body.springCount);var coeff=timeStep/body.mass;body.velocity.x+=coeff*body.force.x,body.velocity.y+=coeff*body.force.y;var vx=body.velocity.x,vy=body.velocity.y,v=Math.sqrt(vx*vx+vy*vy);v>1&&(body.velocity.x=vx/v,body.velocity.y=vy/v),dx=timeStep*body.velocity.x,dy=timeStep*body.velocity.y,body.pos.x+=dx,body.pos.y+=dy,tx+=Math.abs(dx),ty+=Math.abs(dy)}}return(tx*tx+ty*ty)/length}}},{}],7:[function(require,module,exports){function InsertStack(){this.stack=[],this.popIdx=0}function InsertStackElement(node,body){this.node=node,this.body=body}function QuadNode(){this.body=null,this.quad0=null,this.quad1=null,this.quad2=null,this.quad3=null,this.mass=0,this.mass_x=0,this.mass_y=0,this.min_x=0,this.min_y=0,this.max_x=0,this.max_y=0}function isSamePosition(point1,point2){var dx=Math.abs(point1.x-point2.x),dy=Math.abs(point1.y-point2.y);return dx<1e-8&&dy<1e-8}function getChild(node,idx){return 0===idx?node.quad0:1===idx?node.quad1:2===idx?node.quad2:3===idx?node.quad3:null}function setChild(node,idx,child){0===idx?node.quad0=child:1===idx?node.quad1=child:2===idx?node.quad2=child:3===idx&&(node.quad3=child)}InsertStack.prototype={isEmpty:function(){return 0===this.popIdx},push:function(node,body){var item=this.stack[this.popIdx];item?(item.node=node,item.body=body):this.stack[this.popIdx]=new InsertStackElement(node,body),++this.popIdx},pop:function(){if(this.popIdx>0)return this.stack[--this.popIdx]},reset:function(){this.popIdx=0}},module.exports=function(){return function(options,random){(options=options||{}).gravity="number"==typeof options.gravity?options.gravity:-1,options.theta="number"==typeof options.theta?options.theta:.8;var gravity=options.gravity,updateQueue=[],insertStack=new InsertStack,theta=options.theta,nodesCache=[],currentInCache=0,root=newNode();return{insertBodies:function(bodies){var xmin=Number.MAX_VALUE,ymin=Number.MAX_VALUE,xmax=Number.MIN_VALUE,ymax=Number.MIN_VALUE,i=bodies.length;for(;i--;){var pos=bodies[i].pos;pos.x<xmin&&(xmin=pos.x),pos.y<ymin&&(ymin=pos.y),pos.x>xmax&&(xmax=pos.x),pos.y>ymax&&(ymax=pos.y)}var maxSideLength=-1/0;xmax-xmin>maxSideLength&&(maxSideLength=xmax-xmin);ymax-ymin>maxSideLength&&(maxSideLength=ymax-ymin);currentInCache=0,(root=newNode()).min_x=xmin,root.min_y=ymin,root.max_x=xmin+maxSideLength,root.max_y=ymin+maxSideLength,(i=bodies.length-1)>=0&&(root.body=bodies[i]);for(;i--;)insert(bodies[i])},getRoot:function(){return root},updateBodyForce:function(sourceBody){var v,dx,dy,r,queue=updateQueue,fx=0,fy=0,queueLength=1,shiftIdx=0,pushIdx=1;queue[0]=root;for(;queueLength;){var node=queue[shiftIdx],body=node.body;queueLength-=1,shiftIdx+=1;var differentBody=body!==sourceBody;body&&differentBody?(dx=body.pos.x-sourceBody.pos.x,dy=body.pos.y-sourceBody.pos.y,0===(r=Math.sqrt(dx*dx+dy*dy))&&(dx=(random.nextDouble()-.5)/50,dy=(random.nextDouble()-.5)/50,r=Math.sqrt(dx*dx+dy*dy)),v=gravity*body.mass*sourceBody.mass/(r*r*r),fx+=v*dx,fy+=v*dy):differentBody&&(dx=node.mass_x/node.mass-sourceBody.pos.x,dy=node.mass_y/node.mass-sourceBody.pos.y,0===(r=Math.sqrt(dx*dx+dy*dy))&&(dx=(random.nextDouble()-.5)/50,dy=(random.nextDouble()-.5)/50,r=Math.sqrt(dx*dx+dy*dy)),(node.max_x-node.min_x)/r<theta?(v=gravity*node.mass*sourceBody.mass/(r*r*r),fx+=v*dx,fy+=v*dy):(node.quad0&&(queue[pushIdx]=node.quad0,queueLength+=1,pushIdx+=1),node.quad1&&(queue[pushIdx]=node.quad1,queueLength+=1,pushIdx+=1),node.quad2&&(queue[pushIdx]=node.quad2,queueLength+=1,pushIdx+=1),node.quad3&&(queue[pushIdx]=node.quad3,queueLength+=1,pushIdx+=1)))}sourceBody.force.x+=fx,sourceBody.force.y+=fy},options:function(newOptions){return newOptions?("number"==typeof newOptions.gravity&&(gravity=newOptions.gravity),"number"==typeof newOptions.theta&&(theta=newOptions.theta),this):{gravity:gravity,theta:theta}}};function newNode(){var node=nodesCache[currentInCache];return node?(node.quad0=null,node.quad1=null,node.quad2=null,node.quad3=null,node.body=null,node.mass=node.mass_x=node.mass_y=0,node.min_x=node.max_x=node.min_y=node.max_y=0):(node=new QuadNode,nodesCache[currentInCache]=node),++currentInCache,node}function insert(newBody){for(insertStack.reset(),insertStack.push(root,newBody);!insertStack.isEmpty();){var stackItem=insertStack.pop(),node=stackItem.node,body=stackItem.body;if(node.body){var oldBody=node.body;if(node.body=null,isSamePosition(oldBody.pos,body.pos)){var retriesCount=3;do{var offset=random.nextDouble(),dx=(node.max_x-node.min_x)*offset,dy=(node.max_y-node.min_y)*offset;oldBody.pos.x=node.min_x+dx,oldBody.pos.y=node.min_y+dy,retriesCount-=1}while(retriesCount>0&&isSamePosition(oldBody.pos,body.pos));if(0===retriesCount&&isSamePosition(oldBody.pos,body.pos))return}insertStack.push(node,oldBody),insertStack.push(node,body)}else{var x=body.pos.x,y=body.pos.y;node.mass+=body.mass,node.mass_x+=body.mass*x,node.mass_y+=body.mass*y;var quadIdx=0,min_x=node.min_x,min_y=node.min_y,max_x=(min_x+node.max_x)/2,max_y=(min_y+node.max_y)/2;x>max_x&&(quadIdx+=1,min_x=max_x,max_x=node.max_x),y>max_y&&(quadIdx+=2,min_y=max_y,max_y=node.max_y);var child=getChild(node,quadIdx);child?insertStack.push(child,body):((child=newNode()).min_x=min_x,child.min_y=min_y,child.max_x=max_x,child.max_y=max_y,child.body=body,setChild(node,quadIdx,child))}}}}}},{}],8:[function(require,module,exports){module.exports=function(settings){var Spring=require("./spring"),merge=require("ngraph.merge"),eventify=require("ngraph.events");if(settings){if(void 0!==settings.springCoeff)throw new Error("springCoeff was renamed to springCoefficient");if(void 0!==settings.dragCoeff)throw new Error("dragCoeff was renamed to dragCoefficient")}settings=merge(settings,{springLength:10,springCoefficient:.8,gravity:-12,theta:.8,dragCoefficient:.9,timeStep:.5,adaptiveTimeStepWeight:0,dimensions:2,debug:!1});var factory=dimensionalCache[settings.dimensions];if(!factory){var dimensions=settings.dimensions;factory={Body:generateCreateBodyFunction(dimensions,settings.debug),createQuadTree:generateQuadTreeFunction(dimensions),createBounds:generateBoundsFunction(dimensions),createDragForce:generateCreateDragForceFunction(dimensions),createSpringForce:generateCreateSpringForceFunction(dimensions),integrate:generateIntegratorFunction(dimensions)},dimensionalCache[dimensions]=factory}var Body=factory.Body,createQuadTree=factory.createQuadTree,createBounds=factory.createBounds,createDragForce=factory.createDragForce,createSpringForce=factory.createSpringForce,integrate=factory.integrate,random=require("ngraph.random").random(42),bodies=[],springs=[],quadTree=createQuadTree(settings,random),bounds=createBounds(bodies,settings,random),springForce=createSpringForce(settings,random),dragForce=createDragForce(settings),forces=[],forceMap=new Map,iterationNumber=0;addForce("nbody",(function(){if(0===bodies.length)return;quadTree.insertBodies(bodies);var i=bodies.length;for(;i--;){var body=bodies[i];body.isPinned||(body.reset(),quadTree.updateBodyForce(body),dragForce.update(body))}})),addForce("spring",(function(){var i=springs.length;for(;i--;)springForce.update(springs[i])}));var publicApi={bodies:bodies,quadTree:quadTree,springs:springs,settings:settings,addForce:addForce,removeForce:function(forceName){var forceIndex=forces.indexOf(forceMap.get(forceName));if(forceIndex<0)return;forces.splice(forceIndex,1),forceMap.delete(forceName)},getForces:function(){return forceMap},step:function(){for(var i=0;i<forces.length;++i)forces[i](iterationNumber);var movement=integrate(bodies,settings.timeStep,settings.adaptiveTimeStepWeight);return iterationNumber+=1,movement},addBody:function(body){if(!body)throw new Error("Body is required");return bodies.push(body),body},addBodyAt:function(pos){if(!pos)throw new Error("Body position is required");var body=(pos=>new Body(pos))(pos);return bodies.push(body),body},removeBody:function(body){if(body){var idx=bodies.indexOf(body);if(!(idx<0))return bodies.splice(idx,1),0===bodies.length&&bounds.reset(),!0}},addSpring:function(body1,body2,springLength,springCoefficient){if(!body1||!body2)throw new Error("Cannot add null spring to force simulator");"number"!=typeof springLength&&(springLength=-1);var spring=new Spring(body1,body2,springLength,springCoefficient>=0?springCoefficient:-1);return springs.push(spring),spring},getTotalMovement:function(){return 0},removeSpring:function(spring){if(spring){var idx=springs.indexOf(spring);return idx>-1?(springs.splice(idx,1),!0):void 0}},getBestNewBodyPosition:function(neighbors){return bounds.getBestNewPosition(neighbors)},getBBox:getBoundingBox,getBoundingBox:getBoundingBox,invalidateBBox:function(){console.warn("invalidateBBox() is deprecated, bounds always recomputed on `getBBox()` call")},gravity:function(value){return void 0!==value?(settings.gravity=value,quadTree.options({gravity:value}),this):settings.gravity},theta:function(value){return void 0!==value?(settings.theta=value,quadTree.options({theta:value}),this):settings.theta},random:random};return function(settings,target){for(var key in settings)augment(settings,target,key)}(settings,publicApi),eventify(publicApi),publicApi;function getBoundingBox(){return bounds.update(),bounds.box}function addForce(forceName,forceFunction){if(forceMap.has(forceName))throw new Error("Force "+forceName+" is already added");forceMap.set(forceName,forceFunction),forces.push(forceFunction)}};var generateCreateBodyFunction=require("./codeGenerators/generateCreateBody"),generateQuadTreeFunction=require("./codeGenerators/generateQuadTree"),generateBoundsFunction=require("./codeGenerators/generateBounds"),generateCreateDragForceFunction=require("./codeGenerators/generateCreateDragForce"),generateCreateSpringForceFunction=require("./codeGenerators/generateCreateSpringForce"),generateIntegratorFunction=require("./codeGenerators/generateIntegrator"),dimensionalCache={};function augment(source,target,key){if(source.hasOwnProperty(key)&&"function"!=typeof target[key]){var sourceIsNumber=Number.isFinite(source[key]);target[key]=sourceIsNumber?function(value){if(void 0!==value){if(!Number.isFinite(value))throw new Error("Value of "+key+" should be a valid number.");return source[key]=value,target}return source[key]}:function(value){return void 0!==value?(source[key]=value,target):source[key]}}}},{"./codeGenerators/generateBounds":2,"./codeGenerators/generateCreateBody":3,"./codeGenerators/generateCreateDragForce":4,"./codeGenerators/generateCreateSpringForce":5,"./codeGenerators/generateIntegrator":6,"./codeGenerators/generateQuadTree":7,"./spring":9,"ngraph.events":10,"ngraph.merge":11,"ngraph.random":12}],9:[function(require,module,exports){module.exports=function(fromBody,toBody,length,springCoefficient){this.from=fromBody,this.to=toBody,this.length=length,this.coefficient=springCoefficient}},{}],10:[function(require,module,exports){module.exports=function(subject){!function(subject){if(!subject)throw new Error("Eventify cannot use falsy object as events subject");for(var reservedWords=["on","fire","off"],i=0;i<reservedWords.length;++i)if(subject.hasOwnProperty(reservedWords[i]))throw new Error("Subject cannot be eventified, since it already has property '"+reservedWords[i]+"'")}(subject);var eventsStorage=function(subject){var registeredEvents=Object.create(null);return{on:function(eventName,callback,ctx){if("function"!=typeof callback)throw new Error("callback is expected to be a function");var handlers=registeredEvents[eventName];return handlers||(handlers=registeredEvents[eventName]=[]),handlers.push({callback:callback,ctx:ctx}),subject},off:function(eventName,callback){if(void 0===eventName)return registeredEvents=Object.create(null),subject;if(registeredEvents[eventName])if("function"!=typeof callback)delete registeredEvents[eventName];else for(var callbacks=registeredEvents[eventName],i=0;i<callbacks.length;++i)callbacks[i].callback===callback&&callbacks.splice(i,1);return subject},fire:function(eventName){var fireArguments,callbacks=registeredEvents[eventName];if(!callbacks)return subject;arguments.length>1&&(fireArguments=Array.prototype.splice.call(arguments,1));for(var i=0;i<callbacks.length;++i){var callbackInfo=callbacks[i];callbackInfo.callback.apply(callbackInfo.ctx,fireArguments)}return subject}}}(subject);return subject.on=eventsStorage.on,subject.off=eventsStorage.off,subject.fire=eventsStorage.fire,subject}},{}],11:[function(require,module,exports){module.exports=function merge(target,options){var key;target||(target={});if(options)for(key in options)if(options.hasOwnProperty(key)){var targetHasIt=target.hasOwnProperty(key),optionsValueType=typeof options[key];!targetHasIt||typeof target[key]!==optionsValueType?target[key]=options[key]:"object"===optionsValueType&&(target[key]=merge(target[key],options[key]))}return target}},{}],12:[function(require,module,exports){function random(inputSeed){return new Generator("number"==typeof inputSeed?inputSeed:+new Date)}function Generator(seed){this.seed=seed}function nextDouble(){var seed=this.seed;return seed=4294967295&(3042594569^(seed=(seed=4294967295&((seed=(seed=4294967295&(3345072700^(seed=seed+2127912214+(seed<<12)&4294967295)^seed>>>19))+374761393+(seed<<5)&4294967295)+3550635116^seed<<9))+4251993797+(seed<<3)&4294967295)^seed>>>16),this.seed=seed,(268435455&seed)/268435456}module.exports=random,module.exports.random=random,module.exports.randomIterator=function(array,customRandom){var localRandom=customRandom||random();if("function"!=typeof localRandom.next)throw new Error("customRandom does not match expected API: next() function is missing");return{forEach:function(callback){var i,j,t;for(i=array.length-1;i>0;--i)j=localRandom.next(i+1),t=array[j],array[j]=array[i],array[i]=t,callback(t);array.length&&callback(array[0])},shuffle:function(){var i,j,t;for(i=array.length-1;i>0;--i)j=localRandom.next(i+1),t=array[j],array[j]=array[i],array[i]=t;return array}}},Generator.prototype.next=function(maxValue){return Math.floor(this.nextDouble()*maxValue)},Generator.prototype.nextDouble=nextDouble,Generator.prototype.uniform=nextDouble,Generator.prototype.gaussian=function(){var r,x,y;do{x=2*this.nextDouble()-1,y=2*this.nextDouble()-1,r=x*x+y*y}while(r>=1||0===r);return x*Math.sqrt(-2*Math.log(r)/r)}},{}]},{},[1])(1)}));
|