src.acoustools.Optimise.Objectives

Objective Functions to be used in Solver.gradient_descent_solver Must have the signature (transducer_phases, points, board, targets, **objective_params) -> loss

  1'''
  2Objective Functions to be used in Solver.gradient_descent_solver
  3Must have the signature (transducer_phases, points, board, targets, **objective_params) -> loss
  4'''
  5
  6from acoustools.Utilities import propagate_abs, add_lev_sig
  7from acoustools.Gorkov import gorkov_analytical
  8from acoustools.BEM import propagate_BEM_pressure, BEM_gorkov_analytical
  9from acoustools.Optimise.Constraints import sine_amplitude
 10import torch
 11
 12from torch import Tensor
 13
 14def propagate_abs_sum_objective(transducer_phases: Tensor, points:Tensor, board:Tensor, targets:Tensor, **objective_params) -> Tensor:
 15    '''
 16    Sum of the pressure of points
 17    :param transducer_phases: Hologram
 18    :param points: Points
 19    :param board: Transducer board
 20    :param target: <Unused>
 21    '''
 22    return torch.sum(propagate_abs(transducer_phases,points,board),dim=1)
 23
 24def propagate_abs_sum_objective_BEM(transducer_phases: Tensor, points:Tensor, board:Tensor, targets:Tensor, **objective_params) -> Tensor:
 25    '''
 26    Sum of the pressure of points
 27    :param transducer_phases: Hologram
 28    :param points: Points
 29    :param board: Transducer board
 30    :param target: <Unused>
 31    '''
 32    E = objective_params['E']
 33    scatterer = objective_params['scatterer']
 34    return torch.sum(propagate_BEM_pressure(transducer_phases,points,scatterer,board,E=E),dim=1).squeeze_(0)
 35
 36
 37
 38def gorkov_analytical_sum_objective(transducer_phases: Tensor, points:Tensor, board:Tensor, targets:Tensor = None, **objective_params) -> Tensor:
 39    '''
 40    Sum of the Gor'kov potential of points
 41    :param transducer_phases: Hologram
 42    :param points: Points
 43    :param board: Transducer board
 44    :param target: <Unused>
 45    :param axis: axis to compute gor'kov potential in
 46    '''
 47    # transducer_phases = add_lev_sig(transducer_phases)
 48    
 49    axis = objective_params["axis"] if "axis" in objective_params else "XYZ"
 50    U = gorkov_analytical(transducer_phases, points, board, axis)
 51
 52    return torch.sum(U,dim=1).squeeze_(1)
 53
 54def gorkov_analytical_mean_objective(transducer_phases: Tensor, points:Tensor, board:Tensor, targets:Tensor, **objective_params) -> Tensor:
 55    '''
 56    Mean of the Gor'kov potential of points
 57    :param transducer_phases: Hologram
 58    :param points: Points
 59    :param board: Transducer board
 60    :param target: <Unused>
 61    :param axis: axis to compute gor'kov potential in
 62    '''
 63    
 64    axis = objective_params["axis"] if "axis" in objective_params else "XYZ"
 65    U = gorkov_analytical(transducer_phases, points, board, axis)
 66    return torch.mean(U,dim=1).squeeze_(1)
 67
 68def gorkov_analytical_std_mean_objective(transducer_phases: Tensor, points:Tensor, board:Tensor, targets:Tensor, **objective_params) -> Tensor:
 69    '''
 70    Weighted sum of of standard deviation and mean of Gor'kov potential at points. \n
 71    :param transducer_phases: Hologram
 72    :param points: Points
 73    :param board: Transducer board
 74    :param target: <Unused>
 75    :param w: relative weight of standard deviation and mean
 76    :param axis: axis to compute gor'kov potential in
 77    '''
 78    axis = objective_params["axis"] if "axis" in objective_params else "XYZ"
 79    U = gorkov_analytical(transducer_phases, points, board, axis)
 80    
 81    w = objective_params["w"] if "w" in objective_params else 1
 82
 83    return torch.mean(U,dim=1).squeeze(1) + w*torch.std(U,dim=1).squeeze(1)
 84
 85
 86def gorkov_trapping_stiffness_objective(transducer_phases: Tensor, points:Tensor, board:Tensor, targets:Tensor, **objective_params) -> Tensor:
 87    '''
 88    Objective from  Hirayama, R., Christopoulos, G., Martinez Plasencia, D., & Subramanian, S. (2022). \n
 89    High-speed acoustic holography with arbitrary scattering objects. \n
 90    In Sci. Adv (Vol. 8). https://doi.org/10.1126/sciadv.abn7614
 91    :param transducer_phases: Hologram
 92    :param points: Points
 93    :param board: Transducer board
 94    :param target: <Unused>
 95    :param w: relative weight of parts of objective
 96    :param axis: axis to compute gor'kov potential in
 97   
 98    '''
 99    t2 = add_lev_sig(transducer_phases)
