Esempio n. 1
0
 def _to_dense(self):
     reflection_axis = ops.convert_to_tensor(self.reflection_axis)
     normalized_axis = reflection_axis / linalg.norm(
         reflection_axis, axis=-1, keepdims=True)
     mat = normalized_axis[..., _ops.newaxis]
     matrix = -2 * _linalg.matmul(mat, mat, adjoint_b=True)
     return _linalg.set_diag(matrix, 1. + _linalg.diag_part(matrix))
  def _matmul(self, x, adjoint=False, adjoint_arg=False):
    # Given a vector `v`, we would like to reflect `x` about the hyperplane
    # orthogonal to `v` going through the origin.  We first project `x` to `v`
    # to get v * dot(v, x) / dot(v, v).  After we project, we can reflect the
    # projection about the hyperplane by flipping sign to get
    # -v * dot(v, x) / dot(v, v).  Finally, we can add back the component
    # that is orthogonal to v. This is invariant under reflection, since the
    # whole hyperplane is invariant. This component is equal to x - v * dot(v,
    # x) / dot(v, v), giving the formula x - 2 * v * dot(v, x) / dot(v, v)
    # for the reflection.

    # Note that because this is a reflection, it lies in O(n) (for real vector
    # spaces) or U(n) (for complex vector spaces), and thus is its own adjoint.
    reflection_axis = ops.convert_to_tensor(self.reflection_axis)
    x = linalg.adjoint(x) if adjoint_arg else x
    normalized_axis = reflection_axis / linalg.norm(
        reflection_axis, axis=-1, keepdims=True)
    mat = normalized_axis[..., _ops.newaxis]
    x_dot_normalized_v = _linalg.matmul(mat, x, adjoint_a=True)

    return x - 2 * mat * x_dot_normalized_v
 def _diag_part(self):
   reflection_axis = ops.convert_to_tensor(self.reflection_axis)
   normalized_axis = reflection_axis / linalg.norm(
       reflection_axis, axis=-1, keepdims=True)
   return 1. - 2 * normalized_axis * math_ops.conj(normalized_axis)
 def _diag_part(self):
     normalized_axis = self.reflection_axis / linalg.norm(
         self.reflection_axis, axis=-1, keepdims=True)
     return 1. - 2 * normalized_axis * math_ops.conj(normalized_axis)