Exemplo n.º 1
0
class BoxDriver(Driver):
    """ Just drives :class:`Box` inputs and records results. """

    def __init__(self):
        super(BoxDriver, self).__init__()
        self.recorder = ListCaseRecorder()

    def execute(self):
        """ Runs with various box parameter values. """
        for width in range(1, 2):
            for height in range(1, 3):
                for depth in range(1, 4):
                    self._logger.debug('w,h,d %s, %s, %s', width, height, depth)
                    self.set_parameters((width, height, depth))
                    self.workflow.run()
                    volume, area = self.eval_objectives()
                    self._logger.debug('    v,a %s, %s', volume, area)

                    case = Case()
                    case.inputs = [('width', None, width),
                                   ('height', None, height),
                                   ('depth', None, depth)]
                    case.outputs = [('volume', None, volume),
                                    ('area', None, area),
                                    ('pid', None, self.parent.box.pid)]
                                   # Just to show access to remote from driver.
                    self.recorder.record(case)
Exemplo n.º 2
0
    def test_basics(self):

        # Try a few different values of order and form

        # Forward with order 1
        self.model.driver.distribution_generator = FiniteDifferenceGenerator(
            self.model.driver)
        self.results = ListCaseRecorder()
        self.model.driver.recorders = [self.results]
        self.order = 1
        self.model.driver.distribution_generator.form = "FORWARD"
        self.model.driver.distribution_generator.order = self.order
        self.model.run()
        self.verify_results()

        # reset driven component values
        self.model.driven.x0 = self.model.driven.x1 = self.model.driven.x2 = self.model.driven.x3 = 1.0

        # Backward with order 2
        self.model.driver.distribution_generator = FiniteDifferenceGenerator(
            self.model.driver)
        self.results = ListCaseRecorder()
        self.model.driver.recorders = [self.results]
        self.order = 2
        self.model.driver.distribution_generator.form = "BACKWARD"
        self.model.driver.distribution_generator.order = self.order
        self.model.run()
        self.verify_results()

        # reset driven component values
        self.model.driven.x0 = self.model.driven.x1 = self.model.driven.x2 = self.model.driven.x3 = 1.0

        # Central with order 2
        self.model.driver.distribution_generator = FiniteDifferenceGenerator(
            self.model.driver)
        self.results = ListCaseRecorder()
        self.model.driver.recorders = [self.results]
        self.order = 2
        self.model.driver.distribution_generator.form = "CENTRAL"
        self.model.driver.distribution_generator.order = self.order
        self.model.run()
        self.verify_results()

        # reset driven component values
        self.model.driven.x0 = self.model.driven.x1 = self.model.driven.x2 = self.model.driven.x3 = 1.0

        # Central with order 3
        self.model.driver.distribution_generator = FiniteDifferenceGenerator(
            self.model.driver)
        self.results = ListCaseRecorder()
        self.model.driver.recorders = [self.results]
        self.order = 3
        self.model.driver.distribution_generator.form = "CENTRAL"
        self.model.driver.distribution_generator.order = self.order
        self.model.run()
        self.verify_results()
    def test_nooutput(self):
        logging.debug('')
        logging.debug('test_nooutput')

        # Create cases with missing output 'dc.sum_z'.
        cases = []
        for i in range(2):
            inputs = [('driven.x', numpy_random.normal(size=4)),
                      ('driven.y', numpy_random.normal(size=10))]
            outputs = [('driven.rosen_suzuki', None),
                       ('driven.sum_z', None)]
            cases.append(Case(inputs, outputs))

        self.model.driver.iterator = ListCaseIterator(cases)
        results = ListCaseRecorder()
        self.model.driver.recorders = [results]
        self.model.driver.error_policy = 'RETRY'

        self.model.run()

        self.assertEqual(len(results), len(cases))
        msg = "driver: Exception getting case outputs: " \
            "driven: 'DrivenComponent' object has no attribute 'sum_z'"
        for case in results.cases:
            self.assertEqual(case.msg, msg)
    def run_cases(self, sequential, forced_errors=False, retry=True):
        """ Evaluate cases, either sequentially or across multiple servers. """
        self.model.driver.sequential = sequential
        if not sequential:
            # Try to ensure more than one worker is used.
            self.model.driven.sleep = 0.2
        self.model.driver.iterator = ListCaseIterator(self.cases)
        results = ListCaseRecorder()
        self.model.driver.recorders = [results]
        self.model.driver.error_policy = 'RETRY' if retry else 'ABORT'

        if retry:
            self.model.run()
            self.assertEqual(len(results), len(self.cases))
            self.verify_results(forced_errors)
        else:
            try:
                self.model.run()
            except Exception as err:
                startmsg = 'driver: Run aborted: Traceback '
                endmsg = 'driven: Forced error'
                self.assertEqual(str(err)[:len(startmsg)], startmsg)
                self.assertEqual(str(err)[-len(endmsg):], endmsg)
            else:
                self.fail("Exception expected")
