int64_t InsertIterativeKmers(const HashGraph &old_hash_graph, const Sequence &seq, HashGraph &hash_graph, int kmer_count) { int old_kmer_size = old_hash_graph.kmer_size(); int new_kmer_size = hash_graph.kmer_size(); Kmer old_kmer(old_kmer_size); Kmer new_kmer(new_kmer_size); int length = 0; int count = 0; int num_iterative_kmers = 0; for (uint32_t j = 0; j < seq.size(); ++j) { old_kmer.ShiftAppend(seq[j]); new_kmer.ShiftAppend(seq[j]); length = (seq[j] < 4) ? length + 1 : 0; count = (length >= old_kmer_size && old_hash_graph.FindVertex(old_kmer) != NULL) ? count+1 : 0; if (count >= new_kmer_size - old_kmer_size + 1) { ++num_iterative_kmers; HashGraphVertex *vertex = hash_graph.InsertVertex(new_kmer, kmer_count); HashGraphVertexAdaptor adaptor(vertex, new_kmer != vertex->kmer()); if (length > new_kmer_size && seq[j-new_kmer_size] < 4) adaptor.in_edges().Add(3 - seq[j-new_kmer_size]); if (j+1 < seq.size() && seq[j+1] < 4) adaptor.out_edges().Add(seq[j+1]); } } return num_iterative_kmers; }