solar-scores
Version:
Compute scores for solar decathlon competition - Cali 2015
82 lines (66 loc) • 2.81 kB
JavaScript
;
const utils = require('./../utils');
const baseScore = require('./../baseScore');
class Luminosity extends baseScore {
constructor(options) {
super(options);
}
setReference(value, param) {
this.reference = utils.filterValues(value, param);
this.reference = utils.resampleWithMax([this.reference], [param], 'Luminosity');
}
setInternal(value, param) {
this.luminosity = utils.filterValues(value, param);
this.luminosity = this.luminosity.filter(function(val) {
return val[param] > 10;
});
this.luminosity = utils.resampleWithMax([this.luminosity], [param], 'Luminosity');
}
getScore(asOfDate) {
// Remove null values
var refByDay = utils.filterByEpochPerDay(this.reference, 'Luminosity');
var byDay = utils.filterByEpochPerDay(this.luminosity, 'Luminosity');
for(let i=0; i<byDay.length; i++) {
let data = byDay[i].data;
let refData = refByDay[i].data;
let l = byDay[i].periods.length;
byDay[i].points = new Array(l);
byDay[i].pointsFraction = new Array(l);
byDay[i].maxUntilNow = new Array(l);
byDay[i].fraction = new Array(l);
for(var j=0; j < l; j++) {
var luminosities = data[j].map(function(val) {
return val.value;
});
luminosities = utils.interpolate(luminosities);
var ref = refData[j].map(function(val) {
return val.value;
});
ref = utils.interpolate(ref);
var elapsedFraction = utils.getElapsedFraction([byDay[i].periods[j]], asOfDate);
if (ref.length < 3 || ref[0] === null) {
byDay[i].points[j] = 0;
byDay[i].maxUntilNow[j] = byDay[i].periods[j].points * elapsedFraction;
byDay[i].fraction[j] = 0;
continue;
}
var avg = 0;
var count = 0;
for (let k = 1; k < ref.length - 1; k++) {
let refAvg = ref[k-1] + ref[k] + ref[k+1];
refAvg /= 3;
if(refAvg <= 0) continue;
let perc = luminosities[k] / refAvg;
avg += this.scoringFunction(perc);
count++;
}
avg /= count;
byDay[i].fraction[j] = avg;
byDay[i].points[j] = avg * byDay[i].periods[j].points * elapsedFraction;
byDay[i].maxUntilNow[j] = byDay[i].periods[j].points * elapsedFraction;
}
}
return utils.finalizeScores(byDay);
}
}
module.exports = Luminosity;