Source code for openmdao.drivers.fullfactorial_driver

"""
OpenMDAO design-of-experiments driver implementing the Full Factorial method.
"""

from collections import OrderedDict
import itertools
from six import iteritems
from six.moves import zip

import numpy as np

from openmdao.drivers.predeterminedruns_driver import PredeterminedRunsDriver


[docs]class FullFactorialDriver(PredeterminedRunsDriver): """Design-of-experiments Driver implementing the Full Factorial method. Args ---- num_levels : int, optional The number of evenly spaced levels between each design variable lower and upper bound. Defaults to 1. num_par_doe : int, optional The number of DOE cases to run concurrently. Defaults to 1. load_balance : bool, Optional If True, use rank 0 as master and load balance cases among all of the other ranks. Defaults to False. """ def __init__(self, num_levels=1, num_par_doe=1, load_balance=False): super(FullFactorialDriver, self).__init__(num_par_doe=num_par_doe, load_balance=load_balance) self.num_levels = num_levels def _build_runlist(self): value_arrays = OrderedDict() for name, meta in iteritems(self.get_desvar_metadata()): value_arrays[name] = [] # Support for array desvars val = self.root.unknowns._dat[name].val nval = meta['size'] for k in range(nval): low = meta['lower'] high = meta['upper'] if isinstance(low, np.ndarray): low = low[k] if isinstance(high, np.ndarray): high = high[k] value_arrays[name].append(np.linspace(low, high, num=self.num_levels).tolist()) keys = list(value_arrays.keys()) for name in keys: value_arrays[name] = [np.array(x) for x in itertools.product(*value_arrays[name])] for combination in itertools.product(*value_arrays.values()): yield zip(keys, combination)