Exemplo n.º 5
0
    def test_super_simple_forward(self):

        model = Assembly()

        model.add('driver', DistributionCaseDriver())
        model.add('driven', SimpleComponent())
        model.driver.workflow.add('driven')

        # Forward
        model.driver.distribution_generator = FiniteDifferenceGenerator(
            model.driver)
        model.driver.case_outputs = ['driven.y']
        model.driver.add_parameter("driven.x", low=-10., high=10., fd_step=0.1)

        results = ListCaseRecorder()
        model.driver.recorders = [results]

        model.driver.distribution_generator.form = "FORWARD"
        model.driver.distribution_generator.order = 2
        model.run()

        self.assertAlmostEqual(results.cases[0]['driven.x'], 1.0, places=6)
        self.assertAlmostEqual(results.cases[0]['driven.y'], 2.0, places=6)
        self.assertAlmostEqual(results.cases[1]['driven.x'], 1.1, places=6)
        self.assertAlmostEqual(results.cases[1]['driven.y'], 2.2, places=6)
        self.assertAlmostEqual(results.cases[2]['driven.x'], 1.2, places=6)
        self.assertAlmostEqual(results.cases[2]['driven.y'], 2.4, places=6)
 def test_output_errors(self):
     inputs = [('driven.x', numpy_random.normal(size=4)),
               ('driven.y', numpy_random.normal(size=10)),
               ('driven.raise_error', False),
               ('driven.stop_exec', False)]
     outputs = ['driven.rosen_suzuki','driven.foobar']
     self.cases = [Case(inputs, outputs, label='1')]
     self.model.driver.sequential = True
     self.model.driver.iterator = ListCaseIterator(self.cases)
     self.model.driver.recorders = [ListCaseRecorder()]
     self.model.driver.error_policy = 'RETRY'
     self.model.run()
    def test_noiterator(self):
        logging.debug('')
        logging.debug('test_noiterator')

        # Check resoponse to no iterator set.
        self.model.driver.recorders = [ListCaseRecorder()]
        try:
            self.model.run()
        except ValueError as exc:
            msg = "driver: iterator has not been set"
            self.assertEqual(str(exc), msg)
        else:
            self.fail('ValueError expected')
    def test_save_load(self):
        logging.debug('')
        logging.debug('test_save_load')

        self.model.driver.iterator = ListCaseIterator(self.cases)
        results = ListCaseRecorder()
        self.model.driver.recorders = [results]

        # Set local dir in case we're running in a different directory.
        py_dir = self.directory

        # Exercise check_save_load().
        retcode = check_save_load(self.model, py_dir=py_dir)
        self.assertEqual(retcode, 0)
Exemplo n.º 9
0
    def test_invalid_form(self):

        model = Assembly()

        model.add('driver', DistributionCaseDriver())
        model.add('driven', SimpleComponent())
        model.driver.workflow.add('driven')
        model.driver.distribution_generator = FiniteDifferenceGenerator(
            model.driver)
        model.driver.case_outputs = ['driven.y']
        model.driver.add_parameter("driven.x", low=-10., high=10., fd_step=0.1)

        results = ListCaseRecorder()
        model.driver.recorders = [results]

        try:
            model.driver.distribution_generator.form = "INVALID_FORM"
        except ValueError, err:
            msg = "Variable 'form' must be in ['CENTRAL', 'FORWARD', 'BACKWARD'], " \
                  "but a value of INVALID_FORM <type 'str'> was specified."
            self.assertEqual(str(err), msg)
Exemplo n.º 10
0
    def test_invalid_case_outputs(self):

        model = Assembly()

        model.add('driver', DistributionCaseDriver())
        model.add('driven', SimpleComponent())
        model.driver.workflow.add('driven')
        model.driver.distribution_generator = FiniteDifferenceGenerator(
            model.driver)
        model.driver.case_outputs = ['driven.invalid']
        model.driver.add_parameter("driven.x", low=-10., high=10., fd_step=0.1)
        model.driver.error_policy = 'RETRY'

        results = ListCaseRecorder()
        model.driver.recorders = [results]

        model.driver.distribution_generator.form = "FORWARD"
        model.driver.distribution_generator.order = 2
        model.run()

        self.assertEqual(results.cases[0].items()[1][1], _Missing)
    def test_run_stop_step_resume(self):
        logging.debug('')
        logging.debug('test_run_stop_step_resume')

        self.generate_cases()
        stop_case = self.cases[1]  # Stop after 2 cases run.
        stop_case['driven.stop_exec'] = True
        self.model.driver.iterator = ListCaseIterator(self.cases)
        results = ListCaseRecorder()
        self.model.driver.recorders = [results]
        self.model.driver.sequential = True

        try:
            self.model.run()
        except RunStopped:
            self.assertEqual(len(results), 2)
            self.verify_results()
        else:
            self.fail('Expected RunStopped')

        self.model.driver.step()
        self.assertEqual(len(results), 3)
        self.verify_results()

        self.model.driver.step()
        self.assertEqual(len(results), 4)
        self.verify_results()

        self.model.driver.resume()
        self.assertEqual(len(results), len(self.cases))
        self.verify_results()

        try:
            self.model.driver.resume()
        except RuntimeError as exc:
            self.assertEqual(str(exc), 'driver: Run already complete')
        else:
            self.fail('Expected RuntimeError')
Exemplo n.º 12
0
 def __init__(self):
     super(BoxDriver, self).__init__()
     self.recorders = [ListCaseRecorder()]
Exemplo n.º 13
0
 def __init__(self):
     super(BoxDriver, self).__init__()
     self.recorder = ListCaseRecorder()