100    axis = objective_params["axis"] if "axis" in objective_params else "XYZ"
101    w = objective_params["w"] if "w" in objective_params else 1e-4
102
103    U = gorkov_analytical(t2, points, board, axis)
104
105    return torch.sum(U + w*(torch.mean(U) - U)**2,dim=1).squeeze_(1)
106
107
108def pressure_abs_gorkov_trapping_stiffness_objective(transducer_phases: Tensor, points:Tensor, board:Tensor, targets:Tensor, **objective_params) -> Tensor:
109    '''
110    weighted sum of `gorkov_trapping_stiffness_objective` and `propagate_abs_sum_objective`
111    :param transducer_phases: Hologram
112    :param points: Points
113    :param board: Transducer board
114    :param target: <Unused>
115    :param alpha: relative weight of parts of objective
116    '''
117    Ul = gorkov_trapping_stiffness_objective(transducer_phases, points, board, targets, **objective_params)
118    pl = propagate_abs_sum_objective(transducer_phases, points, board, targets, **objective_params)
119
120    alpha = objective_params["alpha"] if "alpha" in objective_params else 1
121
122    return Ul + alpha*pl
123
124def target_pressure_mse_objective(transducer_phases: Tensor, points:Tensor, board:Tensor, targets:Tensor, **objective_params) -> Tensor:
125    '''
126    MSE error of target pressure and true pressure
127    :param transducer_phases: Hologram
128    :param points: Points
129    :param board: Transducer board
130    :param target:target pressure
131    '''
132    p = propagate_abs(transducer_phases, points,board=board)
133    l = torch.sum((p-targets)**2,dim=1)
134    return l
135
136def target_gorkov_mse_objective(transducer_phases: Tensor, points:Tensor, board:Tensor, targets:Tensor, **objective_params) -> Tensor:
137    '''
138    MSE error of target Gor'kov potential and true Gor'kov potential
139    :param transducer_phases: Hologram
140    :param points: Points
141    :param board: Transducer board
142    :param target: target gor'kov value
143    '''
144    # if "no_sig" not in objective_params:
145    #     t2 = add_lev_sig(transducer_phases)
146    # else:
147    #     t2 = transducer_phases
148    axis = objective_params["axis"] if "axis" in objective_params else "XYZ"
149    U = gorkov_analytical(transducer_phases, points, board, axis)
150    l = torch.mean((U-targets)**2,dim=1).squeeze_(1)
151    
152    return l
153
154def target_gorkov_BEM_mse_objective(transducer_phases, points, board, targets, **objective_params):
155    reflector = objective_params['reflector']
156    root = objective_params['root']
157    if 'dims' in objective_params:
158        dims = objective_params['dims']
159    else:
160        dims = 'XYZ'
161    U = BEM_gorkov_analytical(transducer_phases, points, reflector, board, path=root, dims=dims)
162    loss = torch.mean((targets-U)**2).unsqueeze_(0).real
163    return loss
164
165def target_gorkov_BEM_mse_sine_objective(transducer_phases, points, board, targets, **objective_params):
166    transducer_phases = sine_amplitude(transducer_phases)
167    reflector = objective_params['reflector']
168    root = objective_params['root']
169    E = objective_params["E"] if "E" in objective_params else None
170    if 'dims' in objective_params:
171        dims = objective_params['dims']
172    else:
173        dims = 'XYZ'
174    U = BEM_gorkov_analytical(transducer_phases, points, reflector, board, path=root, dims=dims, E=E)
175    loss = torch.mean((targets-U)**2).unsqueeze_(0).real
176    return loss
def propagate_abs_sum_objective( transducer_phases: torch.Tensor, points: torch.Tensor, board: torch.Tensor, targets: torch.Tensor, **objective_params) -> torch.Tensor:
15def propagate_abs_sum_objective(transducer_phases: Tensor, points:Tensor, board:Tensor, targets:Tensor, **objective_params) -> Tensor:
16    '''
17    Sum of the pressure of points
18    :param transducer_phases: Hologram
19    :param points: Points
20    :param board: Transducer board
21    :param target: <Unused>
22    '''
23    return torch.sum(propagate_abs(transducer_phases,points,board),dim=1)

