Esempio n. 1
0
    def __call__(self, optimizer, options=None):
        """ Run optimization """
        system = self._system
        variables = self._variables

        opt_prob = OptProblem('Optimization', self.obj_func)
        for dv_name in variables['dv'].keys():
            dv_id = variables['dv'][dv_name]['ID']
            value = variables['dv'][dv_name]['value']
            lower = variables['dv'][dv_name]['lower']
            upper = variables['dv'][dv_name]['upper']
            size = system(dv_id).size
            opt_prob.addVarGroup(dv_name,
                                 size,
                                 value=value,
                                 lower=lower,
                                 upper=upper)
        opt_prob.finalizeDesignVariables()
        for func_name in variables['func'].keys():
            lower = variables['func'][func_name]['lower']
            upper = variables['func'][func_name]['upper']
            if lower is None and upper is None:
                opt_prob.addObj(func_name)
            else:
                opt_prob.addCon(func_name, lower=lower, upper=upper)

        if options is None:
            options = {}

        opt = Optimizer(optimizer, options=options)
        sol = opt(opt_prob, sens=self.sens_func)
        print sol
    def __call__(self, optimizer, options=None):
        """ Run optimization """
        system = self._system
        variables = self._variables

        opt_prob = OptProblem('Optimization', self.obj_func)
        for dv_name in variables['dv'].keys():
            dv_id = variables['dv'][dv_name]['ID']
            value = variables['dv'][dv_name]['value']
            lower = variables['dv'][dv_name]['lower']
            upper = variables['dv'][dv_name]['upper']
            size = system(dv_id).size
            opt_prob.addVarGroup(dv_name, size, value=value,
                                 lower=lower, upper=upper)
        opt_prob.finalizeDesignVariables()
        for func_name in variables['func'].keys():
            lower = variables['func'][func_name]['lower']
            upper = variables['func'][func_name]['upper']
            if lower is None and upper is None:
                opt_prob.addObj(func_name)
            else:
                opt_prob.addCon(func_name, lower=lower, upper=upper)

        if options is None:
            options = {}

        opt = Optimizer(optimizer, options=options)
        sol = opt(opt_prob, sens=self.sens_func)
        print sol
def large_sparse(optimizer="SNOPT", optOptions=None):
    opt_options = {} if optOptions is None else optOptions

    # Optimization Object
    optProb = Optimization("large and sparse", objfunc)

    # Design Variables
    optProb.addVar("x", lower=-100, upper=150, value=0)
    optProb.addVarGroup("y", N, lower=-10 - arange(N), upper=arange(N), value=0)
    optProb.addVarGroup("z", 2 * N, upper=arange(2 * N), lower=-100 - arange(2 * N), value=0)
    # Constraints
    optProb.addCon("con1", upper=100, wrt=["x"])
    optProb.addCon("con2", upper=100)
    optProb.addCon("con3", lower=4, wrt=["x", "z"])
    optProb.addConGroup(
        "lincon",
        N,
        lower=2 - 3 * arange(N),
        linear=True,
        wrt=["x", "y"],
        jac={"x": np.ones((N, 1)), "y": sparse.spdiags(np.ones(N), 0, N, N)},
    )
    optProb.addObj("obj")
    # Optimizer
    opt = OPT(optimizer, options=opt_options)
    optProb.printSparsity()

    return opt, optProb
Esempio n. 4
0
    def optimize(self, optName, tol, optOptions={}, storeHistory=False):
        # Optimization Object
        optProb = Optimization("large and sparse", objfunc)

        # Design Variables
        optProb.addVar("x", lower=-100, upper=150, value=0)
        optProb.addVarGroup("y", N, lower=-10 - arange(N), upper=arange(N), value=0)
        optProb.addVarGroup("z", 2 * N, upper=arange(2 * N), lower=-100 - arange(2 * N), value=0)

        # Constraints
        optProb.addCon("con1", upper=100, wrt=["x"])
        optProb.addCon("con2", upper=100)
        optProb.addCon("con3", lower=4, wrt=["x", "z"])
        optProb.addConGroup(
            "lincon",
            N,
            lower=2 - 3 * arange(N),
            linear=True,
            wrt=["x", "y"],
            jac={"x": np.ones((N, 1)), "y": sparse.spdiags(np.ones(N), 0, N, N)},
        )
        optProb.addObj("obj")

        # Optimizer
        try:
            opt = OPT(optName, options=optOptions)
        except Error:
            raise unittest.SkipTest("Optimizer not available:", optName)

        sol = opt(optProb, sens=sens)

        # Check Solution
        assert_allclose(sol.objectives["obj"].value, 10.0, atol=tol, rtol=tol)

        assert_allclose(sol.variables["x"][0].value, 2.0, atol=tol, rtol=tol)
Esempio n. 5
0
    def optimize(self, x0, alg='IPOPT', options={}):
        opt = {}
        opt.update(options)
        def objfun(xdict):
            x, fail = self.set_vars(xdict)
            funcs= {
                'obj': self.obj(x),
                'llcon': self.lifting_line_const(x),
                "wcon": self.enough_lift_const(x)
            }
            return funcs, fail
        optProb = Optimization('llOpt', objfun)
        ub = self.get_vars(self.bounds.ub, dic=True)
        lb = self.get_vars(self.bounds.lb, dic=True)
        x0 = self.get_vars(x0, dic=True)
        optProb.addVar('V', upper=ub['V'], lower=lb['V'], value=x0['V'])
        optProb.addVar('b', upper=ub['b'], lower=lb['b'], value=x0['b'])
        optProb.addVarGroup('c', self.N_th, upper=ub['c'], lower=lb['c'], value=x0['c'])
        optProb.addVarGroup('al', self.N_th, upper=ub['al'], lower=lb['al'], value=x0['al'])
        optProb.addVarGroup('A', self.N_A, upper=ub['A'], lower=lb['A'], value=x0['A'])
        optProb.addObj('obj')
        optProb.addConGroup('llcon', self.N_th, lower=0., upper=0.)
        optProb.addCon('wcon', lower=0., upper=0.)

        if alg== "IPOPT":
            opt = OPT(alg, options=options)
            sol = opt(optProb, sens='FD')
        else:
            raise NotImplementedError(f"No routine for algorithm {alg}")

        D = dict(
            al = [a.value for a in sol.variables['al']],
            c = [a.value for a in sol.variables['c']],
            A = [a.value for a in sol.variables['A']],
            b = sol.variables['b'][0].value,
            V = sol.variables['V'][0].value,
        )
        x = self.set_vars(D)[0]
        return x, sol
