StackGenVis: Alignment of Data, Algorithms, and Models for Stacking Ensemble Learning Using Performance Metrics
https://doi.org/10.1109/TVCG.2020.3030352
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
6.8 KiB
166 lines
6.8 KiB
// (c) Copyright 2016, Sean Connelly (@voidqk), http://syntheti.cc
|
|
// MIT License
|
|
// Project Home: https://github.com/voidqk/polybooljs
|
|
|
|
//
|
|
// filter a list of segments based on boolean operations
|
|
//
|
|
|
|
function select(segments, selection, buildLog){
|
|
var result = [];
|
|
segments.forEach(function(seg){
|
|
var index =
|
|
(seg.myFill.above ? 8 : 0) +
|
|
(seg.myFill.below ? 4 : 0) +
|
|
((seg.otherFill && seg.otherFill.above) ? 2 : 0) +
|
|
((seg.otherFill && seg.otherFill.below) ? 1 : 0);
|
|
if (selection[index] !== 0){
|
|
// copy the segment to the results, while also calculating the fill status
|
|
result.push({
|
|
id: buildLog ? buildLog.segmentId() : -1,
|
|
start: seg.start,
|
|
end: seg.end,
|
|
myFill: {
|
|
above: selection[index] === 1, // 1 if filled above
|
|
below: selection[index] === 2 // 2 if filled below
|
|
},
|
|
otherFill: null
|
|
});
|
|
}
|
|
});
|
|
|
|
if (buildLog)
|
|
buildLog.selected(result);
|
|
|
|
return result;
|
|
}
|
|
|
|
var SegmentSelector = {
|
|
union: function(segments, buildLog){ // primary | secondary
|
|
// above1 below1 above2 below2 Keep? Value
|
|
// 0 0 0 0 => no 0
|
|
// 0 0 0 1 => yes filled below 2
|
|
// 0 0 1 0 => yes filled above 1
|
|
// 0 0 1 1 => no 0
|
|
// 0 1 0 0 => yes filled below 2
|
|
// 0 1 0 1 => yes filled below 2
|
|
// 0 1 1 0 => no 0
|
|
// 0 1 1 1 => no 0
|
|
// 1 0 0 0 => yes filled above 1
|
|
// 1 0 0 1 => no 0
|
|
// 1 0 1 0 => yes filled above 1
|
|
// 1 0 1 1 => no 0
|
|
// 1 1 0 0 => no 0
|
|
// 1 1 0 1 => no 0
|
|
// 1 1 1 0 => no 0
|
|
// 1 1 1 1 => no 0
|
|
return select(segments, [
|
|
0, 2, 1, 0,
|
|
2, 2, 0, 0,
|
|
1, 0, 1, 0,
|
|
0, 0, 0, 0
|
|
], buildLog);
|
|
},
|
|
intersect: function(segments, buildLog){ // primary & secondary
|
|
// above1 below1 above2 below2 Keep? Value
|
|
// 0 0 0 0 => no 0
|
|
// 0 0 0 1 => no 0
|
|
// 0 0 1 0 => no 0
|
|
// 0 0 1 1 => no 0
|
|
// 0 1 0 0 => no 0
|
|
// 0 1 0 1 => yes filled below 2
|
|
// 0 1 1 0 => no 0
|
|
// 0 1 1 1 => yes filled below 2
|
|
// 1 0 0 0 => no 0
|
|
// 1 0 0 1 => no 0
|
|
// 1 0 1 0 => yes filled above 1
|
|
// 1 0 1 1 => yes filled above 1
|
|
// 1 1 0 0 => no 0
|
|
// 1 1 0 1 => yes filled below 2
|
|
// 1 1 1 0 => yes filled above 1
|
|
// 1 1 1 1 => no 0
|
|
return select(segments, [
|
|
0, 0, 0, 0,
|
|
0, 2, 0, 2,
|
|
0, 0, 1, 1,
|
|
0, 2, 1, 0
|
|
], buildLog);
|
|
},
|
|
difference: function(segments, buildLog){ // primary - secondary
|
|
// above1 below1 above2 below2 Keep? Value
|
|
// 0 0 0 0 => no 0
|
|
// 0 0 0 1 => no 0
|
|
// 0 0 1 0 => no 0
|
|
// 0 0 1 1 => no 0
|
|
// 0 1 0 0 => yes filled below 2
|
|
// 0 1 0 1 => no 0
|
|
// 0 1 1 0 => yes filled below 2
|
|
// 0 1 1 1 => no 0
|
|
// 1 0 0 0 => yes filled above 1
|
|
// 1 0 0 1 => yes filled above 1
|
|
// 1 0 1 0 => no 0
|
|
// 1 0 1 1 => no 0
|
|
// 1 1 0 0 => no 0
|
|
// 1 1 0 1 => yes filled above 1
|
|
// 1 1 1 0 => yes filled below 2
|
|
// 1 1 1 1 => no 0
|
|
return select(segments, [
|
|
0, 0, 0, 0,
|
|
2, 0, 2, 0,
|
|
1, 1, 0, 0,
|
|
0, 1, 2, 0
|
|
], buildLog);
|
|
},
|
|
differenceRev: function(segments, buildLog){ // secondary - primary
|
|
// above1 below1 above2 below2 Keep? Value
|
|
// 0 0 0 0 => no 0
|
|
// 0 0 0 1 => yes filled below 2
|
|
// 0 0 1 0 => yes filled above 1
|
|
// 0 0 1 1 => no 0
|
|
// 0 1 0 0 => no 0
|
|
// 0 1 0 1 => no 0
|
|
// 0 1 1 0 => yes filled above 1
|
|
// 0 1 1 1 => yes filled above 1
|
|
// 1 0 0 0 => no 0
|
|
// 1 0 0 1 => yes filled below 2
|
|
// 1 0 1 0 => no 0
|
|
// 1 0 1 1 => yes filled below 2
|
|
// 1 1 0 0 => no 0
|
|
// 1 1 0 1 => no 0
|
|
// 1 1 1 0 => no 0
|
|
// 1 1 1 1 => no 0
|
|
return select(segments, [
|
|
0, 2, 1, 0,
|
|
0, 0, 1, 1,
|
|
0, 2, 0, 2,
|
|
0, 0, 0, 0
|
|
], buildLog);
|
|
},
|
|
xor: function(segments, buildLog){ // primary ^ secondary
|
|
// above1 below1 above2 below2 Keep? Value
|
|
// 0 0 0 0 => no 0
|
|
// 0 0 0 1 => yes filled below 2
|
|
// 0 0 1 0 => yes filled above 1
|
|
// 0 0 1 1 => no 0
|
|
// 0 1 0 0 => yes filled below 2
|
|
// 0 1 0 1 => no 0
|
|
// 0 1 1 0 => no 0
|
|
// 0 1 1 1 => yes filled above 1
|
|
// 1 0 0 0 => yes filled above 1
|
|
// 1 0 0 1 => no 0
|
|
// 1 0 1 0 => no 0
|
|
// 1 0 1 1 => yes filled below 2
|
|
// 1 1 0 0 => no 0
|
|
// 1 1 0 1 => yes filled above 1
|
|
// 1 1 1 0 => yes filled below 2
|
|
// 1 1 1 1 => no 0
|
|
return select(segments, [
|
|
0, 2, 1, 0,
|
|
2, 0, 0, 1,
|
|
1, 0, 0, 2,
|
|
0, 1, 2, 0
|
|
], buildLog);
|
|
}
|
|
};
|
|
|
|
module.exports = SegmentSelector;
|
|
|