def test_shapes(self):

        self.hobj.add('sh1', Array(array([[2.0, 4.5],[3.14, 2.5]]), iotype='in', units='kg', shape=(2,2)))
        self.assertEqual(self.hobj.sh1[1][1], 2.5)
        
        try:
            self.hobj.add('sh1', Array(array([2.0, 2.5]), iotype='in', units='kg', shape=(2,2)))
        except ValueError, err:
            msg = "Shape of the default value does not match the shape attribute."
            self.assertEqual(str(err), msg)
Exemple #2
0
    def setUp(self):
        """this setup function will be called before each test in this class"""
        self.hobj = Component()
        self.hobj.add('arr1', Array(array([98.9]), iotype='in', units='ft'))
        self.hobj.add('arr2', Array(array([13.2]), iotype='out', units='inch'))
        self.hobj.add('arr3', Array(iotype='in', units='kg', desc='stuff'))

        self.hobj.arr1 = [1.0, 2.0, 3.0]
        self.hobj.arr2 = [[1., 2.], [3., 4.]]
        self.hobj.arr3 = [1.1]
 def setUp(self):
     """this setup function will be called before each test in this class"""
     self.hobj = Component()
     self.hobj.add('arr1',Array(array([98.9]), iotype='in', units='ft'))
     self.hobj.add('arr2', Array(array([13.2]), iotype='out', units='inch'))
     self.hobj.add('arr3', Array(iotype='in', units='kg', desc='stuff'))
     
     self.hobj.arr1 = [1.0, 2.0, 3.0]
     self.hobj.arr2 = [[1.,2.],[3.,4.]]
     self.hobj.arr3 = [1.1]
Exemple #4
0
    def test_set_to_default(self):
        self.hobj.add('arr4', Array(iotype='in', units='kg'))
        self.assertTrue(all(array([]) == self.hobj.arr4))
        self.hobj.arr4 = [6.5]
        self.assertEqual(6.5, self.hobj.arr4[0])

        self.hobj.revert_to_defaults()

        self.assertTrue(all(array([98.9]) == self.hobj.arr1))
        self.assertTrue(all(array([]) == self.hobj.arr4))
 def test_set_to_default(self):
     self.hobj.add('arr4', Array(iotype='in', units='kg'))
     self.assertTrue(all(array([]) == self.hobj.arr4))
     self.hobj.arr4 = [6.5]
     self.assertEqual(6.5, self.hobj.arr4[0])
     
     self.hobj.revert_to_defaults()
     
     self.assertTrue(all(array([98.9]) == self.hobj.arr1))
     self.assertTrue(all(array([]) == self.hobj.arr4))
 def test_slice(self):
     ex = ExprEvaluator('a1d[1::2]', self.top.a)
     self.assertTrue(all(array([2., 4., 6.]) == ex.evaluate()))
     ex.text = 'a1d[2:4]'
     self.assertTrue(all(array([3., 4.]) == ex.evaluate()))
     ex.text = 'a1d[2:]'
     self.assertTrue(all(array([3., 4., 5., 6.]) == ex.evaluate()))
     ex.text = 'a1d[::-1]'
     self.assertTrue(all(array([6., 5., 4., 3., 2., 1.]) == ex.evaluate()))
     ex.text = 'a1d[:2]'
     self.assertTrue(all(array([1., 2.]) == ex.evaluate()))
 def test_slice(self):
     ex = ExprEvaluator('a1d[1::2]', self.top.a)
     self.assertTrue(all(array([2.,4.,6.]) == ex.evaluate()))
     ex.text = 'a1d[2:4]'
     self.assertTrue(all(array([3.,4.]) == ex.evaluate()))
     ex.text = 'a1d[2:]'
     self.assertTrue(all(array([3.,4.,5.,6.]) == ex.evaluate()))
     ex.text = 'a1d[::-1]'
     self.assertTrue(all(array([6.,5.,4.,3.,2.,1.]) == ex.evaluate()))
     ex.text = 'a1d[:2]'
     self.assertTrue(all(array([1.,2.]) == ex.evaluate()))
 def test_set_to_default(self):
     comp = MyDefComp()
     self.assertEqual(3.14, comp.f_in)
     comp.f_in = 42.
     comp.arr_in = array([88., 32.])
     self.assertFalse(array([1.,2.,3.])==comp.arr_in)
     self.assertEqual(comp.get_valid(['f_out']), [False])
     comp.run()
     self.assertEqual(comp.get_valid(['f_out']), [True])
     comp.revert_to_defaults()
     # make sure reverting to defaults invalidates our outputs
     self.assertEqual(comp.get_valid(['f_out']), [False])
     self.assertEqual(3.14, comp.f_in)
     self.assertTrue(all(array([1.,2.,3.])==comp.arr_in))
