1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
package var2;
import shared.Tools;
import structures.ByteBuilder;
public class SoftClipper {
public static byte[] softClipMatch(byte[] match, int minClipLength, boolean allowMutation,
final int oldStart, final int oldStop, final int[] startStopRvec){
final int matchScore=100;
final int subScore=-200;
final int subScore2=-100;
final int insScore=-200;
final int delScore=-200;
final int delScore2=-10;
final int clipScore=-1;
final int nScore=1;
int insCount=0;
int delCount=0;
long score=0;
long maxScore=0;
int maxPos=-1;
int maxStart=-1;
int currentStart=-1;
byte current='?';
for(int mpos=0; mpos<match.length; mpos++){
final byte m=match[mpos];
// long prevScore=score;
if(m=='m' || m=='N' || m=='R'){
if(score==0){currentStart=mpos;}
score=score+(m=='m' ? matchScore : nScore);
if(score>maxScore){
maxScore=score;
maxPos=mpos;
maxStart=currentStart;
}
}else{
if(m=='S' || m=='s'){
score=score+(m==current ? subScore2 : subScore);
}else if(m=='D'){
score=score+(m==current ? delScore2 : delScore);
delCount++;
}else if(m=='I' || m=='X' || m=='Y'){
score=score+insScore;
insCount++;
}else if(m=='C'){
score=score+clipScore;
}
score=Tools.max(0, score);
}
current=m;
}
if(maxScore<1){return match;}
final int leftClipM=maxStart;
final int rightClipM=(match.length-maxPos-1);
int leftClip=0, rightClip=0;
for(int i=0; i<match.length; i++){
byte m=match[i];
if(i<maxStart){
leftClip+=(m=='D' ? 0 : 1);
}else if(i>maxPos){
rightClip+=(m=='D' ? 0 : 1);
}
}
if(leftClip<minClipLength && rightClip<minClipLength){return match;}
int start=oldStart, stop=oldStop;
if(delCount==0){
final byte[] array=allowMutation ? match : match.clone();
for(int i=0; i<leftClip; i++){array[i]='C';}
for(int i=0, j=array.length-1; i<rightClip; i++, j--){array[j]='C';}
startStopRvec[0]=start;
startStopRvec[1]=stop;
return array;
}
ByteBuilder bb=new ByteBuilder(match.length);
if(leftClip>=minClipLength){
for(int mpos=0, processed=0; mpos<match.length; mpos++){
byte m=match[mpos];
if(mpos>=leftClipM){
bb.append(m);
}else{
if(m=='D'){
start++;
}else if(m=='I'){
start--;
bb.append('C');
processed++;
}else{
bb.append('C');
processed++;
}
}
}
}else{
bb.append(match);
}
if(rightClip>=minClipLength){
bb.reverseInPlace();
byte[] temp=bb.toBytes();
bb.clear();
for(int mpos=0, processed=0; mpos<temp.length; mpos++){
byte m=temp[mpos];
if(mpos>=rightClipM){
bb.append(m);
}else{
if(m=='D'){
stop--;
}else if(m=='I'){
stop++;
bb.append('C');
processed++;
}else{
bb.append('C');
processed++;
}
}
}
bb.reverseInPlace();
}
startStopRvec[0]=start;
startStopRvec[1]=stop;
return bb.toBytes();
}
}
|