siafun
Version:
A collection of structure induction algorithms
64 lines (63 loc) • 2.81 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const _ = require("lodash");
const arrayutils_1 = require("arrayutils");
const similarity_1 = require("./similarity");
var TRACES;
(function (TRACES) {
TRACES[TRACES["NONE"] = 0] = "NONE";
TRACES[TRACES["DIAGONAL"] = 1] = "DIAGONAL";
TRACES[TRACES["UP"] = 2] = "UP";
TRACES[TRACES["LEFT"] = 3] = "LEFT";
})(TRACES = exports.TRACES || (exports.TRACES = {}));
exports.GAP_SCORE = -5;
class SmithWaterman {
//if similarity threshold is null, equality is enforced
constructor(similarityTreshold = null) {
this.similarityTreshold = similarityTreshold;
this.matchScore = 3;
this.mismatchScore = -2;
this.gapScore = exports.GAP_SCORE;
}
run(seq1, seq2, ignoredPoints = new Set()) {
ignoredPoints = _.clone(ignoredPoints);
//ignore diagonal if sequences equal
if (_.isEqual(seq1, seq2)) {
seq1.map((_e, i) => ignoredPoints.add(i + "," + i));
}
return this.internalRun(seq1, seq2, ignoredPoints);
}
internalRun(seq1, seq2, ignoredPoints) {
let scoreMatrix = seq1.map(s => seq2.map(t => 0));
let traceMatrix = seq1.map(s => seq2.map(t => 0));
seq1.forEach((s1, i) => {
seq2.forEach((s2, j) => {
let d_last = i > 0 && j > 0 ? scoreMatrix[i - 1][j - 1] : 0;
let u_last = i > 0 ? scoreMatrix[i - 1][j] : 0;
let l_last = j > 0 ? scoreMatrix[i][j - 1] : 0;
//here we don't give scores for self alignment!! hence i != j
let notIgnored = !ignoredPoints.has(i + "," + j);
let d_new = d_last + (notIgnored && this.isSimilar(s1, s2) ? this.matchScore : this.mismatchScore);
let u_new = u_last + this.gapScore;
let l_new = l_last + this.gapScore;
//ORDER NEEDS TO CORRESPOND TO TRACES ENUM ABOVE!!!!
let options = [0, d_new, u_new, l_new];
scoreMatrix[i][j] = _.max(options);
let trace = arrayutils_1.indexOfMax(options);
traceMatrix[i][j] = trace;
});
});
//console.log(JSON.stringify(scoreMatrix))
return { scoreMatrix: scoreMatrix, traceMatrix: traceMatrix };
}
//negative similarityTreshold interpreted as min intersection ratio
isSimilar(v1, v2) {
return (this.similarityTreshold > 0 && similarity_1.getCosineSimilarity(v1, v2) >= this.similarityTreshold)
|| (this.similarityTreshold < 0 && this.intersect(v1, v2) >= -1 * this.similarityTreshold)
|| _.isEqual(v1, v2);
}
intersect(v1, v2) {
return _.intersection(v1, v2).length / v1.length;
}
}
exports.SmithWaterman = SmithWaterman;