def configure(self):

        driver = self.add('driver', FixedPointIterator())
        adapt = self.add('adapt', AdaptiveSampleDriver())
        ei_opt = self.add('ei_opt', Genetic())

        branin = self.add('branin', BraninComponent())

        kwargs = {'params': ("x", "y"), 'responses': ('f_xy', )}

        meta = self.add('meta', MetaModel(**kwargs))
        meta.default_surrogate = KrigingSurrogate()
        pareto = self.add('pareto', ParetoFilter(**kwargs))

        ei = self.add('ei', ExpectedImprovement())

        #initial training DOE
        adapt.DOEgenerator = OptLatinHypercube(num_samples=15)
        #adapt.DOEgenerator = Uniform(100)
        adapt.add_parameter('branin.x', low=-5, high=10)
        adapt.add_parameter('branin.y', low=0, high=15)
        adapt.add_response('branin.f_xy')

        #pass training data from sampler to metamodel and pareto filter
        self.connect('adapt.all_case_inputs.branin.x',
                     ['meta.params.x', 'pareto.params.x'])
        self.connect('adapt.all_case_inputs.branin.y',
                     ['meta.params.y', 'pareto.params.y'])
        self.connect('adapt.all_case_outputs.branin.f_xy',
                     ['meta.responses.f_xy', 'pareto.responses.f_xy'])

        #connect meta and pareto to ei
        self.connect('meta.f_xy',
                     'ei.current')  #this passes a normal distribution variable
        self.connect(
            'pareto.pareto_outputs[0, 0]', 'ei.target'
        )  #for single objective, frontier is just a scalar value that is the minimum of the set

        #EI optimization to find next point
        ei_opt.opt_type = "maximize"
        ei_opt.population_size = 100
        ei_opt.generations = 10
        ei_opt.add_parameter('meta.x', low=-5, high=10)
        ei_opt.add_parameter('meta.y', low=0, high=15)
        ei_opt.add_objective('ei.PI')  #could use ei.EI too

        #Iterative sampling process
        driver.add_parameter('adapt.adaptive_inputs.branin.x[0]')
        driver.add_parameter('adapt.adaptive_inputs.branin.y[0]')
        driver.add_constraint('adapt.adaptive_inputs.branin.x[0] = meta.x')
        driver.add_constraint('adapt.adaptive_inputs.branin.y[0] = meta.y')
        driver.max_iterations = 30

        #Iteration Heirarchy
        driver.workflow.add(['adapt', 'pareto', 'ei_opt'])
        adapt.workflow.add(['branin'])
        ei_opt.workflow.add(['meta', 'ei'])

        #FPI now support stop conditions
        driver.add_stop_condition('ei.EI <= .0001')
    def configure(self):
        driver = self.add('driver', FixedPointIterator())
        adapt = self.add('adapt', AdaptiveSampleDriver())
        MOEI_opt = self.add('MOEI_opt', Genetic())

        self.add('spiral', SpiralComponent())

        kwargs = {'params': ("x", "y"), 'responses': ('f1_xy', 'f2_xy')}

        meta = self.add('meta', MetaModel(**kwargs))
        meta.default_surrogate = KrigingSurrogate()
        self.add('pareto', ParetoFilter(**kwargs))

        self.add('MOEI', MultiObjExpectedImprovement())

        # initial training DOE
        adapt.DOEgenerator = OptLatinHypercube(num_samples=25)
        adapt.add_parameter('spiral.x')
        adapt.add_parameter('spiral.y')
        adapt.add_response('spiral.f1_xy')
        adapt.add_response('spiral.f2_xy')

        # pass training data from sampler to metamodel and pareto filter
        self.connect('adapt.all_case_inputs.spiral.x',
                     ['meta.params.x', 'pareto.params.x'])
        self.connect('adapt.all_case_inputs.spiral.y',
                     ['meta.params.y', 'pareto.params.y'])
        self.connect('adapt.all_case_outputs.spiral.f1_xy',
                     ['meta.responses.f1_xy', 'pareto.responses.f1_xy'])
        self.connect('adapt.all_case_outputs.spiral.f2_xy',
                     ['meta.responses.f2_xy', 'pareto.responses.f2_xy'])

        # connect meta and pareto to ei
        self.connect('[meta.f1_xy, meta.f2_xy]', 'MOEI.current')
        self.connect('pareto.pareto_outputs', 'MOEI.target')

        # MOEI optimization to find next point
        MOEI_opt.opt_type = "maximize"
        MOEI_opt.population_size = 100
        MOEI_opt.generations = 10
        # MOEI_opt.selection_method = "tournament"
        MOEI_opt.add_parameter("meta.x", low=0.75, high=5. * pi)
        MOEI_opt.add_parameter("meta.y", low=0.75, high=5. * pi)
        MOEI_opt.add_objective("MOEI.PI")

        # Iterative sampling process
        driver.add_parameter('adapt.adaptive_inputs.spiral.x[0]')
        driver.add_parameter('adapt.adaptive_inputs.spiral.y[0]')
        driver.add_constraint('adapt.adaptive_inputs.spiral.x[0] = meta.x')
        driver.add_constraint('adapt.adaptive_inputs.spiral.y[0] = meta.y')
        driver.max_iterations = 30

        # Iteration Heirarchy
        driver.workflow.add(['adapt', 'pareto', 'MOEI_opt'])
        adapt.workflow.add(['spiral'])
        MOEI_opt.workflow.add(['meta', 'MOEI'])

        # FPI now support stop conditions
        driver.add_stop_condition('MOEI.PI <= .0001')
Ejemplo n.º 3
0
    def configure(self):
        self.add('driver', IterateUntil())
        self.add('adaptive', AdaptiveSampleDriver())
        self.add('driven', DrivenComponent())
        self.driver.workflow.add('adaptive')
        self.adaptive.workflow.add('driven')
        self.adaptive.DOEgenerator = FullFactorial()
        self.adaptive.DOEgenerator.num_levels = 2
        self.adaptive.add_parameter('driven.x', low=-10., high=10.)
        self.adaptive.add_response('driven.y')

        self.adaptive.record_doe = False