Esempio n. 6
0
    def optimize(self, optName, optOptions={}, storeHistory=False, places=5):
        # Optimization Object
        optProb = Optimization('large and sparse', objfunc)

        # Design Variables
        optProb.addVar('x', lower=-100, upper=150, value=0)
        optProb.addVarGroup('y',
                            N,
                            lower=-10 - arange(N),
                            upper=arange(N),
                            value=0)
        optProb.addVarGroup('z',
                            2 * N,
                            upper=arange(2 * N),
                            lower=-100 - arange(2 * N),
                            value=0)

        # Constraints
        optProb.addCon('con1', upper=100, wrt=['x'])
        optProb.addCon('con2', upper=100)
        optProb.addCon('con3', lower=4, wrt=['x', 'z'])
        optProb.addConGroup('lincon',
                            N,
                            lower=2 - 3 * arange(N),
                            linear=True,
                            wrt=['x', 'y'],
                            jac={
                                'x': numpy.ones((N, 1)),
                                'y': sparse.spdiags(numpy.ones(N), 0, N, N)
                            })
        optProb.addObj('obj')

        # Optimizer
        try:
            opt = OPT(optName, options=optOptions)
        except:
            raise unittest.SkipTest('Optimizer not available:', optName)

        sol = opt(optProb, sens=sens)

        # Check Solution
        self.assertAlmostEqual(sol.objectives['obj'].value,
                               10.0,
                               places=places)

        self.assertAlmostEqual(sol.variables['x'][0].value, 2.0, places=places)
Esempio n. 7
0
def large_sparse(optimizer='SNOPT', optOptions=None):
    opt_options = {} if optOptions is None else optOptions

    # Optimization Object
    optProb = Optimization('large and sparse', objfunc)

    # Design Variables
    optProb.addVar('x', lower=-100, upper=150, value=0)
    optProb.addVarGroup('y',
                        N,
                        lower=-10 - arange(N),
                        upper=arange(N),
                        value=0)
    optProb.addVarGroup('z',
                        2 * N,
                        upper=arange(2 * N),
                        lower=-100 - arange(2 * N),
                        value=0)
    # Constraints
    optProb.addCon('con1', upper=100, wrt=['x'])
    optProb.addCon('con2', upper=100)
    optProb.addCon('con3', lower=4, wrt=['x', 'z'])
    optProb.addConGroup('lincon',
                        N,
                        lower=2 - 3 * arange(N),
                        linear=True,
                        wrt=['x', 'y'],
                        jac={
                            'x': numpy.ones((N, 1)),
                            'y': sparse.spdiags(numpy.ones(N), 0, N, N)
                        })
    optProb.addObj('obj')
    # Optimizer
    opt = OPT(optimizer, options=opt_options)
    optProb.printSparsity()

    return opt, optProb
Esempio n. 8
0
class TestOptProb(unittest.TestCase):
    tol = 1e-12

    def objfunc(self, xdict):
        """
        This is a simple quadratic test function with linear constraints.
        The actual problem doesn't really matter, since we are not testing optimization,
        but just optProb. However, we need to initialize and run an optimization
        in order to have optimizer-specific fields in optProb populated, such as
        jacIndices.

        This problem is probably not feasible, but that's okay.
        """
        funcs = {}
        funcs["obj_0"] = 0
        for x in xdict.keys():
            funcs["obj_0"] += np.sum(np.power(xdict[x], 2))
        for iCon, nc in enumerate(self.nCon):
            conName = "con_{}".format(iCon)
            funcs[conName] = np.zeros(nc)
            for x in xdict.keys():
                for j in range(nc):
                    funcs[conName][j] = (iCon + 1) * np.sum(xdict[x])
        return funcs, False

    def setup_optProb(self, nObj=1, nDV=[4], nCon=[2], xScale=[1.0], objScale=[1.0], conScale=[1.0], offset=[0.0]):
        """
        This function sets up a general optimization problem, with arbitrary
        DVs, constraints and objectives.
        Arbitrary scaling for the various parameters can also be specified.
        """
        self.nObj = nObj
        self.nDV = nDV
        self.nCon = nCon
        self.xScale = xScale
        self.objScale = objScale
        self.conScale = conScale
        self.offset = offset

        # Optimization Object
        self.optProb = Optimization("Configurable Test Problem", self.objfunc)
        self.x0 = {}
        # Design Variables
        for iDV in range(len(nDV)):
            n = nDV[iDV]
            lower = np.random.uniform(-5, 2, n)
            upper = np.random.uniform(5, 20, n)
            x0 = np.random.uniform(lower, upper)
            dvName = "x{}".format(iDV)
            self.x0[dvName] = x0
            self.optProb.addVarGroup(
                dvName,
                n,
                lower=lower,
                upper=upper,
                value=x0,
                scale=xScale[iDV],
                offset=offset[iDV],
            )

        # Constraints
        for iCon in range(len(nCon)):
            nc = nCon[iCon]
            lower = np.random.uniform(-5, 2, nc)
            upper = np.random.uniform(5, 6, nc)
            self.optProb.addConGroup(
                "con_{}".format(iCon),
                nc,
                lower=lower,
                upper=upper,
                scale=conScale[iCon],
            )

        # Objective
        for iObj in range(nObj):
            self.optProb.addObj("obj_{}".format(iObj), scale=objScale[iObj])

        # Finalize
        self.optProb.printSparsity()
        # run optimization
        # we don't care about outputs, but this performs optimizer-specific re-ordering
        # of constraints so we need this to test mappings
        opt = OPT("slsqp", options={"IFILE": "optProb_SLSQP.out"})
        opt(self.optProb, "FD")

    def test_setDV_getDV(self):
        """
        We just test that setDV and getDV work, even with scaling
        """
        self.setup_optProb(
            nObj=1,
            nDV=[4, 8],
            nCon=[2, 3],
            xScale=[4, 1],
            objScale=[0.3],
            conScale=[0.1, 8],
            offset=[3, 7],
        )
        # test getDV first
        x0 = self.optProb.getDVs()
        assert_dict_allclose(x0, self.x0)
        # now set, get, and compare
        newDV = {"x0": np.arange(4), "x1": np.arange(8)}
        self.optProb.setDVs(newDV)
        outDV = self.optProb.getDVs()
        assert_dict_allclose(newDV, outDV)

    def test_setDV_VarGroup(self):
        """
        Test that setDV works with a subset of VarGroups
        """
        self.setup_optProb(
            nObj=1,
            nDV=[4, 8],
            nCon=[2, 3],
            xScale=[4, 1],
            objScale=[0.3],
            conScale=[0.1, 8],
            offset=[3, 7],
        )
        oldDV = self.optProb.getDVs()
        # set values for only one VarGroup
        newDV = {"x0": np.arange(4)}
        self.optProb.setDVs(newDV)
        outDV = self.optProb.getDVs()
        # check x0 changed
        assert_allclose(newDV["x0"], outDV["x0"])
        # check x1 is the same
        assert_allclose(oldDV["x1"], outDV["x1"])

    def test_mappings(self):
        """
        This test checks the various mapping and process helper functions
        in pyOpt_optimization. In this function we just set up an optimization problem,
        and the actual test is done in `map_check_value`.
        """
        nDV = [4, 8, 1]
        nCon = [2, 3, 1, 1]
        self.setup_optProb(
            nObj=1,
            nDV=nDV,
            nCon=nCon,
            xScale=[np.random.rand(i) for i in nDV],
            objScale=[0.3],
            conScale=[np.random.rand(i) for i in nCon],
            offset=[np.random.rand(i) * np.arange(i) for i in nDV],
        )

        # first test X
        x = self.optProb.getDVs()
        self.map_check_value("X", x)

        # next we check the objective
        funcs, _ = self.objfunc(x)
        obj_funcs = {}
        for key in funcs.keys():
            if "obj" in key:
                obj_funcs[key] = funcs[key]
        self.map_check_value("Obj", obj_funcs)

        # lastly we check the constraints
        funcs, _ = self.objfunc(x)
        con_funcs = {}
        for key in funcs.keys():
            if "con" in key:
                con_funcs[key] = funcs[key]
        self.map_check_value("Con", con_funcs)

    def map_check_value(self, key, val):
        """
        This function checks all the mapping and process functions
        in both directions, for a given key = {'X', 'Con', 'Obj'}
        and val in dictionary format.
        """
        # dictionary of function handles to test
        map_funcs = {
            "X": [self.optProb._mapXtoOpt, self.optProb._mapXtoUser],
            "X_Dict": [self.optProb._mapXtoOpt_Dict, self.optProb._mapXtoUser_Dict],
            "Con": [self.optProb._mapContoOpt, self.optProb._mapContoUser],
            "Con_Dict": [self.optProb._mapContoOpt_Dict, self.optProb._mapContoUser_Dict],
            "Obj": [self.optProb._mapObjtoOpt, self.optProb._mapObjtoUser],
            "Obj_Dict": [self.optProb._mapObjtoOpt_Dict, self.optProb._mapObjtoUser_Dict],
        }
        process_funcs = {
            "X": {"vec": self.optProb.processXtoVec, "dict": self.optProb.processXtoDict},
            "Con": {"vec": self.optProb.processContoVec, "dict": self.optProb.processContoDict},
            "Obj": {"vec": self.optProb.processObjtoVec, "dict": self.optProb.processObjtoDict},
        }

        def processValue(key, val, output):
            """helper function since some functions have optional arguments that are needed"""
            if key == "Con":
                return process_funcs[key][output](val, scaled=False, natural=True)
            elif key == "Obj":
                return process_funcs[key][output](val, scaled=False)
            else:
                return process_funcs[key][output](val)

        # test dict to vec mappings
        vec = processValue(key, val, "vec")
        dictionary = processValue(key, vec, "dict")
        assert_dict_allclose(val, dictionary)

        # test mappings using dictionaries
        val_opt = map_funcs[key + "_Dict"][0](val)
        val_user = map_funcs[key + "_Dict"][1](val_opt)
        assert_dict_allclose(val_user, val)
        assert_dict_not_allclose(val_user, val_opt)

        # test mappings using vectors
        val = processValue(key, val, "vec")
        val_opt = map_funcs[key][0](val)
        val_user = map_funcs[key][1](val_opt)
        assert_allclose(val_user, val, atol=self.tol, rtol=self.tol)
        assert_not_allclose(val_user, val_opt)

        # check that the scaling was actually done correctly
        # we only check this for the array version because
        # it's much simpler
        if key == "X":
            scale = np.hstack(self.xScale)
            offset = np.hstack(self.offset)
            assert_allclose(val_opt, (val_user - offset) * scale)
        else:
            if key == "Obj":
                scale = np.hstack(self.objScale)
            else:
                scale = np.hstack(self.conScale)
            assert_allclose(val_opt, val_user * scale)

    def test_finalize(self):
        """
        Check that multiple finalize calls don't mess up the optProb
        """
        self.setup_optProb(nObj=1, nDV=[4, 8], nCon=[2, 3], xScale=[1.0, 1.0], conScale=[1.0, 1.0], offset=[0, 0])
        assert_optProb_size(self.optProb, 1, 12, 5)
        self.optProb.addObj("obj2")
        assert_optProb_size(self.optProb, 2, 12, 5)
        self.optProb.addVar("DV2")
        assert_optProb_size(self.optProb, 2, 13, 5)
        self.optProb.addCon("CON2")
        assert_optProb_size(self.optProb, 2, 13, 6)
Esempio n. 9
0
    if MPI.COMM_WORLD.rank == 0:
        print('Mass functions')
        pprint(massFuncs)
    return funcs


def sens(x, funcs):
    funcsSens = {}
    FEASolver.evalFunctionsSens(sp, funcsSens)
    return funcsSens


# Set up the optimization problem
optProb = Optimization('Mass minimization', obj)
optProb.addObj('2.5gload_mass')
FEASolver.addVariablesPyOpt(optProb)

for i in range(3):
    optProb.addCon('%s_ks%d' % (sp.name, i), upper=1.0)

if MPI.COMM_WORLD.rank == 0:
    print(optProb)
optProb.printSparsity()

optOptions = {}
opt = OPT('snopt', options=optOptions)
sol = opt(optProb, sens=sens, storeHistory='struct.hst')

# Write the final solution
FEASolver.writeOutputFile('final.f5')
Esempio n. 10
0
    sens = sensfunc
if sens == 'matrix-free':
    sens = [objgrad, jprod, jtprod]

# Instantiate Optimization Problem
optProb = Optimization('Rosenbrock function', objfunc)
optProb.addVarGroup('xvars',
                    2,
                    'c',
                    value=[3, -3],
                    lower=-5.12,
                    upper=5.12,
                    scale=[1.0, 1.0])
optProb.finalizeDesignVariables()
if constrained:
    optProb.addCon('con', upper=0, scale=1.0)
optProb.addObj('obj')

# Create optimizer
opt = OPT(args.opt, options=optOptions)
if testHist == 'no':
    # Just run a normal run
    sol = opt(optProb, sens=sens, sensMode=sensMode)
    # print(sol.fStar)
    print(sol)