Exemple #9
0
 def test_set_to_default(self):
     comp = MyDefComp()
     self.assertEqual(3.14, comp.f_in)
     comp.f_in = 42.
     comp.arr_in = array([88., 32.])
     self.assertFalse(array([1., 2., 3.]) == comp.arr_in)
     self.assertEqual(comp.get_valid(['f_out']), [False])
     comp.run()
     self.assertEqual(comp.get_valid(['f_out']), [True])
     comp.revert_to_defaults()
     # make sure reverting to defaults invalidates our outputs
     self.assertEqual(comp.get_valid(['f_out']), [False])
     self.assertEqual(3.14, comp.f_in)
     self.assertTrue(all(array([1., 2., 3.]) == comp.arr_in))
Exemple #10
0
    def test_constructor_defaults(self):

        self.hobj.add('arr_nodefault3', Array(iotype='in', units='kg'))
        self.assertTrue(all(array([]) == self.hobj.arr_nodefault3))

        self.hobj.add('arr_nounits', Array(iotype='in'))
        if hasattr(self.hobj.arr_nounits, 'units'):
            self.fail("Unitless Array should not have units")
 def test_constructor_defaults(self):
     
     self.hobj.add('arr_nodefault3',
                         Array(iotype='in', units='kg'))
     self.assertTrue(all(array([]) == self.hobj.arr_nodefault3))
         
     self.hobj.add('arr_nounits', Array(iotype='in'))
     if hasattr(self.hobj.arr_nounits, 'units'):
         self.fail("Unitless Array should not have units")
 def test_flatten(self):
     a = array([[1,2],[3,4],[5,6]])
     self.assertEqual(flatten_obj('foo',a), 
                      [('foo[0][0]',1),
                       ('foo[0][1]',2),
                       ('foo[1][0]',3),
                       ('foo[1][1]',4),
                       ('foo[2][0]',5),
                       ('foo[2][1]',6),])
Exemple #13
0
    def test_shapes(self):

        self.hobj.add(
            'sh1',
            Array(array([[2.0, 4.5], [3.14, 2.5]]),
                  iotype='in',
                  units='kg',
                  shape=(2, 2)))
        self.assertEqual(self.hobj.sh1[1][1], 2.5)

        try:
            self.hobj.add(
                'sh1',
                Array(array([2.0, 2.5]), iotype='in', units='kg',
                      shape=(2, 2)))
        except ValueError, err:
            msg = "Shape of the default value does not match the shape attribute."
            self.assertEqual(str(err), msg)
Exemple #14
0
    def get_gradient(self, output_name=None):
        """Returns the gradient of the given output with respect to all 
        parameters.
        
        output_name: string
            Name of the output in the local OpenMDAO hierarchy.
        """

        return array([self.gradient[wrt][output_name] for wrt in self.param_names])
