Fossil SCM

Additional alignment debugging information output for "fossil diff --debug".

drh 2022-01-23 11:29 diff-improvement
Commit 9aaefcfd0a8746b63bad3b832ff70b396130c4b705fb2c093d3315e88146b09b
1 file changed +21 -1
+21 -1
--- src/diff.c
+++ src/diff.c
@@ -1822,11 +1822,11 @@
18221822
int limit = minInt(nA-i, nB-j);
18231823
for(k=best; k<=limit && zA[k+i]==zB[k+j]; k++){}
18241824
if( k>best ) best = k;
18251825
}
18261826
}
1827
- score = (best>=avg) ? 0 : (avg - best)*100/avg;
1827
+ score = 5 + ((best>=avg) ? 0 : (avg - best)*95/avg);
18281828
18291829
#if 0
18301830
fprintf(stderr, "A: [%.*s]\nB: [%.*s]\nbest=%d avg=%d score=%d\n",
18311831
nA, zA+1, nB, zB+1, best, avg, score);
18321832
#endif
@@ -1937,10 +1937,18 @@
19371937
diffDLineXfer(dc.aTo, aRight, nRight);
19381938
longestCommonSequence(&dc,0,nLeft,0,nRight,&iSX,&iEX,&iSY,&iEY);
19391939
fossil_free(dc.aFrom);
19401940
nLCS = iEX - iSX;
19411941
if( nLCS<5 ) return 0; /* No good LCS was found */
1942
+
1943
+ if( pCfg->diffFlags & DIFF_DEBUG ){
1944
+ fossil_print(" LCS size=%d\n"
1945
+ " [%.*s]\n"
1946
+ " [%.*s]\n",
1947
+ nLCS, aLeft[iSX].n, aLeft[iSX].z,
1948
+ aLeft[iEX-1].n, aLeft[iEX-1].z);
1949
+ }
19421950
19431951
a1 = diffBlockAlignment(aLeft,iSX,aRight,iSY,pCfg,&n1);
19441952
a2 = diffBlockAlignment(aLeft+iEX, nLeft-iEX,
19451953
aRight+iEY, nRight-iEY,
19461954
pCfg, &n2);
@@ -1987,10 +1995,16 @@
19871995
aBig = aRight;
19881996
nBig = nRight;
19891997
}
19901998
iDivBig = nBig/2;
19911999
iDivSmall = nSmall/2;
2000
+
2001
+ if( pCfg->diffFlags & DIFF_DEBUG ){
2002
+ fossil_print(" Divide at [%.*s]\n",
2003
+ aBig[iDivBig].n, aBig[iDivBig].z);
2004
+ }
2005
+
19922006
bestScore = 10000;
19932007
for(i=0; i<nSmall; i++){
19942008
score = match_dline(aBig+iDivBig, aSmall+i) + abs(i-nSmall/2)*2;
19952009
if( score<bestScore ){
19962010
bestScore = score;
@@ -2070,10 +2084,16 @@
20702084
aM = fossil_malloc( nLeft + 2 );
20712085
memset(aM, 1, nLeft);
20722086
*pNResult = nLeft;
20732087
return aM;
20742088
}
2089
+
2090
+ if( pCfg->diffFlags & DIFF_DEBUG ){
2091
+ fossil_print("BlockAlignment:\n [%.*s] + %d\n [%.*s] + %d\n",
2092
+ aLeft[0].n, aLeft[0].z, nLeft,
2093
+ aRight[0].n, aRight[0].z, nRight);
2094
+ }
20752095
20762096
/* For large alignments, try to use alternative algorithms that are
20772097
** faster than the O(N*N) Wagner edit distance.
20782098
*/
20792099
if( nLeft*nRight>DIFF_ALIGN_MX && (pCfg->diffFlags & DIFF_SLOW_SBS)==0 ){
20802100
--- src/diff.c
+++ src/diff.c
@@ -1822,11 +1822,11 @@
1822 int limit = minInt(nA-i, nB-j);
1823 for(k=best; k<=limit && zA[k+i]==zB[k+j]; k++){}
1824 if( k>best ) best = k;
1825 }
1826 }
1827 score = (best>=avg) ? 0 : (avg - best)*100/avg;
1828
1829 #if 0
1830 fprintf(stderr, "A: [%.*s]\nB: [%.*s]\nbest=%d avg=%d score=%d\n",
1831 nA, zA+1, nB, zB+1, best, avg, score);
1832 #endif
@@ -1937,10 +1937,18 @@
1937 diffDLineXfer(dc.aTo, aRight, nRight);
1938 longestCommonSequence(&dc,0,nLeft,0,nRight,&iSX,&iEX,&iSY,&iEY);
1939 fossil_free(dc.aFrom);
1940 nLCS = iEX - iSX;
1941 if( nLCS<5 ) return 0; /* No good LCS was found */
 
 
 
 
 
 
 
 
1942
1943 a1 = diffBlockAlignment(aLeft,iSX,aRight,iSY,pCfg,&n1);
1944 a2 = diffBlockAlignment(aLeft+iEX, nLeft-iEX,
1945 aRight+iEY, nRight-iEY,
1946 pCfg, &n2);
@@ -1987,10 +1995,16 @@
1987 aBig = aRight;
1988 nBig = nRight;
1989 }
1990 iDivBig = nBig/2;
1991 iDivSmall = nSmall/2;
 
 
 
 
 
 
1992 bestScore = 10000;
1993 for(i=0; i<nSmall; i++){
1994 score = match_dline(aBig+iDivBig, aSmall+i) + abs(i-nSmall/2)*2;
1995 if( score<bestScore ){
1996 bestScore = score;
@@ -2070,10 +2084,16 @@
2070 aM = fossil_malloc( nLeft + 2 );
2071 memset(aM, 1, nLeft);
2072 *pNResult = nLeft;
2073 return aM;
2074 }
 
 
 
 
 
 
2075
2076 /* For large alignments, try to use alternative algorithms that are
2077 ** faster than the O(N*N) Wagner edit distance.
2078 */
2079 if( nLeft*nRight>DIFF_ALIGN_MX && (pCfg->diffFlags & DIFF_SLOW_SBS)==0 ){
2080
--- src/diff.c
+++ src/diff.c
@@ -1822,11 +1822,11 @@
1822 int limit = minInt(nA-i, nB-j);
1823 for(k=best; k<=limit && zA[k+i]==zB[k+j]; k++){}
1824 if( k>best ) best = k;
1825 }
1826 }
1827 score = 5 + ((best>=avg) ? 0 : (avg - best)*95/avg);
1828
1829 #if 0
1830 fprintf(stderr, "A: [%.*s]\nB: [%.*s]\nbest=%d avg=%d score=%d\n",
1831 nA, zA+1, nB, zB+1, best, avg, score);
1832 #endif
@@ -1937,10 +1937,18 @@
1937 diffDLineXfer(dc.aTo, aRight, nRight);
1938 longestCommonSequence(&dc,0,nLeft,0,nRight,&iSX,&iEX,&iSY,&iEY);
1939 fossil_free(dc.aFrom);
1940 nLCS = iEX - iSX;
1941 if( nLCS<5 ) return 0; /* No good LCS was found */
1942
1943 if( pCfg->diffFlags & DIFF_DEBUG ){
1944 fossil_print(" LCS size=%d\n"
1945 " [%.*s]\n"
1946 " [%.*s]\n",
1947 nLCS, aLeft[iSX].n, aLeft[iSX].z,
1948 aLeft[iEX-1].n, aLeft[iEX-1].z);
1949 }
1950
1951 a1 = diffBlockAlignment(aLeft,iSX,aRight,iSY,pCfg,&n1);
1952 a2 = diffBlockAlignment(aLeft+iEX, nLeft-iEX,
1953 aRight+iEY, nRight-iEY,
1954 pCfg, &n2);
@@ -1987,10 +1995,16 @@
1995 aBig = aRight;
1996 nBig = nRight;
1997 }
1998 iDivBig = nBig/2;
1999 iDivSmall = nSmall/2;
2000
2001 if( pCfg->diffFlags & DIFF_DEBUG ){
2002 fossil_print(" Divide at [%.*s]\n",
2003 aBig[iDivBig].n, aBig[iDivBig].z);
2004 }
2005
2006 bestScore = 10000;
2007 for(i=0; i<nSmall; i++){
2008 score = match_dline(aBig+iDivBig, aSmall+i) + abs(i-nSmall/2)*2;
2009 if( score<bestScore ){
2010 bestScore = score;
@@ -2070,10 +2084,16 @@
2084 aM = fossil_malloc( nLeft + 2 );
2085 memset(aM, 1, nLeft);
2086 *pNResult = nLeft;
2087 return aM;
2088 }
2089
2090 if( pCfg->diffFlags & DIFF_DEBUG ){
2091 fossil_print("BlockAlignment:\n [%.*s] + %d\n [%.*s] + %d\n",
2092 aLeft[0].n, aLeft[0].z, nLeft,
2093 aRight[0].n, aRight[0].z, nRight);
2094 }
2095
2096 /* For large alignments, try to use alternative algorithms that are
2097 ** faster than the O(N*N) Wagner edit distance.
2098 */
2099 if( nLeft*nRight>DIFF_ALIGN_MX && (pCfg->diffFlags & DIFF_SLOW_SBS)==0 ){
2100

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button