From ca8f8be1c4d13e6d1604fe7bfd3ff9db1d710f76 Mon Sep 17 00:00:00 2001 From: gsv Date: Tue, 17 Mar 2026 14:04:17 +0300 Subject: [PATCH 1/5] Added basic benchmarks. --- .gitignore | 8 +- QuadTree.Benchmark/BFS.fs | 25 + QuadTree.Benchmark/Main.fs | 12 + QuadTree.Benchmark/QuadTree.Benchmark.fsproj | 25 + QuadTree.Benchmark/README.md | 7 + QuadTree.Benchmark/SSSP.fs | 19 + QuadTree.Benchmark/Triangles.fs | 20 + QuadTree.Benchmark/Utils.fs | 38 + QuadTree.Benchmark/data/494_bus.mtx | 1094 +++++++++++++++ QuadTree.Benchmark/data/arc130.mtx | 1296 ++++++++++++++++++ QuadTree.sln | 14 + 11 files changed, 2557 insertions(+), 1 deletion(-) create mode 100644 QuadTree.Benchmark/BFS.fs create mode 100644 QuadTree.Benchmark/Main.fs create mode 100644 QuadTree.Benchmark/QuadTree.Benchmark.fsproj create mode 100644 QuadTree.Benchmark/README.md create mode 100644 QuadTree.Benchmark/SSSP.fs create mode 100644 QuadTree.Benchmark/Triangles.fs create mode 100644 QuadTree.Benchmark/Utils.fs create mode 100644 QuadTree.Benchmark/data/494_bus.mtx create mode 100644 QuadTree.Benchmark/data/arc130.mtx diff --git a/.gitignore b/.gitignore index 35063fc..dd2f4b6 100644 --- a/.gitignore +++ b/.gitignore @@ -51,4 +51,10 @@ CodeCoverage/ # NUnit *.VisualState.xml TestResult.xml -nunit-*.xml \ No newline at end of file +nunit-*.xml + +# Benchmarking results +BenchmarkDotNet.Artifacts/ + +# Matrices +*.mtx \ No newline at end of file diff --git a/QuadTree.Benchmark/BFS.fs b/QuadTree.Benchmark/BFS.fs new file mode 100644 index 0000000..b68adcd --- /dev/null +++ b/QuadTree.Benchmark/BFS.fs @@ -0,0 +1,25 @@ +namespace QuadTree.Benchmarks.BFS + +open BenchmarkDotNet.Attributes +open QuadTree.Benchmarks.Utils + +[)>] +type Benchmark() = + + let mutable matrix = Unchecked.defaultof> + + + [] + member val MatrixName = "" with get, set + + [] + member this.LoadMatrix() = + matrix <- readMtx (System.IO.Path.Combine(DIR_WITH_MATRICES, this.MatrixName)) false + + [] + member this.BFS() = + let startVertices = + Vector.CoordinateList((uint64 matrix.ncols) * 1UL, [ 0UL, 1UL ]) + |> Vector.fromCoordinateList + + Graph.BFS.bfs_level matrix startVertices diff --git a/QuadTree.Benchmark/Main.fs b/QuadTree.Benchmark/Main.fs new file mode 100644 index 0000000..61394af --- /dev/null +++ b/QuadTree.Benchmark/Main.fs @@ -0,0 +1,12 @@ +open BenchmarkDotNet.Running + +[] +let main argv = + let benchmarks = + BenchmarkSwitcher + [| typeof + typeof + typeof |] + + benchmarks.Run argv |> ignore + 0 diff --git a/QuadTree.Benchmark/QuadTree.Benchmark.fsproj b/QuadTree.Benchmark/QuadTree.Benchmark.fsproj new file mode 100644 index 0000000..4edb362 --- /dev/null +++ b/QuadTree.Benchmark/QuadTree.Benchmark.fsproj @@ -0,0 +1,25 @@ + + + + Exe + net10.0 + false + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/QuadTree.Benchmark/README.md b/QuadTree.Benchmark/README.md new file mode 100644 index 0000000..57d1e0b --- /dev/null +++ b/QuadTree.Benchmark/README.md @@ -0,0 +1,7 @@ +# Benchmarks + +1. Add ```*.mtx``` files to the ```data``` directory. Do not commit these files. Several small matrices are included for demo purposes only. +2. Configure ```MatrixName``` in the respective ```.fs``` files: list the matrices to be used for evaluation in the ```Params``` attribute. For example: ```[]``` in ```BFS.fs```. +3. Ensure the matrix reader is correctly configured. In ```LoadMatrix ()``` , you can pass a boolean flag to ```readMtx``` indicating whether the matrix should be treated as a directed or undirected graph. +4. Run evaluation: ```dotnet run -c Release -- --filter '*.SSSP.*'``` You can use ```--filter``` to specify particular benchmarks. Use ```--filter '*'``` to run all available benchmarks. +5. Raw benchmarking results are saved in ```BenchmarkDotNet.Artifacts/results/*.csv```. \ No newline at end of file diff --git a/QuadTree.Benchmark/SSSP.fs b/QuadTree.Benchmark/SSSP.fs new file mode 100644 index 0000000..b6b6572 --- /dev/null +++ b/QuadTree.Benchmark/SSSP.fs @@ -0,0 +1,19 @@ +namespace QuadTree.Benchmarks.SSSP + +open BenchmarkDotNet.Attributes +open QuadTree.Benchmarks.Utils + +[)>] +type Benchmark() = + let mutable matrix = Unchecked.defaultof> + + + [] + member val MatrixName = "" with get, set + + [] + member this.LoadMatrix() = + matrix <- readMtx (System.IO.Path.Combine(DIR_WITH_MATRICES, this.MatrixName)) true + + [] + member this.SSSP() = Graph.SSSP.sssp matrix 0UL diff --git a/QuadTree.Benchmark/Triangles.fs b/QuadTree.Benchmark/Triangles.fs new file mode 100644 index 0000000..7fa31e4 --- /dev/null +++ b/QuadTree.Benchmark/Triangles.fs @@ -0,0 +1,20 @@ +namespace QuadTree.Benchmarks.Triangles + +open BenchmarkDotNet.Attributes +open QuadTree.Benchmarks.Utils + +[)>] +type Benchmark() = + + let mutable matrix = Unchecked.defaultof> + + [] + member val MatrixName = "" with get, set + + [] + member this.LoadMatrix() = + matrix <- readMtx (System.IO.Path.Combine(DIR_WITH_MATRICES, this.MatrixName)) false + + [] + member this.TriangleCount() = + Graph.TriangleCount.triangle_count matrix diff --git a/QuadTree.Benchmark/Utils.fs b/QuadTree.Benchmark/Utils.fs new file mode 100644 index 0000000..2492830 --- /dev/null +++ b/QuadTree.Benchmark/Utils.fs @@ -0,0 +1,38 @@ +module QuadTree.Benchmarks.Utils + +open System.IO +open BenchmarkDotNet.Configs + +type MyConfig() as this = + inherit ManualConfig() + +let DIR_WITH_MATRICES = "../../../../../../../data/" + +let readMtx path directed = + let getCooList (linewords: seq) = + linewords + |> Seq.map (fun x -> ((uint64 x.[0]) - 1UL), ((uint64 x.[1]) - 1UL), double x.[2]) + |> Seq.collect (fun (i, j, v) -> + if not directed then + [ (i * 1UL, j * 1UL, v) + (j * 1UL, i * 1UL, v) ] + else + [ (i * 1UL, j * 1UL, v) ]) + |> List.ofSeq + + let lines = File.ReadLines(path) + let removedComments = lines |> Seq.skipWhile (fun s -> s.[0] = '%') + let linewords = removedComments |> Seq.map (fun s -> s.Split " ") + let first = Seq.head linewords + + let nrows, ncols, nnz = uint64 first.[0], uint64 first.[1], int first.[2] + + let tl = Seq.tail linewords + + let lst = getCooList tl + + if (directed && nnz <> lst.Length) || ((not directed) && nnz * 2 <> lst.Length) then + failwithf "Incorrect matrix reading. Path: %A expected nnz: %A actual nnz: %A" path (nnz * 2) lst.Length + + Matrix.CoordinateList(nrows * 1UL, nrows * 1UL, lst) + |> Matrix.fromCoordinateList diff --git a/QuadTree.Benchmark/data/494_bus.mtx b/QuadTree.Benchmark/data/494_bus.mtx new file mode 100644 index 0000000..54d1d0d --- /dev/null +++ b/QuadTree.Benchmark/data/494_bus.mtx @@ -0,0 +1,1094 @@ +%%MatrixMarket matrix coordinate real symmetric +%------------------------------------------------------------------------------- +% UF Sparse Matrix Collection, Tim Davis +% http://www.cise.ufl.edu/research/sparse/matrices/HB/494_bus +% name: HB/494_bus +% [S ADMITTANCE MATRIX 494 BUS POWER SYSTEM, D.J.TYLAVSKY, JULY 1985.] +% id: 2 +% date: 1985 +% author: D. Tylavsky +% ed: I. Duff, R. Grimes, J. Lewis +% fields: title A name id date author ed kind +% kind: power network problem +%------------------------------------------------------------------------------- +494 494 1080 +1 1 2220.874 +16 1 -9.960159 +46 1 -8.196721 +267 1 -4.051864 +2 2 5.41067 +4 2 -5.41067 +3 3 13.57086 +52 3 -5.665723 +186 3 -7.905138 +4 4 618.3968 +8 4 -91.99632 +120 4 -100 +158 4 -294.1176 +429 4 -53.50455 +432 4 -73.36757 +5 5 8 +115 5 -8 +6 6 5.251112 +150 6 -1.526718 +433 6 -3.724395 +7 7 12.50981 +18 7 -.5 +165 7 -2.619172 +367 7 -3.603604 +426 7 -5.787037 +8 8 91.99632 +9 9 10.2145 +422 9 -10.2145 +10 10 277.3766 +205 10 -127.2265 +277 10 -150.1501 +11 11 79.80034 +412 11 -50.30181 +436 11 -29.49853 +12 12 13.01557 +13 12 -1.333333 +14 12 -2.158429 +16 12 -9.523809 +13 13 1.333333 +14 14 2.158429 +15 15 7.012623 +16 15 -7.012623 +16 16 60.12576 +17 16 -21.78649 +19 16 -7.037297 +57 16 -4.805382 +17 17 100.1224 +20 17 -17.60563 +21 17 -17.60563 +281 17 -14.30615 +334 17 -28.81845 +18 18 .5 +19 19 7.037297 +20 20 17.60563 +21 21 17.60563 +22 22 105.8066 +23 22 -37.31343 +140 22 -68.49315 +23 23 238.1596 +140 23 -81.96722 +155 23 -108.6956 +197 23 -10.1833 +24 24 7.806402 +25 24 -7.806402 +25 25 25.04799 +157 25 -4.741584 +170 25 -12.5 +26 26 72.58436 +99 26 -42.37288 +425 26 -30.21148 +27 27 423.7288 +28 27 -423.7288 +28 28 1022.734 +85 28 -3.767472 +173 28 -595.2381 +29 29 7.613696 +307 29 -4.387889 +316 29 -3.225806 +30 30 5.428882 +31 30 -5.428882 +31 31 28.91268 +182 31 -17.09402 +186 31 -6.389777 +32 32 16.37657 +376 32 -5 +444 32 -11.37656 +33 33 106.1647 +34 33 -62.1118 +239 33 -44.05286 +34 34 62.1118 +35 35 13.60544 +222 35 -13.60544 +36 36 1122.904 +325 36 -1111.111 +419 36 -11.79245 +37 37 208.5616 +147 37 -8.561644 +262 37 -200 +38 38 19.28696 +39 38 -11.04972 +398 38 -8.237232 +39 39 50.42981 +40 39 -22.57336 +281 39 -16.80672 +40 40 107.3191 +417 40 -84.74576 +41 41 1125.308 +47 41 -11.65501 +328 41 -1111.111 +413 41 -2.541942 +42 42 40.63024 +172 42 -34.8432 +328 42 -5.787037 +43 43 32.25806 +175 43 -32.25806 +44 44 50.45194 +102 44 -11.99041 +286 44 -38.46154 +45 45 21.89011 +174 45 -6.293266 +203 45 -4.997501 +264 45 -5.336179 +285 45 -5.263158 +46 46 14.95348 +253 46 -6.756757 +47 47 29.27953 +153 47 -3.419973 +285 47 -14.20455 +48 48 1682.986 +205 48 -114.0251 +271 48 -1333.333 +283 48 -180.1802 +306 48 -55.44774 +49 49 65.39337 +50 49 -47.61905 +114 49 -6.009615 +455 49 -11.76471 +50 50 168.4125 +238 50 -111.1111 +331 50 -5.076142 +442 50 -4.606173 +51 51 39.44635 +82 51 -24.27184 +409 51 -15.17451 +52 52 10.485 +397 52 -4.819277 +53 53 89.16084 +271 53 -37.87879 +310 53 -51.28205 +54 54 14.70295 +162 54 -6.896552 +406 54 -7.806402 +55 55 40.84595 +269 55 -21.97802 +363 55 -18.86793 +56 56 20.84468 +124 56 -9.633911 +224 56 -11.21076 +57 57 19.21461 +84 57 -14.40922 +58 58 8.290816 +59 58 -6.25 +60 58 -2.040816 +59 59 63.99854 +347 59 -13.88889 +377 59 -43.85965 +60 60 2.040816 +61 61 25.70627 +332 61 -18.18182 +418 61 -7.524455 +62 62 8.084074 +438 62 -8.084074 +63 63 17.00138 +64 63 -.6702413 +89 63 -3.34113 +190 63 -9.523809 +394 63 -3.466204 +64 64 .6702413 +65 65 68.63511 +66 65 -56.17978 +428 65 -5.643341 +436 65 -6.811989 +66 66 56.17978 +67 67 794.4359 +69 67 -9.727627 +70 67 -714.2858 +71 67 -70.42253 +68 68 63.74079 +70 68 -23.4192 +72 68 -15.07614 +73 68 -10.75269 +214 68 -14.49275 +69 69 9.727627 +70 70 898.1736 +71 70 -64.10257 +72 70 -8.467401 +142 70 -49.62779 +311 70 -15.01501 +320 70 -23.25581 +71 71 309.7514 +74 71 -22.52252 +75 71 -22.52252 +76 71 -27.02703 +91 71 -57.47126 +353 71 -45.68296 +72 72 44.65961 +212 72 -8.291874 +213 72 -8.4246 +440 72 -2.173913 +464 72 -2.225684 +73 73 10.75269 +74 74 22.52252 +75 75 22.52252 +76 76 27.02703 +77 77 43.25696 +78 77 -11.62791 +187 77 -25.64103 +264 77 -5.988024 +78 78 14.95486 +123 78 -1.324152 +265 78 -2.002804 +79 79 59.78359 +80 79 -18.99335 +214 79 -18.51852 +421 79 -22.27172 +80 80 76.98932 +147 80 -9.765625 +252 80 -3.332223 +355 80 -9.661836 +393 80 -33.33334 +437 80 -1.90295 +81 81 54.86513 +396 81 -34.24657 +457 81 -20.61856 +82 82 130.6548 +287 82 -106.383 +83 83 8.651169 +387 83 -4.88043 +423 83 -3.770739 +84 84 18.52954 +173 84 -4.120313 +85 85 318.4947 +88 85 -294.1176 +116 85 -14.02525 +275 85 -3.544842 +454 85 -3.039514 +86 86 11.6144 +88 86 -11.6144 +87 87 55.87302 +88 87 -40 +236 87 -15.87302 +88 88 345.7321 +89 89 8.151134 +326 89 -4.810005 +90 90 215.0901 +91 90 -125 +386 90 -90.0901 +91 91 295.4285 +93 91 -38.75969 +94 91 -38.91051 +95 91 -11.53403 +371 91 -23.75297 +92 92 79.78151 +95 92 -74.62687 +387 92 -5.154639 +93 93 38.75969 +94 94 38.91051 +95 95 94.05356 +96 95 -7.89266 +96 96 7.89266 +97 97 17.55133 +326 97 -10.79914 +422 97 -6.752194 +98 98 15.57329 +150 98 -5.892752 +156 98 -9.680542 +99 99 76.27119 +224 99 -33.8983 +100 100 1230.337 +158 100 -116.2791 +220 100 -769.2308 +391 100 -344.8276 +101 101 26.04167 +102 101 -26.04167 +102 102 79.66989 +178 102 -22.47191 +233 102 -10 +286 102 -9.165903 +103 103 104.405 +306 103 -55.6483 +429 103 -48.75671 +104 104 85.53579 +105 104 -4.716981 +191 104 -17.79359 +257 104 -18.38235 +263 104 -44.64286 +105 105 4.716981 +106 106 14.40922 +255 106 -14.40922 +107 107 41.13295 +246 107 -20.08032 +334 107 -21.05263 +108 108 91.69453 +191 108 -72.46377 +380 108 -19.23077 +109 109 9.784736 +112 109 -9.784736 +110 110 1.029866 +112 110 -1.029866 +111 111 2.164502 +112 111 -2.164502 +112 112 26.68996 +123 112 -3.49284 +179 112 -6.802721 +298 112 -3.4153 +113 113 140.1105 +263 113 -36.76471 +337 113 -37.31343 +378 113 -46.94836 +416 113 -19.08397 +114 114 14.01044 +115 114 -2.604167 +285 114 -5.396654 +115 115 13.98483 +354 115 -3.380663 +116 116 32.24018 +117 116 -18.21494 +117 117 36.76781 +119 117 -18.55288 +118 118 29.75633 +124 118 -19.08397 +346 118 -10.67236 +119 119 28.71548 +346 119 -10.1626 +120 120 176.9231 +429 120 -76.92307 +121 121 16.94915 +123 121 -16.94915 +122 122 33.94196 +123 122 -5.78369 +187 122 -12.90323 +264 122 -9.633911 +297 122 -5.621135 +123 123 38.08705 +179 123 -7.518797 +265 123 -3.018412 +124 124 28.71788 +125 125 3.294893 +126 125 -3.294893 +126 126 10.28301 +385 126 -6.988121 +127 127 39.10909 +129 127 -19.84127 +226 127 -19.26782 +128 128 56.25283 +225 128 -18.93939 +438 128 -37.31343 +129 129 19.84127 +130 130 15.97444 +141 130 -15.97444 +131 131 15.97444 +141 131 -15.97444 +132 132 18.38235 +141 132 -18.38235 +133 133 62.1118 +142 133 -62.1118 +134 134 54.34782 +143 134 -54.34782 +135 135 22.57336 +140 135 -22.57336 +136 136 405.7852 +141 136 -333.3333 +142 136 -59.1716 +144 136 -13.28021 +137 137 444.0341 +141 137 -370.3704 +142 137 -60.24096 +145 137 -13.42282 +138 138 125.4902 +199 138 -58.82352 +340 138 -66.66667 +139 139 13.56852 +147 139 -13.56852 +140 140 173.0337 +141 141 754.0349 +142 142 643.3154 +143 142 -188.6792 +473 142 -188.6792 +478 142 -12.18027 +487 142 -22.62444 +143 143 274.5828 +242 143 -31.55569 +144 144 13.28021 +145 145 13.42282 +146 146 86.17574 +183 146 -8.576329 +245 146 -6.878052 +339 146 -70.72136 +147 147 31.89579 +148 148 19.60784 +434 148 -9.803922 +443 148 -9.803922 +149 149 36.06135 +150 149 -20.60779 +217 149 -15.45356 +150 150 38.12827 +397 150 -10.10101 +151 151 52.86848 +153 151 -5.371435 +154 151 -2.452002 +155 151 -45.04505 +152 152 55.50949 +153 152 -5.443658 +154 152 -2.446783 +155 152 -47.61905 +153 153 29.86007 +203 153 -15.625 +154 154 4.898785 +155 155 218.7209 +241 155 -17.36111 +156 156 10009.68 +157 156 -10000 +157 157 10004.74 +158 158 410.3967 +159 159 95.74279 +160 159 -40.73468 +183 159 -10.02305 +248 159 -21.1685 +388 159 -16.46362 +392 159 -7.352941 +160 160 202.015 +369 160 -19.43635 +399 160 -141.844 +161 161 2.209945 +410 161 -2.209945 +162 162 8.668659 +355 162 -1.772107 +163 163 132.4126 +167 163 -22.52252 +246 163 -109.8901 +164 164 1076.971 +167 164 -999.9999 +231 164 -15.59819 +417 164 -27.35978 +470 164 -34.0136 +165 165 2.619172 +166 166 11.86609 +341 166 -8.071025 +423 166 -3.795066 +167 167 1022.522 +168 168 66.80027 +169 168 -66.80027 +169 169 77.0499 +344 169 -4.973145 +400 169 -5.276488 +170 170 179.1667 +325 170 -166.6667 +171 171 76.92307 +172 171 -76.92307 +172 172 111.7663 +173 173 618.791 +202 173 -19.43257 +174 174 41.11085 +175 174 -9.242133 +285 174 -25.57545 +175 175 41.5002 +176 176 3.67647 +464 176 -3.67647 +177 177 5.420054 +226 177 -5.420054 +178 178 36.94369 +340 178 -14.47178 +179 179 14.32152 +180 180 14.64129 +181 180 -14.64129 +181 181 89.82926 +233 181 -75.18797 +182 182 17.09402 +183 183 48.70115 +184 183 -3.319943 +185 183 -10.17605 +248 183 -16.60578 +184 184 3.319943 +185 185 10.17605 +186 186 14.29492 +187 187 38.54425 +188 188 4.097813 +198 188 -2.428363 +212 188 -1.669449 +189 189 .1703577 +190 189 -.1703577 +190 190 12.43916 +401 190 -2.74499 +191 191 209.3358 +192 191 -8 +195 191 -12.0149 +196 191 -17.8444 +374 191 -30.4878 +380 191 -14.16832 +416 191 -36.56307 +192 192 29.54783 +193 192 -10.20096 +194 192 -11.34687 +193 193 10.20096 +194 194 11.34687 +195 195 12.0149 +196 196 17.8444 +197 197 28.49832 +465 197 -18.31502 +198 198 10.61167 +201 198 -8.183307 +199 199 101.3767 +364 199 -42.55319 +200 200 4.805382 +280 200 -4.805382 +201 201 8.183307 +202 202 40.31376 +247 202 -20.88119 +203 203 124.7892 +297 203 -104.1667 +204 204 1214.533 +205 204 -1123.595 +206 204 -5.758379 +207 204 -85.17888 +205 205 1543.608 +208 205 -15.49871 +283 205 -93.28358 +357 205 -53.10675 +369 205 -16.87194 +206 206 5.758379 +207 207 149.5704 +278 207 -64.39149 +208 208 21.77736 +209 208 -6.278646 +209 209 6.278646 +210 210 8.795074 +211 210 -8.795074 +211 211 45.57015 +457 211 -20.87683 +465 211 -15.89825 +212 212 9.961323 +213 213 16.73715 +444 213 -8.312551 +214 214 33.01127 +215 215 10.29473 +390 215 -5.701254 +440 215 -4.593477 +216 216 243.9951 +217 216 -181.8182 +218 216 -11.41553 +219 216 -50.76142 +217 217 278.1384 +277 217 -46.66356 +286 217 -5.467469 +429 217 -28.73563 +218 218 11.41553 +219 219 77.57108 +235 219 -26.80965 +220 220 978.0083 +271 220 -59.52381 +449 220 -149.2537 +221 221 14.17527 +367 221 -10.5042 +464 221 -3.671072 +222 222 24.75213 +240 222 -3.99361 +436 222 -7.153076 +223 223 27.51414 +345 223 -14.70588 +398 223 -5.711022 +407 223 -7.097232 +224 224 74.144 +377 224 -24.39024 +454 224 -4.644682 +225 225 238.1674 +226 225 -200 +282 225 -8.116883 +377 225 -11.11111 +226 226 224.6879 +227 227 15.2439 +228 227 -15.2439 +228 228 19.75858 +420 228 -4.514673 +229 229 36.49635 +230 229 -36.49635 +230 230 95.45416 +315 230 -55.24862 +436 230 -3.709199 +231 231 100.6927 +386 231 -19.30502 +473 231 -65.78947 +232 232 329.6231 +233 232 -200 +234 232 -11.97605 +235 232 -117.647 +233 233 285.188 +234 234 11.97605 +235 235 144.4567 +236 236 165.7238 +301 236 -62.2084 +399 236 -87.64242 +237 237 82.18844 +300 237 -58.00464 +308 237 -24.1838 +238 238 151.4337 +294 238 -40.32258 +239 239 48.51516 +322 239 -4.462294 +240 240 8.230898 +422 240 -4.237288 +241 241 26.75078 +329 241 -9.389671 +242 242 329.2194 +258 242 -186.5672 +431 242 -38.58025 +480 242 -72.51631 +243 243 28.62424 +244 243 -27.17391 +309 243 -1.450326 +244 244 27.17391 +245 245 36.9804 +300 245 -30.10235 +246 246 129.9704 +247 247 99.00619 +333 247 -78.125 +248 248 45.48676 +249 248 -7.712479 +249 249 20007.71 +250 249 -10000 +251 249 -10000 +250 250 10000 +251 251 10000 +252 252 10.84537 +363 252 -7.513148 +253 253 14.75676 +256 253 -8 +254 254 1.459854 +256 254 -1.459854 +255 255 103.4288 +256 255 -40 +385 255 -49.01961 +256 256 49.45985 +257 257 141.7923 +266 257 -10.96732 +336 257 -22.27172 +402 257 -48.15409 +427 257 -42.01681 +258 258 545.1684 +259 258 -90.7441 +260 258 -90.009 +261 258 -89.12656 +431 258 -28.66151 +466 258 -60.06006 +259 259 90.7441 +260 260 90.009 +261 261 89.12656 +262 262 204.9044 +443 262 -4.904365 +263 263 172.7262 +336 263 -63.69427 +378 263 -27.62431 +264 264 26.7418 +265 264 -5.78369 +265 265 10.80491 +266 266 10.96732 +267 267 12.33001 +407 267 -8.278146 +268 268 6.802721 +269 268 -6.802721 +269 269 33.41466 +422 269 -4.63392 +270 270 146.1642 +372 270 -72.25433 +404 270 -73.90983 +271 271 1493.041 +272 271 -17.24138 +310 271 -26.88172 +377 271 -18.18182 +272 272 43.92595 +273 272 -13.31558 +274 272 -13.36898 +273 273 13.31558 +274 274 13.36898 +275 275 27.82097 +345 275 -9.541985 +375 275 -8.340283 +407 275 -6.393862 +276 276 12.32253 +315 276 -4.677269 +394 276 -7.64526 +277 277 278.5131 +432 277 -81.69935 +278 278 273.0466 +279 278 -86.20689 +431 278 -104.1667 +479 278 -18.28154 +279 279 86.20689 +280 280 15.75828 +281 280 -10.9529 +281 281 42.06578 +282 282 8.116883 +283 283 273.4638 +284 284 39.02803 +285 284 -3.49284 +287 284 -18.08318 +288 284 -17.45201 +285 285 151.9719 +289 285 -49.01961 +290 285 -49.01961 +286 286 65.02808 +289 286 -5.966587 +290 286 -5.966587 +287 287 124.4662 +288 288 17.45201 +289 289 59.06783 +291 289 -4.081633 +290 290 59.06783 +292 290 -4.081633 +291 291 4.081633 +292 292 4.081633 +293 293 10.79914 +294 293 -10.79914 +294 294 81.42474 +419 294 -30.30303 +295 295 39.0625 +447 295 -39.0625 +296 296 507.6858 +297 296 -5.681818 +298 296 -500 +299 296 -2.004008 +297 297 328.2356 +456 297 -212.766 +298 298 503.4153 +299 299 2.004008 +300 300 100.9094 +372 300 -12.80246 +301 301 5112.385 +302 301 -2000 +304 301 -2000 +306 301 -500 +310 301 -500 +323 301 -8.510638 +429 301 -41.66667 +302 302 2077.786 +303 302 -11.56069 +493 302 -66.22517 +303 303 11.56069 +304 304 2077.786 +305 304 -11.56069 +494 304 -66.22517 +305 305 11.56069 +306 306 1166.652 +310 306 -555.5555 +307 307 17.59793 +434 307 -13.21004 +308 308 57.28542 +373 308 -33.10162 +309 309 46.6992 +409 309 -45.24887 +310 310 2286.153 +317 310 -370.3704 +318 310 -370.3704 +319 310 -370.3704 +391 310 -41.32232 +311 311 238.1108 +317 311 -60.24096 +318 311 -60.24096 +319 311 -60.24096 +320 311 -42.37288 +312 312 13.42282 +317 312 -13.42282 +313 313 13.42282 +318 313 -13.42282 +314 314 13.42282 +319 314 -13.42282 +315 315 59.92588 +316 316 9.660813 +428 316 -6.435007 +317 317 444.0341 +318 318 444.0341 +319 319 444.0341 +320 320 69.47485 +321 320 -3.846154 +321 321 13.56433 +401 321 -9.718173 +322 322 16.51049 +323 322 -12.04819 +323 323 10029.63 +340 323 -9.074409 +435 323 -10000 +324 324 18.18182 +325 324 -18.18182 +325 325 1295.959 +326 326 15.60914 +327 327 3.10559 +328 327 -3.10559 +328 328 1120.004 +329 329 74.32474 +396 329 -64.93507 +330 330 4.587156 +331 330 -4.587156 +331 331 9.663299 +332 332 23.8961 +335 332 -5.714286 +333 333 92.80929 +392 333 -14.68429 +334 334 49.87108 +335 335 12.23319 +434 335 -6.518905 +336 336 85.96599 +337 337 81.9563 +343 337 -44.64286 +338 338 2.164502 +394 338 -2.164502 +339 339 74.33591 +342 339 -3.614545 +340 340 90.21286 +341 341 10.46911 +423 341 -2.398082 +342 342 3.614545 +343 343 63.83672 +416 343 -19.19386 +344 344 4.973145 +345 345 90.85852 +348 345 -3.620565 +350 345 -12.03369 +352 345 -29.06977 +353 345 -21.88663 +346 346 86.78369 +347 346 -24.21308 +349 346 -3.810976 +351 346 -12.19512 +353 346 -21.73913 +375 346 -3.990423 +347 347 38.10197 +348 348 3.620565 +349 349 3.810976 +350 350 12.03369 +351 351 12.19512 +352 352 49.9031 +395 352 -20.83333 +353 353 10089.31 +403 353 -10000 +354 354 9.430269 +420 354 -6.049607 +355 355 11.43394 +356 356 192.3077 +385 356 -192.3077 +357 357 141.2346 +358 357 -15.78532 +359 357 -7.358893 +361 357 -7.873395 +399 357 -57.11022 +358 358 32.04844 +360 358 -8.167265 +362 358 -8.095855 +359 359 7.358893 +360 360 8.167265 +361 361 7.873395 +362 362 8.095855 +363 363 26.38107 +364 364 42.55319 +365 365 21.23142 +438 365 -21.23142 +366 366 1.169727 +367 366 -1.169727 +367 367 30.37397 +376 367 -3.522367 +426 367 -11.57407 +368 368 262.9839 +369 368 -188.6792 +370 368 -13.69863 +371 368 -60.60606 +369 369 277.7794 +372 369 -26.30886 +373 369 -26.48305 +370 370 13.69863 +371 371 84.35903 +372 372 111.3657 +373 373 108.6043 +392 373 -49.01961 +374 374 123.0804 +408 374 -92.59259 +375 375 12.33071 +376 376 8.522367 +377 377 121.017 +395 377 -23.47418 +378 378 74.57267 +379 379 127.6412 +380 379 -35.21127 +381 379 -84.03362 +383 379 -8.396306 +380 380 78.4239 +384 380 -9.813543 +381 381 249.7548 +417 381 -153.8461 +430 381 -11.87507 +382 382 123.4568 +384 382 -123.4568 +383 383 8.396306 +384 384 133.2703 +385 385 248.3154 +386 386 109.3951 +387 387 10.03507 +388 388 18.11291 +389 388 -1.649294 +389 389 1.649294 +390 390 8.220146 +439 390 -2.518892 +391 391 386.1499 +392 392 209.3694 +404 392 -138.3126 +393 393 38.33334 +439 393 -5 +394 394 13.27597 +395 395 44.30751 +396 396 133.2931 +457 396 -10.58201 +465 396 -23.52941 +397 397 14.92029 +398 398 13.94825 +399 399 286.5966 +400 400 19.08864 +442 400 -13.81215 +401 401 12.46316 +402 402 85.60728 +403 402 -37.45319 +403 403 10037.45 +404 404 212.2224 +405 405 4.235493 +406 405 -4.235493 +406 406 12.04189 +407 407 21.76924 +408 408 117.284 +427 408 -24.69136 +409 409 60.42338 +410 410 12.37255 +418 410 -10.1626 +411 411 31.56566 +412 411 -31.56566 +412 412 83.28191 +437 412 -1.414447 +413 413 2.541942 +414 414 119.8663 +415 414 -8.333334 +416 414 -34.0136 +417 414 -77.51938 +415 415 8.333334 +416 416 108.8545 +417 417 343.4711 +418 418 17.68706 +419 419 42.09548 +420 420 19.04604 +424 420 -8.481764 +421 421 51.32293 +422 421 -6.779501 +435 421 -22.27172 +422 422 32.61741 +423 423 9.963887 +424 424 8.481764 +425 425 30.21148 +426 426 17.36111 +427 427 66.70817 +428 428 12.07835 +429 429 490.5505 +431 429 -240.9639 +430 430 91.87508 +431 430 -80 +431 431 492.3723 +432 432 155.0669 +433 433 3.724395 +434 434 39.50296 +437 434 -9.97009 +435 435 10032.62 +436 435 -10.34485 +436 436 57.51764 +437 437 13.28749 +438 438 66.62894 +439 439 7.518892 +440 440 6.76739 +441 441 7.757952 +442 441 -7.757952 +442 442 26.17628 +443 443 14.70829 +444 444 19.68912 +445 445 69.85807 +446 445 -27.24796 +447 445 -26.45503 +449 445 -16.15509 +446 446 83.55183 +450 446 -39.0625 +455 446 -17.24138 +447 447 82.7589 +455 447 -17.24138 +448 448 10000 +450 448 -10000 +449 449 185.1032 +451 449 -6.622517 +452 449 -6.535948 +453 449 -6.535948 +450 450 10039.06 +451 451 6.622517 +452 452 6.535948 +453 453 6.535948 +454 454 73.47367 +455 454 -65.78947 +455 455 112.0369 +456 456 10219.71 +457 456 -6.944445 +458 456 -10000 +457 457 80.4968 +459 457 -9.259259 +460 457 -2.272727 +461 457 -2.272727 +462 457 -3.780719 +463 457 -3.889537 +458 458 10000 +459 459 9.259259 +460 460 2.272727 +461 461 2.272727 +462 462 3.780719 +463 463 3.889537 +464 464 9.573227 +465 465 57.74268 +466 466 6796.34 +467 466 -69.61365 +480 466 -6666.667 +467 467 313.5161 +481 467 -243.9024 +468 468 78.33649 +472 468 -68.02721 +478 468 -10.30928 +469 469 56.02891 +473 469 -11.97605 +478 469 -44.05286 +470 470 69.98483 +471 470 -35.97123 +471 471 60.12582 +472 471 -24.15459 +472 472 92.18179 +473 473 418.9939 +474 473 -33.8983 +475 473 -29.76191 +476 473 -44.44444 +477 473 -44.44444 +474 474 33.8983 +475 475 29.76191 +476 476 44.44444 +477 477 44.44444 +478 478 66.54241 +479 479 18.28154 +480 480 6841.905 +481 480 -32.05128 +483 480 -70.67138 +481 481 662.705 +482 481 -265.6042 +483 481 -32.25806 +486 481 -88.88889 +482 482 318.8808 +486 482 -53.2765 +483 483 204.9703 +484 483 -51.02041 +485 483 -51.02041 +484 484 51.02041 +485 485 51.02041 +486 486 142.1654 +487 487 22.62444 +488 488 162.3038 +490 488 -72.16785 +493 488 -45.41326 +494 488 -44.72272 +489 489 64.79975 +490 489 -44.05286 +491 489 -20.74689 +490 490 170.2748 +492 490 -54.05405 +491 491 20.74689 +492 492 54.05405 +493 493 111.6384 +494 494 110.9479 diff --git a/QuadTree.Benchmark/data/arc130.mtx b/QuadTree.Benchmark/data/arc130.mtx new file mode 100644 index 0000000..ee6fddd --- /dev/null +++ b/QuadTree.Benchmark/data/arc130.mtx @@ -0,0 +1,1296 @@ +%%MatrixMarket matrix coordinate real general +%------------------------------------------------------------------------------- +% UF Sparse Matrix Collection, Tim Davis +% http://www.cise.ufl.edu/research/sparse/matrices/HB/arc130 +% name: HB/arc130 +% [UNSYMMETRIC MATRIX FROM LASER PROBLEM. A.R.CURTIS, OCT 1974] +% id: 6 +% date: 1974 +% author: A. Curtis +% ed: A. Curtis, I. Duff, J. Reid +% fields: title A Zeros name id date author ed kind +% kind: materials problem +%------------------------------------------------------------------------------- +130 130 1282 +1 1 1.000000408955316 +2 1 -6.310289677458059e-7 +3 1 2.096665525641583e-7 +4 1 6.421004172807443e-8 +5 1 3.956404981408923e-9 +6 1 6.194351698241007e-10 +7 1 5.637896549615107e-8 +8 1 -5.637896549615107e-8 +9 1 -5.637896549615107e-8 +10 1 0 +11 1 0 +12 1 1.127578798332252e-6 +13 1 -5.637896549615107e-8 +14 1 -5.074106752545049e-7 +15 1 6.088927761993546e-7 +17 1 -5.637896549615107e-8 +18 1 -2.043932134654369e-9 +19 1 0 +20 1 .01878335326910019 +26 1 3.624941025245822e-16 +31 1 6.846256028048394e-16 +36 1 8.68257475330125e-16 +41 1 8.829475677343563e-16 +46 1 7.596007241310538e-16 +51 1 5.641173783660228e-16 +56 1 3.637011244744196e-16 +61 1 2.010050211992837e-16 +66 1 9.149849743076945e-17 +71 1 3.147608842710462e-17 +76 1 7.345189304361637e-18 +81 1 1.130718674232424e-18 +86 1 1.234088333455879e-19 +91 1 1.030108373210172e-20 +96 1 6.833493328871848e-22 +101 1 3.65932126657364e-23 +106 1 1.588981222142243e-24 +111 1 5.60826855501037e-26 +116 1 1.6107018199957e-27 +121 1 3.764561095514044e-29 +126 1 7.172442880553562e-31 +1 2 -.0001426527305739 +2 2 1.000147870872752 +3 2 -5.613608664134517e-6 +4 2 4.753307507598947e-7 +5 2 -5.725276253087941e-9 +6 2 -1.77376264787199e-8 +7 2 5.637896549615107e-8 +8 2 -5.637896549615107e-8 +9 2 -5.637896549615107e-8 +10 2 0 +11 2 8.516936613432724e-15 +12 2 1.127578798332252e-6 +13 2 -5.637896549615107e-8 +14 2 -5.074106752545049e-7 +15 2 6.088927761993546e-7 +17 2 -5.637896549615107e-8 +18 2 1.437741730114794e-7 +19 2 0 +20 2 -1.321256637573242 +26 2 -1.114484955602561e-14 +27 2 1.733296665917816e-12 +31 2 -2.074384704265318e-14 +32 2 2.677037702625285e-9 +36 2 -2.624046067782083e-14 +37 2 6.328248787212942e-7 +41 2 -2.67359139655924e-14 +42 2 3.107915290456731e-6 +46 2 -2.314677109379638e-14 +47 2 3.159706807309703e-7 +51 2 -1.742469422872858e-14 +52 2 2.779751095971505e-9 +56 2 -1.155559277280817e-14 +57 2 1.449127970398756e-11 +61 2 -6.78651267669618e-15 +62 2 1.984121417511475e-13 +66 2 -3.535647235462748e-15 +67 2 1.024009300748183e-14 +71 2 -1.631147863670078e-15 +72 2 1.059880891954518e-15 +76 2 -6.68199939891684e-16 +77 2 1.302165587382207e-16 +81 2 -2.461975376577509e-16 +82 2 1.523580661538971e-17 +86 2 -8.232749965727973e-17 +87 2 1.550961994175702e-18 +91 2 -2.496269623029467e-17 +92 2 1.321670733700876e-19 +96 2 -6.841421422065817e-18 +97 2 9.270355296549564e-21 +101 2 -1.693073277773537e-18 +102 2 5.325857707782005e-22 +106 2 -3.781317617533563e-19 +107 2 2.498061216103135e-23 +111 2 -7.624842319058412e-20 +112 2 9.576834498255501e-25 +116 2 -1.388670166119169e-20 +117 2 3.002645577625813e-26 +121 2 -2.284276225230092e-21 +122 2 7.695759909088791e-28 +126 2 -3.396618468231539e-22 +127 2 1.614779109984465e-29 +1 3 3.172130163875408e-6 +2 3 -.0004288838244974613 +3 3 1.050343558192253 +4 3 -.04991767182946205 +5 3 -9.393625077791512e-8 +6 3 -2.995422221374611e-8 +7 3 5.637896549615107e-8 +8 3 -5.637896549615107e-8 +9 3 -5.637896549615107e-8 +10 3 0 +11 3 -1.14399592229808e-15 +12 3 1.127578798332252e-6 +13 3 -5.637896549615107e-8 +14 3 -5.074106752545049e-7 +15 3 6.088927761993546e-7 +17 3 -5.637896549615107e-8 +18 3 -1.14480917545734e-6 +19 3 0 +20 3 10.52057933807373 +27 3 -1.88902452707973e-12 +28 3 2.473666237123862e-12 +32 3 -3.191809705427318e-9 +33 3 4.265404740522172e-8 +37 3 -8.364604013877397e-7 +38 3 .0003888504579663277 +42 3 -4.564798473438714e-6 +43 3 .0381682813167572 +47 3 -5.168877237338165e-7 +48 3 .01131986826658249 +52 3 -5.076469022924357e-9 +53 3 3.749688039533794e-5 +57 3 -2.963390643984098e-11 +58 3 1.865166154857434e-8 +62 3 -4.676906106317047e-13 +63 3 1.63597052571518e-11 +67 3 -3.327468305774385e-14 +68 3 1.099596759132626e-13 +72 3 -6.362139005726408e-15 +73 3 5.00653392441347e-15 +77 3 -1.834683316389945e-15 +78 3 4.881095121188686e-16 +82 3 -5.997685715994827e-16 +83 3 5.444201036336569e-17 +87 3 -1.954991746932328e-16 +88 3 5.64556475613668e-18 +92 3 -5.996761655988932e-17 +93 3 5.045512223359075e-19 +97 3 -1.687755499051556e-17 +98 3 3.764540326759457e-20 +102 3 -4.318695916068944e-18 +103 3 2.317379201706768e-21 +107 3 -1.000719796344203e-18 +108 3 1.172540887632911e-22 +112 3 -2.09944901814494e-19 +113 3 4.871730427049952e-24 +117 3 -3.988113352283189e-20 +118 3 1.662654519802644e-25 +122 3 -6.857663320188449e-21 +123 3 4.66292291439438e-27 +127 3 -1.068200969380841e-21 +128 3 1.074941789167073e-28 +1 4 9.677614798420109e-7 +2 4 -1.245291059603915e-6 +3 4 -.07536840438842773 +4 4 1.075373947620392 +5 4 -5.109401172376238e-6 +6 4 -1.163272145277006e-7 +7 4 5.637896549615107e-8 +8 4 -5.637896549615107e-8 +9 4 -5.637896549615107e-8 +10 4 0 +11 4 2.726002957774963e-15 +12 4 1.127578798332252e-6 +13 4 -5.637896549615107e-8 +14 4 -5.074106752545049e-7 +15 4 6.088927761993546e-7 +17 4 -5.637896549615107e-8 +18 4 3.242677848902531e-6 +19 4 0 +20 4 -29.79957580566406 +28 4 -2.690164063734457e-12 +29 4 1.124147229838481e-14 +33 4 -5.062177166337278e-8 +34 4 2.393615836679235e-14 +38 4 -.0005103659350425005 +39 4 3.258340252883067e-14 +43 4 -.05552677810192108 +44 4 3.506025222747844e-14 +48 4 -.01829450204968452 +49 4 3.150090797476683e-14 +53 4 -6.747333100065589e-5 +54 4 2.389203133837219e-14 +58 4 -3.745336840665914e-8 +59 4 1.510693087010233e-14 +63 4 -3.676196846935653e-11 +64 4 7.677818342037568e-15 +68 4 -2.876134660295682e-13 +69 4 2.945648553635133e-15 +73 4 -1.940820822197292e-14 +74 4 8.09583079557346e-16 +78 4 -3.85526368316437e-15 +79 4 1.612334891334645e-16 +83 4 -1.105984048240622e-15 +84 4 2.450439846627089e-17 +88 4 -3.484403436219757e-16 +89 4 2.962714454342404e-18 +93 4 -1.076261635651689e-16 +94 4 2.911501014282256e-19 +98 4 -3.103228286741277e-17 +99 4 2.346465182333734e-20 +103 4 -8.193536641609284e-18 +104 4 1.555002212474875e-21 +108 4 -1.967818836691188e-18 +109 4 8.48367901854326e-23 +113 4 -4.290093147860203e-19 +114 4 3.815631846132649e-24 +118 4 -8.487715775043102e-20 +119 4 1.415514258958216e-25 +123 4 -1.524028579840669e-20 +124 4 4.334547236644489e-27 +128 4 -2.483863638318878e-21 +129 4 1.096037222071676e-28 +1 5 2.067174023068219e-7 +2 5 -3.464035103206697e-7 +3 5 8.871005547916866e-7 +4 5 -.001004851656034589 +5 5 1.001007388811558 +6 5 -3.227999513910618e-6 +7 5 5.637894062715532e-8 +8 5 -5.637894062715532e-8 +9 5 -5.637894062715532e-8 +10 5 0 +11 5 0 +12 5 1.127578798332252e-6 +13 5 -5.637894062715532e-8 +14 5 -5.074106752545049e-7 +15 5 6.088923782954225e-7 +17 5 -5.637894062715532e-8 +18 5 9.1486214159886e-7 +19 5 0 +20 5 -8.407408714294434 +29 5 -4.977862197962091e-14 +30 5 8.301786856698343e-15 +34 5 -9.878084678352494e-14 +35 5 1.892736794660739e-14 +39 5 -1.32599823048779e-13 +40 5 2.600578511758635e-14 +44 5 -1.439277841873421e-13 +45 5 2.763043835613335e-14 +49 5 -1.330588200385008e-13 +50 5 2.406133628386938e-14 +54 5 -1.065598347407826e-13 +55 5 1.723105233259088e-14 +59 5 -7.396622377087159e-14 +60 5 9.875153944354995e-15 +64 5 -4.402636024844475e-14 +65 5 4.349897043042991e-15 +69 5 -2.220723876057012e-14 +70 5 1.437176048199422e-15 +74 5 -9.662081112407281e-15 +75 5 3.596410837999929e-16 +79 5 -3.830770878461565e-15 +80 5 7.011335073232172e-17 +84 5 -1.43666444029928e-15 +85 5 1.093826418912559e-17 +89 5 -5.079756111055342e-16 +90 5 1.388715480107101e-18 +94 5 -1.665747200801725e-16 +95 5 1.447536603658476e-19 +99 5 -5.007023509456983e-17 +100 5 1.243767186728059e-20 +104 5 -1.371575222480206e-17 +105 5 8.829125121689631e-22 +109 5 -3.416913538430984e-18 +110 5 5.18144163606079e-23 +114 5 -7.7400670274234e-19 +115 5 2.517640901542902e-24 +119 5 -1.594267587579844e-19 +120 5 1.013315498583546e-25 +124 5 -2.986853872288083e-20 +125 5 3.380210430601726e-27 +129 5 -5.090734445941291e-21 +130 5 9.355154149199958e-29 +1 6 1.471342443437607e-7 +2 6 -1.266278104594676e-7 +3 6 4.008210794381739e-7 +4 6 1.813951712392736e-6 +5 6 -.001041745999827981 +6 6 1.001039566937834 +7 6 5.637089728338651e-8 +8 6 -5.637089728338651e-8 +9 6 -5.637896549615107e-8 +10 6 -8.085981537120368e-12 +11 6 -4.542686146409396e-14 +12 6 1.127425093727652e-6 +13 6 -5.637896549615107e-8 +14 6 -5.073379156783631e-7 +15 6 6.087796009524027e-7 +17 6 -5.637089728338651e-8 +18 6 9.095310815609992e-7 +19 6 0 +20 6 -8.358414649963379 +30 6 -5.387848167289801e-14 +35 6 -1.065863976940085e-13 +40 6 -1.420175283796399e-13 +45 6 -1.525375420592667e-13 +50 6 -1.390970129876157e-13 +55 6 -1.09454925591862e-13 +60 6 -7.446164995358884e-14 +65 6 -4.389770949628398e-14 +70 6 -2.282676882258729e-14 +75 6 -1.078032045684525e-14 +80 6 -4.709645488269049e-15 +85 6 -1.906120381095478e-15 +90 6 -7.101397174837966e-16 +95 6 -2.42128603137378e-16 +100 6 -7.53043127402309e-17 +105 6 -2.13379510814179e-17 +110 6 -5.505686860192738e-18 +115 6 -1.294189415607603e-18 +120 6 -2.771874994834836e-19 +125 6 -5.41063394626653e-20 +130 6 -9.630518136308248e-21 +1 7 -1.259340933756903e-5 +2 7 -.0001634575164644048 +3 7 -.000315771671012044 +4 7 -.0005238812882453203 +5 7 -.0001138667576014996 +6 7 -2.637367288116366e-5 +7 7 1.001156237442046 +8 7 -.001022412441670895 +9 7 -1.463538410462206e-7 +10 7 .001089178491383791 +11 7 6.691245653200895e-5 +12 7 .02203556895256042 +13 7 -1.463538410462206e-7 +14 7 -.009134795516729355 +15 7 .01585229113698006 +17 7 -.001022412441670895 +18 7 4.045813511766028e-6 +19 7 6.691245653200895e-5 +20 7 -37.34263610839844 +1 8 -4.186565638519824e-5 +2 8 -1.590017291164258e-7 +3 8 -1.589597218298877e-7 +4 8 -1.589597218298877e-7 +5 8 -1.589597218298877e-7 +6 8 -1.589597218298877e-7 +7 8 -4.075298784300685e-5 +8 8 1.000055276526837 +9 8 4.170673491898924e-5 +10 8 -6.308013325906359e-6 +11 8 7.261772225319874e-6 +12 8 -.0008087516762316227 +13 8 4.170673491898924e-5 +14 8 .0005047505255788565 +15 8 -.0004733889363706112 +17 8 5.527652683667839e-5 +18 8 4.606268078077846e-8 +19 8 7.261772225319874e-6 +20 8 -.4409304857254028 +1 9 -1.230297129950486e-6 +2 9 -1.23893777181916e-12 +3 9 -2.037324342022181e-18 +4 9 0 +5 9 0 +6 9 0 +7 9 -1.230298039445188e-6 +8 9 1.230298039445188e-6 +9 9 1.000001230298039 +12 9 -2.460596442688257e-5 +13 9 1.230298039445188e-6 +14 9 1.107268144551199e-5 +15 9 -1.328722373727942e-5 +17 9 1.230298039445188e-6 +18 9 -2.20047779997401e-9 +19 9 0 +20 9 .02022196725010872 +1 10 -7.543263791376376e-9 +2 10 -7.543263791376376e-7 +3 10 -1.5086525309016e-6 +4 10 -2.539273737056646e-6 +5 10 -5.087317163088301e-7 +6 10 -7.543263791376376e-8 +7 10 5.393962055677548e-6 +8 10 -5.393962055677548e-6 +10 10 1.000005393962056 +11 10 0 +12 10 .0001024852826958522 +14 10 -4.854565486311913e-5 +15 10 7.551546150352806e-5 +17 10 -5.393962055677548e-6 +18 10 1.420877993041358e-8 +19 10 0 +20 10 -.130575954914093 +1 11 -4.203418058068564e-9 +2 11 -4.203418058068564e-9 +3 11 -4.203418058068564e-9 +4 11 -4.203418058068564e-9 +5 11 -4.203418058068564e-9 +6 11 -4.203418058068564e-9 +7 11 2.522051900655242e-8 +8 11 2.522051900655242e-8 +11 11 1.000000025220519 +12 11 5.044103090767749e-7 +14 11 2.522051545383874e-7 +15 11 2.269846390845487e-7 +17 11 2.522051900655242e-8 +18 11 2.554505496021875e-10 +19 11 2.522051900655242e-8 +20 11 -.002408750355243683 +7 12 2.477248961518796e-11 +9 12 -1.238624654231746e-11 +11 12 1.238624654231746e-11 +12 12 1.00000000049545 +13 12 -1.238624654231746e-11 +14 12 1.238625261384962e-11 +15 12 2.452476000058823e-10 +18 12 1.574671382870152e-13 +19 12 1.238624654231746e-11 +20 12 -1.477152181905694e-6 +7 13 2.184934178028897e-11 +9 13 -1.092467522695317e-11 +11 13 1.092467522695317e-11 +12 13 4.369868911169306e-10 +13 13 .9999999999890753 +14 13 1.092467522695317e-11 +15 13 2.163085821571542e-10 +18 13 1.3888602724485e-13 +19 13 1.092467522695317e-11 +20 13 -1.302848431805614e-6 +8 14 1.345329678770213e-7 +10 14 -6.726645551680122e-8 +11 14 6.726645551680122e-8 +12 14 6.726645551680122e-8 +14 14 1.000001278062882 +15 14 -3.363325618011004e-7 +17 14 1.345329678770213e-7 +18 14 4.66852556613162e-10 +19 14 6.726645551680122e-8 +20 14 -.00445353239774704 +1 15 -1.054020426494162e-9 +2 15 -4.27747792741684e-9 +3 15 -1.088280576766465e-9 +4 15 4.067786107952998e-9 +5 15 1.694434592636185e-9 +6 15 6.575595623559138e-10 +15 15 1 +18 15 1.521864578801768e-11 +20 15 -.0001398565364070237 +1 16 -5.132014604947166e-12 +2 16 -2.08270067858507e-11 +3 16 -5.298826481758834e-12 +4 16 1.980600405904198e-11 +5 16 8.250184389824167e-12 +6 16 3.201650750073171e-12 +16 16 1 +18 16 7.409947221787005e-14 +20 16 -6.809601131863019e-7 +1 17 -6.473783287219703e-8 +2 17 -4.636610242414463e-7 +3 17 -5.365741913010424e-7 +4 17 7.723452881691628e-7 +5 17 2.271788730467961e-7 +6 17 6.54492851026589e-8 +11 17 0 +17 17 1 +18 17 1.931242499253472e-9 +20 17 -.01774775609374046 +1 18 -.004218190908432007 +2 18 -.000307043083012104 +3 18 -.002048411639407277 +4 18 .0008487612940371037 +5 18 -.0001524399995105341 +6 18 -4.570157034322619e-5 +7 18 -.002428856445476413 +8 18 .004073116928339005 +9 18 .00417594239115715 +10 18 .0009249553550034761 +11 18 .0008221305906772614 +12 18 -.04950208216905594 +13 18 .00417594239115715 +14 18 .0374801829457283 +15 18 -.02475163340568542 +17 18 .004073116928339005 +18 18 1.000018495076802 +19 18 .0008221305906772614 +20 18 -101.4492340087891 +26 18 -2.471087598205393e-17 +27 18 -1.873189645930362e-13 +28 18 4.888664885231708e-14 +29 18 -3.043990772877252e-16 +30 18 -1.286887362945006e-16 +31 18 -2.790847829749812e-17 +32 18 -3.319902130982655e-10 +33 18 3.139515314387609e-10 +34 18 -4.006040206456845e-16 +35 18 -1.686210855062899e-16 +36 18 -3.125035414666135e-17 +37 18 -9.123220934270648e-8 +38 18 -3.244133949920069e-6 +39 18 -4.81240286674873e-16 +40 18 -1.976705171837396e-16 +41 18 -3.494794412900199e-17 +42 18 -5.191453169572924e-7 +43 18 -.0009969023521989584 +44 18 -5.606729188860132e-16 +45 18 -2.226699269983418e-16 +46 18 -3.903872945243604e-17 +47 18 -6.099668325987295e-8 +48 18 -.0005238358862698078 +49 18 -6.322302622700565e-16 +50 18 -2.419947719317118e-16 +51 18 -4.343730537307861e-17 +52 18 -6.18966433663104e-10 +53 18 -2.593829776742496e-6 +54 18 -6.73145553512465e-16 +55 18 -2.488745852875481e-16 +56 18 -4.778463580041231e-17 +57 18 -3.720013880270656e-12 +58 18 -1.776293334643242e-9 +59 18 -6.517935469780786e-16 +60 18 -2.327123496209888e-16 +61 18 -5.103115426856043e-17 +62 18 -6.057437537676513e-14 +63 18 -2.046598134020083e-12 +64 18 -5.521360973271107e-16 +65 18 -1.877159742293702e-16 +66 18 -5.069799238760367e-17 +67 18 -4.54819762039059e-15 +68 18 -1.881829720805535e-14 +69 18 -3.943213655176626e-16 +70 18 -1.259239545802135e-16 +71 18 -4.296864469034077e-17 +72 18 -9.248773926893387e-16 +73 18 -1.645467590918122e-15 +74 18 -2.305333573641771e-16 +75 18 -7.042313979789018e-17 +76 18 -2.772176047218775e-17 +77 18 -2.775064164871116e-16 +78 18 -4.056637719561081e-16 +79 18 -1.113570922349179e-16 +80 18 -3.375268799619757e-17 +81 18 -1.308748704287211e-17 +82 18 -9.240036252646867e-17 +83 18 -1.296943629262385e-16 +84 18 -4.625534428392427e-17 +85 18 -1.425923056676471e-17 +86 18 -4.840895863954283e-18 +87 18 -3.032876906515887e-17 +88 18 -4.2650901456002e-17 +89 18 -1.706723743114132e-17 +90 18 -5.404603734977533e-18 +91 18 -1.517272582187642e-18 +92 18 -9.32421726553353e-18 +93 18 -1.33668548870527e-17 +94 18 -5.681662918068494e-18 +95 18 -1.854034353170231e-18 +96 18 -4.197349140592874e-19 +97 18 -2.625968399791454e-18 +98 18 -3.870900037102137e-18 +99 18 -1.715837288230996e-18 +100 18 -5.77740628223694e-19 +101 18 -1.041151557505182e-19 +102 18 -6.720563303536613e-19 +103 18 -1.023229862353608e-18 +104 18 -4.70628390318743e-19 +105 18 -1.6379711582562e-19 +106 18 -2.326514296817294e-20 +107 18 -1.557337075156648e-19 +108 18 -2.458146584996669e-19 +109 18 -1.172823201387139e-19 +110 18 -4.226950445047938e-20 +111 18 -4.691781359097844e-21 +112 18 -3.267222217268957e-20 +113 18 -5.359393661610564e-20 +114 18 -2.656896049584655e-20 +115 18 -9.936381092496801e-21 +116 18 -8.545038260582033e-22 +117 18 -6.206423377690597e-21 +118 18 -1.060338916542145e-20 +119 18 -5.472649550870706e-21 +120 18 -2.128172137901634e-21 +121 18 -1.405610283842565e-22 +122 18 -1.06721122031294e-21 +123 18 -1.903915315123482e-21 +124 18 -1.025301274472632e-21 +125 18 -4.154147080474621e-22 +126 18 -2.090081288584553e-23 +127 18 -1.662368100185176e-22 +128 18 -3.103005701485727e-22 +129 18 -1.74750436721378e-22 +130 18 -7.394070257460893e-23 +18 19 2.863205506020705e-11 +19 19 1 +1 20 -4.014349741510159e-9 +2 20 -9.617298624142734e-11 +3 20 1.790963349845853e-10 +4 20 -6.729825585694016e-10 +5 20 -5.825459559183344e-11 +6 20 -4.065924680274335e-12 +7 20 -3.366472656196606e-9 +8 20 3.135385950869818e-9 +9 20 4.01659860926884e-9 +10 20 7.656726364047017e-10 +11 20 -1.155434775634845e-10 +12 20 -6.809511887695407e-8 +13 20 4.01659860926884e-9 +14 20 2.81029137738642e-8 +15 20 -3.36997594274635e-8 +17 20 3.135385950869818e-9 +18 20 -1.771422635313269e-13 +19 20 -1.155434775634845e-10 +20 20 .9999941390788081 +26 20 9.258888843571604e-24 +27 20 1.602456287903206e-20 +28 20 2.057477099391917e-22 +29 20 3.79006391756135e-23 +30 20 1.265028470551178e-23 +31 20 2.967497825759503e-23 +32 20 2.640151404010411e-17 +33 20 1.192485938020208e-16 +34 20 8.872690943367984e-23 +35 20 2.428638932088789e-23 +36 20 5.485064732149495e-23 +37 20 5.627280325742889e-15 +38 20 2.097305835946361e-12 +39 20 1.503074364226984e-22 +40 20 3.654340714362437e-23 +41 20 7.37233051309045e-23 +42 20 1.681930622879878e-14 +43 20 2.737321480594801e-10 +44 20 1.947877940148048e-22 +45 20 4.299390383295486e-23 +46 20 7.8542778256149e-23 +47 20 -4.953118332693719e-16 +48 20 8.360855063838102e-11 +49 20 1.958871505723208e-22 +50 20 3.781022940498793e-23 +51 20 6.825535047624489e-23 +52 20 -3.69681574128729e-17 +53 20 1.911188763671634e-13 +54 20 1.445337823900475e-22 +55 20 1.984496358497428e-23 +56 20 4.766340503378597e-23 +57 20 -4.550524242880046e-19 +58 20 -1.64086693146511e-17 +59 20 5.772616522788313e-23 +60 20 -4.80722527083003e-24 +61 20 2.362661130331001e-23 +62 20 -1.18988832516502e-20 +63 20 -1.973999840420913e-19 +64 20 -2.7385060200145e-23 +65 20 -2.428158042480967e-23 +66 20 2.509290808861137e-24 +67 20 -1.294584510672371e-21 +68 20 -3.717966827098453e-21 +69 20 -7.478883533280463e-23 +70 20 -2.996065950125539e-23 +71 20 -1.037705815595532e-23 +72 20 -3.566438890326746e-22 +73 20 -5.413638615218143e-22 +74 20 -7.47786621825709e-23 +75 20 -2.431505337074001e-23 +76 20 -1.238172726552106e-23 +77 20 -1.375019772551033e-22 +78 20 -1.876708297674201e-22 +79 20 -5.030145687504091e-23 +80 20 -1.532134485362388e-23 +81 20 -7.948924568162411e-24 +82 20 -5.671434067641046e-23 +83 20 -7.661519347879783e-23 +84 20 -2.663720744022099e-23 +85 20 -8.085988361583657e-24 +86 20 -3.645409862282249e-24 +87 20 -2.248603203033078e-23 +88 20 -3.072957800279242e-23 +89 20 -1.19897975019801e-23 +90 20 -3.714077048638117e-24 +91 20 -1.36428050417728e-24 +92 20 -8.197194872253568e-24 +93 20 -1.145321036994424e-23 +94 20 -4.7480827910438e-24 +95 20 -1.512755170592547e-24 +96 20 -4.417921329419716e-25 +97 20 -2.697872741419652e-24 +98 20 -3.879402572849811e-24 +99 20 -1.677462227854547e-24 +100 20 -5.512122187882033e-25 +101 20 -1.265862414857133e-25 +102 20 -7.973125637443234e-25 +103 20 -1.184497526155601e-24 +104 20 -5.315078538823665e-25 +105 20 -1.805181470815384e-25 +106 20 -3.233673662629892e-26 +107 20 -2.11210161105746e-25 +108 20 -3.253289983263135e-25 +109 20 -1.514428048749681e-25 +110 20 -5.326447996620163e-26 +111 20 -7.390221523433456e-27 +112 20 -5.021731366753499e-26 +113 20 -8.038901845796694e-26 +114 20 -3.888457796247278e-26 +115 20 -1.419193740413248e-26 +116 20 -1.513852580882299e-27 +117 20 -1.072950979457684e-26 +118 20 -1.788974446777135e-26 +119 20 -9.009346205447938e-27 +120 20 -3.41920974160359e-27 +121 20 -2.782304323808742e-28 +122 20 -2.06143047896155e-27 +123 20 -3.589193859239163e-27 +124 20 -1.88602197963761e-27 +125 20 -7.457784301440527e-28 +126 20 -4.595369958630025e-29 +127 20 -3.566718256788164e-28 +128 20 -6.497723631603045e-28 +129 20 -3.570664487244213e-28 +130 20 -1.474525909938138e-28 +21 21 1 +22 22 1 +23 23 1 +24 24 1 +25 25 1 +1 26 .7811995148658752 +2 26 -.7201683521270752 +11 26 0 +20 26 0 +21 26 -56538.44921875 +26 26 1.740456342697144 +2 27 -.08308809995651245 +3 27 .08304953575134277 +20 27 -5.771726608276367 +22 27 -54498.828125 +27 27 .9420697018504143 +3 28 .02393694594502449 +4 28 -.02386506274342537 +11 28 7.188270683400333e-5 +18 28 0 +20 28 0 +23 28 -52460.62109375 +28 28 1.049086261540651 +4 29 .1366583108901978 +5 29 -.1281171441078186 +11 29 0 +20 29 0 +24 29 -50458.38671875 +29 29 1.151831865310669 +5 30 .04490368068218231 +6 30 -.04476334899663925 +20 30 0 +25 30 -48446.16015625 +30 30 1.070025980472565 +1 31 1.036765098571777 +2 31 -1.198760032653809 +11 31 -.1727943420410156 +20 31 0 +21 31 -56114.78125 +31 31 2.215560913085937 +2 32 -.1629607677459717 +3 32 .1629607677459717 +20 32 -21.1695556640625 +22 32 -54087.18359375 +32 32 .862196683883667 +3 33 .0139964260160923 +4 33 -.0139964260160923 +11 33 0 +18 33 -2.00701492758526e-7 +20 33 1.844083786010742 +23 33 -52074.3671875 +33 33 1.039153832942247 +4 34 .21894770860672 +5 34 -.2052634358406067 +11 34 .0182456411421299 +20 34 0 +24 34 -50070.609375 +34 34 1.231180489063263 +5 35 .073860764503479 +6 35 -.07407057285308838 +18 35 0 +20 35 0 +25 35 -48070.21875 +35 35 1.099351406097412 +1 36 1.389152526855469 +2 36 -1.331271171569824 +11 36 0 +20 36 0 +21 36 -55679.45703125 +36 36 2.367364883422852 +2 37 -.216264009475708 +3 37 .216264009475708 +20 37 -43.26069641113281 +22 37 -53664.1015625 +37 37 .8088933825492859 +3 38 -.01824025437235832 +4 38 .01824025437235832 +20 38 -3.646347999572754 +23 38 -51663.30859375 +38 38 1.006917160004377 +4 39 .2334227561950684 +5 39 -.2275872230529785 +20 39 0 +24 39 -49671.41796875 +39 39 1.252006113529205 +5 40 .08269733190536499 +6 40 -.08349931240081787 +18 40 0 +20 40 0 +25 40 -47682.83984375 +40 40 1.108648717403412 +1 41 1.188438415527344 +2 41 -1.216734886169434 +18 41 0 +20 41 0 +21 41 -55232.91015625 +41 41 2.239842414855957 +2 42 -.2303062677383423 +3 42 .2303062677383423 +18 42 6.817922439950053e-6 +20 42 -62.65542602539062 +22 42 -53229.765625 +42 42 .7948511838912964 +3 43 -.05301721021533012 +4 43 .05301721021533012 +11 43 0 +20 43 -14.31075477600098 +23 43 -51241 +43 43 .9721402078866959 +4 44 .2035216093063354 +5 44 -.2001296281814575 +11 44 0 +20 44 0 +24 44 -49261.1640625 +44 44 1.225186288356781 +5 45 .07491928339004517 +6 45 -.07571291923522949 +20 45 0 +25 45 -47284.42578125 +45 45 1.10082620382309 +1 46 .9620693325996399 +2 46 -.9302363991737366 +18 46 0 +20 46 0 +21 46 -54775.484375 +46 46 1.955817461013794 +2 47 -.2077405452728271 +3 47 .2077405452728271 +20 47 -71.84405517578125 +22 47 -52784.76953125 +47 47 .8174169063568115 +3 48 -.07419836521148682 +4 48 .07419836521148682 +11 48 0 +20 48 -25.35458374023437 +23 48 -50808.05859375 +48 48 .9509590044617653 +4 49 .1569298505783081 +5 49 -.148630678653717 +20 49 0 +24 49 -48840.24609375 +49 49 1.173709630966187 +5 50 .05782072991132736 +6 50 -.05818950012326241 +20 50 0 +25 50 -46875.37109375 +50 50 1.083329916000366 +1 51 .6685049533843994 +2 51 -.6127962470054626 +11 51 .1114175319671631 +20 51 0 +21 51 -54307.3984375 +51 51 1.642910003662109 +2 52 -.1625726222991943 +3 52 .1625726222991943 +20 52 -68.51022338867188 +22 52 -52328.921875 +52 52 .8625847697257996 +3 53 -.07636785507202148 +4 53 .07636785507202148 +20 53 -31.7105712890625 +23 53 -50364.6640625 +53 53 .9487895332276821 +4 54 .08871358633041382 +5 54 -.09425818920135498 +20 54 0 +24 54 -48408.6640625 +54 54 1.11990225315094 +5 55 .03970580548048019 +6 55 -.03875695168972015 +11 55 -.01868509128689766 +18 55 0 +20 55 0 +25 55 -46455.62890625 +55 55 1.063922047615051 +1 56 .4062695503234863 +2 56 -.3618338108062744 +11 56 0 +18 56 0 +20 56 0 +21 56 -53828.64453125 +56 56 1.385215580463409 +2 57 -.111913800239563 +3 57 .1119064092636108 +20 57 -55.42092895507812 +22 57 -51862.8125 +57 57 .91324383020401 +3 58 -.0638895034790039 +4 58 .0638895034790039 +18 58 3.410244971746579e-6 +20 58 -31.33937072753906 +23 58 -49910.578125 +58 58 .9612678736448288 +4 59 .05389992520213127 +5 59 -.05187865719199181 +20 59 0 +24 59 -47966.8203125 +59 59 1.077387571334839 +5 60 .02305793017148972 +6 60 -.0226576179265976 +18 60 0 +20 60 0 +25 60 -46025.4375 +60 60 1.047769121825695 +1 61 .1912040114402771 +2 61 -.1852288842201233 +11 61 0 +20 61 0 +21 61 -53339.875 +61 61 1.210645496845245 +2 62 -.06831127405166626 +3 62 .06840813159942627 +20 62 -29.01747131347656 +22 62 -51386.4375 +62 62 .9568538181483746 +3 63 -.04531185328960419 +4 63 .04531185328960419 +11 63 0 +18 63 2.789366590150166e-6 +20 63 -25.50216674804687 +23 63 -49443.72265625 +63 63 .9798460863530636 +4 64 .02319774404168129 +5 64 -.02464760094881058 +20 64 0 +24 64 -47514.71484375 +64 64 1.049969587475061 +5 65 .01143456250429153 +6 65 -.01153665781021118 +20 65 0 +25 65 -45585.3828125 +65 65 1.036741930991411 +1 66 .09722059965133667 +2 66 -.08506804704666138 +11 66 0 +20 66 0 +21 66 -52841 +66 66 1.110036253929138 +2 67 -.03708969801664352 +3 67 .03684729337692261 +20 67 0 +22 67 -50900.41796875 +67 67 .9880154319107533 +3 68 -.02788387611508369 +4 68 .02788387611508369 +11 68 0 +18 68 2.178428985644132e-6 +20 68 -18.27397155761719 +23 68 -48828.0859375 +68 68 .997323069954291 +4 69 0 +5 69 -.01018907129764557 +20 69 0 +24 69 -47052.9609375 +69 69 1.035176958888769 +5 70 .004984032362699509 +6 70 -.005139783024787903 +20 70 0 +25 70 -45135.2578125 +70 70 1.030361384153366 +1 71 .1168304681777954 +2 71 -.02920761704444885 +20 71 0 +21 71 -52332.6640625 +71 71 1.059764284640551 +2 72 -.01802648976445198 +3 72 .02338571846485138 +20 72 0 +22 72 -50404.75 +72 72 1.007092889398336 +3 73 -.01836121454834938 +4 73 .01836121454834938 +11 73 0 +20 73 0 +23 73 -49508.046875 +73 73 1.010153356939554 +4 74 .02381398528814316 +5 74 -.004465121775865555 +20 74 0 +24 74 -46581.74609375 +74 74 1.028476625680923 +5 75 0 +6 75 -.001977193402126431 +11 75 0 +20 75 0 +25 75 -44675.66796875 +75 75 1.027193285524845 +1 76 0 +2 76 -.01157634705305099 +20 76 0 +21 76 -51814.8671875 +76 76 1.03775429725647 +2 77 -.00747762992978096 +3 77 0 +20 77 0 +22 77 -49899.75390625 +77 77 1.017277095466852 +3 78 0 +4 78 0 +20 78 0 +23 78 -43888.375 +78 78 1.017999485135078 +4 79 0 +5 79 -.002978397300466895 +20 79 0 +24 79 -46101.015625 +79 79 1.025970183312893 +5 80 0 +6 80 0 +20 80 0 +25 80 -44206.8046875 +80 80 1.025839652866125 +1 81 0 +2 81 0 +20 81 0 +21 81 -51287.76953125 +81 81 1.029255405068398 +2 82 -.004347227513790131 +3 82 0 +20 82 0 +22 82 -49385.62109375 +82 82 1.022067971527576 +3 83 0 +4 83 0 +20 83 0 +23 83 -34492.625 +83 83 1.022117994725704 +4 84 0 +5 84 0 +20 84 0 +24 84 -45611.2265625 +84 84 1.025238625705242 +5 85 0 +6 85 -.001408393494784832 +20 85 0 +25 85 -43728.66796875 +85 85 1.02534606307745 +1 86 0 +2 86 0 +20 86 0 +21 86 -50752.015625 +86 86 1.026350062340498 +2 87 0 +3 87 0 +20 87 0 +22 87 -48861.51953125 +87 87 1.024067506194115 +3 88 0 +4 88 0 +20 88 0 +23 88 -105155.625 +88 88 1.024003818631172 +4 89 0 +5 89 .01899568364024162 +20 89 0 +24 89 -45112.56640625 +89 89 1.025104723870754 +5 90 0 +6 90 .003719797125086188 +20 90 0 +25 90 -43241.84375 +90 90 1.025196127593517 +1 91 0 +2 91 0 +20 91 0 +21 91 -50207.57421875 +91 91 1.025468096137047 +2 92 0 +3 92 0 +20 92 0 +22 92 -48336.640625 +92 92 1.024810910224915 +3 93 0 +4 93 0 +20 93 0 +23 93 0 +93 93 1.024764768779278 +4 94 0 +5 94 0 +20 94 0 +24 94 -44605.40625 +94 94 1.025115087628365 +5 95 0 +6 95 0 +20 95 0 +25 95 -42746.33984375 +95 95 1.025160629302263 +1 96 0 +2 96 0 +20 96 0 +21 96 -49654.84765625 +96 96 1.025229826569557 +2 97 0 +3 97 0 +20 97 0 +22 97 -47784.046875 +97 97 1.025058060884476 +3 98 0 +4 98 0 +20 98 0 +23 98 0 +98 98 1.025037329643965 +4 99 0 +5 99 0 +20 99 0 +24 99 -44089.9609375 +99 99 1.025137882679701 +5 100 0 +6 100 0 +20 100 0 +25 100 -42242.546875 +100 100 1.02515559270978 +1 101 0 +2 101 0 +20 101 0 +21 101 -49094 +101 101 1.025172512978315 +2 102 0 +3 102 0 +20 102 0 +22 102 -47200 +102 102 1.025131687521935 +3 103 0 +4 103 0 +20 103 0 +23 103 0 +103 103 1.025124348700047 +4 104 0 +5 104 0 +20 104 0 +24 104 -43566.4453125 +104 104 1.025150395929813 +5 105 0 +6 105 0 +20 105 0 +25 105 -41730.44140625 +105 105 1.025156177580357 +1 106 0 +2 106 0 +20 106 0 +21 106 -48525.4765625 +106 106 1.025160226970911 +2 107 0 +3 107 0 +20 107 0 +22 107 -46717.8828125 +107 107 1.025151398032904 +3 108 0 +4 108 0 +20 108 0 +23 108 0 +108 108 1.025149203836918 +4 109 0 +5 109 0 +20 109 0 +24 109 -43035.01953125 +109 109 1.025155294686556 +5 110 0 +6 110 0 +20 110 0 +25 110 -41210.453125 +110 110 1.025156926363707 +1 111 0 +2 111 0 +20 111 0 +21 111 -47949.26171875 +111 111 1.025157883763313 +2 112 0 +3 112 0 +20 112 0 +22 112 -46409.71484375 +112 112 1.025156144052744 +3 113 0 +4 113 0 +20 113 0 +23 113 0 +113 113 1.025155574083328 +4 114 0 +5 114 0 +20 114 0 +24 114 -42496.0859375 +114 114 1.025156859308481 +5 115 0 +6 115 0 +20 115 0 +25 115 -40682.984375 +115 115 1.025157265365124 +1 116 0 +2 116 0 +20 116 0 +21 116 -47365.93359375 +116 116 1.025157485157251 +2 117 0 +3 117 0 +20 117 0 +22 117 -48883.11328125 +117 117 1.025157172232866 +3 118 0 +4 118 0 +20 118 0 +23 118 0 +118 118 1.025157041847706 +4 119 0 +5 119 0 +20 119 0 +24 119 -41949.66796875 +119 119 1.025157287716866 +5 120 0 +6 120 0 +20 120 0 +25 120 -40147.81640625 +120 120 1.025157377123833 +1 121 0 +2 121 0 +20 121 0 +21 121 -46775.52734375 +121 121 1.025157421827316 +2 122 0 +3 122 0 +20 122 0 +22 122 -94803.375 +122 122 1.025157373398542 +3 123 0 +4 123 0 +20 123 0 +23 123 0 +123 123 1.02515734732151 +4 124 0 +5 124 0 +20 124 0 +24 124 -41396.16796875 +124 124 1.025157388299704 +5 125 0 +6 125 0 +20 125 0 +25 125 -39605.7265625 +125 125 1.025157406926155 +1 126 0 +2 126 0 +20 126 0 +21 126 -46178.4375 +126 126 1.025157414376736 +2 127 0 +3 127 0 +20 127 0 +22 127 0 +127 127 1.025157406926155 +3 128 0 +4 128 0 +20 128 0 +23 128 0 +128 128 1.025157403200865 +4 129 0 +5 129 0 +20 129 0 +24 129 -40835.9296875 +129 129 1.025157410651445 +5 130 0 +6 130 0 +20 130 0 +25 130 -39056.3671875 +130 130 1.025157410651445 \ No newline at end of file diff --git a/QuadTree.sln b/QuadTree.sln index c1c95e1..98a65ef 100644 --- a/QuadTree.sln +++ b/QuadTree.sln @@ -4,6 +4,8 @@ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "QuadTree", "QuadTree\QuadTr EndProject Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "QuadTree.Tests", "QuadTree.Tests\QuadTree.Tests.fsproj", "{8F8CB04B-1310-4DBA-BF06-BC9FC2111FCC}" EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "QuadTree.Benchmark", "QuadTree.Benchmark\QuadTree.Benchmark.fsproj", "{F436270C-8B0E-484F-9FFE-2B4501DDEB54}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -38,6 +40,18 @@ Global {8F8CB04B-1310-4DBA-BF06-BC9FC2111FCC}.Release|x64.Build.0 = Release|Any CPU {8F8CB04B-1310-4DBA-BF06-BC9FC2111FCC}.Release|x86.ActiveCfg = Release|Any CPU {8F8CB04B-1310-4DBA-BF06-BC9FC2111FCC}.Release|x86.Build.0 = Release|Any CPU + {F436270C-8B0E-484F-9FFE-2B4501DDEB54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F436270C-8B0E-484F-9FFE-2B4501DDEB54}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F436270C-8B0E-484F-9FFE-2B4501DDEB54}.Debug|x64.ActiveCfg = Debug|Any CPU + {F436270C-8B0E-484F-9FFE-2B4501DDEB54}.Debug|x64.Build.0 = Debug|Any CPU + {F436270C-8B0E-484F-9FFE-2B4501DDEB54}.Debug|x86.ActiveCfg = Debug|Any CPU + {F436270C-8B0E-484F-9FFE-2B4501DDEB54}.Debug|x86.Build.0 = Debug|Any CPU + {F436270C-8B0E-484F-9FFE-2B4501DDEB54}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F436270C-8B0E-484F-9FFE-2B4501DDEB54}.Release|Any CPU.Build.0 = Release|Any CPU + {F436270C-8B0E-484F-9FFE-2B4501DDEB54}.Release|x64.ActiveCfg = Release|Any CPU + {F436270C-8B0E-484F-9FFE-2B4501DDEB54}.Release|x64.Build.0 = Release|Any CPU + {F436270C-8B0E-484F-9FFE-2B4501DDEB54}.Release|x86.ActiveCfg = Release|Any CPU + {F436270C-8B0E-484F-9FFE-2B4501DDEB54}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 0b9fcf93126a777d1cf249cacf47bf6bd574c4ca Mon Sep 17 00:00:00 2001 From: gsv Date: Wed, 18 Mar 2026 09:26:46 +0300 Subject: [PATCH 2/5] Prevent infinite loop in case of negative cycles. --- QuadTree/SSSP.fs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/QuadTree/SSSP.fs b/QuadTree/SSSP.fs index 3641286..543e060 100644 --- a/QuadTree/SSSP.fs +++ b/QuadTree/SSSP.fs @@ -20,8 +20,8 @@ let sssp graph (startVertex: uint64) = | Some(u), Some(v) -> Some(u + v) | _ -> None - let rec inner (frontier: Vector.SparseVector<_>) (visited: Vector.SparseVector<_>) = - if frontier.nvals > 0UL then + let rec inner (frontier: Vector.SparseVector<_>) (visited: Vector.SparseVector<_>) iter_num = + if frontier.nvals > 0UL && iter_num <= int frontier.length then let new_frontier = LinearAlgebra.vxm op_add op_mult frontier graph @@ -44,7 +44,7 @@ let sssp graph (startVertex: uint64) = match visited with | Result.Failure(e) -> Result.Failure(VisitedCalculationProblem(e)) - | Result.Success(visited) -> inner frontier visited + | Result.Success(visited) -> inner frontier visited (iter_num + 1) else Result.Success visited @@ -52,4 +52,4 @@ let sssp graph (startVertex: uint64) = Vector.CoordinateList((uint64 graph.ncols) * 1UL, [ startVertex * 1UL, 0.0 ]) |> Vector.fromCoordinateList - inner frontier frontier + inner frontier frontier 0 From 5e3eef6974cacc7da806a632ea15be044eaefeb7 Mon Sep 17 00:00:00 2001 From: gsv Date: Wed, 18 Mar 2026 09:27:31 +0300 Subject: [PATCH 3/5] Main README is butified. Added information about SSSP. --- README.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index fbb2ba3..075e8f5 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,20 @@ +[![.NET Tests](https://github.com/Lamagraph/QTreeFSharp/actions/workflows/dotnet-tests.yaml/badge.svg)](https://github.com/Lamagraph/QTreeFSharp/actions/workflows/dotnet-tests.yaml) + # QTreeFSharp -Quad tree based linear algebra in F# for GraphBLAS-style graph analysis. +Quad‑tree based linear algebra in F# for GraphBLAS‑style graph analysis. This is a prototype for implementations using interaction nets. An example of such an implementation using Inpla can be found in [this repository](https://github.com/Lamagraph/QTreeInpla). + +## Benchmarks +Infrastructure for benchmarking the implemented algorithms is available in the [respective project](QuadTree.Benchmark/). -## Implemented +## Implemented Algorithms * Single-source level BFS -* Triange countig +* Single-source shortest path (SSSP) +* Triangles counting ## TODO * [ ] Single-source parent BFS * [ ] Multiple-source level BFS * [ ] Multiple-source parent BFS +* [ ] PageRank * [ ] Single-source RPQ reachability From 5f2b6d786e23c21a299dcd1d05917d020b19d631 Mon Sep 17 00:00:00 2001 From: gsv Date: Wed, 18 Mar 2026 09:29:04 +0300 Subject: [PATCH 4/5] Compiler warnings fixed. Added more details on benchmarking process to README. --- QuadTree.Benchmark/README.md | 17 +++++++++++++++-- QuadTree.Benchmark/SSSP.fs | 2 +- QuadTree.Benchmark/Utils.fs | 2 +- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/QuadTree.Benchmark/README.md b/QuadTree.Benchmark/README.md index 57d1e0b..8dd32ab 100644 --- a/QuadTree.Benchmark/README.md +++ b/QuadTree.Benchmark/README.md @@ -1,7 +1,20 @@ # Benchmarks -1. Add ```*.mtx``` files to the ```data``` directory. Do not commit these files. Several small matrices are included for demo purposes only. +Benchmarking infrastructure for +* [BFS](BFS.fs) +* [SSSP](SSSP.fs) +* [Triangles counting](Triangles.fs) + +## Steps to run + +1. Add ```*.mtx``` files to the [```data```](data/) directory. Do not commit these files. Several small matrices are included for demo purposes only. 2. Configure ```MatrixName``` in the respective ```.fs``` files: list the matrices to be used for evaluation in the ```Params``` attribute. For example: ```[]``` in ```BFS.fs```. -3. Ensure the matrix reader is correctly configured. In ```LoadMatrix ()``` , you can pass a boolean flag to ```readMtx``` indicating whether the matrix should be treated as a directed or undirected graph. + ```fsharp + [] + member val MatrixName = "" with get, set + ``` +3. Ensure the matrix reader is correctly configured. In ```LoadMatrix ()``` , you can pass a boolean flag to ```readMtx``` indicating whether the matrix should be treated as a directed or undirected graph. Current configuration: + 1. Undirected for ```BFS``` and ```Triangles counting```. + 2. Directed for ```SSSP```. 4. Run evaluation: ```dotnet run -c Release -- --filter '*.SSSP.*'``` You can use ```--filter``` to specify particular benchmarks. Use ```--filter '*'``` to run all available benchmarks. 5. Raw benchmarking results are saved in ```BenchmarkDotNet.Artifacts/results/*.csv```. \ No newline at end of file diff --git a/QuadTree.Benchmark/SSSP.fs b/QuadTree.Benchmark/SSSP.fs index b6b6572..271eb74 100644 --- a/QuadTree.Benchmark/SSSP.fs +++ b/QuadTree.Benchmark/SSSP.fs @@ -8,7 +8,7 @@ type Benchmark() = let mutable matrix = Unchecked.defaultof> - [] + [] member val MatrixName = "" with get, set [] diff --git a/QuadTree.Benchmark/Utils.fs b/QuadTree.Benchmark/Utils.fs index 2492830..830b0ea 100644 --- a/QuadTree.Benchmark/Utils.fs +++ b/QuadTree.Benchmark/Utils.fs @@ -3,7 +3,7 @@ module QuadTree.Benchmarks.Utils open System.IO open BenchmarkDotNet.Configs -type MyConfig() as this = +type MyConfig() = inherit ManualConfig() let DIR_WITH_MATRICES = "../../../../../../../data/" From b58f968e6df1e53bfcb1667b246266c345bb3d61 Mon Sep 17 00:00:00 2001 From: gsv Date: Wed, 18 Mar 2026 09:32:40 +0300 Subject: [PATCH 5/5] Main project is a library, not executable. --- QuadTree/QuadTree.fsproj | 1 - 1 file changed, 1 deletion(-) diff --git a/QuadTree/QuadTree.fsproj b/QuadTree/QuadTree.fsproj index 364b691..2b2b699 100644 --- a/QuadTree/QuadTree.fsproj +++ b/QuadTree/QuadTree.fsproj @@ -1,7 +1,6 @@  - Exe net10.0