void generateSubSequenceStartPositions( const ICpuGpuVectorPtr& sequenceStartPositions, ICpuGpuVectorPtr& subSequenceStartPositions) { int numSeqs = sequenceStartPositions->getSize() - 1; const int* buf = sequenceStartPositions->getData(false); int numOnes = 0; for (int i = 0; i < numSeqs; ++i) { if (buf[i + 1] - buf[i] == 1) { ++numOnes; } } // each seq has two sub-seq except length 1 int numSubSeqs = numSeqs * 2 - numOnes; subSequenceStartPositions = ICpuGpuVector::create(numSubSeqs + 1, /* useGpu= */ false); int* subBuf = subSequenceStartPositions->getMutableData(false); int j = 0; for (int i = 0; i < numSeqs; ++i) { if (buf[i + 1] - buf[i] == 1) { subBuf[j++] = buf[i]; } else { int len = uniformRandom(buf[i + 1] - buf[i] - 1) + 1; subBuf[j++] = buf[i]; subBuf[j++] = buf[i] + len; } } subBuf[j] = buf[numSeqs]; }
TEST(Argument, poolSequenceWithStride) { Argument input, output; ICpuGpuVector::resizeOrCreate(input.sequenceStartPositions, 5, false); int* inStart = input.sequenceStartPositions->getMutableData(false); inStart[0] = 0; inStart[1] = 9; inStart[2] = 14; inStart[3] = 17; inStart[4] = 30; int strideResult[] = {0, 5, 9, 14, 17, 22, 27, 30}; int strideResultReversed[] = {0, 4, 9, 14, 17, 20, 25, 30}; for (auto reversed : {false, true}) { ICpuGpuVectorPtr stridePositions; output.poolSequenceWithStride( input, 5 /* stride */, &stridePositions, reversed); const int* outStart = output.sequenceStartPositions->getData(false); CHECK_EQ(outStart[0], 0); CHECK_EQ(outStart[1], 2); CHECK_EQ(outStart[2], 3); CHECK_EQ(outStart[3], 4); CHECK_EQ(outStart[4], 7); CHECK_EQ(stridePositions->getSize(), 8UL); auto result = reversed ? strideResultReversed : strideResult; for (int i = 0; i < 8; i++) { CHECK_EQ(stridePositions->getData(false)[i], result[i]); } } }
void generateMDimSequenceData(const ICpuGpuVectorPtr& sequenceStartPositions, IVectorPtr& cpuSequenceDims) { /* generate sequences with 2 dims */ int numSeqs = sequenceStartPositions->getSize() - 1; int numDims = 2; cpuSequenceDims = IVector::create(numSeqs * numDims, /* useGpu= */ false); const int* bufStarts = sequenceStartPositions->getData(false); int* bufDims = cpuSequenceDims->getData(); for (int i = 0; i < numSeqs; i++) { int len = bufStarts[i + 1] - bufStarts[i]; /* get width and height randomly */ std::vector<int> dimVec; for (int j = 0; j < len; j++) { if (len % (j + 1) == 0) { dimVec.push_back(1); } } int idx = rand() % dimVec.size(); // NOLINT use rand_r bufDims[i * numDims] = dimVec[idx]; bufDims[i * numDims + 1] = len / dimVec[idx]; } }