@dofek/training 0.1.40 → 0.1.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -0
- package/dist/cycling-workout-metrics.d.ts +112 -0
- package/dist/cycling-workout-metrics.d.ts.map +1 -0
- package/dist/cycling-workout-metrics.js +350 -0
- package/dist/cycling-workout-metrics.js.map +1 -0
- package/dist/power-analysis.d.ts +14 -0
- package/dist/power-analysis.d.ts.map +1 -1
- package/dist/power-analysis.js +20 -2
- package/dist/power-analysis.js.map +1 -1
- package/dist/power-duration-reference.d.ts +14 -0
- package/dist/power-duration-reference.d.ts.map +1 -0
- package/dist/power-duration-reference.js +70 -0
- package/dist/power-duration-reference.js.map +1 -0
- package/dist/training.d.ts +19 -0
- package/dist/training.d.ts.map +1 -1
- package/dist/training.js +104 -1
- package/dist/training.js.map +1 -1
- package/package.json +7 -3
package/README.md
CHANGED
|
@@ -50,6 +50,7 @@ Every public module is imported as `@dofek/training/<subpath>`.
|
|
|
50
50
|
| --- | --- |
|
|
51
51
|
| `activity-icons` | Normalize activity names into framework-neutral icon categories |
|
|
52
52
|
| `climbing-grades` | Validate, order, and convert Sandbag-supported boulder and route climbing grades |
|
|
53
|
+
| `cycling-workout-metrics` | Coverage-aware per-activity power, heart-rate, cadence, drift, zone, load, and interval calculations |
|
|
53
54
|
| `derived-cardio` | Cycling and submaximal walking/running VO2 max estimates and validation |
|
|
54
55
|
| `endurance-types` | Endurance and indoor-cycling type guards |
|
|
55
56
|
| `grade-adjusted-pace` | Grade cost factor and adjusted running pace |
|
|
@@ -107,6 +108,32 @@ product heuristics.
|
|
|
107
108
|
[Monod and Scherrer (1965)](https://doi.org/10.1080/00140136508930810)
|
|
108
109
|
using efforts from 120 through 600 seconds.
|
|
109
110
|
|
|
111
|
+
### Cycling workout metrics
|
|
112
|
+
|
|
113
|
+
`computeCyclingWorkoutMetrics` resamples native power, heart-rate, and cadence streams to elapsed
|
|
114
|
+
one-second buckets without filling dropouts. A native observation is held only to the next native
|
|
115
|
+
timestamp when the gap is at most the bounded continuity tolerance; measured zero remains zero and
|
|
116
|
+
missing elapsed seconds remain missing. The result reports native observation counts, covered,
|
|
117
|
+
missing, and zero seconds, median sample interval, and largest gap independently for every stream.
|
|
118
|
+
|
|
119
|
+
Average power and work use covered power seconds only. Normalized power uses the package's canonical
|
|
120
|
+
30-second rolling/fourth-power calculation and is withheld when any elapsed power second is missing.
|
|
121
|
+
Intensity factor is normalized power divided by the FTP effective for that activity. Power TSS uses
|
|
122
|
+
`duration_hours × intensity_factor² × 100`, following the package's documented power-stress model;
|
|
123
|
+
both values are unavailable rather than manufactured when FTP or normalized power is missing.
|
|
124
|
+
|
|
125
|
+
Aerobic efficiency is mean synchronized power divided by mean synchronized heart rate. Cardiac drift
|
|
126
|
+
compares that ratio between equal elapsed-time halves as
|
|
127
|
+
`100 × (first_half_ratio - second_half_ratio) / first_half_ratio`; it requires at least 20 minutes
|
|
128
|
+
and 90% paired coverage in each half. This is a descriptive within-workout comparison, not a causal
|
|
129
|
+
or medical conclusion.
|
|
130
|
+
|
|
131
|
+
Recorded interval boundaries always take precedence. Without recorded intervals, the optional
|
|
132
|
+
detector identifies at least 30 seconds whose 30-second mean is at or above 105% of the activity's
|
|
133
|
+
effective FTP, merges interruptions shorter than 15 seconds, and exposes intervening recoveries.
|
|
134
|
+
That detector is a Dofek heuristic. Inferred intervals never receive invented targets or completion
|
|
135
|
+
scores.
|
|
136
|
+
|
|
110
137
|
### Terrain adjustment
|
|
111
138
|
|
|
112
139
|
Grade-adjusted pace uses a bounded approximation derived from the slope-cost
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
export interface CyclingWorkoutSample {
|
|
2
|
+
elapsedSeconds: number;
|
|
3
|
+
powerWatts?: number | null;
|
|
4
|
+
heartRateBpm?: number | null;
|
|
5
|
+
cadenceRpm?: number | null;
|
|
6
|
+
}
|
|
7
|
+
export interface CyclingWorkoutSettings {
|
|
8
|
+
ftpWatts?: number | null;
|
|
9
|
+
thresholdHeartRateBpm?: number | null;
|
|
10
|
+
powerZoneUpperPcts?: number[] | null;
|
|
11
|
+
heartRateZoneUpperPcts?: number[] | null;
|
|
12
|
+
}
|
|
13
|
+
export interface CyclingWorkoutIntervalInput {
|
|
14
|
+
index: number;
|
|
15
|
+
type: "work" | "recovery" | "warmup" | "cooldown" | "other";
|
|
16
|
+
label?: string | null;
|
|
17
|
+
startOffsetSeconds: number;
|
|
18
|
+
endOffsetSeconds: number;
|
|
19
|
+
targetPowerWatts?: number | null;
|
|
20
|
+
}
|
|
21
|
+
interface StreamCoverage {
|
|
22
|
+
observedSamples: number;
|
|
23
|
+
coveredSeconds: number;
|
|
24
|
+
missingSeconds: number;
|
|
25
|
+
zeroSeconds: number;
|
|
26
|
+
coveragePct: number;
|
|
27
|
+
medianSampleIntervalSeconds: number | null;
|
|
28
|
+
largestGapSeconds: number | null;
|
|
29
|
+
}
|
|
30
|
+
interface ZoneDistribution {
|
|
31
|
+
threshold: number;
|
|
32
|
+
upperPcts: number[];
|
|
33
|
+
zones: Array<{
|
|
34
|
+
zone: number;
|
|
35
|
+
seconds: number;
|
|
36
|
+
percent: number;
|
|
37
|
+
}>;
|
|
38
|
+
}
|
|
39
|
+
export interface CyclingWorkoutMetricsInput {
|
|
40
|
+
durationSeconds: number;
|
|
41
|
+
samples: CyclingWorkoutSample[];
|
|
42
|
+
settings: CyclingWorkoutSettings | null;
|
|
43
|
+
intervals: CyclingWorkoutIntervalInput[];
|
|
44
|
+
}
|
|
45
|
+
export interface CyclingWorkoutMetrics {
|
|
46
|
+
durationSeconds: number;
|
|
47
|
+
power: {
|
|
48
|
+
averageWatts: number | null;
|
|
49
|
+
normalizedWatts: number | null;
|
|
50
|
+
variabilityIndex: number | null;
|
|
51
|
+
workKilojoules: number | null;
|
|
52
|
+
intensityFactor: number | null;
|
|
53
|
+
trainingStressScore: number | null;
|
|
54
|
+
};
|
|
55
|
+
heartRate: {
|
|
56
|
+
averageBpm: number | null;
|
|
57
|
+
maximumBpm: number | null;
|
|
58
|
+
};
|
|
59
|
+
cadence: {
|
|
60
|
+
averageRpm: number | null;
|
|
61
|
+
};
|
|
62
|
+
aerobicEfficiency: {
|
|
63
|
+
powerToHeartRateRatio: number | null;
|
|
64
|
+
pairedSeconds: number;
|
|
65
|
+
};
|
|
66
|
+
cardiacDrift: {
|
|
67
|
+
percent: number | null;
|
|
68
|
+
firstHalfPowerToHeartRate: number | null;
|
|
69
|
+
secondHalfPowerToHeartRate: number | null;
|
|
70
|
+
pairedSeconds: number;
|
|
71
|
+
method: "equal_elapsed_time_halves_power_to_heart_rate";
|
|
72
|
+
};
|
|
73
|
+
powerZones: ZoneDistribution | null;
|
|
74
|
+
heartRateZones: ZoneDistribution | null;
|
|
75
|
+
coverage: {
|
|
76
|
+
power: StreamCoverage;
|
|
77
|
+
heartRate: StreamCoverage;
|
|
78
|
+
cadence: StreamCoverage;
|
|
79
|
+
};
|
|
80
|
+
intervalSource: "recorded" | "inferred" | "none";
|
|
81
|
+
intervalDetection: {
|
|
82
|
+
method: "30_second_average_above_105_percent_ftp";
|
|
83
|
+
thresholdWatts: number;
|
|
84
|
+
minimumWorkSeconds: number;
|
|
85
|
+
} | null;
|
|
86
|
+
intervals: Array<{
|
|
87
|
+
index: number;
|
|
88
|
+
type: CyclingWorkoutIntervalInput["type"];
|
|
89
|
+
label: string | null;
|
|
90
|
+
source: "recorded" | "inferred";
|
|
91
|
+
startOffsetSeconds: number;
|
|
92
|
+
endOffsetSeconds: number;
|
|
93
|
+
durationSeconds: number;
|
|
94
|
+
averagePowerWatts: number | null;
|
|
95
|
+
normalizedPowerWatts: number | null;
|
|
96
|
+
averageHeartRateBpm: number | null;
|
|
97
|
+
averageCadenceRpm: number | null;
|
|
98
|
+
targetPowerWatts: number | null;
|
|
99
|
+
completionPct: number | null;
|
|
100
|
+
}>;
|
|
101
|
+
unavailableReasons: Array<{
|
|
102
|
+
metric: string;
|
|
103
|
+
reason: string;
|
|
104
|
+
}>;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Compute per-activity cycling metrics from native samples without extrapolating
|
|
108
|
+
* through dropouts. Every coverage field is expressed against elapsed duration.
|
|
109
|
+
*/
|
|
110
|
+
export declare function computeCyclingWorkoutMetrics(input: CyclingWorkoutMetricsInput): CyclingWorkoutMetrics;
|
|
111
|
+
export {};
|
|
112
|
+
//# sourceMappingURL=cycling-workout-metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cycling-workout-metrics.d.ts","sourceRoot":"","sources":["../src/cycling-workout-metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
import { computePowerTss } from "./pmc.js";
|
|
2
|
+
import { computeNormalizedPower } from "./power-analysis.js";
|
|
3
|
+
function round(value, decimals = 1) {
|
|
4
|
+
const multiplier = 10 ** decimals;
|
|
5
|
+
return Math.round(value * multiplier) / multiplier;
|
|
6
|
+
}
|
|
7
|
+
function average(values) {
|
|
8
|
+
let total = 0;
|
|
9
|
+
let count = 0;
|
|
10
|
+
for (const value of values) {
|
|
11
|
+
if (value == null)
|
|
12
|
+
continue;
|
|
13
|
+
total += value;
|
|
14
|
+
count++;
|
|
15
|
+
}
|
|
16
|
+
return count === 0 ? null : total / count;
|
|
17
|
+
}
|
|
18
|
+
function median(values) {
|
|
19
|
+
if (values.length === 0)
|
|
20
|
+
return null;
|
|
21
|
+
const sorted = [...values].sort((left, right) => left - right);
|
|
22
|
+
const middle = Math.floor(sorted.length / 2);
|
|
23
|
+
const lower = sorted[middle - 1];
|
|
24
|
+
const upper = sorted[middle];
|
|
25
|
+
if (upper == null)
|
|
26
|
+
return null;
|
|
27
|
+
return sorted.length % 2 === 0 && lower != null ? (lower + upper) / 2 : upper;
|
|
28
|
+
}
|
|
29
|
+
function resampleStream(samples, durationSeconds, select) {
|
|
30
|
+
const byOffset = new Map();
|
|
31
|
+
for (const sample of samples) {
|
|
32
|
+
const value = select(sample);
|
|
33
|
+
if (value == null || !Number.isFinite(value) || value < 0)
|
|
34
|
+
continue;
|
|
35
|
+
const offset = Math.floor(sample.elapsedSeconds);
|
|
36
|
+
if (offset >= 0 && offset < durationSeconds)
|
|
37
|
+
byOffset.set(offset, value);
|
|
38
|
+
}
|
|
39
|
+
const points = [...byOffset.entries()]
|
|
40
|
+
.map(([offset, value]) => ({ offset, value }))
|
|
41
|
+
.sort((left, right) => left.offset - right.offset);
|
|
42
|
+
const gaps = points.slice(1).map((point, index) => point.offset - (points[index]?.offset ?? 0));
|
|
43
|
+
const medianInterval = median(gaps);
|
|
44
|
+
const nativeInterval = medianInterval ?? 1;
|
|
45
|
+
const continuityTolerance = Math.min(10, Math.max(5, nativeInterval * 2));
|
|
46
|
+
const values = Array.from({ length: durationSeconds }, () => null);
|
|
47
|
+
for (let index = 0; index < points.length; index++) {
|
|
48
|
+
const point = points[index];
|
|
49
|
+
if (!point)
|
|
50
|
+
continue;
|
|
51
|
+
const next = points[index + 1];
|
|
52
|
+
const intervalEnd = next
|
|
53
|
+
? next.offset - point.offset <= continuityTolerance
|
|
54
|
+
? next.offset
|
|
55
|
+
: point.offset + nativeInterval
|
|
56
|
+
: point.offset + nativeInterval;
|
|
57
|
+
for (let second = point.offset; second < Math.min(durationSeconds, intervalEnd); second++) {
|
|
58
|
+
values[second] = point.value;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const coveredSeconds = values.reduce((count, value) => count + (value == null ? 0 : 1), 0);
|
|
62
|
+
const zeroSeconds = values.reduce((count, value) => count + (value === 0 ? 1 : 0), 0);
|
|
63
|
+
return {
|
|
64
|
+
values,
|
|
65
|
+
coverage: {
|
|
66
|
+
observedSamples: points.length,
|
|
67
|
+
coveredSeconds,
|
|
68
|
+
missingSeconds: durationSeconds - coveredSeconds,
|
|
69
|
+
zeroSeconds,
|
|
70
|
+
coveragePct: durationSeconds > 0 ? round((coveredSeconds / durationSeconds) * 100) : 0,
|
|
71
|
+
medianSampleIntervalSeconds: medianInterval,
|
|
72
|
+
largestGapSeconds: gaps.length > 0 ? Math.max(...gaps) : null,
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function computeNormalizedWatts(values) {
|
|
77
|
+
if (values.length < 30 || values.some((value) => value == null))
|
|
78
|
+
return null;
|
|
79
|
+
const result = computeNormalizedPower(values.map((power, index) => ({
|
|
80
|
+
activity_id: "activity",
|
|
81
|
+
activity_date: "1970-01-01",
|
|
82
|
+
activity_name: null,
|
|
83
|
+
power: power ?? 0,
|
|
84
|
+
interval_s: 1,
|
|
85
|
+
index,
|
|
86
|
+
})));
|
|
87
|
+
return result[0]?.normalizedPower ?? null;
|
|
88
|
+
}
|
|
89
|
+
function zoneDistribution(values, threshold, upperPcts) {
|
|
90
|
+
if (threshold == null || threshold <= 0 || !upperPcts || upperPcts.length === 0)
|
|
91
|
+
return null;
|
|
92
|
+
const counts = Array.from({ length: upperPcts.length + 1 }, () => 0);
|
|
93
|
+
for (const value of values) {
|
|
94
|
+
if (value == null)
|
|
95
|
+
continue;
|
|
96
|
+
const zoneIndex = upperPcts.findIndex((upperPct) => value < threshold * upperPct);
|
|
97
|
+
const resolvedIndex = zoneIndex === -1 ? counts.length - 1 : zoneIndex;
|
|
98
|
+
counts[resolvedIndex] = (counts[resolvedIndex] ?? 0) + 1;
|
|
99
|
+
}
|
|
100
|
+
const total = counts.reduce((sum, seconds) => sum + seconds, 0);
|
|
101
|
+
return {
|
|
102
|
+
threshold,
|
|
103
|
+
upperPcts: [...upperPcts],
|
|
104
|
+
zones: counts.map((seconds, index) => ({
|
|
105
|
+
zone: index + 1,
|
|
106
|
+
seconds,
|
|
107
|
+
percent: total > 0 ? round((seconds / total) * 100) : 0,
|
|
108
|
+
})),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function pairedEfficiency(power, heartRate, start = 0, end = power.length) {
|
|
112
|
+
let powerTotal = 0;
|
|
113
|
+
let heartRateTotal = 0;
|
|
114
|
+
let seconds = 0;
|
|
115
|
+
for (let index = start; index < end; index++) {
|
|
116
|
+
const watts = power[index];
|
|
117
|
+
const bpm = heartRate[index];
|
|
118
|
+
if (watts == null || bpm == null || bpm <= 0)
|
|
119
|
+
continue;
|
|
120
|
+
powerTotal += watts;
|
|
121
|
+
heartRateTotal += bpm;
|
|
122
|
+
seconds++;
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
ratio: seconds > 0 && heartRateTotal > 0 ? powerTotal / heartRateTotal : null,
|
|
126
|
+
seconds,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function intervalMetrics(interval, source, power, heartRate, cadence) {
|
|
130
|
+
const start = Math.max(0, Math.floor(interval.startOffsetSeconds));
|
|
131
|
+
const end = Math.min(power.length, Math.ceil(interval.endOffsetSeconds));
|
|
132
|
+
const powerSlice = power.slice(start, end);
|
|
133
|
+
const averagePower = average(powerSlice);
|
|
134
|
+
const normalizedPower = computeNormalizedWatts(powerSlice);
|
|
135
|
+
const targetPower = interval.targetPowerWatts ?? null;
|
|
136
|
+
return {
|
|
137
|
+
index: interval.index,
|
|
138
|
+
type: interval.type,
|
|
139
|
+
label: interval.label ?? null,
|
|
140
|
+
source,
|
|
141
|
+
startOffsetSeconds: start,
|
|
142
|
+
endOffsetSeconds: end,
|
|
143
|
+
durationSeconds: Math.max(0, end - start),
|
|
144
|
+
averagePowerWatts: averagePower == null ? null : round(averagePower),
|
|
145
|
+
normalizedPowerWatts: normalizedPower,
|
|
146
|
+
averageHeartRateBpm: (() => {
|
|
147
|
+
const value = average(heartRate.slice(start, end));
|
|
148
|
+
return value == null ? null : round(value);
|
|
149
|
+
})(),
|
|
150
|
+
averageCadenceRpm: (() => {
|
|
151
|
+
const value = average(cadence.slice(start, end));
|
|
152
|
+
return value == null ? null : round(value);
|
|
153
|
+
})(),
|
|
154
|
+
targetPowerWatts: targetPower,
|
|
155
|
+
completionPct: targetPower != null && targetPower > 0 && averagePower != null
|
|
156
|
+
? round((averagePower / targetPower) * 100)
|
|
157
|
+
: null,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
function detectIntervals(power, ftpWatts) {
|
|
161
|
+
if (ftpWatts == null || ftpWatts <= 0 || power.length < 30)
|
|
162
|
+
return null;
|
|
163
|
+
const thresholdWatts = ftpWatts * 1.05;
|
|
164
|
+
const candidates = [];
|
|
165
|
+
let start = null;
|
|
166
|
+
for (let index = 0; index <= power.length; index++) {
|
|
167
|
+
const isWork = index < power.length && power[index] != null && (power[index] ?? 0) >= thresholdWatts;
|
|
168
|
+
if (isWork && start == null)
|
|
169
|
+
start = index;
|
|
170
|
+
if ((!isWork || index === power.length) && start != null) {
|
|
171
|
+
const previous = candidates.at(-1);
|
|
172
|
+
if (previous && start - previous.end < 15)
|
|
173
|
+
previous.end = index;
|
|
174
|
+
else
|
|
175
|
+
candidates.push({ start, end: index });
|
|
176
|
+
start = null;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
const workIntervals = candidates.filter((candidate) => {
|
|
180
|
+
if (candidate.end - candidate.start < 30)
|
|
181
|
+
return false;
|
|
182
|
+
let rollingTotal = 0;
|
|
183
|
+
let rollingCount = 0;
|
|
184
|
+
for (let index = candidate.start; index < candidate.end; index++) {
|
|
185
|
+
const watts = power[index];
|
|
186
|
+
if (watts != null) {
|
|
187
|
+
rollingTotal += watts;
|
|
188
|
+
rollingCount++;
|
|
189
|
+
}
|
|
190
|
+
if (index - candidate.start >= 30) {
|
|
191
|
+
const expired = power[index - 30];
|
|
192
|
+
if (expired != null) {
|
|
193
|
+
rollingTotal -= expired;
|
|
194
|
+
rollingCount--;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (rollingCount === 30 && rollingTotal / 30 >= thresholdWatts)
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
return false;
|
|
201
|
+
});
|
|
202
|
+
if (workIntervals.length === 0)
|
|
203
|
+
return null;
|
|
204
|
+
const intervals = [];
|
|
205
|
+
for (let index = 0; index < workIntervals.length; index++) {
|
|
206
|
+
const work = workIntervals[index];
|
|
207
|
+
if (!work)
|
|
208
|
+
continue;
|
|
209
|
+
intervals.push({
|
|
210
|
+
index: intervals.length + 1,
|
|
211
|
+
type: "work",
|
|
212
|
+
label: null,
|
|
213
|
+
startOffsetSeconds: work.start,
|
|
214
|
+
endOffsetSeconds: work.end,
|
|
215
|
+
targetPowerWatts: null,
|
|
216
|
+
});
|
|
217
|
+
const next = workIntervals[index + 1];
|
|
218
|
+
if (next && next.start > work.end) {
|
|
219
|
+
intervals.push({
|
|
220
|
+
index: intervals.length + 1,
|
|
221
|
+
type: "recovery",
|
|
222
|
+
label: null,
|
|
223
|
+
startOffsetSeconds: work.end,
|
|
224
|
+
endOffsetSeconds: next.start,
|
|
225
|
+
targetPowerWatts: null,
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return { intervals, thresholdWatts };
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Compute per-activity cycling metrics from native samples without extrapolating
|
|
233
|
+
* through dropouts. Every coverage field is expressed against elapsed duration.
|
|
234
|
+
*/
|
|
235
|
+
export function computeCyclingWorkoutMetrics(input) {
|
|
236
|
+
const durationSeconds = Math.max(0, Math.floor(input.durationSeconds));
|
|
237
|
+
const power = resampleStream(input.samples, durationSeconds, (sample) => sample.powerWatts);
|
|
238
|
+
const heartRate = resampleStream(input.samples, durationSeconds, (sample) => sample.heartRateBpm);
|
|
239
|
+
const cadence = resampleStream(input.samples, durationSeconds, (sample) => sample.cadenceRpm);
|
|
240
|
+
const unavailableReasons = [];
|
|
241
|
+
const addUnavailable = (metric, reason) => {
|
|
242
|
+
unavailableReasons.push({ metric, reason });
|
|
243
|
+
};
|
|
244
|
+
const averagePower = average(power.values);
|
|
245
|
+
const normalizedPower = computeNormalizedWatts(power.values);
|
|
246
|
+
if (normalizedPower == null) {
|
|
247
|
+
addUnavailable("normalized_power", power.coverage.coveragePct < 90
|
|
248
|
+
? "power coverage is below 90%"
|
|
249
|
+
: power.coverage.missingSeconds > 0
|
|
250
|
+
? "power samples contain missing elapsed seconds"
|
|
251
|
+
: "fewer than 30 seconds of power are available");
|
|
252
|
+
}
|
|
253
|
+
const ftpWatts = input.settings?.ftpWatts;
|
|
254
|
+
const validFtp = ftpWatts != null && Number.isFinite(ftpWatts) && ftpWatts > 0 ? ftpWatts : null;
|
|
255
|
+
if (validFtp == null) {
|
|
256
|
+
addUnavailable("intensity_factor", "no valid FTP was effective for this activity");
|
|
257
|
+
addUnavailable("training_stress_score", "no valid FTP was effective for this activity");
|
|
258
|
+
}
|
|
259
|
+
else if (normalizedPower == null) {
|
|
260
|
+
addUnavailable("intensity_factor", "normalized power is unavailable");
|
|
261
|
+
addUnavailable("training_stress_score", "normalized power is unavailable");
|
|
262
|
+
}
|
|
263
|
+
const averageHeartRate = average(heartRate.values);
|
|
264
|
+
if (averageHeartRate == null)
|
|
265
|
+
addUnavailable("heart_rate", "no heart-rate samples are available");
|
|
266
|
+
const averageCadence = average(cadence.values);
|
|
267
|
+
if (averageCadence == null)
|
|
268
|
+
addUnavailable("cadence", "no cadence samples are available");
|
|
269
|
+
const efficiency = pairedEfficiency(power.values, heartRate.values);
|
|
270
|
+
if (efficiency.ratio == null) {
|
|
271
|
+
addUnavailable("aerobic_efficiency", "no synchronized power and heart-rate samples are available");
|
|
272
|
+
}
|
|
273
|
+
const midpoint = Math.floor(durationSeconds / 2);
|
|
274
|
+
const firstHalf = pairedEfficiency(power.values, heartRate.values, 0, midpoint);
|
|
275
|
+
const secondHalf = pairedEfficiency(power.values, heartRate.values, midpoint, durationSeconds);
|
|
276
|
+
const driftCoverageRequired = midpoint * 0.9;
|
|
277
|
+
const driftAvailable = durationSeconds >= 1_200 &&
|
|
278
|
+
firstHalf.ratio != null &&
|
|
279
|
+
secondHalf.ratio != null &&
|
|
280
|
+
firstHalf.seconds >= driftCoverageRequired &&
|
|
281
|
+
secondHalf.seconds >= (durationSeconds - midpoint) * 0.9;
|
|
282
|
+
if (!driftAvailable) {
|
|
283
|
+
addUnavailable("cardiac_drift", durationSeconds < 1_200
|
|
284
|
+
? "activity is shorter than 20 minutes"
|
|
285
|
+
: "paired power and heart-rate coverage is below 90% in one or both halves");
|
|
286
|
+
}
|
|
287
|
+
const detected = input.intervals.length === 0 ? detectIntervals(power.values, validFtp) : null;
|
|
288
|
+
const intervalInputs = input.intervals.length > 0 ? input.intervals : (detected?.intervals ?? []);
|
|
289
|
+
const intervalSource = input.intervals.length > 0
|
|
290
|
+
? "recorded"
|
|
291
|
+
: detected && detected.intervals.length > 0
|
|
292
|
+
? "inferred"
|
|
293
|
+
: "none";
|
|
294
|
+
const intensityFactor = validFtp != null && normalizedPower != null ? normalizedPower / validFtp : null;
|
|
295
|
+
return {
|
|
296
|
+
durationSeconds,
|
|
297
|
+
power: {
|
|
298
|
+
averageWatts: averagePower == null ? null : round(averagePower),
|
|
299
|
+
normalizedWatts: normalizedPower,
|
|
300
|
+
variabilityIndex: normalizedPower != null && averagePower != null && averagePower > 0
|
|
301
|
+
? round(normalizedPower / averagePower, 3)
|
|
302
|
+
: null,
|
|
303
|
+
workKilojoules: averagePower == null
|
|
304
|
+
? null
|
|
305
|
+
: round(power.values.reduce((total, watts) => total + (watts ?? 0), 0) / 1_000),
|
|
306
|
+
intensityFactor: intensityFactor == null ? null : round(intensityFactor, 3),
|
|
307
|
+
trainingStressScore: validFtp != null && normalizedPower != null
|
|
308
|
+
? round(computePowerTss(normalizedPower, validFtp, durationSeconds / 60))
|
|
309
|
+
: null,
|
|
310
|
+
},
|
|
311
|
+
heartRate: {
|
|
312
|
+
averageBpm: averageHeartRate == null ? null : round(averageHeartRate),
|
|
313
|
+
maximumBpm: heartRate.coverage.coveredSeconds === 0
|
|
314
|
+
? null
|
|
315
|
+
: Math.max(...heartRate.values.flatMap((value) => (value == null ? [] : [value]))),
|
|
316
|
+
},
|
|
317
|
+
cadence: { averageRpm: averageCadence == null ? null : round(averageCadence) },
|
|
318
|
+
aerobicEfficiency: {
|
|
319
|
+
powerToHeartRateRatio: efficiency.ratio == null ? null : round(efficiency.ratio, 3),
|
|
320
|
+
pairedSeconds: efficiency.seconds,
|
|
321
|
+
},
|
|
322
|
+
cardiacDrift: {
|
|
323
|
+
percent: driftAvailable && firstHalf.ratio != null && secondHalf.ratio != null
|
|
324
|
+
? round(((firstHalf.ratio - secondHalf.ratio) / firstHalf.ratio) * 100)
|
|
325
|
+
: null,
|
|
326
|
+
firstHalfPowerToHeartRate: driftAvailable && firstHalf.ratio != null ? round(firstHalf.ratio, 3) : null,
|
|
327
|
+
secondHalfPowerToHeartRate: driftAvailable && secondHalf.ratio != null ? round(secondHalf.ratio, 3) : null,
|
|
328
|
+
pairedSeconds: driftAvailable ? firstHalf.seconds + secondHalf.seconds : 0,
|
|
329
|
+
method: "equal_elapsed_time_halves_power_to_heart_rate",
|
|
330
|
+
},
|
|
331
|
+
powerZones: zoneDistribution(power.values, validFtp, input.settings?.powerZoneUpperPcts),
|
|
332
|
+
heartRateZones: zoneDistribution(heartRate.values, input.settings?.thresholdHeartRateBpm, input.settings?.heartRateZoneUpperPcts),
|
|
333
|
+
coverage: {
|
|
334
|
+
power: power.coverage,
|
|
335
|
+
heartRate: heartRate.coverage,
|
|
336
|
+
cadence: cadence.coverage,
|
|
337
|
+
},
|
|
338
|
+
intervalSource,
|
|
339
|
+
intervalDetection: detected == null
|
|
340
|
+
? null
|
|
341
|
+
: {
|
|
342
|
+
method: "30_second_average_above_105_percent_ftp",
|
|
343
|
+
thresholdWatts: detected.thresholdWatts,
|
|
344
|
+
minimumWorkSeconds: 30,
|
|
345
|
+
},
|
|
346
|
+
intervals: intervalInputs.map((interval) => intervalMetrics(interval, intervalSource === "recorded" ? "recorded" : "inferred", power.values, heartRate.values, cadence.values)),
|
|
347
|
+
unavailableReasons,
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
//# sourceMappingURL=cycling-workout-metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cycling-workout-metrics.js","sourceRoot":"","sources":["../src/cycling-workout-metrics.ts"],"names":[],"mappings":"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"}
|
package/dist/power-analysis.d.ts
CHANGED
|
@@ -18,6 +18,15 @@ export interface CriticalPowerModel {
|
|
|
18
18
|
wPrime: number;
|
|
19
19
|
r2: number;
|
|
20
20
|
}
|
|
21
|
+
export interface CriticalPowerModelDiagnostics extends CriticalPowerModel {
|
|
22
|
+
rmse: number;
|
|
23
|
+
points: Array<{
|
|
24
|
+
durationSeconds: number;
|
|
25
|
+
observedPower: number;
|
|
26
|
+
predictedPower: number;
|
|
27
|
+
residualPower: number;
|
|
28
|
+
}>;
|
|
29
|
+
}
|
|
21
30
|
/**
|
|
22
31
|
* Fit Morton's 2-parameter Critical Power model (Monod-Scherrer).
|
|
23
32
|
*
|
|
@@ -29,6 +38,11 @@ export interface CriticalPowerModel {
|
|
|
29
38
|
* efforts (<120s) and long-duration bests that are suppressed by interval
|
|
30
39
|
* training recovery periods (>600s).
|
|
31
40
|
*/
|
|
41
|
+
export declare function fitCriticalPowerWithDiagnostics(points: {
|
|
42
|
+
durationSeconds: number;
|
|
43
|
+
bestPower: number;
|
|
44
|
+
}[]): CriticalPowerModelDiagnostics | null;
|
|
45
|
+
/** Fit the stable three-field CP model used by existing analytics responses. */
|
|
32
46
|
export declare function fitCriticalPower(points: {
|
|
33
47
|
durationSeconds: number;
|
|
34
48
|
bestPower: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"power-analysis.d.ts","sourceRoot":"","sources":["../src/power-analysis.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,eAAO,MAAM,kBAAkB,UAE9B,CAAC;AAEF,mEAAmE;AACnE,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAelD,CAAC;AAIF,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,MAAM,EAAE,EACZ,EAAE,EAAE,MAAM,EAAE,GACX;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAmBlD;AAID,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAAE,GACvD,kBAAkB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"power-analysis.d.ts","sourceRoot":"","sources":["../src/power-analysis.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,eAAO,MAAM,kBAAkB,UAE9B,CAAC;AAEF,mEAAmE;AACnE,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAelD,CAAC;AAIF,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,MAAM,EAAE,EACZ,EAAE,EAAE,MAAM,EAAE,GACX;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAmBlD;AAID,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,6BAA8B,SAAQ,kBAAkB;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,CAAC;QACZ,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC,CAAC;CACJ;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAAE,GACvD,6BAA6B,GAAG,IAAI,CAkCtC;AAED,gFAAgF;AAChF,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAAE,GACvD,kBAAkB,GAAG,IAAI,CAG3B;AAID,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,gEAAgE;AAChE,wBAAgB,eAAe,CAC7B,CAAC,SAAS;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EAC5E,OAAO,EAAE,CAAC,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,CAiBlC;AAID,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,gBAAgB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,eAAe,EAAE,CAoChF;AAID,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,qBAAqB;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,qBAAqB,EAAE,GAAG,qBAAqB,EAAE,CAiChG"}
|
package/dist/power-analysis.js
CHANGED
|
@@ -55,21 +55,39 @@ export function linearRegression(xs, ys) {
|
|
|
55
55
|
* efforts (<120s) and long-duration bests that are suppressed by interval
|
|
56
56
|
* training recovery periods (>600s).
|
|
57
57
|
*/
|
|
58
|
-
export function
|
|
58
|
+
export function fitCriticalPowerWithDiagnostics(points) {
|
|
59
59
|
const valid = points.filter((p) => p.durationSeconds >= 120 && p.durationSeconds <= 600 && p.bestPower > 0);
|
|
60
60
|
if (valid.length < 3)
|
|
61
61
|
return null;
|
|
62
62
|
const xs = valid.map((p) => p.durationSeconds);
|
|
63
63
|
const ys = valid.map((p) => p.bestPower * p.durationSeconds);
|
|
64
64
|
const { slope: cp, intercept: wPrime, r2 } = linearRegression(xs, ys);
|
|
65
|
-
if (cp <= 0)
|
|
65
|
+
if (cp <= 0 || wPrime <= 0)
|
|
66
66
|
return null;
|
|
67
|
+
const fittedPoints = valid.map((point) => {
|
|
68
|
+
const predictedPower = cp + wPrime / point.durationSeconds;
|
|
69
|
+
return {
|
|
70
|
+
durationSeconds: point.durationSeconds,
|
|
71
|
+
observedPower: point.bestPower,
|
|
72
|
+
predictedPower: Math.round(predictedPower * 10) / 10,
|
|
73
|
+
residualPower: Math.round((point.bestPower - predictedPower) * 10) / 10,
|
|
74
|
+
};
|
|
75
|
+
});
|
|
76
|
+
const rmse = Math.sqrt(fittedPoints.reduce((total, point) => total + point.residualPower ** 2, 0) /
|
|
77
|
+
fittedPoints.length);
|
|
67
78
|
return {
|
|
68
79
|
cp: Math.round(cp),
|
|
69
80
|
wPrime: Math.round(wPrime),
|
|
70
81
|
r2: Math.round(r2 * 1000) / 1000,
|
|
82
|
+
rmse: Math.round(rmse * 10) / 10,
|
|
83
|
+
points: fittedPoints,
|
|
71
84
|
};
|
|
72
85
|
}
|
|
86
|
+
/** Fit the stable three-field CP model used by existing analytics responses. */
|
|
87
|
+
export function fitCriticalPower(points) {
|
|
88
|
+
const model = fitCriticalPowerWithDiagnostics(points);
|
|
89
|
+
return model ? { cp: model.cp, wPrime: model.wPrime, r2: model.r2 } : null;
|
|
90
|
+
}
|
|
73
91
|
/** Group pre-sorted samples by activity_id in a single pass. */
|
|
74
92
|
export function groupByActivity(samples) {
|
|
75
93
|
const groups = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"power-analysis.js","sourceRoot":"","sources":["../src/power-analysis.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"power-analysis.js","sourceRoot":"","sources":["../src/power-analysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface PowerDurationSample {
|
|
2
|
+
elapsedSeconds: number;
|
|
3
|
+
watts: number;
|
|
4
|
+
}
|
|
5
|
+
export interface PowerDurationResult {
|
|
6
|
+
watts: number;
|
|
7
|
+
startOffsetSeconds: number;
|
|
8
|
+
observedSamples: number;
|
|
9
|
+
medianSampleIntervalSeconds: number;
|
|
10
|
+
largestGapSeconds: number;
|
|
11
|
+
coveragePct: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function referenceBestPower(samples: readonly PowerDurationSample[], durationSeconds: number): PowerDurationResult | null;
|
|
14
|
+
//# sourceMappingURL=power-duration-reference.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"power-duration-reference.d.ts","sourceRoot":"","sources":["../src/power-duration-reference.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,2BAA2B,EAAE,MAAM,CAAC;IACpC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB;AASD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,SAAS,mBAAmB,EAAE,EACvC,eAAe,EAAE,MAAM,GACtB,mBAAmB,GAAG,IAAI,CAiF5B"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
function median(values) {
|
|
2
|
+
const sorted = [...values].sort((left, right) => left - right);
|
|
3
|
+
const midpoint = Math.floor(sorted.length / 2);
|
|
4
|
+
if (sorted.length % 2 === 1)
|
|
5
|
+
return sorted[midpoint] ?? Number.NaN;
|
|
6
|
+
return ((sorted[midpoint - 1] ?? 0) + (sorted[midpoint] ?? 0)) / 2;
|
|
7
|
+
}
|
|
8
|
+
export function referenceBestPower(samples, durationSeconds) {
|
|
9
|
+
if (!Number.isFinite(durationSeconds) || durationSeconds <= 0 || samples.length < 2) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
if (samples.some(({ elapsedSeconds, watts }) => !Number.isFinite(elapsedSeconds) || !Number.isFinite(watts) || watts < 0)) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
const sorted = [...samples].sort((left, right) => left.elapsedSeconds - right.elapsedSeconds);
|
|
16
|
+
const intervals = sorted.slice(1).map((sample, index) => {
|
|
17
|
+
const previous = sorted[index];
|
|
18
|
+
return previous ? sample.elapsedSeconds - previous.elapsedSeconds : Number.NaN;
|
|
19
|
+
});
|
|
20
|
+
if (intervals.some((interval) => interval <= 0))
|
|
21
|
+
return null;
|
|
22
|
+
const medianSampleIntervalSeconds = median(intervals);
|
|
23
|
+
if (durationSeconds < medianSampleIntervalSeconds)
|
|
24
|
+
return null;
|
|
25
|
+
const cumulativeEnergy = [0];
|
|
26
|
+
for (let index = 0; index < intervals.length; index += 1) {
|
|
27
|
+
cumulativeEnergy.push((cumulativeEnergy[index] ?? 0) + (sorted[index]?.watts ?? 0) * (intervals[index] ?? 0));
|
|
28
|
+
}
|
|
29
|
+
const continuityToleranceSeconds = Math.max(5, medianSampleIntervalSeconds * 2);
|
|
30
|
+
const finalOffset = sorted.at(-1)?.elapsedSeconds ?? 0;
|
|
31
|
+
let best = null;
|
|
32
|
+
for (let startIndex = 0; startIndex < sorted.length - 1; startIndex += 1) {
|
|
33
|
+
const startOffsetSeconds = sorted[startIndex]?.elapsedSeconds ?? 0;
|
|
34
|
+
const endOffsetSeconds = startOffsetSeconds + durationSeconds;
|
|
35
|
+
if (endOffsetSeconds > finalOffset)
|
|
36
|
+
continue;
|
|
37
|
+
let endSegmentIndex = startIndex;
|
|
38
|
+
while (endSegmentIndex < intervals.length &&
|
|
39
|
+
(sorted[endSegmentIndex + 1]?.elapsedSeconds ?? Number.POSITIVE_INFINITY) < endOffsetSeconds) {
|
|
40
|
+
endSegmentIndex += 1;
|
|
41
|
+
}
|
|
42
|
+
const endSegment = sorted[endSegmentIndex];
|
|
43
|
+
if (!endSegment)
|
|
44
|
+
continue;
|
|
45
|
+
const usedIntervals = intervals.slice(startIndex, endSegmentIndex + 1);
|
|
46
|
+
const largestGapSeconds = Math.max(...usedIntervals);
|
|
47
|
+
if (largestGapSeconds > continuityToleranceSeconds)
|
|
48
|
+
continue;
|
|
49
|
+
const endEnergy = (cumulativeEnergy[endSegmentIndex] ?? 0) +
|
|
50
|
+
endSegment.watts * (endOffsetSeconds - endSegment.elapsedSeconds);
|
|
51
|
+
const startEnergy = cumulativeEnergy[startIndex] ?? 0;
|
|
52
|
+
const watts = (endEnergy - startEnergy) / durationSeconds;
|
|
53
|
+
const observedSamples = sorted.filter((sample) => sample.elapsedSeconds >= startOffsetSeconds && sample.elapsedSeconds <= endOffsetSeconds).length;
|
|
54
|
+
const candidate = {
|
|
55
|
+
coveragePct: 100,
|
|
56
|
+
largestGapSeconds,
|
|
57
|
+
medianSampleIntervalSeconds,
|
|
58
|
+
observedSamples,
|
|
59
|
+
startOffsetSeconds,
|
|
60
|
+
watts,
|
|
61
|
+
};
|
|
62
|
+
if (best === null ||
|
|
63
|
+
candidate.watts > best.watts ||
|
|
64
|
+
(candidate.watts === best.watts && candidate.startOffsetSeconds < best.startOffsetSeconds)) {
|
|
65
|
+
best = candidate;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return best;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=power-duration-reference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"power-duration-reference.js","sourceRoot":"","sources":["../src/power-duration-reference.ts"],"names":[],"mappings":"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"}
|
package/dist/training.d.ts
CHANGED
|
@@ -2,6 +2,25 @@ import { type ActivityModality, isActivityDetailType, type LegacyActivityType, t
|
|
|
2
2
|
export { isActivityDetailType };
|
|
3
3
|
export declare const OTHER_ACTIVITY_TYPE = "__other__";
|
|
4
4
|
export declare const STRENGTH_ACTIVITY_TYPES: readonly ["strength"];
|
|
5
|
+
export interface StrengthExerciseIdentity {
|
|
6
|
+
exerciseName: string;
|
|
7
|
+
equipment: string | null;
|
|
8
|
+
}
|
|
9
|
+
/** Compare the structured identity used by strength history series. */
|
|
10
|
+
export declare function isSameStrengthExercise(left: StrengthExerciseIdentity, right: StrengthExerciseIdentity): boolean;
|
|
11
|
+
/** Collision-safe React/list key for a structured strength exercise identity. */
|
|
12
|
+
export declare function strengthExerciseIdentityKey(identity: StrengthExerciseIdentity): string;
|
|
13
|
+
export interface StrengthExerciseDisplayLabel {
|
|
14
|
+
baseLabel: string;
|
|
15
|
+
discriminator: string | null;
|
|
16
|
+
label: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Allocate concise, deterministic labels for strength identities rendered together.
|
|
20
|
+
* Readable labels stay unchanged unless they collide; collisions gain the lossless
|
|
21
|
+
* recorded equipment value, with a stable ordinal only for a second-order collision.
|
|
22
|
+
*/
|
|
23
|
+
export declare function strengthExerciseDisplayLabels(identities: readonly StrengthExerciseIdentity[]): readonly StrengthExerciseDisplayLabel[];
|
|
5
24
|
/**
|
|
6
25
|
* All canonical activity types considered "cycling" for consolidated views.
|
|
7
26
|
* Individual activities show the specific subtype, but aggregated views
|
package/dist/training.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"training.d.ts","sourceRoot":"","sources":["../src/training.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,gBAAgB,EACrB,oBAAoB,EACpB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EAE1B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,oBAAoB,EAAE,CAAC;AAEhC,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAE/C,eAAO,MAAM,uBAAuB,uBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"training.d.ts","sourceRoot":"","sources":["../src/training.ts"],"names":[],"mappings":"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"}
|
package/dist/training.js
CHANGED
|
@@ -2,6 +2,109 @@ import { isActivityDetailType, resolveProviderActivityType, } from "./activity-t
|
|
|
2
2
|
export { isActivityDetailType };
|
|
3
3
|
export const OTHER_ACTIVITY_TYPE = "__other__";
|
|
4
4
|
export const STRENGTH_ACTIVITY_TYPES = ["strength"];
|
|
5
|
+
/** Compare the structured identity used by strength history series. */
|
|
6
|
+
export function isSameStrengthExercise(left, right) {
|
|
7
|
+
return left.exerciseName === right.exerciseName && left.equipment === right.equipment;
|
|
8
|
+
}
|
|
9
|
+
/** Collision-safe React/list key for a structured strength exercise identity. */
|
|
10
|
+
export function strengthExerciseIdentityKey(identity) {
|
|
11
|
+
return JSON.stringify([identity.exerciseName, identity.equipment]);
|
|
12
|
+
}
|
|
13
|
+
function ambiguousStrengthExerciseNames(identities) {
|
|
14
|
+
const seen = new Set();
|
|
15
|
+
const ambiguous = new Set();
|
|
16
|
+
for (const identity of identities) {
|
|
17
|
+
if (seen.has(identity.exerciseName))
|
|
18
|
+
ambiguous.add(identity.exerciseName);
|
|
19
|
+
seen.add(identity.exerciseName);
|
|
20
|
+
}
|
|
21
|
+
return ambiguous;
|
|
22
|
+
}
|
|
23
|
+
function equipmentDisplayLabel(equipment) {
|
|
24
|
+
const normalizedEquipment = equipment?.trim().toLowerCase();
|
|
25
|
+
if (!normalizedEquipment)
|
|
26
|
+
return "Unspecified Equipment";
|
|
27
|
+
return normalizedEquipment
|
|
28
|
+
.split(/[_\s-]+/)
|
|
29
|
+
.map((word) => `${word.charAt(0).toUpperCase()}${word.slice(1)}`)
|
|
30
|
+
.join(" ");
|
|
31
|
+
}
|
|
32
|
+
function strengthExerciseDisplayLabel(identity, namesRequiringEquipment) {
|
|
33
|
+
if (!namesRequiringEquipment.has(identity.exerciseName))
|
|
34
|
+
return identity.exerciseName;
|
|
35
|
+
return `${identity.exerciseName} (${equipmentDisplayLabel(identity.equipment)})`;
|
|
36
|
+
}
|
|
37
|
+
function losslessEquipmentDiscriminator(equipment) {
|
|
38
|
+
return equipment === null ? "recorded without equipment" : `recorded as “${equipment}”`;
|
|
39
|
+
}
|
|
40
|
+
function groupByLabel(values, labelFor) {
|
|
41
|
+
const groups = new Map();
|
|
42
|
+
for (const value of values) {
|
|
43
|
+
const label = labelFor(value);
|
|
44
|
+
const group = groups.get(label);
|
|
45
|
+
if (group)
|
|
46
|
+
group.push(value);
|
|
47
|
+
else
|
|
48
|
+
groups.set(label, [value]);
|
|
49
|
+
}
|
|
50
|
+
return groups;
|
|
51
|
+
}
|
|
52
|
+
function strengthExercisePresentation(baseLabel, discriminator) {
|
|
53
|
+
return {
|
|
54
|
+
baseLabel,
|
|
55
|
+
discriminator,
|
|
56
|
+
label: discriminator ? `${baseLabel} — ${discriminator}` : baseLabel,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Allocate concise, deterministic labels for strength identities rendered together.
|
|
61
|
+
* Readable labels stay unchanged unless they collide; collisions gain the lossless
|
|
62
|
+
* recorded equipment value, with a stable ordinal only for a second-order collision.
|
|
63
|
+
*/
|
|
64
|
+
export function strengthExerciseDisplayLabels(identities) {
|
|
65
|
+
const ambiguousNames = ambiguousStrengthExerciseNames(identities);
|
|
66
|
+
const entries = identities.map((identity) => ({
|
|
67
|
+
identity,
|
|
68
|
+
presentation: strengthExercisePresentation(strengthExerciseDisplayLabel(identity, ambiguousNames), null),
|
|
69
|
+
}));
|
|
70
|
+
const readableGroups = groupByLabel(entries, ({ presentation }) => presentation.label);
|
|
71
|
+
for (const group of readableGroups.values()) {
|
|
72
|
+
if (group.length < 2)
|
|
73
|
+
continue;
|
|
74
|
+
for (const entry of group) {
|
|
75
|
+
entry.presentation = strengthExercisePresentation(entry.presentation.baseLabel, losslessEquipmentDiscriminator(entry.identity.equipment));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const usedLabels = new Set(entries.map(({ presentation }) => presentation.label));
|
|
79
|
+
const discriminatedGroups = groupByLabel(entries, ({ presentation }) => presentation.label);
|
|
80
|
+
const collisionGroups = [...discriminatedGroups.values()].filter((group) => group.length > 1);
|
|
81
|
+
for (const group of collisionGroups) {
|
|
82
|
+
const identityGroups = groupByLabel(group, ({ identity }) => identity.exerciseName);
|
|
83
|
+
const sortedIdentityGroups = [...identityGroups]
|
|
84
|
+
.map(([identityKey, identityEntries]) => ({ identityKey, identityEntries }))
|
|
85
|
+
.sort((left, right) => left.identityKey.localeCompare(right.identityKey));
|
|
86
|
+
let variant = 1;
|
|
87
|
+
for (const { identityEntries } of sortedIdentityGroups) {
|
|
88
|
+
for (const entry of identityEntries) {
|
|
89
|
+
let discriminator = entry.presentation.discriminator
|
|
90
|
+
? `${entry.presentation.discriminator} · variant ${variant}`
|
|
91
|
+
: `variant ${variant}`;
|
|
92
|
+
let allocated = strengthExercisePresentation(entry.presentation.baseLabel, discriminator);
|
|
93
|
+
while (usedLabels.has(allocated.label)) {
|
|
94
|
+
variant += 1;
|
|
95
|
+
discriminator = entry.presentation.discriminator
|
|
96
|
+
? `${entry.presentation.discriminator} · variant ${variant}`
|
|
97
|
+
: `variant ${variant}`;
|
|
98
|
+
allocated = strengthExercisePresentation(entry.presentation.baseLabel, discriminator);
|
|
99
|
+
}
|
|
100
|
+
entry.presentation = allocated;
|
|
101
|
+
usedLabels.add(allocated.label);
|
|
102
|
+
variant += 1;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return entries.map(({ presentation }) => presentation);
|
|
107
|
+
}
|
|
5
108
|
// ============================================================
|
|
6
109
|
// Cycling activity types
|
|
7
110
|
// ============================================================
|
|
@@ -13,7 +116,7 @@ export const STRENGTH_ACTIVITY_TYPES = ["strength"];
|
|
|
13
116
|
export const CYCLING_ACTIVITY_TYPES = ["cycling"];
|
|
14
117
|
/** Check whether an activity type is a cycling variant. */
|
|
15
118
|
export function isCyclingActivity(activityType) {
|
|
16
|
-
return
|
|
119
|
+
return activityType === "cycling";
|
|
17
120
|
}
|
|
18
121
|
/** Cadence unit for display based on activity type. */
|
|
19
122
|
export function cadenceUnit(activityType) {
|
package/dist/training.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"training.js","sourceRoot":"","sources":["../src/training.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"training.js","sourceRoot":"","sources":["../src/training.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dofek/training",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.42",
|
|
4
4
|
"description": "Training-science calculations for power, load, performance, and workout planning",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -30,6 +30,10 @@
|
|
|
30
30
|
"LICENSE"
|
|
31
31
|
],
|
|
32
32
|
"exports": {
|
|
33
|
+
"./power-duration-reference": {
|
|
34
|
+
"types": "./dist/power-duration-reference.d.ts",
|
|
35
|
+
"import": "./dist/power-duration-reference.js"
|
|
36
|
+
},
|
|
33
37
|
"./*": {
|
|
34
38
|
"types": "./dist/*.d.ts",
|
|
35
39
|
"import": "./dist/*.js"
|
|
@@ -41,8 +45,8 @@
|
|
|
41
45
|
"dependencies": {
|
|
42
46
|
"@openbeta/sandbag": "0.0.55",
|
|
43
47
|
"zod": "4.4.3",
|
|
44
|
-
"@dofek/scoring": "0.1.
|
|
45
|
-
"@dofek/zones": "0.1.
|
|
48
|
+
"@dofek/scoring": "0.1.42",
|
|
49
|
+
"@dofek/zones": "0.1.42"
|
|
46
50
|
},
|
|
47
51
|
"scripts": {
|
|
48
52
|
"build": "tsc",
|