Implement second exception rule
This commit is contained in:
+31
-1
@@ -42,6 +42,7 @@ function detectTemperatureShift(temperaturesOfCycle) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function rounded(val, step) {
|
function rounded(val, step) {
|
||||||
|
// we round the difference because of JS decimal weirdness
|
||||||
const inverted = 1 / step
|
const inverted = 1 / step
|
||||||
return Math.round(val * inverted) / inverted
|
return Math.round(val * inverted) / inverted
|
||||||
}
|
}
|
||||||
@@ -73,6 +74,16 @@ function checkIfFirstHighMeasurement(temp, i, temps, ltl) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (secondExceptionRuleApplies(temp, nextTemps, ltl)) {
|
||||||
|
return {
|
||||||
|
isFirstHighMeasurement: true,
|
||||||
|
rules: {
|
||||||
|
secondException: true,
|
||||||
|
},
|
||||||
|
ltl
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
isFirstHighMeasurement: false
|
isFirstHighMeasurement: false
|
||||||
}
|
}
|
||||||
@@ -81,18 +92,37 @@ function checkIfFirstHighMeasurement(temp, i, temps, ltl) {
|
|||||||
function regularRuleApplies(temp, nextTemps, ltl) {
|
function regularRuleApplies(temp, nextTemps, ltl) {
|
||||||
if (!nextTemps.every(temp => temp > ltl)) return false
|
if (!nextTemps.every(temp => temp > ltl)) return false
|
||||||
const thirdTemp = nextTemps[1]
|
const thirdTemp = nextTemps[1]
|
||||||
// we round the difference because of JS decimal weirdness
|
|
||||||
if (rounded(thirdTemp - ltl, 0.1) < 0.2) return false
|
if (rounded(thirdTemp - ltl, 0.1) < 0.2) return false
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
function firstExceptionRuleApplies(temp, nextTemps, ltl) {
|
function firstExceptionRuleApplies(temp, nextTemps, ltl) {
|
||||||
|
if (nextTemps.length < 3) return false
|
||||||
if (!nextTemps.every(temp => temp > ltl)) return false
|
if (!nextTemps.every(temp => temp > ltl)) return false
|
||||||
const fourthTemp = nextTemps[2]
|
const fourthTemp = nextTemps[2]
|
||||||
if (fourthTemp > ltl) return true
|
if (fourthTemp > ltl) return true
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function secondExceptionRuleApplies(temp, nextTemps, ltl) {
|
||||||
|
if (nextTemps.length < 3) return false
|
||||||
|
if (secondOrThirdTempIsAtOrBelowLtl(nextTemps, ltl)) {
|
||||||
|
const fourthTemp = nextTemps[2]
|
||||||
|
if (rounded(fourthTemp - ltl, 0.1) >= 0.2) return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
function secondOrThirdTempIsAtOrBelowLtl(nextTemps, ltl) {
|
||||||
|
const secondIsLow = nextTemps[0] <= ltl
|
||||||
|
const thirdIsLow = nextTemps[1] <= ltl
|
||||||
|
if ((secondIsLow || thirdIsLow) && !(secondIsLow && thirdIsLow)) {
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export {
|
export {
|
||||||
detectTemperatureShift
|
detectTemperatureShift
|
||||||
}
|
}
|
||||||
@@ -82,6 +82,12 @@ describe.only('sensiplan', () => {
|
|||||||
expect(status).to.eql({ detected: false })
|
expect(status).to.eql({ detected: false })
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('detects missing temperature shift with not enough high temps', function () {
|
||||||
|
const temps = [36.7, 36.57, 36.47, 36.49, 36.57, 36.62, 36.55, 36.8, 36.86, 36.77]
|
||||||
|
const status = detectTemperatureShift(temps)
|
||||||
|
expect(status).to.eql({ detected: false })
|
||||||
|
})
|
||||||
|
|
||||||
it('detects shift after an earlier one was invalid', function () {
|
it('detects shift after an earlier one was invalid', function () {
|
||||||
const temps = [36.4, 36.4, 36.4, 36.4, 36.4, 36.4, 36.6, 36.6, 36.4, 36.4, 36.7, 36.7, 36.7, 36.7]
|
const temps = [36.4, 36.4, 36.4, 36.4, 36.4, 36.4, 36.6, 36.6, 36.4, 36.4, 36.7, 36.7, 36.7, 36.7]
|
||||||
|
|
||||||
@@ -95,5 +101,55 @@ describe.only('sensiplan', () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('2nd exception rule', () => {
|
||||||
|
it('detects temperature shift with exception temp eql ltl', function () {
|
||||||
|
const secondException = [36.7, 36.57, 36.47, 36.49, 36.57, 36.62, 36.55, 36.8, 36.86, 36.6, 36.8]
|
||||||
|
const status = detectTemperatureShift(secondException)
|
||||||
|
expect(status).to.eql({
|
||||||
|
low: [36.55, 36.45, 36.5, 36.55, 36.6, 36.55],
|
||||||
|
ltl: 36.6,
|
||||||
|
high: [36.8, 36.85, 36.6, 36.8],
|
||||||
|
detected: true,
|
||||||
|
rules: { secondException: true }
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('detects temperature shift with exception temp lower than ltl', function () {
|
||||||
|
const secondException = [36.7, 36.57, 36.47, 36.49, 36.57, 36.62, 36.55, 36.8, 36.86, 36.4, 36.8]
|
||||||
|
const status = detectTemperatureShift(secondException)
|
||||||
|
expect(status).to.eql({
|
||||||
|
low: [36.55, 36.45, 36.5, 36.55, 36.6, 36.55],
|
||||||
|
ltl: 36.6,
|
||||||
|
high: [36.8, 36.85, 36.4, 36.8],
|
||||||
|
detected: true,
|
||||||
|
rules: { secondException: true }
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('detects missing temperature shift correctly', function () {
|
||||||
|
const temps = [36.7, 36.57, 36.47, 36.49, 36.57, 36.62, 36.55, 36.8, 36.86, 36.4, 36.77, 36.77]
|
||||||
|
const status = detectTemperatureShift(temps)
|
||||||
|
expect(status).to.eql({ detected: false })
|
||||||
|
})
|
||||||
|
|
||||||
|
it('detects missing temperature shift when not enough high temps', function () {
|
||||||
|
const temps = [36.7, 36.57, 36.47, 36.49, 36.57, 36.62, 36.55, 36.8, 36.86, 36.4]
|
||||||
|
const status = detectTemperatureShift(temps)
|
||||||
|
expect(status).to.eql({ detected: false })
|
||||||
|
})
|
||||||
|
|
||||||
|
it('detects shift after an earlier one was invalid', function () {
|
||||||
|
const temps = [36.7, 36.57, 36.47, 36.49, 36.57, 36.62, 36.55, 36.8, 36.86, 36.4, 36.77, 36.9, 36.9, 36.86, 37.04]
|
||||||
|
const status = detectTemperatureShift(temps)
|
||||||
|
expect(status).to.eql({
|
||||||
|
low: [36.6, 36.55, 36.8, 36.85, 36.4, 36.75],
|
||||||
|
ltl: 36.85,
|
||||||
|
high: [36.9, 36.9, 36.85, 37.05],
|
||||||
|
detected: true,
|
||||||
|
rules: { secondException: true }
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
Reference in New Issue
Block a user