Skip to content

Commit

Permalink
Merge 615d596 into 8f9558c
Browse files Browse the repository at this point in the history
  • Loading branch information
Kenneth-T-Moore committed Jun 8, 2020
2 parents 8f9558c + 615d596 commit 0b47b87
Show file tree
Hide file tree
Showing 3 changed files with 128 additions and 1 deletion.
7 changes: 6 additions & 1 deletion openmdao/drivers/genetic_algorithm_driver.py
Original file line number Diff line number Diff line change
Expand Up @@ -389,7 +389,12 @@ def objective_callback(self, x, icase):
nr_objectives = len(objs)

# Single objective, if there is only one objective, which has only one element
is_single_objective = (nr_objectives == 1) and (len(objs) == 1)
if nr_objectives > 1:
is_single_objective = False
else:
for obj in objs.items():
break
is_single_objective = len(obj) == 1

obj_exponent = self.options['multi_obj_exponent']
if self.options['multi_obj_weights']: # not empty
Expand Down
85 changes: 85 additions & 0 deletions openmdao/drivers/tests/test_doe_driver.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import openmdao.api as om

from openmdao.test_suite.components.paraboloid import Paraboloid
from openmdao.test_suite.components.paraboloid_distributed import DistParab
from openmdao.test_suite.groups.parallel_groups import FanInGrouped

from openmdao.utils.assert_utils import assert_near_equal
Expand Down Expand Up @@ -1811,5 +1812,89 @@ def test_fan_in_grouped(self):
self.expect_text)


@unittest.skipUnless(MPI and PETScVector, "MPI and PETSc are required.")
class TestParallelDistribDOE(unittest.TestCase):

N_PROCS = 4

def setUp(self):
self.startdir = os.getcwd()
# Have to hard code the tempdir so that all procs run in the same place.
self.tempdir = 'TestParallelDistribDOE_one_dir_only'
try:
os.mkdir(self.tempdir)
except OSError:
pass
os.chdir(self.tempdir)

def tearDown(self):
os.chdir(self.startdir)
if MPI.COMM_WORLD.rank == 0:
try:
shutil.rmtree(self.tempdir)
except OSError:
pass

def test_doe_distributed_var(self):
size = 3

prob = om.Problem()
model = prob.model

ivc = om.IndepVarComp()
ivc.add_output('x', np.ones((size, )))
ivc.add_output('y', np.ones((size, )))
ivc.add_output('a', -3.0 + 0.6 * np.arange(size))

model.add_subsystem('p', ivc, promotes=['*'])
model.add_subsystem("parab", DistParab(arr_size=size, deriv_type='dense'), promotes=['*'])
model.add_subsystem('sum', om.ExecComp('f_sum = sum(f_xy)',
f_sum=np.ones((size, )),
f_xy=np.ones((size, ))),
promotes=['*'])

model.add_design_var('x', lower=-50.0, upper=50.0)
model.add_design_var('y', lower=-50.0, upper=50.0)
model.add_objective('f_xy')
model.add_objective('f_sum', index=-1)

prob.driver = om.DOEDriver(om.FullFactorialGenerator(levels=2))
prob.driver.options['run_parallel'] = True
prob.driver.options['procs_per_model'] = 2

prob.driver.add_recorder(om.SqliteRecorder("cases.sql"))

prob.setup()
prob.run_driver()
prob.cleanup()

# check recorded cases from each case file
rank = prob.comm.rank
if rank == 0:
filename0 = "cases.sql_0"
filename1 = "cases.sql_1"
values = []

cr = om.CaseReader(filename0)
cases = cr.list_cases('driver')
for case in cases:
outputs = cr.get_case(case).outputs
values.append(outputs)

cr = om.CaseReader(filename1)
cases = cr.list_cases('driver')
for case in cases:
outputs = cr.get_case(case).outputs
values.append(outputs)

# 2**6 cases
self.assertEqual(len(values), 64)
x_inputs = [list(val['x']) for val in values]
for n1 in [-50., 50.]:
for n2 in [-50., 50.]:
for n3 in [-50., 50.]:
self.assertEqual(x_inputs.count([n1, n2, n3]), 8)


if __name__ == "__main__":
unittest.main()
37 changes: 37 additions & 0 deletions openmdao/drivers/tests/test_genetic_algorithm_driver.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,10 @@
from openmdao.drivers.genetic_algorithm_driver import GeneticAlgorithm
from openmdao.test_suite.components.branin import Branin, BraninDiscrete
from openmdao.test_suite.components.paraboloid import Paraboloid
from openmdao.test_suite.components.paraboloid_distributed import DistParab
from openmdao.test_suite.components.sellar_feature import SellarMDA
from openmdao.test_suite.components.three_bar_truss import ThreeBarTruss

from openmdao.utils.assert_utils import assert_near_equal
from openmdao.utils.mpi import MPI

Expand Down Expand Up @@ -1167,6 +1169,41 @@ def test_proc_per_model(self):

prob.run_driver()

def test_distributed_obj(self):
size = 3
prob = om.Problem()
model = prob.model

ivc = om.IndepVarComp()
ivc.add_output('x', np.ones((size, )))
ivc.add_output('y', np.ones((size, )))
ivc.add_output('a', -3.0 + 0.6 * np.arange(size))

model.add_subsystem('p', ivc, promotes=['*'])
model.add_subsystem("parab", DistParab(arr_size=size, deriv_type='dense'),
promotes=['*'])
model.add_subsystem('sum', om.ExecComp('f_sum = sum(f_xy)',
f_sum=np.ones((size, )),
f_xy=np.ones((size, ))),
promotes=['*'])

model.add_design_var('x', lower=-50.0, upper=50.0)
model.add_design_var('y', lower=-50.0, upper=50.0)
model.add_objective('f_xy')

prob.driver = om.SimpleGADriver()
prob.driver.options['run_parallel'] = True
prob.driver.options['procs_per_model'] = 2
prob.driver.options['bits'] = {'x': 8, 'y': 8}
prob.driver.options['max_gen'] = 25
prob.driver.options['pop_size'] = 25

prob.setup()
prob.run_driver()

assert_near_equal(np.sum(prob.get_val('f_xy', get_remote=True))/3,
2.396642317057536, 1e-6)


class TestFeatureSimpleGA(unittest.TestCase):

Expand Down

0 comments on commit 0b47b87

Please sign in to comment.