Esempio n. 1
0
 def calculate_scales_and_derivatives(self, block_id=0):
     if self._n_refl[block_id] > 1:
         value, weight, sumweight = self._smoother.multi_value_weight(
             self._normalised_x_values[block_id],
             self._normalised_y_values[block_id],
             self._normalised_z_values[block_id],
             self.value,
         )
         inv_sw = 1.0 / sumweight
         dv_dp = row_multiply(weight, inv_sw)
     elif self._n_refl[block_id] == 1:
         value, weight, sumweight = self._smoother.value_weight(
             self._normalised_x_values[block_id][0],
             self._normalised_y_values[block_id][0],
             self._normalised_z_values[block_id][0],
             self.value,
         )
         dv_dp = sparse.matrix(1, weight.size)
         b = flex.double(weight.as_dense_vector() / sumweight)
         b.reshape(flex.grid(1, b.size()))
         dv_dp.assign_block(b, 0, 0)
         value = flex.double(1, value)
     else:
         return flex.double([]), sparse.matrix(0, 0)
     return value, dv_dp
Esempio n. 2
0
 def calculate_scales_and_derivatives(self, block_id=0):
     scales, derivatives = super(
         SmoothBScaleComponent1D, self
     ).calculate_scales_and_derivatives(block_id)
     if self._n_refl[block_id] == 0:
         return flex.double([]), sparse.matrix(0, 0)
     prefac = 1.0 / (2.0 * (self._d_values[block_id] * self._d_values[block_id]))
     s = flex.exp(scales * prefac)
     d = row_multiply(derivatives, s * prefac)
     return s, d
Esempio n. 3
0
 def _calculate_derivatives(apm, block_id, scales, derivatives_list):
     """Calculate the derivatives matrix."""
     if not scales:
         return sparse.matrix(0, 0)
     if len(scales) == 1:
         # only one active parameter, so don't need to chain rule any derivatives
         # for block_id in range(len(apm.n_obs)):
         return derivatives_list[0]
     derivatives = sparse.matrix(apm.n_obs[block_id], apm.n_active_params)
     col_idx = 0
     for i, d in enumerate(derivatives_list):
         scale_multipliers = flex.double(apm.n_obs[block_id], 1.0)
         for j, s1 in enumerate(scales):
             if i != j:
                 scale_multipliers *= s1
         if apm.constant_g_values:
             scale_multipliers *= apm.constant_g_values[block_id]
         next_deriv = row_multiply(d, scale_multipliers)
         derivatives.assign_block(next_deriv, 0, col_idx)
         col_idx += d.n_cols
     return derivatives
Esempio n. 4
0
 def calculate_jacobian(Ih_table):
     """Calculate the jacobian matrix, size Ih_table.size by len(self.apm.x)."""
     jacobian = row_multiply(Ih_table.derivatives, -1.0 * Ih_table.Ih_values)
     return jacobian