def _tensor_product(self, other, reverse=False): """Return the tensor product channel. Args: other (QuantumChannel): a quantum channel. reverse (bool): If False return self ⊗ other, if True return if True return (other ⊗ self) [Default: False Returns: Choi: the tensor product channel as a Choi object. Raises: QiskitError: if other is not a QuantumChannel subclass. """ # Convert other to Choi if not isinstance(other, Choi): other = Choi(other) if reverse: input_dims = self.input_dims() + other.input_dims() output_dims = self.output_dims() + other.output_dims() data = _bipartite_tensor(other.data, self._data, shape1=other._bipartite_shape, shape2=self._bipartite_shape) else: input_dims = other.input_dims() + self.input_dims() output_dims = other.output_dims() + self.output_dims() data = _bipartite_tensor(self._data, other.data, shape1=self._bipartite_shape, shape2=other._bipartite_shape) return Choi(data, input_dims, output_dims)
def _tensor_product(self, other, reverse=False): """Return the tensor product channel. Args: other (QuantumChannel): a quantum channel. reverse (bool): If False return self ⊗ other, if True return if True return (other ⊗ self) [Default: False Returns: SuperOp: the tensor product channel as a SuperOp object. Raises: QiskitError: if other cannot be converted to a channel. """ # Convert other to SuperOp if not isinstance(other, SuperOp): other = SuperOp(other) if reverse: input_dims = self.input_dims() + other.input_dims() output_dims = self.output_dims() + other.output_dims() data = _bipartite_tensor( other.data, self._data, shape1=other._bipartite_shape, shape2=self._bipartite_shape) else: input_dims = other.input_dims() + self.input_dims() output_dims = other.output_dims() + self.output_dims() data = _bipartite_tensor( self._data, other.data, shape1=self._bipartite_shape, shape2=other._bipartite_shape) return SuperOp(data, input_dims, output_dims)
def _tensor(cls, a, b): ret = copy.copy(a) ret._op_shape = a._op_shape.tensor(b._op_shape) ret._data = _bipartite_tensor(a._data, b.data, shape1=a._bipartite_shape, shape2=b._bipartite_shape) return ret
def expand(self, other): """Return the tensor product channel other ⊗ self. Args: other (QuantumChannel): a quantum channel. Returns: Choi: the tensor product channel other ⊗ self as a Choi object. Raises: QiskitError: if other cannot be converted to a channel. """ # Convert other to Choi if not isinstance(other, Choi): other = Choi(other) input_dims = self.input_dims() + other.input_dims() output_dims = self.output_dims() + other.output_dims() data = _bipartite_tensor(other.data, self._data, shape1=other._bipartite_shape, shape2=self._bipartite_shape) return Choi(data, input_dims, output_dims)
def tensor(self, other): """Return the tensor product channel self ⊗ other. Args: other (QuantumChannel): a quantum channel. Returns: SuperOp: the tensor product channel self ⊗ other as a SuperOp object. Raises: QiskitError: if other cannot be converted to a channel. """ # Convert other to SuperOp if not isinstance(other, SuperOp): other = SuperOp(other) input_dims = other.input_dims() + self.input_dims() output_dims = other.output_dims() + self.output_dims() data = _bipartite_tensor(self._data, other.data, shape1=self._bipartite_shape, shape2=other._bipartite_shape) return SuperOp(data, input_dims, output_dims)