From 017726c604595dbb87a0458d8190a52b2bf443af Mon Sep 17 00:00:00 2001
From: Thibault Hallouin <thibault.hallouin@inrae.fr>
Date: Mon, 13 Feb 2023 14:03:25 +0100
Subject: [PATCH] move expected outputs into CSV files

---
 tests/CMakeLists.txt                |   2 +-
 tests/expected/evald/KGE.csv        |  51 +++
 tests/expected/evald/KGEPRIME.csv   |  51 +++
 tests/expected/evald/KGEPRIME_D.csv |  51 +++
 tests/expected/evald/KGE_D.csv      |  51 +++
 tests/expected/evald/MAE.csv        |  51 +++
 tests/expected/evald/MARE.csv       |  51 +++
 tests/expected/evald/MSE.csv        |  51 +++
 tests/expected/evald/NSE.csv        |  51 +++
 tests/expected/evald/RMSE.csv       |  51 +++
 tests/expected/evalp/AS.csv         |   1 +
 tests/expected/evalp/AW.csv         |   1 +
 tests/expected/evalp/AWI.csv        |   1 +
 tests/expected/evalp/AWN.csv        |   1 +
 tests/expected/evalp/BS.csv         |   4 +
 tests/expected/evalp/BSS.csv        |   4 +
 tests/expected/evalp/BS_CRD.csv     |   4 +
 tests/expected/evalp/BS_LBD.csv     |   4 +
 tests/expected/evalp/CR.csv         |   1 +
 tests/expected/evalp/CRPS.csv       |   1 +
 tests/expected/evalp/CSI.csv        |  52 +++
 tests/expected/evalp/DS.csv         |   1 +
 tests/expected/evalp/FAR.csv        |  52 +++
 tests/expected/evalp/POD.csv        |  52 +++
 tests/expected/evalp/POFD.csv       |  52 +++
 tests/expected/evalp/QS.csv         |   1 +
 tests/expected/evalp/RANK_HIST.csv  |   1 +
 tests/expected/evalp/ROCSS.csv      |   4 +
 tests/expected/evalp/WS.csv         |   1 +
 tests/expected/evalp/WSS.csv        |   1 +
 tests/test_determinist.cpp          | 251 +++++++--------
 tests/test_probabilist.cpp          | 484 ++++++----------------------
 32 files changed, 902 insertions(+), 533 deletions(-)
 create mode 100644 tests/expected/evald/KGE.csv
 create mode 100644 tests/expected/evald/KGEPRIME.csv
 create mode 100644 tests/expected/evald/KGEPRIME_D.csv
 create mode 100644 tests/expected/evald/KGE_D.csv
 create mode 100644 tests/expected/evald/MAE.csv
 create mode 100644 tests/expected/evald/MARE.csv
 create mode 100644 tests/expected/evald/MSE.csv
 create mode 100644 tests/expected/evald/NSE.csv
 create mode 100644 tests/expected/evald/RMSE.csv
 create mode 100644 tests/expected/evalp/AS.csv
 create mode 100644 tests/expected/evalp/AW.csv
 create mode 100644 tests/expected/evalp/AWI.csv
 create mode 100644 tests/expected/evalp/AWN.csv
 create mode 100644 tests/expected/evalp/BS.csv
 create mode 100644 tests/expected/evalp/BSS.csv
 create mode 100644 tests/expected/evalp/BS_CRD.csv
 create mode 100644 tests/expected/evalp/BS_LBD.csv
 create mode 100644 tests/expected/evalp/CR.csv
 create mode 100644 tests/expected/evalp/CRPS.csv
 create mode 100644 tests/expected/evalp/CSI.csv
 create mode 100644 tests/expected/evalp/DS.csv
 create mode 100644 tests/expected/evalp/FAR.csv
 create mode 100644 tests/expected/evalp/POD.csv
 create mode 100644 tests/expected/evalp/POFD.csv
 create mode 100644 tests/expected/evalp/QS.csv
 create mode 100644 tests/expected/evalp/RANK_HIST.csv
 create mode 100644 tests/expected/evalp/ROCSS.csv
 create mode 100644 tests/expected/evalp/WS.csv
 create mode 100644 tests/expected/evalp/WSS.csv

diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 2475248..a67f819 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -49,7 +49,7 @@ target_include_directories(
 target_compile_definitions(
         evalhyd_tests
         PRIVATE
-                EVALHYD_DATA_DIR="${CMAKE_CURRENT_SOURCE_DIR}/data"
+                EVALHYD_DATA_DIR="${CMAKE_CURRENT_SOURCE_DIR}"
 )
 
 target_link_libraries(
diff --git a/tests/expected/evald/KGE.csv b/tests/expected/evald/KGE.csv
new file mode 100644
index 0000000..65b1265
--- /dev/null
+++ b/tests/expected/evald/KGE.csv
@@ -0,0 +1,51 @@
+0.7480876678384525
+0.74610619665192
+0.7441110304778197
+0.7430108522656984
+0.7417677706194681
+0.740519915124128
+0.7396393314765528
+0.7391812106418076
+0.7385521156240031
+0.7374975605864584
+0.736478762920044
+0.7356032352557134
+0.7349262719558889
+0.7341531483736209
+0.7335193136927298
+0.732498016247827
+0.7316031283668971
+0.7311620062353068
+0.7304853804554484
+0.7298301318606002
+0.7291682672297097
+0.7284933080332816
+0.7278420198262487
+0.7273338548948837
+0.7266696338186898
+0.7261028872180326
+0.7255515136947399
+0.7249203100577184
+0.724129099815763
+0.7235915471922136
+0.723195030128365
+0.7223157825504646
+0.7214401411915639
+0.7203988937539173
+0.7197737983854688
+0.7188157660001235
+0.7176518268945717
+0.716230562324343
+0.7149933138365094
+0.7133901818967825
+0.7126230134351779
+0.711672543996632
+0.7101399598194
+0.7086263896776204
+0.7068405183946846
+0.7050500737470602
+0.7031816136500466
+0.7006732963875493
+0.6961818766730593
+0.6916216736996625
+0.6764337637969222
diff --git a/tests/expected/evald/KGEPRIME.csv b/tests/expected/evald/KGEPRIME.csv
new file mode 100644
index 0000000..b3ab574
--- /dev/null
+++ b/tests/expected/evald/KGEPRIME.csv
@@ -0,0 +1,51 @@
+0.8131407494929581
+0.8127748549543973
+0.8120324184047302
+0.8117867087643632
+0.8113865804825375
+0.8110546552600805
+0.8110115513420257
+0.8109282579595157
+0.8107808794738488
+0.8102714601853906
+0.8098723493335118
+0.80972964340455
+0.8096359354316549
+0.8093267143355573
+0.8091370309262083
+0.80876520882257
+0.808297843099951
+0.8082504172955576
+0.8079588362318786
+0.8077792859196675
+0.8075824101888797
+0.8072872435440667
+0.8071551289052044
+0.8070989073590911
+0.8068619291248411
+0.8067928045232984
+0.8066998263051663
+0.806455314511177
+0.806108392682091
+0.8060009627097642
+0.8059219799600571
+0.8056200993568368
+0.805444123201897
+0.805182363569416
+0.8049830239354914
+0.8048140123227603
+0.8043601618202886
+0.8037118677795622
+0.8035729804192682
+0.8027506521878371
+0.8024589351470541
+0.8021804568386013
+0.8017099458589753
+0.8013131114124993
+0.8004747893474917
+0.7998057696216888
+0.7995518852898957
+0.7986597353849383
+0.7971020515928053
+0.7958136756510419
+0.7899796163833354
diff --git a/tests/expected/evald/KGEPRIME_D.csv b/tests/expected/evald/KGEPRIME_D.csv
new file mode 100644
index 0000000..558a336
--- /dev/null
+++ b/tests/expected/evald/KGEPRIME_D.csv
@@ -0,0 +1,51 @@
+0.9071248643948864,1.1477333530243923,1.0668239858924582
+0.9077537938998346,1.1478429758547268,1.0684568980300118
+0.9080496949392161,1.1484028026509738,1.0696675053044051
+0.9082556740306482,1.1484209022637022,1.0705581846521615
+0.9084737485198940,1.1486630576436567,1.0713951161082431
+0.9089321810875520,1.1489428726605424,1.0722704389155211
+0.9093310954815347,1.1488135780819770,1.0731457617227991
+0.9094546896430078,1.1488016399441205,1.0735373535050023
+0.9095397983553178,1.1487856134230323,1.0740517976110342
+0.9095735837396087,1.1491999363901180,1.0745611228702399
+0.9096311356178044,1.1494305824532358,1.0751830627596215
+0.9101044432964827,1.1495392868849328,1.0758920230450484
+0.9102441911392056,1.1494163423692945,1.0765318788983218
+0.9102574967893201,1.1495752574168396,1.0770053722297441
+0.9103829299622012,1.1496597741688170,1.0774558307504485
+0.9104389606151662,1.1498193287039202,1.0781263996846790
+0.9103708026184928,1.1501613638087465,1.0785359074307741
+0.9106545061768646,1.1501897035858120,1.0789198209427380
+0.9106680754546872,1.1503679937353128,1.0793037344547021
+0.9107871131080774,1.1504053916036157,1.0798002625968421
+0.9109331668775991,1.1504930666773272,1.0802711965048515
+0.9109503931900584,1.1506796793881644,1.0806474317465762
+0.9112916063517488,1.1507819870125124,1.0811465193121295
+0.9116384611328783,1.1508213892258903,1.0815841807157685
+0.9116240546641530,1.1508649226798111,1.0820474363535382
+0.9117728671872545,1.1507388089259101,1.0826002718107666
+0.9119101939393581,1.1506625843082945,1.0831019187997328
+0.9119150575215442,1.1507542944710545,1.0835088671224147
+0.9119108416265477,1.1509472994224532,1.0839593256431190
+0.9120349545371204,1.1508964568748929,1.0844277001277152
+0.9120974194539910,1.1508349399490534,1.0847834599821353
+0.9121099264543083,1.1508757330670814,1.0854130781417561
+0.9125099729643541,1.1509349546260605,1.0861169195803568
+0.9129864907072712,1.1511152707612748,1.0868719494872194
+0.9130727481787702,1.1511623991072226,1.0873224080079240
+0.9137178424599028,1.1513164779920453,1.0880697596445472
+0.9137419646569960,1.1514764306974452,1.0888222301279968
+0.9136897426066677,1.1518176713888661,1.0896156513860558
+0.9144254206019433,1.1517387012476892,1.0907520353814693
+0.9142984381688551,1.1522701343488451,1.0915224218288104
+0.9142709614317646,1.1523150149572656,1.0920496630519076
+0.9144137451984202,1.1523110423287639,1.0927842175714655
+0.9149046185657690,1.1525453982271228,1.0938489377113123
+0.9155452591872579,1.1527254670882050,1.0949674057428342
+0.9155186197874120,1.1532046716768467,1.0959246300993313
+0.9154368750377250,1.1532273515892346,1.0972017823824649
+0.9167750313811954,1.1532539657633949,1.0988244568263661
+0.9169078074034277,1.1533196303650488,1.1006314097560101
+0.9175076075676912,1.1535549186612073,1.1038434861394426
+0.9179463597643975,1.1527797412590994,1.1077849981956065
+0.9179618893753376,1.1523899554203556,1.1189773567810644
diff --git a/tests/expected/evald/KGE_D.csv b/tests/expected/evald/KGE_D.csv
new file mode 100644
index 0000000..7d65cb5
--- /dev/null
+++ b/tests/expected/evald/KGE_D.csv
@@ -0,0 +1,51 @@
+0.9071248643948864,1.2244294704151979,1.0668239858924582
+0.9077537938998346,1.2264207454072791,1.0684568980300118
+0.9080496949392161,1.2284091609962542,1.0696675053044051
+0.9082556740306482,1.2294513963440263,1.0705581846521615
+0.9084737485198940,1.2306719900133749,1.0713951161082431
+0.9089321810875520,1.2319774783565793,1.0722704389155211
+0.9093310954815347,1.2328444223282775,1.0731457617227991
+0.9094546896430078,1.2332814722478178,1.0735373535050023
+0.9095397983553178,1.2338552531667024,1.0740517976110342
+0.9095735837396087,1.2348855740497733,1.0745611228702399
+0.9096311356178044,1.2358482940716458,1.0751830627596215
+0.9101044432964827,1.2367801489363925,1.0758920230450484
+0.9102441911392056,1.2373833346872534,1.0765318788983218
+0.9102574967893201,1.2380987280203271,1.0770053722297441
+0.9103829299622012,1.2387076270574358,1.0774558307504485
+0.9104389606151662,1.2396505731434120,1.0781263996846790
+0.9103708026184928,1.2404903302072829,1.0785359074307741
+0.9106545061768646,1.2409624690429850,1.0789198209427380
+0.9106680754546872,1.2415964716356864,1.0793037344547021
+0.9107871131080774,1.2422080439464072,1.0798002625968421
+0.9109331668775991,1.2428445217100519,1.0802711965048515
+0.9109503931900584,1.2434790402937934,1.0806474317465762
+0.9112916063517488,1.2441639397456739,1.0811465193121295
+0.9116384611328783,1.2447102094160669,1.0815841807157685
+0.9116240546641530,1.2452904391749027,1.0820474363535382
+0.9117728671872545,1.2457901473263877,1.0826002718107666
+0.9119101939393581,1.2462848529553729,1.0831019187997328
+0.9119150575215442,1.2468524819385858,1.0835088671224147
+0.9119108416265477,1.2475800585327315,1.0839593256431190
+0.9120349545371204,1.2480639978139763,1.0844277001277152
+0.9120974194539910,1.2484067080262666,1.0847834599821353
+0.9121099264543083,1.2491755719869908,1.0854130781417561
+0.9125099729643541,1.2500499275558148,1.0861169195803568
+0.9129864907072712,1.2511148984168152,1.0868719494872194
+0.9130727481787702,1.2516846718054440,1.0873224080079240
+0.9137178424599028,1.2527126434836113,1.0880697596445472
+0.9137419646569960,1.2537531352118179,1.0888222301279968
+0.9136897426066677,1.2550385622883493,1.0896156513860558
+0.9144254206019433,1.2562613326135268,1.0907520353814693
+0.9142984381688551,1.2577286876454601,1.0915224218288104
+0.9142709614317646,1.2583852238137356,1.0920496630519076
+0.9144137451984202,1.2592273207901978,1.0927842175714655
+0.9149046185657690,1.2607105595147998,1.0938489377113123
+0.9155452591872579,1.2621968142312687,1.0949674057428342
+0.9155186197874120,1.2638254032362688,1.0959246300993313
+0.9154368750377250,1.2653231056559175,1.0972017823824649
+0.9167750313811954,1.2672236625128150,1.0988244568263661
+0.9169078074034277,1.2693798106679639,1.1006314097560101
+0.9175076075676912,1.2733440828682880,1.1038434861394426
+0.9179463597643975,1.2770321035906431,1.1077849981956065
+0.9179618893753376,1.2894982662973180,1.1189773567810644
diff --git a/tests/expected/evald/MAE.csv b/tests/expected/evald/MAE.csv
new file mode 100644
index 0000000..ef9cf0e
--- /dev/null
+++ b/tests/expected/evald/MAE.csv
@@ -0,0 +1,51 @@
+265.1929260450160655
+265.6816720257234579
+265.7041800643086731
+265.7041800643086731
+265.8360128617363216
+266.1318327974276485
+266.4019292604501743
+266.3729903536977304
+266.5048231511253789
+266.6816720257234579
+266.6977491961415012
+266.8360128617363216
+267.0482315112540164
+267.3215434083601281
+267.4758842443729918
+267.8617363344051228
+268.0160771704179865
+267.9389067524115831
+268.1511254019292778
+268.1382636655948772
+268.3311897106109427
+268.5144694533761935
+268.4726688102894059
+268.3344051446945286
+268.5369774919614088
+268.6527331189710708
+268.7556270096462754
+268.9260450160771825
+269.0739549839228175
+269.2443729903537246
+269.4147909967845749
+269.7491961414791035
+269.7909967845658912
+269.9099678456591391
+270.0643086816720029
+269.9421221864951690
+270.1864951768488936
+270.6623794212218854
+271.1061093247588474
+271.5852090032154251
+271.9067524115755532
+272.1286173633440626
+272.3279742765273568
+272.6784565916398719
+273.4501607717041907
+274.5530546623793953
+274.8617363344051228
+276.1286173633440626
+278.5176848874597795
+281.2700964630225258
+291.2990353697749129
diff --git a/tests/expected/evald/MARE.csv b/tests/expected/evald/MARE.csv
new file mode 100644
index 0000000..bb93762
--- /dev/null
+++ b/tests/expected/evald/MARE.csv
@@ -0,0 +1,51 @@
+0.2110884459948862
+0.2114774783536764
+0.2114953943175681
+0.2114953943175681
+0.2116003306775049
+0.2118357976315096
+0.2120507891982094
+0.2120277543874916
+0.2121326907474284
+0.2122734590351485
+0.2122862561522140
+0.2123963113589770
+0.2125652333042412
+0.2127827842943542
+0.2129056366181827
+0.2132127674277538
+0.2133356197515823
+0.2132741935896681
+0.2134431155349323
+0.2134328778412799
+0.2135864432460655
+0.2137323303806118
+0.2136990578762416
+0.2135890026694786
+0.2137502463445035
+0.2138423855873749
+0.2139242871365938
+0.2140599365774878
+0.2141776700544901
+0.2143133194953841
+0.2144489689362780
+0.2147151489712397
+0.2147484214756099
+0.2148431201418944
+0.2149659724657229
+0.2148687143760253
+0.2150632305554205
+0.2154420252205583
+0.2157952256515652
+0.2161765797401161
+0.2164325220814255
+0.2166091222969289
+0.2167678065485407
+0.2170467837005679
+0.2176610453197104
+0.2185389275504014
+0.2187846321980584
+0.2197930450228172
+0.2216946966187457
+0.2238855630603538
+0.2318684046857924
diff --git a/tests/expected/evald/MSE.csv b/tests/expected/evald/MSE.csv
new file mode 100644
index 0000000..53a1eb3
--- /dev/null
+++ b/tests/expected/evald/MSE.csv
@@ -0,0 +1,51 @@
+603782.2604501608293504
+603540.1704180064843968
+604973.1768488745437935
+605519.1061093247262761
+606241.1157556270482019
+605823.9710610932670534
+605116.8520900321891531
+605160.5144694533664733
+605628.1511254019569606
+607006.1800643086899072
+608195.0578778134658933
+607157.1061093247262761
+607415.4598070739302784
+608465.9453376205638051
+608766.6463022507959977
+609964.8456591640133411
+611618.5176848875125870
+610871.5080385851906613
+611795.5273311897180974
+612155.2250803858041763
+612401.4630225080763921
+613310.6237942122388631
+612593.7202572347596288
+611633.2090032154228538
+612660.8906752411276102
+612724.9549839228857309
+612831.2958199357381091
+613728.3408360128523782
+614918.0514469452900812
+615075.4372990353731439
+615330.4244372990215197
+616544.5594855305971578
+615854.5048231511609629
+615046.1800643086899072
+615534.5530546624213457
+613767.3826366559369490
+615365.1704180064843968
+617751.3633440514095128
+615900.7909967845771462
+618968.0353697749087587
+620238.9099678456550464
+620927.2025723472470418
+620784.1286173633998260
+619856.3247588424710557
+622720.4019292604643852
+625799.9421221865341067
+621881.5369774919236079
+624982.4630225080763921
+628774.5691318328026682
+633351.0771704179933295
+656835.5305466237477958
diff --git a/tests/expected/evald/NSE.csv b/tests/expected/evald/NSE.csv
new file mode 100644
index 0000000..578721b
--- /dev/null
+++ b/tests/expected/evald/NSE.csv
@@ -0,0 +1,51 @@
+0.7189121923160171
+0.7190248961181289
+0.7183577671505612
+0.7181036125173065
+0.7177674845422075
+0.7179616841657375
+0.7182908798615486
+0.7182705530594651
+0.718052847156156
+0.7174113126846504
+0.7168578365723296
+0.7173410498202125
+0.7172207745500294
+0.7167317262719881
+0.7165917364437786
+0.7160339207336052
+0.7152640620034193
+0.7156118286033213
+0.7151816560490262
+0.7150142005632107
+0.7148995657223857
+0.714476310478086
+0.7148100613295596
+0.715257222533744
+0.7147787904778381
+0.7147489656597577
+0.7146994592160939
+0.7142818444011523
+0.7137279805841595
+0.7136547103888884
+0.7135360024036145
+0.7129707679121519
+0.7132920194045123
+0.7136683309479988
+0.7134409713480524
+0.7142636686863795
+0.7135198265862999
+0.7124089464193454
+0.7132704711081728
+0.7118425308507162
+0.7112508815459708
+0.7109304503708312
+0.710997057734077
+0.7114289921740817
+0.710095635390346
+0.7086619708754944
+0.7104861647677075
+0.7090425441765131
+0.7072771481677261
+0.705146577768962
+0.6942135081069736
diff --git a/tests/expected/evald/RMSE.csv b/tests/expected/evald/RMSE.csv
new file mode 100644
index 0000000..42b7512
--- /dev/null
+++ b/tests/expected/evald/RMSE.csv
@@ -0,0 +1,51 @@
+777.0342723780984
+776.8784785396018
+777.8002165394881
+778.1510818018085
+778.6148699810626
+778.3469477431598
+777.8925710469488
+777.9206350711191
+778.2211453856814
+779.1060133668002
+779.8686157794872
+779.2028658246354
+779.3686289600538
+780.0422715068848
+780.2349942820117
+781.0024620058275
+782.0604309673821
+781.5826943059737
+782.1735915582868
+782.4034925026765
+782.5608366271009
+783.1415094312216
+782.6836655106805
+782.0698236111757
+782.7265746576138
+782.7674973987633
+782.8354206472366
+783.4081572437275
+784.1671068381696
+784.267452658234
+784.4299997050719
+785.2035146925481
+784.7639803298513
+784.2487998488162
+784.5601016204319
+783.4330747655832
+784.4521466718072
+785.971604667784
+784.7934702816943
+786.7452162992635
+787.5524807705488
+787.9893416616416
+787.8985522371287
+787.3095482456963
+789.1263535893733
+791.0751810809049
+788.5946594908514
+790.5583236058602
+792.9530686817681
+795.833573789406
+810.4539040233095
diff --git a/tests/expected/evalp/AS.csv b/tests/expected/evalp/AS.csv
new file mode 100644
index 0000000..2062dbb
--- /dev/null
+++ b/tests/expected/evalp/AS.csv
@@ -0,0 +1 @@
+0.4914810317862
diff --git a/tests/expected/evalp/AW.csv b/tests/expected/evalp/AW.csv
new file mode 100644
index 0000000..40622cd
--- /dev/null
+++ b/tests/expected/evalp/AW.csv
@@ -0,0 +1 @@
+9.2749196141479,31.3215434083601
diff --git a/tests/expected/evalp/AWI.csv b/tests/expected/evalp/AWI.csv
new file mode 100644
index 0000000..8b3b7e7
--- /dev/null
+++ b/tests/expected/evalp/AWI.csv
@@ -0,0 +1 @@
+0.9821120161733,0.9880951944476
diff --git a/tests/expected/evalp/AWN.csv b/tests/expected/evalp/AWN.csv
new file mode 100644
index 0000000..34e29a4
--- /dev/null
+++ b/tests/expected/evalp/AWN.csv
@@ -0,0 +1 @@
+0.0073826568351,0.0249313434669
diff --git a/tests/expected/evalp/BS.csv b/tests/expected/evalp/BS.csv
new file mode 100644
index 0000000..3db5ba1
--- /dev/null
+++ b/tests/expected/evalp/BS.csv
@@ -0,0 +1,4 @@
+0.1061513565769
+0.0739562201528
+0.0866918610329
+nan
diff --git a/tests/expected/evalp/BSS.csv b/tests/expected/evalp/BSS.csv
new file mode 100644
index 0000000..6b26f31
--- /dev/null
+++ b/tests/expected/evalp/BSS.csv
@@ -0,0 +1,4 @@
+0.5705594211361
+0.6661165249535
+0.5635125720476
+nan
diff --git a/tests/expected/evalp/BS_CRD.csv b/tests/expected/evalp/BS_CRD.csv
new file mode 100644
index 0000000..9fa242b
--- /dev/null
+++ b/tests/expected/evalp/BS_CRD.csv
@@ -0,0 +1,4 @@
+0.0114117580190,0.1524456042419,0.2471852027998
+0.0055324125593,0.1530792786029,0.2215030861964
+0.0101394313199,0.1220600742934,0.1986125040064
+nan,nan,nan
diff --git a/tests/expected/evalp/BS_LBD.csv b/tests/expected/evalp/BS_LBD.csv
new file mode 100644
index 0000000..903f102
--- /dev/null
+++ b/tests/expected/evalp/BS_LBD.csv
@@ -0,0 +1,4 @@
+0.0121598807967,0.1506234181408,0.2446148939211
+0.0080317462446,0.1473868836293,0.2133113575375
+0.0171912794414,0.1048221425794,0.1743227241709
+nan,nan,nan
diff --git a/tests/expected/evalp/CR.csv b/tests/expected/evalp/CR.csv
new file mode 100644
index 0000000..a4a7469
--- /dev/null
+++ b/tests/expected/evalp/CR.csv
@@ -0,0 +1 @@
+0.0064308681672,0.0353697749196
diff --git a/tests/expected/evalp/CRPS.csv b/tests/expected/evalp/CRPS.csv
new file mode 100644
index 0000000..c449874
--- /dev/null
+++ b/tests/expected/evalp/CRPS.csv
@@ -0,0 +1 @@
+252.9569186533230
diff --git a/tests/expected/evalp/CSI.csv b/tests/expected/evalp/CSI.csv
new file mode 100644
index 0000000..ed9f3d5
--- /dev/null
+++ b/tests/expected/evalp/CSI.csv
@@ -0,0 +1,52 @@
+0.4469453376206,0.3311897106109,0.2733118971061,nan
+0.7792207792208,0.8108108108108,0.7032967032967,nan
+0.7792207792208,0.8108108108108,0.7032967032967,nan
+0.7792207792208,0.8108108108108,0.7032967032967,nan
+0.7792207792208,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7843137254902,0.8108108108108,0.7032967032967,nan
+0.7712418300654,0.8108108108108,0.7032967032967,nan
+0.7712418300654,0.8108108108108,0.7032967032967,nan
+0.7712418300654,0.8018018018018,0.7111111111111,nan
diff --git a/tests/expected/evalp/DS.csv b/tests/expected/evalp/DS.csv
new file mode 100644
index 0000000..bf3ba37
--- /dev/null
+++ b/tests/expected/evalp/DS.csv
@@ -0,0 +1 @@
+148.7901639344262
diff --git a/tests/expected/evalp/FAR.csv b/tests/expected/evalp/FAR.csv
new file mode 100644
index 0000000..7f82d19
--- /dev/null
+++ b/tests/expected/evalp/FAR.csv
@@ -0,0 +1,52 @@
+0.5530546623794,0.6688102893891,0.7266881028939,nan
+0.1111111111111,0.0816326530612,0.0857142857143,nan
+0.1111111111111,0.0816326530612,0.0857142857143,nan
+0.1111111111111,0.0816326530612,0.0857142857143,nan
+0.1111111111111,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1044776119403,0.0816326530612,0.0857142857143,nan
+0.1060606060606,0.0816326530612,0.0857142857143,nan
+0.1060606060606,0.0816326530612,0.0857142857143,nan
+0.1060606060606,0.0824742268041,0.0724637681159,nan
diff --git a/tests/expected/evalp/POD.csv b/tests/expected/evalp/POD.csv
new file mode 100644
index 0000000..80667c1
--- /dev/null
+++ b/tests/expected/evalp/POD.csv
@@ -0,0 +1,52 @@
+1.0000000000000,1.0000000000000,1.0000000000000,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8633093525180,0.8737864077670,0.7529411764706,nan
+0.8489208633094,0.8737864077670,0.7529411764706,nan
+0.8489208633094,0.8737864077670,0.7529411764706,nan
+0.8489208633094,0.8640776699029,0.7529411764706,nan
diff --git a/tests/expected/evalp/POFD.csv b/tests/expected/evalp/POFD.csv
new file mode 100644
index 0000000..d3007cb
--- /dev/null
+++ b/tests/expected/evalp/POFD.csv
@@ -0,0 +1,52 @@
+1.0000000000000,1.0000000000000,1.0000000000000,nan
+0.0872093023256,0.0384615384615,0.0265486725664,nan
+0.0872093023256,0.0384615384615,0.0265486725664,nan
+0.0872093023256,0.0384615384615,0.0265486725664,nan
+0.0872093023256,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0265486725664,nan
+0.0813953488372,0.0384615384615,0.0221238938053,nan
diff --git a/tests/expected/evalp/QS.csv b/tests/expected/evalp/QS.csv
new file mode 100644
index 0000000..10f11b5
--- /dev/null
+++ b/tests/expected/evalp/QS.csv
@@ -0,0 +1 @@
+345.9157803611179,345.0692555033388,343.1293593865944,340.7098689092258,338.2815978233983,335.9735345040806,333.5551570615883,330.3324264160278,327.3335394509029,324.3259955478602,321.1900816225579,318.1751174870145,315.1221864951768,311.9720504575810,308.6449418748451,305.6121691813011,302.1695523126391,298.4459559732869,294.9746475389559,291.2738065792731,287.7245857036857,284.1019045263419,280.2355923818945,276.2186495176851,272.5014840465003,268.6527331189711,264.7401681919366,260.8558001484045,256.9032896364086,252.9262923571603,248.9312391788272,244.9863962404153,240.6629977739305,236.3289636408610,232.0897848132574,227.3870887954491,222.9760079149148,218.6999752658918,214.0996784565916,209.6725204056392,205.1895869403907,200.3957457333661,195.2372000989366,190.0801385110065,185.3842443729902,180.6178580262183,174.5832302745488,169.1540934949294,163.1109324758844,156.2747959436064,147.5753153598814
diff --git a/tests/expected/evalp/RANK_HIST.csv b/tests/expected/evalp/RANK_HIST.csv
new file mode 100644
index 0000000..c35d009
--- /dev/null
+++ b/tests/expected/evalp/RANK_HIST.csv
@@ -0,0 +1 @@
+0.6077170418006,0.0000000000000,0.0000000000000,0.0000000000000,0.0000000000000,0.0032154340836,0.0000000000000,0.0000000000000,0.0000000000000,0.0000000000000,0.0000000000000,0.0000000000000,0.0032154340836,0.0000000000000,0.0032154340836,0.0000000000000,0.0000000000000,0.0000000000000,0.0000000000000,0.0000000000000,0.0000000000000,0.0000000000000,0.0000000000000,0.0000000000000,0.0000000000000,0.0000000000000,0.0000000000000,0.0000000000000,0.0000000000000,0.0032154340836,0.0000000000000,0.0000000000000,0.0000000000000,0.0000000000000,0.0000000000000,0.0064308681672,0.0000000000000,0.0000000000000,0.0032154340836,0.0064308681672,0.0000000000000,0.0000000000000,0.0000000000000,0.0032154340836,0.0000000000000,0.0000000000000,0.0032154340836,0.0032154340836,0.0032154340836,0.0000000000000,0.0064308681672,0.3440514469453
diff --git a/tests/expected/evalp/ROCSS.csv b/tests/expected/evalp/ROCSS.csv
new file mode 100644
index 0000000..ab68dea
--- /dev/null
+++ b/tests/expected/evalp/ROCSS.csv
@@ -0,0 +1,4 @@
+0.7108499247114
+0.8017176997760
+0.7130661114003
+nan
diff --git a/tests/expected/evalp/WS.csv b/tests/expected/evalp/WS.csv
new file mode 100644
index 0000000..82b07bb
--- /dev/null
+++ b/tests/expected/evalp/WS.csv
@@ -0,0 +1 @@
+764.4471750114835,2578.1382636655953
diff --git a/tests/expected/evalp/WSS.csv b/tests/expected/evalp/WSS.csv
new file mode 100644
index 0000000..fd929da
--- /dev/null
+++ b/tests/expected/evalp/WSS.csv
@@ -0,0 +1 @@
+0.6621887740287,0.4360388849930
diff --git a/tests/test_determinist.cpp b/tests/test_determinist.cpp
index 41df128..e68201c 100644
--- a/tests/test_determinist.cpp
+++ b/tests/test_determinist.cpp
@@ -6,16 +6,18 @@
 #include <vector>
 #include <tuple>
 #include <array>
+#include <string>
+#include <unordered_map>
 
 #include <gtest/gtest.h>
 
 #include <xtensor/xtensor.hpp>
+#include <xtensor/xarray.hpp>
 #include <xtensor/xview.hpp>
 #include <xtensor/xmanipulation.hpp>
 #include <xtensor/xmath.hpp>
 #include <xtensor/xsort.hpp>
 #include <xtensor/xcsv.hpp>
-#include <xtensor/xio.hpp>
 
 #include "evalhyd/evald.hpp"
 
@@ -35,19 +37,36 @@ std::tuple<xt::xtensor<double, 2>, xt::xtensor<double, 2>> load_data_d()
 {
     // read in data
     std::ifstream ifs;
-    ifs.open(EVALHYD_DATA_DIR "/q_obs.csv");
+    ifs.open(EVALHYD_DATA_DIR "/data/q_obs.csv");
     xt::xtensor<double, 2> observed = xt::load_csv<int>(ifs);
     ifs.close();
 
-    ifs.open(EVALHYD_DATA_DIR "/q_prd.csv");
-    xt::xtensor<double, 2> predicted = xt::view(
-            xt::load_csv<double>(ifs), xt::range(0, 5), xt::all()
-    );
+    ifs.open(EVALHYD_DATA_DIR "/data/q_prd.csv");
+    xt::xtensor<double, 2> predicted = xt::load_csv<double>(ifs);
     ifs.close();
 
     return std::make_tuple(observed, predicted);
 }
 
+std::unordered_map<std::string, xt::xarray<double>> load_expected_d()
+{
+    // read in expected results
+    std::ifstream ifs;
+    std::unordered_map<std::string, xt::xarray<double>> expected;
+
+    for (const auto& metric : all_metrics_d)
+    {
+        ifs.open(EVALHYD_DATA_DIR "/expected/evald/" + metric + ".csv");
+        expected[metric] = xt::view(
+                xt::squeeze(xt::load_csv<double>(ifs)),
+                xt::all(), xt::newaxis(), xt::newaxis()
+        );
+        ifs.close();
+    }
+
+    return expected;
+}
+
 TEST(DeterministTests, TestMetrics)
 {
     // read in data
@@ -55,84 +74,22 @@ TEST(DeterministTests, TestMetrics)
     xt::xtensor<double, 2> predicted;
     std::tie(observed, predicted) = load_data_d();
 
+    // read in expected results
+    auto expected = load_expected_d();
+
     // compute scores (with 2D tensors)
-    std::vector<xt::xarray<double>> metrics =
+    std::vector<xt::xarray<double>> results =
             evalhyd::evald(
                     observed, predicted, all_metrics_d
             );
 
-    // check results on all metrics
-    xt::xtensor<double, 3> mae =
-            {{{ 265.192926}},
-             {{ 265.681672}},
-             {{ 265.70418 }},
-             {{ 265.70418 }},
-             {{ 265.836013}}};
-    EXPECT_TRUE(xt::allclose(metrics[0], mae));
-
-    xt::xtensor<double, 3> mare =
-            {{{ 0.211088}},
-             {{ 0.211477}},
-             {{ 0.211495}},
-             {{ 0.211495}},
-             {{ 0.2116  }}};
-    EXPECT_TRUE(xt::allclose(metrics[1], mare));
-
-    xt::xtensor<double, 3> mse =
-            {{{ 603782.26045 }},
-             {{ 603540.170418}},
-             {{ 604973.176849}},
-             {{ 605519.106109}},
-             {{ 606241.115756}}};
-    EXPECT_TRUE(xt::allclose(metrics[2], mse));
-
-    xt::xtensor<double, 3> rmse =
-            {{{777.034272}},
-             {{776.878479}},
-             {{777.800217}},
-             {{778.151082}},
-             {{778.61487 }}};
-    EXPECT_TRUE(xt::allclose(metrics[3], rmse));
-
-    xt::xtensor<double, 3> nse =
-            {{{0.718912}},
-             {{0.719025}},
-             {{0.718358}},
-             {{0.718104}},
-             {{0.717767}}};
-    EXPECT_TRUE(xt::allclose(metrics[4], nse));
-
-    xt::xtensor<double, 3> kge =
-            {{{0.748088}},
-             {{0.746106}},
-             {{0.744111}},
-             {{0.743011}},
-             {{0.741768}}};
-    EXPECT_TRUE(xt::allclose(metrics[5], kge));
-
-    xt::xtensor<double, 4> kge_d =
-            {{{{ 0.907125,  1.224429,  1.066824}}},
-             {{{ 0.907754,  1.226421,  1.068457}}},
-             {{{ 0.90805 ,  1.228409,  1.069668}}},
-             {{{ 0.908256,  1.229451,  1.070558}}},
-             {{{ 0.908474,  1.230672,  1.071395}}}};
-    EXPECT_TRUE(xt::allclose(metrics[6], kge_d));
-
-    xt::xtensor<double, 3> kgeprime =
-            {{{0.813141}},
-             {{0.812775}},
-             {{0.812032}},
-             {{0.811787}},
-             {{0.811387}}};
-    EXPECT_TRUE(xt::allclose(metrics[7], kgeprime));
-
-    xt::xtensor<double, 4> kgeprime_d =
-            {{{{ 0.907125,  1.147733,  1.066824}}},
-             {{{ 0.907754,  1.147843,  1.068457}}},
-             {{{ 0.90805 ,  1.148403,  1.069668}}},
-             {{{ 0.908256,  1.148421,  1.070558}}},
-             {{{ 0.908474,  1.148663,  1.071395}}}};
-    EXPECT_TRUE(xt::allclose(metrics[8], kgeprime_d));
+    // check results
+    for (std::size_t m = 0; m < all_metrics_d.size(); m++)
+    {
+        EXPECT_TRUE(xt::all(xt::isclose(
+                results[m], expected[all_metrics_d[m]], 1e-05, 1e-08, true
+        ))) << "Failure for (" << all_metrics_d[m] << ")";
+    }
 }
 
 TEST(DeterministTests, TestTransform)
@@ -143,49 +100,73 @@ TEST(DeterministTests, TestTransform)
     std::tie(observed, predicted) = load_data_d();
 
     // compute and check results on square-rooted streamflow series
-    std::vector<xt::xarray<double>> metrics =
-            evalhyd::evald(observed, predicted, {"NSE"}, "sqrt");
+    std::vector<xt::xarray<double>> results_sqrt =
+            evalhyd::evald(observed, predicted, all_metrics_d, "sqrt");
 
-    xt::xtensor<double, 3> nse_sqrt =
-            {{{0.882817}},
-             {{0.883023}},
-             {{0.883019}},
-             {{0.883029}},
-             {{0.882972}}};
-    EXPECT_TRUE(xt::all(xt::isclose(metrics[0], nse_sqrt)));
+    xt::xtensor<double, 2> obs_sqrt = xt::sqrt(observed);
+    xt::xtensor<double, 2> prd_sqrt = xt::sqrt(predicted);
+
+    std::vector<xt::xarray<double>> results_sqrt_ =
+            evalhyd::evald(obs_sqrt, prd_sqrt, all_metrics_d);
+
+    for (std::size_t m = 0; m < all_metrics_d.size(); m++)
+    {
+        EXPECT_TRUE(xt::all(xt::isclose(
+                results_sqrt[m], results_sqrt_[m], 1e-05, 1e-08, true
+        ))) << "Failure for (" << all_metrics_d[m] << ")";
+    }
 
     // compute and check results on inverted streamflow series
-    metrics = evalhyd::evald(observed, predicted, {"NSE"}, "inv");
+    std::vector<xt::xarray<double>> results_inv =
+            evalhyd::evald(observed, predicted, all_metrics_d, "inv");
+
+    xt::xtensor<double, 2> epsilon = xt::mean(observed, {1}, xt::keep_dims) * 0.01;
+    xt::xtensor<double, 2> obs_inv = 1. / (observed + epsilon);
+    xt::xtensor<double, 2> prd_inv = 1. / (predicted + epsilon);
 
-    xt::xtensor<double, 3> nse_inv =
-            {{{0.737323}},
-             {{0.737404}},
-             {{0.737429}},
-             {{0.737546}},
-             {{0.737595}}};
-    EXPECT_TRUE(xt::all(xt::isclose(metrics[0], nse_inv)));
+    std::vector<xt::xarray<double>> results_inv_ =
+            evalhyd::evald(obs_inv, prd_inv, all_metrics_d);
+
+    for (std::size_t m = 0; m < all_metrics_d.size(); m++)
+    {
+        EXPECT_TRUE(xt::all(xt::isclose(
+                results_inv[m], results_inv_[m], 1e-05, 1e-08, true
+        ))) << "Failure for (" << all_metrics_d[m] << ")";
+    }
 
     // compute and check results on square-rooted streamflow series
-    metrics = evalhyd::evald(observed, predicted, {"NSE"}, "log");
+    std::vector<xt::xarray<double>> results_log =
+            evalhyd::evald(observed, predicted, all_metrics_d, "log");
+
+    xt::xtensor<double, 2> obs_log = xt::log(observed + epsilon);
+    xt::xtensor<double, 2> prd_log = xt::log(predicted + epsilon);
+
+    std::vector<xt::xarray<double>> results_log_ =
+            evalhyd::evald(obs_log, prd_log, all_metrics_d);
 
-    xt::xtensor<double, 3> nse_log =
-            {{{0.893344}},
-             {{0.893523}},
-             {{0.893585}},
-             {{0.893758}},
-             {{0.893793}}};
-    EXPECT_TRUE(xt::all(xt::isclose(metrics[0], nse_log)));
+    for (std::size_t m = 0; m < all_metrics_d.size(); m++)
+    {
+        EXPECT_TRUE(xt::all(xt::isclose(
+                results_log[m], results_log_[m], 1e-05, 1e-08, true
+        ))) << "Failure for (" << all_metrics_d[m] << ")";
+    }
 
     // compute and check results on power-transformed streamflow series
-    metrics = evalhyd::evald(observed, predicted, {"NSE"}, "pow", 0.2);
+    std::vector<xt::xarray<double>> results_pow =
+            evalhyd::evald(observed, predicted, all_metrics_d, "pow", 0.2);
+
+    xt::xtensor<double, 2> obs_pow = xt::pow(observed, 0.2);
+    xt::xtensor<double, 2> prd_pow = xt::pow(predicted, 0.2);
 
-    xt::xtensor<double, 3> nse_pow =
-            {{{0.899207}},
-             {{0.899395}},
-             {{0.899451}},
-             {{0.899578}},
-             {{0.899588}}};
-    EXPECT_TRUE(xt::all(xt::isclose(metrics[0], nse_pow)));
+    std::vector<xt::xarray<double>> results_pow_ =
+            evalhyd::evald(obs_pow, prd_pow, all_metrics_d);
+
+    for (std::size_t m = 0; m < all_metrics_d.size(); m++)
+    {
+        EXPECT_TRUE(xt::all(xt::isclose(
+                results_pow[m], results_pow_[m], 1e-05, 1e-08, true
+        ))) << "Failure for (" << all_metrics_d[m] << ")";
+    }
 
 }
 
@@ -235,13 +216,10 @@ TEST(DeterministTests, TestMaskingConditions)
     // conditions on streamflow values _________________________________________
 
     // compute scores using masking conditions on streamflow to subset whole record
-    xt::xtensor<std::array<char, 32>, 2> q_conditions = {{
-            {{std::array<char, 32>{"q_obs{<2000,>3000}"}}},
-            {{std::array<char, 32>{"q_obs{<2000,>3000}"}}},
-            {{std::array<char, 32>{"q_obs{<2000,>3000}"}}},
-            {{std::array<char, 32>{"q_obs{<2000,>3000}"}}},
-            {{std::array<char, 32>{"q_obs{<2000,>3000}"}}}
-    }};
+    xt::xtensor<std::array<char, 32>, 2> q_conditions = {
+            {std::array<char, 32>{"q_obs{<2000,>3000}"}}
+    };
+    q_conditions = xt::repeat(q_conditions, predicted.shape(0), 0);
 
     std::vector<xt::xarray<double>> metrics_q_conditioned =
             evalhyd::evald(
@@ -270,13 +248,10 @@ TEST(DeterministTests, TestMaskingConditions)
     // conditions on streamflow statistics _____________________________________
 
     // compute scores using masking conditions on streamflow to subset whole record
-    xt::xtensor<std::array<char, 32>, 2> q_conditions_ = {{
-            {{std::array<char, 32>{"q_obs{>=mean}"}}},
-            {{std::array<char, 32>{"q_obs{>=mean}"}}},
-            {{std::array<char, 32>{"q_obs{>=mean}"}}},
-            {{std::array<char, 32>{"q_obs{>=mean}"}}},
-            {{std::array<char, 32>{"q_obs{>=mean}"}}}
-    }};
+    xt::xtensor<std::array<char, 32>, 2> q_conditions_ = {
+            {std::array<char, 32>{"q_obs{>=mean}"}}
+    };
+    q_conditions_ = xt::repeat(q_conditions_, predicted.shape(0), 0);
 
     double mean = xt::mean(observed, {1})();
 
@@ -307,13 +282,10 @@ TEST(DeterministTests, TestMaskingConditions)
     // conditions on temporal indices __________________________________________
 
     // compute scores using masking conditions on time indices to subset whole record
-    xt::xtensor<std::array<char, 32>, 2> t_conditions = {{
-            {{std::array<char, 32>{"t{0,1,2,3,4,5:97,97,98,99}"}}},
-            {{std::array<char, 32>{"t{0,1,2,3,4,5:97,97,98,99}"}}},
-            {{std::array<char, 32>{"t{0,1,2,3,4,5:97,97,98,99}"}}},
-            {{std::array<char, 32>{"t{0,1,2,3,4,5:97,97,98,99}"}}},
-            {{std::array<char, 32>{"t{0,1,2,3,4,5:97,97,98,99}"}}}
-    }};
+    xt::xtensor<std::array<char, 32>, 2> t_conditions = {
+            {std::array<char, 32>{"t{0,1,2,3,4,5:97,97,98,99}"}}
+    };
+    t_conditions = xt::repeat(t_conditions, predicted.shape(0), 0);
 
     std::vector<xt::xarray<double>> metrics_t_conditioned =
             evalhyd::evald(
@@ -346,6 +318,7 @@ TEST(DeterministTests, TestMissingData)
     xt::xtensor<double, 2> observed;
     xt::xtensor<double, 2> predicted;
     std::tie(observed, predicted) = load_data_d();
+    predicted = xt::view(predicted, xt::range(0, 5), xt::all());
 
     // add some missing observations artificially by assigning NaN values
     xt::view(observed, xt::all(), xt::range(0, 20)) = NAN;
@@ -394,16 +367,16 @@ TEST(DeterministTests, TestBootstrap)
     // read in data
     std::ifstream ifs;
 
-    ifs.open(EVALHYD_DATA_DIR "/q_obs_1yr.csv");
+    ifs.open(EVALHYD_DATA_DIR "/data/q_obs_1yr.csv");
     xt::xtensor<std::string, 1> x_dts = xt::squeeze(xt::load_csv<std::string>(ifs, ',', 0, 1));
     ifs.close();
     std::vector<std::string> datetimes (x_dts.begin(), x_dts.end());
 
-    ifs.open(EVALHYD_DATA_DIR "/q_obs_1yr.csv");
+    ifs.open(EVALHYD_DATA_DIR "/data/q_obs_1yr.csv");
     xt::xtensor<double, 1> observed = xt::squeeze(xt::load_csv<double>(ifs, ',', 1));
     ifs.close();
 
-    ifs.open(EVALHYD_DATA_DIR "/q_prd_1yr.csv");
+    ifs.open(EVALHYD_DATA_DIR "/data/q_prd_1yr.csv");
     xt::xtensor<double, 2> predicted = xt::load_csv<double>(ifs, ',', 1);
     ifs.close();
 
@@ -459,16 +432,16 @@ TEST(DeterministTests, TestBootstrapSummary)
     // read in data
     std::ifstream ifs;
 
-    ifs.open(EVALHYD_DATA_DIR "/q_obs_1yr.csv");
+    ifs.open(EVALHYD_DATA_DIR "/data/q_obs_1yr.csv");
     xt::xtensor<std::string, 1> x_dts = xt::squeeze(xt::load_csv<std::string>(ifs, ',', 0, 1));
     ifs.close();
     std::vector<std::string> datetimes (x_dts.begin(), x_dts.end());
 
-    ifs.open(EVALHYD_DATA_DIR "/q_obs_1yr.csv");
+    ifs.open(EVALHYD_DATA_DIR "/data/q_obs_1yr.csv");
     xt::xtensor<double, 1> observed = xt::squeeze(xt::load_csv<double>(ifs, ',', 1));
     ifs.close();
 
-    ifs.open(EVALHYD_DATA_DIR "/q_prd_1yr.csv");
+    ifs.open(EVALHYD_DATA_DIR "/data/q_prd_1yr.csv");
     xt::xtensor<double, 2> predicted = xt::load_csv<double>(ifs, ',', 1);
     ifs.close();
 
diff --git a/tests/test_probabilist.cpp b/tests/test_probabilist.cpp
index 66936f3..165b0df 100644
--- a/tests/test_probabilist.cpp
+++ b/tests/test_probabilist.cpp
@@ -6,11 +6,14 @@
 #include <vector>
 #include <tuple>
 #include <array>
+#include <string>
+#include <unordered_map>
 
 #include <gtest/gtest.h>
 
 #include <xtl/xoptional.hpp>
 #include <xtensor/xtensor.hpp>
+#include <xtensor/xarray.hpp>
 #include <xtensor/xview.hpp>
 #include <xtensor/xmath.hpp>
 #include <xtensor/xsort.hpp>
@@ -38,17 +41,37 @@ std::tuple<xt::xtensor<double, 1>, xt::xtensor<double, 2>> load_data_p()
 {
     // read in data
     std::ifstream ifs;
-    ifs.open(EVALHYD_DATA_DIR "/q_obs.csv");
+    ifs.open(EVALHYD_DATA_DIR "/data/q_obs.csv");
     xt::xtensor<double, 1> observed = xt::squeeze(xt::load_csv<int>(ifs));
     ifs.close();
 
-    ifs.open(EVALHYD_DATA_DIR "/q_prd.csv");
+    ifs.open(EVALHYD_DATA_DIR "/data/q_prd.csv");
     xt::xtensor<double, 2> predicted = xt::load_csv<double>(ifs);
     ifs.close();
 
     return std::make_tuple(observed, predicted);
 }
 
+std::unordered_map<std::string, xt::xarray<double>> load_expected_p()
+{
+    // read in expected results
+    std::ifstream ifs;
+    std::unordered_map<std::string, xt::xarray<double>> expected;
+
+    for (const auto& metric : all_metrics_p)
+    {
+        ifs.open(EVALHYD_DATA_DIR "/expected/evalp/" + metric + ".csv");
+        expected[metric] = xt::view(
+                xt::squeeze(xt::load_csv<double>(ifs)),
+                xt::newaxis(), xt::newaxis(), xt::newaxis(),
+                xt::newaxis(), xt::all()
+        );
+        ifs.close();
+    }
+
+    return expected;
+}
+
 TEST(ProbabilistTests, TestBrier)
 {
     // read in data
@@ -56,54 +79,31 @@ TEST(ProbabilistTests, TestBrier)
     xt::xtensor<double, 2> predicted;
     std::tie(observed, predicted) = load_data_p();
 
+    // read in expected results
+    auto expected = load_expected_p();
+
     // compute scores
     xt::xtensor<double, 2> thresholds = {{690, 534, 445, NAN}};
+    std::vector<std::string> metrics = {"BS", "BSS", "BS_CRD", "BS_LBD"};
 
-    std::vector<xt::xarray<double>> metrics =
+    std::vector<xt::xarray<double>> results =
             evalhyd::evalp(
                     // shape: (sites [1], time [t])
                     xt::eval(xt::view(observed, xt::newaxis(), xt::all())),
                     // shape: (sites [1], lead times [1], members [m], time [t])
                     xt::eval(xt::view(predicted, xt::newaxis(), xt::newaxis(), xt::all(), xt::all())),
-                    {"BS", "BSS", "BS_CRD", "BS_LBD"},
+                    metrics,
                     thresholds,
                     "high"
             );
 
     // check results
-    // Brier scores
-    xt::xtensor<double, 5> bs =
-            {{{{{0.10615136, 0.07395622, 0.08669186, NAN}}}}};
-    EXPECT_TRUE(
-            xt::all(xt::isclose(metrics[0], bs, 1e-05, 1e-08, true))
-    );
-
-    // Brier skill scores
-    xt::xtensor<double, 5> bss =
-            {{{{{0.5705594, 0.6661165, 0.5635126, NAN}}}}};
-    EXPECT_TRUE(
-            xt::all(xt::isclose(metrics[1], bss, 1e-05, 1e-08, true))
-    );
-
-    // Brier calibration-refinement decompositions
-    xt::xtensor<double, 6> bs_crd =
-            {{{{{{0.011411758, 0.1524456, 0.2471852},
-                 {0.005532413, 0.1530793, 0.2215031},
-                 {0.010139431, 0.1220601, 0.1986125},
-                 {NAN, NAN, NAN}}}}}};
-    EXPECT_TRUE(
-            xt::all(xt::isclose(metrics[2], bs_crd, 1e-05, 1e-08, true))
-    );
-
-    // Brier likelihood-base rate decompositions
-    xt::xtensor<double, 6> bs_lbd =
-            {{{{{{0.012159881, 0.1506234, 0.2446149},
-                 {0.008031746, 0.1473869, 0.2133114},
-                 {0.017191279, 0.1048221, 0.1743227},
-                 {NAN, NAN, NAN}}}}}};
-    EXPECT_TRUE(
-            xt::all(xt::isclose(metrics[3], bs_lbd, 1e-05, 1e-08, true))
-    );
+    for (std::size_t m = 0; m < metrics.size(); m++)
+    {
+        EXPECT_TRUE(xt::all(xt::isclose(
+                results[m], expected[metrics[m]], 1e-05, 1e-08, true
+        ))) << "Failure for (" << metrics[m] << ")";
+    }
 }
 
 TEST(ProbabilistTests, TestQuantiles)
@@ -113,36 +113,28 @@ TEST(ProbabilistTests, TestQuantiles)
     xt::xtensor<double, 2> predicted;
     std::tie(observed, predicted) = load_data_p();
 
+    // read in expected results
+    auto expected = load_expected_p();
+
     // compute scores
-    std::vector<xt::xarray<double>> metrics =
+    std::vector<std::string> metrics = {"QS", "CRPS"};
+
+    std::vector<xt::xarray<double>> results =
             evalhyd::evalp(
                     // shape: (sites [1], time [t])
                     xt::eval(xt::view(observed, xt::newaxis(), xt::all())),
                     // shape: (sites [1], lead times [1], members [m], time [t])
                     xt::eval(xt::view(predicted, xt::newaxis(), xt::newaxis(), xt::all(), xt::all())),
-                    {"QS", "CRPS"}
+                    metrics
             );
 
     // check results
-    // Quantile scores
-    xt::xtensor<double, 5> qs =
-            {{{{{345.91578, 345.069256, 343.129359, 340.709869, 338.281598,
-                 335.973535, 333.555157, 330.332426, 327.333539, 324.325996,
-                 321.190082, 318.175117, 315.122186, 311.97205, 308.644942,
-                 305.612169, 302.169552, 298.445956, 294.974648, 291.273807,
-                 287.724586, 284.101905, 280.235592, 276.21865, 272.501484,
-                 268.652733, 264.740168, 260.8558, 256.90329, 252.926292,
-                 248.931239, 244.986396, 240.662998, 236.328964, 232.089785,
-                 227.387089, 222.976008, 218.699975, 214.099678, 209.67252,
-                 205.189587, 200.395746, 195.2372, 190.080139, 185.384244,
-                 180.617858, 174.58323, 169.154093, 163.110932, 156.274796,
-                 147.575315}}}}};
-    EXPECT_TRUE(xt::all(xt::isclose(metrics[0], qs)));
-
-    // Continuous ranked probability scores
-    xt::xtensor<double, 4> crps =
-            {{{{252.956919}}}};
-    EXPECT_TRUE(xt::all(xt::isclose(metrics[1], crps)));
+    for (std::size_t m = 0; m < metrics.size(); m++)
+    {
+        EXPECT_TRUE(xt::all(xt::isclose(
+                results[m], expected[metrics[m]], 1e-05, 1e-08, true
+        ))) << "Failure for (" << metrics[m] << ")";
+    }
 }
 
 TEST(ProbabilistTests, TestContingency)
@@ -152,260 +144,31 @@ TEST(ProbabilistTests, TestContingency)
     xt::xtensor<double, 2> predicted;
     std::tie(observed, predicted) = load_data_p();
 
+    // read in expected results
+    auto expected = load_expected_p();
+
     // compute scores
     xt::xtensor<double, 2> thresholds = {{690, 534, 445, NAN}};
+    std::vector<std::string> metrics = {"POD", "POFD", "FAR", "CSI", "ROCSS"};
 
-    std::vector<xt::xarray<double>> metrics =
+    std::vector<xt::xarray<double>> results =
             evalhyd::evalp(
                     // shape: (sites [1], time [t])
                     xt::eval(xt::view(observed, xt::newaxis(), xt::all())),
                     // shape: (sites [1], lead times [1], members [m], time [t])
                     xt::eval(xt::view(predicted, xt::newaxis(), xt::newaxis(), xt::all(), xt::all())),
-                    {"POD", "POFD", "FAR", "CSI", "ROCSS"},
+                    metrics,
                     thresholds,
                     "low"
             );
 
     // check results
-    // POD
-    xt::xtensor<double, 6> pod =
-            {{{{{{ 1.      , 1.      , 1.      , NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.863309, 0.873786, 0.752941, NAN},
-                 { 0.848921, 0.873786, 0.752941, NAN},
-                 { 0.848921, 0.873786, 0.752941, NAN},
-                 { 0.848921, 0.864078, 0.752941, NAN}}}}}};
-    EXPECT_TRUE(
-            xt::all(xt::isclose(metrics[0], pod, 1e-05, 1e-08, true))
-    );
-
-    // POFD
-    xt::xtensor<double, 6> pofd =
-            {{{{{{ 1.      , 1.      , 1.      , NAN},
-                 { 0.087209, 0.038462, 0.026549, NAN},
-                 { 0.087209, 0.038462, 0.026549, NAN},
-                 { 0.087209, 0.038462, 0.026549, NAN},
-                 { 0.087209, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.026549, NAN},
-                 { 0.081395, 0.038462, 0.022124, NAN}}}}}};
-    EXPECT_TRUE(
-            xt::all(xt::isclose(metrics[1], pofd, 1e-04, 1e-07, true))
-    );
-
-    // FAR
-    xt::xtensor<double, 6> far =
-            {{{{{{ 0.553055, 0.66881 , 0.726688, NAN},
-                 { 0.111111, 0.081633, 0.085714, NAN},
-                 { 0.111111, 0.081633, 0.085714, NAN},
-                 { 0.111111, 0.081633, 0.085714, NAN},
-                 { 0.111111, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.104478, 0.081633, 0.085714, NAN},
-                 { 0.106061, 0.081633, 0.085714, NAN},
-                 { 0.106061, 0.081633, 0.085714, NAN},
-                 { 0.106061, 0.082474, 0.072464, NAN}}}}}};
-    EXPECT_TRUE(
-            xt::all(xt::isclose(metrics[2], far, 1e-05, 1e-08, true))
-    );
-
-    // CSI
-    xt::xtensor<double, 6> csi =
-            {{{{{{ 0.446945, 0.33119 , 0.273312, NAN},
-                 { 0.779221, 0.810811, 0.703297, NAN},
-                 { 0.779221, 0.810811, 0.703297, NAN},
-                 { 0.779221, 0.810811, 0.703297, NAN},
-                 { 0.779221, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.784314, 0.810811, 0.703297, NAN},
-                 { 0.771242, 0.810811, 0.703297, NAN},
-                 { 0.771242, 0.810811, 0.703297, NAN},
-                 { 0.771242, 0.801802, 0.711111, NAN}}}}}}
-    ;
-    EXPECT_TRUE(
-            xt::all(xt::isclose(metrics[3], csi, 1e-05, 1e-08, true))
-    );
-
-    // ROC skill scores
-    xt::xtensor<double, 5> rocss =
-            {{{{{ 0.710850, 0.801718, 0.713066, NAN}}}}};
-    EXPECT_TRUE(
-            xt::all(xt::isclose(metrics[4], rocss, 1e-05, 1e-08, true))
-    );
+    for (std::size_t m = 0; m < metrics.size(); m++)
+    {
+        EXPECT_TRUE(xt::all(xt::isclose(
+                results[m], expected[metrics[m]], 1e-05, 1e-08, true
+        ))) << "Failure for (" << metrics[m] << ")";
+    }
 }
 
 TEST(ProbabilistTests, TestRanks)
@@ -415,8 +178,12 @@ TEST(ProbabilistTests, TestRanks)
     xt::xtensor<double, 2> predicted;
     std::tie(observed, predicted) = load_data_p();
 
+    // read in expected results
+    auto expected = load_expected_p();
+    std::vector<std::string> metrics = {"RANK_HIST", "DS", "AS"};
+
     // compute scores
-    std::vector<xt::xarray<double>> metrics =
+    std::vector<xt::xarray<double>> results =
             evalhyd::evalp(
                     // shape: (sites [1], time [t])
                     xt::eval(xt::view(observed, xt::newaxis(), xt::all())),
@@ -434,69 +201,12 @@ TEST(ProbabilistTests, TestRanks)
             );
 
     // check results
-    // Rank histogram
-    xt::xtensor<double, 5> rank_hist;
-#if EVALHYD_TESTING_OS == WINDOWS
-    rank_hist =  {{{{{ 0.607717,  0.      ,  0.      ,  0.      ,  0.      ,  0.003215,
-                       0.      ,  0.      ,  0.      ,  0.      ,  0.      ,  0.      ,
-                       0.003215,  0.      ,  0.003215,  0.      ,  0.      ,  0.      ,
-                       0.      ,  0.      ,  0.      ,  0.      ,  0.      ,  0.      ,
-                       0.      ,  0.      ,  0.      ,  0.      ,  0.      ,  0.003215,
-                       0.      ,  0.      ,  0.      ,  0.      ,  0.      ,  0.006431,
-                       0.      ,  0.      ,  0.003215,  0.006431,  0.      ,  0.      ,
-                       0.      ,  0.003215,  0.      ,  0.      ,  0.003215,  0.003215,
-                       0.003215,  0.      ,  0.006431,  0.344051}}}}};
-#elif EVALHYD_TESTING_OS == MACOS
-    rank_hist =  {{{{{ 0.607717,  0.      ,  0.      ,  0.      ,  0.      ,  0.003215,
-                       0.      ,  0.      ,  0.      ,  0.      ,  0.      ,  0.      ,
-                       0.003215,  0.      ,  0.003215,  0.      ,  0.      ,  0.      ,
-                       0.      ,  0.      ,  0.      ,  0.      ,  0.      ,  0.      ,
-                       0.      ,  0.      ,  0.      ,  0.      ,  0.      ,  0.003215,
-                       0.      ,  0.      ,  0.      ,  0.      ,  0.      ,  0.006431,
-                       0.      ,  0.      ,  0.003215,  0.006431,  0.      ,  0.      ,
-                       0.      ,  0.003215,  0.      ,  0.      ,  0.003215,  0.003215,
-                       0.003215,  0.      ,  0.006431,  0.344051}}}}};
-#elif EVALHYD_TESTING_OS == LINUX
-    rank_hist =  {{{{{ 0.607717,  0.      ,  0.      ,  0.      ,  0.      ,  0.003215,
-                       0.      ,  0.      ,  0.      ,  0.      ,  0.      ,  0.      ,
-                       0.003215,  0.      ,  0.003215,  0.      ,  0.      ,  0.      ,
-                       0.      ,  0.      ,  0.      ,  0.      ,  0.      ,  0.      ,
-                       0.      ,  0.      ,  0.      ,  0.      ,  0.      ,  0.003215,
-                       0.      ,  0.      ,  0.      ,  0.      ,  0.      ,  0.006431,
-                       0.      ,  0.      ,  0.003215,  0.006431,  0.      ,  0.      ,
-                       0.      ,  0.003215,  0.      ,  0.      ,  0.003215,  0.003215,
-                       0.003215,  0.      ,  0.006431,  0.344051}}}}};
-#endif
-    EXPECT_TRUE(
-            xt::all(xt::isclose(metrics[0], rank_hist, 1e-04, 1e-06, true))
-    );
-
-    // Delta scores
-    xt::xtensor<double, 4> ds;
-#if EVALHYD_TESTING_OS == WINDOWS
-    ds = {{{{ 148.790164}}}};
-#elif EVALHYD_TESTING_OS == MACOS
-    ds = {{{{ 148.790164}}}};
-#elif EVALHYD_TESTING_OS == LINUX
-    ds = {{{{ 148.790164}}}};
-#endif
-    EXPECT_TRUE(
-            xt::all(xt::isclose(metrics[1], ds, 1e-04, 1e-07, true))
-    );
-
-
-    // Alpha scores
-    xt::xtensor<double, 4> as;
-#if EVALHYD_TESTING_OS == WINDOWS
-    as = {{{{ 0.491481}}}};
-#elif EVALHYD_TESTING_OS == MACOS
-    as = {{{{ 0.491481}}}};
-#elif EVALHYD_TESTING_OS == LINUX
-    as = {{{{ 0.491481}}}};
-#endif
-    EXPECT_TRUE(
-            xt::all(xt::isclose(metrics[2], as, 1e-04, 1e-07, true))
-    );
+    for (std::size_t m = 0; m < metrics.size(); m++)
+    {
+        EXPECT_TRUE(xt::all(xt::isclose(
+                results[m], expected[metrics[m]], 1e-05, 1e-08, true
+        ))) << "Failure for (" << metrics[m] << ")";
+    }
 }
 
 TEST(ProbabilistTests, TestIntervals)
