static void DoTest() { int num_items=64; My402List list, list2; memset(&list, 0, sizeof(My402List)); memset(&list2, 0, sizeof(My402List)); (void)My402ListInit(&list); (void)My402ListInit(&list2); CreateTestList(&list, num_items); RandomShuffle(&list, num_items); FindAllInList(&list, num_items); CopyTestList(&list, &list2); BubbleSortForwardList(&list, num_items); if (gnDebug > 0) PrintTestList(&list, num_items); BubbleSortBackwardList(&list2, num_items); if (gnDebug > 0) PrintTestList(&list2, num_items); CompareTestList(&list, &list2, num_items); My402ListUnlinkAll(&list); My402ListUnlinkAll(&list2); }
void BlockRandomizer::RandomizeChunks() { // Create vector of chunk indices and shuffle them using current sweep as seed std::vector<size_t> randomizedChunkIndices; randomizedChunkIndices.reserve(m_numChunks); for (size_t i = 0; i < m_numChunks; i++) { randomizedChunkIndices.push_back(i); } if (m_useLegacyRandomization) { RandomShuffle(randomizedChunkIndices, m_sweep); } else { std::mt19937 m_rng((int)m_sweep); std::shuffle(randomizedChunkIndices.begin(), randomizedChunkIndices.end(), m_rng); } // Place randomized chunks on global time line m_randomizedChunks.clear(); m_randomizedChunks.reserve(m_numChunks + 1); size_t chunkId, samplePosition, sequencePosition; for (chunkId = 0, samplePosition = m_sweepStartInSamples, sequencePosition = 0; chunkId < m_numChunks; chunkId++) { const size_t originalChunkIndex = randomizedChunkIndices[chunkId]; const size_t numSequences = m_chunkInformation[originalChunkIndex + 1].m_sequencePositionStart - m_chunkInformation[originalChunkIndex].m_sequencePositionStart; const size_t numSamples = m_chunkInformation[originalChunkIndex + 1].m_samplePositionStart - m_chunkInformation[originalChunkIndex].m_samplePositionStart; m_randomizedChunks.push_back(RandomizedChunk{ sequencePosition, samplePosition, originalChunkIndex }); samplePosition += numSamples; sequencePosition += numSequences; } // Add sentinel m_randomizedChunks.push_back(RandomizedChunk{ sequencePosition, samplePosition, SIZE_MAX }); // For each chunk, compute the randomization range (w.r.t. the randomized chunk sequence) size_t halfWindowRange = m_randomizationRangeInSamples / 2; for (size_t chunkId = 0; chunkId < m_numChunks; chunkId++) { auto& chunk = m_randomizedChunks[chunkId]; // start with the range of left neighbor if (chunkId == 0) { chunk.m_windowBegin = 0; chunk.m_windowEnd = 1; } else { chunk.m_windowBegin = m_randomizedChunks[chunkId - 1].m_windowBegin; // might be too early chunk.m_windowEnd = m_randomizedChunks[chunkId - 1].m_windowEnd; // might have more space } while (chunk.m_info.m_samplePositionStart - m_randomizedChunks[chunk.m_windowBegin].m_info.m_samplePositionStart > halfWindowRange) chunk.m_windowBegin++; // too early // TODO m_randomizedChunks[chunk.windowend + 1].info.samplePositionStart - m_randomizedChunks[chunk.windowbegin].info.samplePositionStart < m_randomizationRangeInSamples while (chunk.m_windowEnd < m_numChunks && m_randomizedChunks[chunk.m_windowEnd + 1].m_info.m_samplePositionStart - chunk.m_info.m_samplePositionStart < halfWindowRange) chunk.m_windowEnd++; // got more space } }