Skip to content

Add Windows build support with clang-cl and vcpkg#450

Open
lorisercole wants to merge 37 commits intomainfrom
feature/ler/windows-build-part-1
Open

Add Windows build support with clang-cl and vcpkg#450
lorisercole wants to merge 37 commits intomainfrom
feature/ler/windows-build-part-1

Conversation

@lorisercole
Copy link
Copy Markdown
Contributor

This is the first of a series of PRs to introduce Windows native support.
It enables building QDK/Chemistry on Windows using clang-cl (via MSVC Build Tools) and vcpkg for native dependencies.

Summary of changes:

  • Provides PowerShell scripts to perform a Windows local build.
  • CMake build system: Platform-aware compiler flags for MSVC/clang-cl, _USE_MATH_DEFINES, Fortran name-mangling override (BLAS_FORTRAN_ADD_), suppressed overly-verbose LLVM warnings for dependencies.
  • vcpkg integration: Added vcpkg.json manifest and a custom OpenBLAS overlay port to build LAPACK on Windows
  • HDF5 LLP64 portability: Replaced NATIVE_ULONG with NATIVE_UINT64 for size_t vectors (Windows unsigned long is 4 bytes), and use hbool_t intermediaries instead of writing bool* with NATIVE_HBOOL
  • spdlog stdout capture: Added a custom stdout_fd_sink that writes via fwrite(stdout) instead of caching a Windows HANDLE, so pytest capfd works after dup2() redirection
  • Python DLL loading: Register extra DLL search directories via QDK_DLL_DIR env var and os.add_dll_directory(); enforce UTF-8 encoding for stdout/stderr and all file I/O
  • OpenMP: Enabled for the project but disabled for GauXC on Windows to avoid a data race in its XC integrator under LLVM libomp
  • Test hardening: Explicit file handle closing for Windows file locking, skip PySCF-dependent tests when unavailable, non-interactive matplotlib backend, temp directories for doc examples
  • Misc: .gitattributes enforcing LF line endings, fix uninitialized Shell::rpowers, PowerShell build scripts, updated GauXC pin

[For more detailed information, check the commit messages and comments in the code.]

To be addressed by future PRs:

  • build with MSVC cl compiler
  • pip wheel build in GitHub & ADO pipelines

Two issues caused 27 test failures on Windows:

1. NATIVE_ULONG / size_t mismatch: On Windows LLP64, unsigned long is
   4 bytes while size_t is 8 bytes. Use NATIVE_UINT64 instead, which is
   unambiguously 64-bit on all platforms.

2. NATIVE_HBOOL / bool mismatch: HDF5's hbool_t is unsigned int
   (4 bytes), but C++ bool is 1 byte. Reading/writing a bool* with
   NATIVE_HBOOL is undefined behavior. Use hbool_t intermediaries with
   static_cast at each serialization site.
On Windows, std::filesystem::remove() fails if the file still has an
open handle — unlike Linux, which allows unlinking open files.

Two tests opened an std::ifstream to verify FCIDUMP file contents but
called remove() while the stream was still in scope, causing:

  "remove: The process cannot access the file because it is being
   used by another process"

Fix by scoping each ifstream in a block so its destructor closes the
file handle before the remove() call.

Affected tests:
  - HamiltonianTest.SparseContainerFCIDUMP
  - HamiltonianTest.FCIDUMPActiveSpaceConsistency
Shell::from_json() used default initialization (`Shell sh`), leaving
the rpowers array indeterminate for non-ECP shells — the JSON round-
trip never writes rpowers for regular shells. Both BasisHasher and
BasisEqChecker read rpowers unconditionally, so comparing a database-
loaded shell (zero-initialized via `Shell sh{0}`) against a JSON-
deserialized shell was undefined behavior. Fix by value-initializing
(`Shell sh{}`), matching the pattern already used elsewhere.

Also fix BasisSetMap test which had three bugs:
- Reversed basis_json["shells"] but the actual key is "electron_shells"
  (operator[] silently created an empty entry, making the reverse a no-op)
- Used Hydrogen (1 shell in STO-3G), so even reversing the correct key
  would be a no-op; switch to Lithium which has 3 shells
- Test only passed on Linux by accident: uninitialized rpowers garbage
  happened to make the hashes differ
Three issues prevented the Python package from building and importing
on Windows when linking to a pre-installed C++ library:

1. pybind11 not found: vcpkg's find_package wrapper intercepts the
   search and misses pybind11 installed in pip's isolated build
   environment.  Fix by querying `python -m pybind11 --cmakedir` and
   setting pybind11_DIR explicitly before find_package.

2. DLL load failure at import: Python 3.8+ no longer searches PATH for
   DLL dependencies of extension modules.  Add a Windows-only block in
   __init__.py that reads the QDK_DLL_DIR environment variable and
   calls os.add_dll_directory() for each path before _core is imported.

3. Test script updates: use Ninja generator, clang-cl compilers, vcpkg
   toolchain, CMAKE_PREFIX_PATH for the pre-built C++ library, uv for
   venv management, and QDK_DLL_DIR for runtime DLL resolution.
In Windows the default encoding is cp1252, not UTF-8. This caused tests to fail.
NamedTemporaryFile with the default delete=True keeps an exclusive file
handle on Windows, preventing C++ code from opening the same path.

Use delete=False so the handle is released when the with-block exits,
then clean up manually with Path.unlink() in a finally block.  This
pattern is needed wherever a temp file is created in Python and then
passed to the C++ library for reading or writing.

Affected tests: test_basis_set, test_orbitals, test_stability,
test_noise_models (24 instances total).

Note: when the minimum Python version is raised to 3.12+, this can be
simplified using delete_on_close=False, which releases the file handle
on close but auto-deletes on context manager exit — removing the need
for manual unlink() calls.
The check_license_headers.py script prints a ✅ emoji on success, but
Python defaults to cp1252 encoding for stdout on Windows, which cannot
encode it.  Reconfigure stdout to UTF-8 at the top of the script.
On Windows, spdlog::stdout_color_mt() creates a wincolor_stdout_sink
that caches a Windows HANDLE via GetStdHandle(STD_OUTPUT_HANDLE) at
construction time.  All subsequent writes go through WriteFile(HANDLE)
which bypasses the C runtime's file descriptor layer entirely.

When pytest's capfd redirects fd 1 via dup2(), the cached HANDLE still
points to the original stdout, so all Logger output bypasses capture —
causing ~25 test failures across test_logger.py,
test_constants_documentation.py, and test_scf.py.

On Linux this is not a problem because stdout_color_sink_mt is aliased
to ansicolor_stdout_sink, which writes via fwrite(stdout) through the
C runtime's fd layer.