@@ -506,8 +216,13 @@ TEST(ProbabilistTests, TestIntervals)
     xt::xtensor<double, 2> predicted;
     std::tie(observed, predicted) = load_data_p();
 
+    // read in expected results
+    auto expected = load_expected_p();
+
     // compute scores
-    std::vector<xt::xarray<double>> metrics =
+    std::vector<std::string> metrics = {"CR", "AW", "AWN", "AWI", "WS", "WSS"};
+
+    std::vector<xt::xarray<double>> results =
             evalhyd::evalp(
                     // shape: (sites [1], time [t])
                     xt::eval(xt::view(observed, xt::newaxis(), xt::all())),
@@ -520,29 +235,12 @@ TEST(ProbabilistTests, TestIntervals)
             );
 
     // check results
-    // coverage ratios
-    xt::xtensor<double, 5> cr = {{{{{ 0.006431, 0.03537 }}}}};
-    EXPECT_TRUE(xt::all(xt::isclose(metrics[0], cr, 1e-05, 1e-06, true)));
-
-    // average widths
-    xt::xtensor<double, 5> aw = {{{{{ 9.27492, 31.321543}}}}};
-    EXPECT_TRUE(xt::all(xt::isclose(metrics[1], aw, 1e-05, 1e-06, true)));
-
-    // average widths normalised
-    xt::xtensor<double, 5> awn = {{{{{ 0.007383, 0.024931}}}}};
-    EXPECT_TRUE(xt::all(xt::isclose(metrics[2], awn, 1e-05, 1e-06, true)));
-
-    // average widths indices
-    xt::xtensor<double, 5> awi = {{{{{ 0.982112, 0.988095}}}}};
-    EXPECT_TRUE(xt::all(xt::isclose(metrics[3], awi, 1e-05, 1e-06, true)));
-
-    // Winkler scores
-    xt::xtensor<double, 5> ws = {{{{{ 764.447175, 2578.138264}}}}};
-    EXPECT_TRUE(xt::all(xt::isclose(metrics[4], ws, 1e-05, 1e-06, true)));
-
-    // Winkler skill scores
-    xt::xtensor<double, 5> wss = {{{{{ 0.662189, 0.436039}}}}};
-    EXPECT_TRUE(xt::all(xt::isclose(metrics[5], wss, 1e-05, 1e-06, true)));
+    for (std::size_t m = 0; m < metrics.size(); m++)
+    {
+        EXPECT_TRUE(xt::all(xt::isclose(
+                results[m], expected[metrics[m]], 1e-05, 1e-08, true
+        ))) << "Failure for (" << metrics[m] << ")";
+    }
 }
 
 TEST(ProbabilistTests, TestMasks)