Exemple #15
0
 def test_flatten(self):
     a = array([[1, 2], [3, 4], [5, 6]])
     self.assertEqual(flatten_obj('foo', a), [
         ('foo[0][0]', 1),
         ('foo[0][1]', 2),
         ('foo[1][0]', 3),
         ('foo[1][1]', 4),
         ('foo[2][0]', 5),
         ('foo[2][1]', 6),
     ])
 def get_Hessian(self, output_name=None):
     """Returns the Hessian matrix of the given output with respect to
     all parameters.
     
     output_name: string
         Name of the output in the local OpenMDAO hierarchy.
     """
     
     return array([self.hessian[in1][in2][output_name] \
                   for (in1,in2) in product(self.param_names, self.param_names)])
class A(Component):
    f = Float(iotype='in')
    a1d = Array(array([1.0, 1.0, 2.0, 3.0]), iotype='in')
    a2d = Array(array([[1.0, 1.0], [2.0, 3.0]]), iotype='in')
    b1d = Array(array([1.0, 1.0, 2.0, 3.0]), iotype='out')
    b2d = Array(array([[1.0, 1.0], [2.0, 3.0]]), iotype='out')

    def some_funct(self, a, b, op='add'):
        if op == 'add':
            return a + b
        elif op == 'mult':
            return a * b
        elif op == 'sub':
            return a - b
        raise RuntimeError("bad input to some_funct")

    @property
    def some_prop(self):
        return 7
Exemple #18
0
    def get_gradient(self, output_name=None):
        """Returns the gradient of the given output with respect to all 
        parameters.
        
        output_name: string
            Name of the output in the local OpenMDAO hierarchy.
        """

        return array([self.gradient[wrt][output_name] \
                      for wrt in self.param_names])
Exemple #19
0
    def get_Hessian(self, output_name=None):
        """Returns the Hessian matrix of the given output with respect to
        all parameters.
        
        output_name: string
            Name of the output in the local OpenMDAO hierarchy.
        """

        return array([self.hessian[in1][in2][output_name] \
               for (in1,in2) in product(self.param_names, self.param_names)])
 def setUp(self):
     self.top = top = set_as_top(Assembly())
     driver = top.add('driver', SimpleCaseIterDriver())
     top.add('comp1', ExecComp(exprs=['z=x+y']))
     top.add('comp2', ExecComp(exprs=['z=x+1']))
     top.connect('comp1.z', 'comp2.x')
     top.comp1.add('a_string', Str("Hello',;','", iotype='out'))
     top.comp1.add('a_array', Array(array([1.0, 3.0, 5.5]), iotype='out'))
     top.comp1.add('x_array', Array(array([1.0, 1.0, 1.0]), iotype='in'))
     driver.workflow.add(['comp1', 'comp2'])
     
     # now create some Cases
     outputs = ['comp1.z', 'comp2.z', 'comp1.a_string', 'comp1.a_array[2]']
     cases = []
     for i in range(10):
         inputs = [('comp1.x', i+0.1), ('comp1.y', i*2 + .1), ('comp1.x_array[1]', 99.88)]
         cases.append(Case(inputs=inputs, outputs=outputs, label='case%s'%i))
     driver.iterator = ListCaseIterator(cases)
     
     self.filename = "openmdao_test_csv_case_iterator.csv"
 def test_assignment(self):
     # check starting value
     self.assertTrue(all(array([1.,2.,3.]) == self.hobj.arr1))
     # check default value
     self.assertEqual([98.9], self.hobj.get_trait('arr1').trait_type.default_value)
     
     # use convert_units to perform unit conversion
     self.hobj.arr2 = convert_units(self.hobj.arr1, self.hobj.get_trait('arr1').units,
                                      'inch')
     self.assertAlmostEqual(12., self.hobj.arr2[0], 5)
     self.assertAlmostEqual(24., self.hobj.arr2[1], 5)
     self.assertAlmostEqual(36., self.hobj.arr2[2], 5)
 def setUp(self):
     self.top = top = set_as_top(Assembly())
     driver = top.add('driver', SimpleCaseIterDriver())
     top.add('comp1', ExecComp(exprs=['z=x+y']))
     top.add('comp2', ExecComp(exprs=['z=x+1']))
     top.connect('comp1.z', 'comp2.x')
     top.comp1.add('a_string', Str("Hello',;','", iotype='out'))
     top.comp1.add('a_array', Array(array([1.0, 3.0, 5.5]), iotype='out'))
     top.comp1.add('x_array', Array(array([1.0, 1.0, 1.0]), iotype='in'))
     top.comp1.add('vt', Slot(DumbVT, iotype='out'))
     top.comp1.vt = DumbVT()
     driver.workflow.add(['comp1', 'comp2'])
     
     # now create some Cases
     outputs = ['comp1.z', 'comp2.z', 'comp1.a_string', 'comp1.a_array[2]']
     cases = []
     for i in range(10):
         inputs = [('comp1.x', i+0.1), ('comp1.y', i*2 + .1), ('comp1.x_array[1]', 99.88)]
         cases.append(Case(inputs=inputs, outputs=outputs, label='case%s'%i))
     driver.iterator = ListCaseIterator(cases)
     
     self.filename = "openmdao_test_csv_case_iterator.csv"