Sum of the pressure of points

Parameters
  • transducer_phases: Hologram
  • points: Points
  • board: Transducer board
  • target:
def propagate_abs_sum_objective_BEM( transducer_phases: torch.Tensor, points: torch.Tensor, board: torch.Tensor, targets: torch.Tensor, **objective_params) -> torch.Tensor:
25def propagate_abs_sum_objective_BEM(transducer_phases: Tensor, points:Tensor, board:Tensor, targets:Tensor, **objective_params) -> Tensor:
26    '''
27    Sum of the pressure of points
28    :param transducer_phases: Hologram
29    :param points: Points
30    :param board: Transducer board
31    :param target: <Unused>
32    '''
33    E = objective_params['E']
34    scatterer = objective_params['scatterer']
35    return torch.sum(propagate_BEM_pressure(transducer_phases,points,scatterer,board,E=E),dim=1).squeeze_(0)

Sum of the pressure of points

Parameters
  • transducer_phases: Hologram
  • points: Points
  • board: Transducer board
  • target:
def gorkov_analytical_sum_objective( transducer_phases: torch.Tensor, points: torch.Tensor, board: torch.Tensor, targets: torch.Tensor = None, **objective_params) -> torch.Tensor:
39def gorkov_analytical_sum_objective(transducer_phases: Tensor, points:Tensor, board:Tensor, targets:Tensor = None, **objective_params) -> Tensor:
40    '''
41    Sum of the Gor'kov potential of points
42    :param transducer_phases: Hologram
43    :param points: Points
44    :param board: Transducer board
45    :param target: <Unused>
46    :param axis: axis to compute gor'kov potential in
47    '''
48    # transducer_phases = add_lev_sig(transducer_phases)
49    
50    axis = objective_params["axis"] if "axis" in objective_params else "XYZ"
51    U = gorkov_analytical(transducer_phases, points, board, axis)
52
53    return torch.sum(U,dim=1).squeeze_(1)

Sum of the Gor'kov potential of points

Parameters
  • transducer_phases: Hologram
  • points: Points
  • board: Transducer board
  • target:
  • axis: axis to compute gor'kov potential in
def gorkov_analytical_mean_objective( transducer_phases: torch.Tensor, points: torch.Tensor, board: torch.Tensor, targets: torch.Tensor, **objective_params) -> torch.Tensor:
55def gorkov_analytical_mean_objective(transducer_phases: Tensor, points:Tensor, board:Tensor, targets:Tensor, **objective_params) -> Tensor:
56    '''
57    Mean of the Gor'kov potential of points
58    :param transducer_phases: Hologram
59    :param points: Points
60    :param board: Transducer board
61    :param target: <Unused>
62    :param axis: axis to compute gor'kov potential in
63    '''
64    
65    axis = objective_params["axis"] if "axis" in objective_params else "XYZ"
66    U = gorkov_analytical(transducer_phases, points, board, axis)
67    return torch.mean(U,dim=1).squeeze_(1)

