twolinin / longphase

GNU General Public License v3.0
99 stars 9 forks source link

Speed up remove overlap alignment #83

Closed sloth-eat-pudding closed 1 month ago

sloth-eat-pudding commented 1 month ago

Modification erase vector method

image

Time testing and result verification output

Verify that the results are the same using the following code

    // Make a copy to verify the results
    std::vector<ReadVariant> in_readVariant_copy ;
    in_readVariant_copy.resize(in_readVariant.size());
    std::copy(in_readVariant.begin(), in_readVariant.end(), in_readVariant_copy.begin());

    // origin remove overlap alignment
    std::time_t oldRemoveTime = time(NULL);
    // fix 'idx >= 0'
    for( int idx = delReadIdx.size() -1 ; idx >= 0 ; idx-- ){
        in_readVariant.erase( in_readVariant.begin() + delReadIdx[idx] );
    }
    std::cerr << (*chr) << "\toldRemoveTime:" << difftime(time(NULL), oldRemoveTime) << "s";

    // new remove overlap alignment
    std::time_t newRemoveTime = time(NULL);
    delReadIdx.push_back((int)in_readVariant_copy.size());
    int saveIter = *(delReadIdx.begin());
    for (auto delIter = delReadIdx.begin(), nextdelIter = std::next(delReadIdx.begin(), 1); nextdelIter != delReadIdx.end(); delIter++ , nextdelIter++) {
        auto nowDelIter = *delIter+1;
        while (nowDelIter<*nextdelIter){
            in_readVariant_copy[saveIter++]=in_readVariant_copy[nowDelIter++];
        }
    }
    in_readVariant_copy.erase( std::next(in_readVariant_copy.begin(), saveIter), in_readVariant_copy.end());
    std::cerr <<"\tnewRemoveTime:" << difftime(time(NULL), newRemoveTime) << "s";

    // Verify the results
    if (in_readVariant_copy!=in_readVariant){
        std::cerr << "\tError\n";
    }
    else{
        std::cerr << "\tSuccess\n";
    }