diff --git a/.gitignore b/.gitignore index 0023a53..80837be 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ /Packages xcuserdata/ DerivedData/ +.derived-data-log-* .swiftpm/configuration/registries.json .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata .netrc diff --git a/Package.swift b/Package.swift index b526725..197bbf4 100644 --- a/Package.swift +++ b/Package.swift @@ -14,6 +14,10 @@ let package = Package( name: "MaxVol", targets: ["MaxVol"] ), + .executable( + name: "MaxVolBenchmark", + targets: ["MaxVolBenchmark"] + ), ], targets: [ // Targets are the basic building blocks of a package, defining a module or a test suite. @@ -25,6 +29,13 @@ let package = Package( .define("ACCELERATE_LAPACK_ILP64"), ] ), + .executableTarget( + name: "MaxVolBenchmark", + dependencies: ["MaxVol"], + resources: [ + .copy("Resources/fixtures.json"), + ] + ), .testTarget( name: "MaxVolTests", dependencies: ["MaxVol"] diff --git a/README.md b/README.md index a06db8c..a2e3896 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,39 @@ deprecated compatibility shims. points. - Consider complex support only after real-valued APIs are stable. +## Benchmarking + +`MaxVolBenchmark` runs deterministic fixtures through the Swift implementation +and prints one JSON object per result: + +```bash +swift run -c release MaxVolBenchmark --iterations 20 +``` + +The Python comparison harness reads the same checked-in fixture values and runs +the official `maxvolpy` implementation from the PyPI source distribution: + +```bash +uv run --python 3.11 scripts/compare_maxvolpy.py --iterations 20 +``` + +To compare correctness-oriented fields, write both outputs as JSONL and run the +parity checker: + +```bash +swift run -c release MaxVolBenchmark --iterations 20 > /tmp/maxvol-swift.jsonl +uv run --python 3.11 scripts/compare_maxvolpy.py --iterations 20 > /tmp/maxvol-python.jsonl +python3 scripts/check_benchmark_parity.py /tmp/maxvol-swift.jsonl /tmp/maxvol-python.jsonl +``` + +For allocation profiling, build the executable once and record the workload with +Instruments from the command line: + +```bash +swift build -c release --product MaxVolBenchmark +xcrun xctrace record --template 'Allocations' --output /tmp/MaxVolBenchmark.trace --launch -- .build/release/MaxVolBenchmark --iterations 100 +``` + ## Non-Goals For The First Pass - Exact exhaustive maximum-volume search. diff --git a/ROADMAP.md b/ROADMAP.md index 069c236..84a4e39 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -2,7 +2,7 @@ ## Current Focus -- Build from `v0.7.0` toward `v1.0.0` with real-valued `Double` and `Float` +- Build from `v0.8.0` toward `v1.0.0` with real-valued `Double` and `Float` algorithms backed by modern Accelerate BLAS/LAPACK. - Keep Swift Testing as the package test surface and require reference fixtures before broadening the algorithm surface. @@ -39,6 +39,8 @@ - Reduce temporary allocations in square row swaps and rectangular appends. - Reuse workspace buffers where it improves measured throughput. - Add benchmark coverage for representative row counts and ranks. + - Compare Swift Release-mode results with official `maxvolpy` runs on shared + deterministic fixtures before changing allocation behavior. ## Test Coverage @@ -51,6 +53,8 @@ implementations when algorithm behavior changes. - Keep randomized orthonormal-matrix tests similar to `Maxvol.jl` across supported scalar types. +- Keep benchmark fixture parity checks available for every supported scalar and + algorithm family. - Keep Release-mode validation in the release path for optimization-sensitive Accelerate calls. - Keep validation clean under the modern Accelerate `ACCELERATE_NEW_LAPACK` and @@ -66,6 +70,8 @@ - Keep public API docs aligned with tested behavior. - Expand DocC with algorithm notes, limitations, and reference-fixture provenance before `1.0.0`. +- Keep benchmark and profiling commands documented so performance work remains + reproducible. ## Swift Package Index @@ -95,3 +101,17 @@ - Expand DocC with reference-fixture provenance and a short comparison with Python, Julia, and R implementations. - Verify Swift Package Index renders the tagged `v1.0.0` documentation cleanly. + +## Planned `v0.9.0` + +- Use `MaxVolBenchmark` and the `maxvolpy` comparison harness as the baseline + evidence source before changing performance-sensitive code. +- Measure Release-mode square row-swap throughput and RectMaxVol append + throughput across the checked-in deterministic fixture set. +- Capture allocation traces for the largest fixtures and identify temporary + buffers created inside coefficient construction, square row replacement, and + rectangular appends. +- Decide whether reusable workspaces should remain an internal optimization or + become a public advanced API. +- Implement only measured allocation reductions, then re-run parity, timing, and + allocation checks before tagging `v0.9.0`. diff --git a/Sources/MaxVol/MaxVol.docc/BenchmarkingAndParity.md b/Sources/MaxVol/MaxVol.docc/BenchmarkingAndParity.md new file mode 100644 index 0000000..6bf0466 --- /dev/null +++ b/Sources/MaxVol/MaxVol.docc/BenchmarkingAndParity.md @@ -0,0 +1,66 @@ +# Benchmarking and Parity + +Use the package benchmark executable and Python harness to compare MaxVol's +Accelerate-backed implementation with `maxvolpy` on identical deterministic +fixtures. + +## Swift Benchmark + +Build and run the benchmark executable in Release mode when measuring runtime: + +```bash +swift run -c release MaxVolBenchmark --iterations 20 +``` + +The executable reads bundled fixture values from `MaxVolBenchmark` resources and +prints JSON Lines. Each record includes the fixture, algorithm, scalar type, +selected row count, convergence status, algorithm iteration count, reconstruction +residual, coefficient magnitude, and elapsed nanoseconds. + +Filter the workload when recording a focused trace: + +```bash +swift run -c release MaxVolBenchmark --fixture gaussian-192x16 --algorithm square --scalar double --iterations 100 +``` + +## Python Comparison + +The Python harness downloads the official `maxvolpy` source distribution from +PyPI, imports its implementation, and runs it against the same checked-in fixture +values: + +```bash +uv run --python 3.11 scripts/compare_maxvolpy.py --iterations 20 +``` + +Use the `pure` implementation mode for the Python reference path. The `api` mode +uses `maxvolpy.maxvol` and `maxvolpy.rect_maxvol`, which may use the compiled +extension if the package is installed with one available. + +## Parity Check + +Compare correctness-oriented fields by writing Swift and Python output to JSONL +files: + +```bash +swift run -c release MaxVolBenchmark --iterations 20 > /tmp/maxvol-swift.jsonl +uv run --python 3.11 scripts/compare_maxvolpy.py --iterations 20 > /tmp/maxvol-python.jsonl +python3 scripts/check_benchmark_parity.py /tmp/maxvol-swift.jsonl /tmp/maxvol-python.jsonl +``` + +The checker verifies that both runs produced the same fixture, algorithm, and +scalar keys, then compares selected row counts, reconstruction residuals, and +rectangular unselected-row norms. + +## Allocation Profiling + +Build before profiling so the trace captures benchmark work instead of package +resolution or compilation: + +```bash +swift build -c release --product MaxVolBenchmark +xcrun xctrace record --template 'Allocations' --output /tmp/MaxVolBenchmark.trace --launch -- .build/release/MaxVolBenchmark --fixture gaussian-192x16 --iterations 100 +``` + +Keep trace artifacts out of the repository unless a future performance report +explicitly needs to preserve one as release evidence. diff --git a/Sources/MaxVol/MaxVol.docc/MaxVol.md b/Sources/MaxVol/MaxVol.docc/MaxVol.md index 6761a46..ebac45a 100644 --- a/Sources/MaxVol/MaxVol.docc/MaxVol.md +++ b/Sources/MaxVol/MaxVol.docc/MaxVol.md @@ -77,3 +77,4 @@ let rectangular = try rectMaxVol(matrix, options: RectMaxVolOptions(minRows: 3)) ### Algorithm Notes - +- diff --git a/Sources/MaxVolBenchmark/Resources/fixtures.json b/Sources/MaxVolBenchmark/Resources/fixtures.json new file mode 100644 index 0000000..b97db9d --- /dev/null +++ b/Sources/MaxVolBenchmark/Resources/fixtures.json @@ -0,0 +1,4798 @@ +{ + "fixtures": [ + { + "columns": 2, + "description": "Small fixture that performs one square MaxVol row swap.", + "id": "square-swap-3x2", + "rowMajorValues": [ + 0.25, + 0.0, + 0.5, + 1.0, + 0.5, + 1.5 + ], + "rows": 3 + }, + { + "columns": 2, + "description": "Small fixture that appends one RectMaxVol row.", + "id": "rect-append-5x2", + "rowMajorValues": [ + 1.0, + 0.0, + 0.0, + 1.0, + 1.2, + 0.2, + 0.1, + 1.3, + 0.8, + 0.8 + ], + "rows": 5 + }, + { + "columns": 8, + "description": "Medium full-rank Gaussian-like tall matrix with a diagonal boost.", + "id": "gaussian-64x8", + "rowMajorValues": [ + 1.3555326985042249, + -0.3556249113960911, + 0.028651929590178316, + -0.1835496085830105, + 0.14664246107807732, + -0.2843552014572387, + -0.4073471321777901, + -0.3361682528212281, + 0.11189372946099818, + 1.1683694586794084, + -0.5364987251507349, + -0.271635072969874, + -0.09609073676553787, + 0.04398727575435113, + -0.17732146358588663, + 0.6628393108883238, + 0.7839332910491649, + 0.008303617523986784, + 0.5937682776779967, + -0.2703902801874237, + 0.7290852959419923, + 0.03519327089821028, + 0.09491141447466572, + 0.02047564633469512, + -0.17939778250878124, + -0.3769131415871513, + 0.022426483564250643, + 1.0780355357129365, + -0.041193842394798064, + 0.6674483479285728, + -0.5541180584515912, + 0.09119382037947399, + 0.44128281397548597, + 0.009096583442230799, + -0.8018856532843409, + -0.5935767160807435, + 1.2032773407787394, + -0.24183499217016524, + 0.7972160953470916, + 0.13728648519771575, + 0.20030714813021078, + -0.6016987138654726, + -0.7741403592754021, + 0.0899301714187688, + -0.31057326437873917, + 1.3506643530896991, + 0.41562128354329064, + -0.36279544788528983, + -0.5365471159380826, + -0.15987657915116527, + -0.22724547156627606, + -0.2140203669822579, + -0.1944622861568689, + -0.48424445019844425, + 1.1218269321448004, + 0.3089740956109696, + -0.8599459938205836, + 0.003190301811544005, + -0.20963995857832096, + -0.15884503142347467, + -0.45460303956233233, + 0.2551874936384723, + 0.35633258703151605, + 1.1967710225219923, + 0.0745978498490536, + -0.28585618137540714, + -0.41524584345970555, + -0.7215521820546846, + -0.34705010031512296, + 0.5173037143591295, + 0.8702701416232547, + -0.26781802543518185, + 0.20205064450100918, + 0.4585578679019454, + 0.7065973126963525, + 0.3035467715666538, + -0.12907304013414123, + 0.4198186506740133, + 0.21183981878367925, + 0.43606683417886444, + 0.13041128213068404, + 0.2724959822278449, + -0.07387691441732658, + 0.1694785509411224, + 0.017636037825263795, + 0.5892009932181389, + 0.04138176895220713, + 0.34099307427399916, + -0.5491127497865849, + 0.1210806879233523, + -0.07968016867497407, + 0.28358429813318214, + -0.12613964003158212, + 0.03944782804455116, + 0.3499465991325029, + 0.756685031834276, + 0.009367612874994935, + -0.03860935784935454, + -0.049498577976933855, + 0.0982765872245594, + 0.2753064904789386, + 0.1938118164708202, + -0.40402118124712244, + 0.14057199343122756, + -0.1787144122653227, + 0.18980158767753358, + 0.4667217269252364, + 0.06602881310306535, + -0.4059354895081115, + 0.4700526192787075, + 0.33117707855063205, + 0.04107775755607507, + -0.5057323518384216, + 0.0472926201675995, + -0.04018175751072711, + 0.228347624205188, + -0.826178616343264, + -0.7282267858148368, + -0.2215058124809003, + -0.17847891571430963, + 0.15790718175959595, + 0.7690001881543606, + 0.21102524284168706, + -0.6831789541887198, + -0.5231407660264005, + -0.7758783348292303, + -0.2286617794071305, + -0.38385884284739047, + -0.7936714442798115, + -0.2148313600992029, + 0.08182600916130645, + 0.04046988922262118, + -0.07507730901451432, + 0.03033928066972097, + 0.18208357613337844, + 0.185574865194865, + -0.14432802174341802, + 0.07836799413858125, + 0.8617671022736803, + -0.013692040369889635, + -0.11039639464156287, + 0.37506694479339814, + 0.17874760741379087, + -0.5041566349831239, + 0.8239808026571771, + -0.15482305677571323, + -0.3319147327451287, + -0.2620125382851868, + -0.7702826954192662, + -0.17026727832243282, + 0.06988443618879547, + 0.41130400329810546, + 0.5739608965701635, + -0.13178810245714667, + 0.18694940210487854, + -0.11058014299894864, + -0.5980178560384957, + -0.306514382288806, + -0.1518572409283273, + -0.6631597304583485, + -0.2615436060444458, + 0.44517114903152566, + 0.8806460845626449, + 0.06506925071319403, + -0.29408658769167484, + 0.09876263982284078, + 0.5412788788276983, + -0.56345299303957, + -0.2070024392849188, + -0.6857930305095291, + -0.6231125681036621, + 0.3249651783677828, + -0.11704632538739457, + 0.49242901016857754, + -0.15554016717032304, + 0.6640706362540469, + -0.03182536266539571, + -0.2718123341107572, + 0.8243445680142945, + -0.10087557643691641, + -0.7077656242292281, + 0.7402645884833116, + -0.04181565019188943, + -0.26766535736504893, + 0.025626372947911036, + -0.36698370982877637, + 0.26125869050374667, + 0.5317572284086353, + -0.5502520101815118, + 0.5631332130254028, + -0.18915855633477519, + -0.20363095918208152, + 0.0738535350549987, + -0.23411715489884555, + -0.7796953327838291, + 0.2891119567678248, + 0.06285617835435775, + -0.23378420053759286, + 0.6225677495088053, + 0.49111896579237835, + 0.29262596770215094, + 0.3768924404938255, + -0.3984707522201941, + -0.035166062033002266, + 0.03671731977878889, + 0.736962634213755, + -0.21359477780150082, + -0.4748180609474217, + 0.486196778255341, + 0.16068293570496595, + 0.004907349931616345, + -0.327971145144928, + 0.49213638767290435, + -0.06832463531586114, + 0.02255055158397179, + -0.24983426943395892, + 0.014618958972708762, + -0.16782784544164842, + -0.05639452617730384, + -0.6894213549219023, + -0.1657285079083901, + 0.513614723489363, + -0.5795233987489872, + -0.02748092388376433, + 0.07792819440608267, + -0.43879322207389865, + 0.37716110946281783, + -0.18959154183632643, + 0.5673244517441468, + -0.08400397280563981, + 0.040644348978418565, + -0.7809841822391376, + 0.768560769235731, + 0.16337250697212014, + 0.5292310332315588, + -0.15490324650940546, + 0.08054753798467423, + 0.8499309622510668, + -0.07883880275481903, + 0.17731931200261103, + -0.018132626533251317, + 0.49731804661159695, + -0.29392036110484665, + 0.554207135449584, + 0.2543650232346499, + 0.12905111174180184, + 0.3438281310142495, + 0.5779681958747225, + 0.4017122029897071, + -0.08860611596754575, + -0.47167908317006374, + 0.17575000208141978, + -0.32911362309201153, + -0.3920439137982247, + -0.22269597234416616, + -0.16754318450084071, + -0.42333792666759484, + -0.21703926883240676, + 0.348344382164962, + -0.15899546779075563, + -0.3206721188907957, + 0.4995170002123136, + -0.24864952974005206, + 0.7625838047806488, + -0.20907769699621126, + 0.17113186279976716, + -0.6319038416818936, + -0.40870304643769206, + -0.2173889136760433, + 0.315184383624356, + 0.7440546807246072, + -0.7823395462446613, + 0.23171488015531433, + 0.3267284135238694, + -0.184798453088326, + 0.4089894206188705, + -0.004580105979359261, + -0.36845156781024224, + -0.29768832710719134, + -0.752743373281726, + 0.07996990235926121, + -0.7594030029155983, + 0.1985547583152471, + 0.18163518587645017, + 0.19502313853087921, + 0.7942287870458874, + -0.21657057135184954, + 0.7466660796093649, + -0.17723652587229344, + 0.5319147806488502, + -0.13378496092475445, + 0.5077500719880818, + 0.26295634477599816, + 0.4954807859169853, + 0.021252821265654864, + -0.41105491575700465, + 0.522634160370103, + -0.249561615629333, + 0.54748621325237, + -0.4263124553162912, + 0.2169548613557754, + -0.12655464893628066, + 0.6024331504510874, + -0.3300317061781164, + 0.1994957263116126, + -0.44041031686147125, + -0.0038313458001718592, + -0.5475650523736881, + -0.22290918978501412, + 0.34749036993033533, + 0.0061505123887770075, + 0.49020377978127266, + 0.10408624546857359, + 0.24956376270150465, + -0.018091078423037255, + 0.5655216903328336, + -0.8833617454475319, + -0.20565741589322595, + 0.13247580575466594, + 0.3475851343650064, + -0.2934972728983092, + -0.4299580735972605, + 0.4200827354046144, + -0.8226036209795613, + 0.13552466583667472, + -0.14755936935890301, + -0.5606120289619694, + 0.38870246644050593, + -0.09188379685823522, + -0.06065423845277185, + 0.10648161473027323, + 0.12633904771911292, + -0.3189278312591328, + 0.08590197690552426, + -0.25500992434795966, + 0.129296019915138, + -0.4712052780930129, + -0.3502731440277802, + 0.049982382982796, + 0.005976783222068183, + -0.054160840489644146, + 0.4134390561373666, + 0.4484450912000337, + 0.07846601472192732, + -0.25736907799494546, + 0.7157008056817672, + 0.4931118353581756, + 0.16551614242590174, + 0.014491728723386665, + -0.41976705455590885, + -0.8006713380988845, + 0.2528601496980422, + 0.053026804637566705, + 0.4726536734498976, + 0.09572617558957452, + -0.3363561656570876, + -0.5704851263934958, + -0.5090735685202579, + 0.21922183456539468, + 0.11611601478494615, + -0.169219013901601, + -0.10487595391014304, + 0.14965636021655643, + 0.15942818154845878, + -0.08203424198556031, + -0.10171771883210606, + 0.270191610645897, + 0.293769436834576, + -0.3944969054180481, + -0.16305570537015734, + 0.8108762379801554, + 0.12222788705669912, + -0.7128747301162148, + 0.22341697576429043, + 0.39108128978091694, + 0.7634415289113832, + -0.580003923508597, + -0.032439433071388524, + -0.10071965976784336, + 0.1603316125985363, + 0.17456983641894191, + -0.8613849237797072, + -0.29699409812272026, + 0.5731369273355328, + -0.1520500027386925, + 0.05909243630731953, + 0.5432623652586713, + 0.17356182300604772, + 0.04661288646804107, + -0.058695233773776945, + 0.5388705711717099, + -0.03432661618196664, + -0.0438695397168965, + 0.435789992566915, + -0.4442861948201925, + -0.10287073111184586, + 0.7970044974957637, + 0.6565809664816609, + 0.5968514208442192, + -0.44663146810596605, + 0.7819710248463089, + -0.1997515066966219, + -0.3614352114010335, + -0.3086296339872472, + 0.723978631259194, + 0.19444872965772336, + 0.4733496106441486, + -0.6371167325340061, + 0.014841980082404949, + 0.2677984937260706, + 0.04331605543699796, + 0.6133885847910004, + -0.22305005225793018, + -0.2745235898156789, + 0.515699302626213, + -0.37568722737609744, + -0.26698247327737124, + 0.2406526422274205, + -0.11608795760181823, + 0.35080278698991035, + -0.016863508897994706, + 0.6935453564133557, + 0.1676297714806182, + 0.5799757700151933, + -0.522750167944894, + 0.7054090667451458, + -0.37546966172328866, + -0.026469760720108038, + 0.10787056433448233, + -0.4743894051232097, + -0.420099483921959, + 0.8056301218924594, + -0.14536844420901385, + -0.38986451649881826, + 0.06716226782407736, + 0.13554979445432408, + 0.089107851056627, + 0.09459516727649947, + -0.056603912263020806, + 0.0387883835725627, + -0.5181617043765498, + 0.13923783499444792, + 0.16098308115946952, + -0.19634853886126286, + -0.1645956967369961, + 0.3114794405107624, + 0.49103442835769373, + 0.7641703853961761, + -0.386361028912314, + 0.9244024081675619, + -0.1337918372829694, + -0.7269677184623698, + -0.19384850689511812, + -0.16493416153975604, + 0.12685880795369436, + -0.7161386496177162, + 0.4794954529041431, + -0.5231590035394293, + -0.15184617051448146, + -0.38100489575256696, + -0.37810597530635887, + -0.23845095857572862, + -0.10560103375157215, + 0.1681934566276279, + -0.6131072476884043, + 0.3686147510077459, + -0.32868233719235296, + -0.7013035246054204, + -0.00015278137178653672, + 0.2596517650161792, + -0.289448203108449, + -0.6885138758934479, + 0.26349781097076974, + -0.10228608347355173, + 0.12721391126809906, + -0.17437752366186088, + -0.2059603826043363, + -0.5805532350055269, + -0.3154041345141079, + -0.2266843551178228, + -0.2799116231565094, + 0.1115776664900498, + 0.08219431421092177, + -0.23900309009308962, + 0.05957291399323911, + 0.0528267179245242, + 0.6332672240029189, + -0.36031191615470815, + 0.1411736150265533, + 0.1056007399698527, + -0.508696273811267, + 0.16939477962136085, + 0.07507167906943601, + -0.21034490026652264, + -0.18916362569874823, + -0.24188934604716972, + -0.030905015156292737, + -0.574358460926069, + -0.2898868278421124, + 0.6391955175812538, + 0.3652367535808454, + -0.4753168748609733, + 0.11658784234948, + -0.14515398445673722, + -0.5411004844266107, + 0.15536977120377582, + -0.3328095685045316, + 0.4409148966802848, + 0.1852693844107624, + -0.9448997793993245, + -0.16023534760874314, + 0.7003411636617022 + ], + "rows": 64 + }, + { + "columns": 12, + "description": "Medium tall matrix with deterministic orthonormal columns.", + "id": "orthonormal-96x12", + "rowMajorValues": [ + 0.04963754118397117, + 0.07111531736955277, + -0.10922294219268323, + 0.15926430713902337, + 0.1703065266198891, + 0.12476854303665683, + 0.03632114176977763, + 0.07062270727024998, + 0.18885473514362128, + 0.05636504558602902, + -0.058114000054109854, + -0.01673307242041252, + -0.10313078013653487, + 0.007851179767731834, + 0.03568644370541539, + 0.009224371944939578, + 0.0711742405936581, + 0.008046734207991511, + 0.1078544469102885, + -0.0841099653085352, + -0.16117067847008157, + -0.08083937750714892, + 0.06938121253926477, + -0.16737212463982185, + 0.13911777166338593, + 0.15349805087663476, + 0.19437184533894394, + 0.16178361453120801, + -0.14260596999296454, + -0.07941847020167123, + 0.14226534958233394, + 0.005623970579309549, + -0.016259817748908504, + 0.02270954896278005, + -0.17902716058394483, + 0.01723476446259353, + 0.1179231348071886, + -0.16151289300694888, + 0.032787664941152844, + 0.17206139913699212, + 0.14408588654802623, + 0.0005246383304203379, + 0.18284193833505677, + 0.12020622442843906, + -0.05527213374077502, + 0.0505420533055038, + -0.10602388736109233, + -0.09498774392442355, + 0.018352856000663668, + -0.04081061849852129, + -0.006901311944295156, + -0.14528450806806384, + 0.13851258102952174, + -0.05008704620274327, + -0.10952336801031712, + -0.07189545292667841, + 0.025721757394406332, + 0.128337542192246, + 0.068056277522839, + 0.07238289938631207, + -0.08720469521990833, + -0.1038392555854313, + 0.16449505339993742, + -0.12520934737875847, + -0.09132406085708052, + 0.31380997219990603, + 0.053118876245519364, + 0.013393848154582286, + 0.13964878339002054, + 0.016318057171560606, + 0.20340091544777428, + -0.0446441204736334, + -0.00927916346128844, + -0.028462474109713375, + 0.13579244273123753, + -0.12071564325353168, + 0.0001726897428726433, + 0.008786288997988676, + 0.10942895404606892, + 0.04973368755946881, + -0.1586896270382971, + 0.03630766260329896, + 0.060984979530074125, + -0.0712660144075413, + -0.10595834587490344, + -0.10720766736081931, + -0.03632923832555256, + 0.042508578267033054, + 0.1711252611167127, + -0.10456487431025308, + 0.042951260916282596, + 0.03265883926728351, + -0.1426094550245655, + -0.1365867261513086, + -0.060953434457373015, + 0.06297194867809515, + 0.019118231867419483, + -0.03482045972789649, + -0.05933965154788258, + 0.017188844005204543, + -0.012481639496832992, + 0.08740935435383904, + -0.011560437982645558, + -0.1632122108328864, + 0.2234001443453327, + -0.10570343076931953, + -0.14384270714062386, + -0.0907653511086135, + 0.14994623564050413, + 0.14505141251158682, + 0.10447699011776741, + -0.11248660793187282, + 0.10093328794220872, + -0.16367514603920058, + 0.08765419894332274, + 0.14560091567179423, + -0.006058990650277074, + 0.11737150754400427, + 0.15333737796722796, + -0.09670799224357379, + 0.050976002351865966, + 0.1581712482620797, + -0.10653016746293474, + 0.1523693827466158, + -0.015902243785676458, + -0.02935586171841885, + -0.16744771029449856, + 0.05978092718312333, + -0.1365001523174478, + -0.022568463261324057, + 0.25614146600956433, + 0.07286546185078784, + 0.07332781487405549, + -0.042473144820614914, + -0.10343030163163973, + 0.004575596146201463, + 0.17812864146653992, + 0.13973236059685556, + -0.09218493379206825, + -0.1414481703320644, + -0.10149586820883998, + -0.09499944591339977, + 0.106995403880199, + 0.32499549056937505, + -0.032339697820424305, + -0.0076212369767538184, + 0.07276197958723934, + 0.05659497790255741, + 0.1446240010645817, + 0.0441084528048874, + 0.1395451443889236, + -0.06322517618369539, + 0.14335637088243422, + 0.09709673978831418, + -0.06409726241341838, + -0.037028973040036495, + 0.12759591242912513, + -0.0857520026925655, + -0.007962380452207467, + -0.14277427910205218, + -0.0993762317629248, + -0.06688460339190923, + -0.18108066572690049, + 0.15775164088398658, + 0.06619326911136102, + -0.13845422246384606, + -0.09557222578012765, + -0.0926521913075403, + 0.07399394940168254, + 0.04255330303458985, + -0.07398489422462143, + 0.03651713508155297, + -0.016607117584987913, + -5.656017520720644e-06, + -0.015363782057517572, + -0.0013258974497177187, + 0.1321197443551715, + -0.1864907430029794, + -0.1726716539534058, + 0.17200600912348468, + -0.0346800538354058, + 0.1505944761647782, + -0.08474734519922196, + 0.09209549627587406, + 0.004948519467373703, + 0.16734219359246708, + 0.04371887977945393, + -0.08017533902020557, + 0.026592540513041732, + 0.1361278497770695, + 0.040999663736218384, + 0.014674853612304577, + 0.011779911767919867, + -0.10071603087367205, + 0.0762934917643107, + -0.015804045642231587, + -0.03097616752368059, + -0.11404581764769199, + 0.09724402745145393, + -0.09437806552179588, + -0.09169908645609519, + 0.10811585125820827, + -0.1248207982438683, + -0.07475003812334016, + -0.02408106121256841, + 0.00010539264119328596, + 0.08568496059066132, + -0.07066871827020708, + -0.0011979853036677656, + 0.1466798104264004, + -0.14208343920283203, + 0.15310898594434547, + 0.056519023941116325, + -0.16590362087483765, + -0.003351663347878218, + -0.07785263219393736, + 0.012650769089251987, + 0.04062452572155338, + -0.01717291993700395, + -0.11476980684641919, + -0.05854615809337768, + -0.008999508035309732, + 0.07991840764487333, + -0.01587254322776681, + 0.14794293062430414, + 0.16530914290164606, + 0.10024847920939321, + -0.12379334075257634, + 0.16660942597996456, + 0.0031101646467914796, + 0.12295660916582452, + -0.11718103705234248, + -0.12320357183374775, + 0.07517625039265238, + -0.11614404335945351, + 0.0960446286868888, + -0.09130065757715886, + 0.04395697378780988, + -0.09219848423665886, + -0.04933670048692803, + -0.12861734743969994, + -0.030840292506107172, + -0.13470554579984453, + 0.02044085532023523, + 0.12231039552611056, + 0.09963894324063102, + 0.1197511360066906, + -0.10396491460465325, + -0.14205720815698558, + -0.005553688484474049, + -0.1162300568234071, + 0.04836735632933904, + 0.12377269132177483, + 0.05724254578498919, + 0.06441904813137637, + -0.07426423422053031, + 0.12881849830923128, + -0.15653789996429307, + -0.12857222843365337, + -0.09750298030515668, + 0.12087544349439429, + 0.06960613330099756, + 0.10638540915771919, + -0.0689783864085341, + -0.1548975035970044, + 0.12892443458281827, + 0.07050311208757998, + -0.02273200271132241, + 0.10201361060339253, + -0.026875820350049585, + -0.13605617879976314, + -0.08522218215757105, + 0.08224026673660621, + 0.05511420606642239, + -0.09555160967160994, + -0.14670676889041204, + 0.11203096334109824, + 0.17112542795185903, + 0.09589355802751169, + -0.07092674799518779, + 0.07084362514214326, + 0.11873531089567327, + -0.13679784114926816, + -0.13462422850488584, + -0.08742721389809488, + -0.13556566982390222, + 0.13383841716740372, + -0.04909308045794171, + -0.06779916254751117, + 0.11587229721226229, + 0.08717312142909839, + 0.10085245197161807, + -0.06558966178198818, + -0.055552283121669335, + -0.0737557113233367, + -0.020043536062045026, + -0.16474074347726392, + 0.04760615686805461, + 0.061995364565423296, + -0.12203360912377571, + 0.11601654848749951, + -0.0967429049098054, + 0.14796531632267013, + 0.07679057450826537, + 0.14254409539896662, + -0.08486740910373898, + -0.11273074039494733, + 0.05543475017315774, + -0.007216704212912892, + 0.044036838861120475, + -0.09130762946024244, + -0.12000467702273761, + -0.09815315512006718, + -0.12146292499189591, + 0.13429663576192505, + 0.01452141642648186, + -0.10334848016206256, + 0.11263930026153603, + -0.1684353409693768, + 0.07020226131713067, + 0.05022308617383232, + 0.165497406128677, + 0.006387566224687356, + -0.11059913022622199, + -0.13379176818941388, + -0.07234645988425825, + 0.14153164561658413, + -0.07231091187326018, + -0.19520375338332954, + 0.03458353570891442, + -0.02361762401072483, + 0.07385262298484983, + 0.0013770230532195952, + -0.10863222821436828, + 0.12822962191885695, + -0.037302194100919235, + -0.0073787301187903725, + -0.1656194577750687, + 0.11955544744205152, + 0.0979231147700365, + -0.06571498386264346, + -0.07486667080749242, + 0.08899846895314523, + -0.12936343818682883, + 0.008772516423938646, + -0.02141520791193205, + 0.10855764982901568, + -0.152875080466791, + 0.16556571626398545, + 0.014091294659751062, + 0.13549436284706398, + -0.018242280138225535, + 0.09130170922575537, + -0.0857317389042965, + -0.09606344771694025, + 0.14209475401078842, + -0.09371758903994698, + 0.08816895262823007, + 0.18625748309299614, + -0.00880031671554114, + -0.15496421926231588, + 0.10822371636520382, + -0.07729303138999616, + -0.13185282003609528, + -0.07853216767819358, + 0.01962627205911234, + -0.03592717150319037, + 0.15038146387340248, + 0.08021626782207261, + 0.01357890098977895, + 0.07289686605302129, + -0.00695653843429282, + -0.017508744669335573, + -0.08108795283274056, + 0.020134229810949276, + -0.17917905459593092, + 0.11775956470224387, + 0.13899411430689274, + -0.06178329192762199, + -0.02682298556474065, + 0.03823127156330613, + -0.1487398372271122, + 0.03178591181627508, + -0.06725248929870001, + 0.012429701186833687, + 0.17520237034789699, + 0.034856175900642695, + -0.055723449282898, + -0.020233703515476768, + 0.03246094667231207, + -0.006574395480697354, + 0.19274658473147505, + 0.0029502806804627664, + 0.052469368963429644, + -0.010102634465999315, + -0.14626024472167395, + -0.13642052751852632, + -0.14991639755501937, + 0.05810920809733356, + 0.13580129655187406, + 0.022517049473547032, + -0.1302321582674628, + 0.07822693998741265, + -0.06970487451483273, + 0.1299927127594515, + 0.0737420570076586, + 0.0807026879546073, + 0.09558906647203687, + -0.05471578798732142, + 0.1186103138632314, + 0.14386381322872635, + -0.12556539687599408, + 0.04130357638900195, + -0.11324324512900086, + -0.05629468270547044, + 0.010184455051372809, + 0.13342722874964097, + -0.08493551570125991, + -0.17699565159308356, + -0.054289869223479656, + 0.07450097200381381, + -0.07080691581801196, + -0.0065166384337047335, + -0.09216046157036728, + 0.023392704193754516, + -0.06467495948276353, + 0.07861357483564967, + 0.03722053968898869, + -0.007257409301453771, + -0.03927868322200332, + -0.03951352017935628, + 0.04789448422728858, + 0.1313527972877317, + -0.13714549445147067, + 0.11321153881265336, + -0.001942261833887238, + 0.16044540570003363, + -0.014887814803694407, + -0.07149764436937374, + 0.037185223394074575, + -0.012805270984011219, + -0.15379258335592483, + -0.037195239534251336, + -0.04801486661416297, + -0.03237667173781599, + 0.11437808682762994, + -0.10981521093528644, + 0.18040326623486283, + 0.04302193800262963, + -0.15315468900528167, + 0.16370860387485403, + -0.038367706018458285, + -0.12090610099867893, + 0.028422399490788487, + 0.025598507114329948, + -0.06176446156924918, + -0.149535211119527, + -0.07204325029451791, + -0.07786243601083685, + 0.05578773429777249, + -0.025225557907047412, + -0.001602232757738566, + 0.04444896375163666, + 0.006806868486363173, + 0.03160736346186515, + -0.12187522943652175, + -0.03046853458785493, + -0.13349459876454212, + -0.11666954965266028, + 0.15181564332991032, + 0.21103469540630904, + 0.03996522849480013, + -0.14445240612176674, + -0.031310019524951604, + -0.056575905380198147, + -0.1086344878902292, + 0.08006149924669595, + -0.032736716900597165, + 0.09730443087128592, + 0.1946711511894386, + 0.002085385848312641, + -0.07140974772224987, + -0.17825212506740687, + 0.15364202489686105, + -0.1409551101500008, + -0.08181399369562131, + -0.018988800079745804, + -0.002781561983106591, + 0.1102400621584734, + 0.04082970730277281, + 0.010204538467491815, + -0.12708311784590734, + -0.15006492584734996, + 0.1431214541433302, + 0.2140128108478067, + 0.17068225551997024, + 0.028339882866307668, + 0.11055595644770959, + 0.04845380403797173, + 0.14924015549004102, + -0.06984993542181218, + 0.014731786852235284, + 0.1060969730757145, + -0.0049444921218947105, + -0.03169360654125269, + 0.04670641501487234, + 0.10282619310311429, + 0.1622599925267464, + -0.13187221924507747, + -0.1236682022068947, + -0.028875739571213914, + 0.20642508237601764, + -0.004175136871774715, + -0.1347342303467911, + -0.028105569107680466, + 0.06753611571441771, + -0.01713937123150138, + 0.04327558715893551, + 0.02857621604961493, + 0.015857778165511538, + -0.16083228323992013, + 0.14100586792609138, + 0.0602609968320706, + 0.13240051864070831, + -0.1600356760756402, + -0.019380599832067583, + -0.088491194418017, + -0.0012438035861777356, + -0.043461845839048496, + -0.08018820550676942, + -0.049259241655674454, + -0.11885870499785924, + 0.013428470667078357, + 0.03880431940153417, + 0.09089294770991259, + 0.0918265907651029, + 0.06346750765471718, + 0.09970235080815786, + -0.14449568084275297, + -0.13307457096544767, + 0.16788539979505274, + 0.15123110275557244, + -0.01566338345953535, + 0.0013914068343777331, + 0.01185158799638213, + 0.034059849215807125, + -0.13001130667394012, + -0.02393277230104372, + -0.11936461128402466, + 0.08754723606724865, + -0.06448871581836697, + -0.10727519763776683, + -0.13050466981370837, + 0.0007982807120315374, + -0.16242591164031986, + -0.15342309320615613, + -0.07217834258039638, + 0.08733038409194299, + -0.154478955224301, + -0.10632369829358447, + 0.03248941243122522, + 0.052482089475892446, + -0.03515947366060698, + -0.061333557119370614, + 0.053779149435234916, + 0.11775702226493384, + 0.06110063128745734, + 0.0865266207622682, + 0.048439731350128884, + -0.128765204193293, + -0.12444406342688283, + -0.10927149182314794, + 0.16422701288378008, + -0.06079650397484523, + -0.02938250987256765, + -0.10234119533711195, + -0.07269879071383471, + 0.020583603836280207, + -0.06089257511657306, + 0.004640802035058586, + -0.14222481676292645, + -0.008991982140682156, + -0.08956709496469624, + -0.05255407155899945, + -0.06335320151967185, + 0.21485272739807695, + -0.04548599862501014, + 0.18420963577827382, + -0.15021160025968464, + -0.05269970516574284, + -0.05337517951341097, + -0.00990371377357906, + 0.11948423140780261, + 0.08308952351157789, + -0.12480060410988568, + 0.08843504530931041, + -0.04814105323085492, + 0.047163385706914134, + 0.08824521986411474, + -0.0815137357705085, + 0.12914026679384738, + -0.11977615229368567, + 0.09706483957059317, + 0.050687741469933406, + 0.009153168405376116, + 0.16581580347049707, + 0.023132308519728584, + 0.09962971798842428, + -0.10247378796573202, + 0.06778584805828591, + -0.09513395047757531, + -0.07004445193031271, + 0.14650541560244884, + 0.06485292527038028, + 0.10850708438174164, + -0.07531527148899288, + 0.10196810321339361, + 0.056144319060106467, + -0.06155087531807414, + 0.05892542968176651, + 0.13794583499030413, + 0.10206409355764975, + -0.08162945417250908, + 0.10481251214210144, + 0.10327394653945594, + -0.0670167084739679, + -0.14069683127630572, + 0.1462765380055701, + -0.1328767986770798, + -0.12523653224422293, + -0.06097848490161272, + -0.03288116874330236, + 0.02035373610278987, + 0.16173257704163221, + -0.12280214731721946, + -0.10623001157586963, + 0.07643356866769896, + -0.05530894388222265, + 0.09999058648312543, + 0.09793705926507558, + 0.14540364062193092, + -0.1062853197939706, + 0.004711044023235896, + -0.047943701517876636, + 0.028761927860550034, + -0.062239269817300186, + 0.014373026800447128, + 0.12658725322608594, + -0.10660013745916368, + 0.06456945902265303, + 0.03331252919537003, + 0.17128898103217027, + -0.13411359326221126, + 0.062193031441772004, + -0.05697152010580142, + 0.027185936628854233, + -0.10891723201341882, + -0.03637795392923547, + 0.06815524348201747, + 0.03725930857534553, + 0.08380031465160424, + -0.13627006363177613, + 0.0957389581230357, + 0.034435590365652344, + 0.009418613071801802, + -0.11232057399987827, + 0.03476456606910197, + 0.0046730817330710795, + -0.07226047031040961, + 0.06661662200952904, + 0.15233832032091396, + 0.09528940613054288, + -0.126241405197132, + -0.0777769344230908, + 0.09170781794522996, + 0.1088294348615114, + 0.01370606477140728, + 0.049923252366105376, + -0.05955568938224327, + -0.07103130814521744, + -0.03071850709127516, + -0.1692603999649993, + -0.05548992042872836, + -0.15690018268653466, + 0.14456170994248263, + -0.09051215332192983, + -0.03910184785417319, + 0.014837837826067712, + -0.11769739828694896, + -0.08232096364986807, + 0.15690046007551092, + -0.15791603332812382, + 0.17785625327738447, + -0.015234738129872277, + 0.10788936562481789, + 0.012667312081614911, + -0.12325828145544468, + -0.012087689363247736, + -0.09986922218384266, + -0.0237397262763243, + 0.09959853949638012, + -0.11168225664846429, + -0.10609061528151034, + -0.11223760832060496, + -0.2026697079272964, + -0.04471845982117688, + 0.07679023742743722, + -0.10725200068333263, + -0.14734595701161765, + 0.10407700925982862, + -0.05208312032423205, + -0.166746879565131, + 0.13827622580845084, + -0.031099738470307378, + 0.11652005136036249, + 0.08543398160329935, + 0.12620883968341978, + 0.07723427777970332, + 0.006806819652588059, + 0.08072717996910142, + -0.06170920179052212, + 0.060663101568988846, + 0.13200653547155494, + -0.13396239699528248, + 0.10877650192297623, + -0.17592281491200124, + -0.016995849829354637, + 0.14174456638739613, + 0.07479654305910215, + -0.020169445630551952, + -0.06682444535357776, + 0.07915788544676951, + 0.1064153932669556, + 0.11858197263697717, + -0.09872494726729501, + 0.02151781947596073, + -0.04712780759349156, + 0.020105994740570916, + 0.18334387224670692, + 0.10910094715409438, + -0.09950405928856951, + -0.10137338398593042, + 0.06568910399941315, + -0.11335794377228747, + -0.14395529892729586, + -0.1293054131735239, + 0.0035790276954735982, + 0.06228946812651477, + 0.0065068497952759, + 0.09124665285347822, + -0.017840274151566995, + 0.0446034573172168, + 0.03473152183406625, + 0.16512500850382006, + 0.11790355888915889, + -0.16347159373335404, + -0.11207883899435338, + -0.12609401837041226, + 0.023192125868921967, + 0.013098738193086592, + 0.15520631689346318, + -0.09410106063324865, + 0.07845142308850446, + 0.06966356254057446, + 0.039093979400769086, + 0.01636135110271919, + -0.028927625417978206, + 0.07505749565027905, + 0.029231036752108065, + -0.09479891483931857, + 0.004303253982112376, + -0.04130644542022476, + -0.14954003788900896, + -0.06540038531967968, + 0.003988297252416595, + -0.06570912148296677, + 0.009342379834617333, + -0.06549637109385649, + 0.13547895144291383, + 0.15284540819781503, + 0.09049688609584343, + 0.09908315527527321, + -0.04347286377387035, + -0.096496381743851, + 0.07524158699336138, + 0.13246103436298096, + -0.07564201215376415, + -0.16314900110496122, + -0.07658118364365966, + -0.03961249110592939, + -0.045664749004942926, + 0.027408578121686216, + 0.11916250186300263, + -0.10720101076532199, + -0.12298197488778297, + 0.016284702243405114, + -0.052084998255260924, + -0.0507411738249912, + -0.10793972781705162, + 0.030617824350214446, + 0.16106941998772334, + 0.16568880144919498, + 0.2008665239269684, + -0.11339020436023606, + 0.10364951167384034, + 0.04282235367764142, + -0.06368564625160573, + 0.11725574852425627, + -0.13813932605645382, + 0.06744342845032271, + -0.04938429030428548, + 0.09081804313117928, + 0.15174678734239722, + -0.013562188317919988, + -0.15755409617767374, + 0.0880896466884721, + -0.1578011550130444, + 0.019064290559062724, + 0.14805541928217855, + 0.14182930301858465, + 0.08502638731409498, + 0.0010542300917673504, + -0.1580450246585537, + -0.1605784679295817, + -0.15508136362342212, + 0.13865500085939955, + -0.08027554299533192, + -0.15182043808449672, + -0.07373575589018934, + 0.082410788120744, + 0.10249064511013882, + 0.06820773702332106, + -0.17530181665126413, + -0.15075021638097036, + -0.18958269165936467, + -0.035755430567822356, + -0.10930115580371934, + -0.0999371474216151, + -0.20086649758604277, + 0.06724900842013154, + -0.16394862748776515, + 0.15355499061692846, + 0.0049193715760609555, + -0.1468588693444273, + 0.11264347331557861, + -0.03547886886266978, + 0.13429120341125003, + 0.049152446803835334, + -0.11217758526825618, + 0.12019978522707876, + -0.16979568152730218, + 0.027945192764328525, + 0.07032034186572904, + 0.04270920783305452, + 0.12368574377537524, + -0.12379474210897898, + 0.04395330798589296, + 0.10017868760499478, + -0.03845389933158509, + -0.14236329702112954, + 0.10078769495974477, + 0.13102917626966157, + -0.08933365799562537, + 0.110263454103431, + -0.14530189059818455, + -0.014153097012462437, + -0.14878538387666054, + 0.014975504338323127, + -0.026995889032419635, + -0.13387782312067106, + -0.09051105964073371, + 0.14705288858220233, + 0.03270965915258297, + 0.09416854152445761, + -0.005986964637083027, + 0.10299479509542324, + 0.14243462113207908, + -0.1669684179244044, + 0.05493434037447726, + 0.09708704956485756, + 0.002807372380272128, + 0.09506316121939944, + -0.0774565060963991, + -0.10891038159792277, + 0.061014452559164364, + -0.09067999875324156, + 0.10138706983975648, + -0.11934569029743672, + 0.15214181794187112, + 0.14960265751296237, + -0.15967495599963094, + 0.14447073794627402, + 0.0989535316056229, + 0.07076807226228946, + -0.10280356959782928, + 0.14998929171742925, + -0.024159061783956864, + 0.12323073240126678, + 0.14149703575216124, + 0.16122220817160493, + -0.07091504282535088, + -0.15193422446175303, + -0.12910385494794482, + -0.16740004059990216, + -0.1088880449084419, + -0.1885354793112455, + 0.053995213181968135, + 0.09191355707979704, + -0.044082488165218245, + -0.12480930508536368, + -0.0002612789909657206, + 0.07418769950287384, + 0.08497146321947895, + 0.12086746500534276, + 0.10839209117929371, + 0.07396632797757806, + -0.13490392872663992, + -0.04808855121871031, + 0.1188689187970605, + -0.13138425783089158, + 0.0315459167449282, + -0.03868394240152966, + 0.052762993302673186, + -0.04463218153340015, + 0.13380555334213834, + -0.03260284186640129, + 0.05530003609608758, + -0.14094275533570208, + 0.0012139042397016065, + 0.07405972697377365, + 0.2148633342467063, + 0.038292214930753236, + -0.12721814318666053, + -0.017865371534866028, + 0.025583854656502238, + 0.038623997027451014, + 0.08480924967653146, + -0.05440421546837867, + -0.184518369967534, + 0.0850318235899729, + -0.07350943650321154, + 0.0504636410903153, + -0.10770055575517155, + 0.01241695853107526, + -0.03912949205214941, + 0.10082292456288391, + 0.016821775964267337, + -0.13137177510797007, + 0.1501895779818634, + 0.016160738954126695, + 0.10976161987459938, + -0.005323323017530248, + -0.1015470986077874, + 0.191075355264101, + 0.16921708851633777, + -0.03212847263236781, + -0.004050766507120263, + -0.14743232676860055, + 0.035153132431681854, + 0.04816953189498236, + 0.01975174287063375, + -0.12078868253565765, + 0.11845947022293553, + 0.12219112378984281, + 0.17347349015457333, + 0.13264513001416883, + -0.12498270132982842, + -0.11813770178077297, + -0.06264651321718885, + 0.06949724076321905, + -0.11464705238766508, + 0.13616299414054578, + 0.01831944107925346, + -0.12963607297760274, + -0.001994466300257887, + 0.006138382988201472, + 0.0012021789638821019, + 0.10575412052073713, + -0.029384632378627974, + 0.014715758005451763, + -0.1600153860562191, + 0.14652116732548376, + -0.0697634081722607, + 0.05994013483140333, + -0.02458548816086181, + -0.16964775382698064, + 0.14561630971176318, + 0.11642590500800588, + 0.05280595171353744, + -0.06407774615476386, + -0.14402567045602488, + 0.19376048236391555, + 0.04871944601214176, + -0.16508757559436407, + 0.09198097622263025, + 0.053209101096161684, + -0.013300960987872132, + -0.11891446458979586, + 0.07385133255048099, + -0.10978532171768489, + -0.09161869866279032, + 0.03922723588504067, + 0.05364865626897309, + 0.16157957328049743, + -0.0532865240146569, + 0.15823179930482353, + -0.034811965651461656, + 0.07849303944820271, + 0.1148246951968363, + -0.1619159777338375, + -0.13906730489662625, + -0.026601884206263145, + -0.1337756240726217, + 0.10756302607831872, + 0.0016136035599120045, + 0.07820512606107842, + -0.14569003340957304, + -0.014995323448920668, + -0.10858590095491602, + 0.030234236330525726, + -0.016876576007034027, + -0.09242787991634813, + 0.01929198750228654, + 0.14747207815875604, + 0.033182719217359005, + 0.17921026523957762, + -0.015666304835677367, + 0.1311584203087411, + 0.0028706534001116707, + 0.07194931534666593, + -0.06558062035116385, + 0.15711573966104608, + 0.04243872254565495, + 0.1697301202528706, + -0.1070014593226356, + -0.016126764497831757, + -0.039669513606131517, + 0.15983022193322455, + 0.036700273651856755, + -0.051491549596056355, + -0.09847294309064293, + -0.10245905174408602, + -0.03632268345823644, + -0.10568596561757863, + -0.09652884304266701, + -0.1140188405412004, + 0.06429401648998322, + 0.08606381662466618, + 0.06958737298277147, + 0.029654792408944797, + -0.11938758780295981, + 0.13080788121797873, + -0.010383163159840933, + 0.07402795176337895, + -0.007157950804459328, + 0.14350824832702583, + 0.09104315716650284, + -0.16601799899843117, + -0.07418798634887382, + -0.13499594555149966, + -0.08420914687909932, + -0.10669056946909092, + -0.12926504579144069, + -0.05545491668958459, + -0.12192087272468362, + 0.08824870027088287, + 0.0011120971193031661, + -0.009413823300759166, + 0.012337250645858415, + -0.1191360934025352, + 0.11107944471917995, + -0.04872329110503268, + -0.07438531131252098, + 0.021081185032964085, + 0.026152103677055397, + -0.20757495128905543, + -0.07172981541343505, + 0.09176675018224349, + -0.18098301425411192, + 0.01313083071853546, + 0.14226546537519322, + 0.0550282216687657, + 0.013399582627524904, + -0.0008558772395034308, + 0.08638406740315194, + -0.0840847358646957, + 0.03419565563431322, + 0.13974667061452328, + -0.07697741483935568, + 0.10896923360181371, + -0.14060329452254713, + -0.09431380082823311, + 0.06859439707131595, + -0.0006027496872883805, + 0.07976688583315858, + 0.14227729240336218, + -0.0029627282272644525, + 0.009392987252637432, + 0.14235797018162852, + -0.07916904915911592, + 0.10406355590439974, + 0.13921098696815304, + 0.08817513803067459, + 0.04689702815092707, + 0.15851761655559357, + -0.01109356673242745, + -0.07039831831225098, + -0.0965283130358139, + 0.04377963101445694, + -0.07496331866992749, + -0.1345648266025866, + -0.029315710038459793, + -0.13243031688770812, + -0.02174309975052004, + 0.0005423700739894976, + -0.04866238401740036, + 0.005677423238739452, + 0.011977920032127212, + 0.06726563014023544, + -0.05375204069492111, + -0.17088903710105452, + -0.12173623413849513, + -0.11277924877322938, + -0.1064083117749228, + -0.05903112213344723, + 0.060002717946825074, + -0.10977840091073932, + 0.11595974008710304, + 0.03114130212129949, + -0.05449613767071212, + -0.028149625103243602, + -0.10394747646251522, + 0.08832717214141214, + -0.1262127233133951, + 0.09818207246534144, + -0.08827991850303425, + -0.16664856009873272, + -0.0923032877002097, + 0.13578302360664574, + -0.017726235542798254, + 0.02195624166120329, + -0.0062200337680348985, + -0.16284378062765628, + 0.1370379553907945, + 0.1742368530510547, + 0.016581324269561923, + -0.0391641044245109, + 0.13938065212125617, + 0.10451700569338565, + -0.23117067469026692, + -0.09599321028698556, + -0.12456304077649523 + ], + "rows": 96 + }, + { + "columns": 16, + "description": "Larger full-rank Gaussian-like tall matrix for timing and profiling.", + "id": "gaussian-192x16", + "rowMajorValues": [ + 0.6114856063278942, + 0.41534750992970326, + -0.2606627297890797, + -0.10919620855854678, + 0.39382447389538244, + 0.2014521923411005, + 0.6245572290702202, + -0.3281706296038504, + -0.5615250802422521, + 0.6481105327399642, + 0.347762024158528, + -0.15190840155408347, + 0.3189162859629791, + -0.20890963965218678, + -0.29101699113106205, + 0.5167823401969337, + 0.6728059700130572, + 0.3469887893921222, + -0.5980568750747451, + 0.5626165106931651, + 0.027642271612812408, + -0.469491513814427, + -0.8912859551469271, + 0.5007643796300768, + 0.22865894238981882, + 0.47686001348545104, + -0.3398880422915008, + -0.33799095143814967, + -0.6703700683694018, + 0.39884484327483294, + -0.4538774060240326, + -0.24928304037746274, + 0.501135958314047, + -0.1670553778984909, + 1.216978310154051, + -0.04674083165108878, + -0.5235089847234926, + 0.23680851604386915, + -0.6778351891905364, + -0.10645273252751913, + -0.06035527673882879, + -0.5665369998329182, + -0.32389665740860585, + 0.7456830467121139, + 0.23893703643437197, + 0.9006492724097382, + 0.21467535515783948, + 0.3067839168188586, + 0.3115800297397108, + 0.3946654841225354, + 0.14866852996955665, + 1.0230914530727195, + 0.11994568275469819, + -0.16409195361153017, + 0.5133120087525085, + -0.3326612997207915, + 0.3124404625605925, + 0.43688318771022355, + 0.11291932591312642, + -0.027780358266660532, + -0.2854877149187761, + 0.5704224370768702, + 0.6115031176092166, + -0.04106608021776825, + -0.7612482765622867, + 0.3512704567405516, + -0.02230226367023147, + 0.3932698941965166, + 0.32947919364996603, + -0.0505817413337305, + 0.23620447301617598, + 0.66222376272716, + 0.14053878053955282, + -0.5352121475137319, + 0.13493764576229927, + -0.2562479903499669, + 0.5794063054989389, + 0.020105273316527394, + -0.20157474074169923, + -0.3939749060425962, + 0.429346555935869, + 0.34445814489853166, + 0.07853061419008567, + -0.5325658221845795, + -0.004821895774077323, + 1.287762804636568, + 0.2100849300694288, + 0.3721279041414395, + 0.5547030899577293, + -0.35023315286874, + 0.5293279552462684, + 0.3048867733366094, + -0.0602135913190982, + -0.42140103581430566, + -0.44543567155887415, + -0.31137150549064496, + -0.7047999336866596, + 0.14302334190324312, + 0.1569772188290129, + -0.060435315383871535, + 0.539233581378993, + -0.07455427317210434, + 0.9380650358033993, + 0.38636928599895726, + -0.3412167546236315, + -0.6297013619795306, + 0.14754773184672149, + 0.0723798324867373, + 0.12451822036891119, + -0.2906389370606738, + 0.4053408267293514, + 0.6986279177207927, + 0.5691497353876509, + -0.6010387480759187, + -0.7497693996511472, + 0.3070145453368302, + 0.061944349991242875, + 0.7121987763871154, + -0.30473578579746297, + 1.4244250452569234, + -0.34990986761457216, + 0.2105936344223477, + 0.7655535445557163, + 0.5365684372884368, + 0.04228583641000305, + -0.2690733931343776, + -0.44221060187750266, + 0.2194649636637515, + -0.27405862049656315, + -0.13106204319199466, + -0.06971987468767554, + -0.6817336152429047, + 0.12339018300018567, + -0.057326466405769716, + 0.0729204761106661, + 0.4945358631546659, + 1.3527807348504282, + -0.6197580666446998, + 0.02921632625311199, + -0.5243668857966386, + 0.29437000862322443, + 0.2589180645487326, + -0.37695945918444007, + 0.5579271772937436, + 0.00034249450888718114, + 0.20670268873401043, + 0.04027508047604045, + -0.6544891998838367, + 0.2713563785215057, + 0.4366406113163438, + -0.40884672819711015, + 0.2048201041372188, + -0.36237290673503975, + 0.6513894791707212, + 0.415101173786332, + 0.1593099272487064, + -0.13637425698770744, + -0.30759516566767353, + 0.20798383275293947, + 0.4014239701148892, + 0.6545469005058019, + 0.7738143452305787, + -0.5679149814182096, + 0.4826904948580767, + -0.21648845663936267, + -0.039044903325798686, + -0.030769693925718544, + 0.5036156645491079, + -0.5035355577052183, + 0.08796351188571849, + 0.15044407321339526, + -0.09577956681982225, + 0.43262256716007835, + -0.2782301132425299, + -0.5906994628203757, + 0.0577418995644704, + -0.6831230870407924, + 0.007851558079542409, + 0.061975181166556925, + 0.7302008636020964, + 0.19926287724913716, + -0.5461557388052418, + -0.5316378804437074, + -0.8761854542532198, + -0.4154643094005627, + -0.19173494671102614, + -0.20017017732984294, + 0.7785335639744615, + -0.6336674013591501, + 0.23953801874824204, + -0.05577467059943386, + -0.2926822417346562, + 0.1337111407524722, + -0.27092749737020083, + 0.43998720835220906, + -0.06201530076316547, + 0.07413502714178466, + 0.7913704447232055, + -0.701779885028172, + -0.2459979587218899, + -0.16112871898265235, + -0.2609569451568283, + -0.2602526996773119, + -0.5607794549903702, + 1.1271734212862168, + 0.18991706231852978, + 0.1035687609591805, + -0.2788851997053511, + 0.14648788677384805, + -0.6417124909556864, + -0.1827127794241905, + 0.23930556803654301, + -0.0030595440896480364, + -0.13478110663210457, + 0.4045455820399116, + -0.5427406972225817, + 0.3257653442002963, + -0.2140382935925642, + 0.005870099865741885, + 0.020710832341921726, + 0.3726346511407078, + 0.7971002655734425, + -0.08629604755408365, + 0.47023430661725085, + -0.27444399837961136, + 0.36050441200384753, + -0.3655847677785296, + 0.5180312736979953, + -0.7325688552300229, + -0.4797427932483987, + 0.031389149740889355, + 0.10653492422444821, + 0.7653309337832583, + 0.062169279803210686, + 0.01158243102823564, + 0.6793039274773354, + 0.21813894894292524, + 0.2666749387787791, + 0.8453928811478282, + 0.17644156683235396, + 0.06256691600517456, + -0.6792965496091479, + 0.6420417321146975, + 0.012805706196399314, + 0.7395433237740809, + 0.4296099248425517, + 0.2776919696531063, + -0.3964619407842728, + 0.22603900617550504, + 0.7834737562470245, + -0.6000579424533088, + -0.16676119696352976, + 0.13021011096820861, + -0.541220666728015, + 0.10849950475008874, + 1.2258322293817256, + 0.6430234524537801, + 0.899895403476963, + -0.25549085915984016, + 0.47203424635877844, + 0.19276879971376315, + -0.7357113403613281, + 0.44409180907198936, + 0.39615246089675993, + 0.2770676830589233, + 0.1554273616735729, + -0.19505607993243157, + 0.32386954771105714, + 0.6474427450687477, + 0.18594659598804264, + 0.022808837300379248, + -0.009088152632035884, + 0.290522891875929, + -0.48858647486247025, + 0.00510772984382224, + 0.3341547720532577, + 0.20160832575761672, + -0.4562849480215214, + 0.2920091076224808, + -0.6925822907965171, + 0.4312102096794863, + 0.04441900897256018, + 0.5616199664394306, + -0.3410572860893898, + -0.39081008625291874, + -0.3071284826262766, + 0.15634296864709796, + -0.4205916778687468, + 0.7941536455982666, + -0.10081328738337164, + -0.6092925377196228, + -0.7817868131073057, + -0.1695156678321038, + -0.6672292912479458, + 0.41323992607575366, + -0.06282923493857429, + 0.006011897017813683, + 0.441670521162734, + 0.41818258685587784, + 0.18451872649764445, + -0.1956929989010786, + -0.47036733453635143, + -0.12626310643768013, + 0.05118382173303582, + -0.6995732415558091, + -0.10846177863402046, + -0.27796090943308316, + -0.4296907326489111, + -0.4110877875710204, + -0.5196948492144517, + -0.26554540891884815, + -0.10451213380899116, + 0.5757282109247597, + 0.6958293845265534, + 0.06709092631018954, + -0.5323734139901108, + -0.06528806453876407, + 0.43419937389158947, + 0.6384088917604487, + -0.48234037350495257, + -0.428954656553318, + 0.4458511124812241, + -0.06541027939622357, + -0.3779745008087875, + -0.06084876587594068, + 0.3733296766726387, + -0.2428272854757122, + 0.8751136541674213, + -0.018381953692036768, + 0.20664765572892735, + -0.1744087781773917, + -0.6427120252320586, + -0.47905622539846765, + -0.005650073389554089, + -0.13656792497650405, + 0.16121422874214625, + -0.1222630762199407, + 0.6912384942589836, + 0.14374992762349453, + -0.12250155089810633, + 0.2559780188960014, + 0.21042192282638744, + 0.4599571412222385, + 0.06811129738351152, + 0.4130080994553031, + 0.7390335219434588, + 0.05995418690120602, + 0.12709374926679223, + -0.14067646471572315, + -0.23657584290565514, + 0.30718559264392825, + -0.4149381111026237, + -0.27470446750338484, + 0.018153494398148673, + 0.14652138362882167, + -0.843660907556605, + 0.49564741082830877, + -0.42283722497506243, + -0.13425874633322465, + -0.31998575043586586, + 0.366486126581189, + 0.7335588880096349, + -0.038695659302729446, + -0.21193732275033506, + 0.37274302405038684, + 0.15863055479628901, + -0.03896413860398523, + 0.027165725077703873, + -0.23609770434594757, + -0.6443292256311701, + -0.11923416861928415, + -0.2198446070006772, + -0.061472572417872295, + 0.6357241617244783, + 0.10337593752656776, + -0.7071928415196171, + 0.33550275168163285, + -0.04369676035560116, + 0.044608054316146784, + -0.9039408471373958, + -0.3204706989542647, + -0.12507515336519948, + 0.07747006124661854, + -0.1552137116611405, + 0.17171509941966911, + 0.6189682724724105, + 0.001648114897265851, + -0.199022694366497, + 0.2273168636252348, + -0.4799768655870778, + -0.6313456133807063, + -0.4238896854878458, + -0.12241663821596893, + 0.547710906731543, + 0.25605896174447323, + -0.03640650171174886, + 0.43725428373460384, + -0.2982261037170081, + -0.561723986983635, + -0.7006865492822701, + -0.5413601832627728, + -0.09866526288386301, + 0.12359785142447444, + -0.7695687522497349, + 0.5301759898889395, + 0.5571545152777316, + -0.48375519893539914, + 0.3439889037074742, + 0.2512735026776019, + -0.003064274287643498, + -0.16222874214525096, + -0.07862466474275792, + 0.5007808723340209, + 0.5344156390335049, + 0.16353442920212596, + 0.04407630822073144, + 0.062117444142439415, + -0.6731745131743132, + 0.4147862048398445, + 0.039057960456568064, + 0.015522669188843763, + -0.2848887325386725, + 0.09013290732884927, + 0.20285520498702886, + -0.8901369367895902, + -0.2150560248990293, + 0.11236328094817144, + -0.03946261516432886, + 0.16625885380492544, + 0.025522645012751644, + -0.6866385958282422, + -0.15912732409339392, + 0.27568337431301715, + -0.42851429148085185, + 0.11978609544970104, + 0.2557145553244065, + -0.0673319182546071, + 0.20609861817752523, + 0.42634810387257793, + 0.03397874614233509, + -0.21614358876108208, + -0.5935566668521646, + 0.11368565229667854, + 0.5219939288870518, + 0.2552057162360904, + -0.27252622148209954, + -0.7644891150579693, + -0.09599337278792436, + -0.02902309506078865, + -0.09714251943414787, + 0.22475605614118993, + -0.19245158234806414, + 0.44988813014015683, + -0.5459551600375734, + 0.03791891111163076, + 0.30216630827598845, + -0.520922480683996, + 0.19750248167476475, + 0.5036201201451365, + -0.41505495839278583, + -0.4747706195432543, + -0.2702647037499617, + 0.06311873875068502, + -0.10633059533120715, + -0.7561990404992116, + 0.17928358215349327, + -0.13184018015011223, + -0.1984224878782459, + 0.008948468043778413, + -0.3357915296667864, + -0.18182472059712007, + -0.31977945666757435, + 0.2622209932033792, + -0.13747714489500917, + -0.5214528693653917, + 0.7420845745305793, + -0.6236282692861628, + -0.2998503977830491, + -0.03195809136644495, + -0.04645409583997395, + -0.46524612946362404, + -0.4076819745130248, + 0.23870559830396432, + -0.24054148824522492, + 0.3125229720515282, + 0.012078625128274678, + 0.6746871837654829, + 0.7268328443676414, + 0.0005817912943449355, + -0.18897909128833734, + -0.6172479768923576, + -0.16538324659375825, + 0.054473701249859174, + -0.10677324792104315, + -0.27358197678230456, + -0.6894241901344846, + -0.05512304900888393, + 0.027350122342421013, + 0.5908608870058298, + -0.1224289539418667, + 0.1683673509623988, + -0.0019380641978949953, + 0.03230080904861238, + -0.6463870167937069, + -0.5323817019671713, + 0.38147615510822686, + 0.509711622256516, + 0.1557331203423063, + 0.5353845506171984, + 0.0928306747112344, + 0.8542427019414489, + 0.8278453320429383, + 0.3866834542285651, + -0.24065422850021578, + -0.3530294935877897, + -0.3049067607344424, + -0.7284685381623176, + -0.20625348405158106, + 0.21990550425659644, + 0.5650049051346363, + -0.3790747105853683, + -0.2537029069958727, + 0.08587487457537335, + 0.41674842961690783, + 0.006259830564926683, + -0.38905104624392484, + 0.021933671912391595, + -0.47536762520558046, + -0.11914360170722371, + -0.20759347142250173, + 0.04367746427358532, + -0.38670941543135007, + -0.38668422282503573, + -0.5651697626750931, + 0.0817365597424044, + -0.5471150547222794, + 0.6041152036568302, + 0.7587540272492644, + 0.6952230515771974, + -0.39435901944564267, + 0.34261443133398034, + 0.36853188693850764, + 0.6580226876140961, + -0.5493251640334713, + -0.27117539499349663, + -0.5063561052073982, + -0.38098190090607736, + -0.48021292476249294, + 0.5630993225334705, + -0.5049025293469187, + 0.2301907359804189, + 0.6756856063092944, + 0.3190280051212645, + 0.21952465419064704, + 0.416566917236547, + 0.5532897458648502, + -0.7877810398033385, + -0.26131658408127834, + -0.3967118803273553, + 0.42477861633219494, + 0.461348179491461, + 0.2636631361697793, + -0.7747651603283435, + 0.332134388529124, + 0.7765882789467093, + 0.4051253214666426, + 0.18330334762942913, + 0.6499349121428427, + 0.4596118045780576, + 0.007295161364677505, + 0.7092101321190032, + -0.5417524711538271, + -0.580650414923596, + 0.23678339445473778, + 0.37781295389383807, + 0.02092879020298344, + 0.3831665306965823, + -0.1722521802772513, + 0.3910217906828358, + -0.4144582067179854, + -0.05854368054165726, + -0.14130273371819324, + -0.7937924184032167, + 0.43014822725220925, + 0.6937382738950952, + 0.2346564655485069, + 0.596280041658259, + 0.8064362578458489, + -0.16467664991626652, + 0.2964175376487526, + 0.07462481678202754, + -0.19188573537983244, + 0.2036839085202084, + 0.3236331281314431, + 0.5455902292673875, + -0.7498236729045106, + -0.021230375882775265, + 0.7791989693630325, + 0.0020686028146411073, + -0.24894369372977088, + 0.22413876823940881, + 0.057332088193897124, + 0.95869887104179, + 0.05769740138215479, + 0.7436728448043685, + 0.2742882700506036, + 0.09474651875151718, + -0.7768768707269657, + -0.3364106918878506, + 0.7035528894384139, + -0.34438702742056876, + -0.2260103360079745, + 0.6760113927675443, + 0.09756793535758046, + -0.5258431235607439, + -0.045799786486183436, + 0.25456894387639917, + -0.01842895773297215, + -0.23355977583395493, + 0.15667736232245405, + -0.33926401582460886, + -0.5184234346082139, + -0.11034251875853335, + 0.5786127742928621, + 0.23722946694155334, + 0.06004213328789987, + 0.01477845126258015, + -0.09242503153883364, + -0.1650574500299884, + 0.12266552807234865, + -0.3931029898157657, + -0.48102937291605924, + -0.06776846534716596, + -0.5186640204823143, + -0.16261234087790705, + 0.3610745845172759, + -0.3251414692145673, + -0.5564782542765359, + 0.5783382889452372, + 0.581805728071006, + -0.08952444478348082, + 0.3267738602309972, + -0.43564280118883375, + 0.17810390678339288, + -0.1250427886099751, + -0.4357632393335838, + -0.9100997045012985, + 0.666215917188932, + 0.13240882524956393, + 0.45371372220127415, + 0.22778398767266267, + -0.9341780197114171, + 0.07982886643480441, + 0.7432830827319078, + -0.2427575166348862, + -0.6377909577504692, + -0.29625396475860366, + -0.6024944143796338, + -0.48814465822166836, + -0.06005913846760286, + -0.5599866440112475, + -0.7020798624672646, + 0.6351610013013167, + 0.0005902633395499235, + -0.003821765710114444, + -0.4922278217229213, + -0.3780681788184837, + 0.23732516217066352, + 0.5605863947915175, + -0.289556080995201, + 0.02271158890334507, + 0.3798019260328287, + 0.029770040297700695, + 0.04800809461791772, + 0.1535015507919168, + -0.25992172984579875, + -0.0853589766469281, + 0.741066703142411, + 0.013768348981069767, + 0.4058599500642577, + -0.5729937046105021, + -0.70111548589377, + 0.10247776045609036, + -0.24257616269791515, + 0.4216668319791247, + -0.1311840979781584, + -0.3234787622995646, + -0.2918167930313461, + -0.8544025013654082, + -0.8623542801610914, + -0.3050142126609119, + 0.29708388352155596, + -0.13804776949969916, + 0.23742432812499864, + -0.3353420276241955, + 0.4054328557931325, + -0.20306180076601588, + 0.08733833367279592, + 0.44628450196434266, + -0.5877094021328526, + -0.6687304830676757, + -0.5375022013568873, + -0.2135818655683709, + 0.060217070347023116, + -0.1217158968451551, + -0.5909256718441074, + 0.5035400562806418, + -0.2972023846379419, + 0.2539986774936576, + 0.12804013785826907, + 0.30409854143939785, + -0.05157697544114259, + -0.09197806523024332, + -0.5831555116485543, + -0.3954329921132541, + 0.4470282159852753, + -0.2137462516437365, + 0.5334402328685928, + 0.2246794772725213, + -0.45323759563459426, + -0.5263988976177458, + 0.7963200781859565, + 0.613123249055918, + 0.5165625284584241, + -0.0277548137956099, + 0.21503086384086473, + -0.7092188966914631, + 0.07960908516322673, + -0.20047205740559382, + 0.27535701624512104, + 0.2896407624643601, + -0.4577265735532204, + -0.01420696987452491, + -0.07193543535768687, + -0.4911016737552633, + -0.46788204679134776, + 0.8370417632964107, + -0.5067011150153162, + -0.556855962460733, + 0.23232137851935497, + 0.4133486915565086, + 0.10416777312129599, + -0.42244943051996636, + -0.8003078425423977, + -0.7135529313676117, + 0.31741258511615084, + -0.3956979878960751, + -0.24533794430656175, + 0.033837981958391494, + 0.2647810024745573, + 0.2203702851526111, + 0.07286235519209233, + -0.39368176837921715, + 0.12663340347028268, + -0.4201723464909961, + -0.8405429883805654, + 0.1428544795900618, + -0.558480293943292, + -0.09300934719039322, + -0.3796942396142363, + -0.840328518818012, + -0.30600531206574977, + -0.58646823829909, + 0.39855723044232, + 0.37296054720336774, + 0.2985479176555545, + -0.523371261678188, + -0.7001849818837589, + -0.585535609849951, + 0.21842121710131313, + 0.10800426368978572, + 0.06880178610649557, + 0.39684324167889273, + -0.6613053723251405, + -0.5157545669569226, + -0.1337228885624181, + 0.7731850894194986, + 0.7527247150648377, + 0.6718871746414568, + 0.03198927435129917, + 0.0845740045721538, + 0.27291120283410136, + -0.6141522416491589, + 0.7258906589815555, + 0.3725821907026072, + -0.28359520666854565, + 0.36976852532935456, + 0.015788064874888208, + 0.8389843892388117, + 0.31051697291274793, + -0.3133673954090894, + 0.6756860821619626, + 0.2885118764465505, + -0.6620210978788902, + 0.1836158989441528, + 0.6453027761246934, + 0.1729451656567535, + -0.24574060726544866, + -0.3879963239136503, + 0.8356672102116677, + -0.7788091897157922, + 0.7107906423647476, + 0.16513178227057845, + -0.43674130109690384, + -0.6621270517378754, + -0.17172505899467916, + 0.4457753352570408, + -0.1036850506125131, + 0.14159243496653307, + 0.6373270275033126, + 0.28620071700257765, + -0.16344681254253646, + 0.1828370150656065, + 0.09732713978560853, + 0.13085817903320907, + -0.5644663304664523, + -0.23094014295135235, + -0.45123800926524826, + 0.2984602364797326, + 0.18700329795413223, + -0.3630507719855456, + 0.12096876929771166, + 0.7641515396329199, + 0.475128956799198, + -0.6578191313239603, + -0.5125143913513583, + -0.2882862086104496, + 0.19324218421641393, + -0.5169580749849683, + 0.09527651243436097, + -0.0420023205897293, + 0.11633134566301911, + 0.15832972664145234, + -0.6004738437689479, + 0.01316430499195298, + -0.04236704066284985, + -0.3532776667702095, + 0.13628789175443284, + -0.5958687541322742, + 0.4854745765199595, + 0.01077609745727981, + -0.23022477898478333, + 0.3940316541840266, + 0.28552789925682726, + 0.2804874512118705, + -0.4780175410810035, + -0.9186644319372435, + -0.19655117305592573, + 0.1646440845124993, + -0.08546531430344462, + 0.2457762472348048, + 0.6529530006287151, + -0.30355953586029183, + -0.3976582375610301, + 0.11374460952566767, + -0.36527076465516584, + 0.10302347945739032, + -0.008131561176441593, + -0.7463660377184286, + -0.38840698972702203, + 0.9120185918632635, + 0.17844565427363296, + 0.031655845442213726, + -0.25762212490957864, + 0.16094132478350637, + -0.030688807780988037, + 0.7692250226909009, + 0.2655401172521648, + 0.439772823672691, + -0.08953400076279083, + 0.829595003241324, + -0.05681685472308795, + 0.5664445381405895, + -0.6305882284209854, + 0.005380916149356929, + 0.5214005410809537, + -0.8066177333504959, + 0.709552823338703, + -0.5240515041350275, + -0.6092156788222951, + 0.5434737312563308, + 0.5651187032402024, + 0.18378921386050728, + 0.43077726081350415, + 0.21648982615949663, + 0.06872237809813908, + 0.12350348588395604, + -0.7170192469869706, + 0.21927445739910417, + -0.31209815460143364, + -0.20166388551338843, + 0.580614109732228, + -0.4126383525040977, + -0.13829849244966935, + -0.08054115373995252, + -0.4388050839651669, + 0.338544941148013, + -0.18950479389377717, + -0.6471192755149253, + -0.38885359090773464, + -0.4704498231194972, + -0.7449919169347392, + -0.26435717005827053, + -0.7860038019721837, + -0.5638911171911853, + -0.058007046834546716, + 0.010373492251467054, + 0.022006231856420533, + 0.6854298479795956, + 0.00610311828213822, + 0.05354502561741348, + -0.21855203781714638, + 0.3783781871385035, + -0.5055170474176882, + 0.2694838379926328, + -0.06687372641422396, + -0.0955747332090297, + -0.47201350762784944, + 0.36309116083678206, + 0.05156404390450775, + -0.730016557884451, + 0.21620997253505853, + -0.2160211354848659, + -0.13277483736831902, + -0.020285646792752243, + -0.3431250054870823, + -0.5123904836523989, + 0.21310242946981128, + -0.14555033168298842, + 0.10517395885565045, + 0.47774609612598373, + -0.6164111344947314, + -0.24508679823983937, + 0.033348655875601374, + -0.051092863117922604, + -0.650966577439041, + -0.0645687269620317, + -0.5121624741845132, + -0.09667152639564974, + -0.012662364218864963, + 0.1344854469995721, + 0.36732905759360907, + -0.4454573362364567, + -0.40895286844997203, + 0.22654327561290982, + 0.23899101254957839, + 0.06288933271463465, + 0.633135716122273, + -0.012883339339752664, + -0.4277885059002066, + -0.4569995264090187, + -0.02383939398070012, + -0.37801427852702285, + -0.0004468692537247798, + 0.3763988119930304, + -0.1938882670061698, + -0.051196231781386825, + 0.7921615308870169, + 0.5802878848956133, + -0.4794015846437571, + 0.38570477229713634, + 0.18792037327265915, + -0.1387189274485941, + 0.06436142236372433, + -0.0693193483590443, + 0.6777556241649213, + 0.382243491050496, + -0.2775981046323325, + 0.4025172481896002, + 0.5661689661986737, + -0.40046613159593575, + 0.5355509921686183, + -0.06561599692626974, + -0.14245493294629008, + -0.5406898071492083, + 0.09142169071304623, + -0.36080459485997096, + 0.08370922822603499, + -0.06882161966535005, + -0.35642093644577044, + -0.20619188907412833, + 0.3755025928737209, + 0.1634412380690925, + -0.1477844084375467, + 0.5457154570972599, + -0.35335624817906647, + -0.7544321804178044, + 0.7687377378794127, + -0.08484640475778493, + -0.11457849924246577, + 0.5789215279268993, + 0.1406590022400493, + -0.4945332031884691, + 0.3198378393925083, + -0.5366718803629775, + 0.0850889102039255, + -0.8040068365336459, + 0.581928172229331, + 0.5589496218100787, + 0.2875286877195042, + -0.1630509668256075, + 0.2293231156520401, + 0.03027306519891798, + -0.05940950753974261, + -0.7125927693595163, + 0.17259031956418291, + 0.0865882616928319, + 0.6206917206932244, + 0.4771008451097033, + 0.06387319383078444, + 0.1992794568617417, + -0.6823812792596324, + 0.43983373978899115, + -0.3745947523420715, + -0.14909715337856266, + 0.09057079754271125, + 0.5566582531433435, + 0.545163698727327, + 0.2755753783503286, + -0.3973127988913537, + -0.43812027131821946, + -0.07051517919374506, + 0.1955181152457386, + 0.400014305892855, + 0.8295802296034841, + -0.48539215640168154, + 0.06393632014726952, + -0.4268892029171115, + 0.04070711837253438, + -0.34723329579042683, + 0.1361833407730763, + -0.3316752904615706, + 0.5603566069774745, + -0.6595068793005876, + -0.2983501808911229, + 0.6438528794055282, + 0.5414818468563297, + 0.6378247971882468, + -0.3250043921439241, + 0.4487419683865307, + -0.7763229987243695, + 0.1501844968261984, + 0.10754939818136, + -0.5214221550421401, + 0.6405138378902534, + 0.7140755910107011, + -0.11956077518757668, + -0.38211016833584077, + -0.5507600566735769, + -0.0923451945021091, + 0.14368293358994427, + -0.4762428333495634, + -0.029134619530126804, + -0.20936853109509368, + -0.12689297278852002, + -0.2666780680043722, + 0.26916860575178203, + 0.5552037964695057, + 0.9910191388854058, + 0.342296559853301, + 0.7891172986536422, + 0.0974867192417026, + -0.32437374975069266, + 0.38010166605993345, + 0.11532342694545478, + 0.2886835410512202, + -0.09724136400580968, + 0.27231414341018373, + 0.7264058143765338, + -0.36761274495360485, + -0.4293322125296101, + 0.2680648743937102, + 0.3875125657015791, + 0.5066095982565879, + -0.8629469170699788, + -0.613845265488737, + -0.8154717524065791, + 0.015380723913025751, + -0.1182769877189383, + -0.133202671489158, + -0.010051528785164687, + 0.033954522094240325, + -0.7960029539133902, + -0.5567763533204497, + -0.40238734145806265, + -0.07858014793631052, + 0.6663369163363652, + -0.3558400021347119, + 0.23103292299778155, + -0.16005706563931577, + 0.3083927420428042, + -0.01348544114356165, + -0.17969478388623417, + 0.022248494713235922, + 0.409440115268786, + -0.02483599771086359, + -0.8805763161648255, + -0.3854544999152354, + -0.25125257042676863, + -0.6044598089475846, + 0.4433994742725353, + -0.10911303793233762, + -0.8559247126359729, + -0.020115942606623416, + 0.5860934162193169, + -0.7906472756826611, + -0.23700289293079346, + 0.046501658259418155, + 0.09606385515570653, + -0.42589924379752225, + 0.22691584467570608, + -0.5993459089756523, + -0.26351426121533206, + -0.9461514607473263, + 0.6113082638363974, + -0.7872975206982404, + -0.010932527052937457, + -0.5109651112647191, + -0.02472391129242818, + -0.3912384517757159, + 0.10765424408420038, + -0.8034518302889604, + 0.27474174574745863, + 0.4331762910330499, + -0.6955900131943709, + -0.08152554737523066, + 0.2495627741785692, + 0.40799771024985787, + -0.7088120373758229, + 0.5607647528049595, + 0.7443193264895633, + 0.25400336076697994, + -0.2377215559139304, + -0.36629890640364077, + 0.5590678945227807, + -0.05451986994192509, + 0.40253114039826343, + 0.31567464415452107, + -0.8031356748415215, + -0.026409998939679158, + 0.015033066784822857, + 0.03340446761257149, + 0.09840161166300948, + 0.2178900322743616, + -0.050253701763908754, + -0.08638773168985336, + 0.12064257921255483, + -0.23097302905304584, + -0.3512853554045344, + 0.6203276804743018, + 0.0054625802334759, + -0.15758775998686103, + -0.10140263889437295, + 0.3028917650841683, + 0.38405926881170993, + -0.18572210354778718, + -0.2658813728439967, + -0.38697391594293445, + -0.21160953718617537, + -0.5850221259733455, + 0.36479418408289743, + 0.06067454628553798, + 0.053220494328217405, + 0.1911266606972944, + 0.2805451560200099, + -0.02295034914572347, + 0.017192197873353576, + 0.3726407215133099, + 0.6070910590268586, + -0.3287707911050398, + 0.1777961333278179, + 0.009283600133960734, + 0.8246601435827569, + 0.12677046441758183, + -0.26557043398890035, + 0.28081679252218894, + 0.06541976207140698, + -0.1298869489892861, + 0.49807234658139776, + -0.3384358015697787, + -0.046759908357309254, + -0.03528135204774452, + 0.32725080271413115, + 0.34843317124596473, + -0.6948876031292509, + -0.14690729406161268, + -0.20189183532080868, + 0.012360793258155589, + 0.030672646477837406, + -0.2415876932563903, + 0.5388934272431147, + 0.20351682759982775, + 0.11028070210856966, + 0.17876514759072953, + 0.15926086758119462, + 0.021477603715504223, + -0.0013040897340729773, + 0.5740197822583581, + 0.6003290973909499, + 0.007156581339546553, + 0.8353166241056497, + 0.3445895269067841, + -0.626230631050823, + 0.309542147343128, + 0.05573227037625761, + 0.5605257066828347, + 0.8507141587469744, + 0.313841906577245, + -0.30798619356518564, + -0.7438550257075589, + -0.02166646463258276, + -0.05560815431910271, + 0.5250569685105309, + 0.2761360063279367, + 0.40750163473596784, + -0.8303292710910545, + 0.13973121827630058, + -0.8923603528724875, + 0.4814503075709934, + -0.2611866839649505, + -0.49631218913089153, + -0.5607988692513675, + 0.16221170008789954, + 0.24557480047339764, + -0.823921568179145, + -0.4832380858225945, + 0.10441464656218441, + 0.0675335146105156, + 0.1660403184683697, + -0.06228861840615779, + -0.6653018044689186, + -0.20071435988282327, + -0.6854529336479019, + 0.07763565029043412, + 0.45311470200725423, + -0.8958234676078098, + 0.09681223343404721, + -0.3868267188795353, + -0.26396152461188715, + -0.5839936035534838, + -0.39790535728610216, + -0.21933183494521596, + -0.29520380643239064, + -0.08424254986041596, + -0.03500736745533545, + 0.21516145497330502, + -0.5133371676092879, + 0.26241533090179053, + 0.3926555366927273, + -0.03378869186789357, + -0.1504091921689552, + 0.5019352325897697, + 0.44408395349838986, + -0.029193492749394867, + -0.06922208458373874, + -0.529545073903952, + -0.029341116580812454, + 0.5989437817776933, + -0.010452555729499324, + 0.0974401844439986, + 0.7513300123258617, + -0.6023241619571285, + 0.5992759459855971, + -0.2848930984855439, + 0.7306251672171059, + -0.3595243523998534, + 0.38692339316948454, + 0.3375780019438376, + -0.26029041792925345, + 0.2776812945506441, + 0.019908148248309443, + 0.5327676642769881, + -0.3164581675971688, + 0.1276244399064368, + 0.5873349967150209, + -0.31275806617686264, + 0.34943331330901517, + 0.07255495655483102, + -0.3257133651814788, + 0.9126709370221533, + -0.203266429638428, + 0.20186619202119244, + 0.2407840314707153, + -0.6778129858473761, + -0.370578293722863, + -0.533177764568801, + 0.1750140372108442, + -0.3481955119249599, + -0.6999050231981636, + -0.24962595523794184, + -0.07668304379576119, + -0.1038142529256415, + 0.692493492328619, + 0.14081981306857294, + 0.5016744347629268, + -0.6373139590815908, + 0.8265920304132575, + 0.4795719377959037, + -0.9571107064447478, + 0.7978430096537953, + 0.08950714913752283, + 0.27290476296827687, + -0.38969738018227634, + 0.33194956059104197, + 0.3176143202273012, + 0.11700118489364975, + 0.5136467572915147, + 0.0650492940576225, + -0.603776640483175, + 0.6153304804703096, + -0.36396856042466075, + 0.11469720399302208, + 0.232822143804578, + -0.004726496855560092, + 0.022048298912635544, + 0.5520457339960517, + -0.4790569720813053, + -0.7489251975302823, + -0.03835112358898529, + 0.28374427918309286, + -0.021668488053308343, + 0.4817153039828571, + 0.10479402812265098, + -0.29738834715132323, + 0.5797739916329847, + 0.28794591915460405, + -0.6554723314074529, + 0.6029745856087029, + -0.1748342720452155, + -0.4522552395741493, + -0.36886703879568083, + -0.15828436787649214, + 0.3684398053994538, + -0.24968762878483453, + -0.20042936778285092, + 0.5287815028148221, + 0.1506245605311502, + 0.19181534020901536, + 0.3495617695897547, + -0.2741556711207609, + -0.2963840614015485, + -0.2434454143588597, + -0.2548055771755283, + -0.16825384046692154, + -0.18266890075549003, + 0.40765713855481794, + -0.36006386206626434, + -0.34211053052871016, + -0.5683875966159797, + -0.30943296835700407, + -0.248296728470759, + 0.7410479481582343, + 0.12696217005376392, + -0.10569954290164352, + 0.2253509967577388, + 0.2446826144626194, + -0.07343276992741643, + 0.4571021754001706, + 0.8054322456536656, + -0.18463544852551045, + 0.2668006957092466, + -0.2952753429608146, + 0.06255476924447317, + 0.3227694257707894, + -0.3570776772003875, + 0.022189978257643905, + 0.03651681772650195, + -0.7950514809004301, + 0.7260176119247379, + -0.5053106351192775, + 0.6638958650244087, + 0.16956027210321428, + -0.03342793609411976, + 0.25003971766008126, + 0.07182197935237761, + -0.4410847295299766, + 0.013746895037696827, + -0.06887537183828357, + 0.42660696580750335, + 0.3213320824630095, + -0.5555444102858721, + 0.525484413530767, + 0.2861898078416895, + 0.018293209296620205, + 0.38130992044940604, + 0.11913160637722381, + -0.12463582152493413, + 0.6054373999883151, + -0.3177440666938053, + -0.23508788502948863, + -0.04651071637187909, + -0.012179588725781676, + 0.35512475346093103, + 0.576925838829513, + -0.2197361192416043, + -0.16974940038155673, + 0.003023221609869675, + 0.13749274306967957, + 0.3627262653875286, + 0.1665740924359284, + -0.05634792480497974, + 0.2976910564422805, + -0.3866099471074306, + 0.4315982130606648, + -0.4252951754460432, + 0.11110409529446563, + 0.08244485740868152, + 0.10803877989687455, + 0.60993226611829, + -0.24494710138546294, + -0.5282509243545401, + -0.282569746738081, + 0.3604927832492502, + 0.2724359953265004, + 0.44757395015304224, + -0.1570932101616771, + -0.2803922917477476, + 0.30347875898348337, + 0.14127738088379005, + -0.34795765192979833, + 0.14133799210234377, + -0.28294258059714783, + -0.27450551992249417, + 0.30151026943841536, + -0.5984493755140275, + 0.26511231550867137, + 0.1246299653497474, + -0.1539956209991482, + 0.22368147646841463, + -0.3684822538785549, + 0.0111739386807298, + -0.113942319938787, + -0.18692025052265082, + 0.04910910058271123, + -0.07671537841660331, + 0.03684017600342859, + 0.496165692898339, + -0.03542993865510785, + -0.5765151366295962, + 0.03453918837122849, + -0.09700117854575813, + -0.11279726408324664, + -0.6291021980621441, + 0.32718464285533844, + -0.5444369167652818, + 0.7771017032537072, + 0.34504346413553055, + -0.5429750098539128, + 0.13207629780087665, + 0.15875019474194446, + 0.07857331239591181, + 0.26036948028884194, + -0.09685486323938736, + -0.06091504523217128, + -0.015176819855494184, + 0.37985811841543227, + 0.4608588296391911, + -0.21137133958897392, + -0.20749546759152815, + -0.07309356481146695, + 0.43696295630399584, + 0.2755689814733584, + -0.8348341807234935, + -0.9273112168403462, + 0.46762088168898963, + 0.80083622577721, + -0.6009254247630259, + 0.17789773417686355, + -0.14823021534983466, + 0.02117277285938146, + 0.66138001123041, + -0.3738392458425036, + -0.06645054648499632, + -0.23176617822956225, + 0.16069674029358538, + 0.14175705863574067, + 0.3253371268135622, + -0.5075420269122866, + -0.62836699875781, + -0.13690826832294378, + -0.15330385315683143, + -0.41669362361590395, + 0.24619976473474375, + 0.06752108569270643, + 0.03644900166966897, + 0.19871008468637769, + -0.21394267342154205, + -0.12806094843983573, + -0.2504511690473522, + -0.3451327131717685, + 0.45115875607532074, + 0.5202212559306673, + -0.1553465268531209, + 0.15278659447559023, + 0.37565865186052266, + 0.41695944185560574, + -0.09396811577564473, + 0.2800318378982754, + -0.09500671914761022, + -0.39998196643938305, + 0.08365694662744466, + -0.11644889429699828, + -0.6475250080899222, + -0.12649311248789563, + 0.11108743475094068, + -0.4817077813487404, + 0.25164889637931687, + 0.6158254985272622, + -0.40218522959417125, + -0.44124643621709486, + 0.4812507221943332, + 0.8281159677474653, + 0.32847018648742987, + 0.37388927727447113, + -0.01200255660740246, + -0.015277347502072047, + 0.10325145500201416, + 0.6707881352020975, + -0.031598832914871866, + 0.5401393075657366, + -0.061244700254079076, + -0.5573558894255373, + 0.06748466690559385, + -0.48069066808440825, + 0.0004853148265268059, + -0.11368775992695679, + -0.36499483496671403, + -0.44650296950027485, + -0.571437604088036, + 0.3687360098073078, + 0.24477120084503118, + 0.17506910127736175, + 0.12278554714316264, + -0.1170073515170364, + 0.315723837396185, + -0.6576966859883352, + 0.0723890760844671, + -0.5456578213860499, + -0.33109536094215336, + 0.22749894853018215, + -0.20739530752538116, + -0.7385925707945625, + 0.43365383404323943, + -0.5584896679096951, + 0.7689743819151885, + 0.5393390016174794, + -0.35332367896230943, + 0.2030060219560213, + 0.19605606854545005, + -0.10387411349092324, + -0.2990674059992936, + 0.522003021438159, + -0.08647361575190093, + 0.7881544737821164, + 0.013006585232101242, + 0.16710503414926514, + 0.6912941365559921, + 0.34596243671579674, + -0.3948283567160497, + -0.21246077175187994, + 0.23419856123311228, + 0.25510670092667664, + -0.11978341394689895, + -0.35297368633049675, + 0.45955584403010874, + 0.14810466082918328, + 0.4812516547020135, + -0.6326911180758834, + 0.11463682241289974, + 0.016914150828237273, + 0.41163333272566904, + 0.0022138086833712323, + 0.10628279267884261, + -0.056999477028582324, + 0.25541991580606593, + -0.4785670997940467, + -0.7170070511442687, + 0.23026957214470878, + 0.3958873888702704, + -0.07589536061042457, + -0.35708239732873576, + 0.3853049665351927, + 0.10273699129002295, + -0.06381244298604949, + 0.09026085173149473, + -0.3378187950720226, + 0.5052496712273425, + -0.5852129427483008, + -0.05359691359696461, + -0.3404182091249778, + -0.0015252749616658234, + 0.629873039934464, + 0.1458894028022657, + 0.019952081792256493, + 0.9231650041933528, + 0.531381899043853, + 0.5218598053024196, + 0.10658287103031522, + 0.18782230465267397, + -0.512204111377168, + 0.045109660123029305, + -0.25505913715475115, + -0.7584744761502368, + -0.14196617755529228, + -0.596873737587306, + -0.0544665886094472, + -0.3350390923240232, + 0.6645539385057759, + 0.5290351008223573, + -0.2016242397173036, + -0.12406331907204182, + 0.5489827773959112, + 0.5345663814391344, + 0.31868902138087696, + -0.43902953613101986, + -0.4975507039792682, + 0.8841009801570756, + 0.32722669008985916, + -0.5539875333350954, + -0.6569366963286399, + -0.795468960352042, + -0.14475203283563287, + -0.39111569821884157, + 0.6851597422350811, + -0.0694468378908275, + -0.0777701614135683, + 0.33634457876604157, + -0.3491006499157272, + -0.7351457425461562, + -0.3787500119747478, + -0.6977410995053507, + -0.4554781989563051, + -0.21077228838258738, + 0.43735335059438435, + -0.2890274432963966, + 0.12977538448946396, + -0.8094797982681551, + -0.3408784304847317, + -0.29037336119350976, + 0.23416951624869486, + -0.029469797889654814, + -0.0009571661988323488, + -0.6813115536596882, + -0.4435793937812911, + -0.2720955671612496, + 0.2937865376133508, + 0.8698993242512062, + -0.6544182413192139, + -0.5819219256683861, + 0.8632408304337076, + 0.21709030338008006, + 0.7534920838175396, + 0.167521817028155, + -0.03949972093319293, + -0.008060606747495036, + -0.06143236987299888, + 0.18066048352269176, + 0.14718533265157013, + 0.7787038134090978, + 0.2901346209322869, + 0.3767542363927246, + -0.5384641972499047, + 0.03386400132955525, + -0.6418857548148543, + 0.5987478918523809, + 0.1401088121106558, + 0.7414704933023837, + 0.1293801019266595, + -0.14166634233364406, + -0.7466997647047048, + 0.3629447686700441, + 0.08158385527072692, + 0.49449820155664626, + -0.14906890305825687, + 0.3472043445326066, + -0.19592301371239318, + 0.48017026916815764, + 0.5711411914163299, + -0.1860372884810756, + 0.6532279308575901, + 0.06580748157655764, + 0.6506167609311778, + -0.5060035465702992, + -0.4627384928893085, + 0.37019126186938556, + 0.884763775266967, + 0.2913238737184897, + -0.014365561361019907, + 0.22419131655634278, + 0.2808004899839648, + 0.03074887670151627, + -0.5488540160643376, + 0.004943416013698632, + -0.6884292461594073, + -0.18311362462787895, + -0.5912088603488033, + 0.20190750188776913, + 0.09732215999249688, + 0.5627952125374638, + 0.09995648393338574, + -0.038438041079692176, + 0.16711069683772517, + 0.33004401699078206, + -0.7043177074925093, + 0.6044922220612904, + 0.1662070980271163, + 0.13566553837883483, + 0.4844518579257642, + 0.3680691825488159, + -0.23007840040480376, + -0.6820947823819554, + -0.6425113272546883, + -0.08047001809138449, + -0.3008737946923228, + -0.3617721040488047, + -0.07115106104925806, + -0.004410948896235889, + -0.08885930341108916, + 0.21014892431615934, + 0.2502813148954926, + 0.029762411395572563, + 0.27422529570824555, + 0.4354372224159668, + -0.8071855789350402, + 0.40669848940611875, + 0.016064832690045938, + -0.8659187919676112, + 0.4373378482374147, + 0.7373126344483627, + 0.3051731475900417, + 0.32349556351003267, + 0.4209126348070965, + -0.1744677780418491, + 0.9341398877725343, + -0.1906924427484431, + 0.7756167303096816, + -0.0953898191294868, + 0.2650933795506985, + 0.1151245603039247, + -0.5318298967746037, + -0.3538340694226208, + -0.5356176525623602, + 0.7870263959774713, + -0.48975091589872016, + 0.7752964277320656, + 0.21146634222087818, + -0.27137742427914036, + 0.2519823986033633, + -0.035027884825531264, + 0.12374117853940125, + 0.6249890864726036, + -0.26409978454630934, + -0.426277717313258, + 0.16186376853225903, + 0.29017442022062073, + 0.536196424998051, + 0.42882437769918996, + 0.265143702862686, + -0.3455893701778691, + -0.612736773440127, + -0.18663173350293671, + -0.19273905607612862, + 0.18325144806399218, + 0.4216018254358693, + 0.252968903477773, + -0.5813148342764225, + -0.5416965512248471, + -0.07847455044848411, + 0.09137231562160203, + -0.11159135425326705, + -0.08936617366482197, + 0.2670087550912782, + -0.3011633128858059, + 0.6323681684297697, + -0.23940597254737117, + 0.5221447010214184, + -0.2729074919572201, + -0.7299099423303008, + -0.20764497158864925, + 0.26532577300422006, + -0.16821345817283107, + 0.5967250744566253, + -0.15928120860171296, + 0.35443660393333354, + -0.36398948341216913, + -0.7032137098175842, + 0.625461071830199, + -0.08166891512739477, + 0.22049714154382866, + 0.41931390886251835, + 0.5579314390854874, + -0.3919435622729269, + 0.5350469138197741, + -0.6299219676657706, + 0.1976437075180575, + 0.6609028181866344, + 0.6122162742702866, + 0.03921614888504921, + 0.3120389823797279, + 0.23820916053214408, + 0.17026149114945982, + -0.17822977735912182, + -0.304702326897074, + 0.3490894284522141, + 0.7400771332085152, + 0.407033150827691, + -0.4985319814067895, + -0.06491060074134769, + -0.038299487856031544, + 0.03599145863375558, + 0.296117247548397, + 0.7153097214811834, + 0.508954838788172, + 0.6712267742643923, + -0.01580375934540057, + 0.3783893239396834, + 0.4915782960808613, + -0.6328598351804903, + -0.6942633123937637, + -0.3230766682934524, + 0.08361147023123705, + 0.6757290492576361, + 0.4209168945538199, + -0.2605335879451671, + -0.16020727737799767, + 0.6772753078607074, + -0.19411731140292288, + 0.03015682021137367, + 0.08591468946653497, + 0.05530548570341448, + -0.09841418539152846, + 0.14668516667003267, + 0.11372316205488847, + 0.24513068558125878, + -0.35320520720959614, + 0.03865784864047955, + 0.4154635631604414, + 0.0829468460845546, + -0.35501819276485835, + -0.10171312091571738, + -0.15390503212635853, + 0.3481185229432772, + 0.4580316681667276, + 0.203530146394512, + -0.6412345696707121, + 0.14633489383179754, + -0.46515848720437364, + 0.06064952227937309, + 0.4641670195460402, + -0.04276971656499795, + -0.11203260139343274, + -0.45167478151351825, + -0.13507037655180032, + 0.2769287891600019, + -0.4657405472752125, + 0.19672582582414588, + -0.01564212686281774, + -0.3186097516476041, + 0.23204236356257324, + 0.5368829401712865, + 0.35942753017031626, + -0.5057995673351925, + 0.3211227655334863, + -0.2014584840096859, + 0.6774218660345906, + 0.3213205292499866, + -0.3080820589671551, + -0.26712764806077016, + -0.5394361192804297, + -0.17224084586692734, + -0.46987184958323763, + 0.01764760669232729, + -0.10083097065620827, + 0.11208476037949738, + 0.44084314216522125, + -0.02386389530499522, + -0.32533873728058627, + -0.28970129006164314, + 0.49015577108413644, + -0.03289950253076013, + 0.8092418875976208, + -0.08305823177222299, + 0.17352437908402762, + -0.3387628900759164, + -0.20567129933090456, + -0.03677741293930109, + 0.028201325065638272, + -0.3233585259179922, + 0.5243681702467154, + -0.748289965691491, + 0.6103468795424977, + 0.1266940233789256, + 0.5283156914783265, + -0.20679288481209912, + 0.4914431551338836, + 0.1880130154051065, + 0.5915511229728901, + 0.03726875515514938, + 0.22467779276579297, + 0.6680232332978779, + 0.07009536042037112, + 0.050595860523504566, + 0.33609616961923144, + -0.25146691285316636, + 0.7395884891912948, + -0.6331482399944921, + -0.013063219638727475, + -0.25737096459988007, + 0.0842243935628354, + -0.5618667841553915, + 0.16422844728178743, + 0.0669003485381297, + -0.10712266681851723, + 0.30317647196136555, + -0.11110014556562381, + 0.008550656880464524, + 0.17344311318463074, + -0.6301099889793496, + 0.6764397300407213, + -0.39552708751478727, + -0.3715853038882696, + -0.24305850755052616, + 0.14505641206020953, + -0.5991652596416981, + -0.49584350811317807, + 0.7340593466222416, + 0.3679735532481002, + -0.6432990172131987, + -0.15600638520482857, + 0.811573251603269, + -0.016482178977366868, + -0.03239518378455952, + 0.13212604905427505, + -0.12164329958289011, + 0.6472065283311462, + 0.0017493438721585264, + -0.3984297096594729, + -0.5819455012724146, + -0.4442714637556214, + 0.13149517798806432, + -0.09734655997575054, + -0.31820532753181585, + 0.11727927651355402, + 0.1253692991216689, + 0.13339116993443023, + 0.15697520730163678, + -0.5691924304065636, + 0.879755430458501, + -0.18100086623270994, + -0.4296304807831915, + -0.24734628503678313, + -0.058478756812882615, + 0.06846839981656139, + -0.27864026198151093, + 0.11549919776267004, + 0.5867638038229577, + 0.6980038790850001, + -0.254556119647944, + -0.6586491818995663, + -0.014141388165679725, + 0.2721285210830379, + -0.11790715884777248, + -0.22681292631865857, + 0.20466211979185395, + -0.018383317721512527, + 0.6910878244350719, + 0.5692916169373826, + 0.13271147968621694, + 0.5103824122777051, + -0.07335871391301613, + 0.5239754064289437, + -0.10990694329014972, + -0.03396923905949628, + 0.17909853016534955, + -0.7857179417936295, + 0.4444035718500059, + 0.6725243338052095, + -0.12000241886503982, + 0.11121459288345548, + 0.23633109076313502, + -0.33486160102649365, + -0.5333924201561897, + -0.18750057732891356, + -0.7266500802326259, + -0.2715855009760544, + 0.19310739081355505, + 0.036796621347856495, + 0.6192021890720073, + 0.2607868071350983, + 0.14985397000552603, + 0.5786042984017966, + 0.17116382473234076, + 0.1800828854511884, + -0.012767129455336257, + 0.21681772316045467, + 0.2108339979472581, + -0.17240000863848448, + 0.16760054136288854, + 0.020567619932153225, + -0.016298805623300716, + 0.7093620068369403, + 0.34150022028219823, + -0.49044787719369903, + 0.4362179058193228, + -0.026323752180944737, + -0.2924484038819879, + 0.31071701810199504, + 0.4953376880285203, + 0.2429630929372456, + 0.4740313088668343, + -0.16214866969131925, + -0.4874530346703578, + 0.42902723908254914, + 0.22774000537110517, + -0.22587932197276117, + -0.40144055379536636, + -0.0274964313580614, + -0.03668376005003099, + 0.7868282316913946, + -0.310930767195851, + -0.34005733996078724, + 0.4309431127695298, + -0.4470099259753128, + 0.6749014876034898, + 0.19822388768601285, + -0.6454037818781642, + 0.22375426406425641, + 0.3645146258092491, + 0.5082942750654179, + 0.7925082127102332, + 0.3200453404562857, + 0.14913913382025884, + -0.5697513415019844, + -0.43525596957830476, + 0.3792412113959567, + 0.8687649107211534, + -0.13111540027685126, + 0.10927032232619965, + -0.4365013536559101, + -0.5108229323884976, + -0.8009993991869033, + -0.5927971162990147, + -0.3342533746998418, + -0.1759090877801301, + 0.7440487106721316, + -0.5217226238444528, + 0.17022176924391824, + 0.7380378448922152, + -0.28448380849745103, + -0.725276767646708, + 0.009983562172410587, + -0.8822715146503557, + -0.1284174033071644, + 0.09755085080985537, + -0.48947588974761697, + -0.549523136246493, + 0.10168889664590619, + -0.4893284062820445, + 0.3586812337771837, + 0.09055520826810082, + -0.2715518883352306, + -0.724146825873717, + -0.3034733428412828, + 0.1337939456446658, + 0.5986296441958795, + -0.7616748199928864, + 0.0010832928960494148, + 0.04491314003680469, + 0.2873429570437121, + 0.013157089206005446, + -0.1348741133604754, + 0.4291228044687999, + -0.8228653323393711, + 0.3705614758989359, + 0.15533481890974787, + 0.06694934278644121, + 0.6648742068307374, + -0.5630335715905386, + -0.05525070096869078, + -0.2153912313032541, + -0.4635619539479077, + 0.15845265998278302, + -0.39175236980139916, + -0.08603480867973456, + -0.032514307774890394, + 0.22057250579688042, + 0.12126120060234968, + -0.2658178202906224, + -0.19524982107669742, + -0.07476899396501108, + -0.20240366899254802, + -0.19607221430004484, + -0.5667869138976518, + 0.836495558670518, + -0.15876651161778976, + -0.42615008356606804, + -0.4337059323581427, + -0.45934689335306705, + 0.3018344999330307, + 0.8312520435884629, + 0.6025257691579722, + 0.08050635979300369, + -0.6008984485061071, + -0.30968950805456597, + -0.6466013748790929, + -0.3112920629799618, + -0.027318354546643442, + -0.1110397208950683, + -0.05128847999333541, + 0.7074992815241734, + 0.6672299805703604, + 0.5129991320597705, + 0.6774423060532629, + 0.03763642078530127, + 0.6301669909305211, + -0.12888272632278763, + -0.623781249274196, + 0.2188447215367214, + 0.06336657322386957, + 0.4991381790504307, + 0.24781113826842643, + 0.004108272497926946, + 0.05617580727989879, + 0.029773011857981868, + -0.5271585927184614, + 0.8004358969389849, + 0.12711613867328553, + 0.19075506547640309, + 0.46229274315658475, + -0.11811452699938907, + -0.3099221139894377, + 0.13627239130093838, + 0.5973637709747887, + 0.10021257955113289, + -0.18533216147874704, + 0.6716849737141849, + -0.23577784082219244, + -0.35185921585801816, + 0.6673758386033926, + 0.016461321074011548, + 0.01702623249379004, + -0.07775762025098887, + -0.4621887466901727, + 0.1700481361423261, + 0.2699762272989244, + -0.2634557716203204, + 0.3682432202050941, + -0.4382183037830016, + 0.5976786643590073, + -0.0297813102921477, + -0.21197296413011069, + -0.4336674609675906, + 0.39383096077476276, + 0.44403044659052493, + 0.17607900637804585, + -0.06774622106849487, + 0.2125052904954554, + -0.5347566309539649, + -0.38211209738362556, + -0.3522284299441798, + -0.7454992959853439, + -0.61343469604681, + 0.40553570115763454, + -0.16835647197846348, + 0.2914839433667059, + 0.7597516967870486, + 0.018904822828082313, + 0.564932894921144, + 0.6576189863493465, + 0.506991039061765, + 0.0636333229304365, + -0.08154560181644155, + 0.0020333095540511215, + -0.05984297677422479, + 0.056051593587535364, + 0.5650795630124901, + -0.37025120366237996, + 0.5338956454715643, + -0.024699298341664122, + 0.08751807947530571, + -0.34964580613646234, + -0.17600706629680962, + 0.2132485344430874, + -0.8323229749954899, + 0.05097454082624686, + -0.5368259623284899, + -0.44526107326461967, + -0.015363435226899425, + 0.24153497999278378, + 0.6817615834615279, + -0.5101671990078098, + -0.020849602714650306, + 0.11347921030099578, + 0.5522758850203731, + 0.8551294092759008, + 0.16969881925789598, + -0.046682667511274756, + -0.5818918213300559, + 0.08423880047145504, + 0.7853949286242379, + 0.3414982481407302, + -0.5501822025228622, + 0.20016086589413234, + -0.7092908190492624, + 0.7822557701766468, + -0.1999166366213242, + 0.726507395075858, + 0.8803592138758929, + -0.03758368378919913, + -0.6009741840012754, + 0.4103755930473012, + -0.05902855495119397, + 0.03060404544007661, + -0.4091224744223472, + -0.40541299988384266, + -0.7439947423806128, + -0.26171543719382706, + 0.921117898271259, + 0.10418568177585491, + 0.013022377293661347, + -0.16362771331965886, + 0.10426375770350171, + -0.010566675739683007, + 0.7618520174845829, + 0.17043413127894336, + -0.027014703015934838, + 0.4963343221862331, + -0.19544883716620443, + -0.17362839701620542, + -0.2931806021431587, + 0.26940735799143617, + 0.1098795525247181, + 0.4958964987591221, + -0.7488635968514861, + -0.7456739347167044, + 0.3422270270240534, + -0.5885526895260427, + 0.13055973765974116, + 0.6741632940514171, + 0.12155936634920272, + -0.6782371957982278, + 0.049576771006831055, + 0.024672846771247425, + -0.1621640366650448, + -0.536751880974984, + -0.91333838889882, + 0.3208593600263127, + 0.35693296783613004, + 0.3111726135678196, + 0.8418646538689413, + -0.07555026679639393, + -0.653850828974569, + -0.668463484037644, + 0.5602291758863176, + -0.45013494163398104, + -0.3002649259004978, + -0.7389324227299385, + 0.515752461758389, + -0.6716242746255056, + 0.02426044146293227, + -0.4010347999249825, + 0.2853092647233481, + 0.6519280430176934, + 0.06630025099162229, + -0.5840728389098719, + -0.08864889795865127, + 0.3861805471052435, + 0.3664873369553646, + -0.15482424528581618, + 0.21734921864969198, + 0.5427528144890009, + -0.3718478742234233, + 0.16217207659636118, + -0.030613816744297473, + -0.40186184040798284, + -0.12391842031024847, + 0.22276880295102786, + 0.30575611791722973, + -0.11711841345599083, + 0.25750261471620545, + 0.5635262006667969, + -0.646397449849865, + 0.17709177224189182, + 0.3036876108530073, + 0.05289966071646551, + -0.509087201875732, + -0.8105949321287328, + -0.20986511483458037, + -0.25288034395433834, + 0.8394665744861636, + 0.5518133704365326, + 0.3014747912406644, + 0.14671999554458082, + 0.5766829801998867, + 0.37011751095033013, + -0.37994198262079876, + -0.8477556740639971, + 0.02876405144898886, + 0.9378832489243388, + -0.4201018053601252, + 0.3693642089907042, + 0.42984525251428773, + 0.5490162079797004, + -0.43634645441091785, + -0.672811604544701, + 0.025245445556021817, + 0.1371917265536396, + -0.12013460599653292, + -0.6955808100056501, + -0.19921647819326233, + -0.23671933988411398, + -0.6734657589876272, + 0.5232285513551096, + -0.4411204072550899, + 0.34440612382124725, + -0.24454794208768738, + -0.03243226559356749, + 0.9138798967906573, + -0.18519908859001344, + -0.2572463486871197, + 0.007397228730047112, + -0.35570820313414386, + 0.4570612092223885, + -0.230032438946274, + -0.4228907074005997, + -0.18984521578661084, + -0.027291977285063218, + -0.2979089683626823, + -0.9841822304844274, + 0.17133255909598927, + -0.07592933635024235, + 0.7098731674240866, + 0.6350867925281497, + 0.2075282618161387, + 0.06594236347326393, + 0.8056403917070856, + 0.815962552398327, + -0.17880105216348008, + 0.24417067410115084, + -0.7144503313056558, + 0.2245350898087934, + -0.6556134539424513, + 0.4954273206819261, + -0.23839555844943539, + -0.34211193266305945, + -0.6511381455536215, + -0.4401554512831399, + -0.01605134734246416, + -0.29533488066841923, + -0.14132240536765284, + -0.4473528355324818, + -0.1792157546834634, + -0.30991345978452356, + 0.5404890867090005, + 0.10238924467972776, + 0.7344918379079102, + 0.10535806462348707, + 0.1962805747344633, + -0.12589183140814175, + 0.6235133882148111, + -0.5861839357741225, + 0.01184642722189927, + 0.2487209187724731, + 0.31495614088172635, + 0.7039158216252, + -0.6923549123180117, + 0.6080416618446729, + 0.1554614259856112, + 0.16938026440001608, + 0.4290564279416298, + 0.369027047398633, + 0.4272483401202636, + 0.7293477127464646, + 0.44942766893931674, + 0.6395364826668342, + -0.44242468059526346, + -0.29242568971384675, + 0.6753478249097156, + 0.19520731863516466, + 0.5826823700960398, + 0.10131880501294943, + 0.7268151797397758, + -0.26818367551569444, + 0.7741894581869917, + -0.6818534009111556, + -0.0747129612719164, + 0.8419543733964883, + 0.8213744131737186, + -0.20900769718296985, + -0.43883272756997477, + -0.5866453068803164, + -0.0782352507441667, + 0.4833946576655337, + -0.5098027233544826, + 0.5840585660514577, + -0.6805839367423618, + 0.008117321234096753, + -0.48471685367453515, + -0.40830334971506727, + 0.287565083702668, + -0.18233024340269044, + -0.3662097288403928, + 0.7538282268464711, + 0.5793239084083788, + 0.19159390006521093, + 0.8237513142838708, + -0.07601781145436493, + -0.5084046951353125, + 0.3613573931255111, + 0.2942106778316484, + -0.609851560750348, + -0.37735507780875993, + -0.071860608283835, + 0.5272250723724411, + -0.3600090267162047, + 0.03505857680560942, + -0.660419817929917, + -0.24352638844509666, + 0.26440709484274716, + -0.12272893525001671, + -0.3356656522777998, + 0.2658308059214026, + 0.5148022960729534, + -0.31680720191084777, + -0.5098142050801882, + -0.23358827419038553, + -0.6529530433508948, + -0.255266525420354, + -0.370008260823125, + 0.5170111749252998, + -0.2563625884839137, + -0.641634579909454, + 0.23128540710878287, + 0.3324896334811228, + 0.3806066487978309, + -0.38674341929727835, + -0.02577922447721831, + 0.3356806001710542, + 0.2998739759834905, + 0.9194937121968473, + 0.49444765206761776, + -0.5060596693895854, + 0.7095418961859048, + 0.8194053824334515, + -0.051504265888965395, + -0.561623681360145, + 0.6773440718245581, + 0.8449631681022965, + 0.21437933796227943, + 0.6113806159893926, + 0.602620962311807, + 0.22350503014545425, + 0.2722410796356702, + -0.263125407352095, + 0.4485982845140828, + -0.11300963198957609, + -0.541712840892562, + -0.7718797001938735, + 0.7090150767158732, + 0.12040069543838411, + -0.19534326200168417, + 0.13925844185901676, + 0.5305885028304428, + 0.6945682009100799, + -0.78313567113438, + 0.22554326358832066, + -0.2668942945256473, + 0.6263075428297751, + 0.5404816933577085, + -0.43357947927997126, + 0.156941533549732, + 0.6784909091980331, + 0.18273247441757462, + 0.822957171486189, + 0.6142557989558431, + -0.06677459242129724, + -0.03411989993214487, + -0.35178751396203206, + 0.030414262276628856, + -0.5157660552237509, + 0.6299422661135148, + -0.08006716052108642, + 0.17509165056049947, + 0.3734105454783572, + 0.1723818429078554, + 0.4346603903358648, + -0.31101104908049115, + 0.8154091213574332, + -0.0014538948108910876, + 0.3161339443818153, + 0.07396571842413807, + -0.44354244956490324, + -0.9494310605443855, + -0.3473957037079109, + -0.5168656600459729, + 0.48087901206788275, + 0.20005276345431333, + -0.5612771014256537, + 0.6829686990810665, + 0.3993982343820145, + -0.410279642343095, + 0.5255394359860492, + 0.44877452000611695, + -0.10885402545782485, + 0.2115071571373583, + 0.32936932916197764, + -0.06911870215880389, + 0.1346209315555214, + 0.013660719590442738, + -0.07691416415894259, + -0.5107769475779347, + 0.2730805875596729, + 0.43675844439042044, + -0.23956631817197982, + -0.08044748485128983, + -0.1798966746060799, + 0.4053529791288727, + -0.4148566059268553, + 0.3685045523800525, + 0.07517165387830421, + -0.1980636379622705, + 0.431800019924398, + -0.038888138548722695, + -0.0398154987025921, + -0.16791850335522973, + -0.6568500678774349, + 0.7868499007342492, + -0.132984736723452, + -0.16300083802892307, + 0.21483910839334536, + 0.3109177251205233, + 0.041627502219418744, + -0.0018600118900140017, + -0.39429925503729385, + -0.02453557783070004, + 0.9654637179200115, + 0.29519667117191545, + -0.6731546400950167, + 0.00596314872618825, + -0.43220779346031407, + 0.34151859888588104, + -0.14314035265090952, + -0.4693192426202747, + 0.514476399024467, + -0.6038411183365473, + 0.10675917713868943, + -0.42064648152188033, + 0.002099858899867857, + -0.5260741557987818, + 0.5015434539891169, + 0.3260697658754999, + 0.2750038993926789, + 0.764824077770367, + 0.689809650429146, + 0.7271881399119643, + 0.37937506466305615, + 0.1583343687636926, + 0.05214424128116263, + 0.01374362365178794, + -0.5860560392421796, + -0.20368917211201698, + -0.6863585359590738, + -0.02653064009385242, + -0.3211514926110505, + -0.1561455928496971, + 0.3528166166896386, + -0.42830467365247527, + -0.4139170620282506, + -0.27513479346302216, + -0.7997257728715615, + 0.7302788008794452, + -0.15565593380305226, + 0.3528654745709875, + 0.25135056899055214, + 0.2913280736542614, + 0.048729663931880995, + 0.3319283698038882, + -0.08436772301897838, + -0.3968496024698362, + 0.054207396119886064, + -0.14127481570083644, + -0.17797571145989333, + 0.2470864946234041, + -0.09579029025413616, + 0.21292008334192525, + -0.21987169755404778, + 0.06408426973968306, + -0.0453906104683971, + 0.022774173512028484, + -0.1149643686131675, + 0.3670593761566992, + -0.7007328760112648, + 0.05327099693081466, + 0.2586349044650975, + 0.4257340272748079, + -0.45627273953800024, + 0.2955179234827009, + 0.12779565446571323, + 0.44833047835153317, + -0.008532206987300894, + -0.33968962683140513, + -0.7351155515460945, + 0.11871288268511904, + -0.30028171390627867, + -0.852460216984501, + 0.5792828712807424, + -0.4475398394906627, + 0.5896635911251384, + -0.2224233898074659, + -0.05735073020559156, + 0.318450948303215, + 0.4511065009650537, + -0.4003652542851296, + -0.5104474315996901, + -0.10646409949789626, + 0.4572094850559473, + -0.8092847505994628, + -0.29727853099313273, + -0.29265268848253523, + 0.4629508693841058, + 0.08760049212770565, + 0.7911216827577913, + -0.6875156321712621, + 0.20167672149072713, + 0.5381132289686379, + 0.06948417720766942, + 0.3108459194986043, + -0.6752953397101903, + 0.6438308869979922, + 0.23605636816767522, + 0.4355415070796952, + 0.3320241595518725, + -0.21646106746561433, + 0.1924942852540486, + -0.3687260396767681, + -0.4552400837242567, + -0.17592248017802375, + -0.019073523364456335, + -0.6393198963349391, + -0.4876732880349713, + -0.288934910259837, + -0.3242697884808281, + -0.5604346980510215, + 0.15104804472324407, + -0.02777300640877478, + -0.19989125404182473, + -0.07785346245203834, + 0.34896472925388256, + 0.2831958114046763, + -0.36125266646589677, + 0.2910996437578387, + -0.0645123360292379, + -0.48256449793980233, + 0.214968519778021, + -0.031190116638097454, + 0.284401000661706, + 0.4801499869150927, + -0.38132177222387353, + -0.17342965260412324, + 0.13128391117685373, + 0.2552177900741502, + 0.6009783296742649, + 0.37552718667735585, + 0.40406285360355343, + 0.5304209350065094, + 0.018564849675871964, + -0.07919955560076142, + 0.14483946101469997, + 0.19585486444242578, + -0.25440935895934447, + -0.593071363680364, + 0.2621556103084695, + 0.46878658141966034, + 0.27466524245866925, + 0.47050706760811145, + 0.34708651556649545, + -0.21148618545860876, + 0.3454215054182568, + 0.2886754615268218, + -0.3337895940834569, + -0.06336446199801515, + -0.27811171127149137, + 0.7849195216320046, + 0.3311410057665217, + -0.6334861877194945, + 0.5207717716192395, + 0.13109171037319506, + 0.19756408665110398, + 0.2895522776414026, + -0.7488735872540321, + -0.1203646053585673, + -0.06693480652780714, + -0.27302520973577893, + -0.4425371136041947, + 0.4128686122704011, + -0.445468410208165, + -0.38268086200364526, + 0.24372800414442808, + 0.1929025195228069, + 0.15895278072282454, + 0.07539944493164269, + -0.2708548374237012, + -0.2129630075047665, + 0.055511859030036026, + 0.4305941443098946, + -0.09457133462813117, + 0.0633922169450567, + 0.4332715189763487, + 0.3513150781550805, + 0.1763977085085353, + -0.26365080942031616, + 0.29941696939274415, + -0.254738382330175, + -0.026506814561490788, + 0.44823109614822376, + -0.2508378339053329, + 0.42368937622785857, + 0.39083099731833876, + 0.29935713703560274, + 0.5193807252778897, + 0.3185772299011038, + -0.1946415884064826, + -0.46166524872400955, + -0.1700505374211998, + 0.02318352937095497, + -0.15822469209074225, + -0.569432335726956, + 0.05143755324812743, + 0.07949057985094865, + 0.04346092834699433, + -0.13631302816418128, + -0.2287794089645384, + -0.21883288216272923, + -0.3412590082026117, + 0.26684976770808116, + 0.04151503808646029, + -0.4323235018486948, + 0.3579326597963942, + -0.10711741461790103, + -0.7067806559128441, + -0.40845806760845693, + 0.01341971079320814, + -0.6334886080574007, + -0.49959605377776645, + -0.3294088613824553, + 0.16520218650952007, + -0.26224923122057253, + 0.16273995591836393, + -0.08044364260686565, + -0.10069054978970837, + 0.5859053945352963, + 0.5561080449915506, + 0.3440404842664906, + 0.6749997122592007, + 0.09394860141484396, + 0.010933251380850884, + -0.12931187609184547, + 0.35384024069874564, + -0.620184363730172, + -0.2851175406983686, + 0.5380571845110821, + 0.09957922869771846, + 0.7008117894895871, + 0.1472094340616022, + 0.021081138226581475, + 0.7759021189691742, + 0.6749646619627725, + 0.5950937091240994, + 0.4450766474132092, + -0.6641074923979648, + -0.8927791349673624, + -0.48151352905264366, + -0.5823082921407237, + -0.1703180764090515, + -0.210475830259216, + 0.41052694184765237, + -0.33976496304953563, + -0.12727389938617495, + 0.10353675654004585, + -0.8438593636998214, + -1.9177461002384266e-05, + 0.4624510567165284, + -0.12575158064695213, + -0.07932378712395327, + -0.8871697299232173, + 0.0491945454412932, + -0.4584705598442543, + 0.758916351088984, + -0.8055677980512562, + 0.768162346001548, + -0.2484610985281518, + 0.10363197596278495, + -0.0876577280688442, + 0.06722046528273229, + 0.1334174110712949, + -0.052504003197614724, + 0.8071305948499718, + -0.23083938684164795, + 0.5461359800707929, + -0.08882377837062944, + -0.2293493701271747, + 0.3074752047747317, + 0.9164039643336789, + -0.3358331063012796, + -0.19314869401754675, + 0.6337384964986317, + -0.1460301711430509, + 0.6043599476194625, + -0.3670336119044182, + -0.515547928939075, + 0.10918874251205363, + -0.35219788647043365, + -0.629659862443243, + 0.36642648448878007, + 0.1027388103698686, + -0.19008014030327025, + -0.20773995560198988, + -0.02935185737986462, + -0.209400305313992, + 0.3589442455035306, + -0.12854713864044454, + -0.43045600424043945, + -0.06223150725280524, + 0.05214138419967401, + -0.7056301507392545, + -0.8090100287142648, + -0.08351850302034924, + 0.6308966517375709, + 0.555324985441181, + -0.5525933118203574, + -0.36161123570673337, + -0.4300567743778427, + 0.08226326470601963, + -0.6945966655689791, + 0.3780416093775456, + -0.8508648653264348, + -0.33349405394593284, + -0.22256600447946806, + 0.4521999898738525, + 0.19379482309384477, + 0.29684991648899606, + -0.5714525054116444, + -0.18825551317976358, + 0.0818042939183265, + 0.014766940959941244, + 0.07398017490839326, + 0.045931855796862375, + 0.40033214899023367, + 0.6670565679946153, + 0.3499601928128173, + -0.5836919754111775, + 0.2673071736957138, + -0.417171575577164, + -0.4102280983237722, + -0.2691195287743885, + -0.1470406489925844, + 0.20232355778788436, + 0.08394083989404555, + -0.16485590125023664, + 0.7797840945799788, + 0.025301807154226197, + 0.10512567039783888, + 0.44689043430792197, + 0.24306376589218376, + -0.3349822249102331, + -0.4348139239370413, + -0.05855293805719175, + -0.09164317559006424, + -0.003549853824201088, + 0.6153889518029878, + -0.5997210699089313, + 0.5374798286235652, + 0.7672295985250493, + -0.6177659548670276, + 0.8368202730566746, + 0.07013747326402703, + 0.3946945700145947, + 0.01105021494111158, + -0.5332714950706989, + 0.28226336519733214, + -0.07521970668722422, + -0.4250786269416687, + 0.26159117634880075, + -0.601082303893187, + 0.04287686384447048, + 0.6214445523789404, + -0.29124604152262495, + -0.12056830972949217, + -0.07023784935593569, + -0.8169400463148796, + -0.3654498986727646, + -0.8200870458021015, + 0.2538840371370568, + 0.030693743385322103, + -0.6623731904997276, + 0.21083683277835552, + 0.29031616031633295, + 0.39014922601350555, + -0.18949317077556682, + 0.40468872258475624, + -0.6199021869154014, + -0.15778784402546564, + 0.8903680256159769, + 0.10051908324180858, + 0.4513712337671889, + 0.7269036775827072, + 0.08454206515444673, + -0.031809364018601516, + 0.03100081450628961, + 0.03453292334732605, + 0.012346159724917205, + 0.3524858958387666, + 0.8714749394754459, + -0.1465551723668047, + -0.2991117329432704, + -0.10961136093469714, + -0.6150982248510746, + 0.18511233368690405, + -0.24610629273360696, + -0.05637301358185104, + 0.20738837627095769, + -0.10506806850645412, + -0.13924418670852357, + -0.11282375029453207, + 0.13688437824192673, + -0.8910956555649518, + 0.42392938857902185, + 0.8601602444910729, + -0.13145280758082523, + 0.131936104182383, + -0.3141237597368518, + 0.10759005486495044, + -0.6655116841340099, + 0.33361157309150774, + -0.4864018304710342, + 0.5093548228389838, + 0.16655685942054693, + 0.012748486508789514, + 0.5018142497105504, + 0.36588153890169656, + -0.12595312685614052, + 0.2823640262477958, + -0.272835838793585, + 0.085047482734041, + 0.419343129289115, + -0.07119552900245807, + -0.12404562768645017, + -0.8037667072780462, + -0.01721722953908794, + 0.025902206984476928, + -0.5454359141224812, + 0.18440595587252578, + -0.10583185735114431, + -0.05474713224150596, + 0.7982465800282332, + 0.0137145697210177, + 0.8134531448724865, + -0.03110291207099858, + -0.19109923848431687, + -0.16675126402248996, + -0.39280108768944055, + -0.32484877803759993, + -0.052952235925970204, + -0.9538329593234693, + 0.5482854185540912, + -0.18242424681088598, + 0.351477041122863, + -0.6532456663675055, + -0.041572116933761505, + -0.3034237051215597, + -0.1435271612419563, + -0.023149545259968374, + 0.36590838759984967, + -0.3929117029551652, + -0.44450915431179855, + -0.39966538273681285, + 0.1882449632622868, + -0.6941480105283213, + -0.28567970666645004, + -0.12439026259709124, + 0.4877071686737646, + 0.4157988206999742, + -0.364018648981912, + -0.21944357870993025, + -0.08540316271317294, + -0.05413426064835014, + 0.1896122948513394, + 0.4657998487933882, + -0.4927333360324064, + 0.628661090562116, + 0.31678502880841963, + -0.0029768706701352454, + -0.2338074995690982, + 0.3148185864062454, + -0.1651610555256925, + -0.4560275131083453, + -0.46293405338164645, + 0.20179761243797123, + -0.8661218987834243, + -0.26817656407051815, + 0.5863738086573801, + -0.08351615225196707, + -0.05112999201259544, + -0.09186054976932995, + -0.400904570812313, + 0.2940895356989712, + -0.2927009541726646, + 0.45226795467149755, + -0.9371835943643235, + -0.3731155833568836, + 0.040945378246780906, + -0.07296882661927784, + 0.3593398570045425, + -0.1622460701100572, + 0.7696110842936722, + -0.7160842264043168, + 0.15890967797459477, + 0.692989354885607, + -0.07707231692631428, + 0.3659156159962131, + -0.02114693387815819, + 0.08728457342166906, + -0.6636698969298985, + -0.09690753926342544, + 0.6022343969098213, + 0.41532651562375056, + -0.30515317338961323, + 0.7429823224336526, + -0.25480493766297685, + -0.11648754009388407, + -0.038341811457043073, + 0.2299683931825327, + 0.14276343077682468, + 0.5670594859367221, + 0.19643684541710732, + -0.20722092606969894, + 0.47605831317556907, + 0.26565276236107116, + 0.2599769114986943, + -0.44644837758277295, + 0.5470043574241269, + 0.3358341575040657, + -0.4063897273993119, + 0.028464129063372534, + -0.32927180106415327, + 0.12779599892890453, + 0.5086176672580498, + -0.13259720319006696, + -0.43696703070386866, + -0.789687278497269, + -0.6276157659725945, + -0.608544409309828, + 0.2433523418428088, + -0.1838773840778603, + -0.100811232059414, + -0.09174906102349495, + 0.5939835462389166, + 0.7395308404096218, + -0.15758424981590913, + 0.02417094880002041, + -0.376414975942684, + -0.13207785507351721, + -0.4080494077891152, + 0.1377281213383592, + -0.22718462784338234, + 0.43878717468054274, + 0.026771185513420948, + -0.2322956713107247, + -0.7262238842629296, + -0.5279694996400659, + -0.13085907450563827, + 0.1588982975622651 + ], + "rows": 192 + } + ], + "source": "Generated by scripts/generate_benchmark_fixtures.py.", + "version": 1 +} diff --git a/Sources/MaxVolBenchmark/main.swift b/Sources/MaxVolBenchmark/main.swift new file mode 100644 index 0000000..7770eda --- /dev/null +++ b/Sources/MaxVolBenchmark/main.swift @@ -0,0 +1,432 @@ +import Foundation +import MaxVol + +struct FixtureFile: Decodable { + let version: Int + let source: String + let fixtures: [BenchmarkFixture] +} + +struct BenchmarkFixture: Decodable { + let id: String + let description: String + let rows: Int + let columns: Int + let rowMajorValues: [Double] +} + +struct BenchmarkConfiguration { + var fixtureFilter: String? + var algorithmFilter = BenchmarkAlgorithm.all + var scalarFilter = BenchmarkScalar.all + var iterations = 10 + var rectangularMinRows: Int? +} + +enum BenchmarkAlgorithm: String, CaseIterable { + case all + case square + case rectangular + + var selectedAlgorithms: [BenchmarkAlgorithm] { + switch self { + case .all: + [.square, .rectangular] + case .square, .rectangular: + [self] + } + } +} + +enum BenchmarkScalar: String, CaseIterable { + case all + case double + case float + + var selectedScalars: [BenchmarkScalar] { + switch self { + case .all: + [.double, .float] + case .double, .float: + [self] + } + } +} + +struct BenchmarkRecord: Encodable { + let tool: String + let fixture: String + let algorithm: String + let scalar: String + let rows: Int + let columns: Int + let repetitions: Int + let elapsedNanoseconds: UInt64 + let averageNanoseconds: Double + let selectedRowCount: Int + let algorithmIterations: Int + let converged: Bool + let maxCoefficientMagnitude: Double + let maxUnselectedRowNorm: Double? + let reconstructionResidual: Double +} + +enum BenchmarkError: Error, CustomStringConvertible { + case invalidArgument(String) + case missingArgumentValue(String) + case missingFixtureResource + case fixtureNotFound(String) + + var description: String { + switch self { + case let .invalidArgument(argument): + "Unrecognized MaxVolBenchmark argument '\(argument)'." + case let .missingArgumentValue(argument): + "MaxVolBenchmark argument '\(argument)' requires a value." + case .missingFixtureResource: + "MaxVolBenchmark could not find its bundled fixtures.json resource. Rebuild the MaxVolBenchmark product and verify the package resource is declared in Package.swift." + case let .fixtureNotFound(identifier): + "No benchmark fixture matched '\(identifier)'." + } + } +} + +let configuration = try parseArguments(Array(CommandLine.arguments.dropFirst())) +let fixtureFile = try loadFixtureFile() +let fixtures = try selectedFixtures(from: fixtureFile, configuration: configuration) +let encoder = JSONEncoder() +encoder.outputFormatting = [.sortedKeys] + +for fixture in fixtures { + for algorithm in configuration.algorithmFilter.selectedAlgorithms { + for scalar in configuration.scalarFilter.selectedScalars { + let record = try runBenchmark( + fixture: fixture, + algorithm: algorithm, + scalar: scalar, + configuration: configuration + ) + let data = try encoder.encode(record) + print(String(decoding: data, as: UTF8.self)) + } + } +} + +func parseArguments(_ arguments: [String]) throws -> BenchmarkConfiguration { + var configuration = BenchmarkConfiguration() + var index = 0 + + while index < arguments.count { + let argument = arguments[index] + switch argument { + case "--fixture": + configuration.fixtureFilter = try value(after: argument, at: &index, in: arguments) + case "--algorithm": + let rawValue = try value(after: argument, at: &index, in: arguments) + guard let algorithm = BenchmarkAlgorithm(rawValue: rawValue) else { + throw BenchmarkError.invalidArgument("\(argument) \(rawValue)") + } + + configuration.algorithmFilter = algorithm + case "--scalar": + let rawValue = try value(after: argument, at: &index, in: arguments) + guard let scalar = BenchmarkScalar(rawValue: rawValue) else { + throw BenchmarkError.invalidArgument("\(argument) \(rawValue)") + } + + configuration.scalarFilter = scalar + case "--iterations": + let rawValue = try value(after: argument, at: &index, in: arguments) + guard let iterations = Int(rawValue), iterations > 0 else { + throw BenchmarkError.invalidArgument("\(argument) \(rawValue)") + } + + configuration.iterations = iterations + case "--rectangular-min-rows": + let rawValue = try value(after: argument, at: &index, in: arguments) + guard let minRows = Int(rawValue), minRows > 0 else { + throw BenchmarkError.invalidArgument("\(argument) \(rawValue)") + } + + configuration.rectangularMinRows = minRows + case "--help", "-h": + printUsage() + Foundation.exit(0) + default: + throw BenchmarkError.invalidArgument(argument) + } + index += 1 + } + + return configuration +} + +func value(after argument: String, at index: inout Int, in arguments: [String]) throws -> String { + let valueIndex = index + 1 + guard valueIndex < arguments.count else { + throw BenchmarkError.missingArgumentValue(argument) + } + + index = valueIndex + return arguments[valueIndex] +} + +func printUsage() { + print( + """ + Usage: MaxVolBenchmark [--fixture ] [--algorithm all|square|rectangular] [--scalar all|double|float] [--iterations ] [--rectangular-min-rows ] + + Prints one JSON object per benchmark result. Build with: + swift build -c release --product MaxVolBenchmark + """ + ) +} + +func loadFixtureFile() throws -> FixtureFile { + guard let url = Bundle.module.url(forResource: "fixtures", withExtension: "json") else { + throw BenchmarkError.missingFixtureResource + } + + let data = try Data(contentsOf: url) + return try JSONDecoder().decode(FixtureFile.self, from: data) +} + +func selectedFixtures( + from fixtureFile: FixtureFile, + configuration: BenchmarkConfiguration +) throws -> [BenchmarkFixture] { + guard let fixtureFilter = configuration.fixtureFilter else { + return fixtureFile.fixtures + } + + let fixtures = fixtureFile.fixtures.filter { $0.id == fixtureFilter } + guard !fixtures.isEmpty else { + throw BenchmarkError.fixtureNotFound(fixtureFilter) + } + + return fixtures +} + +func runBenchmark( + fixture: BenchmarkFixture, + algorithm: BenchmarkAlgorithm, + scalar: BenchmarkScalar, + configuration: BenchmarkConfiguration +) throws -> BenchmarkRecord { + switch scalar { + case .double: + return try runDoubleBenchmark( + fixture: fixture, + algorithm: algorithm, + configuration: configuration + ) + case .float: + return try runFloatBenchmark( + fixture: fixture, + algorithm: algorithm, + configuration: configuration + ) + case .all: + preconditionFailure("Expanded scalar filters should not include .all.") + } +} + +func runDoubleBenchmark( + fixture: BenchmarkFixture, + algorithm: BenchmarkAlgorithm, + configuration: BenchmarkConfiguration +) throws -> BenchmarkRecord { + let matrix = try DenseColumnMajorMatrix( + rows: fixture.rows, + columns: fixture.columns, + rowMajorValues: fixture.rowMajorValues + ) + _ = try runDoubleAlgorithm(matrix, algorithm: algorithm, configuration: configuration) + + let start = DispatchTime.now().uptimeNanoseconds + var latest = try runDoubleAlgorithm(matrix, algorithm: algorithm, configuration: configuration) + for _ in 1.. BenchmarkRecord { + let matrix = try DenseColumnMajorMatrix( + rows: fixture.rows, + columns: fixture.columns, + rowMajorValues: fixture.rowMajorValues.map(Float.init) + ) + _ = try runFloatAlgorithm(matrix, algorithm: algorithm, configuration: configuration) + + let start = DispatchTime.now().uptimeNanoseconds + var latest = try runFloatAlgorithm(matrix, algorithm: algorithm, configuration: configuration) + for _ in 1.., + algorithm: BenchmarkAlgorithm, + configuration: BenchmarkConfiguration +) throws -> MaxVolResult { + switch algorithm { + case .square: + try maxVol(matrix, options: MaxVolOptions(tolerance: 1.05, maxIterations: 200)) + case .rectangular: + try rectMaxVol( + matrix, + options: RectMaxVolOptions( + tolerance: 1.0, + minRows: configuration.rectangularMinRows, + startMaxVolIterations: 10 + ) + ) + case .all: + preconditionFailure("Expanded algorithm filters should not include .all.") + } +} + +func runFloatAlgorithm( + _ matrix: DenseColumnMajorMatrix, + algorithm: BenchmarkAlgorithm, + configuration: BenchmarkConfiguration +) throws -> MaxVolResult { + switch algorithm { + case .square: + try maxVol(matrix, options: MaxVolOptions(tolerance: 1.05, maxIterations: 200)) + case .rectangular: + try rectMaxVol( + matrix, + options: RectMaxVolOptions( + tolerance: 1.0, + minRows: configuration.rectangularMinRows, + startMaxVolIterations: 10 + ) + ) + case .all: + preconditionFailure("Expanded algorithm filters should not include .all.") + } +} + +func maximumAbsoluteCoefficient( + in coefficients: DenseColumnMajorMatrix +) -> Double { + coefficients.values.map(abs).max() ?? 0 +} + +func maximumAbsoluteCoefficient( + in coefficients: DenseColumnMajorMatrix +) -> Double { + coefficients.values.map { Double(abs($0)) }.max() ?? 0 +} + +func maximumUnselectedRowNorm(in result: MaxVolResult) -> Double { + let selected = Set(result.selectedRows) + return (0..) -> Double { + let selected = Set(result.selectedRows) + return (0.., + result: MaxVolResult +) throws -> Double { + var residual = 0.0 + for row in 0.., + result: MaxVolResult +) throws -> Float { + var residual: Float = 0 + for row in 0.., - using result: MaxVolResult, - tolerance: Float = 1e-5 -) throws { - for row in 0.., - rowMajorValues: [Float], - tolerance: Float = 5e-6 -) throws { - let expected = try DenseColumnMajorMatrix( - rows: coefficients.rows, - columns: coefficients.columns, - rowMajorValues: rowMajorValues - ) - - for row in 0..) throws { - for (identityColumn, selectedRow) in result.selectedRows.enumerated() { - for column in 0.. -) -> Double { - coefficients.values.map { Double(abs($0)) }.max() ?? 0 -} - -private func maximumUnselectedRowNorm(in result: MaxVolResult) -> Double { - let selected = Set(result.selectedRows) - return (0.. DenseColumnMajorMatrix { - var generator = SeededGenerator(state: seed) - var columnVectors = (0.. [Double] in - (0.. Double { - zip(left, right).reduce(0) { total, pair in - total + pair.0 * pair.1 - } -} - -private struct SeededGenerator { - var state: UInt64 - - mutating func nextDouble() -> Double { - state = state &* 6_364_136_223_846_793_005 &+ 1_442_695_040_888_963_407 - let scaled = Double(state >> 11) / Double(UInt64.max >> 11) - return scaled * 2 - 1 - } -} - -private extension DenseColumnMajorMatrix where Scalar == Double { - func mapValues( - _ transform: (Double) -> Output - ) throws -> DenseColumnMajorMatrix { - try DenseColumnMajorMatrix( - rows: rows, - columns: columns, - columnMajorValues: values.map(transform) - ) - } -} diff --git a/Tests/MaxVolTests/NumericalBehaviorTests.swift b/Tests/MaxVolTests/NumericalBehaviorTests.swift index bf9b587..679f997 100644 --- a/Tests/MaxVolTests/NumericalBehaviorTests.swift +++ b/Tests/MaxVolTests/NumericalBehaviorTests.swift @@ -74,142 +74,3 @@ struct NumericalBehaviorTests { } } } - -private func expectReconstruction( - of matrix: DenseColumnMajorMatrix, - using result: MaxVolResult, - tolerance: Double -) throws { - for row in 0.., - using result: MaxVolResult, - tolerance: Float -) throws { - for row in 0.. -) -> Double { - coefficients.values.map(abs).max() ?? 0 -} - -private func maximumAbsoluteCoefficient( - in coefficients: DenseColumnMajorMatrix -) -> Double { - coefficients.values.map { Double(abs($0)) }.max() ?? 0 -} - -private func maximumUnselectedRowNorm(in result: MaxVolResult) -> Double { - let selected = Set(result.selectedRows) - return (0..) -> Double { - let selected = Set(result.selectedRows) - return (0.. DenseColumnMajorMatrix { - var generator = SeededGenerator(state: seed) - var columnVectors = (0.. [Double] in - (0.. Double { - zip(left, right).reduce(0) { total, pair in - total + pair.0 * pair.1 - } -} - -private struct SeededGenerator { - var state: UInt64 - - mutating func nextDouble() -> Double { - state = state &* 6_364_136_223_846_793_005 &+ 1_442_695_040_888_963_407 - let scaled = Double(state >> 11) / Double(UInt64.max >> 11) - return scaled * 2 - 1 - } -} - -private extension DenseColumnMajorMatrix where Scalar == Double { - func mapValues( - _ transform: (Double) -> Output - ) throws -> DenseColumnMajorMatrix { - try DenseColumnMajorMatrix( - rows: rows, - columns: columns, - columnMajorValues: values.map(transform) - ) - } -} diff --git a/Tests/MaxVolTests/RectMaxVolTests.swift b/Tests/MaxVolTests/RectMaxVolTests.swift index bfe5b9f..bcf7dc8 100644 --- a/Tests/MaxVolTests/RectMaxVolTests.swift +++ b/Tests/MaxVolTests/RectMaxVolTests.swift @@ -199,121 +199,3 @@ struct RectMaxVolTests { try expectSelectedRowsAreIdentity(rectangular) } } - -private func expectReconstruction( - of matrix: DenseColumnMajorMatrix, - using result: MaxVolResult, - tolerance: Double = 1e-10 -) throws { - for row in 0.., - rowMajorValues: [Double], - tolerance: Double = 1e-12 -) throws { - let expected = try DenseColumnMajorMatrix( - rows: coefficients.rows, - columns: coefficients.columns, - rowMajorValues: rowMajorValues - ) - - for row in 0..) throws { - for (identityColumn, selectedRow) in result.selectedRows.enumerated() { - for column in 0.. -) -> Double { - coefficients.values.map(abs).max() ?? 0 -} - -private func maximumUnselectedRowNorm(in result: MaxVolResult) -> Double { - let selected = Set(result.selectedRows) - return (0.. DenseColumnMajorMatrix { - var generator = SeededGenerator(state: seed) - var columnVectors = (0.. [Double] in - (0.. Double { - zip(left, right).reduce(0) { total, pair in - total + pair.0 * pair.1 - } -} - -private struct SeededGenerator { - var state: UInt64 - - mutating func nextDouble() -> Double { - state = state &* 6_364_136_223_846_793_005 &+ 1_442_695_040_888_963_407 - let scaled = Double(state >> 11) / Double(UInt64.max >> 11) - return scaled * 2 - 1 - } -} diff --git a/Tests/MaxVolTests/TestSupport.swift b/Tests/MaxVolTests/TestSupport.swift new file mode 100644 index 0000000..e3183bc --- /dev/null +++ b/Tests/MaxVolTests/TestSupport.swift @@ -0,0 +1,207 @@ +@testable import MaxVol +import Testing + +func expectReconstruction( + of matrix: DenseColumnMajorMatrix, + using result: MaxVolResult, + tolerance: Double = 1e-10 +) throws { + for row in 0.., + using result: MaxVolResult, + tolerance: Float = 1e-5 +) throws { + for row in 0.., + rowMajorValues: [Double], + tolerance: Double = 1e-12 +) throws { + let expected = try DenseColumnMajorMatrix( + rows: coefficients.rows, + columns: coefficients.columns, + rowMajorValues: rowMajorValues + ) + + for row in 0.., + rowMajorValues: [Float], + tolerance: Float = 5e-6 +) throws { + let expected = try DenseColumnMajorMatrix( + rows: coefficients.rows, + columns: coefficients.columns, + rowMajorValues: rowMajorValues + ) + + for row in 0.., + tolerance: Double = 1e-12 +) throws { + for (identityColumn, selectedRow) in result.selectedRows.enumerated() { + for column in 0.., + tolerance: Float = 1e-6 +) throws { + for (identityColumn, selectedRow) in result.selectedRows.enumerated() { + for column in 0.. +) -> Double { + coefficients.values.map(abs).max() ?? 0 +} + +func maximumAbsoluteCoefficient( + in coefficients: DenseColumnMajorMatrix +) -> Double { + coefficients.values.map { Double(abs($0)) }.max() ?? 0 +} + +func maximumUnselectedRowNorm(in result: MaxVolResult) -> Double { + let selected = Set(result.selectedRows) + return (0..) -> Double { + let selected = Set(result.selectedRows) + return (0.. DenseColumnMajorMatrix { + var generator = SeededGenerator(state: seed) + var columnVectors = (0.. [Double] in + (0.. Double { + zip(left, right).reduce(0) { total, pair in + total + pair.0 * pair.1 + } +} + +struct SeededGenerator { + var state: UInt64 + + mutating func nextDouble() -> Double { + state = state &* 6_364_136_223_846_793_005 &+ 1_442_695_040_888_963_407 + let scaled = Double(state >> 11) / Double(UInt64.max >> 11) + return scaled * 2 - 1 + } +} + +extension DenseColumnMajorMatrix where Scalar == Double { + func mapValues( + _ transform: (Double) -> Output + ) throws -> DenseColumnMajorMatrix { + try DenseColumnMajorMatrix( + rows: rows, + columns: columns, + columnMajorValues: values.map(transform) + ) + } +} diff --git a/scripts/check_benchmark_parity.py b/scripts/check_benchmark_parity.py new file mode 100755 index 0000000..772362e --- /dev/null +++ b/scripts/check_benchmark_parity.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +"""Compare MaxVolBenchmark JSONL with maxvolpy JSONL for correctness parity.""" + +from __future__ import annotations + +import argparse +import json +from pathlib import Path +from typing import Any + + +def load_records(path: Path) -> dict[tuple[str, str, str], dict[str, Any]]: + records: dict[tuple[str, str, str], dict[str, Any]] = {} + for line in path.read_text(encoding="utf-8").splitlines(): + if not line.strip(): + continue + record = json.loads(line) + key = (record["fixture"], record["algorithm"], record["scalar"]) + records[key] = record + return records + + +def tolerance_for(scalar: str) -> float: + return 1e-4 if scalar == "float" else 1e-8 + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("swift_jsonl", type=Path) + parser.add_argument("python_jsonl", type=Path) + args = parser.parse_args() + + swift_records = load_records(args.swift_jsonl) + python_records = load_records(args.python_jsonl) + + missing_from_python = sorted(set(swift_records) - set(python_records)) + missing_from_swift = sorted(set(python_records) - set(swift_records)) + if missing_from_python or missing_from_swift: + raise SystemExit( + "Benchmark result keys differ. " + f"Missing from Python: {missing_from_python}. " + f"Missing from Swift: {missing_from_swift}." + ) + + failures: list[str] = [] + for key in sorted(swift_records): + swift = swift_records[key] + python = python_records[key] + tolerance = tolerance_for(swift["scalar"]) + + if swift["selectedRowCount"] != python["selectedRowCount"]: + failures.append( + f"{key}: selected row count differs " + f"Swift={swift['selectedRowCount']} Python={python['selectedRowCount']}" + ) + + residual_delta = abs(swift["reconstructionResidual"] - python["reconstructionResidual"]) + if residual_delta > tolerance: + failures.append( + f"{key}: reconstruction residual differs by {residual_delta}, tolerance {tolerance}" + ) + + swift_norm = swift.get("maxUnselectedRowNorm") + python_norm = python.get("maxUnselectedRowNorm") + if swift_norm is not None and python_norm is not None and abs(swift_norm - python_norm) > tolerance: + failures.append( + f"{key}: rectangular row norm differs " + f"Swift={swift_norm} Python={python_norm}, tolerance {tolerance}" + ) + + if failures: + raise SystemExit("\n".join(failures)) + + print(f"Benchmark parity passed for {len(swift_records)} result keys.") + + +if __name__ == "__main__": + main() diff --git a/scripts/compare_maxvolpy.py b/scripts/compare_maxvolpy.py new file mode 100755 index 0000000..bc8acd6 --- /dev/null +++ b/scripts/compare_maxvolpy.py @@ -0,0 +1,173 @@ +#!/usr/bin/env -S uv run +# /// script +# requires-python = ">=3.11,<3.12" +# dependencies = [ +# "numpy==1.26.4", +# "scipy==1.11.4", +# ] +# /// +"""Run the official maxvolpy implementation against MaxVol benchmark fixtures.""" + +from __future__ import annotations + +import argparse +import contextlib +import importlib +import json +import sys +import tarfile +import time +import urllib.request +from pathlib import Path +from tempfile import TemporaryDirectory +from typing import Any + +import numpy as np + + +MAXVOLPY_VERSION = "0.3.8" +MAXVOLPY_SDIST_URL = ( + "https://files.pythonhosted.org/packages/4a/cd/" + "142dc96f91db394c4a9c212c59ee17e67e3324dba6ff05346d269d5b6731/" + "maxvolpy-0.3.8.tar.gz" +) + + +def safe_extract(source: tarfile.TarFile, destination: Path) -> None: + destination = destination.resolve() + for member in source.getmembers(): + target = (destination / member.name).resolve() + if not target.is_relative_to(destination): + raise RuntimeError(f"Refusing to extract unsafe maxvolpy archive member: {member.name}") + source.extractall(destination) + + +def load_maxvol_module(source_dir: Path | None): + if source_dir is None: + with TemporaryDirectory(prefix="maxvolpy-") as temporary_directory: + source_dir = Path(temporary_directory) + archive = source_dir / "maxvolpy.tar.gz" + urllib.request.urlretrieve(MAXVOLPY_SDIST_URL, archive) + with tarfile.open(archive) as tar: + safe_extract(tar, source_dir) + package_root = source_dir / f"maxvolpy-{MAXVOLPY_VERSION}" + sys.path.insert(0, str(package_root)) + with contextlib.redirect_stdout(sys.stderr): + return importlib.import_module("maxvolpy.maxvol") + + sys.path.insert(0, str(source_dir)) + with contextlib.redirect_stdout(sys.stderr): + return importlib.import_module("maxvolpy.maxvol") + + +def run_algorithm(module: Any, matrix: np.ndarray, algorithm: str, implementation: str): + if algorithm == "square": + function = module.py_maxvol if implementation == "pure" else module.maxvol + return function(matrix, tol=1.05, max_iters=200) + + function = module.py_rect_maxvol if implementation == "pure" else module.rect_maxvol + return function(matrix, tol=1.0, start_maxvol_iters=10) + + +def reconstruction_residual(matrix: np.ndarray, pivots: np.ndarray, coefficients: np.ndarray) -> float: + reconstructed = coefficients.dot(matrix[pivots]) + return float(np.max(np.abs(matrix - reconstructed))) + + +def max_unselected_row_norm(pivots: np.ndarray, coefficients: np.ndarray) -> float | None: + selected = set(int(row) for row in pivots) + norms = [ + float(np.linalg.norm(coefficients[row], ord=2)) + for row in range(coefficients.shape[0]) + if row not in selected + ] + return max(norms) if norms else 0.0 + + +def benchmark_fixture( + module: Any, + fixture: dict[str, Any], + algorithm: str, + scalar: str, + implementation: str, + repetitions: int, +) -> dict[str, Any]: + dtype = np.float32 if scalar == "float" else np.float64 + matrix = np.array(fixture["rowMajorValues"], dtype=dtype).reshape(fixture["rows"], fixture["columns"]) + run_algorithm(module, matrix, algorithm, implementation) + + start = time.perf_counter_ns() + pivots, coefficients = run_algorithm(module, matrix, algorithm, implementation) + for _ in range(1, repetitions): + pivots, coefficients = run_algorithm(module, matrix, algorithm, implementation) + elapsed = time.perf_counter_ns() - start + + return { + "tool": "maxvolpy", + "implementation": implementation, + "fixture": fixture["id"], + "algorithm": algorithm, + "scalar": scalar, + "rows": fixture["rows"], + "columns": fixture["columns"], + "repetitions": repetitions, + "elapsedNanoseconds": elapsed, + "averageNanoseconds": elapsed / repetitions, + "selectedRowCount": int(len(pivots)), + "algorithmIterations": None, + "converged": None, + "maxCoefficientMagnitude": float(np.max(np.abs(coefficients))), + "maxUnselectedRowNorm": ( + max_unselected_row_norm(pivots, coefficients) + if algorithm == "rectangular" + else None + ), + "reconstructionResidual": reconstruction_residual(matrix, pivots, coefficients), + } + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--fixtures", default="Sources/MaxVolBenchmark/Resources/fixtures.json") + parser.add_argument("--fixture") + parser.add_argument("--algorithm", choices=["all", "square", "rectangular"], default="all") + parser.add_argument("--scalar", choices=["all", "double", "float"], default="all") + parser.add_argument("--implementation", choices=["pure", "api"], default="pure") + parser.add_argument("--iterations", type=int, default=10) + parser.add_argument("--maxvolpy-source-dir", type=Path) + args = parser.parse_args() + + if args.iterations <= 0: + raise SystemExit("--iterations must be greater than zero.") + + fixtures_file = json.loads(Path(args.fixtures).read_text(encoding="utf-8")) + fixtures = fixtures_file["fixtures"] + if args.fixture is not None: + fixtures = [fixture for fixture in fixtures if fixture["id"] == args.fixture] + if not fixtures: + raise SystemExit(f"No benchmark fixture matched '{args.fixture}'.") + + algorithms = ["square", "rectangular"] if args.algorithm == "all" else [args.algorithm] + scalars = ["double", "float"] if args.scalar == "all" else [args.scalar] + module = load_maxvol_module(args.maxvolpy_source_dir) + + for fixture in fixtures: + for algorithm in algorithms: + for scalar in scalars: + print( + json.dumps( + benchmark_fixture( + module, + fixture, + algorithm, + scalar, + args.implementation, + args.iterations, + ), + sort_keys=True, + ) + ) + + +if __name__ == "__main__": + main() diff --git a/scripts/generate_benchmark_fixtures.py b/scripts/generate_benchmark_fixtures.py new file mode 100755 index 0000000..be45499 --- /dev/null +++ b/scripts/generate_benchmark_fixtures.py @@ -0,0 +1,137 @@ +#!/usr/bin/env python3 +"""Generate deterministic benchmark fixtures shared by Swift and Python harnesses.""" + +from __future__ import annotations + +import argparse +import json +from pathlib import Path + + +def next_double(state: int) -> tuple[int, float]: + state = (state * 6_364_136_223_846_793_005 + 1_442_695_040_888_963_407) & ((1 << 64) - 1) + scaled = (state >> 11) / float((1 << 53) - 1) + return state, scaled * 2.0 - 1.0 + + +def gaussian_like(rows: int, columns: int, seed: int, diagonal_boost: float) -> list[float]: + state = seed + values: list[float] = [] + for row in range(rows): + for column in range(columns): + state, first = next_double(state) + state, second = next_double(state) + value = 0.5 * first + 0.5 * second + if row == column: + value += diagonal_boost + values.append(value) + return values + + +def dot(left: list[float], right: list[float]) -> float: + return sum(a * b for a, b in zip(left, right)) + + +def orthonormal(rows: int, columns: int, seed: int) -> list[float]: + state = seed + vectors: list[list[float]] = [] + for column in range(columns): + vector: list[float] = [] + for row in range(rows): + state, value = next_double(state) + vector.append(value + (1.0 if row == column else 0.0)) + vectors.append(vector) + + for column in range(columns): + for prior in range(column): + projection = dot(vectors[column], vectors[prior]) + for row in range(rows): + vectors[column][row] -= projection * vectors[prior][row] + + norm = dot(vectors[column], vectors[column]) ** 0.5 + for row in range(rows): + vectors[column][row] /= norm + + return [vectors[column][row] for row in range(rows) for column in range(columns)] + + +def fixture(identifier: str, rows: int, columns: int, values: list[float], description: str) -> dict: + return { + "id": identifier, + "description": description, + "rows": rows, + "columns": columns, + "rowMajorValues": values, + } + + +def build_fixtures() -> dict: + return { + "version": 1, + "source": "Generated by scripts/generate_benchmark_fixtures.py.", + "fixtures": [ + fixture( + "square-swap-3x2", + 3, + 2, + [ + 0.25, 0.0, + 0.5, 1.0, + 0.5, 1.5, + ], + "Small fixture that performs one square MaxVol row swap.", + ), + fixture( + "rect-append-5x2", + 5, + 2, + [ + 1.0, 0.0, + 0.0, 1.0, + 1.2, 0.2, + 0.1, 1.3, + 0.8, 0.8, + ], + "Small fixture that appends one RectMaxVol row.", + ), + fixture( + "gaussian-64x8", + 64, + 8, + gaussian_like(64, 8, 0x6408_2026, 1.0), + "Medium full-rank Gaussian-like tall matrix with a diagonal boost.", + ), + fixture( + "orthonormal-96x12", + 96, + 12, + orthonormal(96, 12, 0x9612_2026), + "Medium tall matrix with deterministic orthonormal columns.", + ), + fixture( + "gaussian-192x16", + 192, + 16, + gaussian_like(192, 16, 0x1921_62026, 1.0), + "Larger full-rank Gaussian-like tall matrix for timing and profiling.", + ), + ], + } + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--output", + default="Sources/MaxVolBenchmark/Resources/fixtures.json", + help="Fixture JSON path to write.", + ) + args = parser.parse_args() + + output = Path(args.output) + output.parent.mkdir(parents=True, exist_ok=True) + output.write_text(json.dumps(build_fixtures(), indent=2, sort_keys=True) + "\n", encoding="utf-8") + + +if __name__ == "__main__": + main()