77import numpy as np
88import pandas as pd
99
10+ from uncertaintyx .oceancolour .ocx import CI
1011from uncertaintyx .oceancolour .ocx import OC4
12+ from uncertaintyx .oceancolour .ocx import OCI
1113
1214
1315def read_test_data (
@@ -34,7 +36,57 @@ def read_test_data(
3436
3537
3638class OCxTest (unittest .TestCase ):
37- """Tests OC4 and OCI model functions on optical water type classes."""
39+ """Tests OCX model functions on optical water type classes."""
40+
41+ def test_ci (self ):
42+ w , R , u , M , m = read_test_data ( # noqa : N806
43+ "test.resources" , "owt.csv"
44+ )
45+ W = np .broadcast_to (w , R .shape ) # noqa : N806
46+
47+ f = CI ()
48+ x = np .stack ([W [:, [1 , 4 , 5 ]], R [:, [1 , 4 , 5 ]]], axis = 1 )
49+ u = np .stack ([np .broadcast_to (0.5 , (M , 3 )), u [:, [1 , 4 , 5 ]]], axis = 1 )
50+ p = f .estimate ()
51+ y = f .eval (p , x )
52+
53+ self .assertEqual ((M ,), y .shape )
54+ self .assertAlmostEqual (0.022 , y [0 ], delta = 0.001 )
55+ self .assertAlmostEqual (0.033 , y [1 ], delta = 0.001 )
56+ self .assertAlmostEqual (0.048 , y [2 ], delta = 0.001 )
57+ self .assertAlmostEqual (0.074 , y [3 ], delta = 0.001 )
58+ self .assertAlmostEqual (0.111 , y [4 ], delta = 0.001 )
59+ self .assertAlmostEqual (0.152 , y [5 ], delta = 0.001 )
60+ self .assertAlmostEqual (0.205 , y [6 ], delta = 0.001 )
61+ self .assertAlmostEqual (0.259 , y [7 ], delta = 0.001 )
62+ self .assertAlmostEqual (0.350 , y [8 ], delta = 0.001 )
63+ self .assertAlmostEqual (0.426 , y [9 ], delta = 0.001 )
64+ self .assertAlmostEqual (0.538 , y [10 ], delta = 0.001 )
65+ self .assertAlmostEqual (3.897 , y [11 ], delta = 0.001 )
66+ # 12 and 13 are out of domain
67+ self .assertTrue (np .isfinite (y [12 ]))
68+ self .assertTrue (np .isfinite (y [13 ]))
69+
70+ U = np .square (u ) # noqa : N806
71+ V = f .lpu_x (p , x , U ) # noqa : N806
72+ self .assertEqual ((M ,), V .shape )
73+
74+ v = np .sqrt (V )
75+ self .assertAlmostEqual (0.026 , v [0 ], delta = 0.001 )
76+ self .assertAlmostEqual (0.024 , v [1 ], delta = 0.001 )
77+ self .assertAlmostEqual (0.042 , v [2 ], delta = 0.001 )
78+ self .assertAlmostEqual (0.068 , v [3 ], delta = 0.001 )
79+ self .assertAlmostEqual (0.070 , v [4 ], delta = 0.001 )
80+ self .assertAlmostEqual (0.074 , v [5 ], delta = 0.001 )
81+ self .assertAlmostEqual (0.107 , v [6 ], delta = 0.001 )
82+ self .assertAlmostEqual (0.100 , v [7 ], delta = 0.001 )
83+ self .assertAlmostEqual (0.174 , v [8 ], delta = 0.001 )
84+ self .assertAlmostEqual (0.204 , v [9 ], delta = 0.001 )
85+ self .assertAlmostEqual (0.200 , v [10 ], delta = 0.001 )
86+ self .assertAlmostEqual (5.461 , v [11 ], delta = 0.001 )
87+ # 12 and 13 are out of domain
88+ self .assertTrue (np .isfinite (v [12 ]))
89+ self .assertTrue (np .isfinite (y [13 ]))
3890
3991 def test_oc4 (self ):
4092 _ , R , u , M , m = read_test_data ( # noqa : N806
@@ -43,6 +95,7 @@ def test_oc4(self):
4395
4496 f = OC4 ()
4597 x = R [:, 1 :- 1 ]
98+ u = u [:, 1 :- 1 ]
4699 p = f .estimate ()
47100 y = f .eval (p , x )
48101
@@ -62,10 +115,74 @@ def test_oc4(self):
62115 self .assertAlmostEqual (3.295 , y [12 ], delta = 0.001 )
63116 self .assertAlmostEqual (3.427 , y [13 ], delta = 0.001 )
64117
65- U = np .square (u [:, 1 : - 1 ] ) # noqa : N806
66- V = f .propagate_x_diag (p , x , U )
118+ U = np .square (u ) # noqa : N806
119+ V = f .lpu_x (p , x , U ) # noqa : N806
67120 self .assertEqual ((M ,), V .shape )
68121
122+ v = np .sqrt (V )
123+ self .assertAlmostEqual (0.116 , v [0 ], delta = 0.001 )
124+ self .assertAlmostEqual (0.093 , v [1 ], delta = 0.001 )
125+ self .assertAlmostEqual (0.136 , v [2 ], delta = 0.001 )
126+ self .assertAlmostEqual (0.171 , v [3 ], delta = 0.001 )
127+ self .assertAlmostEqual (0.135 , v [4 ], delta = 0.001 )
128+ self .assertAlmostEqual (0.120 , v [5 ], delta = 0.001 )
129+ self .assertAlmostEqual (0.159 , v [6 ], delta = 0.001 )
130+ self .assertAlmostEqual (0.159 , v [7 ], delta = 0.001 )
131+ self .assertAlmostEqual (0.360 , v [8 ], delta = 0.001 )
132+ self .assertAlmostEqual (0.559 , v [9 ], delta = 0.001 )
133+ self .assertAlmostEqual (1.158 , v [10 ], delta = 0.001 )
134+ self .assertAlmostEqual (6.411 , v [11 ], delta = 0.001 )
135+ self .assertAlmostEqual (4.170 , v [12 ], delta = 0.001 )
136+ self .assertAlmostEqual (4.362 , v [13 ], delta = 0.001 )
137+
138+ def test_oci (self ):
139+ w , R , u , M , m = read_test_data ( # noqa : N806
140+ "test.resources" , "owt.csv"
141+ )
142+ W = np .broadcast_to (w , R .shape ) # noqa : N806
143+
144+ f = OCI ()
145+ x = np .stack ([W [:, 1 :], R [:, 1 :]], axis = 1 )
146+ u = np .stack ([np .broadcast_to (0.5 , (M , 5 )), u [:, 1 :]], axis = 1 )
147+ p = f .estimate ()
148+ y = f .eval (p , x )
149+
150+ self .assertEqual ((M ,), y .shape )
151+ self .assertAlmostEqual (0.022 , y [0 ], delta = 0.001 )
152+ self .assertAlmostEqual (0.033 , y [1 ], delta = 0.001 )
153+ self .assertAlmostEqual (0.048 , y [2 ], delta = 0.001 )
154+ self .assertAlmostEqual (0.074 , y [3 ], delta = 0.001 )
155+ self .assertAlmostEqual (0.111 , y [4 ], delta = 0.001 )
156+ self .assertAlmostEqual (0.152 , y [5 ], delta = 0.001 )
157+ self .assertAlmostEqual (0.205 , y [6 ], delta = 0.001 )
158+ self .assertAlmostEqual (0.260 , y [7 ], delta = 0.001 ) # blend
159+ self .assertAlmostEqual (0.426 , y [8 ], delta = 0.001 )
160+ self .assertAlmostEqual (0.572 , y [9 ], delta = 0.001 )
161+ self .assertAlmostEqual (1.022 , y [10 ], delta = 0.001 )
162+ self .assertAlmostEqual (4.174 , y [11 ], delta = 0.001 )
163+ self .assertAlmostEqual (3.295 , y [12 ], delta = 0.001 )
164+ self .assertAlmostEqual (3.427 , y [13 ], delta = 0.001 )
165+
166+ U = np .square (u ) # noqa : N806
167+ V = f .lpu_x (p , x , U ) # noqa : N806
168+ self .assertEqual ((M ,), V .shape )
169+
170+ v = np .sqrt (V )
171+ self .assertAlmostEqual (0.026 , v [0 ], delta = 0.001 )
172+ self .assertAlmostEqual (0.024 , v [1 ], delta = 0.001 )
173+ self .assertAlmostEqual (0.042 , v [2 ], delta = 0.001 )
174+ self .assertAlmostEqual (0.068 , v [3 ], delta = 0.001 )
175+ self .assertAlmostEqual (0.070 , v [4 ], delta = 0.001 )
176+ self .assertAlmostEqual (0.074 , v [5 ], delta = 0.001 )
177+ self .assertAlmostEqual (0.107 , v [6 ], delta = 0.001 )
178+ self .assertAlmostEqual (0.117 , v [7 ], delta = 0.001 ) # blend
179+ self .assertAlmostEqual (0.360 , v [8 ], delta = 0.001 )
180+ self .assertAlmostEqual (0.559 , v [9 ], delta = 0.001 )
181+ self .assertAlmostEqual (1.158 , v [10 ], delta = 0.001 )
182+ self .assertAlmostEqual (6.411 , v [11 ], delta = 0.001 )
183+ self .assertAlmostEqual (4.170 , v [12 ], delta = 0.001 )
184+ self .assertAlmostEqual (4.362 , v [13 ], delta = 0.001 )
185+
69186
70187if __name__ == "__main__" :
71188 unittest .main ()
0 commit comments