Skip to main content

An efficient python block-sparse tensor and MPS/DMRG library.

Project description

Documentation Status Build Status License: GPL v3 PyPI version

pyblock3

An Efficient python block-sparse tensor and MPS/DMRG Library

Copyright (C) 2020-2021 The pyblock3 developers. All Rights Reserved.

Authors:

  • Huanchen Zhai @hczhai: MPS/MPO/DMRG
  • Yang Gao @yangcal: General fermionic tensor
  • Garnet Kin-Lic Chan @gkc1000: Library design

Please cite this work as:

Huanchen Zhai, Yang Gao, and Garnet K.-L. Chan. pyblock3: an efficient python block-sparse tensor and MPS/DMRG library. 2021; https://github.com/block-hczhai/pyblock3-preview.

Documentation: https://pyblock3.readthedocs.io/en/latest

Tutorial: https://colab.research.google.com/drive/1grQyYP9oTivjqQRZiwU40tF9SdWyrPfV?usp=sharing

Features

  • Block-sparse tensor algebra with quantum number symmetries:
    • U(1) particle number
    • U(1) spin
    • Abelian point group symmetry
  • MPO construction
    • SVD approach for general fermionic Hamiltonian
    • Conventional approach for quantum chemistry Hamiltonian
  • MPO/MPS algebra
    • MPO compression
  • Efficient sweep algorithms for ab initio systems (2-site):
    • Ground-state DMRG with perturbative noise
    • MPS compression
    • Green's function (DDMRG++)
    • Imaginary time evolution (time-step targeting approach)
    • Real time evolution (time-step targeting approach)
    • Finite-temperature DMRG (ancilla approach)

Installation

Using pip:

pip install pyblock3

Or you can compile it manually:

Dependence: python3, psutil, numba, and numpy (version >= 1.17.0). pyblock3 can run in pure python mode, in which no C++ source code is required to be compiled.

