concept-collection / benchcompress
reference compression ratios
Jeremy Magland <jmagland@flatironinstitute.org> committed commit a2daa82db6d5 parent 22203e1 Browse files
11 changed files+98−366
paper/paper.mdmodified+6−0View file
@@ -101,6 +101,8 @@ For real-world data, we draw from multiple sources in neuroscience and geophysic
101101
102102 The marine seismic dataset, collected during the Roger Revelle voyage RR1508 [@gorman_2023_8152964], provides both original floating-point measurements and quantized integer versions from a gas hydrate system survey.
103103
104+Finally, we include a sample of functional MRI data [@ds005880] consisting of 16-bit integer BOLD signal time series, representing neural activity patterns as 3D brain volumes over time.
105+
104106 ## System Architecture
105107
106108 The framework is implemented primarily in Python for the core benchmarking functionality and TypeScript/React for the web interface. Performance-critical components, such as the Markov prediction algorithm, are implemented in C++ with Python bindings.
@@ -115,10 +117,14 @@ Results are presented through an interactive web interface where users can explo
115117
116118 ## Results
117119
120+*NOTE: There are no figures in this section because the reader is expected to browse the results interactively on the Benchcompress website. But eventually we can include some curated figures here.*
121+
118122 We first report on compression ratio performance, and then we will move on to encoding and decoding speeds.
119123
120124 For the synthetic datasets that involve i.i.d. samples, ANS demonstrates superior compression performance compared to other algorithms, achieving compression ratios close to the theoretical entropy bounds. For example, in the Bernoulli sequence with $p=0.1$ ([https://magland.github.io/benchcompress/dataset/bernoulli-0.1](https://magland.github.io/benchcompress/dataset/bernoulli-0.1)), ANS achieves a compression ratio of ~16.9 whereas the next best algorithms (bzip2, lzma, btrotli-11, zstd-19, and zstd-22) achieve ratios around 13.9. Zlib struggles for this dataset, with a compression ratio of only ~12.2 at the highest compression level (9), and much lower values for lower levels. Brotli and Zstandard at the lower compression levels also perform poorly (for example ~9.6 for zstd-7). The results show a similar trend for the other Bernoulli datasets with different probabilities, but the spread is less pronounced as the entropy increases. The story is similar for the quantized Gaussian datasets, with ANS outperforming the other algorithms, especially for lower standard deviations (e.g., $\sigma=3$, [https://magland.github.io/benchcompress/dataset/gaussian-q3](https://magland.github.io/benchcompress/dataset/gaussian-q3)).
121125
126+
127+
122128 ## Discussion
123129
124130 [Discussion to be added]
paper/references.bibmodified+11−1View file
@@ -104,6 +104,16 @@
104104 publisher={eLife Sciences Publications Limited}
105105 }
106106
107+@dataset{ds005880,
108+ title = {BIDS Dataset for the Diminished Seventh Chord},
109+ author = {Wu, Chia-Ying and Chang, Yi-Pei and Lee, Yu-Ying and Tsai, Chen-Gia},
110+ year = 2024,
111+ version = {1.0.1},
112+ publisher = {OpenNeuro},
113+ doi = {10.18112/openneuro.ds005880.v1.0.1},
114+ url = {https://openneuro.org/datasets/ds005880/versions/1.0.1}
115+}
116+
107117 @dataset{gorman_2023_8152964,
108118 author = {Gorman, Andrew R.},
109119 title = {Datasets associated with Uruti Basin gas hydrate
@@ -115,4 +125,4 @@
115125 publisher = {Zenodo},
116126 doi = {10.5281/zenodo.8152964},
117127 url = {https://doi.org/10.5281/zenodo.8152964},
118-}
\ No newline at end of file
128+}
web-ui/src/components/algorithm/AlgorithmContent.tsxmodified+3−1View file
@@ -6,8 +6,9 @@ interface AlgorithmContentProps {
66 algorithm: Algorithm;
77 benchmarkData: BenchmarkData | null;
88 chartData: Array<{
9- algorithm: string;
9+ algorithmOrDataset: string;
1010 compression_ratio: number;
11+ reference_compression_ratio: number | null;
1112 encode_speed: number;
1213 decode_speed: number;
1314 }>;
@@ -25,6 +26,7 @@ export const AlgorithmContent = ({
2526 chartData={chartData}
2627 tagNavigationPrefix="/algorithms"
2728 filterKey="algorithm"
29+ showSortByCompressionRatio={false}
2830 />
2931 );
3032 };
web-ui/src/components/benchmark/charts/BenchmarkCharts.tsxmodified+56−15View file
@@ -1,5 +1,5 @@
1-import Plot from "react-plotly.js";
21 import { useState } from "react";
2+import Plot from "react-plotly.js";
33
44 interface BenchmarkBarChartProps {
55 title: string;
@@ -27,10 +27,40 @@ function BenchmarkBarChart({
2727 {
2828 type: "bar",
2929 orientation: "h",
30- y: data.map((d) => d.algorithm),
30+ y: data.map((d) => d.algorithmOrDataset),
3131 x: data.map((d) => d[dataKey]),
3232 marker: { color },
33+ name: title,
3334 },
35+ ...(dataKey === "compression_ratio" &&
36+ data.some((d) => d.reference_compression_ratio !== null)
37+ ? [
38+ ...data
39+ .filter((d) => d.reference_compression_ratio !== null)
40+ .flatMap((d) => [
41+ {
42+ type: "scatter" as const,
43+ mode: "lines" as const,
44+ y: [d.algorithmOrDataset, d.algorithmOrDataset],
45+ x: [0, d.reference_compression_ratio],
46+ line: { color: "#aaaaaa", width: 1 },
47+ showlegend: false,
48+ hoverinfo: "skip" as const,
49+ },
50+ {
51+ type: "scatter" as const,
52+ mode: "markers" as const,
53+ y: [d.algorithmOrDataset],
54+ x: [d.reference_compression_ratio],
55+ marker: { color: "#aaaaaa", size: 8 },
56+ name: "Best Compression",
57+ hovertemplate: "Best: %{x:.2f}<extra></extra>",
58+ showlegend:
59+ d.algorithmOrDataset === data[0].algorithmOrDataset, // Only show legend for first point
60+ },
61+ ]),
62+ ]
63+ : []),
3464 ]}
3565 layout={{
3666 width: 700,
@@ -47,18 +77,27 @@ function BenchmarkBarChart({
4777 }
4878
4979 interface ChartData {
50- algorithm: string;
80+ algorithmOrDataset: string;
5181 compression_ratio: number;
82+ reference_compression_ratio: number | null; // the highest compression ratio for the dataset (if algorithmOrDataset is a dataset)
5283 encode_speed: number;
5384 decode_speed: number;
5485 }
5586
5687 interface BenchmarkChartsProps {
5788 chartData: ChartData[];
89+ showSortByCompressionRatio?: boolean;
5890 }
5991
60-export function BenchmarkCharts({ chartData }: BenchmarkChartsProps) {
61- const [sortByRatio, setSortByRatio] = useState(true);
92+export function BenchmarkCharts({
93+ chartData,
94+ showSortByCompressionRatio,
95+}: BenchmarkChartsProps) {
96+ const [sortByRatio, setSortByRatio] = useState(
97+ showSortByCompressionRatio ? true : false,
98+ );
99+
100+ console.log("--- showSortByCompressionRatio", showSortByCompressionRatio);
62101
63102 if (!chartData.length) return null;
64103
@@ -68,16 +107,18 @@ export function BenchmarkCharts({ chartData }: BenchmarkChartsProps) {
68107
69108 return (
70109 <div>
71- <div style={{ marginBottom: "10px" }}>
72- <label style={{ display: "flex", alignItems: "center", gap: "8px" }}>
73- <input
74- type="checkbox"
75- checked={sortByRatio}
76- onChange={(e) => setSortByRatio(e.target.checked)}
77- />
78- Sort by compression ratio
79- </label>
80- </div>
110+ {showSortByCompressionRatio && (
111+ <div style={{ marginBottom: "10px" }}>
112+ <label style={{ display: "flex", alignItems: "center", gap: "8px" }}>
113+ <input
114+ type="checkbox"
115+ checked={sortByRatio}
116+ onChange={(e) => setSortByRatio(e.target.checked)}
117+ />
118+ Sort by compression ratio
119+ </label>
120+ </div>
121+ )}
81122 <div
82123 style={{
83124 display: "flex",
web-ui/src/components/benchmark/table/BenchmarkTable.tsxmodified+2−8View file
@@ -1,14 +1,12 @@
11 import {
22 flexRender,
33 getCoreRowModel,
4- useReactTable,
54 getSortedRowModel,
5+ useReactTable,
66 } from "@tanstack/react-table";
77 import { BenchmarkResult } from "../../../types";
8-import { columns } from "./columns";
9-import { BenchmarkCharts } from "../charts/BenchmarkCharts";
108 import { exportToCsv } from "../export/csvExport";
11-import { useBenchmarkChartData } from "../../../hooks/useBenchmarkChartData";
9+import { columns } from "./columns";
1210
1311 interface BenchmarkTableProps {
1412 results: BenchmarkResult[];
@@ -22,12 +20,8 @@ export function BenchmarkTable({ results }: BenchmarkTableProps) {
2220 getSortedRowModel: getSortedRowModel(),
2321 });
2422
25- const chartData = useBenchmarkChartData(results, "", "");
26-
2723 return (
2824 <div className="table-container">
29- {chartData.length > 0 && <BenchmarkCharts chartData={chartData} />}
30-
3125 <table>
3226 <thead>
3327 {table.getHeaderGroups().map((headerGroup) => (
web-ui/src/components/dataset/DatasetContent.tsxmodified+3−1View file
@@ -8,8 +8,9 @@ interface DatasetContentProps {
88 dataset: Dataset;
99 benchmarkData: BenchmarkData | null;
1010 chartData: Array<{
11- algorithm: string;
11+ algorithmOrDataset: string;
1212 compression_ratio: number;
13+ reference_compression_ratio: number | null;
1314 encode_speed: number;
1415 decode_speed: number;
1516 }>;
@@ -92,6 +93,7 @@ export const DatasetContent = ({
9293 filterKey="dataset"
9394 downloadSection={downloadSection}
9495 additionalContent={timeseriesSection}
96+ showSortByCompressionRatio={true}
9597 />
9698 );
9799 };
web-ui/src/components/shared/BaseContent.tsxmodified+8−2View file
@@ -21,8 +21,9 @@ interface BaseContentProps {
2121 item: BaseItem;
2222 benchmarkData: BenchmarkData | null;
2323 chartData: Array<{
24- algorithm: string;
24+ algorithmOrDataset: string;
2525 compression_ratio: number;
26+ reference_compression_ratio: number | null;
2627 encode_speed: number;
2728 decode_speed: number;
2829 }>;
@@ -30,6 +31,7 @@ interface BaseContentProps {
3031 filterKey: "dataset" | "algorithm";
3132 downloadSection?: React.ReactNode;
3233 additionalContent?: React.ReactNode;
34+ showSortByCompressionRatio?: boolean;
3335 }
3436
3537 export const BaseContent = ({
@@ -40,6 +42,7 @@ export const BaseContent = ({
4042 filterKey,
4143 downloadSection,
4244 additionalContent,
45+ showSortByCompressionRatio,
4346 }: BaseContentProps) => {
4447 const navigate = useNavigate();
4548 const [isExpanded, setIsExpanded] = useState(false);
@@ -108,7 +111,10 @@ export const BaseContent = ({
108111 <>
109112 <div className="benchmark-section">
110113 <h2 className="benchmark-title">Benchmark Results</h2>
111- <BenchmarkCharts chartData={chartData} />
114+ <BenchmarkCharts
115+ chartData={chartData}
116+ showSortByCompressionRatio={showSortByCompressionRatio}
117+ />
112118 </div>
113119 <div className="benchmark-section">
114120 <BenchmarkTable
web-ui/src/hooks/useBenchmarkChartData.tsmodified+8−2View file
@@ -11,8 +11,9 @@ export function useBenchmarkChartData(
1111 return results
1212 .filter((row) => row.dataset === selectedDataset)
1313 .map((row) => ({
14- algorithm: row.algorithm,
14+ algorithmOrDataset: row.algorithm,
1515 compression_ratio: row.compression_ratio,
16+ reference_compression_ratio: null,
1617 encode_speed: row.encode_mb_per_sec,
1718 decode_speed: row.decode_mb_per_sec,
1819 }));
@@ -20,8 +21,13 @@ export function useBenchmarkChartData(
2021 return results
2122 .filter((row) => row.algorithm === selectedAlgorithm)
2223 .map((row) => ({
23- algorithm: row.dataset,
24+ algorithmOrDataset: row.dataset,
2425 compression_ratio: row.compression_ratio,
26+ reference_compression_ratio: Math.max(
27+ ...results
28+ .filter((r) => r.dataset === row.dataset)
29+ .map((r) => r.compression_ratio),
30+ ),
2531 encode_speed: row.encode_mb_per_sec,
2632 decode_speed: row.decode_mb_per_sec,
2733 }));
web-ui/src/pages/Algorithm.tsxdeleted+0−128View file
@@ -1,128 +0,0 @@
1-import { useParams } from "react-router-dom";
2-import { Algorithm as AlgorithmType, BenchmarkData } from "../types";
3-import { BenchmarkCharts } from "../components/benchmark/charts/BenchmarkCharts";
4-import { useBenchmarkChartData } from "../hooks/useBenchmarkChartData";
5-import { BenchmarkTable } from "../components/benchmark/table/BenchmarkTable";
6-
7-interface AlgorithmProps {
8- algorithms: AlgorithmType[];
9- benchmarkData: BenchmarkData | null;
10-}
11-
12-function Algorithm({ algorithms, benchmarkData }: AlgorithmProps) {
13- const { algorithmName } = useParams<{ algorithmName: string }>();
14- const algorithm = algorithms.find((a) => a.name === algorithmName);
15- const chartData = useBenchmarkChartData(
16- benchmarkData?.results || [],
17- null,
18- algorithm?.name || null,
19- );
20-
21- if (!algorithm) {
22- return <div>Algorithm not found</div>;
23- }
24-
25- return (
26- <div>
27- <h1
28- style={{
29- fontSize: "2rem",
30- fontWeight: "bold",
31- color: "#333",
32- marginBottom: "1rem",
33- }}
34- >
35- {algorithm.name}
36- </h1>
37- <div>
38- <div style={{ marginBottom: "1.5rem" }}>
39- <p style={{ fontSize: "0.9rem", lineHeight: "1.5" }}>
40- {algorithm.description}
41- </p>
42- </div>
43- <div
44- style={{
45- marginBottom: "1.5rem",
46- display: "flex",
47- gap: "2rem",
48- flexWrap: "wrap",
49- }}
50- >
51- <div>
52- <span style={{ fontWeight: "bold", fontSize: "0.9rem" }}>
53- Version:{" "}
54- </span>
55- <span style={{ fontSize: "0.9rem" }}>{algorithm.version}</span>
56- </div>
57- <div>
58- <span style={{ fontWeight: "bold", fontSize: "0.9rem" }}>
59- Tags:{" "}
60- </span>
61- {algorithm.tags.map((tag) => (
62- <span
63- key={tag}
64- style={{
65- display: "inline-block",
66- backgroundColor: "#e1e1e1",
67- padding: "2px 6px",
68- borderRadius: "3px",
69- margin: "2px",
70- fontSize: "0.8rem",
71- }}
72- >
73- {tag}
74- </span>
75- ))}
76- </div>
77- {algorithm.source_file && (
78- <div>
79- <span style={{ fontWeight: "bold", fontSize: "0.9rem" }}>
80- Source:{" "}
81- </span>
82- <a
83- href={algorithm.source_file}
84- target="_blank"
85- rel="noopener noreferrer"
86- style={{
87- color: "#0066cc",
88- textDecoration: "none",
89- padding: "2px 6px",
90- backgroundColor: "#f0f0f0",
91- borderRadius: "4px",
92- fontSize: "0.9rem",
93- }}
94- >
95- View
96- </a>
97- </div>
98- )}
99- </div>
100- {benchmarkData && (
101- <>
102- <div style={{ marginBottom: "1.5rem" }}>
103- <h2
104- style={{
105- fontSize: "1.2rem",
106- fontWeight: "bold",
107- marginBottom: "0.5rem",
108- }}
109- >
110- Benchmark Results
111- </h2>
112- <BenchmarkCharts chartData={chartData} />
113- </div>
114- <div style={{ marginBottom: "1.5rem" }}>
115- <BenchmarkTable
116- results={benchmarkData.results.filter(
117- (result) => result.algorithm === algorithm.name,
118- )}
119- />
120- </div>
121- </>
122- )}
123- </div>
124- </div>
125- );
126-}
127-
128-export default Algorithm;
web-ui/src/pages/Dataset.tsxdeleted+0−207View file
@@ -1,207 +0,0 @@
1-import { useParams } from "react-router-dom";
2-import { Dataset as DatasetType, BenchmarkData } from "../types";
3-import TimeseriesView from "../components/dataset/TimeseriesView";
4-import { useEffect, useRef, useState } from "react";
5-import { BenchmarkCharts } from "../components/benchmark/charts/BenchmarkCharts";
6-import { useBenchmarkChartData } from "../hooks/useBenchmarkChartData";
7-import { BenchmarkTable } from "../components/benchmark/table/BenchmarkTable";
8-
9-interface DatasetProps {
10- datasets: DatasetType[];
11- benchmarkData: BenchmarkData | null;
12-}
13-
14-function Dataset({ datasets, benchmarkData }: DatasetProps) {
15- const containerRef = useRef<HTMLDivElement>(null);
16- const [containerWidth, setContainerWidth] = useState(1200);
17-
18- useEffect(() => {
19- if (!containerRef.current) return;
20-
21- const resizeObserver = new ResizeObserver((entries) => {
22- for (const entry of entries) {
23- // Account for padding by subtracting 32px (2rem)
24- setContainerWidth(entry.contentRect.width - 32);
25- }
26- });
27-
28- resizeObserver.observe(containerRef.current);
29-
30- return () => {
31- resizeObserver.disconnect();
32- };
33- }, []);
34-
35- const { datasetName } = useParams<{ datasetName: string }>();
36- const dataset = datasets.find((d) => d.name === datasetName);
37- const chartData = useBenchmarkChartData(
38- benchmarkData?.results || [],
39- dataset?.name || null,
40- null,
41- );
42-
43- if (!dataset) {
44- return <div>Dataset not found</div>;
45- }
46-
47- return (
48- <div>
49- <h1
50- style={{
51- fontSize: "2rem",
52- fontWeight: "bold",
53- color: "#333",
54- marginBottom: "1rem",
55- }}
56- >
57- {dataset.name}
58- </h1>
59- <div>
60- <div style={{ marginBottom: "1.5rem" }}>
61- <p style={{ fontSize: "0.9rem", lineHeight: "1.5" }}>
62- {dataset.description}
63- </p>
64- </div>
65- <div
66- style={{
67- marginBottom: "1.5rem",
68- display: "flex",
69- gap: "2rem",
70- flexWrap: "wrap",
71- }}
72- >
73- <div>
74- <span style={{ fontWeight: "bold", fontSize: "0.9rem" }}>
75- Version:{" "}
76- </span>
77- <span style={{ fontSize: "0.9rem" }}>{dataset.version}</span>
78- </div>
79- <div>
80- <span style={{ fontWeight: "bold", fontSize: "0.9rem" }}>
81- Tags:{" "}
82- </span>
83- {dataset.tags.map((tag) => (
84- <span
85- key={tag}
86- style={{
87- display: "inline-block",
88- backgroundColor: "#e1e1e1",
89- padding: "2px 6px",
90- borderRadius: "3px",
91- margin: "2px",
92- fontSize: "0.8rem",
93- }}
94- >
95- {tag}
96- </span>
97- ))}
98- </div>
99- <div>
100- <span style={{ fontWeight: "bold", fontSize: "0.9rem" }}>
101- Download:{" "}
102- </span>
103- <span style={{ display: "inline-flex", gap: "0.5rem" }}>
104- {dataset.data_url_npy && (
105- <a
106- href={dataset.data_url_npy}
107- download={`${dataset.name}-${dataset.version}.npy`}
108- style={{
109- color: "#0066cc",
110- textDecoration: "none",
111- padding: "2px 6px",
112- backgroundColor: "#f0f0f0",
113- borderRadius: "4px",
114- fontSize: "0.9rem",
115- }}
116- >
117- NPY
118- </a>
119- )}
120- {dataset.data_url_raw && (
121- <a
122- href={dataset.data_url_raw}
123- download={`${dataset.name}-${dataset.version}.dat`}
124- style={{
125- color: "#0066cc",
126- textDecoration: "none",
127- padding: "2px 6px",
128- backgroundColor: "#f0f0f0",
129- borderRadius: "4px",
130- fontSize: "0.9rem",
131- }}
132- >
133- RAW
134- </a>
135- )}
136- </span>
137- </div>
138- {dataset.source_file && (
139- <div>
140- <span style={{ fontWeight: "bold", fontSize: "0.9rem" }}>
141- Source:{" "}
142- </span>
143- <a
144- href={dataset.source_file}
145- target="_blank"
146- rel="noopener noreferrer"
147- style={{
148- color: "#0066cc",
149- textDecoration: "none",
150- padding: "2px 6px",
151- backgroundColor: "#f0f0f0",
152- borderRadius: "4px",
153- fontSize: "0.9rem",
154- }}
155- >
156- View
157- </a>
158- </div>
159- )}
160- </div>
161- <div style={{ marginBottom: "1.5rem" }}>
162- <div
163- ref={containerRef}
164- style={{
165- width: "100%",
166- height: "300px",
167- backgroundColor: "#f5f5f5",
168- borderRadius: "4px",
169- padding: "1rem",
170- }}
171- >
172- <TimeseriesView
173- width={containerWidth}
174- height={250}
175- dataset={dataset}
176- />
177- </div>
178- </div>
179- {benchmarkData && (
180- <>
181- <div style={{ marginBottom: "1.5rem" }}>
182- <h2
183- style={{
184- fontSize: "1.2rem",
185- fontWeight: "bold",
186- marginBottom: "0.5rem",
187- }}
188- >
189- Benchmark Results
190- </h2>
191- <BenchmarkCharts chartData={chartData} />
192- </div>
193- <div style={{ marginBottom: "1.5rem" }}>
194- <BenchmarkTable
195- results={benchmarkData.results.filter(
196- (result) => result.dataset === dataset.name,
197- )}
198- />
199- </div>
200- </>
201- )}
202- </div>
203- </div>
204- );
205-}
206-
207-export default Dataset;
web-ui/tsconfig.app.tsbuildinfomodified+1−1View file
@@ -1 +1 @@
1-{"root":["./src/App.tsx","./src/env.d.ts","./src/main.tsx","./src/types.ts","./src/vite-env.d.ts","./src/components/BenchmarkTable.tsx","./src/components/ScrollToTop.tsx","./src/components/TagFilter.tsx","./src/components/algorithm/AlgorithmContent.tsx","./src/components/benchmark/charts/BenchmarkCharts.tsx","./src/components/benchmark/export/csvExport.ts","./src/components/benchmark/table/BenchmarkTable.tsx","./src/components/benchmark/table/columns.tsx","./src/components/benchmark/utils/formatters.ts","./src/components/dataset/DatasetContent.tsx","./src/components/dataset/TimeseriesNavigationBar.tsx","./src/components/dataset/TimeseriesView.tsx","./src/components/dataset/TimeseriesViewWorker.ts","./src/components/dataset/WorkerTypes.ts","./src/components/dataset/timeseriesViewReducer.ts","./src/components/shared/BaseContent.tsx","./src/components/tables/DatasetAlgorithmTables.tsx","./src/hooks/TimeseriesDataClient.ts","./src/hooks/useBenchmarkChartData.ts","./src/hooks/useMarkdownContent.ts","./src/hooks/useMarkdownPosts.ts","./src/hooks/useTagFilter.ts","./src/hooks/useTimeseriesData.ts","./src/hooks/useTimeseriesDataClient.ts","./src/pages/About.tsx","./src/pages/Algorithm.tsx","./src/pages/BenchmarkView.tsx","./src/pages/Dataset.tsx","./src/pages/Home.tsx","./src/pages/Monitor.tsx","./src/pages/Paper.tsx","./src/reducers/tabsReducer.ts","./src/types/home-content.ts"],"version":"5.6.3"}
\ No newline at end of file
1+{"root":["./src/App.tsx","./src/env.d.ts","./src/main.tsx","./src/types.ts","./src/vite-env.d.ts","./src/components/BenchmarkTable.tsx","./src/components/ScrollToTop.tsx","./src/components/TagFilter.tsx","./src/components/algorithm/AlgorithmContent.tsx","./src/components/benchmark/charts/BenchmarkCharts.tsx","./src/components/benchmark/export/csvExport.ts","./src/components/benchmark/table/BenchmarkTable.tsx","./src/components/benchmark/table/columns.tsx","./src/components/benchmark/utils/formatters.ts","./src/components/dataset/DatasetContent.tsx","./src/components/dataset/TimeseriesNavigationBar.tsx","./src/components/dataset/TimeseriesView.tsx","./src/components/dataset/TimeseriesViewWorker.ts","./src/components/dataset/WorkerTypes.ts","./src/components/dataset/timeseriesViewReducer.ts","./src/components/shared/BaseContent.tsx","./src/components/tables/DatasetAlgorithmTables.tsx","./src/hooks/TimeseriesDataClient.ts","./src/hooks/useBenchmarkChartData.ts","./src/hooks/useMarkdownContent.ts","./src/hooks/useMarkdownPosts.ts","./src/hooks/useTagFilter.ts","./src/hooks/useTimeseriesData.ts","./src/hooks/useTimeseriesDataClient.ts","./src/pages/Algorithm.tsx","./src/pages/BenchmarkView.tsx","./src/pages/Dataset.tsx","./src/pages/Home.tsx","./src/pages/Monitor.tsx","./src/pages/Paper.tsx","./src/pages/Submit.tsx","./src/reducers/tabsReducer.ts","./src/types/home-content.ts"],"version":"5.6.3"}
\ No newline at end of file