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
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:
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:
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
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
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
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
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
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
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
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
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