diff --git a/src/components/spreadsheet/CellRenderer.tsx b/src/components/spreadsheet/CellRenderer.tsx index 3e3f5ba..ae6d30b 100644 --- a/src/components/spreadsheet/CellRenderer.tsx +++ b/src/components/spreadsheet/CellRenderer.tsx @@ -222,7 +222,7 @@ export const CellRenderer: React.FC = ({ } else if (isSampledDistributionValue(value)) { const sampled = parseSampledDistributionValue(value); if (sampled) { - const sampledDistRepresentation = `S(μ=${sampled.mean.toFixed(2)}, σ²=${(sampled.std ** 2).toFixed(2)})`; + const sampledDistRepresentation = `S(μ=${sampled.mean.toFixed(2)}, σ=${sampled.std.toFixed(2)})`; setTempValue(sampledDistRepresentation); } else { setTempValue(""); diff --git a/src/hooks/useFormulaBar.test.ts b/src/hooks/useFormulaBar.test.ts new file mode 100644 index 0000000..1b56af1 --- /dev/null +++ b/src/hooks/useFormulaBar.test.ts @@ -0,0 +1,12 @@ +import { describe, expect, it } from "vitest"; + +import { formatFormulaBarCellValue } from "./useFormulaBar"; + +describe("formatFormulaBarCellValue", () => { + it("formats variance-backed summaries as standard deviation", () => { + expect(formatFormulaBarCellValue({ mean: 5, variance: 4 })) + .toBe("S(μ=5.00, σ=2.00)"); + expect(formatFormulaBarCellValue({ mu: 3, sigma2: 9 })) + .toBe("LN(μ=3.00, σ=3.00)"); + }); +}); diff --git a/src/hooks/useFormulaBar.ts b/src/hooks/useFormulaBar.ts index 4e620f3..72a5539 100644 --- a/src/hooks/useFormulaBar.ts +++ b/src/hooks/useFormulaBar.ts @@ -1,21 +1,27 @@ import { useCallback, useContext, useEffect, useState } from "react"; import { SpreadsheetContext } from "../context/SpreadsheetContext"; +import { parseSampledDistributionValue } from "../utils/distribution/distributionUtils"; interface SelectedCell { row: number; col: number; } -const formatCellValue = (value: unknown): string => { +export const formatFormulaBarCellValue = (value: unknown): string => { if (value === null || value === undefined) return ""; if (typeof value === "boolean") return value ? "TRUE" : "FALSE"; if (typeof value === "object" && value !== null) { + const sampled = parseSampledDistributionValue(value); + if (sampled) { + return `S(μ=${sampled.mean.toFixed(2)}, σ=${sampled.std.toFixed(2)})`; + } + const v = value as Record; if (typeof v.mean === "number" && typeof v.variance === "number") - return `N(μ=${v.mean.toFixed(2)}, σ²=${v.variance.toFixed(2)})`; + return `S(μ=${v.mean.toFixed(2)}, σ=${Math.sqrt(v.variance).toFixed(2)})`; if (typeof v.mu === "number" && typeof v.sigma2 === "number") - return `LN(μ=${v.mu.toFixed(2)}, σ²=${v.sigma2.toFixed(2)})`; + return `LN(μ=${v.mu.toFixed(2)}, σ=${Math.sqrt(v.sigma2).toFixed(2)})`; if (typeof v.a === "number" && typeof v.b === "number") return `U[${v.a.toFixed(2)}, ${v.b.toFixed(2)}]`; if (typeof v.lower === "number" && typeof v.upper === "number" && typeof v.confidenceLevel === "number") @@ -44,7 +50,7 @@ export function useFormulaBar(selectedCell: SelectedCell | null) { if (formula) { nextValue = formula; } else if (value !== null && value !== undefined) { - nextValue = formatCellValue(value); + nextValue = formatFormulaBarCellValue(value); } setFormulaInput((prev) => (prev === nextValue ? prev : nextValue)); diff --git a/src/utils/visual-dependency-graph/visualDependencyGraphFormatter.test.ts b/src/utils/visual-dependency-graph/visualDependencyGraphFormatter.test.ts index 127a459..78ad795 100644 --- a/src/utils/visual-dependency-graph/visualDependencyGraphFormatter.test.ts +++ b/src/utils/visual-dependency-graph/visualDependencyGraphFormatter.test.ts @@ -26,6 +26,6 @@ describe('formatVisualDependencyValue', () => { mean: 5, variance: 4, }), - ).toBe('S(μ=5.00, σ²=4.00)') + ).toBe('S(μ=5.00, σ=2.00)') }) }) diff --git a/src/utils/visual-dependency-graph/visualDependencyGraphFormatter.ts b/src/utils/visual-dependency-graph/visualDependencyGraphFormatter.ts index f24658f..28b1269 100644 --- a/src/utils/visual-dependency-graph/visualDependencyGraphFormatter.ts +++ b/src/utils/visual-dependency-graph/visualDependencyGraphFormatter.ts @@ -9,6 +9,6 @@ export const formatVisualDependencyValue = (value: VisualDependencyNodeValue): s case 'confidence_interval': return `CI[${formatNumber(value.lower)}, ${formatNumber(value.upper)}]` case 'sampled_distribution': - return `S(μ=${formatNumber(value.mean)}, σ²=${formatNumber(value.variance)})` + return `S(μ=${formatNumber(value.mean)}, σ=${formatNumber(Math.sqrt(value.variance))})` } }