Versie 0.2.0

This commit is contained in:
Atreides Assets committed 2026-10-29 11:57:29 +01:00
commit e77d8fd373
495 files changed
+81026

No files matched your search

+90
View File
@@ -0,0 +1,90 @@
// 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}%`;
}