# Base

The Base module of Yao is defined in YaoBase.jl, it provides:

- the basic abstract register and its interface
- quantum information related math functions
`@interface`

macro for drier interface definition in Yao ecosystem- custom errors and assertion handling
- general properties, e.g
`ishermitian`

,`isunitary`

, etc. - common constants in quantum information

## Math Functions

`YaoBase.autostatic`

— Method`autostatic(A[; threshold=8])`

Staticize dynamic array `A`

by a `threshold`

.

`YaoBase.batch_normalize`

— Function`batch_normalize`

normalize a batch of vector.

`YaoBase.batch_normalize!`

— Function`batch_normalize!(matrix)`

normalize a batch of vector.

`YaoBase.density_fidelity`

— Method`density_fidelity(ρ1, ρ2)`

General fidelity (including mixed states) between two density matrix for qubits.

**Definition**

\[F(ρ, σ)^2 = tr(ρσ) + 2 \sqrt{det(ρ)det(σ)}\]

`YaoBase.general_c1_gates`

— Method`general_c1_gates(num_bit::Int, projector::AbstractMatrix, cbit::Int, gates::Vector{AbstractMatrix}, locs::Vector{Int}) -> AbstractMatrix`

general (low performance) construction method for control gate on different lines.

`YaoBase.general_controlled_gates`

— Method`general_controlled_gates(num_bit::Int, projectors::Vector{Tp}, cbits::Vector{Int}, gates::Vector{AbstractMatrix}, locs::Vector{Int}) -> AbstractMatrix`

Return general multi-controlled gates in hilbert space of `num_bit`

qubits,

`projectors`

are often chosen as`P0`

and`P1`

for inverse-Control and Control at specific position.`cbits`

should have the same length as`projectors`

, specifing the controling positions.`gates`

are a list of controlled single qubit gates.`locs`

should have the same length as`gates`

, specifing the gates positions.

`YaoBase.hilbertkron`

— Method`hilbertkron(num_bit::Int, gates::Vector{AbstractMatrix}, locs::Vector{Int}) -> AbstractMatrix`

Return general kronecher product form of gates in Hilbert space of `num_bit`

qubits.

`gates`

are a list of matrices.`start_locs`

should have the same length as`gates`

, specifing the gates starting positions.

`YaoBase.linop2dense`

— Method`linop2dense([T=ComplexF64], linear_map!::Function, n::Int) -> Matrix`

Returns the dense matrix representation given linear map function.

`YaoBase.nucnorm`

— Methodnucnorm(m)

Computes the nuclear norm of a matrix `m`

.

`YaoBase.pure_state_fidelity`

— Method`pure_state_fidelity(v1::Vector, v2::Vector)`

fidelity for pure states.

`YaoBase.purification_fidelity`

— Method`purification_fidelity(m1::Matrix, m2::Matrix)`

Fidelity for mixed states via purification.

Reference: http://iopscience.iop.org/article/10.1088/1367-2630/aa6a4b/meta

`YaoBase.rand_hermitian`

— Method`rand_hermitian([T=ComplexF64], N::Int) -> Matrix`

Create a random hermitian matrix.

`YaoBase.rand_unitary`

— Method`rand_unitary([T=ComplexF64], N::Int) -> Matrix`

Create a random unitary matrix.

`YaoBase.rotmat`

— Method`rotmat(M::AbstractMatrix, θ::Real)`

Returns rotated `M`

: $exp(-\frac{imθ}{2} M)$.

`YaoBase.sprand_hermitian`

— Method`sprand_hermitian([T=ComplexF64], N, density)`

Create a sparse random hermitian matrix.

`YaoBase.sprand_unitary`

— Method`sprand_unitary([T=ComplexF64], N::Int, density) -> SparseMatrixCSC`

Create a random sparse unitary matrix.

`YaoBase.trnorm`

— Methodtrnorm(m)

Computes the trace norm of a matrix `m`

.

## General Properties

`LinearAlgebra.ishermitian`

— Method`ishermitian(op) -> Bool`

check if this operator is hermitian.

## Error and Exceptions

`YaoBase.islocs_conflict`

— Method`islocs_conflict(locs) -> Bool`

Check if the input locations has conflicts.

`YaoBase.islocs_inbounds`

— Method`islocs_inbounds(n, locs) -> Bool`

Check if the input locations are inside given bounds `n`

.

`YaoBase.@assert_locs_inbounds`

— Macro`@assert_locs_inbounds <number of total qubits> <locations list> [<msg>]`

Assert if all the locations are inbounds.

`YaoBase.@assert_locs_safe`

— Macro`@assert_locs_safe <number of total qubits> <locations list> [<msg>]`

Assert if all the locations are: - inbounds. - do not have any conflict.

## Constants

defined constants |
---|

$CNOT$ |

$CZ$ |

$H$ |

$I2$ |

$P0$ |

$P1$ |

$Pd$ |

$Pu$ |

$S$ |

$SWAP$ |

$Sdag$ |

$T$ |

$Tdag$ |

$Toffoli$ |

$X$ |

$Y$ |

$Z$ |