11import sys
22import os
33import numpy as np
4+ import dotenv
5+ import dotenv
6+ import pytest
7+ dotenv .load_dotenv ()
8+ dotenv .load_dotenv (dotenv_path = ".env.local" )
49
510sys .path .insert (0 , os .path .abspath (os .path .join (os .path .dirname (__file__ ), '..' )))
611from pyduino .optimization .nelder_mead import NelderMead
712
8- def test_nelder_mead_parabola () :
13+ class TestOptim :
914 optimizer = NelderMead (population_size = 10 , ranges = [(- 10 , 10 )] * 4 )
10- class Oracle :
11- def ask (self , X ):
12- return (X ** 2 ).sum (axis = 1 )
13- oracle = Oracle ()
14- optimizer .ask_oracle = oracle .ask
15-
16- # Set initial population to oracle
17- optimizer .init_oracle ()
18-
19- for i in range (100 ):
20- optimizer .step ()
21- assert optimizer .view (optimizer .population ).shape == (10 , 4 )
22- assert optimizer .view_g ().shape == (10 , 4 )
23- assert optimizer .inverse_view (optimizer .view (optimizer .population )).shape == (10 , 4 )
24- assert np .isclose (optimizer .y .min (), 0 , atol = 1e-4 ), f"Oracle: { optimizer .y .min ()} "
25-
26- def test_nelder_mead_rosenbrock ():
27- optimizer = NelderMead (population_size = 10 , ranges = [(- 10 , 10 )] * 4 )
28- class Oracle :
29- def ask (self , X ):
30- return ((1 - X [:, :- 1 ])** 2 ).sum (axis = 1 ) + 100 * ((X [:, 1 :] - X [:, :- 1 ]** 2 )** 2 ).sum (axis = 1 )
31- oracle = Oracle ()
32- optimizer .ask_oracle = oracle .ask
33-
34- # Set initial population to oracle
35- optimizer .init_oracle ()
36-
37- for i in range (1000 ):
38- optimizer .step ()
39- assert optimizer .view (optimizer .population ).shape == (10 , 4 )
40- assert optimizer .view_g ().shape == (10 , 4 )
41- assert optimizer .inverse_view (optimizer .view (optimizer .population )).shape == (10 , 4 )
42- assert np .isclose (optimizer .y .min (), 0 , atol = 1e-4 ), f"Oracle: { optimizer .y .min ()} "
15+
16+ def test_logic (self ):
17+ x = (2 * np .random .random ((10 , 4 ))- 1 )* 100
18+
19+ print ("X" )
20+ print (x )
21+ print ("Forward -> Backward" )
22+ print (self .optimizer .backward (self .optimizer .forward (x )))
23+
24+ assert np .allclose (x , self .optimizer .backward (self .optimizer .forward (x )))
25+ assert np .allclose (x , self .optimizer .inverse_view (self .optimizer .view (x )))
26+
27+ assert np .all (self .optimizer .backward (np .zeros ((10 ,4 ))) < 1 )
28+
29+ def test_nelder_mead_parabola (self ):
30+ class Oracle :
31+ def ask (self , X ):
32+ return (X ** 2 ).sum (axis = 1 )
33+ oracle = Oracle ()
34+ self .optimizer .ask_oracle = oracle .ask
35+
36+ # Set initial population to oracle
37+ self .optimizer .init_oracle ()
38+
39+ for i in range (100 ):
40+ self .optimizer .step ()
41+ assert self .optimizer .view (self .optimizer .population ).shape == (10 , 4 )
42+ assert self .optimizer .view_g ().shape == (10 , 4 )
43+ assert self .optimizer .inverse_view (self .optimizer .view (self .optimizer .population )).shape == (10 , 4 )
44+ assert np .isclose (self .optimizer .y .min (), 0 , atol = 1e-4 ), f"Oracle: { self .optimizer .y .min ()} "
45+
46+ def test_nelder_mead_rosenbrock (self ):
47+ class Oracle :
48+ def ask (self , X ):
49+ return ((1 - X [:, :- 1 ])** 2 ).sum (axis = 1 ) + 100 * ((X [:, 1 :] - X [:, :- 1 ]** 2 )** 2 ).sum (axis = 1 )
50+ oracle = Oracle ()
51+ self .optimizer .ask_oracle = oracle .ask
52+
53+ # Set initial population to oracle
54+ self .optimizer .init_oracle ()
55+
56+ for i in range (1000 ):
57+ self .optimizer .step ()
58+ assert self .optimizer .view (self .optimizer .population ).shape == (10 , 4 )
59+ assert self .optimizer .view_g ().shape == (10 , 4 )
60+ assert self .optimizer .inverse_view (self .optimizer .view (self .optimizer .population )).shape == (10 , 4 )
61+ assert np .isclose (self .optimizer .y .min (), 0 , atol = 1e-4 ), f"Oracle: { self .optimizer .y .min ()} "
0 commit comments