def test_super_simple_backward(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.add_response('driven.y') model.driver.add_parameter("driven.x", low=-10., high=10., fd_step=0.1) model.driver.distribution_generator.form = "BACKWARD" model.driver.distribution_generator.order = 2 model.run() x = model.driver.case_inputs.driven.x y = model.driver.case_outputs.driven.y self.assertAlmostEqual(x[0], 1.0, places=6) self.assertAlmostEqual(y[0], 2.0, places=6) self.assertAlmostEqual(x[1], 0.8, places=6) self.assertAlmostEqual(y[1], 1.6, places=6) self.assertAlmostEqual(x[2], 0.9, places=6) self.assertAlmostEqual(y[2], 1.8, places=6)
class GeomTestCase(unittest.TestCase): def setUp(self): """this setup function will be called before each test in this class""" self.top = Assembly() self.top.add('g1', GeoSource()) self.top.add('g2', GeoSink()) self.top.connect('g1.g_out', 'g2.g_inp') self.top.driver.workflow.add(['g1', 'g2']) def tearDown(self): """this teardown function will be called after each test""" self.top = None def testGeom(self): self.top.run() self.assertEqual(1, self.top.g2.g_inp.get_tessellation()) try: self.top.g2.g_extra = "hey" except TypeError as err: msg = "g2 (1-2): g_extra must provide interface 'IStaticGeometry'" self.assertEqual(str(err), msg) 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.add_response('driven.y') model.driver.add_parameter("driven.x", low=-10., high=10., fd_step=0.1) model.driver.distribution_generator.form = "FORWARD" model.driver.distribution_generator.order = 2 model.run() x = model.driver.case_inputs.driven.x y = model.driver.case_outputs.driven.y self.assertAlmostEqual(x[0], 1.0, places=6) self.assertAlmostEqual(y[0], 2.0, places=6) self.assertAlmostEqual(x[1], 1.1, places=6) self.assertAlmostEqual(y[1], 2.2, places=6) self.assertAlmostEqual(x[2], 1.2, places=6) self.assertAlmostEqual(y[2], 2.4, places=6)
def test_request(self): logging.debug('') logging.debug('test_request') assembly = Assembly() comp1 = assembly.add('comp1', ExtCode()) comp2 = assembly.add('comp2', ExtCode()) sub = assembly.add('sub', Assembly()) comp3 = sub.add('comp3', ExtCode()) comp1.resources = dict(min_cpus=10, max_cpus=10, resource_limits=dict(virtual_memory=100, cpu_time=120), rerunnable=True, accounting_id='frobozz', queue_name='debug', job_category='MPI') comp2.resources = dict(max_cpus=2, resource_limits=dict(wallclock_time=1000000)) comp3.resources = dict(min_cpus=200, resource_limits=dict(virtual_memory=20, cpu_time=1000, wallclock_time=500), rerunnable=True, accounting_id='frobozz', queue_name='debug', job_category='MPI') req = RAM.max_request(assembly) expected = dict(min_cpus=200, max_cpus=200, resource_limits=dict(virtual_memory=100, cpu_time=1000, wallclock_time=1000000)) logging.debug('req: %r', req) logging.debug('exp: %r', expected) self.assertEqual(req, expected) req = RAM.total_request(assembly) expected = dict(min_cpus=200, max_cpus=200, resource_limits=dict(virtual_memory=100, cpu_time=1120, wallclock_time=1000500), rerunnable=True, accounting_id='frobozz', queue_name='debug', job_category='MPI') logging.debug('req: %r', req) logging.debug('exp: %r', expected) self.assertEqual(req, expected) comp3.resources['accounting_id'] = 'xyzzy' assert_raises( self, 'RAM.total_request(assembly)', globals(), locals(), ValueError, "Incompatible settings for 'accounting_id':" " 'xyzzy' vs. 'frobozz'")
def test_linearGS_simul_element_and_full_connection(self): # Added because of a bug with array slices for Linear GS top = Assembly() top.add('comp1', ArrayComp2D()) top.add('comp2', ArrayComp2D()) top.add('driver', SimpleDriver()) top.driver.workflow.add(['comp1', 'comp2']) top.connect('comp1.y', 'comp2.x') top.driver.add_parameter('comp1.x[0][0]', low=-10, high=10) top.driver.add_objective('comp1.y[0][0]') top.driver.add_constraint('comp2.y[0][1] < 0') top.driver.gradient_options.lin_solver = 'linear_gs' top.driver.gradient_options.maxiter = 1 top.run() J = top.driver.calc_gradient(mode='forward') assert_rel_error(self, J[0, 0], 2.0, .000001) assert_rel_error(self, J[1, 0], 39.0, .000001) J = top.driver.calc_gradient(mode='adjoint') assert_rel_error(self, J[0, 0], 2.0, .000001) assert_rel_error(self, J[1, 0], 39.0, .000001)
def test_request(self): logging.debug('') logging.debug('test_request') assembly = Assembly() comp1 = assembly.add('comp1', ExtCode()) comp2 = assembly.add('comp2', ExtCode()) sub = assembly.add('sub', Assembly()) comp3 = sub.add('comp3', ExtCode()) comp1.resources = dict(min_cpus=10, max_cpus=10, resource_limits=dict(virtual_memory=100, cpu_time=120), rerunnable=True, accounting_id='frobozz', queue_name='debug', job_category='MPI') comp2.resources = dict(max_cpus=2, resource_limits=dict(wallclock_time=1000000)) comp3.resources = dict(min_cpus=200, resource_limits=dict(virtual_memory=20, cpu_time=1000, wallclock_time=500), rerunnable=True, accounting_id='frobozz', queue_name='debug', job_category='MPI') req = RAM.max_request(assembly) expected = dict(min_cpus=200, max_cpus=200, resource_limits=dict(virtual_memory=100, cpu_time=1000, wallclock_time=1000000)) logging.debug('req: %r', req) logging.debug('exp: %r', expected) self.assertEqual(req, expected) req = RAM.total_request(assembly) expected = dict(min_cpus=200, max_cpus=200, resource_limits=dict(virtual_memory=100, cpu_time=1120, wallclock_time=1000500), rerunnable=True, accounting_id='frobozz', queue_name='debug', job_category='MPI') logging.debug('req: %r', req) logging.debug('exp: %r', expected) self.assertEqual(req, expected) comp3.resources['accounting_id'] = 'xyzzy' assert_raises(self, 'RAM.total_request(assembly)', globals(), locals(), ValueError, "Incompatible settings for 'accounting_id':" " 'xyzzy' vs. 'frobozz'")
def test_nested_2Darray_simul_element_and_full_connection2(self): # Slightly different config top = Assembly() top.add('nest', Assembly()) top.nest.add('comp1', ArrayComp2D()) top.nest.add('comp2', ArrayComp2D()) top.driver.gradient_options.lin_solver = 'petsc_ksp' top.nest.driver.gradient_options.lin_solver = 'petsc_ksp' top.nest.driver.workflow.add(['comp1', 'comp2']) top.nest.connect('comp1.y', 'comp2.x') top.nest.create_passthrough('comp1.x') top.nest.create_passthrough('comp1.y') top.nest.add('yy', Array(iotype='out')) top.nest.connect('comp2.y', 'yy') top.add('driver', SimpleDriver()) top.driver.workflow.add(['nest']) top.driver.add_parameter('nest.x[0][0]', low=-10, high=10) top.driver.add_objective('nest.yy[0][0]') top.driver.add_constraint('nest.y[0][1] < 0') top.run() J = top.driver.calc_gradient(mode='forward') assert_rel_error(self, J[0, 0], 24.0, .000001) assert_rel_error(self, J[1, 0], 4.0, .000001) J = top.driver.calc_gradient(mode='adjoint') assert_rel_error(self, J[0, 0], 24.0, .000001) assert_rel_error(self, J[1, 0], 4.0, .000001) J = top.driver.calc_gradient(mode='fd') assert_rel_error(self, J[0, 0], 24.0, .000001) assert_rel_error(self, J[1, 0], 4.0, .000001)
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.0, high=10.0, 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_super_simple_backward(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] model.driver.distribution_generator.form = "BACKWARD" 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' ], 0.8, places = 6 ) self.assertAlmostEqual( results.cases[1][ 'driven.y' ], 1.6, places = 6 ) self.assertAlmostEqual( results.cases[2][ 'driven.x' ], 0.9, places = 6 ) self.assertAlmostEqual( results.cases[2][ 'driven.y' ], 1.8, places = 6 )
class GeomTestCase(unittest.TestCase): def setUp(self): """this setup function will be called before each test in this class""" self.top = Assembly() self.top.add('g1', GeoSource()) self.top.add('g2', GeoSink()) self.top.connect('g1.g_out', 'g2.g_inp') self.top.driver.workflow.add(['g1', 'g2']) def tearDown(self): """this teardown function will be called after each test""" self.top = None def testGeom(self): self.top.run() self.assertEqual(1, self.top.g2.g_inp.get_tessellation()) try: self.top.g2.g_extra = "hey" except TypeError as err: msg = "g2 (1-g2): object g_extra of type <type 'str'> must provide interface 'IStaticGeometry'" self.assertEqual(str(err), msg) else: self.fail("exception expected")
def _create_assembly(self, dbname): asm = Assembly() driver = asm.add('driver', SimpleCaseIterDriver()) asm.add('comp1', ExecComp(exprs=['z=x+y'])) asm.add('comp2', ExecComp(exprs=['z=x+y'])) asm.connect('comp1.z', 'comp2.x') driver.workflow.add(['comp1', 'comp2']) driver.recorder = DBCaseRecorder(dbname, append=True) return asm
def _create_assembly(self, dbname, drivertype): asm = Assembly() driver = asm.add("driver", drivertype()) asm.add("comp1", ExecComp(exprs=["z=x+y"])) asm.add("comp2", ExecComp(exprs=["z=x+y"])) asm.connect("comp1.z", "comp2.x") driver.workflow.add(["comp1", "comp2"]) driver.recorders = [DBCaseRecorder(dbname, append=True)] return asm
def _create_assembly(self, dbname, drivertype): asm = Assembly() driver = asm.add('driver', drivertype()) asm.add('comp1', TracedExecComp(exprs=['z=x+y'])) asm.add('comp2', TracedExecComp(exprs=['z=x+y'])) asm.connect('comp1.z', 'comp2.x') driver.workflow.add(['comp1', 'comp2']) asm.recorders = [DBCaseRecorder(dbname, append=True)] return asm
def _create_assembly(self, dbname, drivertype): asm = Assembly() driver = asm.add('driver', drivertype()) asm.add('comp1', ExecComp(exprs=['z=x+y'])) asm.add('comp2', ExecComp(exprs=['z=x+y'])) asm.connect('comp1.z', 'comp2.x') driver.workflow.add(['comp1', 'comp2']) driver.recorders = [DBCaseRecorder(dbname, append=True)] return asm
def test_smart_low_high_array_param(self): top = Assembly() top.add('paraboloid', ArrayParaboloid()) driver = top.add('driver', SimpleDriver()) driver.add_objective('paraboloid.f_x') driver.add_parameter('paraboloid.x', low=[-100, -99], high=[100, 99]) driver.workflow.add('paraboloid') top.run() J = top.driver.calc_gradient()
def test_smart_low_high_array_param(self): top = Assembly() top.add('paraboloid', ArrayParaboloid()) driver = top.add('driver', SimpleDriver()) driver.add_objective('paraboloid.f_x') driver.add_parameter('paraboloid.x', low=[-100, -99], high=[100, 99]) driver.workflow.add('paraboloid') top.run() J = top.driver.workflow.calc_gradient()
def test_set_recursive(self): asm = Assembly() asm.add('defcomp', MyDefComp()) asm.add('nodefcomp', MyNoDefComp()) self.assertEqual(0., asm.nodefcomp.f_in) self.assertEqual(3.14, asm.defcomp.f_in) asm.nodefcomp.f_in = 99 asm.defcomp.f_in = 99 asm.revert_to_defaults() self.assertEqual(0., asm.nodefcomp.f_in) self.assertEqual(3.14, asm.defcomp.f_in)
def test_scaler_array_expression(self): model = Assembly() model.add('sub', SubAsmb()) model.driver.workflow.add('sub') model.run() J = model.driver.workflow.calc_gradient(inputs=['sub.x', 'sub.y'], outputs=['sub.z']) assert_rel_error(self, J[0, 0], 10.0, .001) assert_rel_error(self, J[0, 1], 10.0, .001) assert_rel_error(self, J[0, 2], 20.0, .001)
def test_multiconnect(self): top = Assembly() for name in ("m1", "m2", "m3"): top.add(name, Multiplier()) top.driver.workflow.add(name) top.connect("m1.rval_out", ("m2.mult", "m3.mult")) top.m1.rval_in = 1.0 top.m2.rval_in = 3.0 top.m3.rval_in = 4.0 top.run() self.assertEqual(top.m2.rval_out, 4.5) self.assertEqual(top.m3.rval_out, 6.0)
def test_multiconnect(self): top = Assembly() for name in ('m1', 'm2', 'm3'): top.add(name, Multiplier()) top.driver.workflow.add(name) top.connect('m1.rval_out', ('m2.mult', 'm3.mult')) top.m1.rval_in = 1. top.m2.rval_in = 3. top.m3.rval_in = 4. top.run() self.assertEqual(top.m2.rval_out, 4.5) self.assertEqual(top.m3.rval_out, 6.)
def test_scaler_array_expression(self): model = Assembly() model.add('sub', SubAsmb()) model.driver.workflow.add('sub') model.run() J = model.driver.workflow.calc_gradient(inputs=['sub.x', 'sub.y'], outputs=['sub.z']) assert_rel_error(self, J[0,0], 10.0, .001) assert_rel_error(self, J[0,1], 10.0, .001) assert_rel_error(self, J[0,2], 20.0, .001)
def test_invalid_input(self): model = Assembly() model.add("driver", DistributionCaseDriver()) model.add("driven", SimpleComponent()) model.driver.workflow.add("driven") model.driver.distribution_generator = FiniteDifferenceGenerator(model.driver) try: model.driver.add_parameter("driven.invalid", low=-10.0, high=10.0, fd_step=0.1) except AttributeError as err: self.assertEqual(str(err), "driver: Can't add parameter 'driven.invalid' because it doesn't exist.")
def test_connections(self): asm = Assembly() asm.add('dummy1',Dummy()) asm.add('dummy2',Dummy()) asm.add('bcast',Broadcaster(['x'])) asm.connect('dummy1.x','bcast.x_in') asm.connect('bcast.x','dummy2.y') self.assertEqual(set(asm.list_connections()),set([('dummy1.x', 'bcast.x_in'), ('bcast.x', 'dummy2.y')])) asm.bcast.names = ['z'] self.assertEqual(asm.list_connections(),[])
def test_scid(self): # Record tree of cases via SimpleCaseIterDriver. top = Assembly() top.recorders = [ListCaseRecorder()] top.add('driver2', SCIDriver(3, 'comp2')) top.add('comp2', CaseComponent()) top.driver2.workflow.add('comp2') top.add('driver1', SCIDriver(2, 'comp1')) top.add('comp1', CaseComponent()) top.driver1.workflow.add(['comp1', 'driver2']) top.driver.workflow.add('driver1') top.run() print print 'Forest:' roots = CaseTreeNode.sort(top.recorders[0].get_iterator()) for root in roots: root.dump(1) print print 'Iternames:' for root in roots: for name in root.iternames(): print ' ', name expected = [ '1', '1-1.1', '1-1.1-2.1', '1-1.1-2.2', '1-1.1-2.3', '1-1.2', '1-1.2-2.1', '1-1.2-2.2', '1-1.2-2.3' ] for i, name in enumerate(roots[0].iternames()): self.assertEqual(name, expected[i])
def test_invalid_input(self): model = Assembly() model.add('driver', DistributionCaseDriver()) model.add('driven', SimpleComponent()) model.driver.workflow.add('driven') model.driver.distribution_generator = FiniteDifferenceGenerator(model.driver) try: model.driver.add_parameter("driven.invalid", low=-10., high=10., fd_step = 0.1 ) except AttributeError as err: self.assertEqual(str(err), "driver: Can't add parameter 'driven.invalid' because it doesn't exist.")
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) try: model.driver.add_response('driven.invalid') except ValueError as err: self.assertEqual(str(err), "driver: Can't add response " "'driven.invalid' because of invalid variables" " 'driven.invalid'") else: self.fail('Expected ValueError')
def test_comp_error(self): a = Assembly() a.add('m', MetaModel()) a.m.surrogate = {'default': KrigingSurrogate()} a.m.model = DummyError() a.m.train_next = True a.driver.workflow.add('m') try: a.run() except RuntimeError as err: self.assertEqual("m.model: Test Error", str(err)) else: self.fail("RuntimeError expected")
def test_basic_delegation(self): top = Assembly() top.add('geo', GeomComponent()) # Function not there before we slot self.assertTrue(not hasattr(top.geo, 'apply_deriv')) self.assertTrue(not hasattr(top.geo, 'apply_derivT')) self.assertTrue(not hasattr(top.geo, 'provideJ')) top.geo.add('parametric_geometry', GeoWithDerivatives()) # Now they should be there. self.assertTrue(hasattr(top.geo, 'apply_deriv')) self.assertTrue(hasattr(top.geo, 'apply_derivT')) self.assertTrue(hasattr(top.geo, 'provideJ'))
def test_comp_error(self): a = Assembly() a.add('m',MetaModel()) a.m.default_surrogate = KrigingSurrogate() a.m.model = DummyError() a.m.train_next = True a.driver.workflow.add('m') try: a.run() except RuntimeError as err: self.assertEqual("m.model: Test Error",str(err)) else: self.fail("RuntimeError expected")
def test_vtree(self): top = Assembly() sub = top.add('sub', Assembly()) sub.add('comp', LoadsComp()) sub.driver.workflow.add('comp') sub.create_passthrough('comp.loads_in') sub.create_passthrough('comp.loads_out') top.driver.workflow.add('sub') sout = StringIO() top.recorders = [JSONCaseRecorder(sout)] loads = Loads() loads.Fx = [1, 2, 3] loads.Fy = [4, 5, 6] loads.Fz = [7, 8, 9] arr = LoadsArray() arr.loads = [loads] top.sub.loads_in = arr top.run() # with open('vtree.new', 'w') as out: # out.write(sout.getvalue()) self.verify(sout, 'vtree.json')
def test_vtree(self): top = Assembly() sub = top.add('sub', Assembly()) sub.add('comp', LoadsComp()) sub.driver.workflow.add('comp') sub.create_passthrough('comp.loads_in') sub.create_passthrough('comp.loads_out') top.driver.workflow.add('sub') jsonfile = os.path.join(self.tempdir, 'test_vtree.json') old_json_file = os.path.join(os.path.dirname(__file__), 'vtree.json') top.recorders = [JSONCaseRecorder(jsonfile)] loads = Loads() loads.Fx = [1, 2, 3] loads.Fy = [4, 5, 6] loads.Fz = [7, 8, 9] arr = LoadsArray() arr.loads = [loads] top.sub.loads_in = arr top.run() cdsnew = CaseDataset(jsonfile, 'json') cdsold = CaseDataset(old_json_file, 'json') cdsold.data.vars('sub.comp.loads_out').fetch( )[0][0]['loads'][0]['Fx'] == cdsnew.data.vars( 'sub.comp.loads_out').fetch()[0][0]['loads'][0]['Fx'] cdsold.data.vars('sub.comp.loads_out').fetch( )[1][0]['loads'][0]['Fz'] == cdsnew.data.vars( 'sub.comp.loads_out').fetch()[1][0]['loads'][0]['Fz']
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.add_response('driven.y') model.driver.add_parameter("driven.x", low=-10., high=10., fd_step=0.1) 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_vtree(self): top = Assembly() sub = top.add('sub', Assembly()) sub.add('comp', LoadsComp()) sub.driver.workflow.add('comp') sub.create_passthrough('comp.loads_in') sub.create_passthrough('comp.loads_out') top.driver.workflow.add('sub') jsonfile = os.path.join(self.tempdir, 'test_vtree.json') old_json_file = os.path.join(os.path.dirname(__file__), 'vtree.json') top.recorders = [JSONCaseRecorder(jsonfile)] loads = Loads() loads.Fx = [1, 2, 3] loads.Fy = [4, 5, 6] loads.Fz = [7, 8, 9] arr = LoadsArray() arr.loads = [loads] top.sub.loads_in = arr top.run() cdsnew = CaseDataset(jsonfile, 'json') cdsold = CaseDataset(old_json_file, 'json') cdsold.data.vars('sub.comp.loads_out').fetch()[0][0]['loads'][0]['Fx'] == cdsnew.data.vars('sub.comp.loads_out').fetch()[0][0]['loads'][0]['Fx'] cdsold.data.vars('sub.comp.loads_out').fetch()[1][0]['loads'][0]['Fz'] == cdsnew.data.vars('sub.comp.loads_out').fetch()[1][0]['loads'][0]['Fz']
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.add_response('driven.y') model.driver.add_parameter("driven.x", low=-10., high=10., fd_step=0.1) 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) try: model.driver.add_response('driven.invalid') except ValueError as err: self.assertEqual( str(err), "driver: Can't add response " "'driven.invalid' because of invalid variables" " 'driven.invalid'") else: self.fail('Expected ValueError')
def test_workflow_itername(self): # top # comp1 # driverA # comp1 # comp2 # driverB # comp2 # subassy # comp3 top = Assembly() top.add('comp1', Basic_Component()) top.add('driverA', Run_N(4)) top.add('comp2', Basic_Component()) top.add('driverB', Run_N(3)) sub = top.add('subassy', Assembly()) sout_sub = StringIO.StringIO() sub.driver.recorders = [DumpCaseRecorder(sout_sub)] sub.add('comp3', Basic_Component()) sub.driver.workflow.add('comp3') top.driver.workflow.add(('comp1', 'driverA', 'driverB')) sout = StringIO.StringIO() top.driver.recorders = [DumpCaseRecorder(sout)] top.driverA.workflow.add(('comp1', 'comp2')) soutA = StringIO.StringIO() top.driverA.recorders = [DumpCaseRecorder(soutA)] top.driverB.workflow.add(('comp2', 'subassy')) soutB = StringIO.StringIO() top.driverB.recorders = [DumpCaseRecorder(soutB)] top.run() lines = [l.strip() for l in sout.getvalue().split('\n') if 'itername' in l] linesA = [l.strip() for l in soutA.getvalue().split('\n') if 'itername' in l] linesB = [l.strip() for l in soutB.getvalue().split('\n') if 'itername' in l] lines_sub = [l.strip() for l in sout_sub.getvalue().split('\n') if 'itername' in l] self.assertEqual(lines, ['driver.workflow.itername: 1']) self.assertEqual(linesA, ['driverA.workflow.itername: 1-1.1', 'driverA.workflow.itername: 1-1.2', 'driverA.workflow.itername: 1-1.3', 'driverA.workflow.itername: 1-1.4', 'driverA.workflow.itername: 1-1.5']) self.assertEqual(linesB, ['driverB.workflow.itername: 1-2.1', 'driverB.workflow.itername: 1-2.2', 'driverB.workflow.itername: 1-2.3', 'driverB.workflow.itername: 1-2.4']) self.assertEqual(lines_sub, ['driver.workflow.itername: 1-2.1-2.1'])
def test_workflow_itername(self): # top # comp1 # driverA # comp1 # comp2 # driverB # comp2 # subassy # comp3 top = Assembly() top.add('comp1', Basic_Component()) top.add('driverA', Run_N(4)) top.add('comp2', Basic_Component()) top.add('driverB', Run_N(3)) sub = top.add('subassy', Assembly()) sub.add('comp3', Basic_Component()) sub.driver.workflow.add('comp3') top.driver.workflow.add(('comp1', 'driverA', 'driverB')) sout = StringIO.StringIO() top.recorders = [DumpCaseRecorder(sout)] top.driverA.workflow.add(('comp1', 'comp2')) top.driverB.workflow.add(('comp2', 'subassy')) top.run() expected = [ 'driverA.workflow.itername: 1-driverA.1', 'driverA.workflow.itername: 1-driverA.2', 'driverA.workflow.itername: 1-driverA.3', 'driverA.workflow.itername: 1-driverA.4', 'driverA.workflow.itername: 1-driverA.5', 'subassy.driver.workflow.itername: 1-driverB.1-subassy.1', 'driverB.workflow.itername: 1-driverB.1', 'subassy.driver.workflow.itername: 1-driverB.2-subassy.1', 'driverB.workflow.itername: 1-driverB.2', 'subassy.driver.workflow.itername: 1-driverB.3-subassy.1', 'driverB.workflow.itername: 1-driverB.3', 'subassy.driver.workflow.itername: 1-driverB.4-subassy.1', 'driverB.workflow.itername: 1-driverB.4', 'driver.workflow.itername: 1' ] lines = [ l.strip() for l in sout.getvalue().split('\n') if 'workflow.itername' in l ] for i, line in enumerate(lines): self.assertEqual(line, expected[i])
def test_tracing(self): # Check tracing of iteration coordinates. top = Assembly() comp = top.add('comp1', Dummy()) top.add('driverA', Driver()) comp = top.add('comp2', Dummy()) top.add('driverB', Driver()) sub = top.add('subassy', Assembly()) comp = sub.add('comp3', Dummy()) sub.driver.workflow.add('comp3') top.driver.workflow = SequentialWorkflow() top.driver.workflow.add(('comp1', 'driverA', 'driverB')) top.driverA.workflow.add(('comp1', 'comp2')) top.driverB.workflow.add(('comp2', 'subassy')) trace_out = cStringIO.StringIO() enable_trace(trace_out) top.run() expected = """\ 1-comp1 1-driverA.1-comp1 1-driverA.1-comp2 1-driverB.1-comp2 1-driverB.1-subassy.1-comp3 """ self.assertEqual(trace_out.getvalue(), expected) disable_trace() top.run() self.assertEqual(trace_out.getvalue(), expected)
def test_scid2(self): logging.debug('') logging.debug('test_simplecid') top = Assembly() top.add('generator', Generator()) cid = top.add('cid', SimpleCaseIterDriver()) top.add('driven', DrivenComponent()) top.add('verifier', Verifier()) top.driver.workflow.add(('generator', 'cid', 'verifier')) cid.workflow.add('driven') cid.add_parameter('driven.x') cid.add_parameter('driven.y') cid.add_response('driven.rosen_suzuki') cid.add_response('driven.sum_y') top.connect('generator.x', 'cid.case_inputs.driven.x') top.connect('generator.y', 'cid.case_inputs.driven.y') top.connect('generator.x', 'verifier.x') top.connect('generator.y', 'verifier.y') top.connect('cid.case_outputs.driven.rosen_suzuki', 'verifier.rosen_suzuki') top.connect('cid.case_outputs.driven.sum_y', 'verifier.sum_y') top.run()
def test_casetree(self): # Record tree of cases via workflow. top = Assembly() top.recorders = [DumbRecorder()] top.add('driver2', CaseDriver(3)) top.add('comp2', CaseComponent()) top.driver2.workflow.add('comp2') top.driver2.add_parameter('comp2.x', low=0, high=10) top.driver2.add_objective('comp2.y') top.add('driver1', CaseDriver(2)) top.add('comp1', CaseComponent()) top.driver1.add_parameter('comp1.x', low=0, high=10) top.driver1.add_objective('comp1.y') top.driver1.workflow.add(['comp1', 'driver2']) top.driver.workflow.add('driver1') top.run() print print 'Forest:' roots = CaseTreeNode.sort(top.recorders[0].get_iterator()) for root in roots: root.dump(1) print print 'Iternames:' for root in roots: for name in root.iternames(): print ' ', name expected = [ '1', '1-driver1.1', '1-driver1.1-driver2.1', '1-driver1.1-driver2.2', '1-driver1.1-driver2.3', '1-driver1.2', '1-driver1.2-driver2.1', '1-driver1.2-driver2.2', '1-driver1.2-driver2.3' ] for i, name in enumerate(roots[0].iternames()): self.assertEqual(name, expected[i])
def test_remove(self): top = Assembly() g = top._depgraph.component_graph() comps = [name for name in g] self.assertEqual(comps, ['driver']) top.add('comp', Component()) g = top._depgraph.component_graph() comps = [name for name in g] self.assertEqual(set(comps), set(['driver', 'comp'])) top.remove('comp') g = top._depgraph.component_graph() comps = [name for name in g] self.assertEqual(comps, ['driver'])
def test_remove(self): top = Assembly() g = top._depgraph.component_graph() comps = [name for name in g] self.assertEqual(comps, ["driver"]) top.add("comp", Component()) g = top._depgraph.component_graph() comps = [name for name in g] self.assertEqual(set(comps), set(["driver", "comp"])) top.remove("comp") g = top._depgraph.component_graph() comps = [name for name in g] self.assertEqual(comps, ["driver"])
def test_workflow_itername(self): # top # comp1 # driverA # comp1 # comp2 # driverB # comp2 # subassy # comp3 top = Assembly() top.add('comp1', Basic_Component()) top.add('driverA', Run_N(4)) top.add('comp2', Basic_Component()) top.add('driverB', Run_N(3)) sub = top.add('subassy', Assembly()) sub.add('comp3', Basic_Component()) sub.driver.workflow.add('comp3') top.driver.workflow.add(('comp1', 'driverA', 'driverB')) sout = StringIO.StringIO() top.recorders = [DumpCaseRecorder(sout)] top.driverA.workflow.add(('comp1', 'comp2')) top.driverB.workflow.add(('comp2', 'subassy')) top.run() expected = [ 'driverA.workflow.itername: 1-driverA.1', 'driverA.workflow.itername: 1-driverA.2', 'driverA.workflow.itername: 1-driverA.3', 'driverA.workflow.itername: 1-driverA.4', 'driverA.workflow.itername: 1-driverA.5', 'subassy.driver.workflow.itername: 1-driverB.1-subassy.1', 'driverB.workflow.itername: 1-driverB.1', 'subassy.driver.workflow.itername: 1-driverB.2-subassy.1', 'driverB.workflow.itername: 1-driverB.2', 'subassy.driver.workflow.itername: 1-driverB.3-subassy.1', 'driverB.workflow.itername: 1-driverB.3', 'subassy.driver.workflow.itername: 1-driverB.4-subassy.1', 'driverB.workflow.itername: 1-driverB.4', 'driver.workflow.itername: 1' ] lines = [l.strip() for l in sout.getvalue().split('\n') if 'workflow.itername' in l] for i, line in enumerate(lines): self.assertEqual(line, expected[i])
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_circular_dependency(self): self.asm.connect('comp1.rout', 'comp2.r') # Cyclic graphs are permitted in declaration. self.asm.connect('comp2.rout', 'comp1.r') # Unconnected added twice shouldn't cause exception. asm = Assembly() asm.add('a', Simple()) asm.add('b', Simple()) dup1 = asm.add('dup1', Simple()) dup2 = asm.add('dup2', Simple()) self.assertEqual(dup1.exec_count, 0) self.assertEqual(dup2.exec_count, 0) sequence = ['dup1', 'a', 'dup2', 'dup1', 'b', 'dup1', 'dup2'] asm.driver.workflow.add(sequence) self.assertEqual([comp.name for comp in asm.driver.workflow], sequence) asm.run() self.assertEqual(dup1.exec_count, 3) self.assertEqual(dup2.exec_count, 2) asm = Assembly() asm.add('a', Simple()) asm.add('b', Simple()) dup1 = asm.add('dup1', Simple()) dup2 = asm.add('dup2', Simple()) self.assertEqual(dup1.exec_count, 0) self.assertEqual(dup2.exec_count, 0) sequence = ['dup1', 'a', 'dup2', 'dup1', 'b', 'dup1', 'dup2'] asm.driver.workflow.add(sequence) self.assertEqual([comp.name for comp in asm.driver.workflow], sequence) asm.run() self.assertEqual(dup1.exec_count, 3) self.assertEqual(dup2.exec_count, 2)
def test_smart_low_high(self): top = Assembly() top.add('comp', MyComp()) driver = top.add('driver', SimpleDriver()) top.comp.add('x1', Float(1.0, iotype='in', low=-1.0, high=1.0)) driver.add_objective('comp.y') driver.add_parameter('comp.x1', low=-1.0, high=1.0) driver.workflow.add('comp') top.driver.gradient_options.fd_form = 'central' top.driver.gradient_options.fd_step = 0.1 top.comp.x1 = -0.95 top.run() J = top.driver.workflow.calc_gradient() assert_rel_error(self, J[0, 0], -3.6, 0.001) top.comp.x1 = 0.95 top.run() J = top.driver.workflow.calc_gradient() assert_rel_error(self, J[0, 0], 3.6, 0.001)
def test_circular_dependency(self): self.asm.connect('comp1.rout', 'comp2.r') # Cyclic graphs are permitted in declaration. self.asm.connect('comp2.rout', 'comp1.r') # duplicate entries in workflow should cause exception. asm = Assembly() asm.add('a', Simple()) asm.add('b', Simple()) dup1 = asm.add('dup1', Simple()) dup2 = asm.add('dup2', Simple()) self.assertEqual(dup1.exec_count, 0) self.assertEqual(dup2.exec_count, 0) sequence = ['dup1', 'a', 'dup2', 'dup1', 'b', 'dup1', 'dup2'] asm.driver.workflow.add(sequence) try: asm.run() except RuntimeError as err: self.assertEqual(str(err), "driver workflow has duplicate entries: ['dup1', 'dup2']")
def test_mimic(self): # Ensure we can mimic a driver. top = Assembly() top.add('c1', Component()) top.add('c2', Component()) top.driver.workflow.add(('c1', 'c2')) top.driver.printvars = ['c1.force_execute', 'c2.force_execute'] recorder1 = FakeRecorder() recorder2 = FakeRecorder() top.driver.recorders = [recorder1, recorder2] workflow_id = id(top.driver.workflow) new_driver = Driver() new_id = id(new_driver) self.assertNotEqual(new_id, id(top.driver)) top.replace('driver', new_driver) self.assertEqual(new_id, id(top.driver)) self.assertEqual(workflow_id, id(top.driver.workflow)) self.assertEqual(top.driver.printvars, ['c1.force_execute', 'c2.force_execute']) self.assertEqual(top.driver.recorders, [recorder1, recorder2])