Some touchups
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+71
-1
@@ -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,7 +141,9 @@
|
|||||||
<fieldset class="group">
|
<fieldset class="group">
|
||||||
<legend>Parameters</legend>
|
<legend>Parameters</legend>
|
||||||
|
|
||||||
<label class="field w-24">
|
<fieldset class="group">
|
||||||
|
<legend>General</legend>
|
||||||
|
<label class="field parameter">
|
||||||
<span>Max level</span>
|
<span>Max level</span>
|
||||||
<input
|
<input
|
||||||
type="number"
|
type="number"
|
||||||
@@ -146,9 +154,61 @@
|
|||||||
/>
|
/>
|
||||||
</label>
|
</label>
|
||||||
</fieldset>
|
</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>
|
||||||
</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;
|
||||||
|
|||||||
Reference in New Issue
Block a user