def ieqconsfn(Ab, *args): """Optimiser inequality constraint function.""" initcs = args[0] A = r_[eye(initcs.nd), -eye(initcs.nd)] b = array([Ab]).T # get vertices for constraint set iteration V = tryvol(A, b, initcs)[1] iterset = ConSet(V) #constraint checking for vertices ineqs = iterset.allinside(initcs)[1] return array([-linalg.norm(ineqs)])
def ieqconsfn(Ab, *args): """Optimiser inequality constraint function.""" initcs = args[0] A, b = splitAb(Ab, initcs.nd) # get vertices V = tryvol(A, b, initcs)[1] iterset = ConSet(V) # constraint checking if iterset.allinside(initcs): return 0 else: return -1
def objfn2(Ab, *args): """Volume objective function for fmin (Simplex).""" initcs = args[0] A = r_[eye(initcs.nd), -eye(initcs.nd)] b = array([Ab]).T vol, V = tryvol(A, b, initcs) Pv = 200. #Penalties # points outside of init space iterset = ConSet(V) outnorm = linalg.norm(iterset.allinside(initcs)[1]) # open shape cl = con2vert(A, b)[1] if cl: closed = 1 else: closed = -1 vol = tryvol(A, b, initcs)[0] return (-vol*closed) + Pv*(outnorm**3)
def objfn(Ab, *args): """Volume objective function for fmin (Simplex).""" initcs = args[0] A, b = splitAb(Ab, initcs.nd) vol, V = tryvol(A, b, initcs) Pv = 200. Pn = 100. #Penalties # large b norm bnorm = abs(linalg.norm(b) - 1) # points outside of init space iterset = ConSet(V) outnorm = linalg.norm(iterset.allinside(initcs)[1]) #outnorm = iterset.allinside(initcs)[2] # open shape cl = con2vert(A, b)[1] if cl: closed = 1 else: closed = -1 vol = tryvol(A, b, initcs)[0] return (-vol*closed) + Pn*(bnorm**initcs.nd) + Pv*(outnorm**(initcs.nd+3))
def fitshape(cset, spset, solver): """ Fit a constraint set (specified by the number of constraints) within an existing constraint set. cset - [ConSet] existing constraint set ncon - [int] number of constraints to fit """ #### State problem # ncongiven > ncon >= nD+1 # Constraints are bounding # All vertices within constraint set #### Define parameters snorm = linalg.norm(spset.b) sp = c_[spset.A, spset.b]/snorm # starting point - combined Ab matrix to optimise #### Objective fn (FMIN) def objfn(Ab, *args): """Volume objective function for fmin (Simplex).""" initcs = args[0] A, b = splitAb(Ab, initcs.nd) vol, V = tryvol(A, b, initcs) Pv = 200. Pn = 100. #Penalties # large b norm bnorm = abs(linalg.norm(b) - 1) # points outside of init space iterset = ConSet(V) outnorm = linalg.norm(iterset.allinside(initcs)[1]) #outnorm = iterset.allinside(initcs)[2] # open shape cl = con2vert(A, b)[1] if cl: closed = 1 else: closed = -1 vol = tryvol(A, b, initcs)[0] return (-vol*closed) + Pn*(bnorm**initcs.nd) + Pv*(outnorm**(initcs.nd+3)) #### Objective fn (SLSQP) def objfn2(Ab, *args): """Volume objective function for SLSQP.""" initcs = args[0] A, b = splitAb(Ab, initcs.nd) cl = con2vert(A, b)[1] if cl: closed = 1 else: closed = -1 vol = tryvol(A, b, initcs)[0] return closed * -vol def eqconsfn(Ab, *args): """Optimiser equality constraint function.""" initcs = args[0] b = splitAb(Ab, initcs.nd)[1] # get vertices bn = linalg.norm(b) - 1 return array([bn]) def ieqconsfn(Ab, *args): """Optimiser inequality constraint function.""" initcs = args[0] A, b = splitAb(Ab, initcs.nd) # get vertices V = tryvol(A, b, initcs)[1] iterset = ConSet(V) # constraint checking if iterset.allinside(initcs): return 0 else: return -1 #### Maximise volume if solver in 'aA': optAb = optimize.fmin_slsqp(objfn2, sp, f_eqcons=eqconsfn, f_ieqcons=ieqconsfn, args=[cset], iprint=0) elif solver in 'bB': optAb = optimize.fmin(objfn, sp, args=[cset], maxiter=20000, disp=False) elif solver in 'cC': optAb = optimize.fmin_cobyla(objfn2, sp, ieqconsfn, args=[cset], iprint=0) optAb = optAb.ravel() tA, tb = splitAb(optAb, cset.nd) ts = -ones(tb.shape) optsol = ConSet(tA, ts, tb) if solver in 'bB': optcent = sum(optsol.vert, axis=0)/len(optsol.vert) itersol = ConSet(optsol.vert) while not itersol.allinside(cset)[0]: vi = (itersol.vert - optcent)*0.9999 + optcent itersol = ConSet(vi) optsol = itersol return optsol
def fitcube(cset, spset, solver): """ Fit a rectangle (high/low limits on outputs) within an existing constraint set. cset - [ConSet] existing constraint set """ #### State problem # nvar = cset.nd # Constraints are bounding # All vertices within constraint set #### Define parameters sp = spset.b.ravel() # starting point - b matrix to optimise #### Objective fn (SLSQP) def objfn(Ab, *args): """Volume objective function for SLSQP.""" initcs = args[0] A = r_[eye(initcs.nd), -eye(initcs.nd)] b = array([Ab]).T cl = con2vert(A, b)[1] if cl: closed = 1 else: closed = -1 vol = tryvol(A, b, initcs)[0] return closed * -vol #### Constraints def ieqconsfn(Ab, *args): """Optimiser inequality constraint function.""" initcs = args[0] A = r_[eye(initcs.nd), -eye(initcs.nd)] b = array([Ab]).T # get vertices for constraint set iteration V = tryvol(A, b, initcs)[1] iterset = ConSet(V) #constraint checking for vertices ineqs = iterset.allinside(initcs)[1] return array([-linalg.norm(ineqs)]) #### Objective fn (FMIN) def objfn2(Ab, *args): """Volume objective function for fmin (Simplex).""" initcs = args[0] A = r_[eye(initcs.nd), -eye(initcs.nd)] b = array([Ab]).T vol, V = tryvol(A, b, initcs) Pv = 200. #Penalties # points outside of init space iterset = ConSet(V) outnorm = linalg.norm(iterset.allinside(initcs)[1]) # open shape cl = con2vert(A, b)[1] if cl: closed = 1 else: closed = -1 vol = tryvol(A, b, initcs)[0] return (-vol*closed) + Pv*(outnorm**3) #### Maximise volume if solver in 'aA': optAb = optimize.fmin_slsqp(objfn, sp, f_ieqcons=ieqconsfn, args=[cset], iprint=0) elif solver in 'bB': optAb = optimize.fmin(objfn2, sp, args=[cset], maxiter=50000, disp=False) if solver in 'cC': optAb = optimize.fmin_cobyla(objfn, sp, ieqconsfn, args=[cset], iprint=0) tA = r_[eye(cset.nd), -eye(cset.nd)] tb = array([optAb]).T ts = -ones(tb.shape) optsol = ConSet(tA, ts, tb) if solver in 'bBcC': optcent = sum(optsol.vert, axis=0)/len(optsol.vert) itersol = ConSet(optsol.vert) while not itersol.allinside(cset)[0]: vi = (itersol.vert - optcent)*0.9999 + optcent itersol = ConSet(vi) optsol = itersol return optsol