Skip to content

Commit 5671ebb

Browse files
Niharika KarnikNiharika Karnik
authored andcommitted
Modifying radii_constraints code and gqr now works as a script for radii constraints
1 parent f434583 commit 5671ebb

File tree

2 files changed

+125
-107
lines changed

2 files changed

+125
-107
lines changed

pysensors/optimizers/_gqr.py

Lines changed: 76 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import numpy as np
2+
import pysensors
23

34
from pysensors.optimizers._qr import QR
45

@@ -110,17 +111,18 @@ def fit(
110111
i_piv = np.argmax(dlens_updated)
111112
dlen = dlens_updated[i_piv]
112113
elif self.constraint_option == "radii_constraints":
113-
if j == 0:
114-
dlens_old = dlens
114+
115+
if j == 0:
115116
i_piv = np.argmax(dlens)
116117
dlen = dlens[i_piv]
118+
dlens_old = dlens
117119
else:
118120

119-
dlens_updated = ps.utils._norm_calc.f_radii_constraint(j,dlens,dlens_old,p,self._nx,self._ny,self._r) #( self.radius,self._nx,self._ny,self.all_sensorloc,dlens,p,j)
121+
dlens_updated = ps.utils._norm_calc.f_radii_constraint(j,dlens,dlens_old,p,self._nx,self._ny,self._r,self.all_sensorloc, self.nSensors) #( self.radius,self._nx,self._ny,self.all_sensorloc,dlens,p,j)
120122
i_piv = np.argmax(dlens_updated)
121123
dlen = dlens_updated[i_piv]
122124
dlens_old = dlens_updated
123-
125+
124126
# Choose pivot
125127
# i_piv = np.argmax(dlens_updated)
126128

@@ -146,30 +148,30 @@ def fit(
146148
R[j + 1 :, j] = 0
147149

148150
self.pivots_ = p
149-
self.optimality = np.trace(np.real(R))
150-
print("The trace(R) = {}".format(self.optimality))
151-
151+
152152
return self
153153

154154
if __name__ == '__main__':
155155
faces = datasets.fetch_olivetti_faces(shuffle=True)
156156
X = faces.data
157157

158-
n_samples, n_features = X.shape
158+
# n_samples, n_features = X.shape
159+
X_small = X[:,:256]
160+
n_samples, n_features = X_small.shape
159161
print('Number of samples:', n_samples)
160162
print('Number of features (sensors):', n_features)
161163

162164
# Global centering
163-
X = X - X.mean(axis=0)
165+
X_small = X_small - X_small.mean(axis=0)
164166

165167
# Local centering
166-
X -= X.mean(axis=1).reshape(n_samples, -1)
168+
X_small -= X_small.mean(axis=1).reshape(n_samples, -1)
167169

168170
n_row, n_col = 2, 3
169171
n_components = n_row * n_col
170-
image_shape = (64, 64)
171-
nx = 64
172-
ny = 64
172+
image_shape = (16, 16)
173+
nx = 16
174+
ny = 16
173175

174176
def plot_gallery(title, images, n_col=n_col, n_row=n_row, cmap=plt.cm.gray):
175177
'''Function for plotting faces'''
@@ -190,29 +192,29 @@ def plot_gallery(title, images, n_col=n_col, n_row=n_row, cmap=plt.cm.gray):
190192
#Find all sensor locations using built in QR optimizer
191193
#max_const_sensors = 230
192194
n_const_sensors = 3
193-
n_sensors = 10
195+
n_sensors = 4
194196
n_modes = 40
195-
r = 5
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)
197+
r = 2
198+
# dmd = DMD(svd_rank=0,exact=True,opt=False)
199+
# dmd.fit(X.T)
200+
# U = dmd.modes.real
201+
# np.shape(U)
202+
# max_basis_modes = 200
203+
204+
# model_dmd_unconstrained = ps.SSPOR(n_sensors=n_sensors, basis=ps.basis.Custom(n_basis_modes=n_modes, U=U))
205+
# model_dmd_unconstrained.fit(X)
206+
# basis_matrix_dmd = model_dmd_unconstrained.basis_matrix_
207+
208+
# all_sensors_dmd_unconstrained = model_dmd_unconstrained.get_all_sensors()
209+
# top_sensors_dmd_unconstrained = model_dmd_unconstrained.get_selected_sensors()
210+
# optimality_dmd = ps.utils._validation.determinant(top_sensors_dmd_unconstrained, n_features, basis_matrix_dmd)
209211
# 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()
212+
#basis = ps.basis.SVD(n_basis_modes=n_modes)
213+
optimizer = ps.optimizers.QR()
214+
model = ps.SSPOR(optimizer=optimizer, n_sensors=n_sensors)
215+
model.fit(X_small)
216+
top_sensors0 = model.get_selected_sensors()
217+
all_sensors = model.get_all_sensors()
216218
# basis_matrix0 = model.basis_matrix_
217219
# optimality0 = ps.utils._validation.determinant(top_sensors0, n_features, basis_matrix0)
218220
# print(optimality0)
@@ -221,10 +223,11 @@ def plot_gallery(title, images, n_col=n_col, n_row=n_row, cmap=plt.cm.gray):
221223
xmax = 64
222224
ymin = 10
223225
ymax = 30
224-
sensors_constrained = ps.utils._constraints.get_constraind_sensors_indices(xmin,xmax,ymin,ymax,nx,ny,all_sensors_dmd_unconstrained) #Constrained column indices
226+
sensors_constrained = ps.utils._constraints.get_constraind_sensors_indices(xmin,xmax,ymin,ymax,nx,ny,all_sensors) #Constrained column indices
225227
# didx = np.isin(all_sensors,sensors_constrained,invert=False)
226228
# const_index = np.nonzero(didx)
227229
# j =
230+
228231

229232

230233
##Plotting the constrained region
@@ -241,49 +244,51 @@ def plot_gallery(title, images, n_col=n_col, n_row=n_row, cmap=plt.cm.gray):
241244
# plt.title('Constrained region');
242245

243246
## Fit the dataset with the optimizer GQR
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)
247+
optimizer1 = GQR(sensors_constrained,n_sensors,n_const_sensors,all_sensors, constraint_option = "radii_constraints",nx = nx, ny = ny, r = r)
248+
model1 = ps.SSPOR( optimizer = optimizer1, n_sensors = n_sensors)
249+
model1.fit(X_small)
250+
all_sensors1 = model1.get_all_sensors()
251+
basis_matrix = model1.basis_matrix_
252+
top_sensors = model1.get_selected_sensors()
253+
print(top_sensors)
251254
# optimality = ps.utils._validation.determinant(top_sensors, n_features, basis_matrix)
252255
# 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)
256+
# 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)
257+
# model_dmd_constrained = ps.SSPOR(n_sensors=n_sensors, basis=ps.basis.Custom(n_basis_modes=n_modes, U=U), optimizer = optimizer_dmd_constrained)
258+
# model_dmd_constrained.fit(X)
259+
# all_sensors_dmd_constrained = model_dmd_constrained.get_all_sensors()
260+
261+
# top_sensors_dmd_constrained = model_dmd_constrained.get_selected_sensors()
262+
# basis_matrix_dmd_constrained = model_dmd_constrained.basis_matrix_
263+
# optimality = ps.utils._validation.determinant(top_sensors_dmd_constrained, n_features, basis_matrix_dmd_constrained)
261264
# print(optimality)
262265

