Skip to content
Snippets Groups Projects
Commit 04990551 authored by Anton Kullberg's avatar Anton Kullberg
Browse files

py: vectorized likelihood matrix evaluation

parent 7448e41c
No related branches found
No related tags found
No related merge requests found
...@@ -196,14 +196,23 @@ class GNN(): ...@@ -196,14 +196,23 @@ class GNN():
# Entry for new targets # Entry for new targets
np.fill_diagonal(association_matrix[:, Nc+ny:], np.log(self.logic_params['Bnt'])) np.fill_diagonal(association_matrix[:, Nc+ny:], np.log(self.logic_params['Bnt']))
for ti, track in enumerate(tracks): # Iterate over confirmed tracks if tracks:
validation_matrix[:, ti] = self.gater.gate(track['x'][-1], track['P'][-1], meas) # All of the tracks are assumed to use the same sensor model!
# Entry for validated tracks x = np.vstack([track['x'][-1] for track in tracks]).T
val_meas = meas[:, validation_matrix[:, ti]] # Get the validated measurements for this track yhat_t = tracks[0]['filt'].sensor_model['h'](x) # Returns a (ny x nx) matrix
yhat = track['filt'].sensor_model['h'](track['x'][-1]) # Calculate the predicted measurement for this track H_t = tracks[0]['filt'].sensor_model['dhdx'](x) # Returns a (ny x nC x nx x nC) tensor
H = track['filt'].sensor_model['dhdx'](track['x'][-1]) for ti, track in enumerate(tracks): # Iterate over confirmed tracks
py = stats.multivariate_normal.pdf(val_meas.squeeze().T, mean=yhat.flatten(), cov=H@track['P'][-1]@H.T+track['filt'].sensor_model['R']) validation_matrix[:, ti] = self.gater.gate(track['x'][-1], track['P'][-1], meas)
association_matrix[validation_matrix[:, ti], ti] = np.log(track['filt'].sensor_model['PD']*py/(1-track['filt'].sensor_model['PD'])) # PG assumed = 1 if validation_matrix[:, ti].any(): # If any measurements are validated
val_meas = meas[:, validation_matrix[:, ti]] # Get the validated measurements for this track
if Nc == 1: # Because of how numpy handles its matrices
yhat = yhat_t
H = H_t.squeeze()
else:
yhat = yhat_t[:, ti]
H = H_t[:, ti, :, ti]
py = stats.multivariate_normal.pdf(val_meas.squeeze().T, mean=yhat.flatten(), cov=H@track['P'][-1]@H.T+track['filt'].sensor_model['R'])
association_matrix[validation_matrix[:, ti], ti] = np.log(track['filt'].sensor_model['PD']*py/(1-track['filt'].sensor_model['PD'])) # PG assumed = 1
return association_matrix, validation_matrix return association_matrix, validation_matrix
def _update_track(self, meas, track): def _update_track(self, meas, track):
...@@ -387,16 +396,26 @@ class JPDA(): ...@@ -387,16 +396,26 @@ class JPDA():
validation_matrix = np.zeros((Nc, ny+1), dtype=bool) validation_matrix = np.zeros((Nc, ny+1), dtype=bool)
validation_matrix[:, 0] = 1 validation_matrix[:, 0] = 1
likelihood_matrix = np.zeros((Nc, ny+1)) likelihood_matrix = np.zeros((Nc, ny+1))
likelihood_matrix[:, 0] = 1-tracks[0]['filt'].sensor_model['PD'] # PG assumed 1
for ti, track in enumerate(tracks): # Iterate over confirmed tracks if tracks:
validation_matrix[ti, 1:] = self.gater.gate(track['x'][-1], track['P'][-1], meas) # All of the tracks are assumed to use the same sensor model!
# Entry for validated tracks x = np.vstack([track['x'][-1] for track in tracks]).T
val_meas = meas[:, validation_matrix[ti, 1:]] # Get the validated measurements for this track yhat_t = tracks[0]['filt'].sensor_model['h'](x) # Returns a (ny x nx) matrix
yhat = track['filt'].sensor_model['h'](track['x'][-1]) # Calculate the predicted measurement for this track H_t = tracks[0]['filt'].sensor_model['dhdx'](x) # Returns a (ny x nC x nx x nC) tensor
H = track['filt'].sensor_model['dhdx'](track['x'][-1]) for ti, track in enumerate(tracks): # Iterate over confirmed tracks
py = stats.multivariate_normal.pdf(val_meas.squeeze().T, mean=yhat.flatten(), cov=H@track['P'][-1]@H.T+track['filt'].sensor_model['R']) validation_matrix[ti, 1:] = self.gater.gate(track['x'][-1], track['P'][-1], meas)
likelihood_matrix[ti, np.where(validation_matrix[ti, 1:])[0]+1] = track['filt'].sensor_model['PD']*py # Entry for validated tracks
likelihood_matrix[ti, 0] = 1-track['filt'].sensor_model['PD'] # PG assumed 1 if validation_matrix[ti, 1:].any(): # If any measurements are validated
val_meas = meas[:, validation_matrix[ti, 1:]] # Get the validated measurements for this track
if Nc == 1: # Because of how numpy handles its matrices
yhat = yhat_t
H = H_t.squeeze()
else:
yhat = yhat_t[:, ti]
H = H_t[:, ti, :, ti]
py = stats.multivariate_normal.pdf(val_meas.squeeze().T, mean=yhat.flatten(), cov=H@track['P'][-1]@H.T+track['filt'].sensor_model['R'])
likelihood_matrix[ti, np.where(validation_matrix[ti, 1:])[0]+1] = track['filt'].sensor_model['PD']*py
return likelihood_matrix, validation_matrix return likelihood_matrix, validation_matrix
def _update_track(self, meas, track, association_probability): def _update_track(self, meas, track, association_probability):
...@@ -624,8 +643,12 @@ class MHT(): ...@@ -624,8 +643,12 @@ class MHT():
# Entry for validated tracks # Entry for validated tracks
if validation_matrix[:, ti].any(): # If any measurements are validated if validation_matrix[:, ti].any(): # If any measurements are validated
val_meas = meas[:, validation_matrix[:, ti]] # Get the validated measurements for this track val_meas = meas[:, validation_matrix[:, ti]] # Get the validated measurements for this track
yhat = yhat_t[:, ti] if Nc == 1: # Because of how numpy handles its matrices
H = H_t[:, ti, :, ti] yhat = yhat_t
H = H_t.squeeze()
else:
yhat = yhat_t[:, ti]
H = H_t[:, ti, :, ti]
py = stats.multivariate_normal.pdf(val_meas.squeeze().T, mean=yhat.flatten(), cov=H@track['P'][-1]@H.T+track['filt'].sensor_model['R']) py = stats.multivariate_normal.pdf(val_meas.squeeze().T, mean=yhat.flatten(), cov=H@track['P'][-1]@H.T+track['filt'].sensor_model['R'])
association_matrix[validation_matrix[:, ti], ti] = np.log(track['filt'].sensor_model['PD']*py/(1-track['filt'].sensor_model['PD'])) # PG assumed = 1 association_matrix[validation_matrix[:, ti], ti] = np.log(track['filt'].sensor_model['PD']*py/(1-track['filt'].sensor_model['PD'])) # PG assumed = 1
likelihood_matrix[validation_matrix[:, ti], ti] = track['filt'].sensor_model['PD']*py likelihood_matrix[validation_matrix[:, ti], ti] = track['filt'].sensor_model['PD']*py
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment