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)
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")
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)
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)
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')
def __init__(self): super(BoxDriver, self).__init__() self.recorders = [ListCaseRecorder()]
def __init__(self): super(BoxDriver, self).__init__() self.recorder = ListCaseRecorder()