├── pytest.ini ├── .gitattributes ├── .gitignore ├── doc ├── tutorials │ ├── output_6_0.png │ ├── output_6_1.png │ ├── output_8_0.png │ ├── semicircle.rst │ └── discrete.rst ├── documentation.rst ├── python.rst ├── Makefile ├── make.bat ├── index.rst ├── conf.py ├── algorithms.rst └── theories.rst ├── MANIFEST.in ├── src └── adapol │ ├── __init__.py │ ├── aaa.py │ ├── anacont.py │ ├── hybfit.py │ └── fit_utils.py ├── pyproject.toml ├── .github └── workflows │ ├── publish-to-pypi.yml │ └── python-package.yml ├── README.md ├── test ├── test_semicircle.py └── test_discrete.py ├── LICENSE └── example ├── semicircle.ipynb └── discrete.ipynb /pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | markers = 3 | triqs: marks tests for triqs interface -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | src/adapol.egg-info 2 | .DS_Store 3 | __pycache__/aaa.cpython-310.pyc 4 | *.pyc 5 | doc/_build/ 6 | -------------------------------------------------------------------------------- /doc/tutorials/output_6_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flatironinstitute/adapol/HEAD/doc/tutorials/output_6_0.png -------------------------------------------------------------------------------- /doc/tutorials/output_6_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flatironinstitute/adapol/HEAD/doc/tutorials/output_6_1.png -------------------------------------------------------------------------------- /doc/tutorials/output_8_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flatironinstitute/adapol/HEAD/doc/tutorials/output_8_0.png -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | prune .git 2 | prune .github 3 | prune build 4 | prune doc 5 | prune example 6 | prune test 7 | 8 | global-exclude .gitignore pytest.ini 9 | -------------------------------------------------------------------------------- /src/adapol/__init__.py: -------------------------------------------------------------------------------- 1 | from .hybfit import hybfit, hybfit_triqs 2 | from .anacont import anacont 3 | from .fit_utils import check_psd 4 | __all__ = ["hybfit", "hybfit_triqs", "check_psd", "anacont", "anacont_triqs"] 5 | -------------------------------------------------------------------------------- /doc/documentation.rst: -------------------------------------------------------------------------------- 1 | .. _documentation: 2 | 3 | Documentation 4 | ============== 5 | 6 | Tutorials 7 | ----------------------- 8 | 9 | .. toctree:: 10 | :maxdepth: 2 11 | 12 | tutorials/discrete 13 | tutorials/semicircle 14 | 15 | Python reference manual 16 | ---------------------------- 17 | 18 | .. toctree:: 19 | :maxdepth: 2 20 | 21 | python 22 | -------------------------------------------------------------------------------- /doc/python.rst: -------------------------------------------------------------------------------- 1 | Hybridization fitting 2 | ===================== 3 | 4 | .. autofunction:: adapol.hybfit.hybfit 5 | 6 | Analytic continuation 7 | ===================== 8 | 9 | .. autofunction:: adapol.anacont.anacont 10 | 11 | TRIQS interface 12 | ===================== 13 | 14 | .. autofunction:: adapol.hybfit.hybfit_triqs 15 | .. autofunction:: adapol.anacont.anacont_triqs 16 | -------------------------------------------------------------------------------- /doc/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line, and also 5 | # from the environment for the first two. 6 | SPHINXOPTS ?= 7 | SPHINXBUILD ?= sphinx-build 8 | SOURCEDIR = . 9 | BUILDDIR = _build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 21 | -------------------------------------------------------------------------------- /doc/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=. 11 | set BUILDDIR=_build 12 | 13 | %SPHINXBUILD% >NUL 2>NUL 14 | if errorlevel 9009 ( 15 | echo. 16 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 17 | echo.installed, then set the SPHINXBUILD environment variable to point 18 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 19 | echo.may add the Sphinx directory to PATH. 20 | echo. 21 | echo.If you don't have Sphinx installed, grab it from 22 | echo.https://www.sphinx-doc.org/ 23 | exit /b 1 24 | ) 25 | 26 | if "%1" == "" goto help 27 | 28 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 29 | goto end 30 | 31 | :help 32 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 33 | 34 | :end 35 | popd 36 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = ["setuptools"] 3 | build-backend = "setuptools.build_meta" 4 | 5 | [tool.setuptools.packages.find] 6 | where = ["src"] 7 | 8 | [project] 9 | name = "adapol" 10 | version = "0.1.0" 11 | authors = [ 12 | { name="Zhen Huang", email="hertz@berkeley.edu" }, 13 | { name="Chia-Nan Yeh", email="cyeh@flatironinstitute.org"}, 14 | { name="Nils Wentzell", email="nwentzell@flatironinstitute.org"}, 15 | { name="Jason Kaye", email="jkaye@flatironinstitute.org"}, 16 | { name="Lin Lin", email="linlin@berkeley.edu"} 17 | ] 18 | description = "Adaptive Pole Fitting for Quantum Many-Body Physics " 19 | readme = "README.md" 20 | keywords = ["Bath", "Fitting", "Hybridization", "DMFT", "Matsubara"] 21 | requires-python = ">=3.7" 22 | classifiers = [ 23 | "Programming Language :: Python :: 3", 24 | "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", 25 | "Operating System :: OS Independent", 26 | ] 27 | dependencies = [ 28 | "numpy", 29 | "scipy", 30 | "cvxpy" 31 | ] 32 | 33 | [project.urls] 34 | "Homepage" = "https://flatironinstitute.github.io/adapol" 35 | "Bug Tracker" = "https://github.com/flatironinstitute/adapol/issues" 36 | -------------------------------------------------------------------------------- /.github/workflows/publish-to-pypi.yml: -------------------------------------------------------------------------------- 1 | name: Publish PyPI 2 | 3 | on: 4 | push: 5 | tags: 6 | - '[0-9]+.[0-9]+.[0-9]+' 7 | - '[0-9]+.[0-9]+.[0-9]+rc[0-9]+' 8 | 9 | jobs: 10 | build: 11 | name: Build distribution 📦 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v4 15 | - name: Set up Python 16 | uses: actions/setup-python@v5 17 | with: 18 | python-version: "3.x" 19 | - name: Install dependencies 20 | run: | 21 | pip3 install build pytest numpy scipy cvxpy 22 | - name: Build a binary wheel and a source tarball 23 | run: python3 -m build 24 | - name: Store the distribution packages 25 | uses: actions/upload-artifact@v4 26 | with: 27 | name: python-package-distributions 28 | path: dist/ 29 | 30 | publish-to-pypi: 31 | name: Publish PyPI 🐍 32 | needs: 33 | - build 34 | runs-on: ubuntu-latest 35 | environment: 36 | name: pypi 37 | url: https://pypi.org/p/adapol 38 | permissions: 39 | id-token: write # IMPORTANT: mandatory for trusted publishing 40 | 41 | steps: 42 | - name: Download all the dists 43 | uses: actions/download-artifact@v4 44 | with: 45 | name: python-package-distributions 46 | path: dist/ 47 | - name: Publish distribution 📦 to PyPI 48 | uses: pypa/gh-action-pypi-publish@release/v1 49 | with: 50 | skip-existing: true # skip if version name package already exists on pypi 51 | -------------------------------------------------------------------------------- /doc/index.rst: -------------------------------------------------------------------------------- 1 | .. _welcome: 2 | 3 | Adapol: adaptive pole fitting for quantum many-body physics 4 | ============================================================ 5 | `Adapol `_ (pronouced "add a pole") is a python package for fitting Matsubara functions with pole expansions. 6 | Current applications include bath fitting and analytic continuation. The name ``Adapol`` is short for **adaptive pole fitting**. 7 | 8 | 9 | Getting started 10 | ---------------- 11 | To use Adapol, first install it using pip: 12 | 13 | .. code-block:: console 14 | 15 | $ pip install adapol 16 | 17 | 18 | Learn how to use it in the :ref:`documentation`. 19 | 20 | For updates and latest versions, see `Github `_. 21 | 22 | References 23 | ----------- 24 | To cite this work, please include a reference to this GitHub repository, and 25 | cite the following references: 26 | 27 | - Zhen Huang, Emanuel Gull, and Lin Lin. "Robust analytic continuation of Green's functions via projection, pole estimation, and semidefinite relaxation." Physical Review B 107.7 (2023): 075151. 28 | - Carlos Mejuto-Zaera, et al. "Efficient hybridization fitting for dynamical mean-field theory via semi-definite relaxation." Physical Review B 101.3 (2020): 035143. 29 | - Yuji Nakatsukasa, Olivier Sète, and Lloyd N. Trefethen. "The AAA algorithm for rational approximation." SIAM Journal on Scientific Computing 40.3 (2018): A1494-A1522. 30 | 31 | .. toctree:: 32 | :maxdepth: 2 33 | :hidden: 34 | 35 | theories 36 | algorithms 37 | documentation 38 | -------------------------------------------------------------------------------- /.github/workflows/python-package.yml: -------------------------------------------------------------------------------- 1 | # This workflow will install Python dependencies, run tests and lint with a variety of Python versions 2 | # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python 3 | 4 | name: Python package 5 | 6 | on: 7 | push: 8 | branches: [ "main", "0.1.x" ] 9 | pull_request: 10 | branches: [ "main", "0.1.x" ] 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: ubuntu-latest 16 | strategy: 17 | fail-fast: false 18 | matrix: 19 | python-version: ["3.9", "3.10", "3.11", "3.12"] 20 | 21 | steps: 22 | - uses: actions/checkout@v4 23 | - name: Set up Python ${{ matrix.python-version }} 24 | uses: actions/setup-python@v5 25 | with: 26 | python-version: ${{ matrix.python-version }} 27 | - name: Install dependencies 28 | run: | 29 | pip3 install pytest numpy scipy cvxpy sphinx sphinx-rtd-theme nbsphinx ipython 30 | - name: Lint with Ruff 31 | run: | 32 | pip install ruff 33 | ruff check --output-format=github . -v 34 | - name: Test with pytest 35 | run: | 36 | pip install -e . 37 | pytest -m "not triqs" 38 | 39 | - name: Build Documention 40 | run: | 41 | cd doc 42 | make html 43 | 44 | - name: Deploy documentation to website 45 | if: matrix.python-version == '3.12' && github.ref == 'refs/heads/0.1.x' 46 | uses: JamesIves/github-pages-deploy-action@v4 47 | with: 48 | folder: doc/_build/html 49 | branch: github.io 50 | target-folder: docs/0.1.x 51 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # adapol: Adaptive Pole Fitting for Quantum Many-Body Physics 2 | [`adapol`](https://github.com/Hertz4/Adapol) (pronounced "add a pole") is a python package for fitting Matsubara functions with the following form: 3 | ```math 4 | G(\mathrm i \omega_k) = \sum_l \frac{V_lV_l^{\dagger}}{\mathrm i\omega_k - E_l}. 5 | ``` 6 | 7 | Current applications include 8 | (1) hybridization fitting, (2) analytic continuation. 9 | 10 | We also provide a [TRIQS](https://triqs.github.io/) interface if the Matsubara functions are stored in `triqs` Green's function container. 11 | 12 | # Installation 13 | `adapol` has `numpy` and `scipy` as its prerequisites. [`cvxpy`](https://www.cvxpy.org/) is also required for hybridization fitting of matrix-valued (instead of scalar-valued) Matsubara functions. 14 | 15 | To install `adapol`, run 16 | ```terminal 17 | pip install adapol 18 | ``` 19 | 20 | 21 | 22 | # Documentation 23 | 24 | See the detailed [documentation](https://flatironinstitute.github.io/adapol/) for physical background, algorithms and user manual. 25 | 26 | `Adapol` is a stand-alone package. For TRIQS users, we also provide a TRIQS interface. See [user manual](https://flatironinstitute.github.io/adapol/latest/python.html#triqs-interface) for details. 27 | 28 | # Examples 29 | In the `tutorial` page, we provide two examples [`discrete.ipynb`](https://flatironinstitute.github.io/adapol/latest/tutorials/discrete.html) and [`semicircle.ipynb`](https://flatironinstitute.github.io/adapol/latest/tutorials/semicircle.html), showcasing how to use `adapol` for both discrete spectrum and continuous spectrum. 30 | 31 | In these notebooks, we also demonstrate how to use our code through the triqs interface. 32 | 33 | # References 34 | To cite this work, please include a reference to this GitHub repository, and 35 | cite the following references: 36 | 37 | 1. Huang, Zhen, Emanuel Gull, and Lin Lin. "Robust analytic continuation of Green's functions via projection, pole estimation, and semidefinite relaxation." Physical Review B 107.7 (2023): 075151. 38 | 2. Mejuto-Zaera, Carlos, et al. "Efficient hybridization fitting for dynamical mean-field theory via semi-definite relaxation." Physical Review B 101.3 (2020): 035143. 39 | 3. Nakatsukasa, Yuji, Olivier Sète, and Lloyd N. Trefethen. "The AAA algorithm for rational approximation." SIAM Journal on Scientific Computing 40.3 (2018): A1494-A1522. 40 | -------------------------------------------------------------------------------- /doc/conf.py: -------------------------------------------------------------------------------- 1 | # Configuration file for the Sphinx documentation builder. 2 | # 3 | # This file only contains a selection of the most common options. For a full 4 | # list see the documentation: 5 | # https://www.sphinx-doc.org/en/master/usage/configuration.html 6 | 7 | # -- Path setup -------------------------------------------------------------- 8 | 9 | # If extensions (or modules to document with autodoc) are in another directory, 10 | # add these directories to sys.path here. If the directory is relative to the 11 | # documentation root, use os.path.abspath to make it absolute, like shown here. 12 | # 13 | import os 14 | import sys 15 | sys.path.insert(0, os.path.abspath('./src/adapol')) 16 | 17 | 18 | 19 | # -- Project information ----------------------------------------------------- 20 | 21 | project = 'Adapol' 22 | copyright = '2024, Zhen Huang' 23 | author = 'Zhen Huang, Chia-nan Yeh, Jason Kaye, Nils Wentzell, Lin Lin' 24 | 25 | # The full version, including alpha/beta/rc tags 26 | release = '0.1' 27 | 28 | 29 | # -- General configuration --------------------------------------------------- 30 | 31 | # Add any Sphinx extension module names here, as strings. They can be 32 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom 33 | # ones. 34 | extensions = [ 35 | 'sphinx.ext.duration', 36 | 'sphinx.ext.doctest', 37 | 'sphinx.ext.todo', 38 | 'sphinx.ext.viewcode', 39 | 'sphinx.ext.autodoc', 40 | 'sphinx.ext.autosummary', 41 | 'nbsphinx', 42 | ] 43 | 44 | # Add any paths that contain templates here, relative to this directory. 45 | templates_path = ['_templates'] 46 | 47 | # List of patterns, relative to source directory, that match files and 48 | # directories to ignore when looking for source files. 49 | # This pattern also affects html_static_path and html_extra_path. 50 | exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] 51 | 52 | 53 | # -- Options for HTML output ------------------------------------------------- 54 | 55 | # The theme to use for HTML and HTML Help pages. See the documentation for 56 | # a list of builtin themes. 57 | # 58 | html_theme = 'sphinx_rtd_theme' 59 | # Add any paths that contain custom static files (such as style sheets) here, 60 | # relative to this directory. They are copied after the builtin static files, 61 | # so a file named "default.css" will overwrite the builtin "default.css". 62 | html_static_path = ['_static'] 63 | -------------------------------------------------------------------------------- /test/test_semicircle.py: -------------------------------------------------------------------------------- 1 | import pytest # noqa 2 | import numpy as np 3 | import scipy 4 | from adapol.hybfit import hybfit, hybfit_triqs 5 | 6 | 7 | def Kw(w, v): 8 | return 1 / ( v - w) 9 | 10 | 11 | def semicircular(x): 12 | return 2 * np.sqrt(1 - x**2) / np.pi 13 | 14 | 15 | def make_Delta_with_cont_spec(N1, Z, rho, a=-1.0, b=1.0, eps=1e-12): 16 | np.random.seed(0) 17 | H = np.random.rand(N1, N1) + 1j * np.random.rand(N1, N1) 18 | H = H + np.conj(H.T) 19 | 20 | Delta = np.zeros((Z.shape[0], H.shape[0], H.shape[1]), dtype=np.complex128) 21 | en, vn = np.linalg.eig(H) 22 | en = en / np.max(np.abs(en)) # np.random.rand(en.shape[0]) 23 | for i in range(en.shape[0]): 24 | for n in range(len(Z)): 25 | 26 | def f(w): 27 | return Kw(w - en[i], Z[n]) * rho(w) 28 | 29 | # f = lambda w: Kw(w-en[i],Z[n])*rho(w) 30 | gn = scipy.integrate.quad( 31 | f, a, b, epsabs=eps, epsrel=eps, complex_func=True 32 | )[0] 33 | Delta[n, :, :] = Delta[n, :, :] + gn * vn[:, i] * np.conj( 34 | np.transpose(vn[None, :, i]) 35 | ) 36 | 37 | return H, Delta 38 | 39 | 40 | beta = 20 41 | N = 55 42 | Z = 1j *(np.linspace(-N, N, N + 1)) * np.pi / beta 43 | 44 | dim = 3 45 | H, Delta = make_Delta_with_cont_spec(dim, Z, semicircular) 46 | 47 | 48 | def fit_cont(tol): 49 | bathenergy, bathhyb, final_error, func = hybfit( 50 | Delta, Z, tol=tol, maxiter=500 51 | ) 52 | 53 | assert final_error < tol 54 | 55 | 56 | def fit_cont_triqs(tol): 57 | try: 58 | from triqs.gf import Gf, BlockGf, MeshImFreq 59 | except ImportError: 60 | raise ImportError("It seems like you are running tests with the triqs interface " 61 | "but failed to import the triqs package ((https://triqs.github.io/triqs/latest/). " 62 | "Please ensure that it is installed, or run \"pytest -m 'not triqs'\" to disable " 63 | "the tests for triqs.") 64 | 65 | norb = Delta.shape[-1] 66 | iw_mesh = MeshImFreq(beta=beta, S='Fermion', n_iw=(N+1)//2) 67 | delta_iw = Gf(mesh=iw_mesh, target_shape=[norb, norb]) 68 | delta_iw.data[:] = Delta 69 | 70 | # Gf interface 71 | bathhyb, bathenergy, delta_fit, final_error = hybfit_triqs(delta_iw, tol=tol, maxiter=500, debug=True) 72 | assert final_error < tol 73 | 74 | # BlockGf interface 75 | delta_blk = BlockGf(name_list=['up', 'down'], block_list=[delta_iw, delta_iw], make_copies=True) 76 | bathhyb, bathenergy, delta_fit, final_error = hybfit_triqs(delta_blk, tol=tol, maxiter=500, debug=True) 77 | assert final_error[0] < tol and final_error[1] < tol 78 | 79 | 80 | def test_cont(): 81 | fit_cont(5e-4) 82 | 83 | 84 | @pytest.mark.triqs 85 | def test_cont_triqs(): 86 | fit_cont_triqs(5e-4) 87 | 88 | -------------------------------------------------------------------------------- /test/test_discrete.py: -------------------------------------------------------------------------------- 1 | import pytest # noqa 2 | import numpy as np 3 | import scipy 4 | from adapol.hybfit import hybfit, hybfit_triqs 5 | 6 | 7 | 8 | def make_Delta_with_random_discrete_pole(Np, Z): 9 | np.random.seed(0) 10 | pol = np.random.randn(Np) 11 | pol = pol / np.max(np.abs(pol)) 12 | vec = scipy.stats.ortho_group.rvs(dim=Np) 13 | weight = np.array( 14 | [vec[:, i, None] * np.transpose(np.conj(vec[:, i])) for i in range(Np)] 15 | ) 16 | 17 | pol_t = np.reshape(pol, [pol.size, 1]) 18 | M = 1 / ( Z - pol_t) 19 | M = M.transpose() 20 | if len(weight.shape) == 1: 21 | weight = weight / sum(weight) 22 | Delta = M @ weight 23 | else: 24 | Np = weight.shape[0] 25 | Norb = weight.shape[1] 26 | Nw = len(Z) 27 | Delta = (M @ (weight.reshape(Np, Norb * Norb))).reshape(Nw, Norb, Norb) 28 | return pol, vec, weight, Delta 29 | 30 | 31 | def tst_discrete(Np): 32 | beta = 20 33 | N = 105 34 | Z = 1j *(np.linspace(-N, N, N + 1)) * np.pi / beta 35 | tol = 1e-6 36 | pol_true, vec_true, weight_true, Delta = make_Delta_with_random_discrete_pole(Np, Z) 37 | 38 | bathenergy, bathhyb, final_error, func = hybfit( 39 | Delta, Z, tol=tol, maxiter=50 40 | ) 41 | assert final_error < tol 42 | 43 | 44 | def tst_discrete_triqs(Np): 45 | try: 46 | from triqs.gf import Gf, BlockGf, MeshImFreq 47 | except ImportError: 48 | raise ImportError("It seems like you are running tests with the triqs interface " 49 | "but failed to import the triqs package ((https://triqs.github.io/triqs/latest/). " 50 | "Please ensure that it is installed, or run \"pytest -m 'not triqs'\" to disable " 51 | "the tests for triqs.") 52 | 53 | beta = 20 54 | N = 105 55 | Z = 1j * (np.linspace(-N, N, N + 1)) * np.pi / beta 56 | tol = 1e-6 57 | pol_true, vec_true, weight_true, Delta = make_Delta_with_random_discrete_pole(Np, Z) 58 | 59 | norb = Delta.shape[-1] 60 | iw_mesh = MeshImFreq(beta=beta, S='Fermion', n_iw=(N+1)//2) 61 | delta_iw = Gf(mesh=iw_mesh, target_shape=[norb, norb]) 62 | delta_iw.data[:] = Delta 63 | 64 | # Gf interface 65 | bathhyb, bathenergy, delta_fit, final_error = hybfit_triqs(delta_iw, tol=tol, maxiter=50, debug=True) 66 | assert final_error < tol 67 | 68 | # BlockGf interface 69 | delta_blk = BlockGf(name_list=['up', 'down'], block_list=[delta_iw, delta_iw], make_copies=True) 70 | bathhyb, bathenergy, delta_fit, final_error = hybfit_triqs(delta_blk, tol=tol, maxiter=50, debug=True) 71 | assert final_error[0] < tol and final_error[1] < tol 72 | 73 | 74 | @pytest.mark.parametrize("Np", [2, 3, 4, 5, 6, 7]) 75 | def test_discrete(Np): 76 | tst_discrete(Np) 77 | 78 | 79 | @pytest.mark.triqs 80 | @pytest.mark.parametrize("Np", [2, 3, 4, 5, 6, 7]) 81 | def test_discrete_triqs(Np): 82 | tst_discrete_triqs(Np) 83 | -------------------------------------------------------------------------------- /src/adapol/aaa.py: -------------------------------------------------------------------------------- 1 | """ 2 | This code implements a specific variant of the AAA algorithm. 3 | 4 | """ 5 | 6 | import numpy as np 7 | import scipy.linalg 8 | 9 | 10 | def aaa_matrix_real(F, Z, tol=1e-13, mmax=100): 11 | """ """ 12 | Z = np.asanyarray(Z).ravel() 13 | 14 | # only use input z that are on iR_+. Will map them to iR_- by taking conjugate of function value. 15 | half_index = np.imag(Z) > 0 16 | Z_half = Z[half_index] 17 | F_half = F[half_index, :, :] 18 | M_half = len(Z_half) 19 | 20 | Z = np.append(Z_half, np.conjugate(Z_half)) 21 | 22 | Norb = F.shape[1] 23 | F_other_half = np.zeros_like(F_half) 24 | for i in range(M_half): 25 | F_other_half[i, :, :] = np.conjugate(np.transpose(F_half[i, :, :])) 26 | F = np.concatenate((F_half, F_other_half), axis=0) 27 | 28 | M = M_half * 2 29 | 30 | F_mat = np.reshape(F, (M, Norb * Norb)) 31 | 32 | J = list(range(M)) 33 | zj = np.empty(0, dtype=Z.dtype) 34 | fj = np.empty((0, Norb * Norb), dtype=F.dtype) 35 | C = np.empty([M, 0], dtype=F.dtype) 36 | errors = [] 37 | 38 | reltol = tol * np.linalg.norm(F_mat, np.inf) 39 | 40 | R = np.mean(F_mat) * np.ones_like(F_mat) 41 | 42 | mlist = range(2, mmax + 1, 2) 43 | 44 | for m in mlist: 45 | # find largest residual 46 | jj = np.argmax(np.sum(abs(F_mat - R) ** 2, 1)) 47 | zj = np.append(zj, (Z[jj],)) 48 | fj = np.concatenate((fj, F_mat[jj : jj + 1, :]), axis=0) 49 | J.remove(jj) 50 | 51 | # Cauchy matrix containing the basis functions as columns 52 | 53 | jj2 = (jj + M_half) % M 54 | zj = np.append(zj, (Z[jj2],)) 55 | fj = np.concatenate((fj, F_mat[jj2 : jj2 + 1, :]), axis=0) 56 | 57 | J.remove(jj2) 58 | 59 | C = 1.0 / (Z[J, None] - zj[None, :]) 60 | 61 | # Loewner matrix 62 | Apart = np.zeros(((M - m) * Norb * Norb, m), dtype=F.dtype) 63 | for i in range(Norb * Norb): 64 | Fhere = F_mat[:, i] 65 | fjhere = fj[:, i] 66 | 67 | Apart[range(0 + i, i + (M - m) * Norb * Norb, Norb * Norb), :] = ( 68 | Fhere[J, None] - fjhere[None, :] 69 | ) * C 70 | 71 | Awidth = np.size(Apart, 1) 72 | Apart_l = Apart[:, range(0, Awidth, 2)] 73 | Apart_r = Apart[:, range(1, Awidth, 2)] 74 | Anew = np.concatenate((Apart_l + Apart_r, (Apart_l - Apart_r) * 1j), axis=1) 75 | Anew = np.concatenate((np.real(Anew), np.imag(Anew)), axis=0) 76 | 77 | # compute weights as right singular vector for smallest singular value 78 | _, _, Vh = np.linalg.svd(Anew, full_matrices=False) 79 | 80 | wj_r = Vh[-1, :] 81 | 82 | wj_r = np.reshape(wj_r, (2, int(m / 2))) 83 | wj_c = np.zeros((2, int(m / 2)), dtype=np.complex128) 84 | wj_c[0, :] = wj_r[0, :] + 1j * wj_r[1, :] 85 | wj_c[1, :] = wj_r[0, :] - 1j * wj_r[1, :] 86 | 87 | wj = np.asanyarray(wj_c.T).ravel() 88 | 89 | # approximation: numerator / denominator 90 | 91 | D = C.dot(wj) 92 | 93 | # update residual 94 | R = F_mat.copy() 95 | 96 | for i in range(Norb * Norb): 97 | fjhere = fj[:, i] 98 | N = C.dot(wj * fjhere) # needs to change N and R 99 | R[J, i] = N / D 100 | 101 | # check for convergence 102 | errors.append(np.linalg.norm(F_mat - R, np.inf)) 103 | if errors[-1] <= reltol: 104 | break 105 | 106 | fj = fj.reshape(m, Norb, Norb) 107 | pol = aaa_pol(zj, wj) 108 | return pol, zj, fj, wj 109 | 110 | 111 | def aaa_pol(zj, wj): 112 | """Return the poles and residues of the rational function.""" 113 | 114 | m = len(wj) 115 | 116 | # compute poles 117 | B = np.eye(m + 1) 118 | B[0, 0] = 0 119 | E = np.block([[0, wj], [np.ones((m, 1)), np.diag(zj)]]) 120 | evals = scipy.linalg.eigvals(E, B) 121 | pol = np.real_if_close(evals[np.isfinite(evals)]) 122 | 123 | return pol 124 | -------------------------------------------------------------------------------- /doc/tutorials/semicircle.rst: -------------------------------------------------------------------------------- 1 | .. _semicircle: 2 | 3 | Matsubara fitting for data with continuous spectrum (semicircular density) 4 | =========================================================================== 5 | 6 | In this notebook, we aim to fit the following Matsubara function: 7 | 8 | .. math:: 9 | 10 | 11 | G(\mathrm i\nu_n) = \int_{-\infty}^{\infty} \frac{1}{\mathrm i\nu_n - w} \rho(w), 12 | 13 | where :math:`\rho(w)` is the semicircular spectral function 14 | 15 | .. math:: 16 | 17 | 18 | \rho(w) = \left\{ 19 | \begin{aligned} 20 | \frac{2}{\pi}\sqrt{1-w^2}, \quad &-1\leq w\leq 1, \\ 21 | 0, \quad &w>1 \text{ and } w<-1. 22 | \end{aligned} 23 | \right. 24 | 25 | and :math:`\mathrm i\nu_n` is the Matsubara frequency: 26 | 27 | .. math:: 28 | 29 | 30 | \mathrm i\nu_n = \left\{ 31 | \begin{aligned} 32 | \mathrm i \frac{(2n+1)\pi}{\beta}, & \text{ for fermions},\\ 33 | \mathrm i \frac{2n\pi}{\beta}, & \text{ for bosons}. 34 | \end{aligned} 35 | \right. 36 | 37 | Here :math:`\beta` is the inverse temperature. 38 | 39 | Let us first set inverse temperature :math:`\beta` and the Matsubara 40 | frequencies :math:`Z = \{\mathrm i\nu_n\}`. 41 | 42 | .. code:: ipython3 43 | 44 | import numpy as np 45 | import matplotlib.pyplot as plt 46 | from adapol import hybfit 47 | import scipy 48 | beta = 20 49 | N = 55 50 | Z = 1j *(np.linspace(-N, N, N + 1)) * np.pi / beta 51 | 52 | Now we construct the Matsubara data using the above equation. The 53 | integral is evaluated with adaptive quadrature: 54 | 55 | .. code:: ipython3 56 | 57 | def Kw(w, v): 58 | return 1 / ( v - w) 59 | def semicircular(x): 60 | return 2 * np.sqrt(1 - x**2) / np.pi 61 | def make_Delta_with_cont_spec( Z, rho, a=-1.0, b=1.0, eps=1e-12): 62 | Delta = np.zeros((Z.shape[0]), dtype=np.complex128) 63 | for n in range(len(Z)): 64 | def f(w): 65 | return Kw(w , Z[n]) * rho(w) 66 | 67 | # f = lambda w: Kw(w-en[i],Z[n])*rho(w) 68 | Delta[n] = scipy.integrate.quad( 69 | f, a, b, epsabs=eps, epsrel=eps, complex_func=True 70 | )[0] 71 | 72 | 73 | return Delta 74 | 75 | Delta = make_Delta_with_cont_spec( Z, semicircular) 76 | 77 | Below we show that by increasing number of modes :math:`N_p`, the 78 | fitting error decreases. 79 | 80 | .. code:: ipython3 81 | 82 | error = [] 83 | Nbath = [] 84 | for Np in range(2, 12, 2): 85 | bathenergy, bathhyb, final_error, func = hybfit(Delta, Z, Np = Np, verbose=False) 86 | Nbath.append(len(bathenergy)) 87 | error.append(final_error) 88 | plt.yscale('log') 89 | plt.plot(Nbath, error, 'o-') 90 | plt.xlabel('Number of bath sites') 91 | plt.ylabel('Fitting Error') 92 | plt.title("Semicircular Density ") 93 | plt.show() 94 | 95 | 96 | 97 | .. image:: output_6_0.png 98 | 99 | 100 | .. raw:: html 101 | 102 |