@@ -891,16 +589,16 @@ TEST(ProbabilistTests, TestBootstrap)
     // read in data
     std::ifstream ifs;
 
-    ifs.open(EVALHYD_DATA_DIR "/q_obs_1yr.csv");
+    ifs.open(EVALHYD_DATA_DIR "/data/q_obs_1yr.csv");
     xt::xtensor<std::string, 1> x_dts = xt::squeeze(xt::load_csv<std::string>(ifs, ',', 0, 1));
     ifs.close();
     std::vector<std::string> datetimes (x_dts.begin(), x_dts.end());
 
-    ifs.open(EVALHYD_DATA_DIR "/q_obs_1yr.csv");
+    ifs.open(EVALHYD_DATA_DIR "/data/q_obs_1yr.csv");
     xt::xtensor<double, 1> observed = xt::squeeze(xt::load_csv<double>(ifs, ',', 1));
     ifs.close();
 
-    ifs.open(EVALHYD_DATA_DIR "/q_prd_1yr.csv");
+    ifs.open(EVALHYD_DATA_DIR "/data/q_prd_1yr.csv");
     xt::xtensor<double, 2> predicted = xt::load_csv<double>(ifs, ',', 1);
     ifs.close();
 
@@ -976,16 +674,16 @@ TEST(ProbabilistTests, TestBootstrapSummary)
     // read in data
     std::ifstream ifs;
 
-    ifs.open(EVALHYD_DATA_DIR "/q_obs_1yr.csv");
+    ifs.open(EVALHYD_DATA_DIR "/data/q_obs_1yr.csv");
     xt::xtensor<std::string, 1> x_dts = xt::squeeze(xt::load_csv<std::string>(ifs, ',', 0, 1));
     ifs.close();
     std::vector<std::string> datetimes (x_dts.begin(), x_dts.end());
 
-    ifs.open(EVALHYD_DATA_DIR "/q_obs_1yr.csv");
+    ifs.open(EVALHYD_DATA_DIR "/data/q_obs_1yr.csv");
     xt::xtensor<double, 1> observed = xt::squeeze(xt::load_csv<double>(ifs, ',', 1));
     ifs.close();
 
-    ifs.open(EVALHYD_DATA_DIR "/q_prd_1yr.csv");
+    ifs.open(EVALHYD_DATA_DIR "/data/q_prd_1yr.csv");
     xt::xtensor<double, 2> predicted = xt::load_csv<double>(ifs, ',', 1);
     ifs.close();
 
-- 
GitLab