Add a custom stdout_fd_sink for Windows that writes via fwrite(stdout),
giving Windows the same fd-based write path that Linux gets by default.
The sink is used only on Windows (#ifdef _WIN32); Linux/macOS continue
to use stdout_color_mt() unchanged.
Windows uses cp1252 as the default locale encoding, which silently
corrupts non-ASCII text in open(), read_text(), write_text(), and
subprocess.run(text=True) calls.
All text I/O in the package and its test suite now passes
encoding="utf-8" explicitly, and subprocess invocations additionally
propagate PYTHONIOENCODING=utf-8 to child processes so that both
parent and child agree on the codec regardless of the system locale.
A dedicated round-trip regression test verifies that Unicode content
(φ, Å, ΔE, αβγ, 你好) survives file serialization and stdout capture
end-to-end on Windows.
The uv-installed CPython 3.14 on Windows ships with an incomplete
Tcl/Tk installation (missing tcl_findLibrary). Matplotlib defaults
to the TkAgg backend, which crashes when trying to create a Tk
window during circuit diagram plotting tests.

Force the non-interactive Agg backend in conftest.py before any
pyplot import. This is standard practice for CI/headless test
environments and avoids the Tk dependency entirely.
This eliminates CRLF warnings on Windows and ensures consistent line endings across platforms.
Run each example script in a fresh TemporaryDirectory so output
files (e.g. .h5, .json) don't pollute the source tree. On failure
the temp directory is preserved for debugging; on success it is
cleaned up.
Using more than 2 OpenMP threads causes some tests to fail (SCF not converging, ...) due to numerical instabilities.
See: https://gist.github.com/lorisercole/c8081e5f4966c6bf9a2e64734c781fd3
The culprit appears to be GauXC's XC integrator, that uses element-by-element #pragma omp atomic accumulation on shared matrices (inc_by_submat_atomic in util.hpp).
Under LLVM's libomp this causes non-deterministic floating-point summation order, leading to NaN/divergence in SCF with >2 threads.
The issue does not manifest with GCC/libgomp due to its more conservative thread scheduling.
An issue on GauXC repo will be opened.

Temporary fix: disable GAUXC_ENABLE_OPENMP on MSVC while keeping OpenMP enabled for the rest of the project (MACIS, our own code).
@lorisercole lorisercole marked this pull request as ready for review April 20, 2026 20:34
Copilot AI review requested due to automatic review settings April 20, 2026 20:34
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR introduces the first slice of Windows-native build support for QDK/Chemistry, targeting clang-cl + MSVC Build Tools and vcpkg-managed native dependencies, while hardening runtime/test behavior for Windows-specific IO and encoding pitfalls.

Changes:

  • Add vcpkg manifests + an OpenBLAS overlay port (incl. LAPACK/C_LAPACK and cross-build getarch handling) to provide Windows-native dependency builds.
  • Update CMake and third-party build wiring for MSVC/clang-cl compatibility (flags, OpenMP handling, dependency warning suppression, Fortran mangling override).
  • Improve Windows portability across Python + C++: UTF-8 file/stdio handling, DLL search path registration, HDF5 LLP64 fixes, and test updates for Windows file locking.

Reviewed changes

Copilot reviewed 56 out of 57 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
vcpkg.json Adds repo vcpkg manifest for Windows dependency resolution.
vcpkg-configuration.json Pins vcpkg baseline and enables overlay ports.
vcpkg-overlay/ports/openblas/vcpkg.json Defines overlay OpenBLAS port manifest for Windows/LAPACK needs.
vcpkg-overlay/ports/openblas/portfile.cmake Builds OpenBLAS with embedded C LAPACK and cross-build getarch handling.
vcpkg-overlay/ports/openblas/cmake-project-include.cmake Forces sensible TARGET/NUM_THREADS defaults for vcpkg scenarios.
vcpkg-overlay/ports/openblas/disable-testing.diff Disables OpenBLAS tests under BUILD_TESTING control.
vcpkg-overlay/ports/openblas/getarch.diff Allows using host-built getarch binaries and installs them when possible.
vcpkg-overlay/ports/openblas/system-check-msvc.diff Improves MSVC processor detection in OpenBLAS system checks.
vcpkg-overlay/ports/openblas/win32-uwp.diff Uses WIN32 checks instead of string system-name comparisons.
vcpkg-overlay/ports/openblas/openblas_common.h Adds OpenBLAS ABI/config helpers for Windows builds.
python/CMakeLists.txt Improves pybind11 discovery under vcpkg and adjusts coverage/RPATH logic for Windows.
python/pyproject.toml Updates dev extras and scikit-build-core configuration verbosity key.
python/src/qdk_chemistry/init.py Adds Windows DLL directory registration + UTF-8 stdout/stderr configuration.
python/src/qdk_chemistry/data/base.py Forces UTF-8 for JSON file IO.
python/src/qdk_chemistry/data/noise_models.py Forces UTF-8 for YAML file IO.
python/src/qdk_chemistry/utils/qsharp/init.py Reads Q# sources using UTF-8 explicitly.
python/src/qdk_chemistry/utils/cubegen.py Reads generated cube files using UTF-8.
python/tests/conftest.py Ensures UTF-8 test output and forces non-interactive matplotlib backend.
python/tests/test_basis_set.py Avoids Windows file locking by closing temp files and unlinking manually.
python/tests/test_circuit.py Reads JSON test outputs using UTF-8.
python/tests/test_docs_examples.py Uses UTF-8 reads and runs examples in temp dirs with UTF-8 subprocess env.
python/tests/test_energy_estimator.py Reads JSON test outputs using UTF-8.
python/tests/test_energy_expectation_result.py Reads JSON test outputs using UTF-8.
python/tests/test_estimator_data.py Reads JSON test outputs using UTF-8.
python/tests/test_mc.py Skips PySCF-dependent tests when unavailable; updates SCF solver comment.
python/tests/test_measurement_data.py Reads JSON test outputs using UTF-8.
python/tests/test_noise_models.py Fixes Windows temp-file locking and adds UTF-8 round-trip/subprocess test.
python/tests/test_orbitals.py Avoids Windows file locking for JSON/HDF5 temp files; manual unlink cleanup.
python/tests/test_qubit_hamiltonian.py Reads JSON test outputs using UTF-8.
python/tests/test_readme_snippets.py Forces UTF-8 subprocess decoding and log file writing.
python/tests/test_sample_workflow.py Skips notebook tests requiring PySCF when not installed.
python/tests/test_sample_workflow_utils.py Forces UTF-8 decoding and subprocess IO encoding env.
python/tests/test_settings.py Reads JSON test outputs using UTF-8.
python/tests/test_stability.py Avoids Windows temp-file locking for JSON/HDF5; manual unlink cleanup.
cpp/CMakeLists.txt Adds MSVC/clang-cl oriented flags, warning suppression, OpenMP notes, and BLAS mangling define.
cpp/cmake/qdk-uarch.cmake Maps uarch flags for MSVC and improves compiler-aware handling.
cpp/cmake/third_party.cmake Removes -fPIC for MSVC builds; disables OpenMP in GauXC on Windows; updates GauXC pin.
cpp/include/qdk/chemistry/utils/stdout_fd_sink.hpp Adds Windows sink to make spdlog stdout compatible with pytest capfd/dup2.
cpp/src/qdk/chemistry/utils/logger.cpp Uses stdout_fd_sink on Windows to enable stdout capture.
cpp/src/qdk/chemistry/data/hdf5_serialization.cpp Fixes LLP64 portability by storing size_t vectors as NATIVE_UINT64.
cpp/src/qdk/chemistry/data/orbitals.cpp Writes/reads HDF5 boolean fields via hbool_t intermediaries.
cpp/src/qdk/chemistry/data/wavefunction_containers/cc.cpp Writes HDF5 boolean attribute via hbool_t intermediate.
cpp/tests/CMakeLists.txt Limits coverage flags to GCC/Clang toolchains.
cpp/tests/test_hamiltonian.cpp Ensures file handles close before delete to avoid Windows file locking errors.
cpp/src/qdk/chemistry/algorithms/microsoft/scf/src/core/basis_set.cpp Improves filesystem stem string conversion and zero-initializes Shell.
cpp/src/qdk/chemistry/algorithms/microsoft/scf/tests/util_tests.cpp Adjusts basis shell ordering test to use lithium + correct JSON key.
external/macis/include/macis/types.hpp Adds MSVC-specific includes and a MSVC-only uint128 placeholder type.
external/macis/include/macis/bitset_operations.hpp Adds MSVC implementations for CLZ/FFS and adapts uint128 conversion.
external/macis/cmake/macis-ips4o.cmake Avoids linking atomic on Windows.
external/macis/cmake/macis-spdlog.cmake Avoids -fPIC on MSVC.
external/macis/src/lobpcgxx/CMakeLists.txt Avoids -fPIC on MSVC; forces BLAS Fortran mangling define on Windows.
external/macis/python/tests/test_pymacis.py Forces UTF-8 when reading/writing FCIDUMP test files.
.pipelines/pip-scripts/windows-build-clang-cmake.ps1 Adds Windows local build script using clang-cl + vcpkg + CMake.
.pipelines/pip-scripts/windows-build-clang-pip.ps1 Adds Windows local build script using clang-cl + vcpkg + pip/scikit-build-core.
.github/scripts/check_license_headers.py Forces UTF-8 stdout to avoid Windows console encoding issues.
.gitattributes Enforces LF line endings repo-wide.
.gitignore Ignores local Windows build artifacts (install/, vcpkg_installed/).

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread external/macis/include/macis/types.hpp
Comment thread cpp/CMakeLists.txt Outdated
Comment thread .pipelines/pip-scripts/windows-build-clang-pip.ps1
Comment thread .pipelines/pip-scripts/windows-build-clang-cmake.ps1 Outdated
Comment thread python/tests/conftest.py
Comment thread vcpkg-overlay/ports/openblas/vcpkg.json
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 20, 2026

📊 Coverage Summary

Component Coverage
C++ Library 78%
Python Package 87%
Pybind11 Bindings 89%

Detailed Coverage Reports

C++ Coverage Details
------------------------------------------------------------------------------
                           GCC Code Coverage Report
Directory: cpp
------------------------------------------------------------------------------
File                                       Lines    Exec  Cover   Missing
------------------------------------------------------------------------------
include/qdk/chemistry/algorithms/active_space.hpp
                                               5       5   100%
include/qdk/chemistry/algorithms/algorithm.hpp
                                              60      55    91%   187,209,211-212,270
include/qdk/chemistry/algorithms/dynamical_correlation_calculator.hpp
                                               7       6    85%   115
include/qdk/chemistry/algorithms/hamiltonian.hpp
                                               5       5   100%
include/qdk/chemistry/algorithms/localization.hpp
                                               5       5   100%
include/qdk/chemistry/algorithms/mc.hpp       18      18   100%
include/qdk/chemistry/algorithms/mcscf.hpp
                                               6       6   100%
include/qdk/chemistry/algorithms/pmc.hpp       9       8    88%   186
include/qdk/chemistry/algorithms/scf.hpp      13      12    92%   23
include/qdk/chemistry/algorithms/stability.hpp
                                               5       4    80%   131
include/qdk/chemistry/data/ansatz.hpp          3       3   100%
include/qdk/chemistry/data/basis_set.hpp      35      30    85%   108-109,112,114,319
include/qdk/chemistry/data/configuration.hpp
                                              32      30    93%   71,119
include/qdk/chemistry/data/configuration_set.hpp
                                               3       2    66%   35
include/qdk/chemistry/data/data_class.hpp
                                               4       4   100%
include/qdk/chemistry/data/element_data.hpp
                                              18      18   100%
include/qdk/chemistry/data/hamiltonian.hpp
                                              12      12   100%
include/qdk/chemistry/data/hamiltonian_containers/canonical_four_center.hpp
                                               1       1   100%
include/qdk/chemistry/data/hamiltonian_containers/cholesky.hpp
                                               1       1   100%
include/qdk/chemistry/data/hamiltonian_containers/sparse.hpp
                                               1       1   100%
include/qdk/chemistry/data/lattice_graph.hpp
                                               3       1    33%   324-325
include/qdk/chemistry/data/orbitals.hpp        6       6   100%
include/qdk/chemistry/data/pauli_operator.hpp
                                              88      83    94%   1203,1227,1262,1274,1288
include/qdk/chemistry/data/settings.hpp       90      68    75%   180-181,311,353,488,857,864,866,881-882,886-888,892-893,895-897,899-900,989,993
include/qdk/chemistry/data/stability_result.hpp
                                              38      38   100%
include/qdk/chemistry/data/structure.hpp       8       8   100%
include/qdk/chemistry/data/wavefunction.hpp
                                              25      19    76%   496,502,510-512,673
include/qdk/chemistry/data/wavefunction_containers/cas.hpp
                                               1       1   100%
include/qdk/chemistry/data/wavefunction_containers/cc.hpp
                                               1       1   100%
include/qdk/chemistry/data/wavefunction_containers/mp2.hpp
                                               1       1   100%
include/qdk/chemistry/data/wavefunction_containers/sci.hpp
                                               1       1   100%
include/qdk/chemistry/data/wavefunction_containers/sd.hpp
                                               1       1   100%
include/qdk/chemistry/utils/hash.hpp           4       4   100%
include/qdk/chemistry/utils/logger.hpp        41      35    85%   223-224,226,233-234,236
include/qdk/chemistry/utils/model_hamiltonians.hpp
                                             128     122    95%   59-60,89-90,137,141
include/qdk/chemistry/utils/string_utils.hpp
                                              11      10    90%   41
src/qdk/chemistry/algorithms/active_space.cpp
                                             232     142    61%   35-36,40-41,45-46,116-118,143-145,147,151-154,156-159,162-163,165-168,173-174,176-179,182-184,187-189,191,194-196,218,220,224,226-229,231-232,236-239,241,243,246-249,251,253,255-256,277-278,307,310,342,347-348,350-353,355-357,359-360,363,367,369-371,413,415,417
src/qdk/chemistry/algorithms/dynamical_correlation_calculator.cpp
                                               8       8   100%
src/qdk/chemistry/algorithms/hamiltonian.cpp
                                              14      14   100%
src/qdk/chemistry/algorithms/localization.cpp
                                              15      15   100%
src/qdk/chemistry/algorithms/mc.cpp           11      11   100%
src/qdk/chemistry/algorithms/microsoft/active_space/autocas_active_space.cpp
                                              80      78    97%   103,133
src/qdk/chemistry/algorithms/microsoft/active_space/autocas_active_space.hpp
                                              16      16   100%
src/qdk/chemistry/algorithms/microsoft/active_space/entropy_active_space.cpp
                                              45      45   100%
src/qdk/chemistry/algorithms/microsoft/active_space/entropy_active_space.hpp
                                              10      10   100%
src/qdk/chemistry/algorithms/microsoft/active_space/occupation_active_space.cpp
                                              60      54    90%   46,48,81,83,101-102
src/qdk/chemistry/algorithms/microsoft/active_space/occupation_active_space.hpp
                                               6       6   100%
src/qdk/chemistry/algorithms/microsoft/active_space/valence_active_space.cpp
                                              75      63    84%   34,36,68-69,76-77,104-105,120-121,124-125
src/qdk/chemistry/algorithms/microsoft/active_space/valence_active_space.hpp
                                               9       9   100%
src/qdk/chemistry/algorithms/microsoft/cholesky_hamiltonian.cpp
                                             452     407    90%   98,102,420,439,442-443,462,473,476-477,507-508,557-558,564-566,573-574,581-582,613,616-617,632,640,642-644,767,769,781,787,800,806,868-869,871-872,875,980-981,983-984,987
src/qdk/chemistry/algorithms/microsoft/cholesky_hamiltonian.hpp
                                              13      13   100%
src/qdk/chemistry/algorithms/microsoft/hamiltonian.cpp
                                             247     230    93%   46-47,53-55,62-63,105-106,165-166,293,295,306,318,380,488
src/qdk/chemistry/algorithms/microsoft/hamiltonian.hpp
                                              10      10   100%
src/qdk/chemistry/algorithms/microsoft/localization/iterative_localizer_base.cpp
                                               5       5   100%
src/qdk/chemistry/algorithms/microsoft/localization/iterative_localizer_base.hpp
                                               8       8   100%
src/qdk/chemistry/algorithms/microsoft/localization/mp2_natural_orbitals.cpp
                                              79      74    93%   44,81,83,104,106
src/qdk/chemistry/algorithms/microsoft/localization/mp2_natural_orbitals.hpp
                                               3       3   100%
src/qdk/chemistry/algorithms/microsoft/localization/pipek_mezey.cpp
                                             169     160    94%   26,34,41,43,47,49,246,329,332
src/qdk/chemistry/algorithms/microsoft/localization/pipek_mezey.hpp
                                               6       6   100%
src/qdk/chemistry/algorithms/microsoft/localization/vvhv.cpp
                                             646     575    89%   336,338-339,452-453,476,534,695,739,741,746,762-765,768,778-781,784,819-821,827-831,859-862,865,887,889-891,968-972,1018-1022,1040-1043,1047-1050,1052-1054,1057,1131,1194-1196,1267,1286,1289,1293,1295,1300-1301
src/qdk/chemistry/algorithms/microsoft/localization/vvhv.hpp
                                               6       6   100%
src/qdk/chemistry/algorithms/microsoft/macis_asci.cpp
                                              69      66    95%   51,167,169
src/qdk/chemistry/algorithms/microsoft/macis_asci.hpp
                                              61      61   100%
src/qdk/chemistry/algorithms/microsoft/macis_base.cpp
                                              74      58    78%   29-31,41,46,98-99,102,106-107,110-112,119-121
src/qdk/chemistry/algorithms/microsoft/macis_base.hpp
                                              93      71    76%   66,68,70,72,74,76,187-189,191,194,196,199-201,203-205,207-209,211
src/qdk/chemistry/algorithms/microsoft/macis_cas.cpp
                                              45      42    93%   47,109,111
src/qdk/chemistry/algorithms/microsoft/macis_cas.hpp
                                               3       3   100%
src/qdk/chemistry/algorithms/microsoft/macis_pmc.cpp
                                              82      80    97%   114,153
src/qdk/chemistry/algorithms/microsoft/macis_pmc.hpp
                                              16      16   100%
src/qdk/chemistry/algorithms/microsoft/mp2.cpp
                                             202     184    91%   33,78,82-83,93-94,97,101-102,149-150,153-154,164-165,168,172-173
src/qdk/chemistry/algorithms/microsoft/mp2.hpp
                                               2       2   100%
src/qdk/chemistry/algorithms/microsoft/scf.cpp
                                             271     254    93%   101-102,132-133,141,143,197,244,315,347,352,354,380-382,401,472
src/qdk/chemistry/algorithms/microsoft/scf.hpp
                                              19      19   100%
src/qdk/chemistry/algorithms/microsoft/scf/include/qdk/chemistry/scf/core/basis_set.h
                                               9       8    88%   134
src/qdk/chemistry/algorithms/microsoft/scf/include/qdk/chemistry/scf/core/enums.h
                                              16       0     0%   38-39,48-49,54-59,70-75
src/qdk/chemistry/algorithms/microsoft/scf/include/qdk/chemistry/scf/core/eri.h
                                              15      12    80%   46-47,49
src/qdk/chemistry/algorithms/microsoft/scf/include/qdk/chemistry/scf/core/exc.h
                                               3       3   100%
src/qdk/chemistry/algorithms/microsoft/scf/include/qdk/chemistry/scf/core/moeri.h
                                               3       3   100%
src/qdk/chemistry/algorithms/microsoft/scf/include/qdk/chemistry/scf/core/molecule.h
                                               1       1   100%
src/qdk/chemistry/algorithms/microsoft/scf/include/qdk/chemistry/scf/eri/eri_multiplexer.h
                                               6       3    50%   126-127,135
src/qdk/chemistry/algorithms/microsoft/scf/include/qdk/chemistry/scf/util/cache.h
                                              27      26    96%   44
src/qdk/chemistry/algorithms/microsoft/scf/include/qdk/chemistry/scf/util/class_registry.h
                                              13      13   100%
src/qdk/chemistry/algorithms/microsoft/scf/include/qdk/chemistry/scf/util/gauxc_registry.h
                                               6       5    83%   39
src/qdk/chemistry/algorithms/microsoft/scf/include/qdk/chemistry/scf/util/gauxc_util.h
                                              21      21   100%
src/qdk/chemistry/algorithms/microsoft/scf/include/qdk/chemistry/scf/util/int1e.h
                                               2       2   100%
src/qdk/chemistry/algorithms/microsoft/scf/include/qdk/chemistry/scf/util/singleton.h
                                              13      13   100%
src/qdk/chemistry/algorithms/microsoft/scf/src/core/basis_set.cpp
                                             361     279    77%   33-34,92-93,97-98,146,150-154,157-161,172,183-184,188,190-191,197-198,201-206,210,212-215,217,219,223,225-226,228-229,231,248,257,265-266,313-314,335,337,342-343,345-346,348,401,406-407,415,436,458,460-461,463-465,478,480,482-485,487,490,493-494,542,544,548-549
src/qdk/chemistry/algorithms/microsoft/scf/src/core/scf.cpp
                                               7       7   100%
src/qdk/chemistry/algorithms/microsoft/scf/src/eri/eri.cpp
                                              36      29    80%   58-60,65-66,89-90
src/qdk/chemistry/algorithms/microsoft/scf/src/eri/eri_df_base.cpp
                                              34      32    94%   29-30
src/qdk/chemistry/algorithms/microsoft/scf/src/eri/eri_df_base.h
                                               2       2   100%
src/qdk/chemistry/algorithms/microsoft/scf/src/eri/eri_multiplexer.cpp
                                              61      37    60%   16-17,26-29,40,46-49,52-55,79,81,83-85,87-88,91,93
src/qdk/chemistry/algorithms/microsoft/scf/src/eri/INCORE/incore.cpp
                                              42      29    69%   40,42,44,66,68,70-72,74-75,77-79
src/qdk/chemistry/algorithms/microsoft/scf/src/eri/INCORE/incore_impl.cpp
                                              96      88    91%   44,136,138,235,237,239,287,289
src/qdk/chemistry/algorithms/microsoft/scf/src/eri/INCORE/incore_impl_df.cpp
                                             102      60    58%   86-87,89,203,205,207-214,216-221,224,227-233,236,253,256,263-264,286,291,305-306,309,320-321,323-324,326
src/qdk/chemistry/algorithms/microsoft/scf/src/eri/LIBINT2_DIRECT/libint2_direct.cpp
                                             182     169    92%   268,606,608,610,908,910-913,916,918-920
src/qdk/chemistry/algorithms/microsoft/scf/src/eri/moeri.cpp
                                              36      34    94%   32-33
src/qdk/chemistry/algorithms/microsoft/scf/src/eri/schwarz.cpp
                                              33      13    39%   80-81,83-88,90-93,95-98,101-102,104,106
src/qdk/chemistry/algorithms/microsoft/scf/src/eri/SNK/snk.cpp
                                              66       0     0%   36,58-60,62-65,67,69-70,72,98,100,102-104,107-110,114-116,119-121,124-127,146,148,150,167-168,170,187,191,193-194,200-201,203,205-207,209,212,214,216-218,221,223,225-227,230,232,234-235,239-240,242-243
src/qdk/chemistry/algorithms/microsoft/scf/src/exc/exc.cpp
                                              16      14    87%   42-43
src/qdk/chemistry/algorithms/microsoft/scf/src/exc/GauXC/gauxc.cpp
                                              34      25    73%   42,46-47,50-52,54,56,67
src/qdk/chemistry/algorithms/microsoft/scf/src/exc/GauXC/gauxc_impl.cpp
                                             229     163    71%   79,119,160-161,249-258,260,262-270,352-353,360-364,366,368-377,380-381,383-384,387-389,396,398-399,405-409,411,413-417,419-420,426
src/qdk/chemistry/algorithms/microsoft/scf/src/scf/cpscf.cpp
                                             234     232    99%   232,237
src/qdk/chemistry/algorithms/microsoft/scf/src/scf/guess.cpp
                                              63      63   100%
src/qdk/chemistry/algorithms/microsoft/scf/src/scf/ks_impl.cpp
                                              81      63    77%   73,75-82,140,155-158,160-161,171-172
src/qdk/chemistry/algorithms/microsoft/scf/src/scf/scf_impl.cpp
                                             547     414    75%   73,101,116,122,168-169,185-186,329-330,339-342,467,471,551,588,607-609,676,715-716,720-721,730-735,745,749-752,754-761,774-778,780-783,785-786,793-794,796-801,803-808,810,818-821,831-832,843-845,859-864,867-870,873,876,878,977-979,982,984,988-989,991-995,997-1000,1002-1003,1007,1009,1011-1019,1022-1025,1028-1030,1032,1034,1053,1055
src/qdk/chemistry/algorithms/microsoft/scf/src/scf/scf_impl.h
                                              21      16    76%   98-100,113,161
src/qdk/chemistry/algorithms/microsoft/scf/src/scf/scf_solver.cpp
                                              82      54    65%   35,37,51,55-59,66,68,90,92-93,101-103,111-113,126-128,131-133,141-143
src/qdk/chemistry/algorithms/microsoft/scf/src/scf/soad.cpp
                                              15       0     0%   189,192-204,208
src/qdk/chemistry/algorithms/microsoft/scf/src/scf_algorithm/asahf.cpp
                                             286     275    96%   49,51,68-69,101,271,464-465,506,530-531
src/qdk/chemistry/algorithms/microsoft/scf/src/scf_algorithm/diis.cpp
                                             278     259    93%   147,149,158-159,228,234,241,246,268-269,286,486-489,511,520,528,536
src/qdk/chemistry/algorithms/microsoft/scf/src/scf_algorithm/diis_gdm.cpp
                                              36      36   100%
src/qdk/chemistry/algorithms/microsoft/scf/src/scf_algorithm/gdm.cpp
                                             401     366    91%   226,249,272,443-446,449-452,478-482,487,518-522,664,667-673,805,809,899,903,905
src/qdk/chemistry/algorithms/microsoft/scf/src/scf_algorithm/line_search.h
                                              63      62    98%   60
src/qdk/chemistry/algorithms/microsoft/scf/src/scf_algorithm/scf_algorithm.cpp
                                             143     130    90%   63,71-73,75,85-88,175-176,205,264
src/qdk/chemistry/algorithms/microsoft/scf/src/util/gauxc_util.cpp
                                              85      20    23%   26-31,34-43,48-49,52-59,63-66,68,70,72-74,81-88,92-99,106-111,115-118,122-123,134-135
src/qdk/chemistry/algorithms/microsoft/scf/src/util/int1e.cpp
                                             336     226    67%   206-209,211,243,288,290-296,298-303,305-311,314-315,326,328-329,569,592,622,699,702-703,705,713,755,757-758,762-771,780,782-783,787-796,805,807-808,812-824,826-829,838,941-942,946-954,956-962,964-967,976
src/qdk/chemistry/algorithms/microsoft/scf/src/util/libint2_util.cpp
                                             181      91    50%   39,42-45,47,49-51,53-54,58-60,64-66,72,74,76-79,81-82,85-91,94-95,97-102,104-107,109-119,125-126,477,483-490,492-495,497,499,503-504,506,560,562,566-569,571-573,576,580-582,584,627
src/qdk/chemistry/algorithms/microsoft/scf/src/util/matrix_exp.cpp
                                              53      53   100%
src/qdk/chemistry/algorithms/microsoft/scf/src/util/mpi_vars.h
                                               2       2   100%
src/qdk/chemistry/algorithms/microsoft/scf/src/util/opt/gmresxx/arnoldi/arnoldi.h
                                              12      12   100%
src/qdk/chemistry/algorithms/microsoft/scf/src/util/opt/gmresxx/arnoldi/arnoldi_gmres.h
                                             202     168    83%   53-55,176,183,185-188,190-194,196,198,202,205,209,212,217-218,221,223,290,293-294,298,481-482,493,522-523,589
src/qdk/chemistry/algorithms/microsoft/scf/src/util/opt/gmresxx/linalg.h
                                              40      40   100%
src/qdk/chemistry/algorithms/microsoft/scf/src/util/timer.h
                                              29      29   100%
src/qdk/chemistry/algorithms/microsoft/stability.cpp
                                             317     294    92%   191-192,321-323,411,413,430,433-442,446,448,452,454,493
src/qdk/chemistry/algorithms/microsoft/stability.hpp
                                              13      13   100%
src/qdk/chemistry/algorithms/microsoft/utils.cpp
                                             248     171    69%   45-46,52,54,111-112,123-124,126-127,133,135,138-139,141,143-147,150-151,182,184,186,190-191,195,198-205,207-209,211,214-218,220-225,227-229,231,234-235,237,240-245,251,253-255,258-262,387-388,427,429
src/qdk/chemistry/algorithms/pmc.cpp           8       8   100%
src/qdk/chemistry/algorithms/scf.cpp           7       7   100%
src/qdk/chemistry/algorithms/stability.cpp
                                               6       6   100%
src/qdk/chemistry/data/ansatz.cpp            553     380    68%   26,36,39,46-48,50-51,53,55-56,58-60,62,69,84,99,104-105,107-108,115,120,122,148,150,207,209,280,295,297,302-303,336-340,345,347,357,359,362,364,374,376,379,381,394,396,401,403-404,410,412,417,419-420,434,436,441,443-444,449,451,456,458-459,461-462,464,468-469,471-472,474-475,477-478,480-484,486-487,489,492,495-500,502-503,506-508,510,513,515-516,549,559,569,579,601,608,612,626,630-631,641,651-652,659,668,684-687,690-691,694-696,698-699,701-703,719,727,744-747,782-783,792-793,804,812-813,824,835-836,843,852,869-872,875-876,879-881,883-884,886-888,894-895,906-907,931-934
src/qdk/chemistry/data/basis_set.cpp        1438    1250    86%   31,38,70,91-92,221,225,259-260,276-277,326-327,341,361,387,402,433,460,493,506-507,513-514,529-530,545-546,565,568-569,615,618-620,648,651-653,719,761,785,814,845,881,914,936,966,1006,1023,1032,1050,1067,1079,1090,1180-1181,1235,1249,1262,1276,1291,1298,1308,1310,1317,1331-1332,1465,1522-1523,1537-1539,1541-1542,1548-1551,1560-1561,1727,1791-1792,1805-1806,1906,1914,1926,1962-1966,1968-1970,1973-1977,2010,2024-2028,2031-2040,2042-2045,2047-2051,2053-2055,2058-2061,2065-2066,2068,2070-2074,2077-2078,2082-2086,2090-2092,2098-2101,2103-2105,2108,2110,2112,2132-2133,2142-2143,2151-2153,2160-2161,2181-2182,2184,2201-2203,2268-2269,2271-2276,2282,2390
src/qdk/chemistry/data/configuration.cpp     279     171    61%   67,167,170,172-173,176-177,179-180,183-184,186,190,194-195,204,210,236-238,266-268,271-272,274-283,285,287,289-292,294-295,297,299-300,302-304,307-308,310-311,313,315-316,318-325,327,329,331-334,336-337,341-342,344-348,351-352,354-355,358-359,361-368,370-371,373-381,421-422,432,434
src/qdk/chemistry/data/configuration_set.cpp
                                             328     209    63%   33-34,85-87,90-92,234,247,272-277,287-288,331-333,350-354,356,376-377,400-402,421,425,427,429,431-434,436-437,439,441-442,444-447,450-451,453-455,458-463,465-466,468-478,480,482,484-487,489-490,494-495,497-501,503,506-508,510-514,517-524,526-527,529-540
src/qdk/chemistry/data/filename_utils.hpp
                                              44      26    59%   30-33,35-36,51-53,72-75,77-78,93-95
src/qdk/chemistry/data/hamiltonian.cpp       554     400    72%   41,46-47,68,73-74,82,95,97-99,102-104,108-115,132,140,160-162,194-195,213-217,232-236,241,243,249,251,269,271-274,311,322,324,328,331,409-422,424,427-428,431-434,436-439,442-445,447-450,454-457,459-462,465-469,471-474,476-479,481-484,487-488,494,508,517-518,536,539-540,572,585,597,610,623,636,643,662,680,687,694,701-703,709,720-721,741-742,758-759,767-768,793-797,826,828-829,892-894
src/qdk/chemistry/data/hamiltonian_containers/canonical_four_center.cpp
                                             420     360    85%   38-39,67-68,98,110,128-129,156,163,169-171,204-205,213,276,309,349,353,361,373,385,391-392,423,432,437-438,443-444,462,470,477-484,487-494,514-516,597-598,607-608,634,656,721-722
src/qdk/chemistry/data/hamiltonian_containers/cholesky.cpp
                                             474     303    63%   44-45,72-73,86-90,103,162-165,167-168,172-174,177,179,181-182,185-187,190-191,194-195,198-207,209-210,227,234,240-242,265-270,279-280,328-331,333,335-338,340,364-367,369,371-374,377,382,384-387,389,391-393,396-400,402,404-408,417,432,440,452,468-469,487-488,490,499,504,506,510-511,516-517,519,521,530-531,534-537,543,550-557,560-567,585,588,592-594,642-643,651-652,658-662,673,677-678,687-688,714,736,753,764-766,772-773,779-780,786-787,798,801,805-806
src/qdk/chemistry/data/hamiltonian_containers/sparse.cpp
                                             396     347    87%   89,103,153-155,212,232-235,260-263,364-366,398,435-441,443,471-479,481,484,487-488,494-497,506-507,512,600,609,625
src/qdk/chemistry/data/hdf5_error_handling.hpp
                                              10       3    30%   20-21,23,25-26,28-29
src/qdk/chemistry/data/hdf5_serialization.cpp
                                             242     121    50%   13,15-22,24,26-32,34,36-44,46,48-56,65-67,69-71,73-74,77-79,82-85,95,98,106-109,111-113,115-116,119-121,124-127,138,141,143-150,153-160,242-244,253-255,257-259,262-264,281-284,286-290,292-293,312-314,316-320,322-323
src/qdk/chemistry/data/json_serialization.cpp
                                             177      86    48%   29,38,45-47,57,64-68,70-71,83,90-92,94-98,100,102-103,105,114,120-121,128-129,131,133-134,136-139,141,143-146,148-149,152-153,155,163-164,173,178-179,188-189,196,201,210,212,214,216-217,219-222,225-229,231-236,246-249,252-256,260-264
src/qdk/chemistry/data/lattice_graph.cpp     408     191    46%   33-36,47-50,68,70-71,73-76,78,80-81,83-86,135,161,164,167,209,212,215,267,270,273,318,321,324,394-395,397-404,406,408,410-413,415-416,418,420-421,424-428,432-437,439-440,442-444,446-448,450,452-453,455-456,459-461,464-467,470-472,474-482,486-493,495-496,498-505,507,509,511-514,516-517,521-522,524-528,530-533,535-536,538-539,541-542,544-545,548-549,551-560,562,564-569,571-572,574-579,581-582,584-592,594-596,599-601,603-605,607-610,612-613,615,617-628,630,633-638
src/qdk/chemistry/data/orbitals.cpp         1181     914    77%   106-107,128,144-145,151-152,156-157,178,180,220-221,237,251,292,307,321,363,373,377,400,403,405-406,409-413,416-417,421-424,426-427,429,431,433-434,437-440,443,447,449,453,455,457-458,461-467,470-471,474-475,477-478,480,482,484-485,488-492,495,498,500,563-567,570-571,573-574,576-577,580-581,584,586,589-590,592-593,595-596,599-601,604,606,609-610,612-613,615-616,619-620,623,625,665,668,691,759,770,776,781,808,818,862-866,904,917,929,942,962,980,989,1065-1068,1083-1084,1109-1113,1121-1122,1157,1181-1182,1191-1192,1198-1199,1205-1206,1208-1209,1212-1213,1215-1216,1229,1231-1232,1236-1237,1243,1285-1286,1314,1320,1364-1368,1396-1397,1399-1403,1406,1409,1411,1414,1416,1419,1421-1423,1425-1427,1432-1435,1437-1440,1442-1446,1465-1467,1470-1472,1475-1477,1539-1540,1569-1571,1586-1588,1622-1623,1635-1636,1794-1798,1811-1812,1815,1818-1819,1822-1824,1826,1865,1902,1917-1919,1968-1969,2005-2006,2012-2013,2019-2020,2022-2023,2026-2027,2029-2030,2037,2053-2054
src/qdk/chemistry/data/pauli_operator.cpp
                                             756     683    90%   60,63,87-88,190,202-203,224,397,407,421-423,517,555-557,559-561,577-579,581-583,606,609,721,806,818,820-821,855,860-862,877,882-884,912,938-942,944,946,951,956,996,1014-1016,1029,1036-1037,1039-1044,1062,1073-1076,1202,1222,1300,1343
src/qdk/chemistry/data/settings.cpp         1106     556    50%   23,27,55-64,66-81,88-93,96-99,101-105,107-111,113,115-118,120-125,127-131,133-143,147-156,169,173,210,222-225,227-229,232-236,238-239,241-243,245-246,248-249,292-293,296,311,342-343,346-348,350-355,357,359-364,367,387-391,394-395,398,400,406,408,410,414,416,420,464-465,467,469,471-472,474-477,481-482,484-486,489-490,494-496,499-501,505,507,510-515,520-524,526-536,538-541,543-547,549-552,556,560-563,567-571,575-578,581-585,587-588,590,592-595,597-599,601-602,604-606,608,610-612,614-618,621-625,627,629-631,633-635,637-641,644-648,650,652-654,657-659,661,664-666,669-670,673-680,682-683,685-686,689-690,692-698,701-707,711,714-715,718-719,722-723,726-727,730-734,736,738,740-741,743-746,748-749,751-752,754-757,759-760,762,764-767,770,772-775,779-784,788-789,791,793-796,800,803-804,817,823,826,833,836,844,848,865,869-870,887-890,899,902,974-975,987,989,1137,1139-1142,1145,1147-1148,1154-1155,1158-1163,1165,1169,1171,1176,1180-1182,1188,1192,1195-1196,1201,1203-1205,1209,1254,1261,1279,1330-1332,1362,1368-1371,1393-1394,1429-1430,1432,1461-1463,1482-1487,1513-1515,1517,1519-1520,1523-1525,1527-1529,1535,1556-1563,1566-1569,1625,1653,1668-1670,1674-1684,1686-1691,1693-1695,1697-1703,1705-1707,1709,1711,1713-1717,1719-1723,1725-1727,1729-1730,1732-1739,1741-1750,1752-1754,1756-1758,1774
src/qdk/chemistry/data/stability_result.cpp
                                             317     292    92%   25,32,42,176,213,218,271,281,299,315,344,346,350,356,379,419,421,425,451,458,503-507
src/qdk/chemistry/data/structure.cpp         761     703    92%   86,101,115-116,127,140,159,176-177,204,245-246,295,479,492,512,530,649,665,802,816,964-966,974-975,985,995-996,1018-1019,1027,1055-1057,1063,1076,1122-1123,1126,1132-1135,1138-1147,1151-1153,1156
src/qdk/chemistry/data/wavefunction.cpp     1319    1137    86%   45,65,175,178,186-188,269-270,286,307-310,312-315,318,336-341,344,386,417,454,467,488,493,509-510,531,548,551,574,577,580-589,620-626,628-630,732-741,838-842,937-939,984,998,1011,1013,1018,1020,1042-1043,1102,1104-1105,1119,1121,1124-1125,1146-1149,1151,1186,1188-1189,1214,1231,1357,1456-1459,1487,1494,1500,1507,1523,1529-1531,1537,1548,1578-1579,1594-1595,1602-1603,1623,1628-1629,1635,1646,1682,1792-1793,1803-1804,1831,1857-1858,1888-1889,1961,1963,1966-1967,1975-1977,1995-1997,1999-2000,2006-2009,2012-2022,2024-2025,2027-2030,2033-2036,2038-2040,2042-2043,2045-2046
src/qdk/chemistry/data/wavefunction_containers/cas.cpp
                                             252     199    79%   76-77,79-82,84-85,87-88,90,92-93,95-96,98-99,101,116,161-162,166,168,172,174,178-179,191-193,199,201-204,207-210,227-228,231-232,337-339,359,377-378,387,398,421-422
src/qdk/chemistry/data/wavefunction_containers/cc.cpp
                                             879     526    59%   48,52,57,59,62,66,71-72,74-77,79,87-88,122-127,153-160,169-175,203-204,206-220,222-224,226-228,231,233-234,250,258-259,261,267,277,287,299,319,324,326-328,331-334,337,339-340,343,345-349,351-352,354-355,358-359,381-383,385-387,389-391,393-395,397-399,425,432,463-466,529-530,596-597,600,602,604,607-608,610-611,613,616,618-621,623-625,628-629,631,634,638,640-641,644,688,697-698,700,706-707,709-710,717,729,738-739,748-749,755,791,801,811,821,831,842,941-951,953-957,970-980,982,984-986,1059-1070,1072-1084,1086-1092,1094-1101,1116-1127,1129-1141,1143-1149,1151-1157,1172-1182,1184-1196,1198-1201,1203,1205-1208,1224-1233,1235-1247,1249-1252,1254-1258,1323-1325,1327-1328,1331,1333-1334,1336,1338-1339,1343-1345
src/qdk/chemistry/data/wavefunction_containers/mp2.cpp
                                             626     433    69%   32,36,40-41,45-47,60-62,78,85,110,139,150-151,178-179,227-228,243,313,318,320-322,325-327,330-333,336-341,343-349,351-353,374,437-438,468-469,477,490-492,494,498-500,502,535,544-545,547,553-554,556-557,564,576,585-586,606,623-624,627-628,631,633-639,641-644,646,648,650,652-658,660-663,665,667,669,671-677,679-682,684,688-697,703-712,718-727,734-736,738-739,743,745-746,748-750,754-757,759,925,931,933,964-965,968-969,973,975,1006,1023,1057,1081,1083,1088,1092-1102
src/qdk/chemistry/data/wavefunction_containers/sci.cpp
                                             213     176    82%   78-79,81-84,86-87,89-90,92,94-95,97-98,100-101,103,117,151,153,155-156,166-167,170-171,260-262,282,300-301,310,321,344-345
src/qdk/chemistry/data/wavefunction_containers/sd.cpp
                                             399     336    84%   17,42-46,54,56-60,111,113,118,120,136-137,140,143-144,156,158,161-162,200,202,205-206,275,277,280-282,309,311,314,316,369,371,467,497-498,501,511-512,515,562,571,577,591,599-602,646-647,664-665,683-684,694-695
src/qdk/chemistry/utils/logger.cpp           120     115    95%   208-210,244,288
src/qdk/chemistry/utils/orbital_rotation.cpp
                                              93      56    60%   60-62,140-142,145,149-150,152,154-155,176,178,180,182,185-186,188,192-193,196-197,200,202-203,205,208-211,214,218-219,221,223-224
src/qdk/chemistry/utils/valence_space.cpp
                                              43      37    86%   60-63,79,83
------------------------------------------------------------------------------
TOTAL                                      22501   17660    78%
------------------------------------------------------------------------------
Python Coverage Details
src/qdk_chemistry/data/time_evolution/base.py                                                       40     12    70%
src/qdk_chemistry/data/time_evolution/containers/__init__.py                                         0      0   100%
src/qdk_chemistry/data/time_evolution/containers/base.py                                            26      0   100%
src/qdk_chemistry/data/time_evolution/containers/pauli_product_formula.py                           93      4    96%
src/qdk_chemistry/data/time_evolution/controlled_time_evolution.py                                  46      8    83%
src/qdk_chemistry/definitions.py                                                                     8      0   100%
src/qdk_chemistry/plugins/__init__.py                                                                0      0   100%
src/qdk_chemistry/plugins/openfermion/__init__.py                                                   19      0   100%
src/qdk_chemistry/plugins/openfermion/conversion.py                                                 78     22    72%
src/qdk_chemistry/plugins/openfermion/qubit_mapper.py                                               63      1    98%
src/qdk_chemistry/plugins/pyscf/__init__.py                                                         18      0   100%
src/qdk_chemistry/plugins/pyscf/active_space_avas.py                                                78      7    91%
src/qdk_chemistry/plugins/pyscf/conversion.py                                                      264     16    94%
src/qdk_chemistry/plugins/pyscf/coupled_cluster.py                                                 101     27    73%
src/qdk_chemistry/plugins/pyscf/localization.py                                                     72      8    89%
src/qdk_chemistry/plugins/pyscf/mcscf.py                                                           123     15    88%
src/qdk_chemistry/plugins/pyscf/scf_solver.py                                                      102      5    95%
src/qdk_chemistry/plugins/pyscf/stability.py                                                       154      2    99%
src/qdk_chemistry/plugins/qiskit/__init__.py                                                        43      0   100%
src/qdk_chemistry/plugins/qiskit/_interop/__init__.py                                                0      0   100%
src/qdk_chemistry/plugins/qiskit/_interop/circuit.py                                               130      0   100%
src/qdk_chemistry/plugins/qiskit/_interop/noise_model.py                                            26      4    85%
src/qdk_chemistry/plugins/qiskit/_interop/qir.py                                                    87     25    71%
src/qdk_chemistry/plugins/qiskit/_interop/transpiler.py                                            139      6    96%
src/qdk_chemistry/plugins/qiskit/circuit_executor.py                                                38      0   100%
src/qdk_chemistry/plugins/qiskit/conversion.py                                                      31      0   100%
src/qdk_chemistry/plugins/qiskit/qubit_mapper.py                                                    36      1    97%
src/qdk_chemistry/plugins/qiskit/regular_isometry.py                                                40      0   100%
src/qdk_chemistry/plugins/qiskit/standard_phase_estimation.py                                       69      4    94%
src/qdk_chemistry/utils/__init__.py                                                                  4      0   100%
src/qdk_chemistry/utils/cubegen.py                                                                  54     54     0%
src/qdk_chemistry/utils/enum.py                                                                     23     10    57%
src/qdk_chemistry/utils/model_hamiltonians.py                                                       43      1    98%
src/qdk_chemistry/utils/pauli_commutation.py                                                        97      3    97%
src/qdk_chemistry/utils/pauli_matrix.py                                                             74      0   100%
src/qdk_chemistry/utils/phase.py                                                                    39      1    97%
src/qdk_chemistry/utils/qsharp/__init__.py                                                          17      0   100%
src/qdk_chemistry/utils/telemetry.py                                                               142     87    39%
src/qdk_chemistry/utils/telemetry_events.py                                                         59     48    19%
src/qdk_chemistry/utils/wavefunction.py                                                             57     57     0%
--------------------------------------------------------------------------------------------------------------------
TOTAL                                                                                             5393    724    87%
Coverage HTML written to dir ../coverage-reports/python_coverage_html
Coverage XML written to file ../coverage-reports/python_coverage.xml
=========================== short test summary info ============================
SKIPPED [3] tests/test_docs_examples.py:191: Skipping slow test. Set QDK_CHEMISTRY_RUN_SLOW_TESTS=1 to enable.
SKIPPED [1] tests/test_sample_workflow.py:226: Skipping slow test. Set QDK_CHEMISTRY_RUN_SLOW_TESTS=1 to enable.
SKIPPED [1] tests/test_sample_workflow.py:244: Skipping slow test. Set QDK_CHEMISTRY_RUN_SLOW_TESTS=1 to enable.
SKIPPED [1] tests/test_sample_workflow_rdkit.py:30: Skipping: RDKit not installed
=========== 1439 passed, 6 skipped, 1 warning in 1166.34s (0:19:26) ============
Pybind11 Coverage Details
------------------------------------------------------------------------------
                           GCC Code Coverage Report
Directory: .
------------------------------------------------------------------------------
File                                       Lines     Exec  Cover   Missing
------------------------------------------------------------------------------
src/pybind11/algorithms/active_space.cpp      37       37   100%
src/pybind11/algorithms/davidson_solver.cpp
                                              35       34    97%   28
src/pybind11/algorithms/dynamical_correlation_calculator.cpp
                                              30       30   100%
src/pybind11/algorithms/factory_bindings.hpp
                                             198      189    95%   218,218,218,218,218,218,218,218,218
src/pybind11/algorithms/hamiltonian.cpp       35       35   100%
src/pybind11/algorithms/localizer.cpp         37       37   100%
src/pybind11/algorithms/mc.cpp                36       36   100%
src/pybind11/algorithms/mcscf.cpp             33       33   100%
src/pybind11/algorithms/pmc.cpp               35       34    97%   178
src/pybind11/algorithms/scf.cpp               34       34   100%
src/pybind11/algorithms/stability.cpp         33       33   100%
src/pybind11/algorithms/syev_solver.cpp       19       18    94%   43
src/pybind11/constants.cpp                    89       89   100%
src/pybind11/data/ansatz.cpp                  69       69   100%
src/pybind11/data/basis_set.cpp              204      204   100%
src/pybind11/data/configuration.cpp           30       29    96%   200
src/pybind11/data/configuration_set.cpp       84       84   100%
src/pybind11/data/data_class.cpp             109       27    24%   19-20,23-24,27,29,32,34-37,39-44,46,48-49,52,54,57-59,64,67,71-72,75,78-79,81-82,90,92,94-96,98,101,104-105,107,110,113-115,117-120,124,126,128-129,131,133,135-137,139,141,143-145,150-151,153,156-157,159,162-163,165,168-169,171,174,176,178,249
src/pybind11/data/element_data.cpp           123      123   100%
src/pybind11/data/hamiltonian.cpp            247      238    96%   62,65,67,458,477,650,670,855,876
src/pybind11/data/lattice_graph.cpp          101       82    81%   20,23,25,27,29-30,51,53-54,423-425,429,448,459,562,564,566,568
src/pybind11/data/orbitals.cpp               138      137    99%   940
src/pybind11/data/path_utils.hpp              19       11    57%   37,39,42-47
src/pybind11/data/pauli_operator.cpp         274      254    92%   146,257,322,398,403,409,415,427,467,473,505,511,517,529,604,636,641,655,659,667
src/pybind11/data/property_binding_helpers.hpp
                                             312      312   100%
src/pybind11/data/serialization.cpp            5        5   100%
src/pybind11/data/settings.cpp               718      485    67%   40-41,57-58,108-109,115-116,121-122,127,129,134,136,162-166,175-177,180-183,188-192,196-198,208-211,215-219,228-231,235-240,244-247,257-260,264-268,271-275,279-289,291-309,311-325,327-329,333,336-338,375-378,391,441,443-444,480,551,1211,1219,1225,1228,1345,1379,1457,1520,1545,1570,1596,1660,1748-1749,1751-1755,1789-1793,1795-1800,1851,1905,1931-1932,1934,1937-1940,1966,2008-2009,2011-2012,2043-2044,2046,2049-2052,2079-2081,2102-2104,2106-2107,2126-2132,2152-2154,2156-2157,2179-2183,2185-2190,2221-2222,2240-2246,2268-2269,2287-2293
src/pybind11/data/stability_result.cpp       112      112   100%
src/pybind11/data/structure.cpp              199      184    92%   69,72,75-78,82-84,87,90-91,969,977,999
src/pybind11/data/wavefunction.cpp           365      347    95%   39,98,100,264-265,268,272,278,473-477,479,1016,1018,1064,1067
src/pybind11/module.cpp                       43       43   100%
src/pybind11/qdk_scf_config.cpp               12       12   100%
src/pybind11/utils/logger.cpp                191      177    92%   27,54,68-69,92,97-99,105-106,262-263,476,480
src/pybind11/utils/model_hamiltonians.cpp
                                              62       62   100%
src/pybind11/utils/orbital_rotation.cpp        7        7   100%
src/pybind11/utils/valence_space.cpp           5        5   100%
------------------------------------------------------------------------------
TOTAL                                       4080     3648    89%
------------------------------------------------------------------------------

`os.add_dll_directory` only exists on Windows – mypy on Linux reports it as missing.
Copilot AI review requested due to automatic review settings April 21, 2026 13:04
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 56 out of 57 changed files in this pull request and generated no new comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

On Windows, importing qdk_chemistry required manually setting QDK_DLL_DIR
to the vcpkg bin directory, unlike Linux/macOS where it just works via
RPATH. Fix this by:

- Copying vcpkg runtime DLLs (openblas, hdf5, fmt, etc.) into the wheel
  alongside _core.pyd at build time (python/CMakeLists.txt)
- Auto-registering the package directory as a DLL search path in
  __init__.py (required since Python 3.8 changed DLL search behavior)
- Removing QDK_DLL_DIR from build scripts (no longer needed)

QDK_DLL_DIR is kept as an optional override for custom setups.
…ruct

These operators are only used by macis tests.
Copilot AI review requested due to automatic review settings April 22, 2026 08:00
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 56 out of 57 changed files in this pull request and generated 5 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread python/CMakeLists.txt Outdated
Comment thread cpp/CMakeLists.txt
Comment thread cpp/tests/CMakeLists.txt
Comment thread python/CMakeLists.txt
Comment on lines +207 to +218
# On Windows, bundle vcpkg runtime DLLs alongside _core.pyd so the package
# is self-contained and does not require QDK_DLL_DIR at import time.
if(WIN32 AND VCPKG_INSTALLED_DIR AND VCPKG_TARGET_TRIPLET)
file(GLOB _vcpkg_runtime_dlls
"${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/bin/*.dll"
)
if(_vcpkg_runtime_dlls)
install(FILES ${_vcpkg_runtime_dlls}
DESTINATION .
COMPONENT _core
)
endif()
Copy link

Copilot AI Apr 22, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The install step bundles vcpkg bin/*.dll, but if OpenMP is enabled with clang-cl the runtime dependency is typically libomp.dll from the VS LLVM toolchain (not vcpkg). This means the installed _core.pyd may still fail to import on machines without VS/LLVM on PATH, despite the comment claiming the package is self-contained. Consider either bundling the OpenMP runtime DLL as well when OpenMP is found on Windows, or disabling OpenMP by default for the Python wheel/install component.

Suggested change
# On Windows, bundle vcpkg runtime DLLs alongside _core.pyd so the package
# is self-contained and does not require QDK_DLL_DIR at import time.
if(WIN32 AND VCPKG_INSTALLED_DIR AND VCPKG_TARGET_TRIPLET)
file(GLOB _vcpkg_runtime_dlls
"${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/bin/*.dll"
)
if(_vcpkg_runtime_dlls)
install(FILES ${_vcpkg_runtime_dlls}
DESTINATION .
COMPONENT _core
)
endif()
# On Windows, bundle runtime DLLs alongside _core.pyd so the package
# is self-contained and does not require QDK_DLL_DIR or a compiler toolchain
# runtime on PATH at import time.
if(WIN32)
if(VCPKG_INSTALLED_DIR AND VCPKG_TARGET_TRIPLET)
file(GLOB _vcpkg_runtime_dlls
"${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/bin/*.dll"
)
if(_vcpkg_runtime_dlls)
install(FILES ${_vcpkg_runtime_dlls}
DESTINATION .
COMPONENT _core
)
endif()
endif()
# clang-cl/OpenMP commonly depends on libomp.dll from the LLVM toolchain
# rather than from vcpkg. Bundle it as well when OpenMP is enabled.
if(OpenMP_CXX_FOUND)
set(_openmp_runtime_dll_candidates)
foreach(_openmp_library IN LISTS OpenMP_CXX_LIBRARIES)
if(EXISTS "${_openmp_library}")
get_filename_component(_openmp_lib_dir "${_openmp_library}" DIRECTORY)
get_filename_component(_openmp_lib_parent "${_openmp_lib_dir}" DIRECTORY)
list(APPEND _openmp_runtime_dll_candidates
"${_openmp_lib_dir}/libomp.dll"
"${_openmp_lib_dir}/bin/libomp.dll"
"${_openmp_lib_parent}/bin/libomp.dll"
)
endif()
endforeach()
if(CMAKE_CXX_COMPILER)
get_filename_component(_cxx_compiler_dir "${CMAKE_CXX_COMPILER}" DIRECTORY)
get_filename_component(_cxx_compiler_parent "${_cxx_compiler_dir}" DIRECTORY)
list(APPEND _openmp_runtime_dll_candidates
"${_cxx_compiler_dir}/libomp.dll"
"${_cxx_compiler_dir}/bin/libomp.dll"
"${_cxx_compiler_parent}/bin/libomp.dll"
)
endif()
set(_openmp_runtime_dlls)
foreach(_openmp_runtime_dll IN LISTS _openmp_runtime_dll_candidates)
if(EXISTS "${_openmp_runtime_dll}")
list(APPEND _openmp_runtime_dlls "${_openmp_runtime_dll}")
endif()
endforeach()
if(_openmp_runtime_dlls)
list(REMOVE_DUPLICATES _openmp_runtime_dlls)
install(FILES ${_openmp_runtime_dlls}
DESTINATION .
COMPONENT _core
)
endif()
endif()

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Contributor Author

@lorisercole lorisercole Apr 22, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The vcpkg install directory is (should be) project-scoped (not a system-wide dir), so it only contains DLLs from declared dependencies.

Here are the currently bundled DLLs:

aec.dll
fmt.dll
hdf5.dll
hdf5_cpp.dll
openblas.dll
spdlog.dll
szip.dll
zlib1.dll

and here is the dependency tree:

_core.pyd
├── fmt.dll          (vcpkg, bundled)
├── hdf5_cpp.dll     (vcpkg, bundled)
│   └── hdf5.dll     (vcpkg, bundled)
│       ├── zlib1.dll (vcpkg, bundled)
│       └── szip.dll  (vcpkg, bundled)
├── openblas.dll     (vcpkg, bundled)
├── spdlog.dll       (vcpkg, bundled)
│   └── fmt.dll      (vcpkg, bundled)
├── libomp140.x86_64.dll  (LLVM toolchain, NOT bundled ⚠️)
└── system DLLs      (always present)

Only aec.dll is not used.

libomp140.x86_64.dll is indeed not bundled. We should decide what to do with it...

Comment thread external/macis/include/macis/bitset_operations.hpp Outdated
PR #434 introduced breaking changes to the `QuantumErrorProfile` API,
so we need to adapt one of `test_noise_models` tests.
@lorisercole lorisercole force-pushed the feature/ler/windows-build-part-1 branch from 96c6d4b to 03638ca Compare April 22, 2026 13:01
Copilot AI review requested due to automatic review settings April 22, 2026 13:50
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 56 out of 57 changed files in this pull request and generated 4 comments.

Comments suppressed due to low confidence (4)

vcpkg-overlay/ports/openblas/vcpkg.json:1

  • This overlay port manifest declares a dependency on openblas (itself) as a host dependency, which creates a circular dependency and will fail resolution in vcpkg. Remove the self-dependency; if host tools are required, they should be provided via a separate *-host port or handled within the portfile using VCPKG_HOST_* variables rather than a manifest self-reference.
    python/tests/test_docs_examples.py:1
  • Managing TemporaryDirectory manually here makes cleanup depend on the success path; if an exception is raised before the return code check (e.g., timeout), the directory may leak. Use a context manager (with TemporaryDirectory(...) as tmpdir:) or a try/finally to ensure cleanup happens deterministically (and only keep artifacts explicitly when desired).
    python/tests/test_docs_examples.py:1
  • Managing TemporaryDirectory manually here makes cleanup depend on the success path; if an exception is raised before the return code check (e.g., timeout), the directory may leak. Use a context manager (with TemporaryDirectory(...) as tmpdir:) or a try/finally to ensure cleanup happens deterministically (and only keep artifacts explicitly when desired).
    vcpkg-overlay/ports/openblas/cmake-project-include.cmake:1
  • Correct spelling of 'explixit' to 'explicit'.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +249 to 250
with Path(yaml_file).open("r", encoding="utf-8") as f:
data = yaml.load(f)
Copy link

Copilot AI Apr 22, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using yaml.load without an explicit loader can deserialize arbitrary Python objects, which is unsafe when reading untrusted YAML. Use yaml.safe_load (or yaml.load(..., Loader=...) with a restricted loader) to prevent object construction vulnerabilities.

Copilot uses AI. Check for mistakes.
Comment on lines +190 to +195
// Use NATIVE_UINT64 (not NATIVE_ULONG) because on Windows LLP64
// unsigned long is 4 bytes while size_t is 8 bytes.
static_assert(sizeof(size_t) == 8);
H5::DataSet dataset = group.createDataSet(
dataset_name, H5::PredType::NATIVE_ULONG, dataspace);
dataset.write(vector.data(), H5::PredType::NATIVE_ULONG);
dataset_name, H5::PredType::NATIVE_UINT64, dataspace);
dataset.write(vector.data(), H5::PredType::NATIVE_UINT64);
Copy link

Copilot AI Apr 22, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The unconditional static_assert(sizeof(size_t) == 8) makes the code fail to compile on any 32-bit target (where size_t is 4 bytes). If 32-bit builds are not supported, consider documenting/enforcing that at a higher level; otherwise, select the HDF5 integer type based on sizeof(size_t) (e.g., NATIVE_UINT32 vs NATIVE_UINT64) to keep serialization portable across 32/64-bit platforms.

Copilot uses AI. Check for mistakes.
Comment on lines +231 to +232
static_assert(sizeof(size_t) == 8);
dataset.read(vector.data(), H5::PredType::NATIVE_UINT64);
Copy link

Copilot AI Apr 22, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The unconditional static_assert(sizeof(size_t) == 8) makes the code fail to compile on any 32-bit target (where size_t is 4 bytes). If 32-bit builds are not supported, consider documenting/enforcing that at a higher level; otherwise, select the HDF5 integer type based on sizeof(size_t) (e.g., NATIVE_UINT32 vs NATIVE_UINT64) to keep serialization portable across 32/64-bit platforms.

Suggested change
static_assert(sizeof(size_t) == 8);
dataset.read(vector.data(), H5::PredType::NATIVE_UINT64);
static_assert(sizeof(size_t) == 4 || sizeof(size_t) == 8,
"Unsupported size_t width for HDF5 deserialization.");
const H5::PredType& size_type = sizeof(size_t) == 4
? H5::PredType::NATIVE_UINT32
: H5::PredType::NATIVE_UINT64;
dataset.read(vector.data(), size_type);

Copilot uses AI. Check for mistakes.
Comment thread python/CMakeLists.txt
Comment on lines +209 to +219
if(WIN32 AND VCPKG_INSTALLED_DIR AND VCPKG_TARGET_TRIPLET)
file(GLOB _vcpkg_runtime_dlls
"${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/bin/*.dll"
)
if(_vcpkg_runtime_dlls)
install(FILES ${_vcpkg_runtime_dlls}
DESTINATION .
COMPONENT _core
)
endif()
endif()
Copy link

Copilot AI Apr 22, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Installing every DLL from the vcpkg bin/ directory can significantly bloat the wheel and may introduce unexpected/unused binaries (and potential DLL collision/hijacking risks if unrelated DLLs get shipped). Prefer copying only the transitive runtime dependencies of _core (e.g., via CMake runtime dependency discovery like file(GET_RUNTIME_DEPENDENCIES ...) / install(RUNTIME_DEPENDENCIES ...)) and explicitly exclude system DLLs.

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants