示例#1
0
int mergeFiles(){
    clock_t start, end;
    start = clock();
    int rounds=0;
    bool flag=1;
    while(flag) { //keep merging until number of file less than 2
        int fileCount = 0;
        int fileNextCount = 0;
        while(1) { // one round of merge
            string dataPath1 = basePath + "interFile_data_"+int2str(rounds)+"_"+int2str(fileCount);
            string indexPath1 = basePath+"interFile_index_"+int2str(rounds)+"_"+int2str(fileCount++);
            string dataPath2 = basePath +"interFile_data_"+int2str(rounds)+"_"+int2str(fileCount);
            string indexPath2 = basePath + "interFile_index_"+int2str(rounds)+"_"+int2str(fileCount++);
            string outputDataPath = basePath + "interFile_data_"+int2str(rounds+1)+"_"+int2str(fileNextCount);
            string outputIndexPath = basePath + "interFile_index_"+int2str(rounds+1)+"_"+int2str(fileNextCount++);
            
            cout<<dataPath1<<"  "<<dataPath2<<endl;
            Merge M;
            int fileOpened = M.initial(dataPath1,dataPath2,indexPath1,indexPath2);
            if(fileOpened<4 ){
                M.close();
                if( fileCount == 2 ){
                    flag =0;
                    cout <<"All merged"<<endl;
                }
                else {
                    cout <<"One round Complete."<<endl;
                    if(fileOpened == 2){
                        ifstream inputData(dataPath1,ios::binary);
                        ifstream inputIndex(indexPath1);
                        ofstream outputData(outputDataPath);
                        ofstream outputIndex(outputIndexPath);
                        outputData<<inputData.rdbuf();
                        outputIndex<<inputIndex.rdbuf();
                        inputData.close();
                        inputIndex.close();
                        outputData.close();
                        outputIndex.close();
                    }
                    rounds++;
                }
                break;
            }
            M.setOutput(outputDataPath, outputIndexPath);
            M.readIndex();
            M.startMerging();
            M.close();
            
        }
    }
    end = clock();
    double duration = (double) (end - start)/CLOCKS_PER_SEC;
    cout << "time cost is = "<<duration<<endl;
    return 0;
}
示例#2
0
void CorrelationUGenInternal::processBlock(bool& shouldDelete, const unsigned int blockID, const int channel) throw()
{
	const int blockSize = uGenOutput.getBlockSize();
	int numSamplesToProcess = blockSize;
	
	float* inputASamples = inputs[InputA].processBlock(shouldDelete, blockID, channel);
	float* inputBSamples = inputs[InputB].processBlock(shouldDelete, blockID, channel);
	float* outputSamples = uGenOutput.getSampleData();
	
    float* const windowsSamples = window.getDataUnchecked(0);
    float* const scoreSamples = score.getDataUnchecked(0);
	float* const bufferASamples = buffers.getDataUnchecked(InputBufferA);
	float* const bufferBSamples = buffers.getDataUnchecked(InputBufferB);
	float* const outputBufferSamples = buffers.getDataUnchecked(OutputBuffer);
	
	while(numSamplesToProcess > 0)
	{
		int bufferSamplesToProcess = length_ - bufferIndex;
	
		if(bufferSamplesToProcess > numSamplesToProcess)
		{			
			// buffer the inputs
			memcpy(bufferASamples + bufferIndex, inputASamples, numSamplesToProcess * sizeof(float));
			memcpy(bufferBSamples + bufferIndex, inputBSamples, numSamplesToProcess * sizeof(float));
			
            bufferIndex += numSamplesToProcess;
			inputASamples += numSamplesToProcess;
			inputBSamples += numSamplesToProcess;

			// ...and the output - output the lockedIndexOfMax into the outputSamples 
            outputIndex(outputSamples, numSamplesToProcess);
//            outputBuffer(outputSamples, numSamplesToProcess);
//            outputScore(outputSamples, numSamplesToProcess);
            
			outputSamples += numSamplesToProcess;
			numSamplesToProcess = 0;
		}
		else
		{
			numSamplesToProcess -= bufferSamplesToProcess;

			memcpy(bufferASamples + bufferIndex, inputASamples, bufferSamplesToProcess * sizeof(float));
			memcpy(bufferBSamples + bufferIndex, inputBSamples, bufferSamplesToProcess * sizeof(float));
			memset(outputBufferSamples, 0, (length_ + length_) * sizeof(float));
            
            //apply windows
            
            for (int i = 0; i < length_; i++)
            {
                bufferASamples[i] *= windowsSamples[i];
                bufferBSamples[i] *= windowsSamples[i];
            }
            
			bufferIndex += bufferSamplesToProcess;
			inputASamples += bufferSamplesToProcess;
			inputBSamples += bufferSamplesToProcess;
			
			vDSP_conv (bufferASamples, 1, 
                       bufferBSamples, 1,			
					   outputBufferSamples, 1, 
					   length_, length_);
                        
            for (int i = 0; i < length_; i++)
                scoreSamples[i] *= 0.9f;
            
            indexOfMax = findPeak(outputBufferSamples, length_);
            
            if ((indexOfMax >= 0) && (indexOfMax < length_))
            {
                if (lockedIndexOfMax >= 0)
                {
                    int diff = indexOfMax - lockedIndexOfMax;
                    
                    if (diff < 0)
                        diff = -diff;
                    
                    int maximum = length_ / 4;
                    diff = ugen::min(diff, maximum);
                    
                    int score = maximum - diff;
                    
                    float fScore = (float)score / maximum;
                    fScore = ugen::cubed(fScore);
                    
                    scoreSamples[indexOfMax] += fScore;
                }
                else
                {
                    scoreSamples[indexOfMax] += 1.f;
                }
            }
                        
            lockedIndexOfMax = findPeak(scoreSamples, length_);            
            
            // output the lockedIndexOfMax into the outputSamples 
            outputIndex(outputSamples, bufferSamplesToProcess);
//            outputBuffer(outputSamples, bufferSamplesToProcess);
//            outputScore(outputSamples, bufferSamplesToProcess);

            outputSamples += bufferSamplesToProcess;
			bufferSamplesToProcess = 0;
			bufferIndex = 0;
		}
	}
}