Skip to content

Commit 67d3bb8

Browse files
author
niharika2999
committed
Adding all updates
1 parent ab4bdbd commit 67d3bb8

File tree

2 files changed

+72
-43
lines changed

2 files changed

+72
-43
lines changed

pysensors/optimizers/_gqr.py

Lines changed: 70 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import pysensors as ps
1111
from matplotlib.patches import Circle
12+
from pydmd import DMD
1213

1314

1415
class 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()

pysensors/utils/_validation.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def determinant(top_sensors, n_features, basis_matrix):
2626
for i in range(len(top_sensors)):
2727
c[i,top_sensors[i]] = 1
2828
phi = basis_matrix
29-
optimality = np.linalg.det((c@phi).T @ (c@phi))
29+
optimality = np.linalg.det((c@phi).T @ (c@phi)) #np.log(np.linalg.det(phi.T @ c.T)) np.log(np.linalg.det((c@phi).T @ (c@phi)))
3030
return optimality
3131

3232
def relative_reconstruction_error(data, prediction):
@@ -44,5 +44,5 @@ def relative_reconstruction_error(data, prediction):
4444
error_val : Float,
4545
The relative error calculated.
4646
"""
47-
error_val = (np.linalg.norm((data - prediction)/(data)))*100
47+
error_val = (np.linalg.norm((data - prediction)/np.linalg.norm(data)))*100
4848
return (error_val)

0 commit comments

Comments
 (0)