Some touchups

This commit is contained in:
Dominic Ferrando
2025-09-19 15:05:10 -04:00
parent 9bc7035d62
commit cb740a75d0
2 changed files with 93 additions and 20 deletions
+13 -10
View File
@@ -183,7 +183,10 @@ export class LevelCalculator {
} }
export type StandardsConfig = { export type StandardsConfig = {
maxLevel: number maxLevel: number,
weightModifier: number,
weightSkew: number,
ageModifier: number,
} }
export class Standards { export class Standards {
@@ -192,7 +195,10 @@ export class Standards {
constructor(activityStandards: ActivityStandards, cfg?: Partial<StandardsConfig>) { constructor(activityStandards: ActivityStandards, cfg?: Partial<StandardsConfig>) {
this.cfg = { this.cfg = {
maxLevel: cfg?.maxLevel ?? 100 maxLevel: cfg?.maxLevel ?? 100,
weightModifier: cfg?.weightModifier ?? .1,
weightSkew: cfg?.weightSkew ?? .1,
ageModifier: cfg?.ageModifier ?? .1,
}; };
// prepare data // prepare data
@@ -213,9 +219,8 @@ export class Standards {
for (const gender of Object.values(Gender)) { for (const gender of Object.values(Gender)) {
const referenceAge = 50; const referenceAge = 50;
const skewRatio = 0; // 0 = normal, 1 = max skew const minAge = referenceAge - (ageGenerator.step * ageGenerator.spread);
const minAge = referenceAge - (ageGenerator.step * ageGenerator.spread * (1 - skewRatio)); const maxAge = referenceAge + (ageGenerator.step * ageGenerator.spread);
const maxAge = referenceAge + (ageGenerator.step * ageGenerator.spread * (1 + skewRatio));
const referenceStandard = this const referenceStandard = this
.byActivity(activity) .byActivity(activity)
@@ -237,7 +242,7 @@ export class Standards {
for (const lvl in referenceStandard.levels) { for (const lvl in referenceStandard.levels) {
if (!referenceStandard.levels[lvl]) continue; if (!referenceStandard.levels[lvl]) continue;
const scalingExponent = .1; const scalingExponent = this.cfg.ageModifier;
const coefficient = ageGenerator.ratio === "inverse" ? const coefficient = ageGenerator.ratio === "inverse" ?
referenceAge / currAge : referenceAge / currAge :
currAge / referenceAge; currAge / referenceAge;
@@ -267,7 +272,7 @@ export class Standards {
for (const age of this.agesFor(activity, gender)) { for (const age of this.agesFor(activity, gender)) {
const referenceWeight = getAvgWeight(gender, age); const referenceWeight = getAvgWeight(gender, age);
const skewRatio = 0.4; // 0 = normal, 1 = max skew const skewRatio = this.cfg.weightSkew; // 0 = normal, 1 = max skew
const minWeight = referenceWeight - (weightGenerator.step * weightGenerator.spread * (1 - skewRatio)); const minWeight = referenceWeight - (weightGenerator.step * weightGenerator.spread * (1 - skewRatio));
const maxWeight = referenceWeight + (weightGenerator.step * weightGenerator.spread * (1 + skewRatio)); const maxWeight = referenceWeight + (weightGenerator.step * weightGenerator.spread * (1 + skewRatio));
@@ -291,7 +296,7 @@ export class Standards {
for (const lvl in referenceStandard.levels) { for (const lvl in referenceStandard.levels) {
if (!referenceStandard.levels[lvl]) continue; if (!referenceStandard.levels[lvl]) continue;
const scalingExponent = .1; const scalingExponent = this.cfg.weightModifier;
const coefficient = weightGenerator.ratio === "inverse" ? const coefficient = weightGenerator.ratio === "inverse" ?
referenceWeight / currWeight : referenceWeight / currWeight :
currWeight / referenceWeight; currWeight / referenceWeight;
@@ -383,7 +388,6 @@ export class Standards {
}; };
const interpolateByAgeAndWeight = (metrics: Metrics): Standard => { const interpolateByAgeAndWeight = (metrics: Metrics): Standard => {
console.log(metrics);
const interpolateByWeight = (targetAge: number): Levels => { const interpolateByWeight = (targetAge: number): Levels => {
const { lower: lowerAgeWeightStandard, upper: upperAgeWeightStandard } = this const { lower: lowerAgeWeightStandard, upper: upperAgeWeightStandard } = this
.byActivity(activity) .byActivity(activity)
@@ -504,7 +508,6 @@ export class Standards {
.byAge(closestAge) .byAge(closestAge)
.getAll().map((s) => s.metrics.weight); .getAll().map((s) => s.metrics.weight);
console.log({ age, closestAge, weights });
return weights; return weights;
} }
+80 -10
View File
@@ -26,6 +26,9 @@
}, },
cfg: { cfg: {
maxLevel: "5", maxLevel: "5",
weightModfier: ".1",
weightSkew: ".4",
ageModifier: ".1",
}, },
}); });
@@ -38,6 +41,9 @@
} as Metrics, } as Metrics,
cfg: { cfg: {
maxLevel: +input.cfg.maxLevel, maxLevel: +input.cfg.maxLevel,
weightModifier: +input.cfg.weightModfier,
weightSkew: +input.cfg.weightSkew,
ageModifier: +input.cfg.ageModifier,
} as StandardsConfig, } as StandardsConfig,
}); });
@@ -135,20 +141,74 @@
<fieldset class="group"> <fieldset class="group">
<legend>Parameters</legend> <legend>Parameters</legend>
<label class="field w-24"> <fieldset class="group">
<span>Max level</span> <legend>General</legend>
<input <label class="field parameter">
type="number" <span>Max level</span>
min="1" <input
max="100" type="number"
placeholder="5" min="1"
bind:value={input.cfg.maxLevel} max="100"
/> placeholder="5"
</label> bind:value={input.cfg.maxLevel}
/>
</label>
</fieldset>
<fieldset class="group">
<legend>Data generation</legend>
<label class="field parameter">
<span>Weight modifier</span>
<input
type="number"
min="0"
max="1"
step=".05"
placeholder=".1"
bind:value={input.cfg.weightModfier}
/>
</label>
<label class="field parameter">
<span>Weight skew</span>
<input
type="number"
min="0"
max="1"
step=".05"
placeholder=".1"
bind:value={input.cfg.weightSkew}
/>
</label>
<label class="field parameter">
<span>Age modifier</span>
<input
type="number"
min="0"
max="1"
step=".05"
placeholder=".1"
bind:value={input.cfg.ageModifier}
/>
</label>
</fieldset>
</fieldset> </fieldset>
</div> </div>
<h1>{allStandards.byActivity(selected.activity).getMetadata().name}</h1> <h1>{allStandards.byActivity(selected.activity).getMetadata().name}</h1>
{#if allStandards
.byActivity(selected.activity)
.getMetadata().generators.length}
<p class="description">
(Generated data: {allStandards
.byActivity(selected.activity)
.getMetadata()
.generators.map((g) => g.metric)
.join(", ")})
</p>
{:else}
<p class="description">(Generated data: NONE)</p>
{/if}
<section class="gender-section"> <section class="gender-section">
<h2>{selected.metrics.gender}</h2> <h2>{selected.metrics.gender}</h2>
{#if !selected.metrics.age} {#if !selected.metrics.age}
@@ -246,6 +306,11 @@
font-weight: 600; font-weight: 600;
} }
p {
font-size: 0.8rem;
color: var(--muted);
}
/* Toolbar container */ /* Toolbar container */
.toolbar { .toolbar {
display: grid; display: grid;
@@ -288,6 +353,11 @@
min-width: 160px; min-width: 160px;
} }
.parameter {
min-width: 100px;
max-width: 100px;
}
/* Label text */ /* Label text */
.field > span { .field > span {
font-size: 12px; font-size: 12px;