@@ -32,3 +32,43 @@ def objective(f):
32
32
ind .genome .parameter_names_to_values ["<p1>" ] = 1.0
33
33
cgp .local_search .gradient_based (ind , objective , 0.05 , 1 )
34
34
assert ind .genome .parameter_names_to_values ["<p1>" ] == pytest .approx (1.0 )
35
+
36
+
37
+ def test_gradient_based_step_towards_maximum_multi_genome ():
38
+ torch = pytest .importorskip ("torch" )
39
+
40
+ primitives = (cgp .Parameter ,)
41
+ genome = cgp .Genome (1 , 1 , 1 , 1 , 1 , primitives )
42
+ # f(x) = c
43
+ genome .dna = [ID_INPUT_NODE , ID_NON_CODING_GENE , 0 , 0 , ID_OUTPUT_NODE , 1 ]
44
+ genome2 = genome .clone ()
45
+ ind = cgp .individual .IndividualMultiGenome (None , [genome , genome2 ])
46
+
47
+ def objective (f ):
48
+ x_dummy = torch .zeros ((1 , 1 ), dtype = torch .double ) # not used
49
+ target_value = torch .ones ((1 , 1 ), dtype = torch .double )
50
+ loss = torch .nn .MSELoss ()(f [0 ](x_dummy ), target_value ) + 2 * torch .nn .MSELoss ()(
51
+ f [1 ](x_dummy ), target_value
52
+ )
53
+ return loss
54
+
55
+ # test increase parameter value if too small
56
+ ind .genome [0 ].parameter_names_to_values ["<p1>" ] = 0.9
57
+ ind .genome [1 ].parameter_names_to_values ["<p1>" ] = 0.9
58
+ cgp .local_search .gradient_based (ind , objective , 0.05 , 1 )
59
+ assert ind .genome [0 ].parameter_names_to_values ["<p1>" ] == pytest .approx (0.91 )
60
+ assert ind .genome [1 ].parameter_names_to_values ["<p1>" ] == pytest .approx (0.92 )
61
+
62
+ # test decrease parameter value if too large
63
+ ind .genome [0 ].parameter_names_to_values ["<p1>" ] = 1.1
64
+ ind .genome [1 ].parameter_names_to_values ["<p1>" ] = 1.1
65
+ cgp .local_search .gradient_based (ind , objective , 0.05 , 1 )
66
+ assert ind .genome [0 ].parameter_names_to_values ["<p1>" ] == pytest .approx (1.09 )
67
+ assert ind .genome [1 ].parameter_names_to_values ["<p1>" ] == pytest .approx (1.08 )
68
+
69
+ # test no change of parameter value if at optimum
70
+ ind .genome [0 ].parameter_names_to_values ["<p1>" ] = 1.0
71
+ ind .genome [1 ].parameter_names_to_values ["<p1>" ] = 1.0
72
+ cgp .local_search .gradient_based (ind , objective , 0.05 , 1 )
73
+ assert ind .genome [0 ].parameter_names_to_values ["<p1>" ] == pytest .approx (1.0 )
74
+ assert ind .genome [1 ].parameter_names_to_values ["<p1>" ] == pytest .approx (1.0 )
0 commit comments