263266
## TODO: this can be done using ravel and unravel more elegantly
264267
#yConstrained = np.floor(top_sensors[:n_const_sensors]/np.sqrt(n_features))
265268
#xConstrained = np.mod(top_sensors[:n_const_sensors],np.sqrt(n_features))
266269

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-
278270
# img = np.zeros(n_features)
279-
# img[top_sensors] = 16
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)
271+
# img[top_sensors_dmd_constrained] = 16
272+
# #plt.plot(xConstrained,yConstrained,'*r')
273+
# plt.plot([xmin,xmin],[ymin,ymax],'r')
274+
# plt.plot([xmin,xmax],[ymax,ymax],'r')
275+
# plt.plot([xmax,xmax],[ymin,ymax],'r')
276+
# plt.plot([xmin,xmax],[ymin,ymin],'r')
277+
# plt.imshow(img.reshape(image_shape),cmap=plt.cm.binary)
278+
# plt.title('n_sensors = {}, n_constr_sensors = {}'.format(n_sensors,n_const_sensors))
289279
# plt.show()
280+
281+
img = np.zeros(n_features)
282+
img[top_sensors] = 16
283+
fig,ax = plt.subplots(1)
284+
ax.set_aspect('equal')
285+
ax.imshow(img.reshape(image_shape),cmap=plt.cm.binary)
286+
print(top_sensors)
287+
top_sensors_grid = np.unravel_index(top_sensors, (nx,ny))
288+
# figure, axes = plt.subplots()
289+
for i in range(len(top_sensors_grid[0])):
290+
circ = Circle( (top_sensors_grid[1][i], top_sensors_grid[0][i]), r ,color='r',fill = False )
291+
ax.add_patch(circ)
292+
plt.show()
293+
294+

pysensors/utils/_norm_calc.py

Lines changed: 49 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -109,48 +109,61 @@ def predetermined_norm_calc(lin_idx, dlens, piv, j, n_const_sensors, n_sensors):
109109
dlens[didx] = 0
110110
return dlens
111111

112-
def f_radii_constraint(j,dlens,dlens_old,piv,nx,ny,r):
113-
a = np.unravel_index(piv, (nx,ny))
114-
n_features = len(piv)
112+
def f_radii_constraint(j,dlens,dlens_old,piv,nx,ny,r, all_sensors, n_sensors):
115113
if j == 1:
116-
x_cord = a[0][j-1]
117-
y_cord = a[1][j-1]
118-
#print(x_cord, y_cord)
119-
constrained_sensorsx = []
120-
constrained_sensorsy = []
121-
for i in range(n_features):
122-
if ((a[0][i]-x_cord)**2 + (a[1][i]-y_cord)**2) < r**2:
123-
constrained_sensorsx.append(a[0][i])
124-
constrained_sensorsy.append(a[1][i])
125-
constrained_sensorsx = np.array(constrained_sensorsx)
126-
constrained_sensorsy = np.array(constrained_sensorsy)
127-
constrained_sensors_array = np.stack((constrained_sensorsy, constrained_sensorsx), axis=1)
128-
constrained_sensors_tuple = np.transpose(constrained_sensors_array)
129-
idx_constrained = np.ravel_multi_index(constrained_sensors_tuple, (nx,ny))
130-
# print(idx_constrained)
114+
idx_constrained = get_constraind_sensors_indices_radii(j,piv,r, nx,ny, all_sensors)
115+
print(idx_constrained)
131116
didx = np.isin(piv[j:],idx_constrained,invert= False)
132117
dlens[didx] = 0
133118
return dlens
134-
else:
119+
else:
135120
result = np.where(dlens_old == 0)[0]
136121
result_list = result.tolist()
137-
result_list = [x - 1 for x in result_list]
122+
result_list = [x + (j-1) for x in result_list]
138123
result_array = np.array(result_list)
139-
x_cord = a[0][j-1]
140-
y_cord = a[1][j-1]
141-
#print(x_cord, y_cord)
142-
constrained_sensorsx = []
143-
constrained_sensorsy = []
144-
for i in range(n_features):
145-
if ((a[0][i]-x_cord)**2 + (a[1][i]-y_cord)**2) < r**2:
146-
constrained_sensorsx.append(a[0][i])
147-
constrained_sensorsy.append(a[1][i])
148-
constrained_sensorsx = np.array(constrained_sensorsx)
149-
constrained_sensorsy = np.array(constrained_sensorsy)
150-
constrained_sensors_array = np.stack((constrained_sensorsy, constrained_sensorsx), axis=1)
151-
constrained_sensors_tuple = np.transpose(constrained_sensors_array)
152-
idx_constrained = np.ravel_multi_index(constrained_sensors_tuple, (nx,ny))
153-
t = np.concatenate((idx_constrained,result_array), axis = 0)
124+
print(result_array)
125+
126+
idx_constrained1 = get_constraind_sensors_indices_radii(j,piv,r, nx,ny, all_sensors)
127+
t = np.concatenate((idx_constrained1,result_array), axis = 0)
154128
didx = np.isin(piv[j:],t,invert= False)
155129
dlens[didx] = 0
156-
return dlens
130+
return dlens
131+
132+
def get_constraind_sensors_indices_radii(j,piv,r, nx,ny, all_sensors):
133+
"""
134+
Function for mapping constrained sensor locations on the grid with the column indices of the basis_matrix.
135+
136+
Parameters
137+
----------
138+
all_sensors : np.ndarray, shape [n_features]
139+
Ranked list of sensor locations.
140+
141+
Returns
142+
-------
143+
idx_constrained : np.darray, shape [No. of constrained locations]
144+
Array which contains the constrained locationsof the grid in terms of column indices of basis_matrix.
145+
"""
146+
n_features = len(all_sensors)
147+
image_size = int(np.sqrt(n_features))
148+
a = np.unravel_index(piv, (nx,ny))
149+
t = np.unravel_index(all_sensors, (nx,ny))
150+
x_cord = a[0][j-1]
151+
y_cord = a[1][j-1]
152+
#print(x_cord,y_cord)
153+
constrained_sensorsx = []
154+
constrained_sensorsy = []
155+
for i in range(n_features):
156+
if ((t[0][i]-x_cord)**2 + (t[1][i]-y_cord)**2) < r**2:
157+
constrained_sensorsx.append(t[0][i])
158+
constrained_sensorsy.append(t[1][i])
159+
160+
constrained_sensorsx = np.array(constrained_sensorsx)
161+
constrained_sensorsy = np.array(constrained_sensorsy)
162+
constrained_sensors_array = np.stack((constrained_sensorsx, constrained_sensorsy), axis=1)
163+
constrained_sensors_tuple = np.transpose(constrained_sensors_array)
164+
if len(constrained_sensorsx) == 0: ##Check to handle condition when number of sensors in the constrained region = 0
165+
idx_constrained = []
166+
else:
167+
idx_constrained = np.ravel_multi_index(constrained_sensors_tuple, (nx,ny))
168+
return idx_constrained
169+

0 commit comments

Comments
 (0)