99
1010import pysensors as ps
1111from matplotlib .patches import Circle
12+ from pydmd import DMD
1213
1314
1415class GQR (QR ):
@@ -80,11 +81,11 @@ def fit(
8081 max_const_sensors = len (self .constrainedIndices ) #Maximum number of sensors allowed in the constrained region
8182
8283 ## Assertions and checks:
83- if self .nSensors > n_features - max_const_sensors + self .nConstrainedSensors :
84- raise IOError ("n_sensors cannot be larger than n_features - all possible locations in the constrained area + allowed constrained sensors" )
85- if self .nSensors > n_samples + self .nConstrainedSensors : ## Handling zero constraint?
86- raise IOError ("Currently n_sensors should be less than min(number of samples, number of modes) + number of constrained sensors,\
87- got: n_sensors = {}, n_samples + const_sensors = {} + {} = {}" .format (self .nSensors ,n_samples ,self .nConstrainedSensors ,n_samples + self .nConstrainedSensors ))
84+ # if self.nSensors > n_features - max_const_sensors + self.nConstrainedSensors:
85+ # raise IOError ("n_sensors cannot be larger than n_features - all possible locations in the constrained area + allowed constrained sensors")
86+ # if self.nSensors > n_samples + self.nConstrainedSensors: ## Handling zero constraint?
87+ # raise IOError ("Currently n_sensors should be less than min(number of samples, number of modes) + number of constrained sensors,\
88+ # got: n_sensors = {}, n_samples + const_sensors = {} + {} = {}".format(self.nSensors,n_samples,self.nConstrainedSensors,n_samples+self.nConstrainedSensors))
8889
8990 # Initialize helper variables
9091 R = basis_matrix .conj ().T .copy ()
@@ -189,22 +190,38 @@ def plot_gallery(title, images, n_col=n_col, n_row=n_row, cmap=plt.cm.gray):
189190 #Find all sensor locations using built in QR optimizer
190191 #max_const_sensors = 230
191192 n_const_sensors = 3
192- n_sensors = 30
193- n_modes = 50
193+ n_sensors = 10
194+ n_modes = 40
194195 r = 5
195- basis = ps .basis .SVD (n_basis_modes = n_modes )
196- optimizer = ps .optimizers .QR ()
197- model = ps .SSPOR (basis = basis , optimizer = optimizer , n_sensors = n_sensors )
198- model .fit (X )
199-
200- all_sensors = model .get_all_sensors ()
201-
196+ dmd = DMD (svd_rank = 0 ,exact = True ,opt = False )
197+ dmd .fit (X .T )
198+ U = dmd .modes .real
199+ np .shape (U )
200+ max_basis_modes = 200
201+
202+ model_dmd_unconstrained = ps .SSPOR (n_sensors = n_sensors , basis = ps .basis .Custom (n_basis_modes = n_modes , U = U ))
203+ model_dmd_unconstrained .fit (X )
204+ basis_matrix_dmd = model_dmd_unconstrained .basis_matrix_
205+
206+ all_sensors_dmd_unconstrained = model_dmd_unconstrained .get_all_sensors ()
207+ top_sensors_dmd_unconstrained = model_dmd_unconstrained .get_selected_sensors ()
208+ optimality_dmd = ps .utils ._validation .determinant (top_sensors_dmd_unconstrained , n_features , basis_matrix_dmd )
209+ # print(optimality0)
210+ # basis = ps.basis.SVD(n_basis_modes=n_modes)
211+ # optimizer = ps.optimizers.QR()
212+ # model = ps.SSPOR(basis = basis, optimizer=optimizer, n_sensors=n_sensors)
213+ # model.fit(X)
214+ # top_sensors0 = model.get_selected_sensors()
215+ # all_sensors = model.get_all_sensors()
216+ # basis_matrix0 = model.basis_matrix_
217+ # optimality0 = ps.utils._validation.determinant(top_sensors0, n_features, basis_matrix0)
218+ # print(optimality0)
202219 ##Constrained sensor location on the grid:
203220 xmin = 0
204221 xmax = 64
205222 ymin = 10
206223 ymax = 30
207- sensors_constrained = ps .utils ._constraints .get_constraind_sensors_indices (xmin ,xmax ,ymin ,ymax ,nx ,ny ,all_sensors ) #Constrained column indices
224+ sensors_constrained = ps .utils ._constraints .get_constraind_sensors_indices (xmin ,xmax ,ymin ,ymax ,nx ,ny ,all_sensors_dmd_unconstrained ) #Constrained column indices
208225 # didx = np.isin(all_sensors,sensors_constrained,invert=False)
209226 # const_index = np.nonzero(didx)
210227 # j =
@@ -224,37 +241,49 @@ def plot_gallery(title, images, n_col=n_col, n_row=n_row, cmap=plt.cm.gray):
224241 # plt.title('Constrained region');
225242
226243 ## Fit the dataset with the optimizer GQR
227- optimizer1 = GQR (sensors_constrained ,n_sensors ,n_const_sensors ,all_sensors , constraint_option = "radii_constraints" ,nx = nx , ny = ny , r = r )
228- model1 = ps .SSPOR (basis = basis , optimizer = optimizer1 , n_sensors = n_sensors )
229- model1 .fit (X )
230- all_sensors1 = model1 .get_all_sensors ()
244+ # optimizer1 = GQR(sensors_constrained,n_sensors,n_const_sensors,all_sensors, constraint_option = "max_n_const_sensors",nx = nx, ny = ny, r = r)
245+ # model1 = ps.SSPOR(basis = basis, optimizer = optimizer1, n_sensors = n_sensors)
246+ # model1.fit(X)
247+ # all_sensors1 = model1.get_all_sensors()
248+ # basis_matrix = model1.basis_matrix_
249+ # top_sensors = model1.get_selected_sensors()
250+ # print(top_sensors)
251+ # optimality = ps.utils._validation.determinant(top_sensors, n_features, basis_matrix)
252+ # print(optimality)
253+ optimizer_dmd_constrained = ps .optimizers .GQR (sensors_constrained ,n_sensors ,n_const_sensors ,all_sensors_dmd_unconstrained ,constraint_option = "exact_n_const_sensors" ,nx = nx , ny = ny , r = r )
254+ model_dmd_constrained = ps .SSPOR (n_sensors = n_sensors , basis = ps .basis .Custom (n_basis_modes = n_modes , U = U ), optimizer = optimizer_dmd_constrained )
255+ model_dmd_constrained .fit (X )
256+ all_sensors_dmd_constrained = model_dmd_constrained .get_all_sensors ()
257+
258+ top_sensors_dmd_constrained = model_dmd_constrained .get_selected_sensors ()
259+ basis_matrix_dmd_constrained = model_dmd_constrained .basis_matrix_
260+ optimality = ps .utils ._validation .determinant (top_sensors_dmd_constrained , n_features , basis_matrix_dmd_constrained )
261+ # print(optimality)
231262
232- top_sensors = model1 .get_selected_sensors ()
233- print (top_sensors )
234263 ## TODO: this can be done using ravel and unravel more elegantly
235264 #yConstrained = np.floor(top_sensors[:n_const_sensors]/np.sqrt(n_features))
236265 #xConstrained = np.mod(top_sensors[:n_const_sensors],np.sqrt(n_features))
237266
267+ img = np .zeros (n_features )
268+ img [top_sensors_dmd_constrained ] = 16
269+ #plt.plot(xConstrained,yConstrained,'*r')
270+ plt .plot ([xmin ,xmin ],[ymin ,ymax ],'r' )
271+ plt .plot ([xmin ,xmax ],[ymax ,ymax ],'r' )
272+ plt .plot ([xmax ,xmax ],[ymin ,ymax ],'r' )
273+ plt .plot ([xmin ,xmax ],[ymin ,ymin ],'r' )
274+ plt .imshow (img .reshape (image_shape ),cmap = plt .cm .binary )
275+ plt .title ('n_sensors = {}, n_constr_sensors = {}' .format (n_sensors ,n_const_sensors ))
276+ plt .show ()
277+
238278 # img = np.zeros(n_features)
239279 # img[top_sensors] = 16
240- # #plt.plot(xConstrained,yConstrained,'*r')
241- # plt.plot([xmin,xmin],[ymin,ymax],'r')
242- # plt.plot([xmin,xmax],[ymax,ymax],'r')
243- # plt.plot([xmax,xmax],[ymin,ymax],'r')
244- # plt.plot([xmin,xmax],[ymin,ymin],'r')
245- # plt.imshow(img.reshape(image_shape),cmap=plt.cm.binary)
246- # plt.title('n_sensors = {}, n_constr_sensors = {}'.format(n_sensors,n_const_sensors))
280+ # fig,ax = plt.subplots(1)
281+ # ax.set_aspect('equal')
282+ # ax.imshow(img.reshape(image_shape),cmap=plt.cm.binary)
283+ # print(top_sensors)
284+ # top_sensors_grid = np.unravel_index(top_sensors, (nx,ny))
285+ # # figure, axes = plt.subplots()
286+ # for i in range(len(top_sensors_grid[0])):
287+ # circ = Circle( (top_sensors_grid[1][i], top_sensors_grid[0][i]), r ,color='r',fill = False )
288+ # ax.add_patch(circ)
247289 # plt.show()
248-
249- img = np .zeros (n_features )
250- img [top_sensors ] = 16
251- fig ,ax = plt .subplots (1 )
252- ax .set_aspect ('equal' )
253- ax .imshow (img .reshape (image_shape ),cmap = plt .cm .binary )
254- print (top_sensors )
255- top_sensors_grid = np .unravel_index (top_sensors , (nx ,ny ))
256- # figure, axes = plt.subplots()
257- for i in range (len (top_sensors_grid [0 ])):
258- circ = Circle ( (top_sensors_grid [1 ][i ], top_sensors_grid [0 ][i ]), r ,color = 'r' ,fill = False )
259- ax .add_patch (circ )
260- plt .show ()
0 commit comments