UNPKG

unique-grouping

Version:

Groups list of individuals in K unique groupings of N groups using simulated annealing

2 lines 2.77 kB
"use strict";function _interopDefault(e){return e&&"object"==typeof e&&"default"in e?e.default:e}Object.defineProperty(exports,"__esModule",{value:!0});var SimulatedAnnealing=_interopDefault(require("simulated-annealing")),chunk=_interopDefault(require("chunk")),Combinatorics=_interopDefault(require("js-combinatorics")),empty=_interopDefault(require("is-empty")),last=_interopDefault(require("array-last")),isPositiveInteger=_interopDefault(require("validate.io-positive-integer")),findLastIndex=_interopDefault(require("lodash.findlastindex")),d3=_interopDefault(require("d3-array")),clone=_interopDefault(require("clone")),equal=_interopDefault(require("fast-deep-equal")),StringBuilder=_interopDefault(require("yassb")),uniqueRandomArray=_interopDefault(require("unique-random-array")),random=_interopDefault(require("random")),randomArrayIndex=_interopDefault(require("random-array-index"));const UniqueGrouping=(e=[],r=[],t=[],n,a={tempMax:65,tempMin:7e-4,coolingRate:2e-4,alpha:1,beta:1})=>{const i=(e,r)=>chunk(d3.shuffle(e),r),o=e=>e.reduce((e,n)=>{const a=(e,r)=>f*e**2+r.reduce((e,r)=>e+r*p,0),i=n.length;return 0===i?e:1===i?e+a(i,[]):e+a(i,Combinatorics.combination(n,2).map(e=>{if(t.some(r=>equal(r,e)||equal(r,e.reverse())))return 1/0;const[n,a]=e,{lastSeen:i,timesSeen:o}=((e,t)=>{const n=r.map(r=>r.filter(r=>r.some(r=>equal(r,e))&&r.some(e=>equal(e,t)))),a=n.length-1;return{lastSeen:empty(n)?-100:a-findLastIndex(n,e=>!empty(e)),timesSeen:n.filter(e=>!empty(e)).length}})(n,a);return((e,r,t)=>e/(1+(r/t)**2))(o+1,i,r.length+1)}))},0),u=e=>{const r=clone(e),t=uniqueRandomArray(r.filter(e=>!empty(e))),n=t(),a=t();return n.length>a.length&&random.boolean()?((e,r)=>{const t=randomArrayIndex(e);r.push(...e.splice(t,1))})(n,a):((e,r)=>{const t=randomArrayIndex(e),n=randomArrayIndex(r);[e[t],r[n]]=[r[n],e[t]]})(n,a),r},l=e=>e-d,{tempMax:s,tempMin:m,coolingRate:d,alpha:p,beta:f}=a;if(!isPositiveInteger(n))throw new Error("groupSize must be an integer greater than 0");if(empty(e)){if(empty(r))throw new Error("Either history or people must be a non-empty array");e=last(r).flat()}return new Promise((r,t)=>r(SimulatedAnnealing({initialState:i(e,n),tempMax:s,tempMin:m,newState:u,getTemp:l,getEnergy:o})))},grade=(e,r,t)=>{const n=new StringBuilder,a=e.reduce((e,a)=>{return a.length<2?e:e+Combinatorics.combination(a,2).reduce((e,a)=>{if(t.some(e=>equal(e,a)||equal(e,a.reverse())))return n.addLine(`FORBIDDEN PAIR DETECTED: ${i} is with ${o}`),1/0;const[i,o]=a,u=((e,t)=>r.flat().filter(r=>r.some(r=>equal(r,e))&&r.some(e=>equal(e,t))).length)(i,o);return n.addLine(`${i} has seen ${o} ${u} time(s)`),e+u},0)},0);return{log:n.toString(),totalTimesSeen:a}};exports.default=UniqueGrouping,exports.grade=grade; //# sourceMappingURL=index.min.js.map