103 | 104 | Triqs Interface 105 | 106 | .. raw:: html 107 | 108 |

109 | 110 | Let us demonstrate how to use our code if the Matsubara functions are 111 | given using the TRIQS data structure. 112 | 113 | In trqis, the Matsubara frequencies are defined using ``MeshImFreq``: 114 | 115 | .. code:: ipython3 116 | 117 | from triqs.gf import MeshImFreq 118 | Norb = 1 119 | iw_mesh = MeshImFreq(beta=beta, S='Fermion', n_iw=Z.shape[0]//2) 120 | 121 | The ``hybfit_triqs`` function could handle TRIQS Green’s functions 122 | object ``GF`` and ``BlockGf``: 123 | 124 | .. code:: ipython3 125 | 126 | from triqs.gf import Gf, BlockGf 127 | from adapol import hybfit_triqs 128 | delta_iw = Gf(mesh=iw_mesh, target_shape=[Norb, Norb]) 129 | delta_iw.data[:,0,0] = Delta 130 | 131 | #Construct BlockGf object 132 | delta_blk = BlockGf(name_list=['up', 'down'], block_list=[delta_iw, delta_iw], make_copies=True) 133 | 134 | tol = 1e-6 135 | # Gf interface for hybridization fitting 136 | bathhyb, bathenergy, delta_fit, final_error = hybfit_triqs(delta_iw, tol=tol, maxiter=50, debug=True) 137 | assert final_error < tol 138 | 139 | # BlockGf interface for hybridization fitting 140 | bathhyb, bathenergy, delta_fit, final_error = hybfit_triqs(delta_blk, tol=tol, maxiter=50, debug=True) 141 | assert final_error[0] < tol and final_error[1] < tol 142 | 143 | 144 | .. parsed-literal:: 145 | 146 | optimization finished with fitting error 9.538e-08 147 | optimization finished with fitting error 9.538e-08 148 | optimization finished with fitting error 9.538e-08 149 | 150 | -------------------------------------------------------------------------------- /doc/algorithms.rst: -------------------------------------------------------------------------------- 1 | .. _algorithms: 2 | 3 | Algorithms 4 | ====================== 5 | 6 | Obtain bath fitting from pole fitting 7 | -------------------------------------------- 8 | 9 | In bath fitting, given :math:`\Delta(\mathrm i\nu_k)` evaluated on :math:`\{\mathrm i\nu_k\}_{k=1}^{N_{w}}`, we wish to find 10 | :math:`V_j, E_j` such that 11 | 12 | .. math:: 13 | 14 | \begin{equation} 15 | \Delta(\mathrm i\nu_k) = \sum_{j=1}^{N_b} \frac{V_jV_j^{\dagger}}{\mathrm i\nu_k - E_j}. 16 | \end{equation} 17 | 18 | This is achieved by the following strategy: 19 | 20 | - Find pole fitting with semidefinite constraints: 21 | 22 | .. math:: 23 | 24 | \begin{equation} 25 | \Delta(\mathrm i\nu_k) = \sum_{p=1}^{N_p} \frac{M_p}{\mathrm i\nu_k - \lambda_p}, M_p\geq 0, \tag{1} \label{polefit} 26 | \end{equation} 27 | 28 | Here :math:`M_p` are :math:`N_{\text{orb}}\times N_{\text{orb}}` positive semidefinite matrices. 29 | 30 | - Compute eigenvalue decomposition of :math:`M_p`: 31 | 32 | .. math:: 33 | 34 | M_p = \sum_{j=1}^{N_{\text{orb}}} V_{j}^{(p)} (V_{j}^{(p)})^{\dagger}. \tag{2} \label{eigdecomp} 35 | 36 | - Combining :math:`\eqref{polefit}` and :math:`\eqref{eigdecomp}`, we obtain the desired bath fitting: 37 | 38 | .. math:: 39 | 40 | \Delta(\mathrm i\nu_k) = \sum_{pj} \frac{V_{j}^{(p)}(V_{j}^{(p)})^{\dagger}}{\mathrm i\nu_k - \lambda_p}. 41 | 42 | 43 | 44 | Rational approximation via (modified) AAA algorithm 45 | ------------------------------------------------------------------------------------------------------------ 46 | 47 | To find the poles :math:`\lambda_p` in :math:`\eqref{polefit}`, we use the `AAA algorithm `_, which is a rational approximation algorithm based on the Barycentric interpolant: 48 | 49 | .. math:: 50 | 51 | \begin{equation} 52 | f(z) = \frac{p(z)}{q(z)} = \frac{\sum_{j=1}^{m} \frac{c_jf_j}{z - z_j}}{\sum_{j=1}^{m} \frac{c_j}{z - z_j}.}. 53 | \tag{3} \label{bary} 54 | \end{equation} 55 | 56 | The AAA algorithm is an iterative procedure. It selects the next support point in a greedy fashion. 57 | Suppose we have obtained an approximant :math:`\widetilde f` from the :math:`(k-1)`-th iteration, using support point :math:`z_1,\cdots z_{k-1}`. 58 | At the :math:`k`-th iteration, we do the following: 59 | 60 | #. Select the next support point :math:`z_k` at which the previous approximant :math:`\widetilde f` has the largest error. 61 | 62 | #. Find :math:`c_k` in :math:`\eqref{bary}` by solving the following linear square problem: 63 | 64 | .. math:: 65 | 66 | \begin{equation} 67 | \min_{\{c_k\}} \sum_{z\neq z_1,\cdots z_k} \left| f(z) q(z) - p(z) \right|^2. \quad \text{s.t.} \|c\|_2= 1. 68 | \end{equation} 69 | 70 | This is a linear problem and amounts to solving a SVD problem. (See details in `paper `_). 71 | 72 | #. If the new approximant has reached desired accuracy, stop the iteration. Otherwise, repeat the above steps. 73 | 74 | The poles of :math:`f(z)` are the zeros of :math:`q(z)`, which can be found by solving the following generalized eigenvalue problem: 75 | 76 | .. math:: 77 | 78 | \begin{equation} 79 | \left(\begin{array}{ccccc} 80 | 0 & c_1 & c_2 & \cdots & c_m \\ 81 | 1 & z_1 & & & \\ 82 | 1 & & z_2 & & \\ 83 | \vdots & & & \ddots & \\ 84 | 1 & & & & z_m 85 | \end{array}\right)=\lambda\left(\begin{array}{lllll} 86 | 0 & & & & \\ 87 | & 1 & & & \\ 88 | & & 1 & & \\ 89 | & & & \ddots & \\ 90 | & & & & 1 91 | \end{array}\right) 92 | \end{equation} 93 | 94 | For our application, we modify the AAA algorithm to deal with matrix-valued functions by replacing :math:`f_j` with matrices :math:`F_j`. 95 | 96 | Semidefinite programming 97 | -------------------------------------------- 98 | 99 | After obtaining :math:`\lambda_p`, we need to find the weight matrices :math:`M_p` in :math:`\eqref{polefit}`. 100 | We are solving the following problem: 101 | 102 | .. math:: 103 | 104 | \begin{equation} 105 | \min_{\{M_p\}} \sum_{k=1}^{N_w} \left\| \Delta(\mathrm i\nu_k) - \sum_{p=1}^{N_p} \frac{M_p}{\mathrm i\nu_k - \lambda_p} \right\|_F^2, \quad \text{s.t. } M_p\geq 0. 106 | \end{equation} 107 | 108 | This is a linear problem with respect to :math:`M_p`, and has semidefinite constraints, therefore could be solved efficiently via standard semidefinite programming (SDP) solvers. 109 | 110 | Bi-level optimization 111 | -------------------------------------------- 112 | With :math:`\lambda_p` and :math:`M_p` obtained, we can further refine the poles and weights by solving the following bi-level optimization. 113 | Let us define the error function as 114 | 115 | .. math:: 116 | 117 | \begin{equation} 118 | \text{Err}(\lambda_p, M_p) = \sum_{k=1}^{N_w} \left\| \Delta(\mathrm i\nu_k) - \sum_{p=1}^{N_p} \frac{M_p}{\mathrm i\nu_k - \lambda_p} \right\|_F^2. 119 | \end{equation} 120 | 121 | Note that :math:`\text{Err}` is linear in :math:`M_p` but nonlinear in :math:`\lambda_p`. As we have mentioned, optimization in :math:`M_p` is a SDP problem and therefore is robust, while optimization in :math:`\lambda_p` is a nonlinear problem and could be very challenging. 122 | This motivates us to define :math:`\text{Err}(\lambda_1,\cdots, \lambda_{N_p})` as a function of :math:`\{\lambda_p\}` only: 123 | 124 | .. math:: 125 | 126 | \begin{equation} 127 | \text{Err}(\lambda_1,\cdots, \lambda_{N_p}) = \min_{\{M_p\}}\text{Err}(\lambda_p, M_p) 128 | \end{equation} 129 | 130 | The value of :math:`\text{Err}(\lambda_1,\cdots, \lambda_{N_p})` is obtained by solving a SDP problem. 131 | The gradient of :math:`\text{Err}(\lambda_1,\cdots, \lambda_{N_p})` could also be obtained analytically. 132 | (For details, see eq. 28 `here `_.) 133 | And thus we could use a gradient-based optimization algorithm (L-BFGS) to minimize :math:`\text{Err}(\lambda_1,\cdots, \lambda_{N_p})` with respect to :math:`\{\lambda_p\}`. 134 | 135 | For performances, robustness and other details of this bi-level optimization framework, see again `our original paper `_. -------------------------------------------------------------------------------- /doc/theories.rst: -------------------------------------------------------------------------------- 1 | .. _theories: 2 | 3 | Physical background 4 | ====================== 5 | 6 | Matsubara functions 7 | -------------------------------------------- 8 | A Matsubara function :math:`G(\mathrm i\nu_k)` is a matrix-valued function of size :math:`N_{\text{orb}} \times N_{\text{orb}}`, 9 | where :math:`N_{\text{orb}}` is the number of orbitals, and :math:`\{\mathrm i\nu_k, k\in\mathbb Z\}` are the Matsubara frequencies: 10 | 11 | .. math:: 12 | 13 | \mathrm i\nu_k = \left\{ 14 | \begin{aligned} 15 | \mathrm i \frac{(2n+1)\pi}{\beta}, & \text{ for fermions},\\ 16 | \mathrm i \frac{2n\pi}{\beta}, & \text{ for bosons}. 17 | \end{aligned} 18 | \right. 19 | 20 | Here :math:`\beta` is the inverse temperature. 21 | 22 | The Matsubara function admits the following Lehmann representation: 23 | 24 | .. math:: 25 | \begin{equation} 26 | G(\mathrm i\nu_k) = \int_{-\infty}^{\infty} \frac{1}{\mathrm i\nu_k - w} \rho(w)\mathrm dw, \tag{1} 27 | \label{Lehmann} 28 | \end{equation} 29 | 30 | Here :math:`\rho(w)` is a matrix-valued function, and could either be sum of Dirac delta functions, or a continuous function. 31 | 32 | The Matsubara function in the time domain, denoted as :math:`G(\tau)`, is related to :math:`G(\mathrm i\nu_k)` by the Fourier transform: 33 | 34 | .. math:: 35 | 36 | G(\mathrm i\nu_k) = \int_{0}^{\beta} G(\tau)\mathrm{e}^{\mathrm i\nu_k\tau} \mathrm d\tau. 37 | 38 | In other words, :math:`G(\mathrm i\nu_k)` is the Fourier coefficient of :math:`G(\tau)`, and :math:`G(\tau)` satisfies the Kubo-Martin-Schwinger (KMS) (anti-)periodic condition: 39 | :math:`G(\tau+\beta) = \pm G(\tau)`. 40 | 41 | 42 | Pole fitting 43 | -------------------------------------------- 44 | It has been well known that any Matsubara functions :math:`G(\mathrm i\nu_k)` (i.e. functions defined by :math:`\eqref{Lehmann}`) could be well approximated by a finite sum of poles, 45 | 46 | .. math:: 47 | \begin{equation} 48 | G(\mathrm i\nu_k) \approx \sum_{p=1}^{N_p} \frac{M_p}{\mathrm i\nu_k - E_p}, \tag{2} 49 | \label{pole} 50 | \end{equation} 51 | 52 | where :math:`N_p` is the number of poles, :math:`M_p` is a matrix-valued function, and :math:`E_p` are the poles. 53 | 54 | Our goal is to obtain the poles :math:`E_p` and the weights :math:`M_p` (also known as the residues) numerically. 55 | We hope to obtain such an approximation with :math:`N_p` as small as possible. 56 | 57 | Hybridization fitting 58 | ---------------------- 59 | 60 | The hybridization fitting is a crucial subroutine in dynamical mean-field theory calculations. 61 | In DMFT, the hybridization function :math:`\Delta(\mathrm i\nu_k)`, 62 | which is obtained in each iteration of the DMFT self-consistent loop, is a matrix-valued Matsubara function of size :math:`N_{\text{orb}}\times N_{\text{orb}}`, where :math:`N_{\text{orb}}` is the number of impurity orbitals. 63 | After obtaining :math:`\Delta(\mathrm i\nu_k)`, one conduct the following **hybridization fitting**: 64 | 65 | .. math:: 66 | 67 | \begin{equation} 68 | \Delta(\mathrm i\nu_k) = \sum_{j=1}^{N_b} \frac{V_jV_j^{\dagger}}{\mathrm i\nu_k - E_j}. \tag{3} \label{hybfit} 69 | \end{equation} 70 | 71 | Here :math:`E_j\in\mathbb R` are bath energies, and :math:`V_j` are impurity-bath coupling coefficients, and are vectors of size :math:`(N_{\text{orb}},1)`. 72 | Using :math:`E_p` and the vectors :math:`V_p`, one can construct the new impurity-bath Hamiltonian :math:`\hat H`: 73 | 74 | .. math:: 75 | 76 | \hat H =\hat H_{\text{loc}} + \sum_{j=1}^{N_b} E_j \hat c_j^{\dagger} \hat c_j + \sum_{j=1}^{N_b} \sum_{\alpha=1}^{N_{\mathrm{orb}}} (V_{j\alpha}\hat c_j^{\dagger}\hat c_{\alpha} + \text{h.c.}). 77 | 78 | Here :math:`\hat H_{\text{loc}}` is the local impurity Hamiltonian. 79 | 80 | Note that :math:`N_b` is the number of bath orbitals, and is also the number of terms that are used in the hybridization fitting :math:`\eqref{hybfit}`. 81 | 82 | 83 | Analytical continuation 84 | -------------------------------------------- 85 | 86 | The Matsubara function :math:`G(\mathrm i\nu_k)` (as defined in Eq. :math:`\eqref{Lehmann}`) could be extended to a function that is defined on the entire complex plane: 87 | 88 | .. math:: 89 | 90 | G(z) = \int_{-\infty}^{\infty} \frac{1}{z - w} \rho(w)\mathrm dw. 91 | 92 | :math:`G(z)` is analytic in the upper half-plane, and in the lower half plane, but has a branch cut in the real axis. 93 | In the special case that :math:`\rho(w)` is sum of Dirac delta functions, :math:`G(z)` is a rational function and is analytic in the entire complex plane except for the poles. 94 | 95 | More importantly, :math:`\rho(w)` and :math:`G(z)` are related by the following formula: 96 | 97 | .. math:: 98 | 99 | \rho(w) = -\frac{1}{\pi} \lim_{\eta\to 0^+} \operatorname{Im} G(w+\mathrm i\eta). 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | Matsubara Green's function and spectral function 108 | ---------------------------------------------------- 109 | 110 | If :math:`G(\mathrm i\nu_k)` is a single-particle Green's function, (or similarly, any correlation functions), the Lehmann's representation states that it can be written as a sum of poles: 111 | 112 | .. math:: 113 | 114 | G_{ij}(\mathrm i\nu_k) =\frac{1}{Z} \sum_{r, s} \frac{\left\langle\Psi_s\left|\hat{c}_i\right| \Psi_r\right\rangle\left\langle\Psi_r\left|\hat{c}_j^{\dagger}\right| \Psi_s\right\rangle}{z+E_s-E_r}\left(\mathrm{e}^{-\beta E_s} \mp \mathrm{e}^{-\beta E_r}\right), 115 | 116 | where :math:`\hat{c}_i, \hat{c}_i^{\dagger}` are the annihilation and creation operator for the :math:`i`-th orbital, :math:`\left|\Psi_s\right\rangle` is the :math:`s`-th eigenvector of the Hamiltonian :math:`\hat H` with energy :math:`E_s`. 117 | 118 | By grouping the :math:`(r,s)` indices into a single index :math:`p`, we have a more compact form: 119 | 120 | .. math:: 121 | 122 | G(\mathrm i\nu_k) = \sum_{p=1}^{N_p} \frac{V_pV_p^{\dagger}}{\mathrm i\nu_k - E_p}, 123 | 124 | and in the thermodynamic limit, the sum becomes an integral: 125 | 126 | .. math:: 127 | 128 | G(\mathrm i\nu_k) = \int_{-\infty}^{\infty} \frac{1}{\mathrm i\nu_k - w} \rho(w), 129 | 130 | Here :math:`\rho(w)` is positive semi-definite for all :math:`w`. In the scalar case (:math:`N_{\text{orb}}=1`), :math:`\rho(w)` is the *spectral function*. 131 | In the matrix case, the spectral function is: 132 | 133 | .. math:: 134 | 135 | {\mathrm{Spec}}(w) = \sum_{i=1}^{N_{\text{orb}}}\rho_{ii}(w). 136 | 137 | Using the analytic continuation properties, 138 | the spectral function could be evaluated by calculating the Green's function on the real axis with infinitesimal broadening: 139 | 140 | .. math:: 141 | 142 | \mathrm{Spec}(w) = -\frac{1}{\pi} \lim_{\eta\to 0^+} \sum_{i=1}^{N_{\text{orb}}} \operatorname{Im} (G_{ii}(w+\mathrm i\eta)). 143 | -------------------------------------------------------------------------------- /src/adapol/anacont.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from .fit_utils import pole_fitting, eval_with_pole 3 | 4 | def anacont( 5 | Delta, 6 | iwn_vec, 7 | tol=None, 8 | Np=None, 9 | solver="lstsq", 10 | maxiter=500, 11 | mmin=4, 12 | mmax=50, 13 | verbose=False, 14 | ): 15 | """ 16 | The function for analytical continuation. 17 | 18 | Examples: 19 | ---------- 20 | 21 | - Analytic continuation with :math:`N_p` poles: 22 | :code:`func = anacont(Np = Np)` 23 | 24 | - Fitting with fixed error tolerance tol: 25 | :code:`func = anacont(tol = tol)` 26 | 27 | - Analytic continuation with improved accuracy: 28 | :code:`fitting(Np = Np, flag = flag, solver = "sdp")` 29 | 30 | Parameters: 31 | ------------ 32 | :code:`Delta`: np.array, :math:`(N_w, N_\mathrm{orb}, N_\mathrm{orb})` 33 | The input hybridization function in Matsubara frequency. 34 | 35 | :code:`iwn_vec`: np.array, :math:`(N_w,)` 36 | The Matsubara frequency vector, complex-valued 37 | 38 | 39 | :code:`tol`: Fitting error tolreance, float 40 | If tol is specified, the fitting will be conducted with fixed error tolerance tol. 41 | default: None 42 | 43 | :code:`Np`: number of poles, integer 44 | If Np is specified, the fitting will be conducted with fixed number of poles Np. 45 | default: None 46 | Np needs to be an odd integer, and number of supoort points is Np + 1. 47 | 48 | 49 | :code:`solver`: string 50 | The solver that is used for optimization. 51 | choices: "lstsq", "sdp" 52 | default: "lstsq" 53 | 54 | :code:`maxiter`: int 55 | maximum number of iterations 56 | default: 500 57 | 58 | :code:`mmin`, :code:`mmax`: number of minimum or maximum poles, integer 59 | default: mmin = 4, mmax = 50 60 | if tol is specified, mmin and mmax will be used as the minimum and maximum number of poles. 61 | if Np is specified, mmin and mmax will not be used. 62 | 63 | :code:`verbose`: bool 64 | whether to display optimization details 65 | default: False 66 | 67 | 68 | 69 | 70 | Returns: 71 | --------- 72 | :code:`func`: function 73 | Analytic continuation function: 74 | :math:`f(z) = \sum_n \mathrm{Weight}[n]/(z-\mathrm{pol}[n]).` 75 | 76 | :code:`fitting_error`: float 77 | fitting error 78 | 79 | :code:`pol`: np.array, :math:`(N_p,)` 80 | poles obtained from fitting 81 | 82 | :code:`weight`: np.array, :math:`(N_p, N_\mathrm{orb}, N_\mathrm{orb})` 83 | weights obtained from fitting 84 | 85 | """ 86 | 87 | # Check dimensions 88 | assert len(iwn_vec.shape) == 1 or len(iwn_vec.shape) == 2 89 | if len(iwn_vec.shape) == 2: 90 | assert iwn_vec.shape[1] == 1 91 | iwn_vec = iwn_vec.flatten() 92 | assert len(Delta.shape) == 3 or len(Delta.shape) == 1 93 | if len(Delta.shape) == 1: 94 | assert Delta.shape[0] == iwn_vec.shape[0] 95 | Delta = Delta[:, None, None] 96 | if len(Delta.shape) == 3: 97 | assert Delta.shape[0] == iwn_vec.shape[0] 98 | assert Delta.shape[1] == Delta.shape[2] 99 | 100 | solver = solver.lower() 101 | assert solver == "lstsq" or solver == "sdp" 102 | 103 | # Check input tol or Np 104 | if tol is None and Np is None: 105 | raise ValueError("Please specify either tol or Np") 106 | if tol is not None and Np is not None: 107 | raise ValueError( 108 | "Please specify either tol or Np. One can not specify both of them." 109 | ) 110 | 111 | wn_vec = np.imag(iwn_vec) 112 | 113 | if Np is not None: 114 | pol, weight, fitting_error = pole_fitting( 115 | Delta, wn_vec, Ns=Np+1, maxiter=maxiter, solver=solver, disp=verbose 116 | ) 117 | elif tol is not None: 118 | pol, weight, fitting_error = pole_fitting( 119 | Delta, 120 | wn_vec, 121 | tol=tol, 122 | mmin=mmin, 123 | mmax=mmax, 124 | maxiter=maxiter, 125 | solver=solver, 126 | disp=verbose, 127 | ) 128 | def func(Z): 129 | return eval_with_pole(pol, Z, weight) 130 | return func, fitting_error, pol, weight 131 | 132 | 133 | def anacont_triqs( 134 | Delta_triqs, 135 | tol=None, 136 | Np=None, 137 | solver="lstsq", 138 | maxiter=500, 139 | mmin=4, 140 | mmax=50, 141 | verbose=False, 142 | debug=False 143 | ): 144 | """ 145 | The triqs interface for analytical continuation. 146 | The function requires triqs package in python. 147 | 148 | Parameters: 149 | ------------ 150 | :code:`Delta_triqs`: triqs Green's function container 151 | The input hybridization function in Matsubara frequency 152 | 153 | :code:`debug`: bool 154 | return additional outputs for debugging. 155 | Default: False 156 | 157 | :code:`tol`, :code:`Np`, :code:`solver`, :code:`maxiter`, :code:`mmin`, :code:`mmax`, :code:`verbose`: 158 | same as in anacont 159 | 160 | 161 | Returns: 162 | --------- 163 | :code:`func`: function 164 | Analytic continuation function: 165 | :math:`f(z) = \sum_n \mathrm{Weight}[n]/(z-\mathrm{pol}[n]).` 166 | 167 | if debug == True: 168 | :code:`fitting_error`: float 169 | fitting error 170 | 171 | :code:`pol`: np.array, :math:`(N_p,)` 172 | poles obtained from fitting 173 | 174 | :code:`weight`: np.array, :math:`(N_p, N_\mathrm{orb}, N_\mathrm{orb})` 175 | weights obtained from fitting 176 | 177 | """ 178 | try: 179 | from triqs.gf import Gf, BlockGf, MeshImFreq, MeshDLRImFreq 180 | except ImportError: 181 | raise ImportError("Failed to import the triqs package (https://triqs.github.io/triqs/latest/). " 182 | "Please ensure it is installed.") 183 | 184 | if isinstance(Delta_triqs, Gf) and isinstance(Delta_triqs.mesh, (MeshImFreq, MeshDLRImFreq)): 185 | iwn_vec = np.array([iw.value for iw in Delta_triqs.mesh.values()]) 186 | func, fit_error, pol, weight = anacont(Delta_triqs.data, iwn_vec, tol, Np, solver, maxiter, 187 | mmin, mmax, verbose) 188 | print('optimization finished with fitting error {:.3e}'.format(fit_error)) 189 | 190 | if debug: 191 | return func, fit_error, pol, weight 192 | else: 193 | return func 194 | elif isinstance(Delta_triqs, BlockGf) and isinstance(Delta_triqs.mesh, (MeshImFreq, MeshDLRImFreq)): 195 | func_list, error_list, pol_list, weight_list = [], [], [], [] 196 | for j, (block, delta_blk) in enumerate(Delta_triqs): 197 | func, fit_error, pol, weight = anacont_triqs(delta_blk, tol, Np, solver, maxiter, mmin, 198 | mmax, verbose) 199 | func_list.append(func) 200 | if debug: 201 | error_list.append(fit_error) 202 | pol_list.append(pol) 203 | weight_list.append(weight) 204 | 205 | if debug: 206 | return func_list, error_list, pol_list, weight_list 207 | else: 208 | return func_list 209 | else: 210 | raise RuntimeError("Error: Delta_triqs.mesh must be an instance of MeshImFreq or MeshDLRImFreq.") 211 | -------------------------------------------------------------------------------- /src/adapol/hybfit.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from .fit_utils import pole_fitting, eval_with_pole 3 | 4 | def hybfit( 5 | Delta, 6 | iwn_vec, 7 | tol=None, 8 | Np=None, 9 | svdtol=1e-7, 10 | solver="lstsq", 11 | maxiter=500, 12 | mmin=4, 13 | mmax=50, 14 | verbose=False, 15 | ): 16 | """ 17 | The function for hybridization fitting. 18 | 19 | Examples: 20 | ---------- 21 | 22 | - Fitting with :math:`N_p` poles: 23 | :code:`hybfit(Delta, iwn_vec, Np = Np)` 24 | 25 | - Fitting with fixed error tolerance tol : 26 | :code:`hybfit(Delta, iwn_vec, tol = tol)` 27 | 28 | Parameters: 29 | ------------ 30 | :code:`Delta`: np.array, :math:`(N_w, N_\mathrm{orb}, N_\mathrm{orb})` 31 | The input hybridization function in Matsubara frequency. 32 | 33 | :code:`iwn_vec`: np.array, :math:`(N_w)` 34 | The Matsubara frequency vector, complex-valued 35 | 36 | :code:`svdtol`: float, optional 37 | Truncation threshold for bath orbitals while doing SVD of weight matrices in hybridization fitting 38 | default:1e-7 39 | 40 | :code:`tol`, :code:`Np`, :code:`solver`, :code:`maxiter`, :code:`mmin`, :code:`mmax`, :code:`verbose`: 41 | see below in anacont 42 | 43 | 44 | Returns: 45 | --------- 46 | 47 | 48 | :code:`bathenergy` :math:`E`: np.array, :math:`(N_b)` 49 | Bath energy 50 | 51 | :code:`bathhyb` :math:`V`: np.array, :math:`(N_b,N_{\mathrm{orb}})` 52 | Bath hybridization 53 | 54 | :code:`final_error`: float 55 | final fitting error 56 | 57 | :code:`func`: function 58 | Hybridization function evaluator 59 | :math:`f(z) = \sum_n V_{ni}V_{nj}^*/(z-E_n).` 60 | 61 | """ 62 | 63 | 64 | # Check dimensions 65 | assert len(iwn_vec.shape) == 1 or len(iwn_vec.shape) == 2 66 | if len(iwn_vec.shape) == 2: 67 | assert iwn_vec.shape[1] == 1 68 | iwn_vec = iwn_vec.flatten() 69 | assert len(Delta.shape) == 3 or len(Delta.shape) == 1 70 | if len(Delta.shape) == 1: 71 | assert Delta.shape[0] == iwn_vec.shape[0] 72 | Delta = Delta[:, None, None] 73 | if len(Delta.shape) == 3: 74 | assert Delta.shape[0] == iwn_vec.shape[0] 75 | assert Delta.shape[1] == Delta.shape[2] 76 | 77 | solver = solver.lower() 78 | assert solver == "lstsq" or solver == "sdp" 79 | 80 | # Check input tol or Np 81 | if tol is None and Np is None: 82 | raise ValueError("Please specify either tol or Np") 83 | if tol is not None and Np is not None: 84 | raise ValueError( 85 | "Please specify either tol or Np. One can not specify both of them." 86 | ) 87 | 88 | wn_vec = np.imag(iwn_vec) 89 | 90 | if Np is not None: 91 | pol, weight, fitting_error = pole_fitting( 92 | Delta, wn_vec, Ns=Np + 1, maxiter=maxiter, solver=solver, disp=verbose 93 | ) 94 | elif tol is not None: 95 | pol, weight, fitting_error = pole_fitting( 96 | Delta, 97 | wn_vec, 98 | tol=tol, 99 | mmin=mmin, 100 | mmax=mmax, 101 | maxiter=maxiter, 102 | solver=solver, 103 | disp=verbose, 104 | ) 105 | 106 | bathenergy, bathhyb, bath_mat = obtain_orbitals(pol, weight, svdtol=svdtol) 107 | def func(Z): 108 | return eval_with_pole(bathenergy, Z, bath_mat) 109 | Delta_reconstruct = func(iwn_vec) 110 | final_error = np.max(np.abs(Delta - Delta_reconstruct)) 111 | return bathenergy, bathhyb, final_error, func 112 | 113 | 114 | def hybfit_triqs( 115 | Delta_triqs, 116 | tol=None, 117 | Np=None, 118 | svdtol=1e-7, 119 | solver="lstsq", 120 | maxiter=500, 121 | mmin=4, 122 | mmax=50, 123 | verbose=False, 124 | debug=False 125 | ): 126 | """ 127 | The triqs interface for hybridization fitting. 128 | The function requires triqs package in python. 129 | 130 | Examples: 131 | ---------- 132 | 133 | - Fitting with :math:`N_p` poles: 134 | :code:`hybfit_triqs(delta_triqs, Np = Np)` 135 | 136 | - Fitting with fixed error tolerance tol : 137 | :code:`hybfit_triqs(delta_triqs, tol = tol)` 138 | 139 | 140 | Parameters: 141 | ------------ 142 | :code:`Delta_triqs`: triqs Green's function container 143 | The input hybridization function in Matsubara frequency 144 | 145 | :code:`debug`: bool 146 | return additional outputs for debugging. 147 | Default: False 148 | 149 | :code:`svdtol`: float, optional 150 | Truncation threshold for bath orbitals while doing SVD of weight matrices in hybridization fitting 151 | default: 1e-7 152 | 153 | :code:`tol`, :code:`Np`, :code:`solver`, :code:`maxiter`, :code:`mmin`, :code:`mmax`, :code:`verbose`: 154 | same as in hybfit 155 | 156 | Returns: 157 | --------- 158 | 159 | :code:`bathhyb`: np.array :math:`(N_b, N_\mathrm{orb})` 160 | Bath hybridization 161 | 162 | :code:`bathenergy`: np.array :math:`(N_b,)` 163 | Bath energy 164 | 165 | :code:`Delta_fit`: triqs Gf or BlockGf 166 | Discretized hybridization function 167 | The input hybridization function in Matsubara frequency 168 | 169 | if debug is True: 170 | :code:`final_error`: float 171 | final fitting error 172 | 173 | :code:`weight`: np.array :math:`(N_p, N_\mathrm{orb}, N_\mathrm{orb})` 174 | weights obtained from fitting 175 | """ 176 | try: 177 | from triqs.gf import Gf, BlockGf, MeshImFreq, MeshDLRImFreq 178 | except ImportError: 179 | raise ImportError("Failed to import the triqs package (https://triqs.github.io/triqs/latest/). " 180 | "Please ensure it is installed.") 181 | 182 | if isinstance(Delta_triqs, Gf) and isinstance(Delta_triqs.mesh, (MeshImFreq, MeshDLRImFreq)): 183 | iwn_vec = np.array([iw.value for iw in Delta_triqs.mesh.values()]) 184 | eps_opt, V_opt, final_error, func = hybfit(Delta_triqs.data, iwn_vec, tol, Np, 185 | svdtol, solver, maxiter, mmin, mmax, verbose) 186 | print('optimization finished with fitting error {:.3e}'.format(final_error)) 187 | 188 | delta_fit = Gf(mesh=Delta_triqs.mesh, target_shape=Delta_triqs.target_shape) 189 | delta_fit.data[:] = func(iwn_vec) 190 | 191 | if debug: 192 | return V_opt.T.conj(), eps_opt, delta_fit, final_error 193 | else: 194 | return V_opt.T.conj(), eps_opt, delta_fit 195 | elif isinstance(Delta_triqs, BlockGf) and isinstance(Delta_triqs.mesh, (MeshImFreq, MeshDLRImFreq)): 196 | V_list, eps_list, delta_list, error_list = [], [], [], [] 197 | for j, (block, delta_blk) in enumerate(Delta_triqs): 198 | res = hybfit_triqs(delta_blk, tol, Np, svdtol, solver, maxiter, mmin, mmax, verbose, debug) 199 | V_list.append(res[0]) 200 | eps_list.append(res[1]) 201 | delta_list.append(res[2]) 202 | if debug: 203 | error_list.append(res[3]) 204 | 205 | if debug: 206 | return V_list, eps_list, BlockGf(name_list=list(Delta_triqs.indices), block_list=delta_list), error_list 207 | else: 208 | return V_list, eps_list, BlockGf(name_list=list(Delta_triqs.indices), block_list=delta_list) 209 | else: 210 | raise RuntimeError("Error: Delta_triqs.mesh must be an instance of MeshImFreq or MeshDLRImFreq.") 211 | 212 | def obtain_orbitals(pol, weight, svdtol=1e-7): 213 | """ 214 | obtaining bath orbitals through svd 215 | """ 216 | polelist = [] 217 | veclist = [] 218 | matlist = [] 219 | for i in range(weight.shape[0]): 220 | eigval, eigvec = np.linalg.eig(weight[i]) 221 | for j in range(eigval.shape[0]): 222 | if eigval[j] > svdtol: 223 | polelist.append(pol[i]) 224 | veclist.append(eigvec[:, j] * np.sqrt(eigval[j])) 225 | matlist.append( 226 | (eigvec[:, j, None] * np.conjugate(eigvec[:, j].T)) * (eigval[j]) 227 | ) 228 | 229 | return np.array(polelist), np.array(veclist), np.array(matlist) 230 | -------------------------------------------------------------------------------- /doc/tutorials/discrete.rst: -------------------------------------------------------------------------------- 1 | .. _discrete: 2 | 3 | Matsubara fitting for data generated by discrete poles 4 | ======================================================== 5 | 6 | In this note, let us illustrate how to perform Matsubara fitting using 7 | test data generated by discrete poles with random weights. 8 | 9 | Let us first define the inverse temperature :math:`\beta` and Matsubara 10 | frequencies :math:`\{Z_n\}`: 11 | 12 | .. math:: 13 | 14 | 15 | Z_n = \mathrm i \frac{(2n+1)\pi}{\beta}. 16 | 17 | .. code:: ipython3 18 | 19 | import numpy as np 20 | import matplotlib.pyplot as plt 21 | from adapol import hybfit 22 | 23 | beta = 20 24 | N = 55 25 | Z = 1j *(np.linspace(-N, N, N + 1)) * np.pi / beta 26 | 27 | We will generate Matsubara data evaluated on :math:`\{Z_n\}` using the 28 | following formula: 29 | 30 | .. math:: 31 | 32 | 33 | \begin{aligned} 34 | G(\mathrm i\nu_n)& = \sum_{k=1}^{N_p} \frac{|v_k\rangle\langle v_k|}{\mathrm i\nu_n - E_k}, 35 | \end{aligned} 36 | 37 | Where :math:`|v_k\rangle` is a :math:`N_{\text{orb}}\times 1` vector, 38 | where :math:`N_{\text{orb}}` is the number of orbitals. 39 | 40 | Below is the code for making a :math:`N_{\text{orb}}`-dimensional 41 | Matsubara data on Matsubara frequencies :math:`Z`, by summing with 42 | :math:`N_p` discrete poles. 43 | 44 | .. code:: ipython3 45 | 46 | def make_Delta_with_random_discrete_pole(Norb, Np, Z): 47 | np.random.seed(0) 48 | pol = np.cos((2*np.arange(Np)+1) * np.pi / (2*Np) ) 49 | vec = np.random.randn(Norb, Np) + 1j * np.random.randn(Norb, Np) 50 | weight = np.array( 51 | [vec[:, i, None] * np.transpose(np.conj(vec[:, i])) for i in range(Np)] 52 | ) 53 | 54 | pol_t = np.reshape(pol, [pol.size, 1]) 55 | M = 1 / ( Z - pol_t) 56 | M = M.transpose() 57 | if len(weight.shape) == 1: 58 | weight = weight / sum(weight) 59 | Delta = M @ weight 60 | else: 61 | Nw = len(Z) 62 | Delta = (M @ (weight.reshape(Np, Norb * Norb))).reshape(Nw, Norb, Norb) 63 | return pol, weight, Delta 64 | 65 | An example Matsubara data would look like the following: 66 | 67 | .. code:: ipython3 68 | 69 | pol, weight, Delta = make_Delta_with_random_discrete_pole(Norb=1, Np = 10, Z=Z) 70 | 71 | plt.plot(Z.imag, Delta[:, 0, 0].real, label='real') 72 | plt.plot(Z.imag, Delta[:, 0, 0].imag, label='imag') 73 | plt.legend() 74 | plt.title("Matsubara data") 75 | 76 | 77 | 78 | 79 | .. parsed-literal:: 80 | 81 | Text(0.5, 1.0, 'Matsubara data') 82 | 83 | 84 | 85 | 86 | .. image:: output_6_1.png 87 | 88 | 89 | Let us first test the Matsubara fitting for scalar-valued Matsubara 90 | functions. 91 | 92 | .. code:: ipython3 93 | 94 | tol = 1e-6 #Fitting tolerance 95 | 96 | for Np in range(2, 21): 97 | pol, weight, Delta = make_Delta_with_random_discrete_pole(Norb=1, Np = Np, Z=Z) 98 | bathenergy, bathhyb, final_error, func = hybfit(Delta, Z, tol=tol) 99 | assert(final_error < tol) 100 | plt.plot(Np, len(bathenergy),"ro") 101 | plt.xlabel("Number of acutal poles") 102 | plt.ylabel("Number of bath orbitals required") 103 | plt.title("Num. of bath orbitals to reach accuracy 1e-6 vs Num. of acutal poles") 104 | plt.xticks(range(2, 21,3)) 105 | plt.show() 106 | 107 | 108 | 109 | .. image:: output_8_0.png 110 | 111 | 112 | Similarly, we can test for matrix-valued Matsubara functions: 113 | 114 | .. code:: ipython3 115 | 116 | tol = 1e-6 117 | Norb = 4 118 | 119 | for Np in range(2, 10): 120 | pol, weight, G = make_Delta_with_random_discrete_pole(Norb=Norb, Np = Np, Z=Z) 121 | bathenergy, bathhyb, final_error, func = hybfit(G, Z, tol=tol) 122 | assert(final_error < tol) 123 | 124 | One can also conduct Matsubara fitting via specifying number of modes 125 | :math:`N_p` in the hybfit function: 126 | 127 | .. code:: ipython3 128 | 129 | pol, weight, G = make_Delta_with_random_discrete_pole(Norb=4, Np = 10, Z=Z) 130 | bathenergy, bathhyb, final_error, func = hybfit(G, Z, Np=15) 131 | print("Numer of bath orbitals is ", len(bathenergy)) 132 | print("Final error is ", final_error) 133 | 134 | 135 | .. parsed-literal:: 136 | 137 | Numer of bath orbitals is 10 138 | Final error is 6.189103600097627e-10 139 | 140 | 141 | .. raw:: html 142 | 143 |

144 | 145 | Triqs Interface 146 | 147 | .. raw:: html 148 | 149 |

150 | 151 | Let us demonstrate how to use our code if the Matsubara functions are 152 | given using the TRIQS data structure. 153 | 154 | In trqis, the Matsubara frequencies are defined using ``MeshImFreq``: 155 | 156 | .. code:: ipython3 157 | 158 | from triqs.gf import MeshImFreq 159 | Norb = 1 160 | iw_mesh = MeshImFreq(beta=beta, S='Fermion', n_iw=Z.shape[0]//2) 161 | 162 | The ``hybfit_triqs`` function could handle TRIQS Green’s functions 163 | object ``GF`` and ``BlockGf``: 164 | 165 | .. code:: ipython3 166 | 167 | from triqs.gf import Gf, BlockGf 168 | from adapol import hybfit_triqs 169 | Norb = 1 170 | for Np in range(2, 21): 171 | pol, weight, Delta = make_Delta_with_random_discrete_pole(Norb=Norb, Np = Np, Z=Z) 172 | 173 | #Construct Gf object 174 | delta_iw = Gf(mesh=iw_mesh, target_shape=[Norb, Norb]) 175 | delta_iw.data[:] = Delta 176 | 177 | #Construct BlockGf object 178 | delta_blk = BlockGf(name_list=['up', 'down'], block_list=[delta_iw, delta_iw], make_copies=True) 179 | 180 | # Gf interface for hybridization fitting 181 | bathhyb, bathenergy, delta_fit, final_error = hybfit_triqs(delta_iw, tol=tol, maxiter=50, debug=True) 182 | assert final_error < tol 183 | 184 | # BlockGf interface for hybridization fitting 185 | bathhyb, bathenergy, delta_fit, final_error = hybfit_triqs(delta_blk, tol=tol, maxiter=50, debug=True) 186 | assert final_error[0] < tol and final_error[1] < tol 187 | 188 | 189 | .. parsed-literal:: 190 | 191 | optimization finished with fitting error 2.701e-15 192 | optimization finished with fitting error 2.701e-15 193 | optimization finished with fitting error 2.701e-15 194 | optimization finished with fitting error 1.081e-14 195 | optimization finished with fitting error 1.081e-14 196 | optimization finished with fitting error 1.081e-14 197 | optimization finished with fitting error 1.099e-14 198 | optimization finished with fitting error 1.099e-14 199 | optimization finished with fitting error 1.099e-14 200 | optimization finished with fitting error 2.220e-14 201 | optimization finished with fitting error 2.220e-14 202 | optimization finished with fitting error 2.220e-14 203 | optimization finished with fitting error 2.892e-14 204 | optimization finished with fitting error 2.892e-14 205 | optimization finished with fitting error 2.892e-14 206 | optimization finished with fitting error 1.905e-14 207 | optimization finished with fitting error 1.905e-14 208 | optimization finished with fitting error 1.905e-14 209 | optimization finished with fitting error 4.401e-07 210 | optimization finished with fitting error 4.401e-07 211 | optimization finished with fitting error 4.401e-07 212 | optimization finished with fitting error 7.920e-08 213 | optimization finished with fitting error 7.920e-08 214 | optimization finished with fitting error 7.920e-08 215 | optimization finished with fitting error 7.742e-07 216 | optimization finished with fitting error 7.742e-07 217 | optimization finished with fitting error 7.742e-07 218 | optimization finished with fitting error 1.444e-10 219 | optimization finished with fitting error 1.444e-10 220 | optimization finished with fitting error 1.444e-10 221 | optimization finished with fitting error 2.079e-09 222 | optimization finished with fitting error 2.079e-09 223 | optimization finished with fitting error 2.079e-09 224 | optimization finished with fitting error 7.408e-10 225 | optimization finished with fitting error 7.408e-10 226 | optimization finished with fitting error 7.408e-10 227 | optimization finished with fitting error 1.092e-09 228 | optimization finished with fitting error 1.092e-09 229 | optimization finished with fitting error 1.092e-09 230 | optimization finished with fitting error 2.791e-09 231 | optimization finished with fitting error 2.791e-09 232 | optimization finished with fitting error 2.791e-09 233 | optimization finished with fitting error 1.611e-09 234 | optimization finished with fitting error 1.611e-09 235 | optimization finished with fitting error 1.611e-09 236 | optimization finished with fitting error 1.047e-09 237 | optimization finished with fitting error 1.047e-09 238 | optimization finished with fitting error 1.047e-09 239 | optimization finished with fitting error 1.827e-09 240 | optimization finished with fitting error 1.827e-09 241 | optimization finished with fitting error 1.827e-09 242 | optimization finished with fitting error 3.379e-09 243 | optimization finished with fitting error 3.379e-09 244 | optimization finished with fitting error 3.379e-09 245 | optimization finished with fitting error 1.989e-09 246 | optimization finished with fitting error 1.989e-09 247 | optimization finished with fitting error 1.989e-09 248 | 249 | -------------------------------------------------------------------------------- /src/adapol/fit_utils.py: -------------------------------------------------------------------------------- 1 | # This is a python implementation for analytic continuation of Fermionic Green's functions/self energy 2 | # using PES (ES) method 3 | # Reference: PhysRevB.107.075151 4 | import numpy as np 5 | import scipy 6 | import scipy.optimize 7 | import cvxpy as cp 8 | from .aaa import aaa_matrix_real 9 | 10 | 11 | # import mosek 12 | def eval_with_pole(pol, Z, weight): 13 | pol_t = np.reshape(pol, [pol.size, 1]) 14 | M = 1 / (Z - pol_t) 15 | M = M.transpose() 16 | if len(weight.shape) == 1: 17 | return M @ weight 18 | else: 19 | G = M @ np.reshape(weight, (weight.shape[0], weight.shape[1] * weight.shape[2])) 20 | return np.reshape(G, (G.shape[0], weight.shape[1], weight.shape[2])) 21 | 22 | 23 | def get_weight( 24 | pol, Z, G, cleanflag=True, maxiter=1000, complex=True, fast=False, eps=1e-8 25 | ): 26 | pol_t = np.reshape(pol, [pol.size, 1]) 27 | M = 1 / (Z - pol_t) 28 | M = M.transpose() 29 | MM = np.concatenate([M.real, M.imag]) 30 | if len(G.shape) == 1: 31 | GG = np.concatenate([G.real, G.imag]) 32 | if cleanflag: 33 | R = np.linalg.lstsq(MM, GG, rcond=0)[0] 34 | else: 35 | [R, rnorm] = scipy.optimize.nnls(MM, GG, maxiter=maxiter) 36 | residue = G - M @ R 37 | else: 38 | Np = len(pol) 39 | Norb = G.shape[1] 40 | R = np.zeros((Np, Norb, Norb), dtype=np.complex128) 41 | if cleanflag: 42 | for i in range(Norb): 43 | GG = np.concatenate([G[:, i, i].real, G[:, i, i].imag]) 44 | R[:, i, i] = np.linalg.lstsq(MM, GG, rcond=0)[0] 45 | for j in range(i + 1, Norb): 46 | g1 = (G[:, j, i] + G[:, i, j]) / 2.0 47 | g2 = (G[:, i, j] - G[:, j, i]) / 2.0 48 | GG1 = np.concatenate([g1.real, g1.imag]) 49 | GG2 = np.concatenate([g2.imag, -g2.real]) 50 | R1 = np.linalg.lstsq(MM, GG1, rcond=0)[0] 51 | R2 = np.linalg.lstsq(MM, GG2, rcond=0)[0] 52 | R[:, i, j] = R1 + 1j * R2 53 | R[:, j, i] = R1 - 1j * R2 54 | else: 55 | if not fast: 56 | Nw = len(Z) 57 | 58 | if complex: 59 | X = [cp.Variable((Norb, Norb), hermitian=True) for i in range(Np)] 60 | constraints = [X[i] >> 0 for i in range(Np)] 61 | else: 62 | X = [cp.Variable((Norb, Norb), PSD=True) for i in range(Np)] 63 | 64 | 65 | Gfit = [] 66 | for w in range(Nw): 67 | Gfit.append(cp.sum_squares(sum([ M[w,i]*X[i] for i in range(Np)]) - G[w,:,:])) 68 | 69 | if complex: 70 | prob = cp.Problem(cp.Minimize(sum(Gfit)), constraints) 71 | else: 72 | prob = cp.Problem(cp.Minimize(sum(Gfit))) 73 | prob.solve(solver="SCS", verbose=False, eps=eps) 74 | # MOSEK parameters 75 | # mosek_params_dict = {"MSK_DPAR_INTPNT_CO_TOL_PFEAS": 1.e-8,\ 76 | # "MSK_DPAR_INTPNT_CO_TOL_DFEAS": 1.e-8, 77 | # "MSK_DPAR_INTPNT_CO_TOL_REL_GAP": 1.e-8, 78 | # "MSK_DPAR_INTPNT_CO_TOL_NEAR_REL": 1000} 79 | # result = prob.solve(solver = "MOSEK", verbose=False,\ 80 | # mosek_params = mosek_params_dict) 81 | 82 | for i in range(Np): 83 | R[i] = X[i].value 84 | else: 85 | for i in range(Norb): 86 | GG = np.concatenate([G[:, i, i].real, G[:, i, i].imag]) 87 | Rii = scipy.optimize.nnls(MM, GG, maxiter=maxiter)[0] 88 | R[:, i, i] = Rii 89 | MM2 = np.concatenate([M, np.conj(M)]) 90 | for i in range(Norb): 91 | for j in range(i + 1, Norb): 92 | GG = np.concatenate([G[:, i, j], np.conj(G[:, j, i])]) 93 | bound = np.sqrt(np.abs(R[:, i, i] * R[:, j, j])) 94 | x = cp.Variable(MM.shape[1], complex=True) 95 | constraints = [ 96 | cp.abs(x[k]) <= bound[k] for k in range(MM.shape[1]) 97 | ] 98 | objective = cp.Minimize(cp.sum_squares(MM2 @ x - GG)) 99 | prob = cp.Problem(objective, constraints) 100 | prob.solve(solver="SCS", verbose=False, eps=eps) 101 | # result = prob.solve(solver = cp.MOSEK,verbose = False,mosek_params = mosek_params_dict) 102 | R[:, i, j] = x.value 103 | R[:, j, i] = np.conj(x.value) 104 | 105 | residue = 1.0 * G 106 | for i in range(Np): 107 | residue = residue - M[:, i, None, None] * R[i] 108 | return R, M, residue 109 | 110 | 111 | def aaa_reduce(pol, R, eps=1e-6): 112 | Np = R.shape[0] 113 | Rnorm = np.zeros(Np) 114 | for i in range(Np): 115 | Rnorm[i] = np.linalg.norm(R[i]) 116 | nonz_index = Rnorm > eps 117 | return pol[nonz_index], R[nonz_index] 118 | 119 | 120 | def erroreval(pol, Z, G, cleanflag=True, maxiter=1000, fast=False, complex=True): 121 | R, M, residue = get_weight( 122 | pol, Z, G, cleanflag=cleanflag, maxiter=maxiter, complex=complex, fast=fast 123 | ) 124 | if len(G.shape) == 1: 125 | y = np.linalg.norm(residue) 126 | grad = np.real(np.dot(np.conj(residue), (R * (M**2)))) 127 | else: 128 | y = np.linalg.norm(residue.flatten()) 129 | 130 | Np = len(pol) 131 | grad = np.zeros(Np) 132 | Nw = len(Z) 133 | for k in range(Np): 134 | for w in range(Nw): 135 | grad[k] = grad[k] + np.real( 136 | np.sum((M[w, k] ** 2) * (np.conj(residue[w, :, :]) * R[k])) 137 | ) 138 | 139 | grad = -grad / y 140 | return y, grad 141 | 142 | 143 | def pole_fitting( 144 | Delta, 145 | Z, 146 | tol=None, 147 | Ns=None, 148 | mmin=None, 149 | mmax=50, 150 | maxiter=50, 151 | solver="lstsq", 152 | fast=False, 153 | disp=False, 154 | complex=True, 155 | ): 156 | # set cleanflag 157 | if solver == "lstsq": 158 | cleanflag = True 159 | if solver == "sdp": 160 | cleanflag = False 161 | 162 | # pole estimation 163 | # tol needs to be fixed 164 | if Ns is None and tol is None: 165 | raise Exception( 166 | "One needs to specify either the number of poles or the fitting error tolerance." 167 | ) 168 | if Ns is not None and tol is not None: 169 | raise Exception( 170 | "One can not specify both the number of poles and the fitting error tolerance. Only specify one of them." 171 | ) 172 | if Ns is None: 173 | if mmin is None or mmin < 4: 174 | mmin = 4 175 | if mmin % 2 == 1: 176 | mmin = mmin + 1 177 | if mmax > 2 * (Z.shape[0] // 2): 178 | mmax = 2 * (Z.shape[0] // 2) 179 | else: 180 | if Ns % 2 == 1: 181 | Ns = Ns + 1 182 | mmin, mmax = Ns, Ns 183 | if len(Delta.shape) == 1: 184 | Delta = Delta.reshape(Delta.shape[0], 1, 1) 185 | 186 | for m in range(mmin, mmax + 1, 2): 187 | pol, _, _, _ = aaa_matrix_real(Delta, 1j * Z, mmax=m) 188 | pol = np.real(pol) 189 | weight, _, residue = get_weight( 190 | pol, 1.0j * Z, Delta, cleanflag=cleanflag, complex=complex, fast=fast 191 | ) 192 | # print(np.max(np.abs(residue))) 193 | if tol is not None: 194 | if np.max(np.abs(residue)) > tol * 10: 195 | continue 196 | if Ns is None: 197 | pol, weight = aaa_reduce(pol, weight, 1e-5) 198 | # print("Number of poles is ", len(pol)) 199 | if cleanflag: 200 | if maxiter > 0: 201 | 202 | def fhere(pole): 203 | return erroreval( 204 | pole, 1j * Z, Delta, cleanflag=cleanflag, complex=complex 205 | ) 206 | 207 | # fhere = lambda pole: erroreval(pole,1j*Z,Delta,cleanflag=cleanflag,complex=complex) 208 | res = scipy.optimize.minimize( 209 | fhere, 210 | pol, 211 | method="L-BFGS-B", 212 | jac=True, 213 | options={ 214 | "disp": disp, 215 | "maxiter": maxiter, 216 | "gtol": 1e-10, 217 | "ftol": 1e-10, 218 | }, 219 | ) 220 | else: 221 | 222 | def fhere1(pole): 223 | return erroreval(pole, 1j * Z, Delta, cleanflag=True, complex=complex) 224 | 225 | # fhere = lambda pole: erroreval(pole,1j*Z,Delta,cleanflag=True,complex=complex) 226 | res = scipy.optimize.minimize( 227 | fhere1, 228 | pol, 229 | method="L-BFGS-B", 230 | jac=True, 231 | options={"disp": False, "gtol": 1e-10, "ftol": 1e-10}, 232 | ) 233 | if maxiter > 0: 234 | 235 | def fhere2(pole): 236 | return erroreval( 237 | pole, 1j * Z, Delta, cleanflag=False, complex=complex, fast=fast 238 | ) 239 | 240 | # fhere = lambda pole: erroreval(pole,1j*Z,Delta,cleanflag=False,complex= complex,fast = fast) 241 | res = scipy.optimize.minimize( 242 | fhere2, 243 | res.x, 244 | method="L-BFGS-B", 245 | jac=True, 246 | options={ 247 | "disp": disp, 248 | "maxiter": maxiter, 249 | "gtol": 1e-10, 250 | "ftol": 1e-10, 251 | }, 252 | ) 253 | 254 | weight, _, residuenew = get_weight( 255 | res.x, 1j * Z, Delta, cleanflag=cleanflag, fast=fast, complex=complex 256 | ) 257 | if not check_psd(weight): 258 | weight, _, residuenew = get_weight( 259 | res.x, 1j * Z, Delta, cleanflag=False, complex=complex 260 | ) 261 | err = np.max(np.abs(residuenew)) 262 | if tol is not None: 263 | if err < tol: 264 | return res.x, weight, err 265 | else: 266 | return res.x, weight, err 267 | 268 | if tol is not None: 269 | print("Fail to reach desired fitting error!") 270 | return res.x, weight, np.max(np.abs(residuenew)) 271 | 272 | 273 | def check_psd(weight, atol=1e-6): 274 | check_psd = True 275 | for i in range(weight.shape[0]): 276 | val, _ = np.linalg.eig(weight[i]) 277 | check_psd = check_psd and np.min(val.real) > -atol 278 | return check_psd 279 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /example/semicircle.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "

Matsubara fitting for data with continuous spectrum (semicircular density)

" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "In this notebook, we aim to fit the following Matsubara function:\n", 15 | "$$\n", 16 | "G(\\mathrm i\\nu_n) = \\int_{-\\infty}^{\\infty} \\frac{1}{\\mathrm i\\nu_n - w} \\rho(w),\n", 17 | "$$\n", 18 | "where $\\rho(w)$ is the semicircular spectral function\n", 19 | "$$\n", 20 | "\\rho(w) = \\left\\{\n", 21 | " \\begin{aligned}\n", 22 | " \\frac{2}{\\pi}\\sqrt{1-w^2}, \\quad &-1\\leq w\\leq 1, \\\\\n", 23 | " 0, \\quad &w>1 \\text{ and } w<-1.\n", 24 | " \\end{aligned}\n", 25 | " \\right. \n", 26 | "$$\n", 27 | "and $\\mathrm i\\nu_n$ is the Matsubara frequency:\n", 28 | "$$\n", 29 | "\\mathrm i\\nu_n = \\left\\{\n", 30 | " \\begin{aligned}\n", 31 | " \\mathrm i \\frac{(2n+1)\\pi}{\\beta}, & \\text{ for fermions},\\\\\n", 32 | " \\mathrm i \\frac{2n\\pi}{\\beta}, & \\text{ for bosons}.\n", 33 | " \\end{aligned}\n", 34 | "\\right.\n", 35 | "$$\n", 36 | "Here $\\beta$ is the inverse temperature.\n", 37 | "\n", 38 | "Let us first set inverse temperature $\\beta$ and the Matsubara frequencies $Z = \\{\\mathrm i\\nu_n\\}$." 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": 1, 44 | "metadata": {}, 45 | "outputs": [], 46 | "source": [ 47 | "import numpy as np\n", 48 | "import matplotlib.pyplot as plt\n", 49 | "from adapol import hybfit\n", 50 | "import scipy\n", 51 | "beta = 20\n", 52 | "N = 55\n", 53 | "Z = 1j *(np.linspace(-N, N, N + 1)) * np.pi / beta" 54 | ] 55 | }, 56 | { 57 | "cell_type": "markdown", 58 | "metadata": {}, 59 | "source": [ 60 | "Now we construct the Matsubara data using the above equation. The integral is evaluated with adaptive quadrature:" 61 | ] 62 | }, 63 | { 64 | "cell_type": "code", 65 | "execution_count": 2, 66 | "metadata": {}, 67 | "outputs": [], 68 | "source": [ 69 | "def Kw(w, v):\n", 70 | " return 1 / ( v - w)\n", 71 | "def semicircular(x):\n", 72 | " return 2 * np.sqrt(1 - x**2) / np.pi\n", 73 | "def make_Delta_with_cont_spec( Z, rho, a=-1.0, b=1.0, eps=1e-12):\n", 74 | " Delta = np.zeros((Z.shape[0]), dtype=np.complex128)\n", 75 | " for n in range(len(Z)):\n", 76 | " def f(w):\n", 77 | " return Kw(w , Z[n]) * rho(w)\n", 78 | "\n", 79 | " # f = lambda w: Kw(w-en[i],Z[n])*rho(w)\n", 80 | " Delta[n] = scipy.integrate.quad(\n", 81 | " f, a, b, epsabs=eps, epsrel=eps, complex_func=True\n", 82 | " )[0]\n", 83 | " \n", 84 | "\n", 85 | " return Delta\n", 86 | "\n", 87 | "Delta = make_Delta_with_cont_spec( Z, semicircular)" 88 | ] 89 | }, 90 | { 91 | "cell_type": "markdown", 92 | "metadata": {}, 93 | "source": [ 94 | "Below we show that by increasing number of modes $N_p$, the fitting error decreases. " 95 | ] 96 | }, 97 | { 98 | "cell_type": "code", 99 | "execution_count": 3, 100 | "metadata": {}, 101 | "outputs": [ 102 | { 103 | "data": { 104 | "image/png": "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", 105 | "text/plain": [ 106 | "
" 107 | ] 108 | }, 109 | "metadata": {}, 110 | "output_type": "display_data" 111 | } 112 | ], 113 | "source": [ 114 | "error = []\n", 115 | "Nbath = []\n", 116 | "for Np in range(2, 12, 2):\n", 117 | " bathenergy, bathhyb, final_error, func = hybfit(Delta, Z, Np = Np, verbose=False)\n", 118 | " Nbath.append(len(bathenergy))\n", 119 | " error.append(final_error)\n", 120 | "plt.yscale('log')\n", 121 | "plt.plot(Nbath, error, 'o-')\n", 122 | "plt.xlabel('Number of bath sites')\n", 123 | "plt.ylabel('Fitting Error')\n", 124 | "plt.title(\"Semicircular Density \")\n", 125 | "plt.show()" 126 | ] 127 | }, 128 | { 129 | "cell_type": "markdown", 130 | "metadata": {}, 131 | "source": [ 132 | "

Triqs Interface

\n", 133 | "Let us demonstrate how to use our code if the Matsubara functions are given using the TRIQS data structure. \n", 134 | "\n", 135 | "In trqis, the Matsubara frequencies are defined using `MeshImFreq`:" 136 | ] 137 | }, 138 | { 139 | "cell_type": "code", 140 | "execution_count": 4, 141 | "metadata": {}, 142 | "outputs": [], 143 | "source": [ 144 | "from triqs.gf import MeshImFreq\n", 145 | "Norb = 1\n", 146 | "iw_mesh = MeshImFreq(beta=beta, S='Fermion', n_iw=Z.shape[0]//2)" 147 | ] 148 | }, 149 | { 150 | "cell_type": "markdown", 151 | "metadata": {}, 152 | "source": [ 153 | "The `hybfit_triqs` function could handle TRIQS Green's functions object `GF` and `BlockGf`:" 154 | ] 155 | }, 156 | { 157 | "cell_type": "code", 158 | "execution_count": 5, 159 | "metadata": {}, 160 | "outputs": [ 161 | { 162 | "name": "stdout", 163 | "output_type": "stream", 164 | "text": [ 165 | "optimization finished with fitting error 9.538e-08\n", 166 | "optimization finished with fitting error 9.538e-08\n", 167 | "optimization finished with fitting error 9.538e-08\n" 168 | ] 169 | } 170 | ], 171 | "source": [ 172 | "from triqs.gf import Gf, BlockGf\n", 173 | "from adapol import hybfit_triqs\n", 174 | "delta_iw = Gf(mesh=iw_mesh, target_shape=[Norb, Norb])\n", 175 | "delta_iw.data[:,0,0] = Delta\n", 176 | "\n", 177 | "#Construct BlockGf object\n", 178 | "delta_blk = BlockGf(name_list=['up', 'down'], block_list=[delta_iw, delta_iw], make_copies=True)\n", 179 | "\n", 180 | "tol = 1e-6\n", 181 | "# Gf interface for hybridization fitting\n", 182 | "bathhyb, bathenergy, delta_fit, final_error = hybfit_triqs(delta_iw, tol=tol, maxiter=50, debug=True)\n", 183 | "assert final_error < tol\n", 184 | "\n", 185 | "# BlockGf interface for hybridization fitting\n", 186 | "bathhyb, bathenergy, delta_fit, final_error = hybfit_triqs(delta_blk, tol=tol, maxiter=50, debug=True)\n", 187 | "assert final_error[0] < tol and final_error[1] < tol" 188 | ] 189 | } 190 | ], 191 | "metadata": { 192 | "kernelspec": { 193 | "display_name": "base", 194 | "language": "python", 195 | "name": "python3" 196 | }, 197 | "language_info": { 198 | "codemirror_mode": { 199 | "name": "ipython", 200 | "version": 3 201 | }, 202 | "file_extension": ".py", 203 | "mimetype": "text/x-python", 204 | "name": "python", 205 | "nbconvert_exporter": "python", 206 | "pygments_lexer": "ipython3", 207 | "version": "3.8.17" 208 | } 209 | }, 210 | "nbformat": 4, 211 | "nbformat_minor": 2 212 | } 213 | -------------------------------------------------------------------------------- /example/discrete.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "

Matsubara fitting for data generated by discrete poles

\n" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "In this note, let us illustrate how to perform Matsubara fitting using test data generated by discrete poles with random weights.\n", 15 | "\n", 16 | "Let us first define the inverse temperature $\\beta$ and Matsubara frequencies $\\{Z_n\\}$:\n", 17 | "\n", 18 | "$$\n", 19 | "Z_n = \\mathrm i \\frac{(2n+1)\\pi}{\\beta}.\n", 20 | "$$" 21 | ] 22 | }, 23 | { 24 | "cell_type": "code", 25 | "execution_count": 1, 26 | "metadata": {}, 27 | "outputs": [], 28 | "source": [ 29 | "import numpy as np\n", 30 | "import matplotlib.pyplot as plt\n", 31 | "from adapol import hybfit\n", 32 | "\n", 33 | "beta = 20\n", 34 | "N = 55\n", 35 | "Z = 1j *(np.linspace(-N, N, N + 1)) * np.pi / beta" 36 | ] 37 | }, 38 | { 39 | "cell_type": "markdown", 40 | "metadata": {}, 41 | "source": [ 42 | "We will generate Matsubara data evaluated on $\\{Z_n\\}$ using the following formula:\n", 43 | "$$\n", 44 | "\\begin{aligned}\n", 45 | "G(\\mathrm i\\nu_n)& = \\sum_{k=1}^{N_p} \\frac{|v_k\\rangle\\langle v_k|}{\\mathrm i\\nu_n - E_k},\n", 46 | "\\end{aligned}\n", 47 | "$$\n", 48 | "Where $|v_k\\rangle$ is a $N_{\\text{orb}}\\times 1$ vector, where $N_{\\text{orb}}$ is the number of orbitals.\n", 49 | "\n", 50 | "Below is the code for making a $N_{\\text{orb}}$-dimensional Matsubara data on Matsubara frequencies $Z$, by summing with $N_p$ discrete poles." 51 | ] 52 | }, 53 | { 54 | "cell_type": "code", 55 | "execution_count": 2, 56 | "metadata": {}, 57 | "outputs": [], 58 | "source": [ 59 | "def make_Delta_with_random_discrete_pole(Norb, Np, Z):\n", 60 | " np.random.seed(0)\n", 61 | " pol = np.cos((2*np.arange(Np)+1) * np.pi / (2*Np) ) \n", 62 | " vec = np.random.randn(Norb, Np) + 1j * np.random.randn(Norb, Np)\n", 63 | " weight = np.array(\n", 64 | " [vec[:, i, None] * np.transpose(np.conj(vec[:, i])) for i in range(Np)]\n", 65 | " )\n", 66 | "\n", 67 | " pol_t = np.reshape(pol, [pol.size, 1])\n", 68 | " M = 1 / ( Z - pol_t)\n", 69 | " M = M.transpose()\n", 70 | " if len(weight.shape) == 1:\n", 71 | " weight = weight / sum(weight)\n", 72 | " Delta = M @ weight\n", 73 | " else:\n", 74 | " Nw = len(Z)\n", 75 | " Delta = (M @ (weight.reshape(Np, Norb * Norb))).reshape(Nw, Norb, Norb)\n", 76 | " return pol, weight, Delta" 77 | ] 78 | }, 79 | { 80 | "cell_type": "markdown", 81 | "metadata": {}, 82 | "source": [ 83 | "An example Matsubara data would look like the following:" 84 | ] 85 | }, 86 | { 87 | "cell_type": "code", 88 | "execution_count": 3, 89 | "metadata": {}, 90 | "outputs": [ 91 | { 92 | "data": { 93 | "text/plain": [ 94 | "Text(0.5, 1.0, 'Matsubara data')" 95 | ] 96 | }, 97 | "execution_count": 3, 98 | "metadata": {}, 99 | "output_type": "execute_result" 100 | }, 101 | { 102 | "data": { 103 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAisAAAGxCAYAAACju/aQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/OQEPoAAAACXBIWXMAAA9hAAAPYQGoP6dpAABbVklEQVR4nO3dd3hUZd7/8ffMpFcggRQIJHQpiqAiIIoFsIC97yqs5ecu1kV31cdV0EfBrrv62HYR3XVdXRW7u4JSVIoColIE6QRCCCSQhPTMnN8fZ2aSkELKzJyZ5PO6rrnmzJkz59wZJuEz97nv77EZhmEgIiIiEqTsVjdAREREpCkKKyIiIhLUFFZEREQkqCmsiIiISFBTWBEREZGgprAiIiIiQU1hRURERIKawoqIiIgENYUVERERCWoKKyJB7LXXXsNms2Gz2Vi8eHG95w3DoG/fvthsNsaNG9eqY7zwwgu89tprbWpnc9hsNm655Ra/H8efxo0b1+r3edasWXzwwQc+bY9IR6GwIhIC4uPjmTNnTr31S5YsYevWrcTHx7d634EKKx2dwopI6ymsiISAK664gvfee4+ioqI66+fMmcOoUaPo2bOnRS0LLk6nk4qKCqubISI+prAiEgKuuuoqAP71r3951xUWFvLee+9x3XXXNfiaBx98kJEjR9KlSxcSEhIYPnw4c+bMofa1SzMzM1m/fj1Llizxnm7KzMwEwOVy8fDDDzNgwACio6Pp1KkTxx57LH/+85+9r586dap3+9pmzpyJzWZrsF0vv/wy/fv3JzIykkGDBvHWW2/VeX7//v1MmzaNQYMGERcXR7du3TjjjDP4+uuv62y3Y8cObDYbjz/+OA8//DBZWVlERkayaNEiysvLufPOOxk2bBiJiYl06dKFUaNG8eGHHzb+JtdiGAaPP/44vXr1IioqiuHDh/Of//yn3nbNPY7NZqOkpITXX3/d+z57Tic19+cV6cjCrG6AiBxdQkICl156Ka+++io33XQTYAYXu93OFVdcwbPPPlvvNTt27OCmm27y9rqsWLGCW2+9lT179vDAAw8A8P7773PppZeSmJjICy+8AEBkZCQAjz/+ODNnzuRPf/oTp556KlVVVWzcuJFDhw61+uf46KOPWLRoEQ899BCxsbG88MILXHXVVYSFhXHppZcCUFBQAMCMGTNITU3l8OHDvP/++4wbN44vv/yy3piRv/zlL/Tv358nn3yShIQE+vXrR0VFBQUFBdx11110796dyspKvvjiCy6++GLmzp3Ltdde22Q7H3zwQR588EGuv/56Lr30UrKzs7nxxhtxOp0MGDDAu11zj7N8+XLOOOMMTj/9dO6//37A/Ddtzc8r0iEZIhK05s6dawDGypUrjUWLFhmAsW7dOsMwDOPEE080pk6dahiGYQwePNg47bTTGt2P0+k0qqqqjIceeshISkoyXC6X97nGXjtp0iRj2LBhTbZvypQpRq9eveqtnzFjhnHknxfAiI6ONnJzc73rqqurjYEDBxp9+/Zt9BjV1dVGVVWVceaZZxoXXXSRd/327dsNwOjTp49RWVnZZDs9+7j++uuN448/vsltDx48aERFRdU5lmEYxtKlSw2gyfe5qePExsYaU6ZMafLYtfdx5M8r0pHpNJBIiDjttNPo06cPr776KmvXrmXlypWNngICWLhwIWeddRaJiYk4HA7Cw8N54IEHyM/PJy8v76jHO+mkk/jxxx+ZNm0an3/+eb3xMq1x5plnkpKS4n3scDi44oor2LJlC7t37/auf+mllxg+fDhRUVGEhYURHh7Ol19+yc8//1xvn+effz7h4eH11r/zzjuMGTOGuLg47z7mzJnT4D5qW758OeXl5fzqV7+qs3706NH06tXLZ8eprSU/r0hHpLAiEiJsNhu/+c1veOONN3jppZfo378/Y8eObXDb7777jgkTJgDw17/+laVLl7Jy5Uruu+8+AMrKyo56vHvvvZcnn3ySFStWcM4555CUlMSZZ57JqlWrWv0zpKamNrouPz8fgKeffprf/e53jBw5kvfee48VK1awcuVKzj777AbbnZaWVm/dvHnzuPzyy+nevTtvvPEGy5cv94a78vLyJtvoaUdTbfXFcTxa+vOKdEQasyISQqZOncoDDzzASy+9xCOPPNLodm+99Rbh4eF88sknREVFede3ZOpsWFgY06dPZ/r06Rw6dIgvvviC//mf/2HixIlkZ2cTExNDVFRUg7NvDhw40OA+c3NzG12XlJQEwBtvvMG4ceN48cUX62xXXFzc4D4bGsj7xhtvkJWVxdtvv13n+ebMFPK0o7G21h5Q3Jbj1N5HS35ekY5IPSsiIaR79+784Q9/YPLkyUyZMqXR7Ww2G2FhYTgcDu+6srIy/vGPf9TbNjIy8qjf4Dt16sSll17KzTffTEFBATt27ADM2UR5eXns27fPu21lZSWff/55g/v58ssv62zrdDp5++236dOnDz169PC23TPI1+Onn35i+fLlTbaxNpvNRkRERJ0AkZub26zZQCeffDJRUVH885//rLN+2bJl7Ny5s9XHaex99sXPK9LeKayIhJhHH32UDz74oMHTHx7nnXcehw8f5uqrr2bBggW89dZbjB07tt5/igBDhw7lxx9/5O2332blypWsXbsWgMmTJ3Pvvffy3nvv8dVXX/GPf/yDZ599ll69etGvXz/ArP/icDi48sor+eyzz5g3bx4TJkzA6XQ22K7k5GTOOOMM3nrrLT7++GMmTZrExo0b6/QSTZo0ifnz5zNjxgwWLlzIiy++yMSJE8nKymr2ezRp0iQ2bdrEtGnTWLhwIa+//jqnnHJKk++ZR+fOnbnrrrt4//33ueGGG/j888/529/+xuWXX17vNFBLjjN06FAWL17Mxx9/zKpVq9i0aZPPfl6Rds/qEb4i0rjas4Ga0tCMnldffdUYMGCAERkZafTu3duYPXu2MWfOHAMwtm/f7t1ux44dxoQJE4z4+HgD8M7ueeqpp4zRo0cbycnJRkREhNGzZ0/j+uuvN3bs2FHnOJ999pkxbNgwIzo62ujdu7fx/PPPNzob6OabbzZeeOEFo0+fPkZ4eLgxcOBA45///Ged7SoqKoy77rrL6N69uxEVFWUMHz7c+OCDD+rNPPLMBnriiScafE8effRRIzMz04iMjDSOOeYY469//WuD7WqIy+UyZs+ebWRkZBgRERHGsccea3z88cfGaaedVu99bu5xfvjhB2PMmDFGTExMnVlFzf15RToym2HUqhAlIiIiEmR0GkhERESCmsKKiIiIBDWFFREREQlqCisiIiIS1BRWREREJKgprIiIiEhQC/ly+y6Xi5ycHOLj4xssuy0iIiLBxzAMiouLSU9Px25vuu8k5MNKTk4OGRkZVjdDREREWiE7O9t7uY3GhHxYiY+PB8wfNiEhweLWiIiISHMUFRWRkZHh/X+8KSEfVjynfhISEhRWREREQkxzhnBogK2IiIgENYUVERERCWoKKyIiIhLUQn7MioiIiC8ZhkF1dTVOp9PqpoQ0h8NBWFiYT8qKKKyIiIi4VVZWsnfvXkpLS61uSrsQExNDWloaERERbdqP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dEz+szlOZcglENPF6taISIAorIhI6Og+3LyJSIeiOisiIiIS1BRWREREJKgprIiIiEhQU1gRERGRoKawIiIiIkFNYUVERESCmsKKiIiIBDWFFREREQlqCisiIiIS1BRWREREJKgprIiIiEhQU1gRERGRoKawIiIiIkEt5K+6bBgGAEVFRRa3RERERJrL8/+25//xpoR8WCkuLgYgIyPD4paIiIhISxUXF5OYmNjkNjajOZEmiLlcLnJycoiPj8dms1ndnDYrKioiIyOD7OxsEhISrG6OZfQ+6D0AvQeg98BD70P7ew8Mw6C4uJj09HTs9qZHpYR8z4rdbqdHjx5WN8PnEhIS2sWHsa30Pug9AL0HoPfAQ+9D+3oPjtaj4qEBtiIiIhLUFFZEREQkqCmsBJnIyEhmzJhBZGSk1U2xlN4HvQeg9wD0HnjofejY70HID7AVERGR9k09KyIiIhLUFFZEREQkqCmsiIiISFBTWBEREZGgprAiIiIiQU1hxWKLFy/GZrM1eFu5cmWjr5s6dWq97U8++eQAtty3MjMz6/0899xzT5OvMQyDmTNnkp6eTnR0NOPGjWP9+vUBarFv7dixg+uvv56srCyio6Pp06cPM2bMoLKyssnXtYfPwQsvvEBWVhZRUVGMGDGCr7/+usntlyxZwogRI4iKiqJ379689NJLAWqp782ePZsTTzyR+Ph4unXrxoUXXsimTZuafE1jfzM2btwYoFb73syZM+v9PKmpqU2+pj19DqDhv4E2m42bb765we3b4+egKSFfbj/UjR49mr1799ZZd//99/PFF19wwgknNPnas88+m7lz53ofR0RE+KWNgfLQQw9x4403eh/HxcU1uf3jjz/O008/zWuvvUb//v15+OGHGT9+PJs2bSI+Pt7fzfWpjRs34nK5ePnll+nbty/r1q3jxhtvpKSkhCeffLLJ14by5+Dtt9/mjjvu4IUXXmDMmDG8/PLLnHPOOWzYsIGePXvW23779u2ce+653HjjjbzxxhssXbqUadOm0bVrVy655BILfoK2WbJkCTfffDMnnngi1dXV3HfffUyYMIENGzYQGxvb5Gs3bdpUp+R6165d/d1cvxo8eDBffPGF97HD4Wh02/b2OQBYuXIlTqfT+3jdunWMHz+eyy67rMnXtbfPQaMMCSqVlZVGt27djIceeqjJ7aZMmWJccMEFgWlUAPTq1ct45plnmr29y+UyUlNTjUcffdS7rry83EhMTDReeuklP7Qw8B5//HEjKyuryW1C/XNw0kknGb/97W/rrBs4cKBxzz33NLj9H//4R2PgwIF11t10003GySef7Lc2BlJeXp4BGEuWLGl0m0WLFhmAcfDgwcA1zM9mzJhhHHfccc3evr1/DgzDMG6//XajT58+hsvlavD59vg5aIpOAwWZjz76iAMHDjB16tSjbrt48WK6detG//79ufHGG8nLy/N/A/3oscceIykpiWHDhvHII480eQpk+/bt5ObmMmHCBO+6yMhITjvtNJYtWxaI5vpdYWEhXbp0Oep2ofo5qKysZPXq1XX+DQEmTJjQ6L/h8uXL620/ceJEVq1aRVVVld/aGiiFhYUAzfp3P/7440lLS+PMM89k0aJF/m6a323evJn09HSysrK48sor2bZtW6PbtvfPQWVlJW+88QbXXXcdNputyW3b2+egMQorQWbOnDlMnDiRjIyMJrc755xz+Oc//8nChQt56qmnWLlyJWeccQYVFRUBaqlv3X777bz11lssWrSIW265hWeffZZp06Y1un1ubi4AKSkpddanpKR4nwtlW7du5bnnnuO3v/1tk9uF8ufgwIEDOJ3OFv0b5ubmNrh9dXU1Bw4c8FtbA8EwDKZPn84pp5zCkCFDGt0uLS2NV155hffee4958+YxYMAAzjzzTL766qsAtta3Ro4cyd///nc+//xz/vrXv5Kbm8vo0aPJz89vcPv2/DkA+OCDDzh06FCTX1rb4+egSVZ37bRXM2bMMIAmbytXrqzzmuzsbMNutxvvvvtui4+Xk5NjhIeHG++9956vfoQ2a8174PHuu+8agHHgwIEGn1+6dKkBGDk5OXXW33DDDcbEiRN9/rO0Vmvegz179hh9+/Y1rr/++hYfLxg/B43Zs2ePARjLli2rs/7hhx82BgwY0OBr+vXrZ8yaNavOum+++cYAjL179/qtrYEwbdo0o1evXkZ2dnaLXztp0iRj8uTJfmiVNQ4fPmykpKQYTz31VIPPt+fPgWEYxoQJE4xJkya1+HXt7XNQmwbY+sktt9zClVde2eQ2mZmZdR7PnTuXpKQkzj///BYfLy0tjV69erF58+YWv9ZfWvMeeHhmtGzZsoWkpKR6z3tmCuTm5pKWluZdn5eXV+8bl5Va+h7k5ORw+umnM2rUKF555ZUWHy8YPweNSU5OxuFw1OtFaerfMDU1tcHtw8LCGvychIpbb72Vjz76iK+++ooePXq0+PUnn3wyb7zxhh9aZo3Y2FiGDh3a6Oe4vX4OAHbu3MkXX3zBvHnzWvza9vY5qE1hxU+Sk5NJTk5u9vaGYTB37lyuvfZawsPDW3y8/Px8srOz6/zHbbWWvge1rVmzBqDRnycrK4vU1FQWLFjA8ccfD5jneZcsWcJjjz3Wugb7QUvegz179nD66aczYsQI5s6di93e8rO0wfg5aExERAQjRoxgwYIFXHTRRd71CxYs4IILLmjwNaNGjeLjjz+us27+/PmccMIJrfq9sZphGNx66628//77LF68mKysrFbtZ82aNSHxb95cFRUV/Pzzz4wdO7bB59vb56C2uXPn0q1bN84777wWv7a9fQ7qsLprR0xffPGFARgbNmxo8PkBAwYY8+bNMwzDMIqLi40777zTWLZsmbF9+3Zj0aJFxqhRo4zu3bsbRUVFgWy2Tyxbtsx4+umnjTVr1hjbtm0z3n77bSM9Pd04//zz62xX+z0wDMN49NFHjcTERGPevHnG2rVrjauuuspIS0sLyffAc+rnjDPOMHbv3m3s3bvXe6utvX0O3nrrLSM8PNyYM2eOsWHDBuOOO+4wYmNjjR07dhiGYRj33HOPcc0113i337ZtmxETE2P8/ve/NzZs2GDMmTPHCA8Pb9Wp02Dwu9/9zkhMTDQWL15c59+8tLTUu82R78EzzzxjvP/++8Yvv/xirFu3zrjnnnsMICRO/TXmzjvvNBYvXmxs27bNWLFihTFp0iQjPj6+w3wOPJxOp9GzZ0/j7rvvrvdcR/gcNEVhJUhcddVVxujRoxt9HjDmzp1rGIZhlJaWGhMmTDC6du1qhIeHGz179jSmTJli7Nq1K0Ct9a3Vq1cbI0eONBITE42oqChjwIABxowZM4ySkpI629V+DwzDnL48Y8YMIzU11YiMjDROPfVUY+3atQFuvW/MnTu30TEttbXHz8H//d//Gb169TIiIiKM4cOH15m2O2XKFOO0006rs/3ixYuN448/3oiIiDAyMzONF198McAt9p3G/s1rf86PfA8ee+wxo0+fPkZUVJTRuXNn45RTTjE+/fTTwDfeh6644gojLS3NCA8PN9LT042LL77YWL9+vff59v458Pj8888NwNi0aVO95zrC56ApNsMwjAB35oiIiIg0m6Yui4iISFBTWBEREZGgprAiIiIiQU1hRURERIKawoqIiIgENYUVERERCWoKKyIiIhLUFFZEREQkqCmsiIiISFBTWBEREZGgprAiIiIiQe3/A3I/EpwbUKt3AAAAAElFTkSuQmCC", 104 | "text/plain": [ 105 | "
" 106 | ] 107 | }, 108 | "metadata": {}, 109 | "output_type": "display_data" 110 | } 111 | ], 112 | "source": [ 113 | "pol, weight, Delta = make_Delta_with_random_discrete_pole(Norb=1, Np = 10, Z=Z)\n", 114 | "\n", 115 | "plt.plot(Z.imag, Delta[:, 0, 0].real, label='real')\n", 116 | "plt.plot(Z.imag, Delta[:, 0, 0].imag, label='imag')\n", 117 | "plt.legend()\n", 118 | "plt.title(\"Matsubara data\")" 119 | ] 120 | }, 121 | { 122 | "cell_type": "markdown", 123 | "metadata": {}, 124 | "source": [ 125 | "Let us first test the Matsubara fitting for scalar-valued Matsubara functions." 126 | ] 127 | }, 128 | { 129 | "cell_type": "code", 130 | "execution_count": 4, 131 | "metadata": {}, 132 | "outputs": [ 133 | { 134 | "data": { 135 | "image/png": "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NWtw8eJFCCFQt25d9OjRA7a2tmof6/r166hWrRpiY2PRqVMntR5rLGOupCe584Bu3swZpspLl3ONWAcRkYKxtN8a90wBgI2NDT799FOdBBITEwNnZ2d06NBBJ8cjUpmpac4l/V275iQDryYJuXP3FizQLjlgHURERkurHzr+6aef0KJFC7i6uirWipo/fz5+//13tY4jl8sRExODPn36wMxMq/yOSDOhocBvvwGVKyuXu7nllOti7STWQURklDQe5vvuu+8wceJEDBs2DNOmTcP58+dRrVo1rFy5EqtWrcK+fftUPtauXbvQtm1bJCUloVatWmrHYizdhGQAjGXlcGOpg4iMmrG03xonU3Xr1sWMGTPQuXNn2NnZ4cyZM6hWrRrOnTuHVq1a4d69e7qOtVDG8mIQERGVJsbSfms8zHf16lU0bNgwX7mlpSUyMzO1CoqIiIiopNA4mfL09ERCQkK+8u3bt6Nu3braxERERERUYmg823vUqFEYPHgwnj9/DiEEjh07hnXr1iEqKgo//PCDLmMkIiIiMlgaJ1P9+vVDdnY2Ro8ejadPn6JHjx6oXLkyFi5ciI8//liXMRIREREZLI2SqezsbPz8888ICQnBwIEDce/ePcjlcjg7O+s6PiIiIiKDptGcKTMzM3zxxRfIysoCAFSoUIGJFBEREZVKGk9Ab9q0KU6fPq3LWIiIiIhKHI3nTA0aNAgjRoxASkoKGjdunO/3+OrXr691cERERESGTuNFO01M8ndqSZIEIQQkSYJMJtM6OFUZy6JfREREpYmxtN8a90xdvXpVl3EQERERlUgaJ1NVq1bVZRxEREREJZLGE9CJiIiIiMkUERERkVaYTBERERFpgckUERERkRY0TqaSk5ORkpKiuH/s2DEMGzYMy5cv10lgRERERCWBxslUjx49sG/fPgDArVu3EBwcjGPHjmH8+PGYMmWKzgIkIiIiMmQaJ1Pnzp1DkyZNAAAbNmxAvXr1cOjQIaxduxYrV67UVXxEREREBk3jZOrly5ewtLQEAPz11194//33AQB16tRBWlqabqIjIiIiMnAaJ1Pe3t5YunQp4uPjsXv3brz33nsAgNTUVJQvX15nARIREREZMo2TqejoaCxbtgytWrVC9+7d4evrCwDYsmWLYviPiIiIyNhp/EPHACCTyZCRkYFy5copyq5duwYbGxs4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", 136 | "text/plain": [ 137 | "
" 138 | ] 139 | }, 140 | "metadata": {}, 141 | "output_type": "display_data" 142 | } 143 | ], 144 | "source": [ 145 | "tol = 1e-6 #Fitting tolerance\n", 146 | "\n", 147 | "for Np in range(2, 21):\n", 148 | " pol, weight, Delta = make_Delta_with_random_discrete_pole(Norb=1, Np = Np, Z=Z)\n", 149 | " bathenergy, bathhyb, final_error, func = hybfit(Delta, Z, tol=tol)\n", 150 | " assert(final_error < tol)\n", 151 | " plt.plot(Np, len(bathenergy),\"ro\")\n", 152 | "plt.xlabel(\"Number of acutal poles\")\n", 153 | "plt.ylabel(\"Number of bath orbitals required\")\n", 154 | "plt.title(\"Num. of bath orbitals to reach accuracy 1e-6 vs Num. of acutal poles\")\n", 155 | "plt.xticks(range(2, 21,3))\n", 156 | "plt.show()" 157 | ] 158 | }, 159 | { 160 | "cell_type": "markdown", 161 | "metadata": {}, 162 | "source": [ 163 | "Similarly, we can test for matrix-valued Matsubara functions:" 164 | ] 165 | }, 166 | { 167 | "cell_type": "code", 168 | "execution_count": 5, 169 | "metadata": {}, 170 | "outputs": [], 171 | "source": [ 172 | "tol = 1e-6\n", 173 | "Norb = 4\n", 174 | "\n", 175 | "for Np in range(2, 10):\n", 176 | " pol, weight, G = make_Delta_with_random_discrete_pole(Norb=Norb, Np = Np, Z=Z)\n", 177 | " bathenergy, bathhyb, final_error, func = hybfit(G, Z, tol=tol)\n", 178 | " assert(final_error < tol)" 179 | ] 180 | }, 181 | { 182 | "cell_type": "markdown", 183 | "metadata": {}, 184 | "source": [ 185 | "One can also conduct Matsubara fitting via specifying number of modes $N_p$ in the hybfit function:" 186 | ] 187 | }, 188 | { 189 | "cell_type": "code", 190 | "execution_count": 6, 191 | "metadata": {}, 192 | "outputs": [ 193 | { 194 | "name": "stdout", 195 | "output_type": "stream", 196 | "text": [ 197 | "Numer of bath orbitals is 10\n", 198 | "Final error is 6.189103600097627e-10\n" 199 | ] 200 | } 201 | ], 202 | "source": [ 203 | "pol, weight, G = make_Delta_with_random_discrete_pole(Norb=4, Np = 10, Z=Z)\n", 204 | "bathenergy, bathhyb, final_error, func = hybfit(G, Z, Np=15)\n", 205 | "print(\"Numer of bath orbitals is \", len(bathenergy))\n", 206 | "print(\"Final error is \", final_error)" 207 | ] 208 | }, 209 | { 210 | "cell_type": "markdown", 211 | "metadata": {}, 212 | "source": [ 213 | "

Triqs Interface

\n", 214 | "\n", 215 | "Let us demonstrate how to use our code if the Matsubara functions are given using the TRIQS data structure. \n", 216 | "\n", 217 | "In trqis, the Matsubara frequencies are defined using `MeshImFreq`:" 218 | ] 219 | }, 220 | { 221 | "cell_type": "code", 222 | "execution_count": 7, 223 | "metadata": {}, 224 | "outputs": [], 225 | "source": [ 226 | "from triqs.gf import MeshImFreq\n", 227 | "Norb = 1\n", 228 | "iw_mesh = MeshImFreq(beta=beta, S='Fermion', n_iw=Z.shape[0]//2)" 229 | ] 230 | }, 231 | { 232 | "cell_type": "markdown", 233 | "metadata": {}, 234 | "source": [ 235 | "The `hybfit_triqs` function could handle TRIQS Green's functions object `GF` and `BlockGf`:" 236 | ] 237 | }, 238 | { 239 | "cell_type": "code", 240 | "execution_count": 8, 241 | "metadata": {}, 242 | "outputs": [ 243 | { 244 | "name": "stdout", 245 | "output_type": "stream", 246 | "text": [ 247 | "optimization finished with fitting error 2.701e-15\n", 248 | "optimization finished with fitting error 2.701e-15\n", 249 | "optimization finished with fitting error 2.701e-15\n", 250 | "optimization finished with fitting error 1.081e-14\n", 251 | "optimization finished with fitting error 1.081e-14\n", 252 | "optimization finished with fitting error 1.081e-14\n", 253 | "optimization finished with fitting error 1.099e-14\n", 254 | "optimization finished with fitting error 1.099e-14\n", 255 | "optimization finished with fitting error 1.099e-14\n", 256 | "optimization finished with fitting error 2.220e-14\n", 257 | "optimization finished with fitting error 2.220e-14\n", 258 | "optimization finished with fitting error 2.220e-14\n", 259 | "optimization finished with fitting error 2.892e-14\n", 260 | "optimization finished with fitting error 2.892e-14\n", 261 | "optimization finished with fitting error 2.892e-14\n", 262 | "optimization finished with fitting error 1.905e-14\n", 263 | "optimization finished with fitting error 1.905e-14\n", 264 | "optimization finished with fitting error 1.905e-14\n", 265 | "optimization finished with fitting error 4.401e-07\n", 266 | "optimization finished with fitting error 4.401e-07\n", 267 | "optimization finished with fitting error 4.401e-07\n", 268 | "optimization finished with fitting error 7.920e-08\n", 269 | "optimization finished with fitting error 7.920e-08\n", 270 | "optimization finished with fitting error 7.920e-08\n", 271 | "optimization finished with fitting error 7.742e-07\n", 272 | "optimization finished with fitting error 7.742e-07\n", 273 | "optimization finished with fitting error 7.742e-07\n", 274 | "optimization finished with fitting error 1.444e-10\n", 275 | "optimization finished with fitting error 1.444e-10\n", 276 | "optimization finished with fitting error 1.444e-10\n", 277 | "optimization finished with fitting error 2.079e-09\n", 278 | "optimization finished with fitting error 2.079e-09\n", 279 | "optimization finished with fitting error 2.079e-09\n", 280 | "optimization finished with fitting error 7.408e-10\n", 281 | "optimization finished with fitting error 7.408e-10\n", 282 | "optimization finished with fitting error 7.408e-10\n", 283 | "optimization finished with fitting error 1.092e-09\n", 284 | "optimization finished with fitting error 1.092e-09\n", 285 | "optimization finished with fitting error 1.092e-09\n", 286 | "optimization finished with fitting error 2.791e-09\n", 287 | "optimization finished with fitting error 2.791e-09\n", 288 | "optimization finished with fitting error 2.791e-09\n", 289 | "optimization finished with fitting error 1.611e-09\n", 290 | "optimization finished with fitting error 1.611e-09\n", 291 | "optimization finished with fitting error 1.611e-09\n", 292 | "optimization finished with fitting error 1.047e-09\n", 293 | "optimization finished with fitting error 1.047e-09\n", 294 | "optimization finished with fitting error 1.047e-09\n", 295 | "optimization finished with fitting error 1.827e-09\n", 296 | "optimization finished with fitting error 1.827e-09\n", 297 | "optimization finished with fitting error 1.827e-09\n", 298 | "optimization finished with fitting error 3.379e-09\n", 299 | "optimization finished with fitting error 3.379e-09\n", 300 | "optimization finished with fitting error 3.379e-09\n", 301 | "optimization finished with fitting error 1.989e-09\n", 302 | "optimization finished with fitting error 1.989e-09\n", 303 | "optimization finished with fitting error 1.989e-09\n" 304 | ] 305 | } 306 | ], 307 | "source": [ 308 | "from triqs.gf import Gf, BlockGf\n", 309 | "from adapol import hybfit_triqs\n", 310 | "Norb = 1\n", 311 | "for Np in range(2, 21):\n", 312 | " pol, weight, Delta = make_Delta_with_random_discrete_pole(Norb=Norb, Np = Np, Z=Z)\n", 313 | "\n", 314 | " #Construct Gf object\n", 315 | " delta_iw = Gf(mesh=iw_mesh, target_shape=[Norb, Norb])\n", 316 | " delta_iw.data[:] = Delta\n", 317 | "\n", 318 | " #Construct BlockGf object\n", 319 | " delta_blk = BlockGf(name_list=['up', 'down'], block_list=[delta_iw, delta_iw], make_copies=True)\n", 320 | "\n", 321 | " # Gf interface for hybridization fitting\n", 322 | " bathhyb, bathenergy, delta_fit, final_error = hybfit_triqs(delta_iw, tol=tol, maxiter=50, debug=True)\n", 323 | " assert final_error < tol\n", 324 | "\n", 325 | " # BlockGf interface for hybridization fitting\n", 326 | " bathhyb, bathenergy, delta_fit, final_error = hybfit_triqs(delta_blk, tol=tol, maxiter=50, debug=True)\n", 327 | " assert final_error[0] < tol and final_error[1] < tol" 328 | ] 329 | } 330 | ], 331 | "metadata": { 332 | "kernelspec": { 333 | "display_name": "base", 334 | "language": "python", 335 | "name": "python3" 336 | }, 337 | "language_info": { 338 | "codemirror_mode": { 339 | "name": "ipython", 340 | "version": 3 341 | }, 342 | "file_extension": ".py", 343 | "mimetype": "text/x-python", 344 | "name": "python", 345 | "nbconvert_exporter": "python", 346 | "pygments_lexer": "ipython3", 347 | "version": "3.8.17" 348 | } 349 | }, 350 | "nbformat": 4, 351 | "nbformat_minor": 2 352 | } 353 | --------------------------------------------------------------------------------