Exemplo n.º 1
0
 def test_primitive_sequence_to_expression_string_wrong_length(self):
     primitive_sequence = [
         gp.Primitive('add', args=(int, int), ret=int),
         gp.Terminal('x', symbolic=True, ret=None),
     ]
     with self.assertRaisesRegex(
             ValueError,
             r'The length of sequence should be 1 \+ 2 \* n, but got 2'):
         evolutionary.primitive_sequence_to_expression_string(
             primitive_sequence)
Exemplo n.º 2
0
 def test_primitive_sequence_to_expression_string(self):
     #       add
     #       / \
     #      x  mul
     #         / \
     #       sub  y
     #       / \
     #      a  b
     primitive_sequence = [
         gp.Primitive('add', args=(int, int), ret=int),
         gp.Terminal('x', symbolic=True, ret=None),
         gp.Primitive('mul', args=(int, int), ret=int),
         gp.Primitive('sub', args=(int, int), ret=int),
         # Whether symbolic is True or False does not matter.
         gp.Terminal(1, symbolic=True, ret=None),
         gp.Terminal(2, symbolic=False, ret=None),
         gp.Terminal('y', symbolic=True, ret=None),
     ]
     self.assertEqual(
         evolutionary.primitive_sequence_to_expression_string(
             primitive_sequence), '( x + ( ( 1 - 2 ) * y ) )')
Exemplo n.º 3
0
 def _call(fun):
     return gp.Primitive(f'{fun.name}/{fun.arity}', fun.params, fun.ret)
Exemplo n.º 4
0
 def _return():
     name = f'{RET}/1'
     fun = FUN[name]
     return gp.Primitive(name, fun.params, fun.ret)
Exemplo n.º 5
0
 def _if():
     name = f'{IF}/3'
     fun = FUN[name]
     return gp.Primitive(name, fun.params, fun.ret)
Exemplo n.º 6
0
 def _assign():
     name = f'{ASSIGN}/2'
     fun = FUN[name]
     return gp.Primitive(name, fun.params, fun.ret)
Exemplo n.º 7
0
 def _sequence(arity):
     name = f'{SEQ}/{arity}'
     fun = FUN[name]
     return gp.Primitive(name, fun.params, fun.ret)
Exemplo n.º 8
0
class EvolutionaryTest(parameterized.TestCase):
    def setUp(self):
        super(EvolutionaryTest, self).setUp()
        self.pset = evolutionary.get_univariate_one_constant_primitives_set()

    @parameterized.parameters(
        ('( 1 + x )', True),
        (gp.Terminal('x', symbolic=True, ret=None), True),
        (gp.Primitive('c', args=(), ret=None), True),
        (gp.Primitive('add', args=(int, int), ret=int), False),
    )
    def test_is_terminal(self, node, expected):
        self.assertEqual(evolutionary.is_terminal(node), expected)

    @parameterized.parameters(
        (gp.Primitive('add', args=(int, int),
                      ret=int), gp.Terminal('x', symbolic=True, ret=None),
         gp.Terminal('y', symbolic=True, ret=None), '( x + y )'),
        (gp.Primitive('add', args=(int, int),
                      ret=int), gp.Primitive('add', args=(int, int), ret=int),
         gp.Terminal('y', symbolic=True, ret=None), None),
        (gp.Primitive('add', args=(int, int),
                      ret=int), gp.Terminal('x', symbolic=True, ret=None),
         gp.Primitive('add', args=(int, int), ret=int), None),
    )
    def test_combine_nodes(self, node0, node1, node2, expected):
        self.assertEqual(evolutionary.combine_nodes(node0, node1, node2),
                         expected)

    def test_primitive_sequence_to_expression_string(self):
        #       add
        #       / \
        #      x  mul
        #         / \
        #       sub  y
        #       / \
        #      a  b
        primitive_sequence = [
            gp.Primitive('add', args=(int, int), ret=int),
            gp.Terminal('x', symbolic=True, ret=None),
            gp.Primitive('mul', args=(int, int), ret=int),
            gp.Primitive('sub', args=(int, int), ret=int),
            # Whether symbolic is True or False does not matter.
            gp.Terminal(1, symbolic=True, ret=None),
            gp.Terminal(2, symbolic=False, ret=None),
            gp.Terminal('y', symbolic=True, ret=None),
        ]
        self.assertEqual(
            evolutionary.primitive_sequence_to_expression_string(
                primitive_sequence), '( x + ( ( 1 - 2 ) * y ) )')

    def test_primitive_sequence_to_expression_string_constant(self):
        primitive_sequence = [gp.Terminal('ARG0', symbolic=True, ret=None)]
        self.assertEqual(
            evolutionary.primitive_sequence_to_expression_string(
                primitive_sequence), 'x')

    def test_primitive_sequence_to_expression_string_wrong_length(self):
        primitive_sequence = [
            gp.Primitive('add', args=(int, int), ret=int),
            gp.Terminal('x', symbolic=True, ret=None),
        ]
        with self.assertRaisesRegex(
                ValueError,
                r'The length of sequence should be 1 \+ 2 \* n, but got 2'):
            evolutionary.primitive_sequence_to_expression_string(
                primitive_sequence)

    def test_evolutionary_algorithm_with_num_evals_limit(self):
        evolutionary.set_creator()
        toolbox = evolutionary.get_toolbox(pset=self.pset, max_height=50)
        toolbox.register('evaluate',
                         evolutionary.evaluate_individual,
                         input_values=np.array([1., 2., 3.]),
                         output_values=np.array([2., 3., 4.]),
                         toolbox=toolbox)
        population = toolbox.population(n=10)
        halloffame = tools.HallOfFame(1)

        evolutionary.evolutionary_algorithm_with_num_evals_limit(
            population=population,
            toolbox=toolbox,
            cxpb=0.5,
            mutpb=0.1,
            num_evals_limit=500,
            halloffame=halloffame)

        func = toolbox.compile(expr=halloffame[0])
        np.testing.assert_allclose(func(np.array([5., 6., 7.])), [6., 7., 8.])

    @parameterized.parameters(
        (None, None, None, False),
        (0, 1, None, True),
        (0, 1, 50., True),
    )
    def test_search_expression(self, leading_at_0, leading_at_inf,
                               hard_penalty_default_value,
                               include_leading_powers):
        # Test search several expressions.
        evolutionary.set_creator()

        evolutionary.search_expression(
            input_values=np.array([1., 2., 3.]),
            output_values=np.array([2., 3., 4.]),
            pset=self.pset,
            max_height=50,
            population_size=10,
            cxpb=0.5,
            mutpb=0.1,
            num_evals_limit=30,
            leading_at_0=leading_at_0,
            leading_at_inf=leading_at_inf,
            hard_penalty_default_value=hard_penalty_default_value,
            include_leading_powers=include_leading_powers,
            default_value=50.)

        evolutionary.search_expression(
            input_values=np.array([1., 2., 3.]),
            output_values=np.array([1., 4., 9.]),
            pset=self.pset,
            max_height=50,
            population_size=10,
            cxpb=0.5,
            mutpb=0.1,
            num_evals_limit=30,
            leading_at_0=leading_at_0,
            leading_at_inf=leading_at_inf,
            hard_penalty_default_value=hard_penalty_default_value,
            include_leading_powers=include_leading_powers,
            default_value=50.)