Exemple #23
0
    def test_assignment(self):
        # check starting value
        self.assertTrue(all(array([1., 2., 3.]) == self.hobj.arr1))
        # check default value
        self.assertEqual([98.9],
                         self.hobj.get_trait('arr1').trait_type.default_value)

        # use convert_units to perform unit conversion
        self.hobj.arr2 = convert_units(self.hobj.arr1,
                                       self.hobj.get_trait('arr1').units,
                                       'inch')
        self.assertAlmostEqual(12., self.hobj.arr2[0], 5)
        self.assertAlmostEqual(24., self.hobj.arr2[1], 5)
        self.assertAlmostEqual(36., self.hobj.arr2[2], 5)
Exemple #24
0
 def test_set_to_unset_default(self):
     comp = MyNoDefComp()
     self.assertEqual(0., comp.f_in)
     comp.f_in = 42.
     comp.arr_in = array([88., 32.])
     comp.list_in = [1, 2, 3]
     self.assertEqual(comp.get_valid(['f_out']), [False])
     comp.run()
     self.assertEqual(comp.get_valid(['f_out']), [True])
     comp.revert_to_defaults()
     # make sure reverting to defaults invalidates our outputs
     self.assertEqual(comp.get_valid(['f_out']), [False])
     self.assertEqual(0., comp.f_in)
     self.assertTrue(all(zeros(0, 'd') == comp.arr_in))
     self.assertEqual([], comp.list_in)
 def test_set_to_unset_default(self):
     comp = MyNoDefComp()
     self.assertEqual(0., comp.f_in)
     comp.f_in = 42.
     comp.arr_in = array([88., 32.])
     comp.list_in = [1,2,3]
     self.assertEqual(comp.get_valid(['f_out']), [False])
     comp.run()
     self.assertEqual(comp.get_valid(['f_out']), [True])
     comp.revert_to_defaults()
     # make sure reverting to defaults invalidates our outputs
     self.assertEqual(comp.get_valid(['f_out']), [False])
     self.assertEqual(0., comp.f_in)
     self.assertTrue(all(zeros(0,'d')==comp.arr_in))
     self.assertEqual([], comp.list_in)
    def test_flatten(self):
        # create some Cases

        outputs = ['comp1.a_array', 'comp1.vt']
        inputs = [('comp1.x_array', array([2.0, 2.0, 2.0]))]
        self.top.driver.iterator = ListCaseIterator([Case(inputs=inputs, outputs=outputs, label='case1')])
        self.top.driver.recorders = [CSVCaseRecorder(filename=self.filename)]
        self.top.driver.recorders[0].num_backups = 0
        self.top.run()
        
        # now use the CSV recorder as source of Cases
        self.top.driver.iterator = self.top.driver.recorders[0].get_iterator()
        
        sout = StringIO.StringIO()
        self.top.driver.recorders = [DumpCaseRecorder(sout)]
        self.top.run()
        expected = [
            'Case: case1',
            '   uuid: ad4c1b76-64fb-11e0-95a8-001e8cf75fe',
            '   timestamp: 1383238593.781986',
            '   inputs:',
            '      comp1.x_array[0]: 2.0',
            '      comp1.x_array[1]: 2.0',
            '      comp1.x_array[2]: 2.0',
            '   outputs:',
            "      comp1.a_array[0]: 1.0",
            "      comp1.a_array[1]: 3.0",
            "      comp1.a_array[2]: 5.5",
            "      comp1.vt.v1: 1.0",
            "      comp1.vt.v2: 2.0",
            "      comp1.vt.vt2.vt3.a: 1.0",
            "      comp1.vt.vt2.vt3.b: 12.0",
            "      comp1.vt.vt2.x: -1.0",
            "      comp1.vt.vt2.y: -2.0",
            ]
        lines = sout.getvalue().split('\n')
        for index, line in enumerate(lines):
            if line.startswith('Case: case1'):
                for i in range(len(expected)):
                    if expected[i].startswith('   uuid:'):
                        self.assertTrue(lines[index+i].startswith('   uuid:'))
                    elif expected[i].startswith('   timestamp:'):
                        self.assertTrue(lines[index+i].startswith('   timestamp:'))
                    else:
                        self.assertEqual(lines[index+i], expected[i])
                break
        else:
            self.fail("couldn't find the expected Case")
