class_docstr: `LinearOperator` acting like a [batch] of permutation matrices.
  
  This operator acts like a [batch] of permutations with shape
  `[B1,...,Bb, N, N]` for some `b >= 0`.  The first `b` indices index a
  batch member.  For every batch index `(i1,...,ib)`, `A[i1,...,ib, : :]` is
  an `N x N` matrix.  This matrix `A` is not materialized, but for
  purposes of broadcasting this shape will be relevant.
  
  `LinearOperatorPermutation` is initialized with a (batch) vector.
  
  A permutation, is defined by an integer vector `v` whose values are unique
  and are in the range `[0, ... n]`. Applying the permutation on an input
  matrix has the folllowing meaning: the value of `v` at index `i`
  says to move the `v[i]`-th row of the input matrix to the `i`-th row.
  Because all values are unique, this will result in a permutation of the
  rows the input matrix. Note, that the permutation vector `v` has the same
  semantics as `tf.transpose`.
  
  ```python
  # Create a 3 x 3 permutation matrix that swaps the last two columns.
  vec = [0, 2, 1]
  operator = LinearOperatorPermutation(vec)
  
  operator.to_dense()
  ==> [[1., 0., 0.]
       [0., 0., 1.]
       [0., 1., 0.]]
  
  tensor_shape.TensorShape(operator.shape)
  ==> [3, 3]
  
  # This will be zero.
  operator.log_abs_determinant()
  ==> scalar Tensor
  
  x = ... Shape [3, 4] Tensor
  operator.matmul(x)
  ==> Shape [3, 4] Tensor
  ```
  
  #### Shape compatibility
  
  This operator acts on [batch] matrix with compatible shape.
  `x` is a batch matrix with compatible shape for `matmul` and `solve` if
  
  ```
  tensor_shape.TensorShape(operator.shape) = [B1,...,Bb] + [N, N],  with b >= 0
  tensor_shape.TensorShape(x.shape) =   [C1,...,Cc] + [N, R],
  and [C1,...,Cc] broadcasts with [B1,...,Bb] to [D1,...,Dd]
  ```
  
  #### Matrix property hints
  
  This `LinearOperator` is initialized with boolean flags of the form `is_X`,
  for `X = non_singular, self_adjoint, positive_definite, square`.
  These have the following meaning:
  
  * If `is_X == True`, callers should expect the operator to have the
    property `X`.  This is a promise that should be fulfilled, but is *not* a
    runtime assert.  For example, finite floating point precision may result
    in these promises being violated.
  * If `is_X == False`, callers should expect the operator to not have `X`.
  * If `is_X == None` (the default), callers should have no expectation either
    way.
