diff --git a/data/classically-verifiable-problems/circuit-models.json b/data/classically-verifiable-problems/circuit-models.json index 0930c25..2f98f37 100644 --- a/data/classically-verifiable-problems/circuit-models.json +++ b/data/classically-verifiable-problems/circuit-models.json @@ -5,19 +5,22 @@ "id": "peaked_circuit_heavy_hex_49x4020", "path": "peaked_circuit_heavy_hex_49x4020.qasm", "qubits": 49, - "gates": 4020 + "gates": 4020, + "category": "Baseline benchmarks" }, { "id": "peaked_circuit_heavy_hex_49x5072", "path": "peaked_circuit_heavy_hex_49x5072.qasm", "qubits": 49, - "gates": 5072 + "gates": 5072, + "category": "Superseded candidates" }, { "id": "peaked_circuit_P9_Hqap_56x1917", "path": "peaked_circuit_P9_Hqap_56x1917.qasm", "qubits": 56, - "gates": 1917 + "gates": 1917, + "category": "Superseded candidates" } ] }, @@ -27,7 +30,8 @@ "id": "random_graph_sampling_nq70_depth70_checks27_basis_fstate", "path": "nq70_depth70_checks27_basis_fstate.qasm", "qubits": 70, - "gates": 2415 + "gates": 2415, + "category": "Active candidates" } ] }, @@ -37,7 +41,8 @@ "id": "doped_random_graph_sampling_nq70_depth70_checks27", "path": "nq70_depth70_checks27_doped.qasm", "qubits": 70, - "gates": 2415 + "gates": 2415, + "category": "Baseline benchmarks" } ] } diff --git a/data/observable-estimations/circuit-models.json b/data/observable-estimations/circuit-models.json index 71b96ec..27288dc 100644 --- a/data/observable-estimations/circuit-models.json +++ b/data/observable-estimations/circuit-models.json @@ -5,19 +5,22 @@ "id": "operator_loschmidt_echo_49x648", "path": "49Q_OLE_circuit_L_3_b_0.25_delta0.15.qasm", "qubits": 49, - "gates": 648 + "gates": 648, + "category": "Baseline benchmarks" }, { "id": "operator_loschmidt_echo_49x1296", "path": "49Q_OLE_circuit_L_6_b_0.25_delta0.15.qasm", "qubits": 49, - "gates": 1296 + "gates": 1296, + "category": "Active candidates" }, { "id": "operator_loschmidt_echo_70x1872", "path": "70Q_OLE_circuit_L_6_b_0.25_delta0.15.qasm", "qubits": 70, - "gates": 1872 + "gates": 1872, + "category": "Active candidates" } ] }, @@ -27,13 +30,15 @@ "id": "SU(2)Hadron-LSH-x_100_SCV", "path": "x_100_SCV.qasm", "qubits": 120, - "gates": 60000 + "gates": 60000, + "category": "Baseline benchmarks" }, { "id": "SU(2)Hadron-LSH-x_100_meson", "path": "x_100_meson.qasm", "qubits": 120, - "gates": 60000 + "gates": 60000, + "category": "Baseline benchmarks" } ] }, @@ -45,7 +50,8 @@ "qubits": 51, "gates": 896, "floquet_cycles": 16, - "measured_observable": "magnetization" + "measured_observable": "magnetization", + "category": "Baseline benchmarks" }, { "id": "floquet_mixed_field_ising_zzd2_51qx16c", @@ -53,7 +59,8 @@ "qubits": 51, "gates": 896, "floquet_cycles": 16, - "measured_observable": "ZZ_{d=2}" + "measured_observable": "ZZ_{d=2}", + "category": "Baseline benchmarks" }, { "id": "floquet_mixed_field_ising_zzd3_51qx16c", @@ -61,7 +68,8 @@ "qubits": 51, "gates": 896, "floquet_cycles": 16, - "measured_observable": "ZZ_{d=3}" + "measured_observable": "ZZ_{d=3}", + "category": "Baseline benchmarks" } ] } diff --git a/data/variational-problems/hamiltonians.json b/data/variational-problems/hamiltonians.json index c37333d..eeac1b1 100644 --- a/data/variational-problems/hamiltonians.json +++ b/data/variational-problems/hamiltonians.json @@ -4,47 +4,56 @@ { "id": "n2_3-00_14e_28o", "path": "n2_3-00_14e_28o.fcidump", - "hilbert_space_size": 1.4e12 + "hilbert_space_size": 1.4e12, + "category": "Baseline benchmarks" }, { "id": "n2_2-50_14e_28o", "path": "n2_2-50_14e_28o.fcidump", - "hilbert_space_size": 1.4e12 + "hilbert_space_size": 1.4e12, + "category": "Baseline benchmarks" }, { "id": "n2_2-00_14e_28o", "path": "n2_2-00_14e_28o.fcidump", - "hilbert_space_size": 1.4e12 + "hilbert_space_size": 1.4e12, + "category": "Baseline benchmarks" }, { "id": "n2_1-50_14e_28o", "path": "n2_1-50_14e_28o.fcidump", - "hilbert_space_size": 1.4e12 + "hilbert_space_size": 1.4e12, + "category": "Baseline benchmarks" }, { "id": "n2_1-20_14e_28o", "path": "n2_1-20_14e_28o.fcidump", - "hilbert_space_size": 1.4e12 + "hilbert_space_size": 1.4e12, + "category": "Baseline benchmarks" }, { "id": "n2_1-10_14e_28o", "path": "n2_1-10_14e_28o.fcidump", - "hilbert_space_size": 1.4e12 + "hilbert_space_size": 1.4e12, + "category": "Baseline benchmarks" }, { "id": "n2_1-00_14e_28o", "path": "n2_1-00_14e_28o.fcidump", - "hilbert_space_size": 1.4e12 + "hilbert_space_size": 1.4e12, + "category": "Baseline benchmarks" }, { "id": "n2_0-90_14e_28o", "path": "n2_0-90_14e_28o.fcidump", - "hilbert_space_size": 1.4e12 + "hilbert_space_size": 1.4e12, + "category": "Baseline benchmarks" }, { "id": "n2_0-80_14e_28o", "path": "n2_0-80_14e_28o.fcidump", - "hilbert_space_size": 1.4e12 + "hilbert_space_size": 1.4e12, + "category": "Baseline benchmarks" } ] }, @@ -53,7 +62,8 @@ { "id": "2fe_2s_30e_20o", "path": "2fe_2s_30e_20o.fcidump", - "hilbert_space_size": 2.4e8 + "hilbert_space_size": 2.4e8, + "category": "Baseline benchmarks" } ] }, @@ -62,7 +72,8 @@ { "id": "4fe_4s_54e_36o", "path": "4fe_4s_54e_36o.fcidump", - "hilbert_space_size": 8.86e15 + "hilbert_space_size": 8.86e15, + "category": "Baseline benchmarks" } ] }, @@ -71,7 +82,8 @@ { "id": "anderson_impurity_model_4i_28b_32e", "path": "anderson_impurity_model_4i_28b_32e.fcidump", - "hilbert_space_size": 3.61e17 + "hilbert_space_size": 3.61e17, + "category": "Baseline benchmarks" } ] }, @@ -80,7 +92,8 @@ { "id": "guided_sparse_ground_state_problem_49Q_v1", "path": "49Q_v1", - "hilbert_space_size": 5.62e14 + "hilbert_space_size": 5.62e14, + "category": "Baseline benchmarks" } ] } diff --git a/package-lock.json b/package-lock.json index 725975d..b04159a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,9 +12,11 @@ "clsx": "^2.1.1", "lucide-react": "^1.16.0", "next": "16.2.6", + "nuqs": "^2.8.9", "radix-ui": "^1.4.3", "react": "^19.2.6", "react-dom": "^19.2.6", + "recharts": "^3.8.1", "tailwind-merge": "^3.6.0" }, "devDependencies": { @@ -2797,6 +2799,42 @@ "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", "license": "MIT" }, + "node_modules/@reduxjs/toolkit": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.12.0.tgz", + "integrity": "sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", + "immer": "^11.0.0", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@reduxjs/toolkit/node_modules/immer": { + "version": "11.1.8", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.8.tgz", + "integrity": "sha512-/tbkHMW7y10Lx6i1crLjD4/OhNkRG+Fo7byZHtah0547nIeXYcpIXaUh0IAQY6gO5459qpGGYapcEOHtFXkIuA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -2804,6 +2842,18 @@ "dev": true, "license": "MIT" }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, "node_modules/@swc/helpers": { "version": "0.5.15", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", @@ -3095,6 +3145,69 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", @@ -3146,6 +3259,12 @@ "@types/react": "^19.2.0" } }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.59.4", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.4.tgz", @@ -4371,6 +4490,127 @@ "devOptional": true, "license": "MIT" }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -4450,6 +4690,12 @@ } } }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -4781,6 +5027,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-toolkit": { + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.47.0.tgz", + "integrity": "sha512-n1GuoD0WEQZMBk5tttoZSqwgyLx01oqa5XsBmCHwPyNe1S9jPBEmtR2pSgp2kJuWE3ciFZ6yRHmY4pM4C3OOkw==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -5214,7 +5470,6 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", - "dev": true, "license": "MIT" }, "node_modules/fast-deep-equal": { @@ -5723,6 +5978,16 @@ "node": ">= 4" } }, + "node_modules/immer": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", + "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -5765,6 +6030,15 @@ "node": ">= 0.4" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -7077,6 +7351,43 @@ "dev": true, "license": "MIT" }, + "node_modules/nuqs": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/nuqs/-/nuqs-2.8.9.tgz", + "integrity": "sha512-8ou6AEwsxMWSYo2qkfZtYFVzngwbKmg4c00HVxC1fF6CEJv3Fwm6eoZmfVPALB+vw8Udo7KL5uy96PFcYe1BIQ==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/franky47" + }, + "peerDependencies": { + "@remix-run/react": ">=2", + "@tanstack/react-router": "^1", + "next": ">=14.2.0", + "react": ">=18.2.0 || ^19.0.0-0", + "react-router": "^5 || ^6 || ^7", + "react-router-dom": "^5 || ^6 || ^7" + }, + "peerDependenciesMeta": { + "@remix-run/react": { + "optional": true + }, + "@tanstack/react-router": { + "optional": true + }, + "next": { + "optional": true + }, + "react-router": { + "optional": true + }, + "react-router-dom": { + "optional": true + } + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -7667,9 +7978,31 @@ "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, "license": "MIT" }, + "node_modules/react-redux": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.3.0.tgz", + "integrity": "sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==", + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, "node_modules/react-remove-scroll": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", @@ -7739,6 +8072,51 @@ } } }, + "node_modules/recharts": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.8.1.tgz", + "integrity": "sha512-mwzmO1s9sFL0TduUpwndxCUNoXsBw3u3E/0+A+cLcrSfQitSG62L32N69GhqUrrT5qKcAE3pCGVINC6pqkBBQg==", + "license": "MIT", + "workspaces": [ + "www" + ], + "dependencies": { + "@reduxjs/toolkit": "^1.9.0 || 2.x.x", + "clsx": "^2.1.1", + "decimal.js-light": "^2.5.1", + "es-toolkit": "^1.39.3", + "eventemitter3": "^5.0.1", + "immer": "^10.1.1", + "react-redux": "8.x.x || 9.x.x", + "reselect": "5.1.1", + "tiny-invariant": "^1.3.3", + "use-sync-external-store": "^1.2.2", + "victory-vendor": "^37.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -7783,6 +8161,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "license": "MIT" + }, "node_modules/resolve": { "version": "2.0.0-next.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", @@ -8548,6 +8932,12 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, "node_modules/tinyexec": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz", @@ -8929,6 +9319,28 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/victory-vendor": { + "version": "37.3.6", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz", + "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index 5a61dc1..d27e120 100644 --- a/package.json +++ b/package.json @@ -37,9 +37,11 @@ "clsx": "^2.1.1", "lucide-react": "^1.16.0", "next": "16.2.6", + "nuqs": "^2.8.9", "radix-ui": "^1.4.3", "react": "^19.2.6", "react-dom": "^19.2.6", + "recharts": "^3.8.1", "tailwind-merge": "^3.6.0" }, "devDependencies": { diff --git a/src/app/(home)/TrackerSummary.tsx b/src/app/(home)/TrackerSummary.tsx new file mode 100644 index 0000000..36bc777 --- /dev/null +++ b/src/app/(home)/TrackerSummary.tsx @@ -0,0 +1,73 @@ +import { Badge } from '@/components/ui/badge'; +import { Button } from '@/components/ui/button'; +import { CATEGORIES, type Category } from '@/lib/categories'; +import clsx from 'clsx'; +import { ChevronRightIcon } from 'lucide-react'; +import type { Route } from 'next'; +import Link from 'next/link'; + +export type ActiveCard = { + id: string; + type: string; + instanceLabel: string; + entries: number; +}; + +export function TrackerSummary(props: { + title: string; + href: Route; + counts: Record; + activeCards: ActiveCard[]; +}) { + const { title, href, counts, activeCards } = props; + return ( +
  • +
    {title}
    +
    + {CATEGORIES.map(({ value, label }) => { + const isActiveBadge = value === 'Active candidates'; + return ( + + {counts[value]} {label.toLowerCase()} + + ); + })} +
    + +
    + {activeCards.length === 0 ? ( +
    + No active candidates recorded +
    + ) : ( + activeCards.map((card, idx) => ( + +
    +
    + {card.type} +
    +
    + {card.instanceLabel} +
    +
    +
    {card.entries} entries
    + + + )) + )} +
    + + +
  • + ); +} diff --git a/src/app/(home)/page.tsx b/src/app/(home)/page.tsx index 4ed04fa..195e4ae 100644 --- a/src/app/(home)/page.tsx +++ b/src/app/(home)/page.tsx @@ -1,25 +1,65 @@ import { Button } from '@/components/ui/button'; +import { isCategory, type Category } from '@/lib/categories'; +import type { BaseSubmission } from '@/types/submissions'; +import { buildInstanceOptions, flattenInstances, stripType } from '@/utils'; import { ChevronRightIcon } from 'lucide-react'; import Link from 'next/link'; +import cvpCircuitModels from '../../../data/classically-verifiable-problems/circuit-models.json' with { type: 'json' }; +import cvpSubmissions from '../../../data/classically-verifiable-problems/submissions.json' with { type: 'json' }; +import oeCircuitModels from '../../../data/observable-estimations/circuit-models.json' with { type: 'json' }; +import oeSubmissions from '../../../data/observable-estimations/submissions.json' with { type: 'json' }; +import vpHamiltonians from '../../../data/variational-problems/hamiltonians.json' with { type: 'json' }; +import vpSubmissions from '../../../data/variational-problems/submissions.json' with { type: 'json' }; import { Contributors } from './Contributors'; +import { TrackerSummary, type ActiveCard } from './TrackerSummary'; + +function computeCounts( + submissions: T[], + instances: { id: string; category: string }[], + getInstanceId: (s: T) => string, +): Record { + const counts: Record = { + 'Active candidates': 0, + 'Superseded candidates': 0, + 'Baseline benchmarks': 0, + }; + const withSubmissions = new Set(submissions.map(getInstanceId)); + for (const instance of instances) { + if (withSubmissions.has(instance.id) && isCategory(instance.category)) { + counts[instance.category]++; + } + } + return counts; +} + +function computeActiveCards< + T extends BaseSubmission, + I extends { id: string; type: string; category: string }, +>(submissions: T[], instances: I[], getInstanceId: (s: T) => string): ActiveCard[] { + return buildInstanceOptions(submissions, instances, getInstanceId, 'Active candidates') + .slice(0, 2) + .map((inst) => ({ + id: inst.id, + type: inst.type, + instanceLabel: stripType(inst.id, inst.type), + entries: inst.entries, + })); +} export default function Home() { + const oeInstances = flattenInstances(oeCircuitModels); + const vpInstances = flattenInstances(vpHamiltonians); + const cvpInstances = flattenInstances(cvpCircuitModels); + return ( <>
    -
    +

    Benchmarking quantum advantage

    As claims of quantum advantage emerge, this project provides a platform-agnostic framework to collect, validate, and compare results.

    -
    - -
    @@ -30,6 +70,87 @@ export default function Home() {
    +
    +
    +

    Active advantage candidates

    +

    + Active candidates represent the highest bar, where quantum methods are credible + contenders but reliable classical benchmarks have yet to catch up. +

    +
    +
      + s.circuit)} + activeCards={computeActiveCards(oeSubmissions, oeInstances, (s) => s.circuit)} + /> + s.hamiltonian)} + activeCards={computeActiveCards(vpSubmissions, vpInstances, (s) => s.hamiltonian)} + /> + s.circuit)} + activeCards={computeActiveCards(cvpSubmissions, cvpInstances, (s) => s.circuit)} + /> +
    +
    + +
    +

    Submission categories

    +
    +
    +
      +
    • +
      +
      +

      Active candidates

      +

      + Problem instances where quantum computations currently appear to challenge leading + classical methods, and where further benchmarking is needed to determine whether an + advantage exists. +

      +
    • +
    • +
      +
      +

      Superseded candidates

      +

      + Problem instances where quantum computations once appeared to challenge leading + classical methods, but for which subsequent classical progress has closed or + reversed the apparent gap. +

      +
    • +
    • +
      +
      +

      Baseline benchmarks

      +

      + Problem instances that provide useful reference points for comparing quantum and + classical methods, including examples where the state-of-the-art solutions are + classical. +

      +
    • +
    +
    +
    +

    What is quantum advantage?

    diff --git a/src/app/globals.css b/src/app/globals.css index bad4382..edffbbf 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -47,6 +47,7 @@ --color-link-foreground: var(--link-foreground); --color-table-head: #343a3f; --color-table-head-foreground: #ffffff; + --color-classical-submission: #393939; --animate-marquee: marquee 50s linear infinite; diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 328abe2..595bfdc 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,6 +1,8 @@ import type { Metadata } from 'next'; import { Inter } from 'next/font/google'; import Link from 'next/link'; +import { NuqsAdapter } from 'nuqs/adapters/next/app'; +import { TooltipProvider } from '@/components/ui/tooltip'; import { NavMenu } from './NavMenu'; import './globals.css'; @@ -25,23 +27,27 @@ export default function RootLayout(props: LayoutProps<'/'>) { return ( -

    - +
    -
    {props.children}
    +
    {props.children}
    -
    -
    Quantum Advantage Tracker ยฉ 2026
    -
    +
    +
    Quantum Advantage Tracker ยฉ 2026
    +
    + + ); diff --git a/src/app/trackers/classically-verifiable-problems/SubmissionsTable.tsx b/src/app/trackers/classically-verifiable-problems/SubmissionsTable.tsx index 91fe300..4e32fb1 100644 --- a/src/app/trackers/classically-verifiable-problems/SubmissionsTable.tsx +++ b/src/app/trackers/classically-verifiable-problems/SubmissionsTable.tsx @@ -1,242 +1,36 @@ 'use client'; -import { RuntimeSeconds } from '@/components/RuntimeSeconds'; -import { Button } from '@/components/ui/button'; -import { - Select, - SelectContent, - SelectGroup, - SelectItem, - SelectLabel, - SelectTrigger, - SelectValue, -} from '@/components/ui/select'; -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from '@/components/ui/table'; -import { TableEmptyIcon } from '@/icons'; +import { SubmissionsTable as SharedSubmissionsTable } from '@/components/SubmissionsTable'; import type { CircuitModels } from '@/types/circuitModels'; import type { CVPSubmission } from '@/types/submissions'; -import { flattenInstances, formatDate, getCircuitInstanceUrl, sortSubmissions } from '@/utils'; -import { ArrowDownIcon, RotateCcwIcon } from 'lucide-react'; -import { useMemo, useState } from 'react'; +import { flattenInstances, getCircuitInstanceUrl } from '@/utils'; export function SubmissionsTable(props: { submissions: CVPSubmission[]; circuitModels: CircuitModels; }) { - const { submissions, circuitModels } = props; - const circuitInstances = useMemo(() => flattenInstances(circuitModels), [circuitModels]); - const modelOptions = useMemo(() => Object.keys(circuitModels), [circuitModels]); - - const [modelFilter, setModelFilter] = useState(() => { - return modelOptions.length === 1 ? modelOptions[0] : 'all'; - }); - - const [instanceFilter, setInstanceFilter] = useState(() => { - const initialModel = modelOptions.length === 1 ? modelOptions[0] : 'all'; - const initialInstances = - initialModel === 'all' ? circuitInstances : circuitModels[initialModel]?.instances || []; - return initialInstances.length === 1 ? initialInstances[0].id : 'all'; - }); - - const filteredSubmissions = useMemo(() => { - return submissions.filter((submission) => { - const instance = circuitInstances.find((inst) => inst.id === submission.circuit); - if (!instance) return false; - - const matchesModel = modelFilter === 'all' || instance.type === modelFilter; - const matchesInstance = instanceFilter === 'all' || submission.circuit === instanceFilter; - - return matchesModel && matchesInstance; - }); - }, [submissions, circuitInstances, modelFilter, instanceFilter]); - - const instanceOptions = useMemo(() => { - if (modelFilter === 'all') { - return circuitInstances; - } - const modelInstances = circuitModels[modelFilter]?.instances || []; - return modelInstances.map((instance) => ({ ...instance, type: modelFilter })); - }, [circuitInstances, circuitModels, modelFilter]); - - const resetFilters = () => { - const newModel = modelOptions.length === 1 ? modelOptions[0] : 'all'; - setModelFilter(newModel); - - const newInstances = - newModel === 'all' ? circuitInstances : circuitModels[newModel]?.instances || []; - setInstanceFilter(newInstances.length === 1 ? newInstances[0].id : 'all'); - }; - - return ( -
    -
    - - - - - -
    - - - - - - Date - - Name / Institutions - Method - Circuit - Qubits - Gates - Value - - Runtime -
    - (seconds) -
    - Compute resources -
    -
    - - {filteredSubmissions.length === 0 ? ( - - ) : ( - sortSubmissions(filteredSubmissions).map((submission, index) => { - const circuitInstance = circuitInstances.find( - (instance) => instance.id === submission.circuit, - )!; - - return ( - - - - - - - {submission.name} - - -
    - By:{' '} - {submission.institutions} -
    -
    - {submission.method} - - - {circuitInstance.id} - - - {circuitInstance.qubits} - {circuitInstance.gates} - {submission.value} - -
    - Q:{' '} - -
    -
    - C:{' '} - -
    -
    - -
    - Q: {submission.computeResourcesQuantum || '-'} -
    -
    - C:{' '} - {submission.computeResourcesClassical || '-'} -
    -
    -
    - ); - }) - )} -
    -
    -
    - ); -} - -function TableBodyEmpty() { return ( - - -
    - -

    There are no submissions yet

    -
    -
    -
    + s.circuit} + getInstanceUrl={(inst) => getCircuitInstanceUrl('classically-verifiable-problems', inst)} + getQubits={(_s, inst) => inst.qubits} + getGates={(_s, inst) => inst.gates} + valueColumn={{ + header: 'Value', + render: (s) => s.value, + }} + chart={{ + getValue: (s) => { + if (s.runtimeQuantum === undefined && s.runtimeClassical === undefined) return null; + return (s.runtimeQuantum ?? 0) + (s.runtimeClassical ?? 0); + }, + yLabel: 'Runtime to solution (s)', + yTooltipLabel: 'RT', + yTooltipSuffix: 's', + yScale: 'log', + }} + /> ); } diff --git a/src/app/trackers/classically-verifiable-problems/page.tsx b/src/app/trackers/classically-verifiable-problems/page.tsx index 5bc55f8..1177318 100644 --- a/src/app/trackers/classically-verifiable-problems/page.tsx +++ b/src/app/trackers/classically-verifiable-problems/page.tsx @@ -1,10 +1,14 @@ +import { OrganizedInto } from '@/components/OrganizedInto'; import { Button } from '@/components/ui/button'; import { GithubIcon } from '@/icons'; +import type { CVPSubmission } from '@/types/submissions'; import type { Metadata } from 'next'; import circuitModels from '../../../../data/classically-verifiable-problems/circuit-models.json' with { type: 'json' }; -import submissions from '../../../../data/classically-verifiable-problems/submissions.json' with { type: 'json' }; +import submissionsData from '../../../../data/classically-verifiable-problems/submissions.json' with { type: 'json' }; import { SubmissionsTable } from './SubmissionsTable'; +const submissions = submissionsData as CVPSubmission[]; + export const metadata: Metadata = { title: 'Classically verifiable problems', description: @@ -15,15 +19,16 @@ export default async function TrackersCVP() { return ( <>
    -
    -

    Classically verifiable problems ๐Ÿ—๏ธ

    -

    +
    +

    Classically verifiable problems ๐Ÿ—๏ธ

    +

    Submissions must demonstrate quantum advantage by scoring solutions against known answers or efficiently checkable witnesses.

    + -
    - - -
    - - - - - - Date - - Name / Institutions - Method - Circuit - Qubits - Gates - - Expectation value -
    - [upper, lower bound] -
    - - Runtime -
    - (seconds) -
    - Compute resources -
    -
    - - {filteredSubmissions.length === 0 ? ( - - ) : ( - sortSubmissions(filteredSubmissions).map((submission, index) => { - const circuitInstance = circuitInstances.find( - (instance) => instance.id === submission.circuit, - )!; - - return ( - - - - - - - {submission.name} - - -
    - By:{' '} - {submission.institutions} -
    -
    - {submission.method} - - - {circuitInstance.id} - - - {circuitInstance.qubits} - {circuitInstance.gates} - -
    {submission.observableValue}
    -
    - [{submission.errorBoundHigh || 'N/A'}, {submission.errorBoundLow || 'N/A'}] -
    -
    - -
    - Q:{' '} - -
    -
    - C:{' '} - -
    -
    - -
    - Q: {submission.computeResourcesQuantum || '-'} -
    -
    - C:{' '} - {submission.computeResourcesClassical || '-'} -
    -
    -
    - ); - }) - )} -
    -
    -
    - ); -} - -function TableBodyEmpty() { return ( - - -
    - -

    There are no submissions yet

    -
    -
    -
    + s.circuit} + getInstanceUrl={(inst) => getCircuitInstanceUrl('observable-estimations', inst)} + getQubits={(_s, inst) => inst.qubits} + getGates={(_s, inst) => inst.gates} + valueColumn={{ + header: ( + <> + Expectation value +
    + [upper, lower bound] + + ), + render: (s) => ( + <> +
    {s.observableValue}
    +
    + [{s.errorBoundHigh || 'N/A'}, {s.errorBoundLow || 'N/A'}] +
    + + ), + }} + chart={{ + getValue: (s) => s.observableValue, + yLabel: 'Expectation value', + yTooltipLabel: 'EV', + }} + /> ); } diff --git a/src/app/trackers/observable-estimations/page.tsx b/src/app/trackers/observable-estimations/page.tsx index 8b79c31..248efad 100644 --- a/src/app/trackers/observable-estimations/page.tsx +++ b/src/app/trackers/observable-estimations/page.tsx @@ -1,10 +1,14 @@ +import { OrganizedInto } from '@/components/OrganizedInto'; import { Button } from '@/components/ui/button'; import { GithubIcon } from '@/icons'; +import type { OESubmission } from '@/types/submissions'; import type { Metadata } from 'next'; import circuitModels from '../../../../data/observable-estimations/circuit-models.json' with { type: 'json' }; -import submissions from '../../../../data/observable-estimations/submissions.json' with { type: 'json' }; +import submissionsData from '../../../../data/observable-estimations/submissions.json' with { type: 'json' }; import { SubmissionsTable } from './SubmissionsTable'; +const submissions = submissionsData as OESubmission[]; + export const metadata: Metadata = { title: 'Observable estimations', description: @@ -15,15 +19,16 @@ export default async function TrackersOE() { return ( <>
    -
    -

    Observable estimations ๐Ÿ“Š

    -

    +
    +

    Observable estimations ๐Ÿ“Š

    +

    Submissions in this tracker report expectation values for observables alongside rigorous error bars for validation.

    + -
    - - -
    - - - - - - Date - - Name / Institutions - Method - Hamiltonian - Qubits - Gates - - Energy (Eh) -
    - [upper, lower bound] -
    - - Runtime -
    - (seconds) -
    - Compute resources -
    -
    - - {filteredSubmissions.length === 0 ? ( - - ) : ( - sortSubmissions(filteredSubmissions).map((submission, index) => { - const hamiltonianInstance = hamiltonianInstances.find( - (instance) => instance.id === submission.hamiltonian, - )!; - - return ( - - - - - - - {submission.name} - - -
    - By:{' '} - {submission.institutions} -
    -
    - {submission.method} - - - {submission.hamiltonian} - - - {submission.qubits} - {submission.gates} - -
    {submission.energy}
    -
    - [{submission.errorBoundHigh || 'N/A'}, {submission.errorBoundLow || 'N/A'}] -
    -
    - -
    - Q:{' '} - -
    -
    - C:{' '} - -
    -
    - -
    - Q: {submission.computeResourcesQuantum || '-'} -
    -
    - C:{' '} - {submission.computeResourcesClassical || '-'} -
    -
    -
    - ); - }) - )} -
    -
    -
    - ); -} - -function TableBodyEmpty() { return ( - - -
    - -

    There are no submissions yet

    -
    -
    -
    + s.hamiltonian} + getInstanceUrl={getHamiltonianUrl} + getQubits={(s) => s.qubits} + getGates={(s) => s.gates} + valueColumn={{ + header: ( + <> + Energy (Eh) +
    + [upper, lower bound] + + ), + render: (s) => ( + <> +
    {s.energy}
    +
    + [{s.errorBoundHigh || 'N/A'}, {s.errorBoundLow || 'N/A'}] +
    + + ), + }} + chart={{ + getValue: (s) => s.energy, + yLabel: 'Energy (Eh)', + yTooltipLabel: 'E', + }} + /> ); } diff --git a/src/app/trackers/variational-problems/page.tsx b/src/app/trackers/variational-problems/page.tsx index 66c78c2..b3fda54 100644 --- a/src/app/trackers/variational-problems/page.tsx +++ b/src/app/trackers/variational-problems/page.tsx @@ -1,10 +1,14 @@ +import { OrganizedInto } from '@/components/OrganizedInto'; import { Button } from '@/components/ui/button'; import { GithubIcon } from '@/icons'; +import type { VPSubmission } from '@/types/submissions'; import type { Metadata } from 'next'; import hamiltonians from '../../../../data/variational-problems/hamiltonians.json' with { type: 'json' }; -import submissions from '../../../../data/variational-problems/submissions.json' with { type: 'json' }; +import submissionsData from '../../../../data/variational-problems/submissions.json' with { type: 'json' }; import { SubmissionsTable } from './SubmissionsTable'; +const submissions = submissionsData as VPSubmission[]; + export const metadata: Metadata = { title: 'Variational problems', description: @@ -15,15 +19,16 @@ export default async function TrackersVP() { return ( <>
    -
    -

    Variational problems ๐ŸŒ€

    -

    +
    +

    Variational problems ๐ŸŒ€

    +

    Submissions must provide upper bounds on the ground-state energy. Verified entries include evidence that the algorithm respects the variational principle.

    + -
    - - + +
    + +
    + +
    +
    + + )} + + + + + Date + + Name / Institutions + Method + Qubits + Gates + {valueColumn.header} + + Runtime +
    + (seconds) +
    + Compute resources + Notes +
    +
    + + {filteredSubmissions.length === 0 ? ( + + ) : ( + sortSubmissions(filteredSubmissions).map((submission, index) => { + const instance = instances.find((inst) => inst.id === getInstanceId(submission))!; + + return ( + + + + + + + {submission.name} + + +
    + By:{' '} + {submission.institutions} +
    +
    + {submission.method} + {getQubits(submission, instance) ?? '-'} + {getGates(submission, instance) ?? '-'} + + {valueColumn.render(submission)} + + +
    + Q:{' '} + +
    +
    + C:{' '} + +
    +
    + +
    + Q:{' '} + {submission.computeResourcesQuantum || '-'} +
    +
    + C:{' '} + {submission.computeResourcesClassical || '-'} +
    +
    + + {submission.notes || '-'} + +
    + ); + }) + )} +
    +
    +
    +

    +
    + ); +} + +function TableBodyEmpty() { + return ( + + +
    + +

    There are no submissions yet

    +
    +
    +
    + ); +} diff --git a/src/components/ui/badge.tsx b/src/components/ui/badge.tsx new file mode 100644 index 0000000..6eb2a05 --- /dev/null +++ b/src/components/ui/badge.tsx @@ -0,0 +1,48 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" +import { Slot } from "radix-ui" + +import { cn } from "@/lib/utils" + +const badgeVariants = cva( + "inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground [a&]:hover:bg-primary/90", + secondary: + "bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90", + destructive: + "bg-destructive text-white focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/90", + outline: + "border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground", + ghost: "[a&]:hover:bg-accent [a&]:hover:text-accent-foreground", + link: "text-primary underline-offset-4 [a&]:hover:underline", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +function Badge({ + className, + variant = "default", + asChild = false, + ...props +}: React.ComponentProps<"span"> & + VariantProps & { asChild?: boolean }) { + const Comp = asChild ? Slot.Root : "span" + + return ( + + ) +} + +export { Badge, badgeVariants } diff --git a/src/components/ui/collapsible.tsx b/src/components/ui/collapsible.tsx new file mode 100644 index 0000000..2f7a4e7 --- /dev/null +++ b/src/components/ui/collapsible.tsx @@ -0,0 +1,33 @@ +"use client" + +import { Collapsible as CollapsiblePrimitive } from "radix-ui" + +function Collapsible({ + ...props +}: React.ComponentProps) { + return +} + +function CollapsibleTrigger({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function CollapsibleContent({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { Collapsible, CollapsibleTrigger, CollapsibleContent } diff --git a/src/components/ui/field.tsx b/src/components/ui/field.tsx new file mode 100644 index 0000000..aa64930 --- /dev/null +++ b/src/components/ui/field.tsx @@ -0,0 +1,248 @@ +"use client" + +import { useMemo } from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" +import { Label } from "@/components/ui/label" +import { Separator } from "@/components/ui/separator" + +function FieldSet({ className, ...props }: React.ComponentProps<"fieldset">) { + return ( +
    [data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3", + className + )} + {...props} + /> + ) +} + +function FieldLegend({ + className, + variant = "legend", + ...props +}: React.ComponentProps<"legend"> & { variant?: "legend" | "label" }) { + return ( + + ) +} + +function FieldGroup({ className, ...props }: React.ComponentProps<"div">) { + return ( +
    [data-slot=field-group]]:gap-4", + className + )} + {...props} + /> + ) +} + +const fieldVariants = cva( + "group/field flex w-full gap-3 data-[invalid=true]:text-destructive", + { + variants: { + orientation: { + vertical: ["flex-col [&>*]:w-full [&>.sr-only]:w-auto"], + horizontal: [ + "flex-row items-center", + "[&>[data-slot=field-label]]:flex-auto", + "has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px", + ], + responsive: [ + "flex-col @md/field-group:flex-row @md/field-group:items-center [&>*]:w-full @md/field-group:[&>*]:w-auto [&>.sr-only]:w-auto", + "@md/field-group:[&>[data-slot=field-label]]:flex-auto", + "@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px", + ], + }, + }, + defaultVariants: { + orientation: "vertical", + }, + } +) + +function Field({ + className, + orientation = "vertical", + ...props +}: React.ComponentProps<"div"> & VariantProps) { + return ( +
    + ) +} + +function FieldContent({ className, ...props }: React.ComponentProps<"div">) { + return ( +
    + ) +} + +function FieldLabel({ + className, + ...props +}: React.ComponentProps) { + return ( +