Home Reference Source Test

packages/causality-sampling/src/subSampling.mixins.js

const SubSamplingMixins = (BaseSamplingClass) => class extends BaseSamplingClass{
    /**
     * Perform uniform sample a sub set of Ids given the candidate list
     * @param { Number } samplingSize
     * @param { Array|Number } candidateList - list of candidates or size of candidate list
     * @param { Boolean } [replacable=true] - if true, no duplicated sampling Id returned
     * @returns { Array } array of sampled Ids
     */
    subSampling(samplingSize, candidateList, replacable=true){
        const R = this.R, Random = this.Random;
        let candidates = Array.isArray(candidateList)?R.clone(candidateList):R.range(0, candidateList);
        if(candidates.length === 0){
            throw Error('candidate length should be positive');
        }
        let samples = [], takenIdxs = R.clone(candidates);
        const GenNewCandidateIdx = ()=>Random.int(0, candidates.length-1);
        while(samples.length < samplingSize){
            let idx = GenNewCandidateIdx();
            if(!replacable && takenIdxs[idx]===null){
                continue;
            }
            samples = [...samples, candidates[idx]];
            if(!replacable){
                takenIdxs[idx]=null;//non replaceable
            }
        }    
        return samples;
    }
};
export default SubSamplingMixins;