static void multiwayMergeFiles( std::vector < std::string > const & inputfilenames, std::string const & outputfilename ) { typedef ::libmaus2::graph::TripleEdgeInput input_type; typedef input_type::unique_ptr_type input_ptr_type; ::libmaus2::autoarray::AutoArray<input_ptr_type> inputs(inputfilenames.size()); for ( uint64_t i = 0; i < inputfilenames.size(); ++i ) { input_ptr_type tinputsi ( new input_type ( inputfilenames[i] , 32*1024 ) ); inputs[i] = UNIQUE_PTR_MOVE(tinputsi); } ::libmaus2::autoarray::AutoArray < ::libmaus2::graph::TripleEdge > triples(inputfilenames.size()); ::libmaus2::autoarray::AutoArray < bool > ok(inputfilenames.size()); ::libmaus2::graph::TripleEdgeOutputMerge output(outputfilename, 32*1024); for ( uint64_t i = 0; i < inputfilenames.size(); ++i ) ok [i] = inputs[i]->getNextTriple ( triples[i] ); while ( anyTrue ( ok ) ) { uint64_t const minidx = minOk(ok,triples); output.write ( triples[minidx] ); ok[minidx] = inputs[minidx]->getNextTriple( triples[minidx] ); } }
static inline uint64_t minOk( ::libmaus2::autoarray::AutoArray < bool > const & ok, ::libmaus2::autoarray::AutoArray < ::libmaus2::graph::TripleEdge > const & triples ) { assert ( anyTrue ( ok ) ); bool foundok = false; uint64_t minidx = 0; while ( ! foundok ) if ( ok[minidx] ) foundok = true; else minidx++; assert ( ok[minidx] ); ::libmaus2::graph::TripleEdge mintrip = triples[minidx]; for ( uint64_t i = 0; i < triples.getN(); ++i ) if ( ok[i] && triples[i] < mintrip ) { mintrip = triples[i]; minidx = i; } return minidx; }
bool anyTrue(const double a[], int n) { if (n <= 0) return false; if(somePredicate(a[n-1])) return true; return anyTrue(a, n-1); }
// 2.1 compatibility array anytrue(const array &in, const int dim) { return anyTrue(in, dim); }