Cytnx v0.9.7
Loading...
Searching...
No Matches
linalg.hpp
Go to the documentation of this file.
1#ifndef _linalg_H_
2#define _linalg_H_
3
4#include "Type.hpp"
5#include "cytnx_error.hpp"
6#include "Tensor.hpp"
7#include "UniTensor.hpp"
8#include "LinOp.hpp"
9
10#ifdef BACKEND_TORCH
11#else
12
13 #include "backend/Storage.hpp"
14 #include "backend/Scalar.hpp"
15 #include <functional>
16
17namespace cytnx {
20
32
42 template <class T>
44
54 template <class T>
56
68
78 template <class T>
80
90 template <class T>
92
104
114 template <class T>
116
126 template <class T>
128
140
150 template <class T>
152
162 template <class T>
164
176
186 template <class T>
188
198 template <class T>
200
211 namespace linalg {
212
213 // Add:
214 //==================================================
237
270 template <class T>
271 cytnx::UniTensor Add(const T &lc, const cytnx::UniTensor &Rt);
272
306 template <class T>
307 cytnx::UniTensor Add(const cytnx::UniTensor &Lt, const T &rc);
308
309 // Sub:
310 //==================================================
334
367 template <class T>
368 cytnx::UniTensor Sub(const T &lc, const cytnx::UniTensor &Rt);
369
402 template <class T>
403 cytnx::UniTensor Sub(const cytnx::UniTensor &Lt, const T &rc);
404
405 // Mul:
406 //==================================================
430
463 template <class T>
464 cytnx::UniTensor Mul(const T &lc, const cytnx::UniTensor &Rt);
465
498 template <class T>
499 cytnx::UniTensor Mul(const cytnx::UniTensor &Lt, const T &rc);
500
501 // Div:
502 //==================================================
526
560 template <class T>
561 cytnx::UniTensor Div(const T &lc, const cytnx::UniTensor &Rt);
562
596 template <class T>
597 cytnx::UniTensor Div(const cytnx::UniTensor &Lt, const T &rc);
598
599 // Mod:
600 //==================================================
626
657 template <class T>
658 cytnx::UniTensor Mod(const T &lc, const cytnx::UniTensor &Rt);
659
690 template <class T>
691 cytnx::UniTensor Mod(const cytnx::UniTensor &Lt, const T &rc);
692
699 std::vector<cytnx::UniTensor> Svd(const cytnx::UniTensor &Tin, const bool &is_UvT = true);
700
708 std::vector<cytnx::UniTensor> Gesvd(const cytnx::UniTensor &Tin, const bool &is_U = true,
709 const bool &is_vT = true);
710
721 std::vector<cytnx::UniTensor> Svd_truncate(const cytnx::UniTensor &Tin,
722 const cytnx_uint64 &keepdim, const double &err = 0,
723 const bool &is_UvT = true,
724 const unsigned int &return_err = 0);
725
736 std::vector<cytnx::UniTensor> Gesvd_truncate(const cytnx::UniTensor &Tin,
737 const cytnx_uint64 &keepdim, const double &err = 0,
738 const bool &is_U = true, const bool &is_vT = true,
739 const unsigned int &return_err = 0);
740
741 std::vector<cytnx::UniTensor> Hosvd(
742 const cytnx::UniTensor &Tin, const std::vector<cytnx_uint64> &mode,
743 const bool &is_core = true, const bool &is_Ls = false,
744 const std::vector<cytnx_int64> &trucate_dim = std::vector<cytnx_int64>());
745
754 template <typename T>
755 cytnx::UniTensor ExpH(const cytnx::UniTensor &Tin, const T &a, const T &b = 0);
756
764 template <typename T>
765 cytnx::UniTensor ExpM(const cytnx::UniTensor &Tin, const T &a, const T &b = 0);
766
776
785
791 const cytnx_int64 &b = 1);
792
800 cytnx::UniTensor Trace(const cytnx::UniTensor &Tin, const std::string &a, const std::string &b);
801
810 std::vector<cytnx::UniTensor> Qr(const cytnx::UniTensor &Tin, const bool &is_tau = false);
811
820 std::vector<cytnx::UniTensor> Qdr(const cytnx::UniTensor &Tin, const bool &is_tau = false);
821
822 // Pow:
823 //==================================================
836 UniTensor Pow(const UniTensor &Tin, const double &p);
837
849 void Pow_(UniTensor &Tin, const double &p);
850
858
865
866 //====================================================================================
867 // [Tensor]
868 // ====================================================================================
869 //====================================================================================
870
894 Tensor Add(const Tensor &Lt, const Tensor &Rt);
895
917 template <class T>
918 Tensor Add(const T &lc, const Tensor &Rt);
919
941 template <class T>
942 Tensor Add(const Tensor &Lt, const T &rc);
943
968 void iAdd(Tensor &Lt, const Tensor &Rt);
969
970 // Sub:
971 //==================================================
994 Tensor Sub(const Tensor &Lt, const Tensor &Rt);
995
1017 template <class T>
1018 Tensor Sub(const T &lc, const Tensor &Rt);
1019
1041 template <class T>
1042 Tensor Sub(const Tensor &Lt, const T &rc);
1043
1068 void iSub(Tensor &Lt, const Tensor &Rt);
1069
1070 // Mul:
1071 //==================================================
1094 Tensor Mul(const Tensor &Lt, const Tensor &Rt);
1095
1117 template <class T>
1118 Tensor Mul(const T &lc, const Tensor &Rt);
1119
1141 template <class T>
1142 Tensor Mul(const Tensor &Lt, const T &rc);
1143
1168 void iMul(Tensor &Lt, const Tensor &Rt);
1169
1170 // Div:
1171 //==================================================
1195 Tensor Div(const Tensor &Lt, const Tensor &Rt);
1196
1219 template <class T>
1220 Tensor Div(const T &lc, const Tensor &Rt);
1221
1244 template <class T>
1245 Tensor Div(const Tensor &Lt, const T &rc);
1246
1271 void iDiv(Tensor &Lt, const Tensor &Rt);
1272
1273 // Mod:
1274 //==================================================
1275
1298 Tensor Mod(const Tensor &Lt, const Tensor &Rt);
1299
1320 template <class T>
1321 Tensor Mod(const T &lc, const Tensor &Rt);
1322
1343 template <class T>
1344 Tensor Mod(const Tensor &Lt, const T &rc);
1345
1346 // Cpr:
1347 //==================================================
1373 Tensor Cpr(const Tensor &Lt, const Tensor &Rt);
1374
1399 template <class T>
1400 Tensor Cpr(const T &lc, const Tensor &Rt);
1401
1426 template <class T>
1427 Tensor Cpr(const Tensor &Lt, const T &rc);
1428
1429 // Norm:
1430 //=================================================
1440 Tensor Norm(const Tensor &Tl);
1441
1442 // Norm:
1443 //=================================================
1453 Tensor Norm(const UniTensor &uTl);
1454
1455 // Det:
1456 //=================================================
1465 Tensor Det(const Tensor &Tl);
1466
1467 // Svd:
1468 //==================================================
1494 std::vector<Tensor> Svd(const Tensor &Tin, const bool &is_UvT = true);
1495
1496 // Gesvd:
1497 //==================================================
1525 std::vector<Tensor> Gesvd(const Tensor &Tin, const bool &is_U = true, const bool &is_vT = true);
1526
1527 // Svd_truncate:
1528 //==================================================
1560 std::vector<Tensor> Svd_truncate(const Tensor &Tin, const cytnx_uint64 &keepdim,
1561 const double &err = 0, const bool &is_UvT = true,
1562 const unsigned int &return_err = 0);
1563
1564 // Gesvd_truncate:
1565 //==================================================
1599 std::vector<Tensor> Gesvd_truncate(const Tensor &Tin, const cytnx_uint64 &keepdim,
1600 const double &err = 0, const bool &is_U = true,
1601 const bool &is_vT = true,
1602 const unsigned int &return_err = 0);
1603
1604 // Hosvd:
1605 std::vector<Tensor> Hosvd(
1606 const Tensor &Tin, const std::vector<cytnx_uint64> &mode, const bool &is_core = true,
1607 const bool &is_Ls = false,
1608 const std::vector<cytnx_int64> &trucate_dim = std::vector<cytnx_int64>());
1609
1610 // Qr:
1611 //==================================================
1637 std::vector<Tensor> Qr(const Tensor &Tin, const bool &is_tau = false);
1638
1639 // Qdr:
1640 //==================================================
1660 std::vector<Tensor> Qdr(const Tensor &Tin, const bool &is_tau = false);
1661
1662 // Eigh:
1663 //==================================================
1686 std::vector<Tensor> Eigh(const Tensor &Tin, const bool &is_V = true, const bool &row_v = false);
1687
1688 std::vector<UniTensor> Eigh(const UniTensor &Tin, const bool &is_V = true,
1689 const bool &row_v = false);
1690
1691 // Eig:
1692 //==================================================
1712 std::vector<Tensor> Eig(const Tensor &Tin, const bool &is_V = true, const bool &row_v = false);
1713
1714 std::vector<UniTensor> Eig(const UniTensor &Tin, const bool &is_V = true,
1715 const bool &row_v = false);
1716
1717 // Trace:
1718 //==================================================
1732 Tensor Trace(const Tensor &Tn, const cytnx_uint64 &axisA = 0, const cytnx_uint64 &axisB = 1);
1733
1734 // Min:
1735 //==================================================
1741 Tensor Min(const Tensor &Tn);
1742
1743 // Max:
1744 //==================================================
1750 Tensor Max(const Tensor &Tn);
1751
1752 // Sum:
1753 //==================================================
1758 Tensor Sum(const Tensor &Tn);
1759
1760 // Matmul:
1761 //==================================================
1773 Tensor Matmul(const Tensor &TL, const Tensor &TR);
1774
1775 // Matmul_dg:
1776 //==================================================
1783 Tensor Matmul_dg(const Tensor &Tl, const Tensor &Tr);
1784
1785 // InvM:
1786 //==================================================
1793 Tensor InvM(const Tensor &Tin);
1802 void InvM_(Tensor &Tin);
1803 void InvM_(UniTensor &Tin);
1804 // Inv:
1805 //==================================================
1824 Tensor Inv(const Tensor &Tin, const double &clip);
1825
1838 void Inv_(Tensor &Tin, const double &clip);
1839
1840 // Conj:
1841 //==================================================
1856 Tensor Conj(const Tensor &Tin);
1857
1866 void Conj_(Tensor &Tin);
1867
1868 // Exp:
1869 //==================================================
1883 Tensor Exp(const Tensor &Tin);
1884
1898 Tensor Expf(const Tensor &Tin);
1899
1909 void Exp_(Tensor &Tin);
1910
1920 void Expf_(Tensor &Tin);
1921
1922 // Pow:
1923 //==================================================
1935 Tensor Pow(const Tensor &Tin, const double &p);
1936
1943 void Pow_(Tensor &Tin, const double &p);
1944
1945 // Abs:
1946 //==================================================
1954 Tensor Abs(const Tensor &Tin);
1955
1963 void Abs_(Tensor &Tin);
1964
1965 // Diag:
1966 //==================================================
1975 Tensor Diag(const Tensor &Tin);
1976
1977 // Tensordot:
1978 //==================================================
1994 Tensor Tensordot(const Tensor &Tl, const Tensor &Tr, const std::vector<cytnx_uint64> &idxl,
1995 const std::vector<cytnx_uint64> &idxr, const bool &cacheL = false,
1996 const bool &cacheR = false);
1997
1998 // Tensordot_dg:
1999 //==================================================
2017 Tensor Tensordot_dg(const Tensor &Tl, const Tensor &Tr, const std::vector<cytnx_uint64> &idxl,
2018 const std::vector<cytnx_uint64> &idxr, const bool &diag_L);
2019
2020 // Outer:
2021 //==================================================
2032 Tensor Outer(const Tensor &Tl, const Tensor &Tr);
2033
2034 // Kron:
2035 //==================================================
2052 Tensor Kron(const Tensor &Tl, const Tensor &Tr, const bool &Tl_pad_left = false,
2053 const bool &Tr_pad_left = false);
2054
2055 // Directsum:
2056 //==================================================
2071 Tensor Directsum(const Tensor &T1, const Tensor &T2,
2072 const std::vector<cytnx_uint64> &shared_axes);
2073
2074 // VectorDot:
2075 //=================================================
2087 Tensor Vectordot(const Tensor &Tl, const Tensor &Tr, const bool &is_conj = false);
2088
2089 // Dot:
2090 //=================================================
2110 Tensor Dot(const Tensor &Tl, const Tensor &Tr);
2111
2112 // Tridiag:
2113 //===========================================
2134 std::vector<Tensor> Tridiag(const Tensor &Diag, const Tensor &Sub_diag, const bool &is_V = true,
2135 const bool &is_row = false, bool throw_excp = false);
2136
2137 // ExpH:
2138 //===========================================
2156 template <typename T>
2157 Tensor ExpH(const Tensor &in, const T &a, const T &b = 0);
2170 Tensor ExpH(const Tensor &in);
2171
2172 // ExpM:
2173 //===========================================
2186 template <typename T>
2187 Tensor ExpM(const Tensor &in, const T &a, const T &b = 0);
2188
2199 Tensor ExpM(const Tensor &in);
2200
2201 // Arnoldi:
2202 //===========================================
2232 std::vector<Tensor> Arnoldi(LinOp *Hop, const Tensor &Tin = Tensor(),
2233 const std::string which = "LM", const cytnx_uint64 &maxiter = 10000,
2234 const cytnx_double &cvg_crit = 1.0e-9, const cytnx_uint64 &k = 1,
2235 const bool &is_V = true, const bool &verbose = false);
2236
2237 // Lanczos:
2238 //===========================================
2269 std::vector<Tensor> Lanczos(LinOp *Hop, const Tensor &Tin = Tensor(),
2270 const std::string method = "Gnd", const double &CvgCrit = 1.0e-14,
2271 const unsigned int &Maxiter = 10000, const cytnx_uint64 &k = 1,
2272 const bool &is_V = true, const bool &is_row = false,
2273 const cytnx_uint32 &max_krydim = 0, const bool &verbose = false);
2274
2275 // Lanczos:
2276 //===========================================
2307 std::vector<UniTensor> Lanczos(LinOp *Hop, const UniTensor &Tin = UniTensor(),
2308 const std::string method = "Gnd",
2309 const double &CvgCrit = 1.0e-14,
2310 const unsigned int &Maxiter = 10000, const cytnx_uint64 &k = 1,
2311 const bool &is_V = true, const bool &is_row = false,
2312 const cytnx_uint32 &max_krydim = 4, const bool &verbose = false);
2313
2314 // Lanczos:
2315 //===========================================
2337 std::vector<Tensor> Lanczos_ER(LinOp *Hop, const cytnx_uint64 &k = 1, const bool &is_V = true,
2338 const cytnx_uint64 &maxiter = 10000,
2339 const double &CvgCrit = 1.0e-14, const bool &is_row = false,
2340 const Tensor &Tin = Tensor(), const cytnx_uint32 &max_krydim = 4,
2341 const bool &verbose = false);
2342
2343 // Lanczos:
2344 //===========================================
2363 std::vector<Tensor> Lanczos_Gnd(LinOp *Hop, const double &CvgCrit = 1.0e-14,
2364 const bool &is_V = true, const Tensor &Tin = Tensor(),
2365 const bool &verbose = false,
2366 const unsigned int &Maxiter = 100000);
2367
2368 // Lanczos:
2369 //===============================================
2388 std::vector<UniTensor> Lanczos_Gnd_Ut(LinOp *Hop, const UniTensor &Tin,
2389 const double &CvgCrit = 1.0e-14, const bool &is_V = true,
2390 const bool &verbose = false,
2391 const unsigned int &Maxiter = 100000);
2392
2393 // Lstsq:
2394 //===========================================
2420 std::vector<Tensor> Lstsq(const Tensor &A, const Tensor &b, const float &rcond = -1);
2421
2439 Tensor Axpy(const Scalar &a, const Tensor &x, const Tensor &y = Tensor());
2440
2459 void Axpy_(const Scalar &a, const Tensor &x, Tensor &y);
2460
2475 Tensor Ger(const Tensor &x, const Tensor &y, const Scalar &a = Scalar());
2476
2494 void Gemm_(const Scalar &a, const Tensor &x, const Tensor &y, const Scalar &b, Tensor &c);
2495
2511 Tensor Gemm(const Scalar &a, const Tensor &x, const Tensor &y);
2512
2540 void Gemm_Batch(const std::vector<cytnx_int64> &m_array,
2541 const std::vector<cytnx_int64> &n_array,
2542 const std::vector<cytnx_int64> &k_array, const std::vector<Scalar> &alpha_array,
2543 const std::vector<Tensor> &a_tensors, const std::vector<Tensor> &b_tensors,
2544 const std::vector<Scalar> &beta_array, std::vector<Tensor> &c_tensors,
2545 const cytnx_int64 group_count, const std::vector<cytnx_int64> &group_size);
2546
2548 void __Gemm_Batch(const std::vector<char> &transa_array, const std::vector<char> &transb_array,
2549 const std::vector<blas_int> &m_array, const std::vector<blas_int> &n_array,
2550 const std::vector<blas_int> &k_array, const std::vector<Scalar> &alpha_array,
2551 const void **a_array, const void **b_array,
2552 const std::vector<Scalar> &beta_array, void **c_array,
2553 const blas_int group_count, const std::vector<blas_int> &group_size,
2554 const unsigned int dtype, const int device);
2555
2557
2558 } // namespace linalg
2559
2560 // operators:
2571 Tensor operator+(const Tensor &Lt, const Tensor &Rt);
2572
2582 template <class T>
2583 Tensor operator+(const T &lc, const Tensor &Rt);
2584
2594 template <class T>
2595 Tensor operator+(const Tensor &Lt, const T &rc);
2596
2597 //------------------------------------
2608 Tensor operator-(const Tensor &Lt, const Tensor &Rt);
2609
2619 template <class T>
2620 Tensor operator-(const T &lc, const Tensor &Rt);
2621
2631 template <class T>
2632 Tensor operator-(const Tensor &Lt, const T &rc);
2633
2634 //-----------------------------------
2645 Tensor operator*(const Tensor &Lt, const Tensor &Rt);
2646
2656 template <class T>
2657 Tensor operator*(const T &lc, const Tensor &Rt);
2658
2668 template <class T>
2669 Tensor operator*(const Tensor &Lt, const T &rc);
2670
2671 //----------------------------------
2684 Tensor operator/(const Tensor &Lt, const Tensor &Rt);
2685
2696 template <class T>
2697 Tensor operator/(const T &lc, const Tensor &Rt);
2698
2709 template <class T>
2710 Tensor operator/(const Tensor &Lt, const T &rc);
2711
2712 //----------------------------------
2723 Tensor operator%(const Tensor &Lt, const Tensor &Rt);
2724
2734 template <class T>
2735 Tensor operator%(const T &lc, const Tensor &Rt);
2736
2746 template <class T>
2747 Tensor operator%(const Tensor &Lt, const T &rc);
2748
2749 //----------------------------------
2759 Tensor operator==(const Tensor &Lt, const Tensor &Rt);
2760
2770 template <class T>
2771 Tensor operator==(const T &lc, const Tensor &Rt);
2772
2782 template <class T>
2783 Tensor operator==(const Tensor &Lt, const T &rc);
2784
2785} // namespace cytnx
2786
2787#endif // BACKEND_TORCH
2788
2789#endif
int32_t blas_int
Definition Type.hpp:25
Definition LinOp.hpp:21
an tensor (multi-dimensional array)
Definition Tensor.hpp:41
An Enhanced tensor specifically designed for physical Tensor network simulation.
Definition UniTensor.hpp:1783
void Gemm_Batch(const std::vector< cytnx_int64 > &m_array, const std::vector< cytnx_int64 > &n_array, const std::vector< cytnx_int64 > &k_array, const std::vector< Scalar > &alpha_array, const std::vector< Tensor > &a_tensors, const std::vector< Tensor > &b_tensors, const std::vector< Scalar > &beta_array, std::vector< Tensor > &c_tensors, const cytnx_int64 group_count, const std::vector< cytnx_int64 > &group_size)
Blas Gemm_Batch, performing many(batch) , inplacely. You do not need to consider the row-major or col...
cytnx::UniTensor Conj(const cytnx::UniTensor &UT)
Elementwise conjugate of the UniTensor.
std::vector< cytnx::UniTensor > Qr(const cytnx::UniTensor &Tin, const bool &is_tau=false)
Perform the QR decomposition on a UniTensor.
Tensor Dot(const Tensor &Tl, const Tensor &Tr)
dot product of two arrays.
cytnx::UniTensor Trace(const cytnx::UniTensor &Tin, const cytnx_int64 &a=0, const cytnx_int64 &b=1)
Tensor Tensordot(const Tensor &Tl, const Tensor &Tr, const std::vector< cytnx_uint64 > &idxl, const std::vector< cytnx_uint64 > &idxr, const bool &cacheL=false, const bool &cacheR=false)
perform tensor dot by sum out the indices assigned of two Tensors.
std::vector< Tensor > Eig(const Tensor &Tin, const bool &is_V=true, const bool &row_v=false)
eigen-value decomposition for generic square matrix
Tensor Sum(const Tensor &Tn)
get the sum of all the elements.
Tensor Min(const Tensor &Tn)
get the minimum element.
void iSub(Tensor &Lt, const Tensor &Rt)
The subtraction function for Tensot, inplscely.
void Gemm_(const Scalar &a, const Tensor &x, const Tensor &y, const Scalar &b, Tensor &c)
Blas Gemm, performing , inplacely.
void Abs_(Tensor &Tin)
inplace perform elementwiase absolute value. @This is just a inplace version of Abs....
void Pow_(UniTensor &Tin, const double &p)
Take power p on all the elements in UniTensor, inplacely.
Tensor Abs(const Tensor &Tin)
Elementwise absolute value.
Tensor Outer(const Tensor &Tl, const Tensor &Tr)
perform outer produces of two rank-1 Tensor.
void Axpy_(const Scalar &a, const Tensor &x, Tensor &y)
Blas Axpy, performing , inplacely.
std::vector< cytnx::UniTensor > Svd(const cytnx::UniTensor &Tin, const bool &is_UvT=true)
Perform Singular-Value decomposition on a UniTensor using divide-and-conquer method.
Tensor Matmul(const Tensor &TL, const Tensor &TR)
perform matrix multiplication on two tensors.
cytnx::UniTensor Mod(const cytnx::UniTensor &Lt, const cytnx::UniTensor &Rt)
element-wise modulo
Tensor Expf(const Tensor &Tin)
Exponential all the element in Tensor.
Tensor Diag(const Tensor &Tin)
return a diagonal tensor with diagonal elements provided as Tin.
std::vector< Tensor > Lstsq(const Tensor &A, const Tensor &b, const float &rcond=-1)
Return the least-squares solution to a linear matrix equation.
std::vector< Tensor > Tridiag(const Tensor &Diag, const Tensor &Sub_diag, const bool &is_V=true, const bool &is_row=false, bool throw_excp=false)
perform diagonalization of symmetric tri-diagnoal matrix.
std::vector< cytnx::UniTensor > Svd_truncate(const cytnx::UniTensor &Tin, const cytnx_uint64 &keepdim, const double &err=0, const bool &is_UvT=true, const unsigned int &return_err=0)
Perform Singular-Value decomposition on a UniTensor with truncation.
void Expf_(Tensor &Tin)
inplace perform Exponential on all the element in Tensor.
std::vector< UniTensor > Lanczos_Gnd_Ut(LinOp *Hop, const UniTensor &Tin, const double &CvgCrit=1.0e-14, const bool &is_V=true, const bool &verbose=false, const unsigned int &Maxiter=100000)
perform Lanczos for hermitian/symmetric matrices or linear function to get ground state and lowest ei...
Tensor Det(const Tensor &Tl)
Calculate the determinant of a tensor.
std::vector< Tensor > Eigh(const Tensor &Tin, const bool &is_V=true, const bool &row_v=false)
eigen-value decomposition for Hermitian matrix
void Conj_(cytnx::UniTensor &UT)
Inplace elementwise conjugate of the UniTensor.
std::vector< cytnx::UniTensor > Gesvd(const cytnx::UniTensor &Tin, const bool &is_U=true, const bool &is_vT=true)
Perform Singular-Value decomposition on a UniTensor using ?gesvd method.
Tensor Inv(const Tensor &Tin, const double &clip)
Element-wise inverse with clip.
cytnx::UniTensor Mul(const cytnx::UniTensor &Lt, const cytnx::UniTensor &Rt)
The multiplication function between two UniTensor.
std::vector< Tensor > Lanczos(LinOp *Hop, const Tensor &Tin=Tensor(), const std::string method="Gnd", const double &CvgCrit=1.0e-14, const unsigned int &Maxiter=10000, const cytnx_uint64 &k=1, const bool &is_V=true, const bool &is_row=false, const cytnx_uint32 &max_krydim=0, const bool &verbose=false)
perform Lanczos for hermitian/symmetric matrices or linear function.
Tensor Max(const Tensor &Tn)
get the maximum element.
cytnx::UniTensor Sub(const cytnx::UniTensor &Lt, const cytnx::UniTensor &Rt)
The subtraction function between two UniTensor.
Tensor Norm(const Tensor &Tl)
Calculate the norm of a tensor.
std::vector< cytnx::UniTensor > Hosvd(const cytnx::UniTensor &Tin, const std::vector< cytnx_uint64 > &mode, const bool &is_core=true, const bool &is_Ls=false, const std::vector< cytnx_int64 > &trucate_dim=std::vector< cytnx_int64 >())
Tensor Axpy(const Scalar &a, const Tensor &x, const Tensor &y=Tensor())
Blas Axpy, performing , inplacely.
void Inv_(Tensor &Tin, const double &clip)
inplace perform Element-wise inverse with clip.
Tensor Vectordot(const Tensor &Tl, const Tensor &Tr, const bool &is_conj=false)
perform inner product of vectors
void Exp_(Tensor &Tin)
inplace perform Exponential on all the element in Tensor.
Tensor Exp(const Tensor &Tin)
Exponential all the element in Tensor.
std::vector< cytnx::UniTensor > Gesvd_truncate(const cytnx::UniTensor &Tin, const cytnx_uint64 &keepdim, const double &err=0, const bool &is_U=true, const bool &is_vT=true, const unsigned int &return_err=0)
Perform Singular-Value decomposition on a UniTensor with truncation.
Tensor Ger(const Tensor &x, const Tensor &y, const Scalar &a=Scalar())
Blas Ger, performing return = a*vec(x)*vec(y)^T.
Tensor Gemm(const Scalar &a, const Tensor &x, const Tensor &y)
Blas Gemm, performing return.
Tensor Kron(const Tensor &Tl, const Tensor &Tr, const bool &Tl_pad_left=false, const bool &Tr_pad_left=false)
perform kronecker produces of two Tensor.
std::vector< Tensor > Lanczos_ER(LinOp *Hop, const cytnx_uint64 &k=1, const bool &is_V=true, const cytnx_uint64 &maxiter=10000, const double &CvgCrit=1.0e-14, const bool &is_row=false, const Tensor &Tin=Tensor(), const cytnx_uint32 &max_krydim=4, const bool &verbose=false)
perform Lanczos for hermitian/symmetric matrices or linear function.
std::vector< cytnx::UniTensor > Qdr(const cytnx::UniTensor &Tin, const bool &is_tau=false)
Perform the QDR decomposition on a UniTensor.
void InvM_(Tensor &Tin)
inplace matrix inverse.
void iDiv(Tensor &Lt, const Tensor &Rt)
The inplace division function for Tensor, inplacely.
cytnx::UniTensor Add(const cytnx::UniTensor &Lt, const cytnx::UniTensor &Rt)
The addtion function between two UniTensor.
Tensor Tensordot_dg(const Tensor &Tl, const Tensor &Tr, const std::vector< cytnx_uint64 > &idxl, const std::vector< cytnx_uint64 > &idxr, const bool &diag_L)
perform tensor dot by sum out the indices assigned of two Tensors, with either one of them to be a ra...
Tensor Directsum(const Tensor &T1, const Tensor &T2, const std::vector< cytnx_uint64 > &shared_axes)
perform directsum of two Tensor.
cytnx::UniTensor ExpM(const cytnx::UniTensor &Tin, const T &a, const T &b=0)
Perform the exponential function on a UniTensor.
void iAdd(Tensor &Lt, const Tensor &Rt)
The addition function for Tensor, inplacely.
std::vector< Tensor > Lanczos_Gnd(LinOp *Hop, const double &CvgCrit=1.0e-14, const bool &is_V=true, const Tensor &Tin=Tensor(), const bool &verbose=false, const unsigned int &Maxiter=100000)
perform Lanczos for hermitian/symmetric matrices or linear function to get ground state and lowest ei...
cytnx::UniTensor ExpH(const cytnx::UniTensor &Tin, const T &a, const T &b=0)
Perform the exponential function on a UniTensor, which the blocks are Hermitian matrix.
Tensor Cpr(const Tensor &Lt, const Tensor &Rt)
The comparison function for Tensor.
UniTensor Pow(const UniTensor &Tin, const double &p)
take power p on all the elements in UniTensor.
Tensor Matmul_dg(const Tensor &Tl, const Tensor &Tr)
perform matrix multiplication on two Tensors with one rank-1 and the other rank-2 where the rank-1 re...
std::vector< Tensor > Arnoldi(LinOp *Hop, const Tensor &Tin=Tensor(), const std::string which="LM", const cytnx_uint64 &maxiter=10000, const cytnx_double &cvg_crit=1.0e-9, const cytnx_uint64 &k=1, const bool &is_V=true, const bool &verbose=false)
perform Arnoldi for matrices or linear function.
Tensor InvM(const Tensor &Tin)
Matrix inverse.
void iMul(Tensor &Lt, const Tensor &Rt)
The multiplication function for Tensor, inplacely.
cytnx::UniTensor Div(const cytnx::UniTensor &Lt, const cytnx::UniTensor &Rt)
The division function between two UniTensor.
Helper function to print vector with ODT:
Definition Accessor.hpp:12
cytnx::UniTensor operator*(const cytnx::UniTensor &Lt, const cytnx::UniTensor &Rt)
The multiplication operator between two UniTensor.
double cytnx_double
Definition Type.hpp:53
uint32_t cytnx_uint32
Definition Type.hpp:56
cytnx::UniTensor operator-(const cytnx::UniTensor &Lt, const cytnx::UniTensor &Rt)
The subtraction operator between two UniTensor.
Tensor operator==(const Tensor &Lt, const Tensor &Rt)
The comparison operator for Tensor.
int get_mkl_code()
uint64_t cytnx_uint64
Definition Type.hpp:55
int64_t cytnx_int64
Definition Type.hpp:58
cytnx::UniTensor operator%(const cytnx::UniTensor &Lt, const cytnx::UniTensor &Rt)
The modulo operator between two UniTensor.
cytnx::UniTensor operator+(const cytnx::UniTensor &Lt, const cytnx::UniTensor &Rt)
The addtion operator between two UniTensor.
cytnx::UniTensor operator/(const cytnx::UniTensor &Lt, const cytnx::UniTensor &Rt)
The division operator between two UniTensor.
int set_mkl_ilp64()