For optimal performance, the C++ source code is used and there are some additional dependences:

  • pybind11 (https://github.com/pybind/pybind11)
  • cmake (version >= 3.0)
  • MKL (or blas + lapack)
    • When MKL is available, add cmake option: -DUSE_MKL=ON.
    • If cmake cannot find MKL, one can add environment variable hint MKLROOT.
  • C++ compiler: g++ or clang
    • icpc currently not tested/supported
  • High performance Tensor Transposition library: hptt (https://github.com/springer13/hptt) (optional)
    • For CPU with AVX512 flag, one can use this AVX512 version (https://github.com/hczhai/hptt)
    • HPTT is important for optimal performance
    • When HPTT is available, add cmake option: -DUSE_HPTT=ON.
    • If cmake cannot find HPTT, one can add environment variable hint HPTTHOME.
  • openMP library gomp or iomp5 (optional)
    • This is required for multi-threading parallelization.
    • For openMP disabled: add cmake option: -DOMP_LIB=SEQ.
    • For gnu openMP (gomp): add cmake option: -DOMP_LIB=GNU.
    • For intel openMP (iomp5): add cmake option: -DOMP_LIB=INTEL (default).
    • If cmake cannot find openMP library, one can add the path to libgomp.so or libiomp5.so to environment variable PATH.

To compile the C++ part of the code (for better performance):

mkdir build
cd build
cmake .. -DUSE_MKL=ON -DUSE_HPTT=ON
make

Add package root directory to PYTHONPATH before running the following examples.

If you used directory names other than build for the build directory (which contains the compiled python extension), you also need to add the build directory to PYTHONPATH.

Examples

Ground-state DMRG (H8 STO6G) in pure python (52 seconds):

import numpy as np
from pyblock3.algebra.mpe import MPE
from pyblock3.hamiltonian import Hamiltonian
from pyblock3.fcidump import FCIDUMP

fd = 'data/H8.STO6G.R1.8.FCIDUMP'
bond_dim = 250
hamil = Hamiltonian(FCIDUMP(pg='d2h').read(fd), flat=False)
mpo = hamil.build_qc_mpo()
mpo, _ = mpo.compress(cutoff=1E-9, norm_cutoff=1E-9)
mps = hamil.build_mps(bond_dim)

dmrg = MPE(mps, mpo, mps).dmrg(bdims=[bond_dim], noises=[1E-6, 0],
    dav_thrds=[1E-3], iprint=2, n_sweeps=10)
ener = dmrg.energies[-1]
print("Energy = %20.12f" % ener)

Ground-state DMRG (H8 STO6G) with C++ optimized core functions (0.87 seconds):

import numpy as np
from pyblock3.algebra.mpe import MPE
from pyblock3.hamiltonian import Hamiltonian
from pyblock3.fcidump import FCIDUMP

fd = 'data/H8.STO6G.R1.8.FCIDUMP'
bond_dim = 250
hamil = Hamiltonian(FCIDUMP(pg='d2h').read(fd), flat=True)
mpo = hamil.build_qc_mpo()
mpo, _ = mpo.compress(cutoff=1E-9, norm_cutoff=1E-9)
mps = hamil.build_mps(bond_dim)

dmrg = MPE(mps, mpo, mps).dmrg(bdims=[bond_dim], noises=[1E-6, 0],
    dav_thrds=[1E-3], iprint=2, n_sweeps=10)
ener = dmrg.energies[-1]
print("Energy = %20.12f" % ener)

The printed ground-state energy for this system should be -4.345079402665.

Adding Extra Symmetry Class

  1. Write the C++ definition of the class (named QPN, for example) in src/qpn.hpp, which should be similar to src/sz.hpp.

  2. Add the following in src/symmetry_tmpl.hpp after add other symmetries here line:

     #include "qpn.hpp"
     #define TMPL_Q QPN
     #include NAME_IMPL(TMPL_NAME,_tmpl.hpp)
     #undef TMPL_Q
    

    Note that if multiple symmetry class are defined in the same file src/qpn.hpp, you may only write #include "qpn.hpp" once. The other three lines have to be repeated for each symmetry class. If you do not need the default symmetry class SZ and you want to save compiling time, the four lines for SZ can be removed/commented.

  3. Add the following in src/main.hpp after bind extra symmetry here line:

     py::module m_qpn = m.def_submodule("qpn", "General other symmetry.");
     bind_sparse_tensor<QPN>(m_qpn, m, "QPN");
    

    If you do not need the default symmetry class SZ and you want to save compiling time, the two lines bind_ ... for SZ can be removed/commented.

  4. In python script, use the following to indicate which symmetry class is being used:

     if DEFAULT_SYMMETRY == SZ:
         import block3.sz as block3
     elif DEFAULT_SYMMETRY == QPN:
         import block3.qpn as block3
    

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyblock3-0.2.2.tar.gz (197.2 kB view details)

Uploaded Source

Built Distributions

pyblock3-0.2.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (79.5 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.12+ x86-64

pyblock3-0.2.2-cp39-cp39-macosx_10_15_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.9 macOS 10.15+ x86-64

pyblock3-0.2.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (79.5 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64

pyblock3-0.2.2-cp38-cp38-macosx_10_15_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.8 macOS 10.15+ x86-64

pyblock3-0.2.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (79.6 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.12+ x86-64

pyblock3-0.2.2-cp37-cp37m-macosx_10_15_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.7m macOS 10.15+ x86-64

File details

Details for the file pyblock3-0.2.2.tar.gz.

File metadata

  • Download URL: pyblock3-0.2.2.tar.gz
  • Upload date:
  • Size: 197.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.8.2 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

File hashes

Hashes for pyblock3-0.2.2.tar.gz
Algorithm Hash digest
SHA256 1a63ba11e2641213a51639e0461970da202e9cd9e6374769dc179428985c1d64
MD5 381ab9174f369fb0ec0713e26f8a6cca
BLAKE2b-256 cb336fcd6068499e004bfff48ada1403e9ae4c1e4c346f12ae477f809c81de83

See more details on using hashes here.

File details

Details for the file pyblock3-0.2.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for pyblock3-0.2.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 f93cf308ef4c2240f44c4786cf18ecc2f1ceb58e01b9621fb38e7fffff1bb772
MD5 8d6f5de42f5840a54dccc163dc9ec8be
BLAKE2b-256 13901ede328d95d0324db1c938c36fe81f0ed5ee3534b4911b0c486f56af1b31

See more details on using hashes here.

File details

Details for the file pyblock3-0.2.2-cp39-cp39-macosx_10_15_x86_64.whl.

File metadata

  • Download URL: pyblock3-0.2.2-cp39-cp39-macosx_10_15_x86_64.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.9, macOS 10.15+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.8.2 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

File hashes

Hashes for pyblock3-0.2.2-cp39-cp39-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 b5ca2e17abccfd29570536bc11fdea5003f881af4c83f7fb52d42ae09c0b128b
MD5 6c6bf8cb7df8949fd3096d5ee98a8eff
BLAKE2b-256 a59ecd7aad85f706b7999e4afed565341f122755519afa4c2ed2321f316c2acb

See more details on using hashes here.

File details

Details for the file pyblock3-0.2.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for pyblock3-0.2.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 a68a973706247b146f768e93c117470c1e8a3682de80025d95d498350db054e7
MD5 02ebf8e2bfd7def51fc106e182e553f2
BLAKE2b-256 22f5b0d94287204bd1bd6898e02b3b55c52bec29fb8045a58820be684a0398a3

See more details on using hashes here.

File details

Details for the file pyblock3-0.2.2-cp38-cp38-macosx_10_15_x86_64.whl.

File metadata

  • Download URL: pyblock3-0.2.2-cp38-cp38-macosx_10_15_x86_64.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.8, macOS 10.15+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.8.2 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

File hashes

Hashes for pyblock3-0.2.2-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 743c96f5e14b64c0fed0f39fa804050e2743e5fe8b1fada6cac7f1181dd61067
MD5 27d8fe302b9b1ac407cf1b4eb437bae3
BLAKE2b-256 959665d02bb162dbf7fb4afc08a820025d4197bc54161d46b91ca10ad9b8b31d

See more details on using hashes here.

File details

Details for the file pyblock3-0.2.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for pyblock3-0.2.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 21b55ca139022b5dbb677ce281b1769d4af2630c689ffe098ca8205eed0af821
MD5 43a6dcac88682c1f58dc39315c28c352
BLAKE2b-256 3ff5890e7bbdf8e4b6406555254d14fc9c60660005dc3dc5cdde8d27a5680b09

See more details on using hashes here.

File details

Details for the file pyblock3-0.2.2-cp37-cp37m-macosx_10_15_x86_64.whl.

File metadata

  • Download URL: pyblock3-0.2.2-cp37-cp37m-macosx_10_15_x86_64.whl
  • Upload date:
  • Size: 2.0 MB
  • Tags: CPython 3.7m, macOS 10.15+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.8.2 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

File hashes

Hashes for pyblock3-0.2.2-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 3f8651fc76a0840313f6c4f8319c0999b6d46aead347f1ec7a0a271c3fcf55ba
MD5 bec8ebee0b6817e91ec1ee0a7d6a487c
BLAKE2b-256 0de07a18c832f23d95bb617e0a437e06270534be85bf6952529852fa65c8f9b5

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page