def test_optimise_constrained_poly2(self): n = 2 N = 20 bounds = [0.0, np.inf] X = np.random.uniform(-1.0, 1.0, (N, n)) # Function values for f and Poly object f = self.ObjFun1(X) fparam = eq.Parameter(distribution='uniform', lower=-1., upper=1., order=self.degf) fParameters = [fparam for i in range(n)] myBasis = eq.Basis('total-order') fpoly = eq.Poly(fParameters, myBasis, method='least-squares', sampling_args={ 'mesh': 'user-defined', 'sample-points': X, 'sample-outputs': f }) fpoly.set_model() # Active subspace and values for g1 g1 = self.ConFun1(X) g1param = eq.Parameter(distribution='uniform', lower=-1., upper=1., order=self.degg1) g1Parameters = [g1param for i in range(n)] myBasis = eq.Basis('total-order') g1poly = eq.Poly(g1Parameters, myBasis, method='least-squares', sampling_args={ 'mesh': 'user-defined', 'sample-points': X, 'sample-outputs': g1 }) g1poly.set_model() for method in ['trust-constr', 'SLSQP', 'COBYLA']: Opt = eq.Optimisation(method=method) Opt.add_objective(poly=fpoly) Opt.add_bounds(-np.ones(n), np.ones(n)) Opt.add_nonlinear_ineq_con({'poly': g1poly, 'bounds': bounds}) x0 = np.zeros(n) sol = Opt.optimise(x0) if sol['status'] == 0: np.testing.assert_almost_equal(sol['x'].flatten(), np.array([1.0, 1.0]), decimal=2)
def test_optimise_unconstrained_poly(self): n = 2 N = 20 X = np.random.uniform(-1.0, 1.0, (N, n)) f = self.ObjFun1(X) fparam = eq.Parameter(distribution='uniform', lower=-1., upper=1., order=self.degf) fParameters = [fparam for i in range(n)] myBasis = eq.Basis('total-order') fpoly = eq.Poly(fParameters, myBasis, method='least-squares', sampling_args={ 'mesh': 'user-defined', 'sample-points': X, 'sample-outputs': f }) fpoly.set_model() for method in [ 'BFGS', 'CG', 'Newton-CG', 'L-BFGS-B', 'Powell', 'Nelder-Mead', 'trust-ncg' ]: Opt = eq.Optimisation(method=method) Opt.add_objective(fpoly) x0 = np.random.uniform(-1.0, 1.0, n) sol = Opt.optimise(x0) np.testing.assert_almost_equal(sol['x'].flatten(), np.array([1.0, 1.0]), decimal=3)
def test_optimise_eq_constrained_function2(self): n = 2 N = 20 value = 2.0 X = np.random.uniform(-1.0, 1.0, (N, n)) f = self.ObjFun1(X) fparam = eq.Parameter(distribution='uniform', lower=-1., upper=1., order=self.degf) fParameters = [fparam for i in range(n)] myBasis = eq.Basis('total-order') fpoly = eq.Poly(fParameters, myBasis, method='least-squares', sampling_args={ 'mesh': 'user-defined', 'sample-points': X, 'sample-outputs': f }) fpoly.set_model() g1Func = lambda x: value - self.ConFun1(x.reshape(1, -1)) for method in ['trust-constr', 'SLSQP']: Opt = eq.Optimisation(method=method) Opt.add_objective(poly=fpoly) Opt.add_nonlinear_eq_con(custom={'function': g1Func}) x0 = np.zeros(n) sol = Opt.optimise(x0) if sol['status'] == 0: np.testing.assert_almost_equal(sol['x'].flatten(), np.array([1.0, 1.0]), decimal=2)
def test_optimise_custom_function_linear_ineq_con2(self): n = 2 N = 20 X = np.random.uniform(-1.0, 1.0, (N, n)) f = self.ObjFun1(X) fparam = eq.Parameter(distribution='uniform', lower=-1., upper=1., order=self.degf) fParameters = [fparam for i in range(n)] myBasis = eq.Basis('total-order') fpoly = eq.Poly(fParameters, myBasis, method='least-squares', sampling_args={ 'mesh': 'user-defined', 'sample-points': X, 'sample-outputs': f }) fpoly.set_model() for method in ['COBYLA', 'SLSQP', 'trust-constr']: Opt = eq.Optimisation(method=method) Opt.add_objective(poly=fpoly) Opt.add_linear_ineq_con(np.eye(n), -np.ones(n), np.inf * np.ones(n)) x0 = np.random.uniform(-1.0, 1.0, n) sol = Opt.optimise(x0) if sol['status'] == 0: np.testing.assert_almost_equal(sol['x'].flatten(), np.array([1.0, 1.0]), decimal=3)
def eval_poly(x, lower, upper, coeffs, W): mybasis = eq.Basis("total-order") param = eq.Parameter(distribution='uniform', lower=lower, upper=upper, order=2) newpoly = eq.Poly(param, mybasis, method='least-squares') newpoly._set_coefficients(user_defined_coefficients=coeffs) u = x @ W ypred = newpoly.get_polyfit(u) return ypred
def test_optimise_ineq_constrained_function1(self): n = 2 N = 20 bounds = [-np.inf, 2.0] X = np.random.uniform(-1.0, 1.0, (N, n)) # Function values for f and Poly object f = self.ObjFun(X) fparam = eq.Parameter(distribution='uniform', lower=-1., upper=1., order=self.degf) fParameters = [fparam for i in range(n)] myBasis = eq.Basis('total-order') fpoly = eq.Poly(fParameters, myBasis, method='least-squares', sampling_args={ 'sample-points': X, 'sample-outputs': f }) fpoly.set_model() g1Func = lambda x: bounds[1] - self.ConFun1(x.reshape(1, -1)) g1Grad = lambda x: -self.ConFun1_Deriv(x.flatten()) g1Hess = lambda x: -self.ConFun1_Hess(x.flatten()) for method in ['trust-constr', 'SLSQP']: Opt = eq.Optimisation(method=method) Opt.add_objective(poly=fpoly) Opt.add_nonlinear_ineq_con( custom={ 'function': g1Func, 'jac_function': g1Grad, 'hess_function': g1Hess }) Opt.add_linear_eq_con(np.eye(n), np.ones(n)) x0 = np.zeros(n) sol = Opt.optimise(x0) if sol['status'] == 0: np.testing.assert_almost_equal(sol['x'].flatten(), np.array([1.0, 1.0]), decimal=2)
def display_active_plot(clickData,airfoil_data,var): # Sufficient summary plot layout1={"xaxis": {"title": r'$\mathbf{W}^T\mathbf{x}$'}, "yaxis": {"title": var_name[var]},'margin':{'t':0,'r':0,'l':0,'b':60}, 'paper_bgcolor':'white','plot_bgcolor':'white','autosize':True} fig1 = go.Figure(layout=layout1) fig1.update_xaxes(color='black',linecolor='black',showline=True,tickcolor='black',ticks='outside') fig1.update_yaxes(color='black',linecolor='black',showline=True,tickcolor='black',ticks='outside') # W projection plot layout2={'margin':dict(t=0,r=0,l=0,b=0,pad=0),'showlegend':False,"xaxis": {"title": r'$x/C$'}, "yaxis": {"title": r'$y/C$'}, 'paper_bgcolor':'white','plot_bgcolor':'white','autosize':True}#,'height':350} fig2 = go.Figure(layout=layout2) fig2.update_xaxes(title=r'$x/C$',range=[-0.02,1.02],showgrid=True, zeroline=False, visible=True,gridcolor='rgba(0,0,0,0.2)',showline=True,linecolor='black') fig2.update_yaxes(scaleanchor = "x", scaleratio = 1, showgrid=False, showticklabels=False, zeroline=False, visible=False) fig2.add_trace(go.Scatter(x=base_airfoil[:,0],y=base_airfoil[:,1],mode='lines',line_width=4,line_color='black')) if clickData is not None: pointdata = clickData['points'][0] if "pointIndex" in pointdata: #check click event corresponds to the point cloud # Get point info n = pointdata['pointIndex'] xn = pointdata['x'] yn = pointdata['y'] w = W[pts][n,var,:,:] # Summary plot ############## # Plot training design Yn = Y[n,:,var] u = (X @ w).flatten() fig1.add_trace(go.Scatter(x=u,y=Yn,mode='markers',name='Training designs', marker=dict(color='LightSkyBlue',size=15,opacity=0.5,line=dict(color='black',width=1)) )) design_vec = airfoil_data['design-vec'] # Set poly mybasis = eq.Basis("total-order") param = eq.Parameter(distribution='uniform', lower=lowers[pts][n,var],upper=uppers[pts][n,var],order=2) newpoly = eq.Poly(param, mybasis, method='least-squares') newpoly._set_coefficients(user_defined_coefficients=coeffs[pts][n,var,:]) # Plot poly u_poly = np.linspace(np.min(u)-0.25,np.max(u)+0.25,50) Y_poly = newpoly.get_polyfit(u_poly.reshape(-1,1)) fig1.add_trace(go.Scatter(x=u_poly,y=Y_poly.squeeze(),mode='lines',name='Ridge approximation',line_width=4,line_color='black' )) # Plot deformed design u_design = design_vec @ w Y_design = newpoly.get_polyfit(u_design) fig1.add_trace(go.Scatter(x=u_design.squeeze(),y=Y_design.squeeze(),mode='markers',name='Deformed design', marker=dict(symbol='circle-open',color='firebrick',size=25,line=dict(width=5)) )) # W projection plot ################### # Split into suction and pressure scale = 0.2 wp = -w[0::2,0]*scale ws = w[1::2,0]*scale x_bumps = np.linspace(0.05,0.9,25) airfoilp = base_airfoil[:128,:] airfoils = base_airfoil[128:,:] yp = np.interp(x_bumps, airfoilp[::-1,0], airfoilp[::-1,1]) ys = np.interp(x_bumps, airfoils[:,0], airfoils[:,1]) # Pressure fig2.add_trace(go.Scatter(x=x_bumps,y=yp,mode='lines',line_width=1,line_color='black')) # plot hidden line to use with fill=tonexty below fig2.add_trace(go.Scatter(x=x_bumps,y=yp+wp,mode='lines',line_width=4,line_color='LightSalmon',fill='tonexty',fillcolor='rgba(255,160,122, 0.3)')) # Suction fig2.add_trace(go.Scatter(x=x_bumps,y=ys,mode='lines',line_width=1,line_color='black')) # plot hidden line to use with fill=tonexty below fig2.add_trace(go.Scatter(x=x_bumps,y=ys+ws,mode='lines',line_width=4,line_color='LightSkyBlue',fill='tonexty',fillcolor='rgba(135,206,250, 0.3)')) # Pressure annotation fig2.add_annotation(x=x_bumps[-4],y=yp[-4]+wp[-4],text='Pressure surface deformation',xanchor='right',ax=-50,ay=85,font={'size':14,'color':'LightSalmon'},valign='bottom',showarrow=True,arrowhead=3,arrowsize=2,arrowcolor='LightSalmon') # Suction annotation fig2.add_annotation(x=x_bumps[3],y=ys[3]+ws[3],text='Suction surface deformation',xanchor='left',ax=50,ay=-90,font={'size':14,'color':'LightSkyBlue'},valign='top',showarrow=True,arrowhead=3,arrowsize=2,arrowcolor='LightSkyBlue') return fig1, fig2