47 template <
typename elem,
typename sequence = vector< elem >,
typename comparator = Compare< elem > >
80 bool deletesFirst) :
A(
a),
B(
b),
ses(deletesFirst) {
93 const comparator& comp) :
A(
a),
B(
b),
ses(deleteFirst),
cmp(comp) {
108 return lcs.getSequence();
137 this->trivial =
true;
141 this->trivial =
false;
145 this->editDistanceOnly =
true;
166 this->trivial =
true;
170 this->trivial =
false;
174 this->editDistanceOnly =
true;
181 elemList seqLst(seq.begin(), seq.end());
183 sesElemVec_iter vsesIt;
184 elemList_iter lstIt = seqLst.begin();
185 long long inc_dec_total = 0;
191 it->a += inc_dec_total;
192 inc_dec_total += it->inc_dec_count;
193 for (
long long i=0;
i<it->a - gap;++
i) {
196 gap = it->a + it->b + it->inc_dec_count;
197 vsesIt = shunk.begin();
198 while (vsesIt!=shunk.end()) {
199 switch (vsesIt->second.type) {
201 seqLst.insert(lstIt, vsesIt->first);
204 if (lstIt != seqLst.end()) {
205 lstIt = seqLst.erase(lstIt);
209 if (lstIt != seqLst.end()) {
222 sequence patchedSeq(seqLst.begin(), seqLst.end());
229 sequence
patch (
const sequence& seq)
const {
230 sesElemVec sesSeq =
ses.getSequence();
231 elemList seqLst(seq.begin(), seq.end());
232 elemList_iter lstIt = seqLst.begin();
233 for (sesElemVec_iter sesIt=sesSeq.begin();sesIt!=sesSeq.end();++sesIt) {
234 switch (sesIt->second.type) {
236 seqLst.insert(lstIt, sesIt->first);
239 lstIt = seqLst.erase(lstIt);
249 sequence patchedSeq(seqLst.begin(), seqLst.end());
265 fp =
new long long[
M +
N + 3];
266 fill(&
fp[0], &
fp[
M +
N + 3], -1);
272 for (
long long k=-p;k<=static_cast<long long>(
delta)-1;++k) {
275 for (
long long k=
static_cast<long long>(
delta)+p;k>=
static_cast<long long>(
delta)+1;--k) {
295 epc.push_back(cordinate);
312 template <
typename stream >
314 sesElemVec ses_v =
ses.getSequence();
319 printSES< ostream >(
out);
325 template <
typename stream >
332 printSES< ostream >(s,
out);
338 template <
typename stream >
344 printUnifiedFormat< ostream >(
out);
350 template <
typename stream >
356 printUnifiedFormat< ostream >(hunks,
out);
363 sesElemVec common[2];
365 sesElemVec ses_v =
ses.getSequence();
367 long long length = distance(ses_v.begin(), ses_v.end());
368 long long middle = 0;
369 bool isMiddle, isAfter;
371 long long a,
b, c, d;
372 long long inc_dec_count = 0;
377 isMiddle = isAfter =
false;
380 for (sesElemVec_iter it=ses_v.begin();it!=ses_v.end();++it, ++l_cnt) {
382 switch (einfo.
type) {
387 if (!isMiddle) isMiddle =
true;
389 if (l_cnt >= length) {
398 deletes.push_back(*it);
399 if (!isMiddle) isMiddle =
true;
401 if (l_cnt >= length) {
409 if (common[1].
empty() && adds.empty() && deletes.empty() && change.empty()) {
411 if (
a == 0 && c == 0) {
420 common[0].push_back(*it);
422 rotate(common[0].begin(), common[0].begin() + 1, common[0].end());
423 common[0].pop_back();
424 common[0].push_back(*it);
429 if (isMiddle && !isAfter) {
433 change.push_back(*it);
446 if (isAfter && !change.empty()) {
447 sesElemVec_iter cit = it;
460 long long c0size =
static_cast<long long>(common[0].size());
465 common[0].pop_back();
477 hunk.
common[0] = common[0];
479 hunk.
common[1] = common[1];
489 a =
b = c = d = middle = inc_dec_count = 0;
497 template <
typename stream>
502 long long x_idx, y_idx;
504 while (getline(st, line)) {
505 elem mark(line.begin(), line.begin() + 1);
506 elem e(line.begin() + 1, line.end());
527 #ifdef NCBI_COMPILER_WORKSHOP
528 distance(
A.begin(),
A.end(),
M);
529 distance(
B.begin(),
B.end(),
N);
531 M = distance(
A.begin(),
A.end());
532 N = distance(
B.begin(),
B.end());
553 long long snake(
const long long& k,
const long long& above,
const long long& below) {
555 long long y =
max(above, below);
557 while ((
size_t)x <
M && (
size_t)y <
N && (
swapped ?
cmp.impl(
B[(
size_t)y],
A[(
size_t)x]) :
cmp.impl(
A[(
size_t)x],
B[(
size_t)y]))) {
564 p.
x = x;p.
y = y;p.
k =
r;
574 sequence_const_iter x(
A.begin());
575 sequence_const_iter y(
B.begin());
576 long long x_idx, y_idx;
577 long long px_idx, py_idx;
578 bool complete =
false;
581 for (
size_t i=v.size()-1;!complete;--
i) {
582 while(px_idx < v[
i].x || py_idx < v[
i].y) {
583 if (v[
i].y - v[
i].x > py_idx - px_idx) {
592 }
else if (v[
i].y - v[
i].x < py_idx - px_idx) {
617 if (
i == 0) complete =
true;
620 if (x_idx >
static_cast<long long>(
M) && y_idx >
static_cast<long long>(
N)) {
636 sequence A_(
A.begin() + (
size_t)x_idx - 1,
A.end());
637 sequence B_(
B.begin() + (
size_t)y_idx - 1,
B.end());
640 #ifdef NCBI_COMPILER_WORKSHOP
641 distance(
A.begin(),
A.end(),
M);
642 distance(
B.begin(),
B.end(),
N);
644 M = distance(
A.begin(),
A.end());
645 N = distance(
B.begin(),
B.end());
650 fp =
new long long[
M +
N + 3];
651 fill(&
fp[0], &
fp[
M +
N + 3], -1);
663 ses.addSequence(*it, idx, 0, et);
668 ses.addSequence(*it, idx, 0, et);
675 void inline joinSesVec (sesElemVec& s1, sesElemVec& s2)
const {
677 for (sesElemVec_iter vit=s2.begin();vit!=s2.end();++vit) {
ses element printer class template
diff class template sequence must support random_access_iterator.
void enableTrivial() const
static Ses< elem > composeSesFromStream(stream &st)
compose ses from stream
void printUnifiedFormat(stream &out) const
print difference between A and B in the Unified Format
dtl_typedefs(elem, sequence) sequence A
Diff(const sequence &a, const sequence &b, const comparator &comp)
void printSES(ostream &out=cout) const
Diff(const sequence &a, const sequence &b, bool deletesFirst)
static void printUnifiedFormat(const uniHunkVec &hunks, stream &out)
print unified format difference with given unified format hunks
void editDistanceOnlyEnabled()
void recordOddSequence(long long idx, long long length, sequence_const_iter it, const edit_t et)
record odd sequence in SES
void composeUnifiedHunks()
compose Unified Format Hunks from Shortest Edit Script
sequence patch(const sequence &seq) const
patching with Shortest Edit Script (SES)
void compose()
compose Longest Common Subsequence and Shortest Edit Script.
long long getEditDistance() const
bool wasSwapped() const
check if the sequences have been swapped
static void printSES(const Ses< elem > &s, stream &out)
print differences given an SES
elemVec getLcsVec() const
Diff(const sequence &a, const sequence &b, bool deleteFirst, const comparator &comp)
sequence uniPatch(const sequence &seq)
patching with Unified Format Hunks
editPathCordinates pathCordinates
void printSES(stream &out) const
print difference between A and B as an SES
Lcs< elem > getLcs() const
Diff(const sequence &a, const sequence &b)
void printUnifiedFormat(ostream &out=cout) const
bool recordSequence(const editPathCordinates &v)
record SES and LCS
uniHunkVec getUniHunks() const
bool trivialEnabled() const
Ses< elem > getSes() const
long long snake(const long long &k, const long long &above, const long long &below)
search shortest path and record the path
static void printUnifiedFormat(const uniHunkVec &hunks, ostream &out=cout)
void joinSesVec(sesElemVec &s1, sesElemVec &s2) const
join SES vectors
static void printSES(const Ses< elem > &s, ostream &out=cout)
void onOnlyEditDistance()
Longest Common Subsequence template class.
Shortest Edit Script template class.
sesElemVec getSequence() const
void addSequence(elem e, long long beforeIdx, long long afterIdx, const edit_t type)
unified format element printer class template
std::ofstream out("events_result.xml")
main entry point for tests
void swap(NCBI_NS_NCBI::pair_base_member< T1, T2 > &pair1, NCBI_NS_NCBI::pair_base_member< T1, T2 > &pair2)
constexpr auto rotate(list< Ts... >) -> decltype((list<>{}+...+rotate_item< Ts >{}))
constexpr bool empty(list< Ts... >) noexcept
dtl – Diff Template Library
int edit_t
type of edit for SES
const long long DTL_CONTEXT_SIZE
const unsigned long long MAX_CORDINATES_SIZE
limit of cordinate size
const long long DTL_SEPARATE_SIZE
vector< long long > editPath
vector< P > editPathCordinates
const struct ncbi::grid::netcache::search::fields::SIZE size
double r(size_t dimension_, const Int4 *score_, const double *prob_, double theta_)
cordinate for registering route
Structure of Unified Format Hunk.
vector< sesElem > common[2]
#define SES_MARK_DELETE
mark of SES