Mean of the Gor'kov potential of points

Parameters
  • transducer_phases: Hologram
  • points: Points
  • board: Transducer board
  • target:
  • axis: axis to compute gor'kov potential in
def gorkov_analytical_std_mean_objective( transducer_phases: torch.Tensor, points: torch.Tensor, board: torch.Tensor, targets: torch.Tensor, **objective_params) -> torch.Tensor:
69def gorkov_analytical_std_mean_objective(transducer_phases: Tensor, points:Tensor, board:Tensor, targets:Tensor, **objective_params) -> Tensor:
70    '''
71    Weighted sum of of standard deviation and mean of Gor'kov potential at points. \n
72    :param transducer_phases: Hologram
73    :param points: Points
74    :param board: Transducer board
75    :param target: <Unused>
76    :param w: relative weight of standard deviation and mean
77    :param axis: axis to compute gor'kov potential in
78    '''
79    axis = objective_params["axis"] if "axis" in objective_params else "XYZ"
80    U = gorkov_analytical(transducer_phases, points, board, axis)
81    
82    w = objective_params["w"] if "w" in objective_params else 1
83
84    return torch.mean(U,dim=1).squeeze(1) + w*torch.std(U,dim=1).squeeze(1)

Weighted sum of of standard deviation and mean of Gor'kov potential at points.

Parameters
  • transducer_phases: Hologram
  • points: Points
  • board: Transducer board
  • target:
  • w: relative weight of standard deviation and mean
  • axis: axis to compute gor'kov potential in
def gorkov_trapping_stiffness_objective( transducer_phases: torch.Tensor, points: torch.Tensor, board: torch.Tensor, targets: torch.Tensor, **objective_params) -> torch.Tensor:
 87def gorkov_trapping_stiffness_objective(transducer_phases: Tensor, points:Tensor, board:Tensor, targets:Tensor, **objective_params) -> Tensor:
 88    '''
 89    Objective from  Hirayama, R., Christopoulos, G., Martinez Plasencia, D., & Subramanian, S. (2022). \n
 90    High-speed acoustic holography with arbitrary scattering objects. \n
 91    In Sci. Adv (Vol. 8). https://doi.org/10.1126/sciadv.abn7614
 92    :param transducer_phases: Hologram
 93    :param points: Points
 94    :param board: Transducer board
 95    :param target: <Unused>
 96    :param w: relative weight of parts of objective
 97    :param axis: axis to compute gor'kov potential in
 98   
 99    '''
100    t2 = add_lev_sig(transducer_phases)
101    axis = objective_params["axis"] if "axis" in objective_params else "XYZ"
102    w = objective_params["w"] if "w" in objective_params else 1e-4
103
104    U = gorkov_analytical(t2, points, board, axis)
105
106    return torch.sum(U + w*(torch.mean(U) - U)**2,dim=1).squeeze_(1)

Objective from Hirayama, R., Christopoulos, G., Martinez Plasencia, D., & Subramanian, S. (2022).

High-speed acoustic holography with arbitrary scattering objects.

In Sci. Adv (Vol. 8). https://doi.org/10.1126/sciadv.abn7614

Parameters
  • transducer_phases: Hologram
  • points: Points
  • board: Transducer board
  • target:
  • w: relative weight of parts of objective
  • axis: axis to compute gor'kov potential in
def pressure_abs_gorkov_trapping_stiffness_objective( transducer_phases: torch.Tensor, points: torch.Tensor, board: torch.Tensor, targets: torch.Tensor, **objective_params) -> torch.Tensor:
109def pressure_abs_gorkov_trapping_stiffness_objective(transducer_phases: Tensor, points:Tensor, board:Tensor, targets:Tensor, **objective_params) -> Tensor:
110    '''
111    weighted sum of `gorkov_trapping_stiffness_objective` and `propagate_abs_sum_objective`
112    :param transducer_phases: Hologram
113    :param points: Points
114    :param board: Transducer board
115    :param target: <Unused>
116    :param alpha: relative weight of parts of objective
117    '''
118    Ul = gorkov_trapping_stiffness_objective(transducer_phases, points, board, targets, **objective_params)
119    pl = propagate_abs_sum_objective(transducer_phases, points, board, targets, **objective_params)
120
121    alpha = objective_params["alpha"] if "alpha" in objective_params else 1
122
123    return Ul + alpha*pl