Exemple #27
0
    def test_flatten(self):
        # create some Cases
        outputs = ['comp1.a_array', 'comp1.vt']
        inputs = [('comp1.x_array', array([2.0, 2.0, 2.0]))]
        self.top.driver.iterator = ListCaseIterator(
            [Case(inputs=inputs, outputs=outputs, label='case1')])
        self.top.driver.recorders = [CSVCaseRecorder(filename=self.filename)]
        self.top.driver.recorders[0].num_backups = 0
        self.top.run()

        # now use the CSV recorder as source of Cases
        self.top.driver.iterator = self.top.driver.recorders[0].get_iterator()

        sout = StringIO.StringIO()
        self.top.driver.recorders = [DumpCaseRecorder(sout)]
        self.top.run()
        expected = [
            'Case: case1',
            '   uuid: ad4c1b76-64fb-11e0-95a8-001e8cf75fe',
            '   inputs:',
            '      comp1.x_array[0]: 2.0',
            '      comp1.x_array[1]: 2.0',
            '      comp1.x_array[2]: 2.0',
            '   outputs:',
            "      comp1.a_array[0]: 1.0",
            "      comp1.a_array[1]: 3.0",
            "      comp1.a_array[2]: 5.5",
            "      comp1.vt.v1: 1.0",
            "      comp1.vt.v2: 2.0",
            "      comp1.vt.vt2.vt3.a: 1.0",
            "      comp1.vt.vt2.vt3.b: 12.0",
            "      comp1.vt.vt2.x: -1.0",
            "      comp1.vt.vt2.y: -2.0",
        ]
        lines = sout.getvalue().split('\n')
        for index, line in enumerate(lines):
            if line.startswith('Case: case1'):
                for i in range(len(expected)):
                    if expected[i].startswith('   uuid:'):
                        self.assertTrue(lines[index +
                                              i].startswith('   uuid:'))
                    else:
                        self.assertEqual(lines[index + i], expected[i])
                break
        else:
            self.fail("couldn't find the expected Case")
Exemple #28
0
                  units='kg',
                  shape=(2, 2)))
        self.assertEqual(self.hobj.sh1[1][1], 2.5)

        try:
            self.hobj.add(
                'sh1',
                Array(array([2.0, 2.5]), iotype='in', units='kg',
                      shape=(2, 2)))
        except ValueError, err:
            msg = "Shape of the default value does not match the shape attribute."
            self.assertEqual(str(err), msg)
        else:
            self.fail('ValueError expected')

        self.hobj.sh1 = array([[9.0, 11.0], [1.0, 2.0]])
        self.assertEqual(self.hobj.sh1[1][1], 2.0)

        try:
            self.hobj.sh1 = array([[11.0, 2.0]])
        except ValueError, err:
            msg = ": Variable 'sh1' must be an array-like object of shape (2, 2), but a shape of (1, 2) (<type 'numpy.ndarray'>) was specified."
            self.assertEqual(str(err), msg)
        else:
            self.fail('ValueError expected')

    def test_flatten(self):
        a = array([[1, 2], [3, 4], [5, 6]])
        self.assertEqual(flatten_obj('foo', a), [
            ('foo[0][0]', 1),
            ('foo[0][1]', 2),
            self.fail('TypeError expected')
            
    def test_shapes(self):

        self.hobj.add('sh1', Array(array([[2.0, 4.5],[3.14, 2.5]]), iotype='in', units='kg', shape=(2,2)))
        self.assertEqual(self.hobj.sh1[1][1], 2.5)
        
        try:
            self.hobj.add('sh1', Array(array([2.0, 2.5]), iotype='in', units='kg', shape=(2,2)))
        except ValueError, err:
            msg = "Shape of the default value does not match the shape attribute."
            self.assertEqual(str(err), msg)
        else:
            self.fail('ValueError expected')
            
        self.hobj.sh1 = array([[9.0, 11.0], [1.0, 2.0]])
        self.assertEqual(self.hobj.sh1[1][1], 2.0)
        
        try:
            self.hobj.sh1 = array([[11.0, 2.0]])
        except ValueError, err:
            msg = ": Variable 'sh1' must be an array-like object of shape (2, 2), but a shape of (1, 2) (<type 'numpy.ndarray'>) was specified."
            self.assertEqual(str(err), msg)
        else:
            self.fail('ValueError expected')
            
    def test_flatten(self):
        a = array([[1,2],[3,4],[5,6]])
        self.assertEqual(flatten_obj('foo',a), 
                         [('foo[0][0]',1),
                          ('foo[0][1]',2),
    def test_set_evaluate(self):
        ex = ExprEvaluator('comp.x', self.top)
        self.assertEqual(3.14, ex.evaluate())

        ex.set(75.4)
        self.assertEqual(75.4, self.top.comp.x)

        self.top.comp.contlist = [A(), A(), A()]
        self.top.comp.contlist[1].a1d = [4]*5
        ex = ExprEvaluator('comp.contlist[1].a1d[3]', self.top)
        self.assertEqual(ex.evaluate(), 4)

        ex.set(123)
        self.assertEqual(ex.evaluate(), 123)

        ex = ExprEvaluator("comp.contlist[1].some_funct(3,5,'sub')", self.top)
        self.assertEqual(ex.evaluate(), -2)

        ex = ExprEvaluator("comp.get_cont(1).some_funct(3,5,'add')", self.top)
        self.assertEqual(ex.evaluate(), 8)

        ex = ExprEvaluator("comp.get_cont(1).a1d[2]", self.top)
        self.assertEqual(ex.evaluate(), 4)

        ex = ExprEvaluator("a2d[1][0]", self.top.a)
        self.assertEqual(ex.evaluate(), 2.)
        ex.set(7.)
        self.assertEqual(self.top.a.a2d[1][0], 7.)

        ex = ExprEvaluator("a2d[1,0]", self.top.a)
        self.assertEqual(ex.evaluate(), 7.)
        ex.set(11.)
        self.assertEqual(self.top.a.a2d[1][0], 11.)

        ex = ExprEvaluator("a2d[1]", self.top.a)

        self.assertTrue(all(ex.evaluate() == array([11., 3.])))
        ex.set([0.1, 0.2])
        self.assertTrue(all(self.top.a.a2d[1] == array([0.1, 0.2])))


        self.top.comp.cont = A()

        ex = ExprEvaluator("comp.cont.a2d[1][0]", self.top)
        self.assertEqual(ex.evaluate(), 2.)
        ex.set(7.)
        self.assertEqual(self.top.comp.cont.a2d[1][0], 7.)

        ex = ExprEvaluator("comp.cont.a2d[1,0]", self.top)
        self.assertEqual(ex.evaluate(), 7.)
        ex.set(11.)
        self.assertEqual(self.top.comp.cont.a2d[1][0], 11.)

        # try a numpy function
        try:
            import numpy
        except ImportError:
            pass
        else:
            ex = ExprEvaluator("numpy.eye(2)", self.top.a)
            val = ex.evaluate()

            self.assertTrue((val == numpy.eye(2)).all())

        ex = ExprEvaluator("comp.get_cont(1).a1d", self.top)
        self.assertEqual(list(ex.evaluate()), [4, 4, 4, 123, 4])

        ex = ExprEvaluator("comp.get_attrib('get_cont')(1).a1d", self.top)
        self.assertEqual(list(ex.evaluate()), [4, 4, 4, 123, 4])
 def test_get(self):
     self.assertTrue(all(self.hobj.get('arr1') == array([1.,2.,3.])))
Exemple #32
0
 def test_get(self):
     self.assertTrue(all(self.hobj.get('arr1') == array([1., 2., 3.])))
    def test_set_evaluate(self):
        ex = ExprEvaluator('comp.x', self.top)
        self.assertEqual(3.14, ex.evaluate())

        ex.set(75.4)
        self.assertEqual(75.4, self.top.comp.x)

        self.top.comp.contlist = [A(), A(), A()]
        self.top.comp.contlist[1].a1d = [4] * 5
        ex = ExprEvaluator('comp.contlist[1].a1d[3]', self.top)
        self.assertEqual(ex.evaluate(), 4)

        ex.set(123)
        self.assertEqual(ex.evaluate(), 123)

        ex = ExprEvaluator("comp.contlist[1].some_funct(3,5,'sub')", self.top)
        self.assertEqual(ex.evaluate(), -2)

        ex = ExprEvaluator("comp.get_cont(1).some_funct(3,5,'add')", self.top)
        self.assertEqual(ex.evaluate(), 8)

        ex = ExprEvaluator("comp.get_cont(1).a1d[2]", self.top)
        self.assertEqual(ex.evaluate(), 4)

        ex = ExprEvaluator("a2d[1][0]", self.top.a)
        self.assertEqual(ex.evaluate(), 2.)
        ex.set(7.)
        self.assertEqual(self.top.a.a2d[1][0], 7.)

        ex = ExprEvaluator("a2d[1,0]", self.top.a)
        self.assertEqual(ex.evaluate(), 7.)
        ex.set(11.)
        self.assertEqual(self.top.a.a2d[1][0], 11.)

        ex = ExprEvaluator("a2d[1]", self.top.a)
        self.assertTrue(all(ex.evaluate() == array([11., 3.])))
        ex.set([0.1, 0.2])
        self.assertTrue(all(self.top.a.a2d[1] == array([0.1, 0.2])))

        self.top.comp.cont = A()

        ex = ExprEvaluator("comp.cont.a2d[1][0]", self.top)
        self.assertEqual(ex.evaluate(), 2.)
        ex.set(7.)
        self.assertEqual(self.top.comp.cont.a2d[1][0], 7.)

        ex = ExprEvaluator("comp.cont.a2d[1,0]", self.top)
        self.assertEqual(ex.evaluate(), 7.)
        ex.set(11.)
        self.assertEqual(self.top.comp.cont.a2d[1][0], 11.)

        # try a numpy function
        try:
            import numpy
        except ImportError:
            pass
        else:
            ex = ExprEvaluator("numpy.eye(2)", self.top.a)
            val = ex.evaluate()
            self.assertTrue((val == numpy.eye(2)).all())

        ex = ExprEvaluator("comp.get_cont(1).a1d", self.top)
        self.assertEqual(list(ex.evaluate()), [4, 4, 4, 123, 4])

        ex = ExprEvaluator("comp.get_attr('get_cont')(1).a1d", self.top)
        self.assertEqual(list(ex.evaluate()), [4, 4, 4, 123, 4])