class_docstr_tok: ["`","LinearOperator","`","acting","like","a","[","batch","]","of","permutation","matrices",".","This","operator","acts","like","a","[","batch","]","of","permutations","with","shape","`","[","B1",",","...",",","Bb",",","N",",","N","]","`","for","some","`","b",">","=","0","`",".","The","first","`","b","`","indices","index","a","batch","member",".","For","every","batch","index","`","(","i1",",","...",",","ib",")","`",",","`","A","[","i1",",","...",",","ib",",",":",":","]","`","is","an","`","N","x","N","`","matrix",".","This","matrix","`","A","`","is","not","materialized",",","but","for","purposes","of","broadcasting","this","shape","will","be","relevant",".","`","LinearOperatorPermutation","`","is","initialized","with","a","(","batch",")","vector",".","A","permutation",",","is","defined","by","an","integer","vector","`","v","`","whose","values","are","unique","and","are","in","the","range","`","[","0",",","...","n","]","`",".","Applying","the","permutation","on","an","input","matrix","has","the","folllowing","meaning",":","the","value","of","`","v","`","at","index","`","i","`","says","to","move","the","`","v","[","i","]","`","-th","row","of","the","input","matrix","to","the","`","i","`","-th","row",".","Because","all","values","are","unique",",","this","will","result","in","a","permutation","of","the","rows","the","input","matrix",".","Note",",","that","the","permutation","vector","`","v","`","has","the","same","semantics","as","`","tf.transpose","`",".","``","`","python","#","Create","a","3","x","3","permutation","matrix","that","swaps","the","last","two","columns",".","vec","=","[","0",",","2",",","1","]","operator","=","LinearOperatorPermutation","(","vec",")","operator.to_dense","(",")","==",">","[","[","1.",",","0.",",","0",".","]","[","0.",",","0.",",","1",".","]","[","0.",",","1.",",","0",".","]","]","tensor_shape.TensorShape","(","operator.shape",")","==",">","[","3",",","3","]","#","This","will","be","zero",".","operator.log_abs_determinant","(",")","==",">","scalar","Tensor","x","=","...","Shape","[","3",",","4","]","Tensor","operator.matmul","(","x",")","==",">","Shape","[","3",",","4","]","Tensor","``","`","#","#","#","#","Shape","compatibility","This","operator","acts","on","[","batch","]","matrix","with","compatible","shape",".","`","x","`","is","a","batch","matrix","with","compatible","shape","for","`","matmul","`","and","`","solve","`","if","``","`","tensor_shape.TensorShape","(","operator.shape",")","=","[","B1",",","...",",","Bb","]","+","[","N",",","N","]",",","with","b",">","=","0","tensor_shape.TensorShape","(","x.shape",")","=","[","C1",",","...",",","Cc","]","+","[","N",",","R","]",",","and","[","C1",",","...",",","Cc","]","broadcasts","with","[","B1",",","...",",","Bb","]","to","[","D1",",","...",",","Dd","]","``","`","#","#","#","#","Matrix","property","hints","This","`","LinearOperator","`","is","initialized","with","boolean","flags","of","the","form","`","is_X","`",",","for","`","X","=","non_singular",",","self_adjoint",",","positive_definite",",","square","`",".","These","have","the","following","meaning",":","*","If","`","is_X","==","True","`",",","callers","should","expect","the","operator","to","have","the","property","`","X","`",".","This","is","a","promise","that","should","be","fulfilled",",","but","is","*","not","*","a","runtime","assert",".","For","example",",","finite","floating","point","precision","may","result","in","these","promises","being","violated",".","*","If","`","is_X","==","False","`",",","callers","should","expect","the","operator","to","not","have","`","X","`",".","*","If","`","is_X","==","None","`","(","the","default",")",",","callers","should","have","no","expectation","either","way","."]
docstr: Static check of perm.
docstr_tok: ["Static","check","of","perm","."]
code: def _check_perm(self, perm):
      """Static check of perm."""
      if (
          tensor_shape.TensorShape(perm.shape).ndims is not None
          and tensor_shape.TensorShape(perm.shape).ndims < 1
      ):
          raise ValueError(
              f"Argument `perm` must have at least 1 dimension. "
              f"Received: {perm}."
          )
      if not np.issubdtype(perm.dtype, np.integer):
          raise TypeError(
              f"Argument `perm` must be integer dtype. "
              f"Received: {perm}."
          )
      # Check that the permutation satisfies the uniqueness constraint.
      static_perm = ops.get_static_value(perm)
      if static_perm is not None:
          sorted_perm = np.sort(static_perm, axis=-1)
          if np.any(
              sorted_perm
              != np.arange(
                  0, tensor_shape.TensorShape(static_perm.shape)[-1]
              )
          ):
              raise ValueError(
                  f"Argument `perm` must be a vector of unique integers from "
                  f"0 to {tensor_shape.TensorShape(static_perm.shape)[-1] - 1}."
              )
  
imports: import numpy
  from tensorflow_probability.python.internal.backend.numpy import dtype
  from tensorflow_probability.python.internal.backend.numpy import ops
  from tensorflow_probability.python.internal.backend.numpy import ops
  from tensorflow_probability.python.internal.backend.numpy import numpy_array
  from tensorflow_probability.python.internal.backend.numpy import control_flow
  from tensorflow_probability.python.internal.backend.numpy import numpy_math
  from tensorflow_probability.python.internal.backend.numpy import misc
  from tensorflow_probability.python.internal.backend.numpy import linalg_impl
  from tensorflow_probability.python.internal.backend.numpy.gen import linear_operator
  from tensorflow_probability.python.internal.backend.numpy.gen import linear_operator_util
  import numpy
  from tensorflow_probability.python.internal.backend.numpy import linalg_impl
  from tensorflow_probability.python.internal.backend.numpy import ops
  from tensorflow_probability.python.internal.backend.numpy.gen import tensor_shape
  from tensorflow_probability.python.internal.backend.numpy import private
label_desc: Use image node_id 2 for calling the LinearOperatorPermutation obj's underlying member method code with example usage: obj._check_perm(perm) without return types