weighted sum of gorkov_trapping_stiffness_objective and propagate_abs_sum_objective

Parameters
  • transducer_phases: Hologram
  • points: Points
  • board: Transducer board
  • target:
  • alpha: relative weight of parts of objective
def target_pressure_mse_objective( transducer_phases: torch.Tensor, points: torch.Tensor, board: torch.Tensor, targets: torch.Tensor, **objective_params) -> torch.Tensor:
125def target_pressure_mse_objective(transducer_phases: Tensor, points:Tensor, board:Tensor, targets:Tensor, **objective_params) -> Tensor:
126    '''
127    MSE error of target pressure and true pressure
128    :param transducer_phases: Hologram
129    :param points: Points
130    :param board: Transducer board
131    :param target:target pressure
132    '''
133    p = propagate_abs(transducer_phases, points,board=board)
134    l = torch.sum((p-targets)**2,dim=1)
135    return l

MSE error of target pressure and true pressure

Parameters
  • transducer_phases: Hologram
  • points: Points
  • board: Transducer board
  • target: target pressure
def target_gorkov_mse_objective( transducer_phases: torch.Tensor, points: torch.Tensor, board: torch.Tensor, targets: torch.Tensor, **objective_params) -> torch.Tensor:
137def target_gorkov_mse_objective(transducer_phases: Tensor, points:Tensor, board:Tensor, targets:Tensor, **objective_params) -> Tensor:
138    '''
139    MSE error of target Gor'kov potential and true Gor'kov potential
140    :param transducer_phases: Hologram
141    :param points: Points
142    :param board: Transducer board
143    :param target: target gor'kov value
144    '''
145    # if "no_sig" not in objective_params:
146    #     t2 = add_lev_sig(transducer_phases)
147    # else:
148    #     t2 = transducer_phases
149    axis = objective_params["axis"] if "axis" in objective_params else "XYZ"
150    U = gorkov_analytical(transducer_phases, points, board, axis)
151    l = torch.mean((U-targets)**2,dim=1).squeeze_(1)
152    
153    return l

MSE error of target Gor'kov potential and true Gor'kov potential

Parameters
  • transducer_phases: Hologram
  • points: Points
  • board: Transducer board
  • target: target gor'kov value
def target_gorkov_BEM_mse_objective(transducer_phases, points, board, targets, **objective_params):
155def target_gorkov_BEM_mse_objective(transducer_phases, points, board, targets, **objective_params):
156    reflector = objective_params['reflector']
157    root = objective_params['root']
158    if 'dims' in objective_params:
159        dims = objective_params['dims']
160    else:
161        dims = 'XYZ'
162    U = BEM_gorkov_analytical(transducer_phases, points, reflector, board, path=root, dims=dims)
163    loss = torch.mean((targets-U)**2).unsqueeze_(0).real
164    return loss
def target_gorkov_BEM_mse_sine_objective(transducer_phases, points, board, targets, **objective_params):
166def target_gorkov_BEM_mse_sine_objective(transducer_phases, points, board, targets, **objective_params):
167    transducer_phases = sine_amplitude(transducer_phases)
168    reflector = objective_params['reflector']
169    root = objective_params['root']
170    E = objective_params["E"] if "E" in objective_params else None
171    if 'dims' in objective_params:
172        dims = objective_params['dims']
173    else:
174        dims = 'XYZ'
175    U = BEM_gorkov_analytical(transducer_phases, points, reflector, board, path=root, dims=dims, E=E)
176    loss = torch.mean((targets-U)**2).unsqueeze_(0).real
177    return loss