90 lines
2.9 KiB
JavaScript
90 lines
2.9 KiB
JavaScript
// Generated, do not edit. sha256:74e4ed13a040cfe4e2dc4c23217c88607a06c14c8cc97aceaf7026b8d073ba91
|
|||
|
|
import { CONFIG } from '../../shared/config.js';
|
||
|
|
|
||
|
|
const LADDERS = CONFIG.AI.BUCKET_LADDERS;
|
||
|
|
|
||
|
|
function bodemVan(ladderNaam) {
|
||
|
|
const min = CONFIG.AI.BUCKET_MIN_VALUES[ladderNaam] || 0;
|
||
|
|
if (!min) return 0;
|
||
|
|
const ladder = LADDERS[ladderNaam];
|
||
|
|
let smalst = Infinity;
|
||
|
|
for (let i = 0; i < ladder.length; i++) {
|
||
|
|
const onder = ladder[i];
|
||
|
|
const boven = i + 1 < ladder.length ? ladder[i + 1] : 10;
|
||
|
|
smalst = Math.min(smalst, (boven - onder) / onder);
|
||
|
|
}
|
||
|
|
return min / smalst;
|
||
|
|
}
|
||
|
|
|
||
|
|
export function bucket(waarde, ladderNaam = 'COARSE') {
|
||
|
|
const ladder = LADDERS[ladderNaam];
|
||
|
|
if (!ladder) throw new Error(`unknown ladder: ${ladderNaam}`);
|
||
|
|
if (typeof waarde !== 'number' || !Number.isFinite(waarde)) return null;
|
||
|
|
|
||
|
|
if (waarde === 0) return { from: 0, to: 0, exact: true };
|
||
|
|
|
||
|
|
const negatief = waarde < 0;
|
||
|
|
const abs = Math.abs(waarde);
|
||
|
|
|
||
|
|
const bodem = Number.isInteger(waarde) ? bodemVan(ladderNaam) : 0;
|
||
|
|
if (bodem && abs < bodem) {
|
||
|
|
return negatief
|
||
|
|
? { from: -bodem, to: 0, exact: false, floor: true }
|
||
|
|
: { from: 0, to: bodem, exact: false, floor: true };
|
||
|
|
}
|
||
|
|
|
||
|
|
const orde = Math.floor(Math.log10(abs));
|
||
|
|
const schaal = 10 ** orde;
|
||
|
|
const genormaliseerd = Math.min(Math.max(abs / schaal, 1), 9.999999999);
|
||
|
|
|
||
|
|
let onder = ladder[0];
|
||
|
|
let boven = 10;
|
||
|
|
for (let i = 0; i < ladder.length; i++) {
|
||
|
|
if (genormaliseerd >= ladder[i]) {
|
||
|
|
onder = ladder[i];
|
||
|
|
boven = i + 1 < ladder.length ? ladder[i + 1] : 10;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
const van = onder * schaal;
|
||
|
|
const tot = boven * schaal;
|
||
|
|
return negatief ? { from: -tot, to: -van, exact: false } : { from: van, to: tot, exact: false };
|
||
|
|
}
|
||
|
|
|
||
|
|
export function bucketLabel(waarde, ladderNaam = 'COARSE') {
|
||
|
|
const b = bucket(waarde, ladderNaam);
|
||
|
|
if (!b) return null;
|
||
|
|
if (b.exact) return String(b.from);
|
||
|
|
if (b.floor) return b.to === 0 ? `meer dan ${getal(b.from)}` : `minder dan ${getal(b.to)}`;
|
||
|
|
return `${getal(b.from)} tot ${getal(b.to)}`;
|
||
|
|
}
|
||
|
|
|
||
|
|
function getal(n) {
|
||
|
|
return Number.isInteger(n) ? String(n) : String(Math.round(n * 100) / 100);
|
||
|
|
}
|
||
|
|
|
||
|
|
export function shareBucket(pct) {
|
||
|
|
const grenzen = CONFIG.AI.SHARE_BUCKETS;
|
||
|
|
if (typeof pct !== 'number' || !Number.isFinite(pct) || pct < 0) return null;
|
||
|
|
if (pct === 0) return { from: 0, to: 0, below: false };
|
||
|
|
if (pct < grenzen[0]) return { from: 0, to: grenzen[0], below: true };
|
||
|
|
|
||
|
|
let onder = grenzen[0];
|
||
|
|
let boven = grenzen[grenzen.length - 1];
|
||
|
|
for (let i = 0; i < grenzen.length; i++) {
|
||
|
|
if (pct >= grenzen[i]) {
|
||
|
|
onder = grenzen[i];
|
||
|
|
boven = i + 1 < grenzen.length ? grenzen[i + 1] : grenzen[i];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (onder === boven) return { from: 100, to: 100, below: false };
|
||
|
|
return { from: onder, to: boven, below: false };
|
||
|
|
}
|
||
|
|
|
||
|
|
export function shareLabel(pct) {
|
||
|
|
const b = shareBucket(pct);
|
||
|
|
if (!b) return null;
|
||
|
|
if (b.from === b.to) return `${b.from}%`;
|
||
|
|
if (b.below) return `minder dan ${b.to}%`;
|
||
|
|
return `${b.from} tot ${b.to}%`;
|
||
|
|
}
|