else:
    # First call just does 10 iterations
    if args.opt.lower() == 'snopt':
        opt.setOption('Major iterations limit', 10)
        solSnopt1 = opt(optProb,
                        sens=sens,
optFuncs.DVCon = DVCon
optFuncs.evalFuncs = evalFuncs
optFuncs.gcomm = gcomm
optFuncs.setMultiPointCondition = setMultiPointCondition
optFuncs.setMultiPointObjFuncs = setMultiPointObjFuncs
optFuncs.setMultiPointObjFuncsSens = setMultiPointObjFuncsSens

# Optimize
DASolver.runColoring()
optProb = Optimization("opt", optFuncs.calcObjFuncValuesMP, comm=gcomm)
DVGeo.addVariablesPyOpt(optProb)
DVCon.addConstraintsPyOpt(optProb)
# Add objective
optProb.addObj("CD", scale=1)
# Add physical constraints
optProb.addCon("CL", lower=CL_target, upper=CL_target, scale=1)
optProb.addCon("CMZ", lower=CM_target, upper=CM_target, scale=1)

if gcomm.rank == 0:
    print(optProb)

opt = OPT("slsqp", options=optOptions)
histFile = os.path.join("./", "slsqp_hist.hst")
sol = opt(optProb, sens=optFuncs.calcObjFuncSensMP, storeHistory=histFile)

if gcomm.rank == 0:
    print(sol)

xDVs = DVGeo.getValues()
if gcomm.rank == 0:
    reg_write_dict(xDVs, 1e-6, 1e-8)
Esempio n. 12
0
optFuncs.DVCon = DVCon
optFuncs.evalFuncs = evalFuncs
optFuncs.gcomm = gcomm

# =================================================================================================
# Task
# =================================================================================================
if task.lower() == 'opt':
    optProb = Optimization('opt', optFuncs.aeroFuncs, comm=gcomm)
    DVGeo.addVariablesPyOpt(optProb)
    DVCon.addConstraintsPyOpt(optProb)

    # Add objective
    optProb.addObj('CMZ', scale=1)
    # Add physical constraints
    optProb.addCon('TPR', lower=1.46, upper=1.46, scale=1)
    optProb.addCon('MFR', lower=1.75, upper=1.75, scale=1)

    if gcomm.rank == 0:
        print optProb

    opt = OPT(args.opt, options=optOptions)
    histFile = os.path.join(outputDirectory, '%s_hist.hst' % args.opt)
    sol = opt(optProb, sens=optFuncs.aeroFuncsSens, storeHistory=histFile)
    if gcomm.rank == 0:
        print sol

elif task.lower() == 'run':

    optFuncs.run()
Esempio n. 13
0
optFuncs.DVCon = DVCon
optFuncs.evalFuncs = evalFuncs
optFuncs.gcomm = gcomm

# =============================================================================
# Task
# =============================================================================
if args.task == "opt":

    optProb = Optimization("opt", objFun=optFuncs.calcObjFuncValues, comm=gcomm)
    DVGeo.addVariablesPyOpt(optProb)
    DVCon.addConstraintsPyOpt(optProb)

    optProb.addObj("M", scale=1.0)
    # Add physical constraints
    optProb.addCon("VMS", upper=vms0, scale=1.0)

    if gcomm.rank == 0:
        print(optProb)

    DASolver.runColoring()

    opt = OPT(args.opt, options=optOptions)
    histFile = "./%s_hist.hst" % args.opt
    sol = opt(optProb, sens=optFuncs.calcObjFuncSens, storeHistory=histFile)
    if gcomm.rank == 0:
        print(sol)

elif args.task == "runPrimal":

    optFuncs.runPrimal()
Esempio n. 14
0
optFuncs.evalFuncs = evalFuncs
optFuncs.gcomm = gcomm

# =============================================================================
# Task
# =============================================================================
if args.task == "opt":

    optProb = Optimization("opt", objFun=optFuncs.calcObjFuncValues, comm=gcomm)
    DVGeo.addVariablesPyOpt(optProb)
    DVCon.addConstraintsPyOpt(optProb)

    # Add objective
    optProb.addObj("CMZ", scale=-1)
    # Add physical constraints
    optProb.addCon("TPR", lower=TPR_target, upper=TPR_target, scale=1)
    optProb.addCon("MFR", lower=MFR_target, upper=MFR_target, scale=1)

    if gcomm.rank == 0:
        print(optProb)

    DASolver.runColoring()

    opt = OPT(args.opt, options=optOptions)
    histFile = "./%s_hist.hst" % args.opt
    sol = opt(optProb, sens=optFuncs.calcObjFuncSens, storeHistory=histFile)
    if gcomm.rank == 0:
        print(sol)

elif args.task == "runPrimal":
Esempio n. 15
0
    
    return funcsSens,fail


# =================================================================================================
# Task
# =================================================================================================
if task.lower()=='opt':
    optProb = Optimization('opt', aeroFuncs, comm=gcomm)
    DVGeo.addVariablesPyOpt(optProb)
    DVCon.addConstraintsPyOpt(optProb)

    # Add objective
    optProb.addObj('CMZ', scale=1)
    # Add physical constraints
    optProb.addCon('TPR',lower=1.112,upper=1.112,scale=1)
    optProb.addCon('MFR',lower=1.003,upper=1.003,scale=1)
    optProb.addCon('VMS',lower=0,upper=4.828e7,scale=1e-7)

    if gcomm.rank == 0:
        print(optProb)

    opt = OPT(args.opt, options=optOptions)
    histFile = os.path.join(outputDirectory, '%s_hist.hst'%args.opt)
    sol = opt(optProb, sens=aeroFuncsSens, storeHistory=histFile)
    if gcomm.rank == 0:
        print(sol)

elif task.lower() == 'run':

    optFuncs.run()
Esempio n. 16
0
if args.sens == "user":
    sens = sensfunc
else:
    sens = args.sens

# Instantiate Optimization Problem
optProb = Optimization("Rosenbrock function", objfunc)
optProb.addVarGroup("xvars",
                    2,
                    "c",
                    value=[3, -3],
                    lower=-5.12,
                    upper=5.12,
                    scale=[1.0, 1.0])
if args.constrained:
    optProb.addCon("con", upper=0, scale=1.0)
optProb.addObj("obj")

# Create optimizer
opt = SLSQP(options=optOptions)

if args.testHotstart:
    histName = "opt_hist.hst"
    # First call just does 10 iterations
    opt.setOption("MAXIT", 10)
    sol1 = opt(optProb, sens=sens, storeHistory=histName)

    # Now we are allowed to do 50
    opt.setOption("MAXIT", 50)
    sol2 = opt(optProb, sens=sens, hotStart=histName, storeHistory=histName)
    print(sol2.fStar)
Esempio n. 17
0
class TestLarge(OptTest):
    name = "large_sparse"
    DVs = {"x", "y", "z"}
    objs = {"obj"}
    cons = {"con1", "con2", "con3"}
    xStar = {"x": 2}
    fStar = 10.0

    def objfunc(self, xdict):
        x = xdict["x"]
        y = xdict["y"]
        z = xdict["z"]
        funcs = {}
        funcs["obj"] = x**2 + 2 * np.sum(y**2) + 3 * np.sum(z)
        funcs["con1"] = x + 1e-3 * abs(x) ** 2.05
        funcs["con2"] = x**4 + np.sum(y) + np.sum(z**2)
        funcs["con3"] = x + np.sum(z)

        return funcs, False

    def sens(self, xdict, funcs):
        x = xdict["x"]
        y = xdict["y"]
        z = xdict["z"]

        funcsSens = {
            "obj": {
                "x": 2 * x,
                "y": 4 * y,
                "z": 3 * np.ones(2 * self.N),
            },
            "con1": {
                "x": 2.05 * x * (x * x) ** 0.025,
            },
            "con2": {
                "x": 4 * x**3,
                "y": np.ones(self.N),
                "z": 2 * z,
            },
            "con3": {
                "x": 1.0,
                "z": np.ones(2 * self.N),
            },
        }

        return funcsSens, False

    def setup_optProb(self, sparse=True):
        # set N
        if sparse:
            self.N = 10000
        else:
            self.N = 500

        # Optimization Object
        self.optProb = Optimization("large and sparse", self.objfunc, sens=self.sens)

        # Design Variables
        self.optProb.addVar("x", lower=-100, upper=150, value=0)
        self.optProb.addVarGroup("y", self.N, lower=-10 - np.arange(self.N), upper=np.arange(self.N), value=0)
        self.optProb.addVarGroup(
            "z", 2 * self.N, upper=np.arange(2 * self.N), lower=-100 - np.arange(2 * self.N), value=0
        )

        # Constraints
        self.optProb.addCon("con1", upper=100, wrt=["x"])
        self.optProb.addCon("con2", upper=100)
        self.optProb.addCon("con3", lower=4, wrt=["x", "z"])
        xJac = np.ones((self.N, 1))
        if sparse:
            rows_cols = np.array([i for i in range(0, self.N)]).astype(int)
            yJac = {"coo": [rows_cols, rows_cols, np.ones(self.N)], "shape": [self.N, self.N]}
        else:
            yJac = np.eye(self.N)
        self.optProb.addConGroup(
            "lincon",
            self.N,
            lower=2 - 3 * np.arange(self.N),
            linear=True,
            wrt=["x", "y"],
            jac={"x": xJac, "y": yJac},
        )
        self.optProb.addObj("obj")

    @parameterized.expand(
        [
            ("SNOPT", True),
            ("IPOPT", True),
            ("SNOPT", False),
        ]
    )
    def test_opt(self, optName, sparse):
        self.optName = optName
        self.setup_optProb(sparse=sparse)
        sol = self.optimize()
        self.assert_solution_allclose(sol, 1e-5, partial_x=True)

    def test_dense_workspace_too_small(self):
        self.optName = "SNOPT"
        self.setup_optProb(sparse=False)
        optOptions = {"Total real workspace": 401300}  # 500 + 200 * (503 + 1501)
        sol = self.optimize(optOptions=optOptions)

        # Check that the workspace is too small without overwriting the lengths
        self.assert_inform_equal(sol, 84)
Esempio n. 18
0
        turbineX = turbineX/scale
        turbineY = turbineY/scale

        """Optimization"""
        optProb = Optimization('Wind_Farm_AEP', obj_func_max_damage)
        # optProb.addObj('AEP')
        optProb.addObj('damage')

        optProb.addVarGroup('turbineX', nTurbs, type='c', lower=min(xBounds), upper=max(xBounds), value=turbineX)
        optProb.addVarGroup('turbineY', nTurbs, type='c', lower=min(yBounds), upper=max(yBounds), value=turbineY)

        num_cons_sep = (nTurbs-1)*nTurbs/2
        optProb.addConGroup('sep', num_cons_sep, lower=0., upper=None)
        optProb.addConGroup('bound', nTurbs, lower=0., upper=None)
        # optProb.addConGroup('damage', nTurbs, lower=None, upper=damage_lim)
        optProb.addCon('AEP', lower=None, upper=-aep_lim)

        opt = SNOPT()
        opt.setOption('Scale option',0)
        opt.setOption('Iterations limit',1000000)

        opt.setOption('Summary file','%s/summary.out'%folder)
        opt.setOption('Major optimality tolerance',1.e-4)
        opt.setOption('Major feasibility tolerance',1.e-6)

        res = opt(optProb)

        x = res.xStar['turbineX']
        y = res.xStar['turbineY']

        input = {'turbineX':x,'turbineY':y}
Esempio n. 19
0
# Add objective
optProb.addObj("obj", scale=1e4)

# Add variables from the AeroProblem
for ap in aeroProblems:
    ap.addVariablesPyOpt(optProb)

# Add DVGeo variables
DVGeo.addVariablesPyOpt(optProb)

# Add constraints
DVCon.addConstraintsPyOpt(optProb)
for ap in aeroProblems:
    optProb.addCon(f"cl_con_{ap.name}",
                   lower=0.0,
                   upper=0.0,
                   scale=1.0,
                   wrt=[f"alpha_{ap.name}", "shape"])

# The MP object needs the 'obj' and 'sens' function for each proc set,
# the optimization problem and what the objcon function is:
MP.setProcSetObjFunc("cruise", cruiseFuncs)
MP.setProcSetSensFunc("cruise", cruiseFuncsSens)
MP.setObjCon(objCon)
MP.setOptProb(optProb)
optProb.printSparsity()
# rst optprob (end)
# rst optimizer
# Set up optimizer
if args.opt == "SLSQP":
    optOptions = {"IFILE": os.path.join(args.output, "SLSQP.out")}
Esempio n. 20
0
# Task
# =============================================================================
if args.task == "opt":

    optProb = Optimization("opt",
                           objFun=optFuncs.calcObjFuncValuesMP,
                           comm=gcomm)
    DVGeo.addVariablesPyOpt(optProb)
    DVCon.addConstraintsPyOpt(optProb)

    # Add objective
    optProb.addObj("obj", scale=1)
    # Add physical constraints
    for i in range(nMultiPoints):
        optProb.addCon("mp%d_CL" % i,
                       lower=CL_target[i],
                       upper=CL_target[i],
                       scale=1)

    if gcomm.rank == 0:
        print(optProb)

    DASolver.runColoring()

    opt = OPT(args.opt, options=optOptions)
    histFile = "./%s_hist.hst" % args.opt
    sol = opt(optProb, sens=optFuncs.calcObjFuncSensMP, storeHistory=histFile)
    if gcomm.rank == 0:
        print(sol)

elif args.task == "runPrimal":
Esempio n. 21
0
# =============================================================================
# Task
# =============================================================================
if args.task == "opt":

    alpha4CLTarget = optFuncs.solveCL(CL_target, "alpha", "CL")
    alpha([alpha4CLTarget], None)

    optProb = Optimization("opt", objFun=optFuncs.calcObjFuncValues, comm=gcomm)
    DVGeo.addVariablesPyOpt(optProb)
    DVCon.addConstraintsPyOpt(optProb)

    # Add objective
    optProb.addObj("CL", scale=-1)
    # Add physical constraints
    optProb.addCon("CD", lower=CD_target, upper=CD_target, scale=1)

    if gcomm.rank == 0:
        print(optProb)

    DASolver.runColoring()

    opt = OPT(args.opt, options=optOptions)
    histFile = "./%s_hist.hst" % args.opt
    sol = opt(optProb, sens=optFuncs.calcObjFuncSens, storeHistory=histFile)
    if gcomm.rank == 0:
        print(sol)

elif args.task == "runPrimal":

    optFuncs.runPrimal()
Esempio n. 22
0
    return funcsSens, fail


# =================================================================================================
# Task
# =================================================================================================
if task.lower() == 'opt':
    optProb = Optimization('opt', aeroFuncs, comm=gcomm)
    DVGeo.addVariablesPyOpt(optProb)
    DVCon.addConstraintsPyOpt(optProb)

    # Add objective
    optProb.addObj('CD', scale=1)
    # Add physical constraints
    optProb.addCon('CL', lower=CL_star, upper=CL_star, scale=1)

    if gcomm.rank == 0:
        print optProb

    opt = OPT(args.opt, options=optOptions)
    histFile = os.path.join(outputDirectory, '%s_hist.hst' % args.opt)
    sol = opt(optProb, sens=aeroFuncsSens, storeHistory=histFile)
    if gcomm.rank == 0:
        print sol

elif task.lower() == 'run':

    optFuncs.run()

elif task.lower() == 'plotsensmap':
Esempio n. 23
0
    jac = [[2.0 * x[0], 2.0 * x[1], 2.0 * x[2], 2.0 * x[3]]]
    funcsSens["con2"] = {"xvars": jac}
    fail = False
    return funcsSens, fail


# Optimization Object
optProb = Optimization("HS071 Constraint Problem", objfunc)

# Design Variables
x0 = [1.0, 5.0, 5.0, 1.0]
optProb.addVarGroup("xvars", 4, lower=1, upper=5, value=x0)

# Constraints
# optProb.addCon('con1', lower=25, upper=1e19)
optProb.addCon("con1", lower=25)
# optProb.addCon('con2', lower=40, upper=40)
optProb.addCon("con2", lower=40, upper=40)

# Objective
optProb.addObj("obj")

# Check optimization problem:
print(optProb)

# Optimizer
opt = OPT(args.opt, options=optOptions)

# Solution
sol = opt(optProb, sens=sens)
Esempio n. 24
0
#rst optprob (beg)
# Create optimization problem
optProb = Optimization('opt', MP.obj, comm=MPI.COMM_WORLD)

# Add objective
optProb.addObj('obj', scale=1e4)

# Add variables from the AeroProblem
ap.addVariablesPyOpt(optProb)

# Add DVGeo variables
DVGeo.addVariablesPyOpt(optProb)

# Add constraints
DVCon.addConstraintsPyOpt(optProb)
optProb.addCon('cl_con_'+ap.name, lower=0.0, upper=0.0, scale=1.0)

# The MP object needs the 'obj' and 'sens' function for each proc set,
# the optimization problem and what the objcon function is:
MP.setProcSetObjFunc('cruise', cruiseFuncs)
MP.setProcSetSensFunc('cruise', cruiseFuncsSens)
MP.setObjCon(objCon)
MP.setOptProb(optProb)
optProb.printSparsity()
#rst optprob (end)
#rst optimizer
# Set up optimizer
optOptions = {
    'Major iterations limit':200,
    'Major step limit':2.0,
    'Major feasibility tolerance':1.0e-6,
Esempio n. 25
0
    def optimize(self,
                 sparse=True,
                 tol=None,
                 optOptions={},
                 storeHistory=False):
        # set N
        if sparse:
            self.N = 50000
        else:
            self.N = 500
        # Optimization Object
        optProb = Optimization("large and sparse", self.objfunc)

        # Design Variables
        optProb.addVar("x", lower=-100, upper=150, value=0)
        optProb.addVarGroup("y",
                            self.N,
                            lower=-10 - np.arange(self.N),
                            upper=np.arange(self.N),
                            value=0)
        optProb.addVarGroup("z",
                            2 * self.N,
                            upper=np.arange(2 * self.N),
                            lower=-100 - np.arange(2 * self.N),
                            value=0)

        # Constraints
        optProb.addCon("con1", upper=100, wrt=["x"])
        optProb.addCon("con2", upper=100)
        optProb.addCon("con3", lower=4, wrt=["x", "z"])
        xJac = np.ones((self.N, 1))
        if sparse:
            yJac = scipy.sparse.spdiags(np.ones(self.N), 0, self.N, self.N)
        else:
            yJac = np.eye(self.N)
        optProb.addConGroup(
            "lincon",
            self.N,
            lower=2 - 3 * np.arange(self.N),
            linear=True,
            wrt=["x", "y"],
            jac={
                "x": xJac,
                "y": yJac
            },
        )
        optProb.addObj("obj")

        # Optimizer
        try:
            opt = SNOPT(options=optOptions)
        except Error:
            raise unittest.SkipTest("Optimizer not available: SNOPT")

        sol = opt(optProb, sens=self.sens)

        # Check Solution
        if tol is not None:
            if opt.version != "7.7.7":
                assert_allclose(sol.objectives["obj"].value,
                                10.0,
                                atol=tol,
                                rtol=tol)
            else:
                assert_allclose(sol.fStar, 10.0, atol=tol, rtol=tol)
            assert_allclose(sol.variables["x"][0].value,
                            2.0,
                            atol=tol,
                            rtol=tol)
        return sol
Esempio n. 26
0
# Setup Optimization Problem
optProb = Optimization('Basic Aero-Structural Optimization', MP.obj)

# Add variables
DVGeo.addVariablesPyOpt(optProb)
FEASolver.addVariablesPyOpt(optProb)
cruiseProblems[0].addVariablesPyOpt(optProb)
maneuverProblems[0].addVariablesPyOpt(optProb)
geoVars = DVGeo.getValues().keys()

# Add constraints
DVCon.addConstraintsPyOpt(optProb)
FEASolver.addConstraintsPyOpt(optProb)
optProb.addCon('cruise_lift_con',
               lower=0.0,
               upper=0.0,
               scale=1.0 / Mref,
               wrt=['struct', 'alpha_cruise'] + geoVars)
optProb.addCon('maneuver_lift_con',
               lower=0.0,
               upper=0.0,
               scale=1.0 / Mref,
               wrt=['struct', 'alpha_maneuver'] + geoVars)
for j in range(3):
    optProb.addCon('maneuver_ks%d' % j,
                   upper=1.0,
                   wrt=['struct', 'alpha_maneuver'] + geoVars)

# Objective:
optProb.addObj('obj')
Esempio n. 27
0
    jac = [[2.0 * x[0], 2.0 * x[1], 2.0 * x[2], 2.0 * x[3]]]
    funcsSens['con2'] = {'xvars': jac}
    fail = False
    return funcsSens, fail


# Optimization Object
optProb = Optimization('HS071 Constraint Problem', objfunc)

# Design Variables
x0 = [1.0, 5.0, 5.0, 1.0]
optProb.addVarGroup('xvars', 4, lower=1, upper=5, value=x0)

# Constraints
# optProb.addCon('con1', lower=25, upper=1e19)
optProb.addCon('con1', lower=25)
# optProb.addCon('con2', lower=40, upper=40)
optProb.addCon('con2', lower=40, upper=40)

# Objective
optProb.addObj('obj')

# Check optimization problem:
print(optProb)

# Optimizer
opt = OPT(args.opt, options=optOptions)

# Solution
sol = opt(optProb, sens=sens)
Esempio n. 28
0
# rst optprob (beg)
# Create optimization problem
optProb = Optimization("opt", MP.obj, comm=comm)

# Add objective
optProb.addObj("obj", scale=1e2)

# Add variables from the AeroProblem
ap.addVariablesPyOpt(optProb)

# Add DVGeo variables
DVGeo.addVariablesPyOpt(optProb)

# Add constraints
DVCon.addConstraintsPyOpt(optProb)
optProb.addCon("cl_con_" + ap.name, lower=0.0, scale=10.0)

# The MP object needs the 'obj' and 'sens' function for each proc set,
# the optimization problem and what the objcon function is:
MP.setProcSetObjFunc("cruise", cruiseFuncs)
MP.setProcSetSensFunc("cruise", cruiseFuncsSens)
MP.setObjCon(objCon)
MP.setOptProb(optProb)
optProb.printSparsity()
# rst optprob (end)
# rst optimizer
# Set up optimizer
if args.opt == "SLSQP":
    optOptions = {"IFILE": os.path.join(args.output, "SLSQP.out")}
elif args.opt == "SNOPT":
    optOptions = {
Esempio n. 29
0
Mach = 0.45
Cl_i = np.array([0.5])
Cl_req = np.asscalar(normalize_y(Cl_i, 0))
x0_t = np.zeros(16)
x0_t[14] = Mach
x0_t = normalize_x(x0_t)
Mach_n = x0_t[0, 14]
low_alpha = None
up_alpha = None

optProb = Optimization('naca4412', objfunc)

optProb.addVarGroup('modes', 14, 'c', lower=None, upper=None, value=.5)
optProb.addVar('alpha', 'c', lower=low_alpha, upper=up_alpha, value=.5)

optProb.addCon('thick_0.1', lower=thickness_constraint[0], upper=None)
optProb.addCon('thick_0.3', lower=thickness_constraint[1], upper=None)
optProb.addCon('thick_0.5', lower=thickness_constraint[2], upper=None)
optProb.addCon('thick_0.7', lower=thickness_constraint[3], upper=None)
optProb.addCon('thick_0.9', lower=thickness_constraint[4], upper=None)
optProb.addCon('Cl', lower=Cl_req, upper=Cl_req)

optProb.addObj('obj')

print(optProb)
#%%
opt = pyoptsparse.SLSQP()
sol = opt(optProb, sens=sens)
print(sol)
#%%
modes_opt = sol.xStar['modes']
Esempio n. 30
0

# =================================================================================================
# Task
# =================================================================================================

if task.lower() == 'opt':
    optProb = Optimization('opt', MP.obj, comm=gcomm)
    DVGeo.addVariablesPyOpt(optProb)
    DVCon.addConstraintsPyOpt(optProb)

    # Add objective
    optProb.addObj('obj', scale=1000)
    # Add physical constraints
    for i in xrange(nFlowCases):
        optProb.addCon('fc%d_CL_con' % i, lower=0.0, upper=0.0, scale=1.0)

    if gcomm.rank == 0:
        print(optProb)

    # The MP object needs the 'obj' and 'sens' function for each proc set,
    # the optimization problem and what the objcon function is:
    MP.setProcSetObjFunc(optVars[0] + '_mp', aeroFuncsMP)
    MP.setProcSetSensFunc(optVars[0] + '_mp', aeroFuncsSensMP)
    MP.setObjCon(objCon)
    MP.setOptProb(optProb)
    optProb.printSparsity()

    # Make Instance of Optimizer
    opt = OPT(args.opt, options=optOptions)
Esempio n. 31
0
# =====================================================

opt_prob = Optimization('opt', MP.obj, use_groups=True)

# Add Aero Variables
for fc in flowCases:
    opt_prob.addVar('alpha_' + fc, value=1.6, lower=0., upper=10., scale=.1)

# Add Geo variables
opt_prob = DVGeo.addVariablesPyOpt(opt_prob)

# Constraints:
for fc in flowCases:
    opt_prob.addCon('cl_con_' + fc,
                    type='i',
                    lower=0.0,
                    upper=0.0,
                    scale=10,
                    wrt=['geo', 'alpha_' + fc])

# Geometric Constraints
DVCon.addConstraintsPyOpt(opt_prob)

# Add Objective
opt_prob.addObj('cd')

# Check opt problem:
if MPI.COMM_WORLD.rank == 0:
    print opt_prob
    opt_prob.printSparsity()

# The MP object needs the 'obj' and 'sens' function for each proc set,