5dc39b1573
Probability and multi-model view adapters were still embedded in dashboard-utils even though table, panel, modal, and city-card views use them as small pure selectors. This moves them into model-utils and keeps dashboard-utils re-export compatibility. Constraint: Preserve model/probability return shapes and existing fallback behavior. Rejected: Merge model-utils with chart-utils | model selectors and chart data preparation change at different rates. Confidence: high Scope-risk: narrow Reversibility: clean Tested: TypeScript diagnostics for model-utils, dashboard-utils, and PanelSections Tested: npm run build Not-tested: Bundle analyzer size comparison.
52 lines
1.6 KiB
TypeScript
52 lines
1.6 KiB
TypeScript
import type { CityDetail } from "@/lib/dashboard-types";
|
|
|
|
export function getProbabilityView(detail: CityDetail, targetDate?: string | null) {
|
|
const date = targetDate || detail.local_date;
|
|
if (date === detail.local_date) {
|
|
return {
|
|
calibrationMode: detail.probabilities?.calibration_mode ?? null,
|
|
calibrationVersion: detail.probabilities?.calibration_version ?? null,
|
|
engine: detail.probabilities?.engine ?? null,
|
|
mu: detail.probabilities?.mu ?? null,
|
|
probabilities: detail.probabilities?.distribution || [],
|
|
probabilitiesAll:
|
|
detail.probabilities?.distribution_all ||
|
|
detail.probabilities?.distribution ||
|
|
[],
|
|
shadowProbabilities: detail.probabilities?.shadow_distribution || [],
|
|
shadowProbabilitiesAll:
|
|
detail.probabilities?.shadow_distribution_all ||
|
|
detail.probabilities?.shadow_distribution ||
|
|
[],
|
|
};
|
|
}
|
|
|
|
const daily = detail.multi_model_daily?.[date];
|
|
return {
|
|
calibrationMode: null,
|
|
calibrationVersion: null,
|
|
engine: null,
|
|
mu: daily?.deb?.prediction ?? null,
|
|
probabilities: daily?.probabilities || [],
|
|
probabilitiesAll: daily?.probabilities_all || daily?.probabilities || [],
|
|
shadowProbabilities: [],
|
|
shadowProbabilitiesAll: [],
|
|
};
|
|
}
|
|
|
|
export function getModelView(detail: CityDetail, targetDate?: string | null) {
|
|
const date = targetDate || detail.local_date;
|
|
const daily = detail.multi_model_daily?.[date];
|
|
if (daily) {
|
|
return {
|
|
deb: daily.deb?.prediction ?? null,
|
|
models: daily.models || {},
|
|
};
|
|
}
|
|
|
|
return {
|
|
deb: detail.deb?.prediction ?? null,
|
|
models: detail.multi_model || {},
|
|
};
|
|
}
|