Input Functions
The high-level function mostly used is add_operator(…) that takes in an operator string and adds it to the Operator. While the function is capable of handling Hamiltonian terms and jump operators directly we have added the following wrapper to add a jump operator directly via add_jump_operator(…). New local operators can be added with define_operator(…). A diagonal shift is added with add_diagonal(…).
-
int32_t danceq::internal::Operator::add_operator(const ScalarType coef, const std::vector<uint64_t> sites_to_act, const std::vector<std::string> operator_string, const OperatorType OT_term = Hamiltonian, const bool print_warning = true)
Adds a new term to the operator.
coef is an overall coefficient, sites_to_act contains the sites on which the operator_string acts. OT_term is an OperatorType and can be either
danceq::Hamiltonian
ordanceq::Lindbladian
(to define a jump operator).The operators listed in operator_string have to me included in available_operators.
Sites have to be within 0 and L-1.
sites_to_act and operator_string have to be of the same size.
If multiple operators act on the same site, the function internally defines their product and adds it to available_operators in the given order.
The following example adds a Hamiltonian term, see OperatorType, \(S^z_3S^z_4\) acting on sites 3 and 4:
H.add_operator(1., {3,4}, {"Sz","Sz"}, danceq::Hamiltonian);
Jump operators can be added with:
L.add_operator(1., {3}, {"Sz"}, danceq::Lindbladian);
All added operators are stored in operators_list. Internally, the function calls merge_terms(…) which sets up the sparse_matrices_for_computation to ensure a fast computation. Ntensor_max defines the maximal cluster size to generate a tensor matrix of size \(\textbf{Q}^{\textbf{Ntensor_max}}\). See here for more information.
- Parameters:
coef – Overall coefficient
sites_to_act – Sites on which each operators act
operator_string – Operators that are applied to each site
OT_term – OperatorType (Hamiltonian/Lindbladian) (Default: Hamiltonian)
print_warning – Prints warning if
true
(Default:true
)
- Returns:
error_code
-
int32_t danceq::internal::Operator::add_jump_operator(const ScalarType coef, const std::vector<uint64_t> sites_to_act, const std::vector<std::string> operators_to_apply, const bool print_warning = true)
Adds a new jump operator.
This function is a simple wrapper of add_operator(…) that fixes OperatorType OT_term=Lindbladian.
- Parameters:
coef – Overall coefficient
sites_to_act – Sites on which each operators act
operators_to_apply – Operators that are applied to each site
print_warning – Prints warning if
true
(Default:true
)
- Returns:
error_code
-
int32_t danceq::internal::Operator::define_operator(std::string name, std::array<std::array<ScalarType, state_class::template_struct::template_Q>, state_class::template_struct::template_Q> matrix)
Adds an operator to the available operators.
Adds an operator to available_operators. If the name already exists, it will be replaced.
\[\langle i \vert O \vert j \rangle = \delta_{i,j+1}\]std::array< std::array<double, Q>, Q> matrix; for(uint64_t i_for = 0UL; i_for < Q; i_for++){ for(uint64_t j_for = 0UL; j_for < Q; j_for++){ if(i_for != j_for + 1){ matrix[i_for][j_for] = 0.; // two-dimensional array has to be set to zer } else { matrix[i_for][j_for] = 1.; } } } H.define_operator("O",matrix);
- Parameters:
name – Name of the operator
matrix – Interaction matrix of size Q times Q in form of an two-dimensional array
- Returns:
error_code
-
int32_t danceq::internal::Operator::add_diagonal(const ScalarType val)
Adds a diagonal shift.
Adds a constant to the diagonal of the operator:
\[O = O + \textbf{val} \cdot \mathbb{1}\otimes \dots \otimes \mathbb{1}\]The diagonal is initially set to zero.
- Parameters:
val – Adding val a diagonal contribution
- Returns:
error_code
-
int32_t danceq::internal::Operator::set_Ntensor_max(const uint64_t Ntensor_max_input)
Sets Ntensor_max.
Sets Ntensor_max.
- Parameters:
Ntensor_max_input – New value
- Returns:
error_code
-
int32_t danceq::internal::Operator::merge_terms(const bool transpose = false)
Identifies non-local subclusters to merge all operator strings that are fully supported on such a clusters.
The function groups sites into clusters to improve the performance and creates the
std::tuple
in sparse_matrices_for_computation. Each term that is listed in operator_list will be assigned to a cluster in order to optimize the computation.An example: In an one-dimensional spin chain with periodic boundary condition and nearest-neighbor terms of size \(L=30\) we can define three clusters containing sites \(C_0=\{0,\dots,10\}\), \(C_1=\{10,\dots,20\}\), and \(C_2=\{0,20,\dots,29\}\). Hence, we only define three sparse matrices of size \(2^{11}\). For example, the terms \(S^x_3S^x_4\) and \(S^y_7S^y_8\) are assigned to the first cluster \(C_0\), and \(S^x_{16}S^x_{17}\) is assigned to the second cluster \(C_1\).
The maximal cluster size can is given by Ntensor_max and cane be set by calling set_Ntensor_max(…). Its default value is chosen such that the tensor matrix does not exceeds the dimension of 2028. However, if terms acting on more than Ntensor_max sites (e.g., long loop updates), Ntensor_max is increased. This function is called by add_operator(…).
The transposed problem will be encoded by setting transpose to
true
.- Parameters:
transpose – Sets the transposed problem
- Returns:
error_code
-
int32_t danceq::internal::Operator::add_default_operators(void)
Adds some local default operators.
The function adds the following local operator to available_operators:
{"Sx","Sy","Sz","S+","S-","n","R","Rdag","P"+std::to_string(k)}
for \(k=0,\dots,\textbf{Q}-1`\).For spin operators, \(m,m^\prime =-S,-S+1,\dots,S\) with \(S = (\textbf{Q}-1)/2\):
\[\begin{split}\langle m^\prime \vert S^x \vert m \rangle &= \left( \delta_{m^\prime,m+1} + \delta_{m^\prime,m+1}\right)\frac{1}{2}\sqrt{S(S+1)-m^\prime m}\\ \langle m^\prime \vert S^y \vert m \rangle &= \left( \delta_{m^\prime,m+1} - \delta_{m^\prime,m+1}\right)\frac{1}{2i}\sqrt{S(S+1)-m^\prime m}\\ \langle m^\prime \vert S^z \vert m \rangle &= \delta_{m^\prime,m}m\\ \langle m^\prime \vert S^+ \vert m \rangle &= \delta_{m^\prime,m+1}\sqrt{S(S+1)-m^\prime m}\\ \langle m^\prime \vert S^- \vert m \rangle &= \delta_{m^\prime+1,m}\sqrt{S(S+1)-m^\prime m}\end{split}\]\(\vert m\rangle\) refer to qudit states: \(\vert 0\rangle, \dots,\vert \textbf{Q}-1\rangle\).
We further define more general qudit operators:
\[\begin{split}\langle i \vert n \vert j \rangle &= \delta_{i,j} i\\ \langle i \vert R \vert j \rangle &= \delta_{i,j+1}\\ \langle i \vert R^\dagger \vert j \rangle &= \delta_{i+1,j}\\ \langle i \vert P_k \vert j \rangle &= \delta_{i,k}\delta_{k,j}\end{split}\]- Returns:
error_code
-
int32_t danceq::internal::Operator::merge_given_terms(std::vector<uint64_t> &cluster, std::vector<std::pair<uint64_t, danceq::internal::ResolvedAction>> &list_of_terms, const bool transpose)
Merges given terms that are all defined on the given cluster.
This function is only called internally by merge_terms(…). It merges the terms given in list_of_terms which refers to operator_list into a single entry in sparse_matrices_for_computation that is used in apply(…). All terms are fully supported on the given cluster. The second argument in list_of_terms refers to the precise action on the wavefunction or density matrix as specified in ResolvedAction.
The transposed problem will be encoded by setting transpose to
true
.- Parameters:
cluster – Sites on which the matrix is defined
list_of_terms – Terms that are included
transpose – Boolean to generate the transposed problem
- Returns:
error_code
-
enum danceq::internal::ResolvedAction
Defines the precise action of a term to the wavefunction or density matrix.
This is primarily used for the Lindbladian OperatorType where each jump operator \(l\) acts three times on a density matrix:
\[\frac{\text{d}\rho}{\text{d}t} = \gamma l\rho l^\dagger - \gamma\frac{1}{2}l^\dagger l\rho - \gamma\frac{1}{2}\rho l^\dagger l\]Each term in the Hamiltonian \(h\) acts two times on the density matrix \(\rho\) according von Neumann equation
\[\frac{\text{d}\rho}{\text{d}t} = -ih\rho +i\rho h\]Values:
-
enumerator wavefunction
Action of a term in Hamiltonian to the wavefunction.
-
enumerator density_matrix_commutator_left
Action of a term in the Hamiltonian from the left of the density matrix coming from the commutator.
-
enumerator density_matrix_commutator_right
Action of a term in the Hamiltonian from the right of the density matrix coming from the commutator.
-
enumerator density_matrix_jump_operator_both_sites
Action of a jump operator from both sides of the density matrix.
-
enumerator density_matrix_jump_operator_anti_commutator_left
Action of a jump operator from the left of the density matrix coming from the anti commutator.
-
enumerator density_matrix_jump_operator_anti_commutator_right
Action of a jump operator from the right of the density matrix coming from the anti commutator.
-
enumerator wavefunction